mirror of
https://github.com/celisej567/mcpe.git
synced 2026-01-04 14:09:47 +03:00
* macOS Support & Cleanup * Fix malformed comments in build-wasm.bat * Emscripten Fixes * * Add shebang to the grabsounds.py script Since it was changed from rw- to rwx, I'll add the shebang so that it actually runs properly. * * Re-add the patch_data and readme files. * * Remove sound data. * Fix some more things. * Think it's ready to pull now... --------- Co-authored-by: BrentDaMage <BrentDaMage@users.noreply.github.com> Co-authored-by: iProgramInCpp <iprogramincpp@gmail.com>
74 lines
2.2 KiB
C++
74 lines
2.2 KiB
C++
/********************************************************************
|
|
Minecraft: Pocket Edition - Decompilation Project
|
|
Copyright (C) 2023 iProgramInCpp
|
|
|
|
The following code is licensed under the BSD 1 clause license.
|
|
SPDX-License-Identifier: BSD-1-Clause
|
|
********************************************************************/
|
|
|
|
#include "DoorItem.hpp"
|
|
#include "world/level/Level.hpp"
|
|
#include "world/entity/Player.hpp"
|
|
#include "world/tile/Tile.hpp"
|
|
|
|
DoorItem::DoorItem(int id, Material* pMtl) : Item(id)
|
|
{
|
|
m_maxStackSize = 1;
|
|
m_maxDamage = 64;
|
|
m_pMaterial = pMtl;
|
|
}
|
|
|
|
bool DoorItem::useOn(ItemInstance* inst, Player* player, Level* level, int x, int y, int z, int dir)
|
|
{
|
|
if (dir != DIR_YPOS)
|
|
return false;
|
|
|
|
Tile* pTile = m_pMaterial == Material::wood ? Tile::door_wood : Tile::door_iron;
|
|
if (!pTile->mayPlace(level, x, y + 1, z))
|
|
return false;
|
|
|
|
int faceDir = Mth::floor((((player->m_yaw + 180.0f) * 4.0f) / 360.0f) - 0.5f) & 3;
|
|
int offsetX, offsetZ;
|
|
switch (faceDir)
|
|
{
|
|
case 0:
|
|
offsetX = 0;
|
|
offsetZ = 1;
|
|
break;
|
|
case 1:
|
|
offsetX = -1;
|
|
offsetZ = 0;
|
|
break;
|
|
case 2:
|
|
offsetX = 0;
|
|
offsetZ = -1;
|
|
break;
|
|
case 3:
|
|
default:
|
|
offsetX = 1;
|
|
offsetZ = 0;
|
|
break;
|
|
}
|
|
|
|
// For polish, make sure the hinge is attached to the "correct" block
|
|
int solid1 = level->isSolidTile(x - offsetX, y + 1, z - offsetZ);
|
|
int solid2 = level->isSolidTile(x - offsetX, y + 2, z - offsetZ);
|
|
int solid3 = level->isSolidTile(x + offsetX, y + 1, z + offsetZ);
|
|
int solid4 = level->isSolidTile(x + offsetX, y + 2, z + offsetZ);
|
|
int equal5 = level->getTile(x - offsetX, y + 1, z - offsetZ) == pTile->m_ID ||
|
|
level->getTile(x - offsetX, y + 2, z - offsetZ) == pTile->m_ID;
|
|
int equal6 = level->getTile(x + offsetX, y + 1, z + offsetZ) == pTile->m_ID ||
|
|
level->getTile(x + offsetX, y + 2, z + offsetZ) == pTile->m_ID;
|
|
|
|
if ((equal5 && !equal6) || solid2 + solid1 < solid4 + solid3)
|
|
faceDir = 4 + ((faceDir - 1) & 3);
|
|
|
|
// congratulations! You can now have a door.
|
|
level->setTile(x, y + 1, z, pTile->m_ID);
|
|
level->setData(x, y + 1, z, faceDir);
|
|
level->setTile(x, y + 2, z, pTile->m_ID);
|
|
level->setData(x, y + 2, z, faceDir + 8);
|
|
inst->m_amount--;
|
|
return true;
|
|
}
|