Implement red sand and red sandstone.

This commit is contained in:
piebot
2026-03-14 23:21:19 +03:00
parent c9249c8f51
commit 91203050fa
12 changed files with 279 additions and 5 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 83 KiB

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 KiB

After

Width:  |  Height:  |  Size: 133 KiB

View File

@@ -37,6 +37,10 @@ void IUIScene_CreativeMenu::staticCtor()
ITEM(Tile::sandStone_Id)
ITEM_AUX(Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE)
ITEM_AUX(Tile::sandStone_Id, SandStoneTile::TYPE_HEIROGLYPHS)
ITEM_AUX(Tile::sand_Id, SandTile::RED_SAND)
ITEM(Tile::red_sandstone_Id)
ITEM_AUX(Tile::red_sandstone_Id, RedSandStoneTile::TYPE_SMOOTHSIDE)
ITEM_AUX(Tile::red_sandstone_Id, RedSandStoneTile::TYPE_HEIROGLYPHS)
ITEM_AUX(Tile::stone_Id, StoneTile::GRANITE)
ITEM_AUX(Tile::stone_Id, StoneTile::POLISHED_GRANITE)
ITEM_AUX(Tile::stone_Id, StoneTile::ANDESITE)
@@ -160,6 +164,7 @@ void IUIScene_CreativeMenu::staticCtor()
ITEM(Tile::stairs_stoneBrick_Id)
ITEM(Tile::stairs_netherBricks_Id)
ITEM(Tile::stairs_sandstone_Id)
ITEM(Tile::stairs_red_sandstone)
ITEM(Tile::stairs_quartz_Id)
ITEM(Tile::clayHardened_Id)

View File

@@ -996,12 +996,16 @@ void PreStitchedTextureMap::loadUVs()
ADD_ICON(20, 9, L"log_acacia_top");
ADD_ICON(20, 10, L"planks_acacia");
ADD_ICON(20, 14, L"red_sand");
ADD_ICON(20, 15, L"red_sandstone_top");
ADD_ICON(21, 5, L"flower_tulip_pink");
ADD_ICON(21, 8, L"log_dark");
ADD_ICON(21, 9, L"log_dark_top");
ADD_ICON(21, 10, L"planks_dark");
ADD_ICON(21, 5, L"flower_tulip_pink");
ADD_ICON(21, 14, L"red_sandstone_bottom");
ADD_ICON(21, 15, L"red_sandstone_normal");
ADD_ICON(22, 0, L"flower_allium");
ADD_ICON(22, 1, L"flower_blue_orchid");
@@ -1013,6 +1017,9 @@ void PreStitchedTextureMap::loadUVs()
ADD_ICON(22, 8, L"coarse_dirt");
ADD_ICON(22, 9, L"dirt_podzol_side");
ADD_ICON(22, 10, L"dirt_podzol_top");
ADD_ICON(22, 14, L"red_sandstone_carved");
ADD_ICON(22, 15, L"red_sandstone_smooth");
ADD_ICON(23, 0, L"door_acacia_upper");

View File

@@ -2706,9 +2706,11 @@
<ClInclude Include="AbstractProjectileDispenseBehavior.h" />
<ClInclude Include="Rabbit.h" />
<ClInclude Include="RailTile.h" />
<ClInclude Include="RedSandStoneTile.h" />
<ClInclude Include="Redstone.h" />
<ClInclude Include="RepeaterTile.h" />
<ClInclude Include="RotatedPillarTile.h" />
<ClInclude Include="SandTile.h" />
<ClInclude Include="Score.h" />
<ClInclude Include="Scoreboard.h" />
<ClInclude Include="ScoreboardSaveData.h" />
@@ -3632,11 +3634,13 @@
<ClCompile Include="AbstractProjectileDispenseBehavior.cpp" />
<ClCompile Include="Rabbit.cpp" />
<ClCompile Include="RailTile.cpp" />
<ClCompile Include="RedSandStoneTile.cpp" />
<ClCompile Include="Redstone.cpp" />
<ClCompile Include="RepeaterTile.cpp" />
<ClCompile Include="Rose.cpp" />
<ClInclude Include="Rose.h" />
<ClCompile Include="RotatedPillarTile.cpp" />
<ClCompile Include="SandTile.cpp" />
<ClCompile Include="Score.cpp" />
<ClCompile Include="Scoreboard.cpp" />
<ClCompile Include="SimpleFoiledItem.cpp" />

