TU19: merge Minecraft.World/Blocks

This commit is contained in:
Tropical
2026-03-21 15:52:50 -05:00
parent f25cd66f4d
commit 9b6046cb83
242 changed files with 8083 additions and 4657 deletions

View File

@@ -46,8 +46,10 @@ void FireTile::init() {
setFlammable(Tile::bookshelf_Id, FLAME_EASY, BURN_MEDIUM);
setFlammable(Tile::tnt_Id, FLAME_MEDIUM, BURN_INSTANT);
setFlammable(Tile::tallgrass_Id, FLAME_INSTANT, BURN_INSTANT);
setFlammable(Tile::cloth_Id, FLAME_EASY, BURN_EASY);
setFlammable(Tile::wool_Id, FLAME_EASY, BURN_EASY);
setFlammable(Tile::vine_Id, FLAME_MEDIUM, BURN_INSTANT);
setFlammable(Tile::coalBlock_Id, FLAME_HARD, BURN_HARD);
setFlammable(Tile::hayBlock_Id, FLAME_INSTANT, BURN_MEDIUM);
}
void FireTile::setFlammable(int id, int flame, int burn) {
@@ -67,9 +69,13 @@ int FireTile::getRenderShape() { return Tile::SHAPE_FIRE; }
int FireTile::getResourceCount(Random* random) { return 0; }
int FireTile::getTickDelay() { return 30; }
int FireTile::getTickDelay(Level* level) { return 30; }
void FireTile::tick(Level* level, int x, int y, int z, Random* random) {
if (!level->getGameRules()->getBoolean(GameRules::RULE_DOFIRETICK)) {
return;
}
// 4J added - we don't want fire to do anything that might create new fire,
// or destroy this fire, if we aren't actually tracking (for network) the
// chunk this is in in the player chunk map. If we did change something in
@@ -83,12 +89,12 @@ void FireTile::tick(Level* level, int x, int y, int z, Random* random) {
{
if (!MinecraftServer::getInstance()->getPlayers()->isTrackingTile(
x, y, z, level->dimension->id)) {
level->addToTickNextTick(x, y, z, id, getTickDelay() * 5);
level->addToTickNextTick(x, y, z, id, getTickDelay(level) * 5);
return;
}
}
bool infiniBurn = level->getTile(x, y - 1, z) == Tile::hellRock_Id;
bool infiniBurn = level->getTile(x, y - 1, z) == Tile::netherRack_Id;
if (level->dimension->id == 1) // 4J - was == instanceof TheEndDimension
{
if (level->getTile(x, y - 1, z) == Tile::unbreakable_Id)
@@ -96,7 +102,7 @@ void FireTile::tick(Level* level, int x, int y, int z, Random* random) {
}
if (!mayPlace(level, x, y, z)) {
level->setTile(x, y, z, 0);
level->removeTile(x, y, z);
}
if (!infiniBurn && level->isRaining()) {
@@ -104,26 +110,28 @@ void FireTile::tick(Level* level, int x, int y, int z, Random* random) {
level->isRainingAt(x + 1, y, z) ||
level->isRainingAt(x, y, z - 1) ||
level->isRainingAt(x, y, z + 1)) {
level->setTile(x, y, z, 0);
level->removeTile(x, y, z);
return;
}
}
int age = level->getData(x, y, z);
if (age < 15) {
level->setDataNoUpdate(x, y, z, age + random->nextInt(3) / 2);
level->setData(x, y, z, age + random->nextInt(3) / 2,
Tile::UPDATE_NONE);
}
level->addToTickNextTick(x, y, z, id, getTickDelay() + random->nextInt(10));
level->addToTickNextTick(x, y, z, id,
getTickDelay(level) + random->nextInt(10));
if (!infiniBurn && !isValidFireLocation(level, x, y, z)) {
if (!level->isTopSolidBlocking(x, y - 1, z) || age > 3)
level->setTile(x, y, z, 0);
level->removeTile(x, y, z);
return;
}
if (!infiniBurn && !canBurn(level, x, y - 1, z)) {
if (age == 15 && random->nextInt(4) == 0) {
level->setTile(x, y, z, 0);
level->removeTile(x, y, z);
return;
}
}
@@ -152,24 +160,22 @@ void FireTile::tick(Level* level, int x, int y, int z, Random* random) {
int fodds = getFireOdds(level, xx, yy, zz);
if (fodds > 0) {
int odds = (fodds + 40) / (age + 30);
int odds =
(fodds + 40 + (level->difficulty * 7)) / (age + 30);
if (isHumid) {
odds /= 2;
}
if (odds > 0 && random->nextInt(rate) <= odds) {
if ((level->isRaining() &&
level->isRainingAt(xx, yy, zz)) ||
level->isRainingAt(xx - 1, yy, z) ||
level->isRainingAt(xx + 1, yy, zz) ||
level->isRainingAt(xx, yy, zz - 1) ||
level->isRainingAt(xx, yy, zz + 1)) {
// DO NOTHING, rain!
} else {
if (!(level->isRaining() &&
level->isRainingAt(xx, yy, zz) ||
level->isRainingAt(xx - 1, yy, z) ||
level->isRainingAt(xx + 1, yy, zz) ||
level->isRainingAt(xx, yy, zz - 1) ||
level->isRainingAt(xx, yy, zz + 1))) {
int tAge = age + random->nextInt(5) / 4;
if (tAge > 15) tAge = 15;
level->setTileAndData(xx, yy, zz, this->id,
tAge);
level->setTileAndData(xx, yy, zz, id, tAge,
Tile::UPDATE_ALL);
}
}
}
@@ -179,6 +185,8 @@ void FireTile::tick(Level* level, int x, int y, int z, Random* random) {
}
}
bool FireTile::canInstantlyTick() { return false; }
void FireTile::checkBurnOut(Level* level, int x, int y, int z, int chance,
Random* random, int age) {
int odds = burnOdds[level->getTile(x, y, z)];
@@ -188,9 +196,9 @@ void FireTile::checkBurnOut(Level* level, int x, int y, int z, int chance,
app.GetGameHostOption(eGameHostOption_FireSpreads)) {
int tAge = age + random->nextInt(5) / 4;
if (tAge > 15) tAge = 15;
level->setTileAndData(x, y, z, this->id, tAge);
level->setTileAndData(x, y, z, id, tAge, Tile::UPDATE_ALL);
} else {
level->setTile(x, y, z, 0);
level->removeTile(x, y, z);
}
if (wasTnt) {
Tile::tnt->destroy(level, x, y, z, TntTile::EXPLODE_BIT);
@@ -243,7 +251,7 @@ bool FireTile::mayPlace(Level* level, int x, int y, int z) {
void FireTile::neighborChanged(Level* level, int x, int y, int z, int type) {
if (!level->isTopSolidBlocking(x, y - 1, z) &&
!isValidFireLocation(level, x, y, z)) {
level->setTile(x, y, z, 0);
level->removeTile(x, y, z);
return;
}
}
@@ -257,11 +265,11 @@ void FireTile::onPlace(Level* level, int x, int y, int z) {
}
if (!level->isTopSolidBlocking(x, y - 1, z) &&
!isValidFireLocation(level, x, y, z)) {
level->setTile(x, y, z, 0);
level->removeTile(x, y, z);
return;
}
level->addToTickNextTick(x, y, z, id,
getTickDelay() + level->random->nextInt(10));
getTickDelay(level) + level->random->nextInt(10));
}
bool FireTile::isFlammable(int tile) { return flameOdds[tile] > 0; }
@@ -270,7 +278,7 @@ void FireTile::animateTick(Level* level, int x, int y, int z, Random* random) {
if (random->nextInt(24) == 0) {
level->playLocalSound(x + 0.5f, y + 0.5f, z + 0.5f,
eSoundType_FIRE_FIRE, 1 + random->nextFloat(),
random->nextFloat() * 0.7f + 0.3f);
random->nextFloat() * 0.7f + 0.3f, false);
}
if (level->isTopSolidBlocking(x, y - 1, z) ||