aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/StoneSlabTileItem.cpp
diff options
context:
space:
mode:
authordaoge_cmd <3523206925@qq.com>2026-03-01 12:16:08 +0800
committerdaoge_cmd <3523206925@qq.com>2026-03-01 12:16:08 +0800
commitb691c43c44ff180d10e7d4a9afc83b98551ff586 (patch)
tree3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.World/StoneSlabTileItem.cpp
parentdef8cb415354ac390b7e89052a50605285f1aca9 (diff)
Initial commit
Diffstat (limited to 'Minecraft.World/StoneSlabTileItem.cpp')
-rw-r--r--Minecraft.World/StoneSlabTileItem.cpp140
1 files changed, 140 insertions, 0 deletions
diff --git a/Minecraft.World/StoneSlabTileItem.cpp b/Minecraft.World/StoneSlabTileItem.cpp
new file mode 100644
index 00000000..ea636f65
--- /dev/null
+++ b/Minecraft.World/StoneSlabTileItem.cpp
@@ -0,0 +1,140 @@
+#include "stdafx.h"
+#include "net.minecraft.world.entity.item.h"
+#include "net.minecraft.world.entity.player.h"
+#include "net.minecraft.world.item.h"
+#include "net.minecraft.world.level.h"
+#include "net.minecraft.world.level.tile.h"
+#include "net.minecraft.h"
+#include "StoneSlabTileItem.h"
+
+StoneSlabTileItem::StoneSlabTileItem(int id, HalfSlabTile *halfTile, HalfSlabTile *fullTile, bool full) : TileItem(id)
+{
+ this->halfTile = halfTile;
+ this->fullTile = fullTile;
+
+ this->isFull = full;
+ setMaxDamage(0);
+ setStackedByData(true);
+}
+
+Icon *StoneSlabTileItem::getIcon(int itemAuxValue)
+{
+ return Tile::tiles[id]->getTexture(2, itemAuxValue);
+}
+
+int StoneSlabTileItem::getLevelDataForAuxValue(int auxValue)
+{
+ return auxValue;
+}
+
+unsigned int StoneSlabTileItem::getDescriptionId(shared_ptr<ItemInstance> instance)
+{
+ return halfTile->getAuxName(instance->getAuxValue());
+}
+
+bool StoneSlabTileItem::useOn(shared_ptr<ItemInstance> instance, shared_ptr<Player> player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly)
+{
+ if (isFull)
+ {
+ return TileItem::useOn(instance, player, level, x, y, z, face, clickX, clickY, clickZ, bTestUseOnOnly);
+ }
+
+ if (instance->count == 0) return false;
+ if (!player->mayBuild(x, y, z)) return false;
+
+ int currentTile = level->getTile(x, y, z);
+ int currentData = level->getData(x, y, z);
+ int slabType = currentData & HalfSlabTile::TYPE_MASK;
+ bool isUpper = (currentData & HalfSlabTile::TOP_SLOT_BIT) != 0;
+
+ if (((face == Facing::UP && !isUpper) || (face == Facing::DOWN && isUpper)) && currentTile == halfTile->id && slabType == instance->getAuxValue())
+ {
+ if(bTestUseOnOnly)
+ {
+ return true;
+ }
+
+ if (level->isUnobstructed(fullTile->getAABB(level, x, y, z)) && level->setTileAndData(x, y, z, fullTile->id, slabType))
+ {
+// level.playSound(x + 0.5f, y + 0.5f, z + 0.5f, fullTile.soundType.getPlaceSound(), (fullTile.soundType.getVolume() + 1) / 2, fullTile.soundType.getPitch() * 0.8f);
+// instance.count--;
+ level->playSound(x + 0.5f, y + 0.5f, z + 0.5f, fullTile->soundType->getStepSound(), (fullTile->soundType->getVolume() + 1) / 2, fullTile->soundType->getPitch() * 0.8f);
+ instance->count--;
+ }
+ return true;
+ }
+ else if (tryConvertTargetTile(instance, player, level, x, y, z, face, bTestUseOnOnly))
+ {
+ return true;
+ }
+ else
+ {
+ return TileItem::useOn(instance, player, level, x, y, z, face, clickX, clickY, clickZ, bTestUseOnOnly);
+ }
+}
+
+
+bool StoneSlabTileItem::mayPlace(Level *level, int x, int y, int z, int face,shared_ptr<Player> player, shared_ptr<ItemInstance> item)
+{
+ int ox = x, oy = y, oz = z;
+
+ int currentTile = level->getTile(x, y, z);
+ int currentData = level->getData(x, y, z);
+ int slabType = currentData & HalfSlabTile::TYPE_MASK;
+ boolean isUpper = (currentData & HalfSlabTile::TOP_SLOT_BIT) != 0;
+
+ if (((face == Facing::UP && !isUpper) || (face == Facing::DOWN && isUpper)) && currentTile == halfTile->id && slabType == item->getAuxValue())
+ {
+ return true;
+ }
+
+ if (face == 0) y--;
+ if (face == 1) y++;
+ if (face == 2) z--;
+ if (face == 3) z++;
+ if (face == 4) x--;
+ if (face == 5) x++;
+
+ currentTile = level->getTile(x, y, z);
+ currentData = level->getData(x, y, z);
+ slabType = currentData & HalfSlabTile::TYPE_MASK;
+ isUpper = (currentData & HalfSlabTile::TOP_SLOT_BIT) != 0;
+
+ if (currentTile == halfTile->id && slabType == item->getAuxValue())
+ {
+ return true;
+ }
+
+ return TileItem::mayPlace(level, ox, oy, oz, face, player, item);
+}
+
+bool StoneSlabTileItem::tryConvertTargetTile(shared_ptr<ItemInstance> instance, shared_ptr<Player> player, Level *level, int x, int y, int z, int face, bool bTestUseOnOnly)
+{
+ if (face == 0) y--;
+ if (face == 1) y++;
+ if (face == 2) z--;
+ if (face == 3) z++;
+ if (face == 4) x--;
+ if (face == 5) x++;
+
+ int currentTile = level->getTile(x, y, z);
+ int currentData = level->getData(x, y, z);
+ int slabType = currentData & HalfSlabTile::TYPE_MASK;
+
+ if (currentTile == halfTile->id && slabType == instance->getAuxValue())
+ {
+ if(bTestUseOnOnly)
+ {
+ return true;
+ }
+ if (level->isUnobstructed(fullTile->getAABB(level, x, y, z)) && level->setTileAndData(x, y, z, fullTile->id, slabType))
+ {
+ //level.playSound(x + 0.5f, y + 0.5f, z + 0.5f, fullTile.soundType.getPlaceSound(), (fullTile.soundType.getVolume() + 1) / 2, fullTile.soundType.getPitch() * 0.8f);
+ level->playSound(x + 0.5f, y + 0.5f, z + 0.5f, fullTile->soundType->getStepSound(), (fullTile->soundType->getVolume() + 1) / 2, fullTile->soundType->getPitch() * 0.8f);
+ instance->count--;
+ }
+ return true;
+ }
+
+ return false;
+} \ No newline at end of file