mirror of
https://github.com/smartcmd/MinecraftConsoles.git
synced 2026-08-20 09:57:09 +00:00
Update light if item in light changed
This commit is contained in:
parent
b0e740f8b6
commit
864f980550
|
|
@ -2351,84 +2351,73 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures)
|
|||
{
|
||||
// setScreen(new InBedChatScreen()); // 4J - TODO put back in
|
||||
}
|
||||
// === Динамический свет от факела ===
|
||||
// === Динамический свет от светящегося блока в руке ===
|
||||
{
|
||||
// Статические переменные для хранения последней позиции блока света
|
||||
// (по одной на каждого возможного игрока)
|
||||
static int lastLightX[XUSER_MAX_COUNT];
|
||||
static int lastLightY[XUSER_MAX_COUNT];
|
||||
static int lastLightZ[XUSER_MAX_COUNT];
|
||||
static int lastLightX[XUSER_MAX_COUNT];
|
||||
static int lastLightY[XUSER_MAX_COUNT];
|
||||
static int lastLightZ[XUSER_MAX_COUNT];
|
||||
static bool lightPlaced[XUSER_MAX_COUNT];
|
||||
|
||||
// Инициализация при первом вызове
|
||||
static int lastHeldItemId[XUSER_MAX_COUNT];
|
||||
static bool initialized = false;
|
||||
if (!initialized)
|
||||
{
|
||||
for (int i = 0; i < XUSER_MAX_COUNT; i++)
|
||||
{
|
||||
lastLightX[i] = 0;
|
||||
lastLightY[i] = 0;
|
||||
lastLightZ[i] = 0;
|
||||
lastLightX[i] = lastLightY[i] = lastLightZ[i] = 0;
|
||||
lightPlaced[i] = false;
|
||||
lastHeldItemId[i] = -1;
|
||||
}
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
if (player != nullptr && level != nullptr)
|
||||
{
|
||||
// Проверяем что держит игрок
|
||||
shared_ptr<ItemInstance> heldItem = nullptr;
|
||||
if (player->inventory->IsHeldItem())
|
||||
{
|
||||
heldItem = player->inventory->getSelected();
|
||||
}
|
||||
int heldItemId = (heldItem != nullptr) ? heldItem->getItem()->id : -1;
|
||||
|
||||
bool holdingTorch = (heldItemId >= 0) // что-то держим
|
||||
&& (heldItemId < 256) // это тайл, не предмет
|
||||
&& (Tile::tiles[heldItemId] != nullptr) // тайл существует
|
||||
&& (Tile::lightEmission[heldItemId] > 0); // он светится
|
||||
bool holdingLight = (heldItemId >= 0)
|
||||
&& (heldItemId < 256)
|
||||
&& (Tile::tiles[heldItemId] != nullptr)
|
||||
&& (Tile::lightEmission[heldItemId] > 0);
|
||||
|
||||
// Предмет в руке сменился — убираем старый блок света
|
||||
bool itemChanged = (heldItemId != lastHeldItemId[iPad]);
|
||||
if (itemChanged && lightPlaced[iPad])
|
||||
{
|
||||
int ox = lastLightX[iPad], oy = lastLightY[iPad], oz = lastLightZ[iPad];
|
||||
if (level->getTile(ox, oy, oz) == Tile::lightSourceBlock_Id)
|
||||
level->setTileAndData(ox, oy, oz, 0, 0, Tile::UPDATE_CLIENTS);
|
||||
lightPlaced[iPad] = false;
|
||||
}
|
||||
lastHeldItemId[iPad] = heldItemId;
|
||||
|
||||
// Текущая позиция игрока (целочисленная)
|
||||
int curX = Mth::floor(player->x);
|
||||
int curY = Mth::floor(player->y);
|
||||
int curZ = Mth::floor(player->z);
|
||||
|
||||
if (holdingTorch)
|
||||
if (holdingLight)
|
||||
{
|
||||
bool positionChanged =
|
||||
(curX != lastLightX[iPad]) ||
|
||||
// Игрок переместился — убираем старый блок
|
||||
bool positionChanged = (curX != lastLightX[iPad]) ||
|
||||
(curY != lastLightY[iPad]) ||
|
||||
(curZ != lastLightZ[iPad]);
|
||||
|
||||
// Удаляем старый блок света если игрок переместился
|
||||
if (lightPlaced[iPad] && positionChanged)
|
||||
{
|
||||
int ox = lastLightX[iPad];
|
||||
int oy = lastLightY[iPad];
|
||||
int oz = lastLightZ[iPad];
|
||||
|
||||
int ox = lastLightX[iPad], oy = lastLightY[iPad], oz = lastLightZ[iPad];
|
||||
if (level->getTile(ox, oy, oz) == Tile::lightSourceBlock_Id)
|
||||
{
|
||||
level->setTileAndData(ox, oy, oz, 0, 0, Tile::UPDATE_CLIENTS);
|
||||
}
|
||||
lightPlaced[iPad] = false;
|
||||
}
|
||||
|
||||
// Ставим новый блок света если его ещё нет
|
||||
if (!lightPlaced[iPad])
|
||||
{
|
||||
// Ставим на позицию ног игрока только если клетка свободна
|
||||
if (level->isEmptyTile(curX, curY, curZ))
|
||||
{
|
||||
float emission = Tile::lightEmission[heldItemId];
|
||||
Tile::lightEmission[Tile::lightSourceBlock_Id] = emission;
|
||||
|
||||
level->setTileAndData(
|
||||
curX, curY, curZ,
|
||||
Tile::lightSourceBlock_Id, 0,
|
||||
Tile::UPDATE_CLIENTS
|
||||
);
|
||||
Tile::lightEmission[Tile::lightSourceBlock_Id] = Tile::lightEmission[heldItemId];
|
||||
level->setTileAndData(curX, curY, curZ,
|
||||
Tile::lightSourceBlock_Id, 0, Tile::UPDATE_CLIENTS);
|
||||
lastLightX[iPad] = curX;
|
||||
lastLightY[iPad] = curY;
|
||||
lastLightZ[iPad] = curZ;
|
||||
|
|
@ -2438,17 +2427,12 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures)
|
|||
}
|
||||
else
|
||||
{
|
||||
// Игрок убрал факел — удаляем блок света
|
||||
// Не держим светящийся блок — убираем свет
|
||||
if (lightPlaced[iPad])
|
||||
{
|
||||
int ox = lastLightX[iPad];
|
||||
int oy = lastLightY[iPad];
|
||||
int oz = lastLightZ[iPad];
|
||||
|
||||
int ox = lastLightX[iPad], oy = lastLightY[iPad], oz = lastLightZ[iPad];
|
||||
if (level->getTile(ox, oy, oz) == Tile::lightSourceBlock_Id)
|
||||
{
|
||||
level->setTileAndData(ox, oy, oz, 0, 0, Tile::UPDATE_CLIENTS);
|
||||
}
|
||||
lightPlaced[iPad] = false;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue