commit
e7b8e17746
@ -93,6 +93,7 @@ public:
|
||||
// Check if it's fuel:
|
||||
BLOCKTYPE BlockType;
|
||||
if (
|
||||
((a_RelY + y < 0) || (a_RelY + y > cChunkDef::Height)) ||
|
||||
!a_Chunk.UnboundedRelGetBlockType(a_RelX + x, a_RelY + y, a_RelZ + z, BlockType) ||
|
||||
!cFireSimulator::IsFuel(BlockType)
|
||||
)
|
||||
@ -119,6 +120,7 @@ public:
|
||||
for (size_t i = 0; i < ARRAYCOUNT(CrossCoords); i++)
|
||||
{
|
||||
if (
|
||||
((RelY + CrossCoords[i].y >= 0) && (RelY + CrossCoords[i].y <= cChunkDef::Height)) &&
|
||||
a_Chunk.UnboundedRelGetBlockType(RelX + CrossCoords[i].x, RelY + CrossCoords[i].y, RelZ + CrossCoords[i].z, BlockType) &&
|
||||
(BlockType == E_BLOCK_AIR)
|
||||
)
|
||||
|
@ -11,6 +11,7 @@
|
||||
|
||||
#include "BlockHandler.h"
|
||||
#include "../Items/ItemHandler.h"
|
||||
#include "Root.h"
|
||||
|
||||
|
||||
|
||||
@ -38,41 +39,9 @@ public:
|
||||
) override
|
||||
{
|
||||
a_BlockType = m_BlockType;
|
||||
BLOCKTYPE Type = (BLOCKTYPE) (a_Player->GetEquippedItem().m_ItemType);
|
||||
NIBBLETYPE Meta = (NIBBLETYPE) a_Player->GetEquippedItem().m_ItemDamage;
|
||||
|
||||
// HandlePlaceBlock wants a cItemHandler pointer thing, so let's give it one
|
||||
cItemHandler * ItemHandler = cItemHandler::GetItemHandler(GetDoubleSlabType(Type));
|
||||
|
||||
// Check if the block at the coordinates is a slab. Eligibility for combining has already been processed in ClientHandle
|
||||
if (IsAnySlabType(a_ChunkInterface.GetBlock(a_BlockX, a_BlockY, a_BlockZ)))
|
||||
{
|
||||
// Call the function in ClientHandle that places a block when the client sends the packet,
|
||||
// so that plugins may interfere with the placement.
|
||||
|
||||
if ((a_BlockFace == BLOCK_FACE_TOP) || (a_BlockFace == BLOCK_FACE_BOTTOM))
|
||||
{
|
||||
// Top and bottom faces need no parameter modification
|
||||
a_Player->GetClientHandle()->HandlePlaceBlock(a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ, *ItemHandler);
|
||||
}
|
||||
else
|
||||
{
|
||||
// The other faces need to distinguish between top and bottom cursor positions
|
||||
if (a_CursorY > 7)
|
||||
{
|
||||
// Edit the call to use BLOCK_FACE_BOTTOM, otherwise it places incorrectly
|
||||
a_Player->GetClientHandle()->HandlePlaceBlock(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_TOP, a_CursorX, a_CursorY, a_CursorZ, *ItemHandler);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Edit the call to use BLOCK_FACE_TOP, otherwise it places incorrectly
|
||||
a_Player->GetClientHandle()->HandlePlaceBlock(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_BOTTOM, a_CursorX, a_CursorY, a_CursorZ, *ItemHandler);
|
||||
}
|
||||
}
|
||||
return false; // Cancel the event, because dblslabs were already placed, nothing else needed
|
||||
}
|
||||
|
||||
// Place the single-slab with correct metas:
|
||||
// Set the correct metadata based on player equipped item (i.e. a_BlockMeta not initialised yet)
|
||||
switch (a_BlockFace)
|
||||
{
|
||||
case BLOCK_FACE_TOP:
|
||||
@ -105,6 +74,14 @@ public:
|
||||
}
|
||||
case BLOCK_FACE_NONE: return false;
|
||||
} // switch (a_BlockFace)
|
||||
|
||||
// Check if the block at the coordinates is a single slab. Eligibility for combining has already been processed in ClientHandle
|
||||
// Changed to-be-placed to a double slab if we are clicking on a single slab, as opposed to placing one for the first time
|
||||
if (IsAnySlabType(a_ChunkInterface.GetBlock(a_BlockX, a_BlockY, a_BlockZ)))
|
||||
{
|
||||
a_BlockType = GetDoubleSlabType(m_BlockType);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1064,7 +1064,7 @@ void cClientHandle::HandlePlaceBlock(int a_BlockX, int a_BlockY, int a_BlockZ, e
|
||||
// If clicked top face and slab occupies the top voxel, we want a slab to be placed above it (therefore increment Y)
|
||||
// Else if clicked bottom face and slab occupies the bottom voxel, decrement Y for the same reason
|
||||
// Don't touch coordinates if anything else because a dblslab opportunity is present
|
||||
if((ClickedBlockMeta & 0x08) && (a_BlockFace == BLOCK_FACE_TOP))
|
||||
if ((ClickedBlockMeta & 0x08) && (a_BlockFace == BLOCK_FACE_TOP))
|
||||
{
|
||||
++a_BlockY;
|
||||
}
|
||||
|
@ -230,10 +230,10 @@ public:
|
||||
/** Called when the player moves into a different world; queues sreaming the new chunks */
|
||||
void MoveToWorld(cWorld & a_World, bool a_SendRespawnPacket);
|
||||
|
||||
private:
|
||||
|
||||
/** Handles the block placing packet when it is a real block placement (not block-using, item-using or eating) */
|
||||
void HandlePlaceBlock(int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ, cItemHandler & a_ItemHandler);
|
||||
|
||||
private:
|
||||
|
||||
/** The type used for storing the names of registered plugin channels. */
|
||||
typedef std::set<AString> cChannels;
|
||||
|
@ -129,6 +129,11 @@ bool cMobSpawner::CanSpawnHere(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_R
|
||||
BLOCKTYPE TargetBlock = E_BLOCK_AIR;
|
||||
if (m_AllowedTypes.find(a_MobType) != m_AllowedTypes.end() && a_Chunk->UnboundedRelGetBlockType(a_RelX, a_RelY, a_RelZ, TargetBlock))
|
||||
{
|
||||
if ((a_RelY + 1 > cChunkDef::Height) || (a_RelY - 1 < 0))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
NIBBLETYPE BlockLight = a_Chunk->GetBlockLight(a_RelX, a_RelY, a_RelZ);
|
||||
NIBBLETYPE SkyLight = a_Chunk->GetSkyLight(a_RelX, a_RelY, a_RelZ);
|
||||
BLOCKTYPE BlockAbove = a_Chunk->GetBlock(a_RelX, a_RelY + 1, a_RelZ);
|
||||
@ -200,7 +205,7 @@ bool cMobSpawner::CanSpawnHere(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_R
|
||||
case cMonster::mtSpider:
|
||||
{
|
||||
bool CanSpawn = true;
|
||||
bool HaveFloor = false;
|
||||
bool HasFloor = false;
|
||||
for (int x = 0; x < 2; ++x)
|
||||
{
|
||||
for(int z = 0; z < 2; ++z)
|
||||
@ -211,8 +216,8 @@ bool cMobSpawner::CanSpawnHere(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_R
|
||||
{
|
||||
return false;
|
||||
}
|
||||
HaveFloor = (
|
||||
HaveFloor ||
|
||||
HasFloor = (
|
||||
HasFloor ||
|
||||
(
|
||||
a_Chunk->UnboundedRelGetBlockType(a_RelX + x, a_RelY - 1, a_RelZ + z, TargetBlock) &&
|
||||
!cBlockInfo::IsTransparent(TargetBlock)
|
||||
@ -220,7 +225,7 @@ bool cMobSpawner::CanSpawnHere(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_R
|
||||
);
|
||||
}
|
||||
}
|
||||
return CanSpawn && HaveFloor && (SkyLight <= 7) && (BlockLight <= 7);
|
||||
return CanSpawn && HasFloor && (SkyLight <= 7) && (BlockLight <= 7);
|
||||
}
|
||||
|
||||
case cMonster::mtCreeper:
|
||||
|
@ -111,9 +111,9 @@ void cMonster::SpawnOn(cClientHandle & a_Client)
|
||||
|
||||
void cMonster::TickPathFinding()
|
||||
{
|
||||
int PosX = (int)floor(GetPosX());
|
||||
int PosY = (int)floor(GetPosY());
|
||||
int PosZ = (int)floor(GetPosZ());
|
||||
const int PosX = (int)floor(GetPosX());
|
||||
const int PosY = (int)floor(GetPosY());
|
||||
const int PosZ = (int)floor(GetPosZ());
|
||||
|
||||
m_FinalDestination.y = (double)FindFirstNonAirBlockPosition(m_FinalDestination.x, m_FinalDestination.z);
|
||||
|
||||
@ -130,14 +130,16 @@ void cMonster::TickPathFinding()
|
||||
{ 0, 1},
|
||||
{ 0,-1},
|
||||
} ;
|
||||
|
||||
if ((PosY - 1 < 0) || (PosY + 2 > cChunkDef::Height) /* PosY + 1 will never be true if PosY + 2 is not */)
|
||||
{
|
||||
// Too low/high, can't really do anything
|
||||
FinishPathFinding();
|
||||
return;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < ARRAYCOUNT(gCrossCoords); i++)
|
||||
{
|
||||
if ((gCrossCoords[i].x + PosX == PosX) && (gCrossCoords[i].z + PosZ == PosZ))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (IsCoordinateInTraversedList(Vector3i(gCrossCoords[i].x + PosX, PosY, gCrossCoords[i].z + PosZ)))
|
||||
{
|
||||
continue;
|
||||
|
Loading…
Reference in New Issue
Block a user