View File

@@ -0,0 +1,52 @@
#include "stdafx.h"
#include "net.minecraft.h"
#include "net.minecraft.world.level.material.h"
#include "net.minecraft.world.h"
#include "RedSandStoneTile.h"
const wstring RedSandStoneTile::TEXTURE_TOP = L"red_sandstone_top";
const wstring RedSandStoneTile::TEXTURE_BOTTOM = L"red_sandstone_bottom";
const wstring RedSandStoneTile::TEXTURE_NAMES[] = { L"red_sandstone_normal", L"red_sandstone_carved", L"red_sandstone_smooth" };
int RedSandStoneTile::SANDSTONE_NAMES[SANDSTONE_BLOCK_NAMES] = {
IDS_TILE_SANDSTONE, IDS_TILE_SANDSTONE_CHISELED, IDS_TILE_SANDSTONE_SMOOTH
};
RedSandStoneTile::RedSandStoneTile(int id) : Tile(id, Material::stone)
{
icons = nullptr;
iconTop = nullptr;
iconBottom = nullptr;
}
Icon* RedSandStoneTile::getTexture(int face, int data)
{
if (face == Facing::UP || (face == Facing::DOWN && (data == TYPE_HEIROGLYPHS || data == TYPE_SMOOTHSIDE)))
{
return iconTop;
}
if (face == Facing::DOWN)
{
return iconBottom;
}
if (data < 0 || data >= SANDSTONE_TILE_TEXTURE_COUNT) data = 0;
return icons[data];
}
int RedSandStoneTile::getSpawnResourcesAuxValue(int data)
{
return data;
}
void RedSandStoneTile::registerIcons(IconRegister* iconRegister)
{
icons = new Icon * [SANDSTONE_TILE_TEXTURE_COUNT];
for (int i = 0; i < SANDSTONE_TILE_TEXTURE_COUNT; i++)
{
icons[i] = iconRegister->registerIcon(TEXTURE_NAMES[i]);
}
iconTop = iconRegister->registerIcon(TEXTURE_TOP);
iconBottom = iconRegister->registerIcon(TEXTURE_BOTTOM);
}

View File

@@ -0,0 +1,38 @@
#pragma once
using namespace std;
#include "Tile.h"
class ChunkRebuildData;
class RedSandStoneTile : public Tile
{
friend class ChunkRebuildData;
public:
static const int TYPE_DEFAULT = 0;
static const int TYPE_HEIROGLYPHS = 1;
static const int TYPE_SMOOTHSIDE = 2;
// Add this in when we need it
//static final String[] SANDSTONE_NAMES = {"default", "chiseled", "smooth"};
static const int SANDSTONE_BLOCK_NAMES = 3;
static int SANDSTONE_NAMES[SANDSTONE_BLOCK_NAMES];
private:
static const wstring TEXTURE_TOP;
static const wstring TEXTURE_BOTTOM;
static const wstring TEXTURE_NAMES[];
static const int SANDSTONE_TILE_TEXTURE_COUNT = 3;
Icon** icons;
Icon* iconTop;
Icon* iconBottom;
public:
RedSandStoneTile(int id);
public:
Icon* getTexture(int face, int data);
virtual int getSpawnResourcesAuxValue(int data);
void registerIcons(IconRegister* iconRegister);
};

View File

