From b691c43c44ff180d10e7d4a9afc83b98551ff586 Mon Sep 17 00:00:00 2001 From: daoge_cmd <3523206925@qq.com> Date: Sun, 1 Mar 2026 12:16:08 +0800 Subject: Initial commit --- Minecraft.World/CocoaTile.cpp | 176 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 Minecraft.World/CocoaTile.cpp (limited to 'Minecraft.World/CocoaTile.cpp') diff --git a/Minecraft.World/CocoaTile.cpp b/Minecraft.World/CocoaTile.cpp new file mode 100644 index 00000000..1f575014 --- /dev/null +++ b/Minecraft.World/CocoaTile.cpp @@ -0,0 +1,176 @@ +#include "stdafx.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.h" +#include "net.minecraft.h" +#include "CocoaTile.h" + +const wstring CocoaTile::TEXTURE_AGES[] = { L"cocoa_0", L"cocoa_1", L"cocoa_2"}; + +CocoaTile::CocoaTile(int id) : DirectionalTile(id, Material::plant, isSolidRender() ) +{ + setTicking(true); +} + +Icon *CocoaTile::getTexture(int face, int data) +{ + return icons[2]; +} + +Icon *CocoaTile::getTextureForAge(int age) +{ + if (age < 0 || age >= COCOA_TEXTURES_LENGTH) + { + age = COCOA_TEXTURES_LENGTH - 1; + } + return icons[age]; +} + +void CocoaTile::tick(Level *level, int x, int y, int z, Random *random) +{ + if (!canSurvive(level, x, y, z)) + { + this->spawnResources(level, x, y, z, level->getData(x, y, z), 0); + level->setTile(x, y, z, 0); + } + else if (level->random->nextInt(5) == 0) + { + int data = level->getData(x, y, z); + int age = getAge(data); + if (age < 2) + { + age++; + level->setData(x, y, z, (age << 2) | (getDirection(data))); + } + } +} + +bool CocoaTile::canSurvive(Level *level, int x, int y, int z) +{ + int dir = getDirection(level->getData(x, y, z)); + + x += Direction::STEP_X[dir]; + z += Direction::STEP_Z[dir]; + int attachedTo = level->getTile(x, y, z); + + return attachedTo == Tile::treeTrunk_Id && TreeTile::getWoodType(level->getData(x, y, z)) == TreeTile::JUNGLE_TRUNK; +} + +int CocoaTile::getRenderShape() +{ + return SHAPE_COCOA; +} + +bool CocoaTile::isCubeShaped() +{ + return false; +} + +bool CocoaTile::isSolidRender(bool isServerLevel) +{ + return false; +} + +AABB *CocoaTile::getAABB(Level *level, int x, int y, int z) +{ + updateShape(level, x, y, z); + return DirectionalTile::getAABB(level, x, y, z); +} + +AABB *CocoaTile::getTileAABB(Level *level, int x, int y, int z) +{ + updateShape(level, x, y, z); + return DirectionalTile::getTileAABB(level, x, y, z); +} + +void CocoaTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) +{ + int data = level->getData(x, y, z); + int dir = getDirection(data); + int age = getAge(data); + + int width = 4 + age * 2; + int height = 5 + age * 2; + + float hWidth = width / 2.0f; + + switch (dir) + { + case Direction::SOUTH: + setShape((8.0f - hWidth) / 16.0f, (12.0f - height) / 16.0f, (15.0f - width) / 16.0f, (8.0f + hWidth) / 16.0f, (12.0f) / 16.0f, (15.0f) / 16.0f); + break; + case Direction::NORTH: + setShape((8.0f - hWidth) / 16.0f, (12.0f - height) / 16.0f, (1.0f) / 16.0f, (8.0f + hWidth) / 16.0f, (12.0f) / 16.0f, (1.0f + width) / 16.0f); + break; + case Direction::WEST: + setShape((1.0f) / 16.0f, (12.0f - height) / 16.0f, (8.0f - hWidth) / 16.0f, (1.0f + width) / 16.0f, (12.0f) / 16.0f, (8.0f + hWidth) / 16.0f); + break; + case Direction::EAST: + setShape((15.0f - width) / 16.0f, (12.0f - height) / 16.0f, (8.0f - hWidth) / 16.0f, (15.0f) / 16.0f, (12.0f) / 16.0f, (8.0f + hWidth) / 16.0f); + break; + } +} + +void CocoaTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance) +{ + int dir = (((Mth::floor(by->yRot * 4 / (360) + 0.5)) & 3) + 0) % 4; + level->setData(x, y, z, dir); +} + +int CocoaTile::getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue) +{ + if (face == Facing::UP || face == Facing::DOWN) + { + face = Facing::NORTH; + } + return Direction::DIRECTION_OPPOSITE[Direction::FACING_DIRECTION[face]]; +} + +void CocoaTile::neighborChanged(Level *level, int x, int y, int z, int type) +{ + if (!canSurvive(level, x, y, z)) + { + this->spawnResources(level, x, y, z, level->getData(x, y, z), 0); + level->setTile(x, y, z, 0); + } +} + +int CocoaTile::getAge(int data) +{ + return (data & DirectionalTile::DIRECTION_INV_MASK) >> 2; +} + +void CocoaTile::spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonusLevel) +{ + int age = getAge(data); + int count = 1; + if (age >= 2) + { + count = 3; + } + for (int i = 0; i < count; i++) + { + popResource(level, x, y, z, shared_ptr( new ItemInstance(Item::dye_powder, 1, DyePowderItem::BROWN) )); + } +} + +int CocoaTile::cloneTileId(Level *level, int x, int y, int z) +{ + return Item::dye_powder_Id; +} + +int CocoaTile::cloneTileData(Level *level, int x, int y, int z) +{ + return DyePowderItem::BROWN; +} + +void CocoaTile::registerIcons(IconRegister *iconRegister) +{ + icons = new Icon*[COCOA_TEXTURES_LENGTH]; + + for (int i = 0; i < COCOA_TEXTURES_LENGTH; i++) + { + icons[i] = iconRegister->registerIcon(TEXTURE_AGES[i]); + } +} \ No newline at end of file -- cgit v1.2.3