aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/AnvilTile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Minecraft.World/AnvilTile.cpp')
-rw-r--r--Minecraft.World/AnvilTile.cpp117
1 files changed, 117 insertions, 0 deletions
diff --git a/Minecraft.World/AnvilTile.cpp b/Minecraft.World/AnvilTile.cpp
new file mode 100644
index 00000000..e5fd736d
--- /dev/null
+++ b/Minecraft.World/AnvilTile.cpp
@@ -0,0 +1,117 @@
+#include "stdafx.h"
+#include "net.minecraft.world.entity.player.h"
+#include "net.minecraft.world.entity.item.h"
+#include "net.minecraft.world.level.h"
+#include "net.minecraft.world.level.tile.h"
+#include "net.minecraft.world.h"
+#include "net.minecraft.h"
+#include "AnvilTile.h"
+
+const unsigned int AnvilTile::ANVIL_NAMES[ANVIL_NAMES_LENGTH] = { IDS_TILE_ANVIL_INTACT,
+ IDS_TILE_ANVIL_SLIGHTLYDAMAGED,
+ IDS_TILE_ANVIL_VERYDAMAGED,
+ };
+
+
+wstring AnvilTile::TEXTURE_DAMAGE_NAMES[ANVIL_NAMES_LENGTH] = {
+ L"anvil_top", L"anvil_top_damaged_1", L"anvil_top_damaged_2"
+};
+
+AnvilTile::AnvilTile(int id) : HeavyTile(id, Material::heavyMetal, isSolidRender() )
+{
+ part = PART_BASE;
+ setLightBlock(0);
+ icons = NULL;
+}
+
+bool AnvilTile::isCubeShaped()
+{
+ return false;
+}
+
+bool AnvilTile::isSolidRender(bool isServerLevel)
+{
+ return false;
+}
+
+Icon *AnvilTile::getTexture(int face, int data)
+{
+ if (part == PART_TOP && face == Facing::UP)
+ {
+ int damage = (data >> 2) % ANVIL_NAMES_LENGTH;
+ return icons[damage];
+ }
+ return icon;
+}
+
+void AnvilTile::registerIcons(IconRegister *iconRegister)
+{
+ icon = iconRegister->registerIcon(L"anvil_base");
+ icons = new Icon*[ANVIL_NAMES_LENGTH];
+
+ for (int i = 0; i < ANVIL_NAMES_LENGTH; i++)
+ {
+ icons[i] = iconRegister->registerIcon(TEXTURE_DAMAGE_NAMES[i]);
+ }
+}
+
+void AnvilTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr<Mob> by)
+{
+ int dir = (Mth::floor(by->yRot * 4 / (360) + 0.5)) & 3;
+ int dmg = level->getData(x, y, z) >> 2;
+
+ dir = ++dir % 4;
+ if (dir == 0) level->setData(x, y, z, Direction::NORTH | (dmg << 2));
+ if (dir == 1) level->setData(x, y, z, Direction::EAST | (dmg << 2));
+ if (dir == 2) level->setData(x, y, z, Direction::SOUTH | (dmg << 2));
+ if (dir == 3) level->setData(x, y, z, Direction::WEST | (dmg << 2));
+}
+
+bool AnvilTile::use(Level *level, int x, int y, int z, shared_ptr<Player> player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly)
+{
+ if (level->isClientSide)
+ {
+ return true;
+ }
+ player->startRepairing(x, y, z);
+ return true;
+}
+
+int AnvilTile::getRenderShape()
+{
+ return SHAPE_ANVIL;
+}
+
+int AnvilTile::getSpawnResourcesAuxValue(int data)
+{
+ return data >> 2;
+}
+
+void AnvilTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr<TileEntity> forceEntity)
+{
+ int dir = level->getData(x, y, z) & 3;
+
+ if (dir == Direction::EAST || dir == Direction::WEST)
+ {
+ setShape(0, 0, 2 / 16.0f, 1, 1, 1 - 2 / 16.0f);
+ }
+ else
+ {
+ setShape(2 / 16.0f, 0, 0, 1 - 2 / 16.0f, 1, 1);
+ }
+}
+
+void AnvilTile::falling(shared_ptr<FallingTile> entity)
+{
+ entity->setHurtsEntities(true);
+}
+
+void AnvilTile::onLand(Level *level, int xt, int yt, int zt, int data)
+{
+ level->levelEvent(LevelEvent::SOUND_ANVIL_LAND, xt, yt, zt, 0);
+}
+
+bool AnvilTile::shouldRenderFace(LevelSource *level, int x, int y, int z, int face)
+{
+ return true;
+} \ No newline at end of file