@@ -0,0 +1,122 @@
#include "stdafx.h"
#include "net.minecraft.world.level.h"
#include "net.minecraft.world.entity.item.h"
#include "SandTile.h"
#include "FireTile.h"
#include "net.minecraft.world.h"
const unsigned int SandTile::SAND_NAMES[SAND_NAMES_LENGTH] = { IDS_TILE_STONE,
IDS_TILE_SAND};
const wstring SandTile::TEXTURE_NAMES[] = { L"sand",
L"red_sand" };
bool SandTile::instaFall = false;
SandTile::SandTile(int type, bool isSolidRender) : Tile(type, Material::sand, isSolidRender)
{
icons = nullptr;
}
int SandTile::getSpawnResourcesAuxValue(int data)
{
if (data < 0 || data >= SAND_NAMES_LENGTH) data = 0;
return data;
}
void SandTile::onPlace(Level* level, int x, int y, int z)
{
level->addToTickNextTick(x, y, z, id, getTickDelay(level));
}
void SandTile::neighborChanged(Level* level, int x, int y, int z, int type)
{
level->addToTickNextTick(x, y, z, id, getTickDelay(level));
}
void SandTile::tick(Level* level, int x, int y, int z, Random* random)
{
if (!level->isClientSide)
{
checkSlide(level, x, y, z);
}
}
void SandTile::checkSlide(Level* level, int x, int y, int z)
{
int x2 = x;
int y2 = y;
int z2 = z;
if (isFree(level, x2, y2 - 1, z2) && y2 >= 0)
{
int r = 32;
if (instaFall || !level->hasChunksAt(x - r, y - r, z - r, x + r, y + r, z + r))
{
level->removeTile(x, y, z);
while (isFree(level, x, y - 1, z) && y > 0)
y--;
if (y > 0)
{
level->setTileAndUpdate(x, y, z, id);
}
}
else if (!level->isClientSide)
{
// 4J added - don't do anything just now if we can't create any new falling tiles
if (!level->newFallingTileAllowed())
{
level->addToTickNextTick(x, y, z, id, getTickDelay(level));
return;
}
shared_ptr<FallingTile> e = std::make_shared<FallingTile>(level, x + 0.5f, y + 0.5f, z + 0.5f, id, level->getData(x, y, z));
falling(e);
level->addEntity(e);
}
}
}
void SandTile::falling(shared_ptr<FallingTile> entity)
{
}
int SandTile::getTickDelay(Level* level)
{
return 2;
}
bool SandTile::isFree(Level* level, int x, int y, int z)
{
int t = level->getTile(x, y, z);
if (t == 0) return true;
if (t == Tile::fire_Id) return true;
Material* material = Tile::tiles[t]->material;
if (material == Material::water) return true;
if (material == Material::lava) return true;
return false;
}
void SandTile::onLand(Level* level, int xt, int yt, int zt, int data)
{
}
Icon* SandTile::getTexture(int face, int data)
{
if (data < 0 || data >= SAND_NAMES_LENGTH)
{
data = 0;
}
return icons[data];
}
void SandTile::registerIcons(IconRegister* iconRegister)
{
icons = new Icon * [SAND_NAMES_LENGTH];
for (int i = 0; i < SAND_NAMES_LENGTH; i++)
{
icons[i] = iconRegister->registerIcon(TEXTURE_NAMES[i]);
}
}

View File

@@ -0,0 +1,36 @@
#pragma once
#include "Tile.h"
class Random;
class Level;
class FallingTile;
class SandTile : public Tile
{
public:
static bool instaFall;
static const int RED_SAND = 1;
static const int SAND_NAMES_LENGTH = 2;
static const unsigned int SAND_NAMES[SAND_NAMES_LENGTH];
static const wstring TEXTURE_NAMES[];
SandTile(int type, bool isSolidRender = true);
virtual void onPlace(Level* level, int x, int y, int z);
virtual void neighborChanged(Level* level, int x, int y, int z, int type);
virtual void tick(Level* level, int x, int y, int z, Random* random);
private:
Icon** icons;
void checkSlide(Level* level, int x, int y, int z);
protected:
virtual void falling(shared_ptr<FallingTile> entity);
public:
virtual int getTickDelay(Level* level);
static bool isFree(Level* level, int x, int y, int z);
virtual int getSpawnResourcesAuxValue(int data);
virtual void onLand(Level* level, int xt, int yt, int zt, int data);
virtual Icon* getTexture(int face, int data);
void registerIcons(IconRegister* iconRegister);
};

