diff --git a/Minecraft.World/LeafTile2.cpp b/Minecraft.World/LeafTile2.cpp new file mode 100644 index 0000000..07307a3 --- /dev/null +++ b/Minecraft.World/LeafTile2.cpp @@ -0,0 +1,132 @@ +#include "stdafx.h" +#include "LeafTile2.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.world.entity.player.h" +#include "net.minecraft.stats.h" +#include "net.minecraft.world.level.biome.h" +#include "FoliageColor.h" +#include "IconRegister.h" + +const unsigned int LeafTile2::LEAF2_NAMES[LEAF2_NAMES_SIZE] = { -1, -1}; + +const wstring LeafTile2::TEXTURES[2][2] = { + { L"leaves_acacia", L"leaves_dark_oak" }, // Indice 0: Fancy + { L"leaves_acacia_opaque", L"leaves_dark_oak_opaque" } // Indice 1: Veloce/Opaca +}; + +LeafTile2::LeafTile2(int id) : LeafTile(id) +{ + // Non serve fare checkBuffer qui, ci pensa gi? la classe padre LeafTile! +} + +Icon* LeafTile2::getTexture(int face, int data) +{ + int type = data & 3; + if (type >= LEAF2_NAMES_SIZE) type = 0; + + // isSolidRender() in LeafTile restituisce 'true' se la grafica ? su Veloce/Opaca. + // Quindi se ? true usiamo l'indice 1, se ? false (Trasparente) usiamo l'indice 0. + int textureSet = isSolidRender(false) ? 1 : 0; + + return icons[textureSet][type]; +} + +unsigned int LeafTile2::getDescriptionId(int iData) +{ + int type = iData & 3; + if (type < 0 || type >= LEAF2_NAMES_SIZE) type = 0; + return LeafTile2::LEAF2_NAMES[type]; +} + +void LeafTile2::registerIcons(IconRegister* iconRegister) +{ + for (int fancy = 0; fancy < 2; fancy++) + { + for (int i = 0; i < 2; i++) + { + icons[fancy][i] = iconRegister->registerIcon(TEXTURES[fancy][i]); + } + } +} + +int LeafTile2::getColor(int data) +{ + // In inventario o in mano, l'Acacia e la Dark Oak usano il verde base + return FoliageColor::getDefaultColor(); +} + +int LeafTile2::getColor(LevelSource* level, int x, int y, int z, int data) +{ + // Codice di blending per il colore del bioma (copiato dal tuo LeafTile.cpp) + int totalRed = 0; + int totalGreen = 0; + int totalBlue = 0; + + for (int oz = -1; oz <= 1; oz++) + { + for (int ox = -1; ox <= 1; ox++) + { + int foliageColor = level->getBiome(x + ox, z + oz)->getFolageColor(); // Attento, nel tuo engine si chiama getFolageColor() senza la 'i' + totalRed += (foliageColor & 0xff0000) >> 16; + totalGreen += (foliageColor & 0xff00) >> 8; + totalBlue += (foliageColor & 0xff); + } + } + + return (((totalRed / 9) & 0xFF) << 16) | (((totalGreen / 9) & 0xFF) << 8) | (((totalBlue / 9) & 0xFF)); +} + +void LeafTile2::playerDestroy(Level* level, shared_ptr player, int x, int y, int z, int data) +{ + // Se il giocatore usa le cesoie, vogliamo droppare "leaves2" (ID 161) e non "leaves" (ID 18) + if (!level->isClientSide && player->getSelectedItem() != nullptr && player->getSelectedItem()->id == Item::shears->id) + { + player->awardStat( + GenericStats::blocksMined(id), + GenericStats::param_blocksMined(id, data, 1) + ); + + popResource(level, x, y, z, std::make_shared(Tile::leaves_Id, 1, data & 3)); + } + else + { + // Altrimenti usa la distruzione standard di TransparentTile + TransparentTile::playerDestroy(level, player, x, y, z, data); + } +} + +void LeafTile2::spawnResources(Level* level, int x, int y, int z, int data, float odds, int playerBonusLevel) { + if (!level->isClientSide) + { + int chance = 20; + if (playerBonusLevel > 0) + { + chance -= 2 << playerBonusLevel; + if (chance < 10) chance = 10; + } + + if (level->random->nextInt(chance) == 0) + { + + + popResource(level, x, y, z, std::make_shared(Tile::sapling_Id, 1, (data & 3) + 4)); + } + + + if ((data & 3) == 1) + { + int appleChance = 200; + if (playerBonusLevel > 0) + { + appleChance -= 10 << playerBonusLevel; + if (appleChance < 40) appleChance = 40; + } + if (level->random->nextInt(appleChance) == 0) + { + popResource(level, x, y, z, std::make_shared(Item::apple_Id, 1, 0)); + } + } + } +} \ No newline at end of file diff --git a/Minecraft.World/LeafTile2.h b/Minecraft.World/LeafTile2.h new file mode 100644 index 0000000..fbda090 --- /dev/null +++ b/Minecraft.World/LeafTile2.h @@ -0,0 +1,34 @@ +#pragma once + +#include "LeafTile.h" + +class IconRegister; +class LeafTile2 : public LeafTile +{ +public: + static const int ACACIA_LEAF = 0; + static const int DARK_OAK_LEAF = 1; + + static const int LEAF2_NAMES_SIZE = 2; + static const unsigned int LEAF2_NAMES[LEAF2_NAMES_SIZE]; + +private: + //[0] = Fancy (Trasparenti), [1] = Fast (Opache) + static const wstring TEXTURES[2][2]; + Icon* icons[2][2]; + +public: + LeafTile2(int id); + + virtual Icon* getTexture(int face, int data); + virtual unsigned int getDescriptionId(int iData = -1); + virtual void registerIcons(IconRegister* iconRegister); + virtual void spawnResources(Level* level, int x, int y, int z, int data, float odds, int playerBonusLevel) override; + + + virtual int getColor(int data); + virtual int getColor(LevelSource* level, int x, int y, int z, int data); + + + virtual void playerDestroy(Level* level, shared_ptr player, int x, int y, int z, int data); +}; \ No newline at end of file diff --git a/Minecraft.World/Tile.cpp b/Minecraft.World/Tile.cpp index de11371..be75cbe 100644 --- a/Minecraft.World/Tile.cpp +++ b/Minecraft.World/Tile.cpp @@ -62,6 +62,7 @@ Tile *Tile::ironOre = nullptr; Tile *Tile::coalOre = nullptr; Tile *Tile::treeTrunk = nullptr; LeafTile *Tile::leaves = nullptr; +LeafTile2 *Tile::leaves2 = nullptr; Tile *Tile::sponge = nullptr; Tile *Tile::glass = nullptr; Tile *Tile::lapisOre = nullptr; @@ -215,6 +216,8 @@ Tile *Tile::dropper = nullptr; Tile *Tile::clayHardened_colored = nullptr; Tile *Tile::stained_glass_pane = nullptr; +Tile *Tile::tree2Trunk = nullptr; + Tile *Tile::hayBlock = nullptr; Tile *Tile::woolCarpet = nullptr; Tile *Tile::clayHardened = nullptr; @@ -278,6 +281,7 @@ void Tile::staticCtor() Tile::treeTrunk = (new TreeTile(17))->setDestroyTime(2.0f) ->setSoundType(Tile::SOUND_WOOD)->setIconName(L"log")->setDescriptionId(IDS_TILE_LOG)->sendTileData()->setUseDescriptionId(IDS_DESC_LOG); // 4J - for leaves, have specified that only the data bits that encode the type of leaf are important to be sent Tile::leaves = static_cast((new LeafTile(18))->setDestroyTime(0.2f)->setLightBlock(1)->setSoundType(Tile::SOUND_GRASS)->setIconName(L"leaves")->setDescriptionId(IDS_TILE_LEAVES)->sendTileData(LeafTile::LEAF_TYPE_MASK)->setUseDescriptionId(IDS_DESC_LEAVES)); + Tile::leaves2 = static_cast((new LeafTile2(161))->setDestroyTime(0.2f)->setLightBlock(1)->setSoundType(Tile::SOUND_GRASS)->setIconName(L"leaves_acacia")->setDescriptionId(IDS_TILE_LEAVES)->sendTileData(LeafTile::LEAF_TYPE_MASK)->setUseDescriptionId(IDS_DESC_LEAVES)); Tile::sponge = (new Sponge(19)) ->setDestroyTime(0.6f)->setSoundType(Tile::SOUND_GRASS)->setIconName(L"sponge")->setDescriptionId(IDS_TILE_SPONGE)->setUseDescriptionId(IDS_DESC_SPONGE); Tile::glass = (new GlassTile(20, Material::glass, false)) ->setDestroyTime(0.3f)->setSoundType(Tile::SOUND_GLASS)->setIconName(L"glass")->setDescriptionId(IDS_TILE_GLASS)->setUseDescriptionId(IDS_DESC_GLASS); @@ -436,6 +440,8 @@ void Tile::staticCtor() Tile::dropper = (new DropperTile(158)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_redstoneContainer, Item::eMaterial_undefined)->setDestroyTime(3.5f)->setSoundType(SOUND_STONE)->setIconName(L"dropper")->setDescriptionId(IDS_TILE_DROPPER)->setUseDescriptionId(IDS_DESC_DROPPER); Tile::clayHardened_colored = (new ColoredTile(159, Material::stone)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_clay, Item::eMaterial_clay)->setDestroyTime(1.25f)->setExplodeable(7)->setSoundType(SOUND_STONE)->setIconName(L"hardened_clay_stained")->setDescriptionId(IDS_TILE_STAINED_CLAY)->setUseDescriptionId(IDS_DESC_STAINED_CLAY); Tile::stained_glass_pane = (new StainedGlassPaneBlock(160)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_glass, Item::eMaterial_glass)->setDestroyTime(0.3f)->setSoundType(SOUND_GLASS)->setIconName(L"glass")->setDescriptionId(IDS_TILE_STAINED_GLASS_PANE)->setUseDescriptionId(IDS_DESC_STAINED_GLASS_PANE); + + Tile::tree2Trunk = (new TreeTile2(162))->setDestroyTime(2.0f)->setSoundType(Tile::SOUND_WOOD)->setIconName(L"log")->setDescriptionId(IDS_TILE_LOG)->sendTileData()->setUseDescriptionId(IDS_DESC_LOG); Tile::hayBlock = (new HayBlockTile(170)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_block, Item::eMaterial_wheat)->setDestroyTime(0.5f)->setSoundType(SOUND_GRASS)->setIconName(L"hay_block")->setDescriptionId(IDS_TILE_HAY)->setUseDescriptionId(IDS_DESC_HAY); Tile::woolCarpet = (new WoolCarpetTile(171)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_carpet, Item::eMaterial_cloth)->setDestroyTime(0.1f)->setSoundType(SOUND_CLOTH)->setIconName(L"woolCarpet")->setLightBlock(0)->setDescriptionId(IDS_TILE_CARPET)->setUseDescriptionId(IDS_DESC_CARPET); @@ -457,6 +463,7 @@ void Tile::staticCtor() Item::items[quartzBlock_Id] = ( new MultiTextureTileItem(quartzBlock_Id - 256, quartzBlock, QuartzBlockTile::BLOCK_NAMES, QuartzBlockTile::QUARTZ_BLOCK_NAMES) )->setIconName(L"quartzBlock")->setDescriptionId(IDS_TILE_QUARTZ_BLOCK)->setUseDescriptionId(IDS_DESC_QUARTZ_BLOCK); Item::items[stoneSlabHalf_Id] = ( new StoneSlabTileItem(Tile::stoneSlabHalf_Id - 256, Tile::stoneSlabHalf, Tile::stoneSlab, false) )->setIconName(L"stoneSlab")->setDescriptionId(IDS_TILE_STONESLAB)->setUseDescriptionId(IDS_DESC_HALFSLAB); Item::items[stoneSlab_Id] = ( new StoneSlabTileItem(Tile::stoneSlab_Id - 256, Tile::stoneSlabHalf, Tile::stoneSlab, true))->setIconName(L"stoneSlab")->setDescriptionId(IDS_DESC_STONESLAB)->setUseDescriptionId(IDS_DESC_SLAB); + Item::items[tree2Trunk_Id] = ( new MultiTextureTileItem(Tile::tree2Trunk_Id - 256, tree2Trunk, (int*)TreeTile2::TREE_NAMES, TreeTile2::TREE_NAMES_LENGTH))->setIconName(L"log")->setDescriptionId(IDS_TILE_LOG)->setUseDescriptionId(IDS_DESC_LOG); Item::items[woodSlabHalf_Id] = ( new StoneSlabTileItem(Tile::woodSlabHalf_Id - 256, Tile::woodSlabHalf, Tile::woodSlab, false))->setIconName(L"woodSlab")->setDescriptionId(IDS_DESC_WOODSLAB)->setUseDescriptionId(IDS_DESC_WOODSLAB); Item::items[woodSlab_Id] = ( new StoneSlabTileItem(Tile::woodSlab_Id - 256, Tile::woodSlabHalf, Tile::woodSlab, true))->setIconName(L"woodSlab")->setDescriptionId(IDS_DESC_WOODSLAB)->setUseDescriptionId(IDS_DESC_WOODSLAB); Item::items[sapling_Id] = ( new MultiTextureTileItem(Tile::sapling_Id - 256, Tile::sapling, Sapling::SAPLING_NAMES, 4) )->setIconName(L"sapling")->setDescriptionId(IDS_TILE_SAPLING)->setUseDescriptionId(IDS_DESC_SAPLING); diff --git a/Minecraft.World/Tile.h b/Minecraft.World/Tile.h index 307c410..9225f2f 100644 --- a/Minecraft.World/Tile.h +++ b/Minecraft.World/Tile.h @@ -7,6 +7,7 @@ using namespace std; class GrassTile; class LeafTile; +class LeafTile2; class TallGrass; class DeadBushTile; class FireTile; @@ -203,6 +204,8 @@ public: static const int coalOre_Id = 16; static const int treeTrunk_Id = 17; static const int leaves_Id = 18; + static const int leaves2_Id = 161; + static const int sponge_Id = 19; static const int glass_Id = 20; @@ -288,6 +291,7 @@ public: static const int diode_off_Id = 93; static const int diode_on_Id = 94; static const int stained_glass_Id = 95; + static const int tree2Trunk_Id = 162; static const int trapdoor_Id = 96; static const int monsterStoneEgg_Id = 97; static const int stoneBrick_Id = 98; @@ -384,6 +388,7 @@ public: static Tile *coalOre; static Tile *treeTrunk; static LeafTile *leaves; + static LeafTile2 *leaves2; static Tile *sponge; static Tile *glass; static Tile *lapisOre; @@ -535,6 +540,10 @@ public: static Tile *dropper; static Tile *clayHardened_colored; static Tile *stained_glass_pane; + + + static Tile *tree2Trunk; + static Tile *hayBlock; static Tile *woolCarpet; diff --git a/Minecraft.World/TreeTile2.cpp b/Minecraft.World/TreeTile2.cpp new file mode 100644 index 0000000..5dd6849 --- /dev/null +++ b/Minecraft.World/TreeTile2.cpp @@ -0,0 +1,82 @@ +#include "stdafx.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.piston.h" +#include "net.minecraft.h" +#include "net.minecraft.world.h" +#include "LeafTile.h" + +#include "TreeTile2.h" + +const unsigned int TreeTile2::TREE_NAMES[TreeTile2::TREE_NAMES_LENGTH] = { -1, -1 }; + +const wstring TreeTile2::TREE_STRING_NAMES[TreeTile2::TREE_NAMES_LENGTH] = { L"acacia", L"dark" }; + +const wstring TreeTile2::TREE_TEXTURES[] = { L"tree_acacia", L"tree_dark" }; + +TreeTile2::TreeTile2(int id) : RotatedPillarTile(id, Material::wood) +{ +} + +int TreeTile2::getResourceCount(Random* random) +{ + return 1; +} + +int TreeTile2::getResource(int data, Random* random, int playerBonusLevel) +{ + return Tile::tree2Trunk_Id; +} + +void TreeTile2::onRemove(Level* level, int x, int y, int z, int id, int data) +{ + int r = LeafTile::REQUIRED_WOOD_RANGE; + int r2 = r + 1; + + if (level->hasChunksAt(x - r2, y - r2, z - r2, x + r2, y + r2, z + r2)) + { + for (int xo = -r; xo <= r; xo++) + for (int yo = -r; yo <= r; yo++) + for (int zo = -r; zo <= r; zo++) + { + int t = level->getTile(x + xo, y + yo, z + zo); + if (t == Tile::leaves_Id || t == Tile::leaves2_Id) + { + int currentData = level->getData(x + xo, y + yo, z + zo); + if ((currentData & LeafTile::UPDATE_LEAF_BIT) == 0) + { + level->setData(x + xo, y + yo, z + zo, currentData | LeafTile::UPDATE_LEAF_BIT, Tile::UPDATE_NONE); + } + } + } + } +} + +Icon* TreeTile2::getTypeTexture(int type) +{ + return icons_side[type]; +} + +Icon* TreeTile2::getTopTexture(int type) +{ + return icons_top[type]; +} + +int TreeTile2::getWoodType(int data) +{ + return data & MASK_TYPE; +} + +shared_ptr TreeTile2::getSilkTouchItemInstance(int data) +{ + // fix to avoid getting silktouched sideways logs + return std::make_shared(id, 1, getWoodType(data)); +} + +void TreeTile2::registerIcons(IconRegister* iconRegister) +{ + for (int i = 0; i < TREE_NAMES_LENGTH; i++) + { + icons_side[i] = iconRegister->registerIcon(getIconName() + L"_" + TREE_STRING_NAMES[i]); + icons_top[i] = iconRegister->registerIcon(getIconName() + L"_" + TREE_STRING_NAMES[i] + L"_top"); + } +} \ No newline at end of file diff --git a/Minecraft.World/TreeTile2.h b/Minecraft.World/TreeTile2.h new file mode 100644 index 0000000..412341a --- /dev/null +++ b/Minecraft.World/TreeTile2.h @@ -0,0 +1,53 @@ +#pragma once + +#include "RotatedPillarTile.h" + +class ChunkRebuildData; +class Player; + +class TreeTile2 : public RotatedPillarTile +{ + friend class Tile; + friend class ChunkRebuildData; +public: + static const int ACACIA_TRUNK = 0; + static const int DARK_TRUNK = 1; + + static const int MASK_TYPE = 0x3; + static const int MASK_FACING = 0xC; + static const int FACING_Y = 0 << 2; + static const int FACING_X = 1 << 2; + static const int FACING_Z = 2 << 2; + + static const int TREE_NAMES_LENGTH = 2; + + + static const unsigned int TREE_NAMES[TREE_NAMES_LENGTH]; + + static const wstring TREE_STRING_NAMES[TREE_NAMES_LENGTH]; + + static const wstring TREE_TEXTURES[]; + +private: + Icon* icons_side[TREE_NAMES_LENGTH]; + Icon* icons_top[TREE_NAMES_LENGTH]; + +protected: + TreeTile2(int id); + +public: + virtual int getResourceCount(Random* random); + virtual int getResource(int data, Random* random, int playerBonusLevel); + virtual void onRemove(Level* level, int x, int y, int z, int id, int data); + +protected: + virtual Icon* getTypeTexture(int type); + virtual Icon* getTopTexture(int type); + +public: + static int getWoodType(int data); + void registerIcons(IconRegister* iconRegister); + +protected: + virtual shared_ptr getSilkTouchItemInstance(int data); +}; \ No newline at end of file diff --git a/Minecraft.World/net.minecraft.world.level.tile.h b/Minecraft.World/net.minecraft.world.level.tile.h index 36c7ac5..50dedde 100644 --- a/Minecraft.World/net.minecraft.world.level.tile.h +++ b/Minecraft.World/net.minecraft.world.level.tile.h @@ -57,6 +57,7 @@ #include "JukeboxTile.h" #include "LadderTile.h" #include "LeafTile.h" +#include "LeafTile2.h" #include "LevelEvent.h" #include "LeverTile.h" #include "LiquidTile.h" @@ -116,6 +117,7 @@ #include "TransparentTile.h" #include "TrapDoorTile.h" #include "TreeTile.h" +#include "TreeTile2.h" #include "TripWireSourceTile.h" #include "TripWireTile.h" #include "VineTile.h" diff --git a/cmake/WorldSources.cmake b/cmake/WorldSources.cmake index ea2d0e3..4292148 100644 --- a/cmake/WorldSources.cmake +++ b/cmake/WorldSources.cmake @@ -381,6 +381,7 @@ set(MINECRAFT_WORLD_SOURCES "LavaSlime.cpp" "Layer.cpp" "LeafTile.cpp" + "LeafTile2.cpp" "LeafTileItem.cpp" "LeapAtTargetGoal.cpp" "LeashFenceKnotEntity.cpp" @@ -738,6 +739,7 @@ set(MINECRAFT_WORLD_SOURCES "TrapMenu.cpp" "TreeFeature.cpp" "TreeTile.cpp" + "TreeTile2.cpp" "TripWireSourceTile.cpp" "TripWireTile.cpp" "UntouchingEnchantment.cpp"