View File

@@ -244,6 +244,9 @@ Tile* Tile::acaciaGate = nullptr;
Tile* Tile::darkGate = nullptr;
Tile* Tile::invertedDaylightDetector = nullptr;
Tile* Tile::red_sandstone = nullptr;
Tile* Tile::stairs_red_sandstone = nullptr;
DWORD Tile::tlsIdxShape = TlsAlloc();
@@ -295,7 +298,7 @@ void Tile::staticCtor()
Tile::lava = static_cast<LiquidTile *>((new LiquidTileDynamic(10, Material::lava))->setDestroyTime(00.0f)->setLightEmission(1.0f)->setLightBlock(255)->setIconName(L"lava_flow")->setDescriptionId(IDS_TILE_LAVA)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_LAVA));
Tile::calmLava = (new LiquidTileStatic(11, Material::lava)) ->setDestroyTime(100.0f)->setLightEmission(1.0f)->setLightBlock(255)->setIconName(L"lava_still")->setDescriptionId(IDS_TILE_LAVA)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_LAVA);
Tile::sand = (new HeavyTile(12)) ->setDestroyTime(0.5f)->setSoundType(Tile::SOUND_SAND)->setIconName(L"sand")->setDescriptionId(IDS_TILE_SAND)->setUseDescriptionId(IDS_DESC_SAND);
Tile::sand = (new SandTile(12)) ->setDestroyTime(0.5f)->setSoundType(Tile::SOUND_SAND)->setIconName(L"sand")->setDescriptionId(IDS_TILE_SAND)->setUseDescriptionId(IDS_DESC_SAND);
Tile::gravel = (new GravelTile(13)) ->setDestroyTime(0.6f)->setSoundType(Tile::SOUND_GRAVEL)->setIconName(L"gravel")->setDescriptionId(IDS_TILE_GRAVEL)->setUseDescriptionId(IDS_DESC_GRAVEL);
Tile::goldOre = (new OreTile(14)) ->setDestroyTime(3.0f)->setExplodeable(5)->setSoundType(Tile::SOUND_STONE)->setIconName(L"gold_ore")->setDescriptionId(IDS_TILE_ORE_GOLD)->setUseDescriptionId(IDS_DESC_ORE_GOLD);
Tile::ironOre = (new OreTile(15)) ->setDestroyTime(3.0f)->setExplodeable(5)->setSoundType(Tile::SOUND_STONE)->setIconName(L"iron_ore")->setDescriptionId(IDS_TILE_ORE_IRON)->setUseDescriptionId(IDS_DESC_ORE_IRON);
@@ -472,6 +475,8 @@ void Tile::staticCtor()
Tile::coalBlock = (new Tile(173, Material::stone)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_block, Item::eMaterial_coal)->setDestroyTime(5.0f)->setExplodeable(10)->setSoundType(SOUND_STONE)->setIconName(L"coal_block")->setDescriptionId(IDS_TILE_COAL)->setUseDescriptionId(IDS_DESC_COAL_BLOCK);
Tile::invertedDaylightDetector = static_cast<DaylightDetectorTile*>((new DaylightDetectorTile(178, true))->setDestroyTime(0.2f)->setSoundType(SOUND_WOOD)->setIconName(L"daylight_detector")->setDescriptionId(IDS_TILE_DAYLIGHT_DETECTOR)->setUseDescriptionId(IDS_DESC_DAYLIGHT_DETECTOR));
Tile::red_sandstone = (new RedSandStoneTile(179))->setBaseItemTypeAndMaterial(Item::eBaseItemType_structblock, Item::eMaterial_sand)->setSoundType(Tile::SOUND_STONE)->setDestroyTime(0.8f)->sendTileData()->setIconName(L"red_sandstone")->setDescriptionId(IDS_TILE_SANDSTONE)->setUseDescriptionId(IDS_DESC_SANDSTONE)->sendTileData();
Tile::stairs_red_sandstone = (new StairTile(180, Tile::red_sandstone, 0))->setBaseItemTypeAndMaterial(Item::eBaseItemType_stairs, Item::eMaterial_sand)->setIconName(L"stairsRedSandstone")->setDescriptionId(IDS_TILE_STAIRS_SANDSTONE)->sendTileData()->setUseDescriptionId(IDS_DESC_STAIRS);
Tile::spruceGate = (new FenceGateTile(183))->setDestroyTime(2.0f)->setExplodeable(5)->setSoundType(SOUND_WOOD)->setIconName(L"planks_spruce")->setDescriptionId(IDS_TILE_SPRUCE_GATE)->sendTileData()->setUseDescriptionId(IDS_DESC_FENCE_GATE);
Tile::birchGate = (new FenceGateTile(184))->setDestroyTime(2.0f)->setExplodeable(5)->setSoundType(SOUND_WOOD)->setIconName(L"planks_birch")->setDescriptionId(IDS_TILE_BIRCH_GATE)->sendTileData()->setUseDescriptionId(IDS_DESC_FENCE_GATE);
@@ -522,6 +527,8 @@ void Tile::staticCtor()
Item::items[dirt_Id] = (new MultiTextureTileItem(Tile::dirt_Id - 256, dirt, (int*)DirtTile::DIRT_NAMES, 3))->setIconName(L"dirt")->setDescriptionId(IDS_TILE_DIRT)->setUseDescriptionId(IDS_DESC_DIRT);
Item::items[stone_Id] = (new MultiTextureTileItem(Tile::stone_Id - 256, dirt, (int*)StoneTile::STONE_NAMES, 3))->setIconName(L"stone")->setDescriptionId(IDS_TILE_STONE)->setUseDescriptionId(IDS_DESC_STONE);
Item::items[rose_Id] = (new MultiTextureTileItem(Tile::rose_Id - 256, rose, (int*)Rose::FLOWER_NAMES, Rose::FLOWER_NAMES_LENGTH))->setIconName(L"flower_rose")->setDescriptionId(IDS_TILE_ROSE)->setUseDescriptionId(IDS_DESC_FLOWER);
Item::items[sand_Id] = (new MultiTextureTileItem(Tile::sand_Id - 256, sand, (int*)SandTile::SAND_NAMES, SandTile::SAND_NAMES_LENGTH))->setIconName(L"sand")->setDescriptionId(IDS_TILE_SAND)->setUseDescriptionId(IDS_DESC_SAND);
Item::items[red_sandstone_Id] = (new MultiTextureTileItem(Tile::red_sandstone_Id - 256, red_sandstone, (int*)RedSandStoneTile::SANDSTONE_NAMES, RedSandStoneTile::SANDSTONE_BLOCK_NAMES))->setIconName(L"red_sandstone")->setDescriptionId(IDS_TILE_SANDSTONE)->setUseDescriptionId(IDS_DESC_SANDSTONE);
for (int i = 0; i < 256; i++)
{

View File

@@ -371,7 +371,8 @@ public:
static const int coalBlock_Id = 173;
static const int invertedDaylightDetector_Id = 178;
static const int red_sandstone_Id = 179;
static const int stairs_red_sandstone_Id = 180;
static const int spruceGate_Id = 183;
static const int birchGate_Id = 184;
@@ -584,7 +585,8 @@ public:
static Tile* darkGate;
static Tile* invertedDaylightDetector;
static Tile* red_sandstone;
static Tile* stairs_red_sandstone;
static void staticCtor();
int id;

View File

@@ -130,5 +130,6 @@
#include "WoodSlabTile.h"
#include "WoolCarpetTile.h"
#include "Rose.h"
#include "SandTile.h"
#include "RedSandStoneTile.h"