parent
de543ff73f
commit
61cb08b546
@ -101,6 +101,8 @@ void cBlockInfo::Initialize(cBlockInfoArray & a_Info)
|
|||||||
a_Info[E_BLOCK_NEW_LEAVES ].m_SpreadLightFalloff = 1;
|
a_Info[E_BLOCK_NEW_LEAVES ].m_SpreadLightFalloff = 1;
|
||||||
a_Info[E_BLOCK_SIGN_POST ].m_SpreadLightFalloff = 1;
|
a_Info[E_BLOCK_SIGN_POST ].m_SpreadLightFalloff = 1;
|
||||||
a_Info[E_BLOCK_TORCH ].m_SpreadLightFalloff = 1;
|
a_Info[E_BLOCK_TORCH ].m_SpreadLightFalloff = 1;
|
||||||
|
a_Info[E_BLOCK_TRIPWIRE ].m_SpreadLightFalloff = 1;
|
||||||
|
a_Info[E_BLOCK_TRIPWIRE_HOOK ].m_SpreadLightFalloff = 1;
|
||||||
a_Info[E_BLOCK_VINES ].m_SpreadLightFalloff = 1;
|
a_Info[E_BLOCK_VINES ].m_SpreadLightFalloff = 1;
|
||||||
a_Info[E_BLOCK_WALLSIGN ].m_SpreadLightFalloff = 1;
|
a_Info[E_BLOCK_WALLSIGN ].m_SpreadLightFalloff = 1;
|
||||||
a_Info[E_BLOCK_WOODEN_DOOR ].m_SpreadLightFalloff = 1;
|
a_Info[E_BLOCK_WOODEN_DOOR ].m_SpreadLightFalloff = 1;
|
||||||
@ -160,6 +162,8 @@ void cBlockInfo::Initialize(cBlockInfoArray & a_Info)
|
|||||||
a_Info[E_BLOCK_STATIONARY_WATER ].m_Transparent = true;
|
a_Info[E_BLOCK_STATIONARY_WATER ].m_Transparent = true;
|
||||||
a_Info[E_BLOCK_STONE_BUTTON ].m_Transparent = true;
|
a_Info[E_BLOCK_STONE_BUTTON ].m_Transparent = true;
|
||||||
a_Info[E_BLOCK_STONE_PRESSURE_PLATE].m_Transparent = true;
|
a_Info[E_BLOCK_STONE_PRESSURE_PLATE].m_Transparent = true;
|
||||||
|
a_Info[E_BLOCK_TRIPWIRE ].m_Transparent = true;
|
||||||
|
a_Info[E_BLOCK_TRIPWIRE_HOOK ].m_Transparent = true;
|
||||||
a_Info[E_BLOCK_TALL_GRASS ].m_Transparent = true;
|
a_Info[E_BLOCK_TALL_GRASS ].m_Transparent = true;
|
||||||
a_Info[E_BLOCK_TORCH ].m_Transparent = true;
|
a_Info[E_BLOCK_TORCH ].m_Transparent = true;
|
||||||
a_Info[E_BLOCK_VINES ].m_Transparent = true;
|
a_Info[E_BLOCK_VINES ].m_Transparent = true;
|
||||||
@ -197,6 +201,7 @@ void cBlockInfo::Initialize(cBlockInfoArray & a_Info)
|
|||||||
a_Info[E_BLOCK_TNT ].m_OneHitDig = true;
|
a_Info[E_BLOCK_TNT ].m_OneHitDig = true;
|
||||||
a_Info[E_BLOCK_TALL_GRASS ].m_OneHitDig = true;
|
a_Info[E_BLOCK_TALL_GRASS ].m_OneHitDig = true;
|
||||||
a_Info[E_BLOCK_TORCH ].m_OneHitDig = true;
|
a_Info[E_BLOCK_TORCH ].m_OneHitDig = true;
|
||||||
|
a_Info[E_BLOCK_TRIPWIRE ].m_OneHitDig = true;
|
||||||
|
|
||||||
|
|
||||||
// Blocks that break when pushed by piston:
|
// Blocks that break when pushed by piston:
|
||||||
@ -239,6 +244,8 @@ void cBlockInfo::Initialize(cBlockInfoArray & a_Info)
|
|||||||
a_Info[E_BLOCK_STONE_PRESSURE_PLATE].m_PistonBreakable = true;
|
a_Info[E_BLOCK_STONE_PRESSURE_PLATE].m_PistonBreakable = true;
|
||||||
a_Info[E_BLOCK_TALL_GRASS ].m_PistonBreakable = true;
|
a_Info[E_BLOCK_TALL_GRASS ].m_PistonBreakable = true;
|
||||||
a_Info[E_BLOCK_TORCH ].m_PistonBreakable = true;
|
a_Info[E_BLOCK_TORCH ].m_PistonBreakable = true;
|
||||||
|
a_Info[E_BLOCK_TRIPWIRE ].m_PistonBreakable = true;
|
||||||
|
a_Info[E_BLOCK_TRIPWIRE_HOOK ].m_PistonBreakable = true;
|
||||||
a_Info[E_BLOCK_VINES ].m_PistonBreakable = true;
|
a_Info[E_BLOCK_VINES ].m_PistonBreakable = true;
|
||||||
a_Info[E_BLOCK_WATER ].m_PistonBreakable = true;
|
a_Info[E_BLOCK_WATER ].m_PistonBreakable = true;
|
||||||
a_Info[E_BLOCK_WOODEN_BUTTON ].m_PistonBreakable = true;
|
a_Info[E_BLOCK_WOODEN_BUTTON ].m_PistonBreakable = true;
|
||||||
@ -280,6 +287,8 @@ void cBlockInfo::Initialize(cBlockInfoArray & a_Info)
|
|||||||
a_Info[E_BLOCK_TALL_GRASS ].m_IsSnowable = false;
|
a_Info[E_BLOCK_TALL_GRASS ].m_IsSnowable = false;
|
||||||
a_Info[E_BLOCK_TNT ].m_IsSnowable = false;
|
a_Info[E_BLOCK_TNT ].m_IsSnowable = false;
|
||||||
a_Info[E_BLOCK_TORCH ].m_IsSnowable = false;
|
a_Info[E_BLOCK_TORCH ].m_IsSnowable = false;
|
||||||
|
a_Info[E_BLOCK_TRIPWIRE ].m_IsSnowable = false;
|
||||||
|
a_Info[E_BLOCK_TRIPWIRE_HOOK ].m_IsSnowable = false;
|
||||||
a_Info[E_BLOCK_VINES ].m_IsSnowable = false;
|
a_Info[E_BLOCK_VINES ].m_IsSnowable = false;
|
||||||
a_Info[E_BLOCK_WALLSIGN ].m_IsSnowable = false;
|
a_Info[E_BLOCK_WALLSIGN ].m_IsSnowable = false;
|
||||||
a_Info[E_BLOCK_WATER ].m_IsSnowable = false;
|
a_Info[E_BLOCK_WATER ].m_IsSnowable = false;
|
||||||
|
@ -65,6 +65,8 @@
|
|||||||
#include "BlockRedstoneRepeater.h"
|
#include "BlockRedstoneRepeater.h"
|
||||||
#include "BlockRedstoneTorch.h"
|
#include "BlockRedstoneTorch.h"
|
||||||
#include "BlockTNT.h"
|
#include "BlockTNT.h"
|
||||||
|
#include "BlockTripwire.h"
|
||||||
|
#include "BlockTripwireHook.h"
|
||||||
#include "BlockSand.h"
|
#include "BlockSand.h"
|
||||||
#include "BlockSapling.h"
|
#include "BlockSapling.h"
|
||||||
#include "BlockSideways.h"
|
#include "BlockSideways.h"
|
||||||
@ -291,6 +293,8 @@ cBlockHandler * cBlockHandler::CreateBlockHandler(BLOCKTYPE a_BlockType)
|
|||||||
case E_BLOCK_TORCH: return new cBlockTorchHandler (a_BlockType);
|
case E_BLOCK_TORCH: return new cBlockTorchHandler (a_BlockType);
|
||||||
case E_BLOCK_TRAPDOOR: return new cBlockTrapdoorHandler (a_BlockType);
|
case E_BLOCK_TRAPDOOR: return new cBlockTrapdoorHandler (a_BlockType);
|
||||||
case E_BLOCK_TNT: return new cBlockTNTHandler (a_BlockType);
|
case E_BLOCK_TNT: return new cBlockTNTHandler (a_BlockType);
|
||||||
|
case E_BLOCK_TRIPWIRE: return new cBlockTripwireHandler (a_BlockType);
|
||||||
|
case E_BLOCK_TRIPWIRE_HOOK: return new cBlockTripwireHookHandler (a_BlockType);
|
||||||
case E_BLOCK_VINES: return new cBlockVineHandler (a_BlockType);
|
case E_BLOCK_VINES: return new cBlockVineHandler (a_BlockType);
|
||||||
case E_BLOCK_WALLSIGN: return new cBlockSignHandler (a_BlockType); // TODO: This needs a special handler
|
case E_BLOCK_WALLSIGN: return new cBlockSignHandler (a_BlockType); // TODO: This needs a special handler
|
||||||
case E_BLOCK_WATER: return new cBlockFluidHandler (a_BlockType);
|
case E_BLOCK_WATER: return new cBlockFluidHandler (a_BlockType);
|
||||||
|
@ -2,8 +2,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "BlockHandler.h"
|
#include "BlockHandler.h"
|
||||||
#include "../MersenneTwister.h"
|
|
||||||
#include "../World.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
32
src/Blocks/BlockTripwire.h
Normal file
32
src/Blocks/BlockTripwire.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "BlockHandler.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class cBlockTripwireHandler :
|
||||||
|
public cBlockHandler
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
cBlockTripwireHandler(BLOCKTYPE a_BlockType)
|
||||||
|
: cBlockHandler(a_BlockType)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void ConvertToPickups(cItems & a_Pickups, NIBBLETYPE a_BlockMeta) override
|
||||||
|
{
|
||||||
|
a_Pickups.push_back(cItem(E_ITEM_STRING, 1, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual const char * GetStepSound(void) override
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
82
src/Blocks/BlockTripwireHook.h
Normal file
82
src/Blocks/BlockTripwireHook.h
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "BlockHandler.h"
|
||||||
|
#include "MetaRotator.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class cBlockTripwireHookHandler :
|
||||||
|
public cMetaRotator<cBlockHandler, 0x03, 0x02, 0x03, 0x00, 0x01>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
cBlockTripwireHookHandler(BLOCKTYPE a_BlockType)
|
||||||
|
: cMetaRotator<cBlockHandler, 0x03, 0x02, 0x03, 0x00, 0x01>(a_BlockType)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool GetPlacementBlockTypeMeta(
|
||||||
|
cChunkInterface & a_ChunkInterface, cPlayer * a_Player,
|
||||||
|
int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace,
|
||||||
|
int a_CursorX, int a_CursorY, int a_CursorZ,
|
||||||
|
BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta
|
||||||
|
) override
|
||||||
|
{
|
||||||
|
a_BlockType = m_BlockType;
|
||||||
|
|
||||||
|
a_BlockMeta = DirectionToMetadata(a_BlockFace);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline static NIBBLETYPE DirectionToMetadata(eBlockFace a_Direction)
|
||||||
|
{
|
||||||
|
switch (a_Direction)
|
||||||
|
{
|
||||||
|
case BLOCK_FACE_XM: return 0x1;
|
||||||
|
case BLOCK_FACE_XP: return 0x3;
|
||||||
|
case BLOCK_FACE_ZM: return 0x2;
|
||||||
|
case BLOCK_FACE_ZP: return 0x0;
|
||||||
|
default: ASSERT(!"Unhandled tripwire hook direction!"); return 0x0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline static eBlockFace MetadataToDirection(NIBBLETYPE a_Meta)
|
||||||
|
{
|
||||||
|
switch (a_Meta & 0x03)
|
||||||
|
{
|
||||||
|
case 0x1: return BLOCK_FACE_XM;
|
||||||
|
case 0x3: return BLOCK_FACE_XP;
|
||||||
|
case 0x2: return BLOCK_FACE_ZM;
|
||||||
|
case 0x0: return BLOCK_FACE_ZP;
|
||||||
|
default: ASSERT(!"Unhandled tripwire hook metadata!"); return BLOCK_FACE_NONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void ConvertToPickups(cItems & a_Pickups, NIBBLETYPE a_BlockMeta) override
|
||||||
|
{
|
||||||
|
// Reset meta to 0
|
||||||
|
a_Pickups.push_back(cItem(E_BLOCK_TRIPWIRE_HOOK, 1, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool CanBeAt(cChunkInterface & a_ChunkInterface, int a_RelX, int a_RelY, int a_RelZ, const cChunk & a_Chunk) override
|
||||||
|
{
|
||||||
|
NIBBLETYPE Meta;
|
||||||
|
a_Chunk.UnboundedRelGetBlockMeta(a_RelX, a_RelY, a_RelZ, Meta);
|
||||||
|
|
||||||
|
AddFaceDirection(a_RelX, a_RelY, a_RelZ, MetadataToDirection(Meta), true);
|
||||||
|
BLOCKTYPE BlockIsOn; a_Chunk.UnboundedRelGetBlockType(a_RelX, a_RelY, a_RelZ, BlockIsOn);
|
||||||
|
|
||||||
|
return (a_RelY > 0) && cBlockInfo::FullyOccupiesVoxel(BlockIsOn);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual const char * GetStepSound(void) override
|
||||||
|
{
|
||||||
|
return "step.wood";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -44,6 +44,7 @@
|
|||||||
#include "ItemSign.h"
|
#include "ItemSign.h"
|
||||||
#include "ItemMobHead.h"
|
#include "ItemMobHead.h"
|
||||||
#include "ItemSpawnEgg.h"
|
#include "ItemSpawnEgg.h"
|
||||||
|
#include "ItemString.h"
|
||||||
#include "ItemSugarcane.h"
|
#include "ItemSugarcane.h"
|
||||||
#include "ItemSword.h"
|
#include "ItemSword.h"
|
||||||
|
|
||||||
@ -129,6 +130,7 @@ cItemHandler *cItemHandler::CreateItemHandler(int a_ItemType)
|
|||||||
case E_ITEM_HEAD: return new cItemMobHeadHandler(a_ItemType);
|
case E_ITEM_HEAD: return new cItemMobHeadHandler(a_ItemType);
|
||||||
case E_ITEM_SNOWBALL: return new cItemSnowballHandler();
|
case E_ITEM_SNOWBALL: return new cItemSnowballHandler();
|
||||||
case E_ITEM_SPAWN_EGG: return new cItemSpawnEggHandler(a_ItemType);
|
case E_ITEM_SPAWN_EGG: return new cItemSpawnEggHandler(a_ItemType);
|
||||||
|
case E_ITEM_STRING: return new cItemStringHandler(a_ItemType);
|
||||||
case E_ITEM_SUGARCANE: return new cItemSugarcaneHandler(a_ItemType);
|
case E_ITEM_SUGARCANE: return new cItemSugarcaneHandler(a_ItemType);
|
||||||
|
|
||||||
case E_ITEM_WOODEN_HOE:
|
case E_ITEM_WOODEN_HOE:
|
||||||
|
39
src/Items/ItemString.h
Normal file
39
src/Items/ItemString.h
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "ItemHandler.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class cItemStringHandler :
|
||||||
|
public cItemHandler
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
cItemStringHandler(int a_ItemType) :
|
||||||
|
cItemHandler(a_ItemType)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool IsPlaceable(void) override
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool GetPlacementBlockTypeMeta(
|
||||||
|
cWorld * a_World, cPlayer * a_Player,
|
||||||
|
int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace,
|
||||||
|
int a_CursorX, int a_CursorY, int a_CursorZ,
|
||||||
|
BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta
|
||||||
|
) override
|
||||||
|
{
|
||||||
|
a_BlockType = E_BLOCK_TRIPWIRE;
|
||||||
|
a_BlockMeta = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
|||||||
#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
|
#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
|
||||||
|
|
||||||
#include "IncrementalRedstoneSimulator.h"
|
#include "IncrementalRedstoneSimulator.h"
|
||||||
|
#include "BoundingBox.h"
|
||||||
#include "../BlockEntities/DropSpenserEntity.h"
|
#include "../BlockEntities/DropSpenserEntity.h"
|
||||||
#include "../BlockEntities/NoteEntity.h"
|
#include "../BlockEntities/NoteEntity.h"
|
||||||
#include "../BlockEntities/CommandBlockEntity.h"
|
#include "../BlockEntities/CommandBlockEntity.h"
|
||||||
@ -12,10 +13,13 @@
|
|||||||
#include "../Blocks/BlockButton.h"
|
#include "../Blocks/BlockButton.h"
|
||||||
#include "../Blocks/BlockLever.h"
|
#include "../Blocks/BlockLever.h"
|
||||||
#include "../Blocks/BlockPiston.h"
|
#include "../Blocks/BlockPiston.h"
|
||||||
|
#include "../Blocks/BlockTripwireHook.h"
|
||||||
|
|
||||||
|
#define WAKE_SIMULATOR_IF_DIRTY(a_Chunk, a_BlockX, a_BlockY, a_BlockZ) if (a_Chunk->IsRedstoneDirty()) WakeUp(a_BlockX, a_BlockY, a_BlockZ, a_Chunk);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
cIncrementalRedstoneSimulator::cIncrementalRedstoneSimulator(cWorld & a_World) :
|
cIncrementalRedstoneSimulator::cIncrementalRedstoneSimulator(cWorld & a_World) :
|
||||||
super(a_World),
|
super(a_World),
|
||||||
@ -99,10 +103,11 @@ void cIncrementalRedstoneSimulator::RedstoneAddBlock(int a_BlockX, int a_BlockY,
|
|||||||
// Changeable sources
|
// Changeable sources
|
||||||
((Block == E_BLOCK_REDSTONE_WIRE) && (Meta == 0)) ||
|
((Block == E_BLOCK_REDSTONE_WIRE) && (Meta == 0)) ||
|
||||||
((Block == E_BLOCK_LEVER) && !IsLeverOn(Meta)) ||
|
((Block == E_BLOCK_LEVER) && !IsLeverOn(Meta)) ||
|
||||||
((Block == E_BLOCK_DETECTOR_RAIL) && (Meta & 0x08) == 0) ||
|
((Block == E_BLOCK_DETECTOR_RAIL) && ((Meta & 0x08) == 0)) ||
|
||||||
(((Block == E_BLOCK_STONE_BUTTON) || (Block == E_BLOCK_WOODEN_BUTTON)) && (!IsButtonOn(Meta))) ||
|
(((Block == E_BLOCK_STONE_BUTTON) || (Block == E_BLOCK_WOODEN_BUTTON)) && (!IsButtonOn(Meta))) ||
|
||||||
(((Block == E_BLOCK_STONE_PRESSURE_PLATE) || (Block == E_BLOCK_WOODEN_PRESSURE_PLATE)) && (Meta == 0)) ||
|
(((Block == E_BLOCK_STONE_PRESSURE_PLATE) || (Block == E_BLOCK_WOODEN_PRESSURE_PLATE)) && (Meta == 0)) ||
|
||||||
(((Block == E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE) || (Block == E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE)) && (Meta == 0))
|
(((Block == E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE) || (Block == E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE)) && (Meta == 0)) ||
|
||||||
|
((Block == E_BLOCK_TRIPWIRE_HOOK) && ((Meta & 0x08) == 0))
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
LOGD("cIncrementalRedstoneSimulator: Erased block @ {%i, %i, %i} from powered blocks list due to present/past metadata mismatch", itr->a_BlockPos.x, itr->a_BlockPos.y, itr->a_BlockPos.z);
|
LOGD("cIncrementalRedstoneSimulator: Erased block @ {%i, %i, %i} from powered blocks list due to present/past metadata mismatch", itr->a_BlockPos.x, itr->a_BlockPos.y, itr->a_BlockPos.z);
|
||||||
@ -289,6 +294,9 @@ void cIncrementalRedstoneSimulator::SimulateChunk(float a_Dt, int a_ChunkX, int
|
|||||||
switch (dataitr->Data)
|
switch (dataitr->Data)
|
||||||
{
|
{
|
||||||
case E_BLOCK_DAYLIGHT_SENSOR: HandleDaylightSensor(dataitr->x, dataitr->y, dataitr->z); break;
|
case E_BLOCK_DAYLIGHT_SENSOR: HandleDaylightSensor(dataitr->x, dataitr->y, dataitr->z); break;
|
||||||
|
case E_BLOCK_TRIPWIRE: HandleTripwire(dataitr->x, dataitr->y, dataitr->z); break;
|
||||||
|
case E_BLOCK_TRIPWIRE_HOOK: HandleTripwireHook(dataitr->x, dataitr->y, dataitr->z); break;
|
||||||
|
|
||||||
case E_BLOCK_WOODEN_PRESSURE_PLATE:
|
case E_BLOCK_WOODEN_PRESSURE_PLATE:
|
||||||
case E_BLOCK_STONE_PRESSURE_PLATE:
|
case E_BLOCK_STONE_PRESSURE_PLATE:
|
||||||
case E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE:
|
case E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE:
|
||||||
@ -1120,7 +1128,7 @@ void cIncrementalRedstoneSimulator::HandlePressurePlate(int a_RelBlockX, int a_R
|
|||||||
case E_BLOCK_STONE_PRESSURE_PLATE:
|
case E_BLOCK_STONE_PRESSURE_PLATE:
|
||||||
{
|
{
|
||||||
// MCS feature - stone pressure plates can only be triggered by players :D
|
// MCS feature - stone pressure plates can only be triggered by players :D
|
||||||
cPlayer * a_Player = m_World.FindClosestPlayer(Vector3f(BlockX + 0.5f, (float)a_RelBlockY, BlockZ + 0.5f), 0.7f, false);
|
cPlayer * a_Player = m_World.FindClosestPlayer(Vector3f(BlockX + 0.5f, (float)a_RelBlockY, BlockZ + 0.5f), 0.5f, false);
|
||||||
|
|
||||||
if (a_Player != NULL)
|
if (a_Player != NULL)
|
||||||
{
|
{
|
||||||
@ -1131,7 +1139,7 @@ void cIncrementalRedstoneSimulator::HandlePressurePlate(int a_RelBlockX, int a_R
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_Chunk->SetMeta(a_RelBlockX, a_RelBlockY, a_RelBlockZ, 0x0);
|
m_Chunk->SetMeta(a_RelBlockX, a_RelBlockY, a_RelBlockZ, 0x0);
|
||||||
m_World.WakeUpSimulators(BlockX, a_RelBlockY, BlockZ);
|
WAKE_SIMULATOR_IF_DIRTY(m_Chunk, BlockX, a_RelBlockY, BlockZ);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1155,7 +1163,7 @@ void cIncrementalRedstoneSimulator::HandlePressurePlate(int a_RelBlockX, int a_R
|
|||||||
Vector3f BlockPos(m_X + 0.5f, (float)m_Y, m_Z + 0.5f);
|
Vector3f BlockPos(m_X + 0.5f, (float)m_Y, m_Z + 0.5f);
|
||||||
double Distance = (EntityPos - BlockPos).Length();
|
double Distance = (EntityPos - BlockPos).Length();
|
||||||
|
|
||||||
if (Distance <= 0.7)
|
if (Distance <= 0.5)
|
||||||
{
|
{
|
||||||
m_NumberOfEntities++;
|
m_NumberOfEntities++;
|
||||||
}
|
}
|
||||||
@ -1177,7 +1185,7 @@ void cIncrementalRedstoneSimulator::HandlePressurePlate(int a_RelBlockX, int a_R
|
|||||||
};
|
};
|
||||||
|
|
||||||
cPressurePlateCallback PressurePlateCallback(BlockX, a_RelBlockY, BlockZ);
|
cPressurePlateCallback PressurePlateCallback(BlockX, a_RelBlockY, BlockZ);
|
||||||
m_World.ForEachEntity(PressurePlateCallback);
|
m_World.ForEachEntityInChunk(m_Chunk->GetPosX(), m_Chunk->GetPosZ(), PressurePlateCallback);
|
||||||
|
|
||||||
unsigned char Power;
|
unsigned char Power;
|
||||||
NIBBLETYPE Meta = m_Chunk->GetMeta(a_RelBlockX, a_RelBlockY, a_RelBlockZ);
|
NIBBLETYPE Meta = m_Chunk->GetMeta(a_RelBlockX, a_RelBlockY, a_RelBlockZ);
|
||||||
@ -1198,7 +1206,7 @@ void cIncrementalRedstoneSimulator::HandlePressurePlate(int a_RelBlockX, int a_R
|
|||||||
m_Chunk->BroadcastSoundEffect("random.click", (int)((BlockX + 0.5) * 8.0), (int)((a_RelBlockY + 0.1) * 8.0), (int)((BlockZ + 0.5) * 8.0), 0.3F, 0.6F);
|
m_Chunk->BroadcastSoundEffect("random.click", (int)((BlockX + 0.5) * 8.0), (int)((a_RelBlockY + 0.1) * 8.0), (int)((BlockZ + 0.5) * 8.0), 0.3F, 0.6F);
|
||||||
}
|
}
|
||||||
m_Chunk->SetMeta(a_RelBlockX, a_RelBlockY, a_RelBlockZ, E_META_PRESSURE_PLATE_RAISED);
|
m_Chunk->SetMeta(a_RelBlockX, a_RelBlockY, a_RelBlockZ, E_META_PRESSURE_PLATE_RAISED);
|
||||||
m_World.WakeUpSimulators(BlockX, a_RelBlockY, BlockZ);
|
WAKE_SIMULATOR_IF_DIRTY(m_Chunk, BlockX, a_RelBlockY, BlockZ);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@ -1223,7 +1231,7 @@ void cIncrementalRedstoneSimulator::HandlePressurePlate(int a_RelBlockX, int a_R
|
|||||||
Vector3f BlockPos(m_X + 0.5f, (float)m_Y, m_Z + 0.5f);
|
Vector3f BlockPos(m_X + 0.5f, (float)m_Y, m_Z + 0.5f);
|
||||||
double Distance = (EntityPos - BlockPos).Length();
|
double Distance = (EntityPos - BlockPos).Length();
|
||||||
|
|
||||||
if (Distance <= 0.7)
|
if (Distance <= 0.5)
|
||||||
{
|
{
|
||||||
m_NumberOfEntities++;
|
m_NumberOfEntities++;
|
||||||
}
|
}
|
||||||
@ -1232,7 +1240,7 @@ void cIncrementalRedstoneSimulator::HandlePressurePlate(int a_RelBlockX, int a_R
|
|||||||
|
|
||||||
bool GetPowerLevel(unsigned char & a_PowerLevel) const
|
bool GetPowerLevel(unsigned char & a_PowerLevel) const
|
||||||
{
|
{
|
||||||
a_PowerLevel = std::min((int)ceil(m_NumberOfEntities / (float)10), MAX_POWER_LEVEL);
|
a_PowerLevel = std::min((int)ceil(m_NumberOfEntities / 10.f), MAX_POWER_LEVEL);
|
||||||
return (a_PowerLevel > 0);
|
return (a_PowerLevel > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1245,7 +1253,7 @@ void cIncrementalRedstoneSimulator::HandlePressurePlate(int a_RelBlockX, int a_R
|
|||||||
};
|
};
|
||||||
|
|
||||||
cPressurePlateCallback PressurePlateCallback(BlockX, a_RelBlockY, BlockZ);
|
cPressurePlateCallback PressurePlateCallback(BlockX, a_RelBlockY, BlockZ);
|
||||||
m_World.ForEachEntity(PressurePlateCallback);
|
m_World.ForEachEntityInChunk(m_Chunk->GetPosX(), m_Chunk->GetPosZ(), PressurePlateCallback);
|
||||||
|
|
||||||
unsigned char Power;
|
unsigned char Power;
|
||||||
NIBBLETYPE Meta = m_Chunk->GetMeta(a_RelBlockX, a_RelBlockY, a_RelBlockZ);
|
NIBBLETYPE Meta = m_Chunk->GetMeta(a_RelBlockX, a_RelBlockY, a_RelBlockZ);
|
||||||
@ -1266,7 +1274,7 @@ void cIncrementalRedstoneSimulator::HandlePressurePlate(int a_RelBlockX, int a_R
|
|||||||
m_Chunk->BroadcastSoundEffect("random.click", (int)((BlockX + 0.5) * 8.0), (int)((a_RelBlockY + 0.1) * 8.0), (int)((BlockZ + 0.5) * 8.0), 0.3F, 0.6F);
|
m_Chunk->BroadcastSoundEffect("random.click", (int)((BlockX + 0.5) * 8.0), (int)((a_RelBlockY + 0.1) * 8.0), (int)((BlockZ + 0.5) * 8.0), 0.3F, 0.6F);
|
||||||
}
|
}
|
||||||
m_Chunk->SetMeta(a_RelBlockX, a_RelBlockY, a_RelBlockZ, E_META_PRESSURE_PLATE_RAISED);
|
m_Chunk->SetMeta(a_RelBlockX, a_RelBlockY, a_RelBlockZ, E_META_PRESSURE_PLATE_RAISED);
|
||||||
m_World.WakeUpSimulators(BlockX, a_RelBlockY, BlockZ);
|
WAKE_SIMULATOR_IF_DIRTY(m_Chunk, BlockX, a_RelBlockY, BlockZ);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@ -1291,7 +1299,7 @@ void cIncrementalRedstoneSimulator::HandlePressurePlate(int a_RelBlockX, int a_R
|
|||||||
Vector3f BlockPos(m_X + 0.5f, (float)m_Y, m_Z + 0.5f);
|
Vector3f BlockPos(m_X + 0.5f, (float)m_Y, m_Z + 0.5f);
|
||||||
double Distance = (EntityPos - BlockPos).Length();
|
double Distance = (EntityPos - BlockPos).Length();
|
||||||
|
|
||||||
if (Distance <= 0.7)
|
if (Distance <= 0.5)
|
||||||
{
|
{
|
||||||
m_FoundEntity = true;
|
m_FoundEntity = true;
|
||||||
return true; // Break out, we only need to know for plates that at least one entity is on top
|
return true; // Break out, we only need to know for plates that at least one entity is on top
|
||||||
@ -1313,7 +1321,7 @@ void cIncrementalRedstoneSimulator::HandlePressurePlate(int a_RelBlockX, int a_R
|
|||||||
} ;
|
} ;
|
||||||
|
|
||||||
cPressurePlateCallback PressurePlateCallback(BlockX, a_RelBlockY, BlockZ);
|
cPressurePlateCallback PressurePlateCallback(BlockX, a_RelBlockY, BlockZ);
|
||||||
m_World.ForEachEntity(PressurePlateCallback);
|
m_World.ForEachEntityInChunk(m_Chunk->GetPosX(), m_Chunk->GetPosZ(), PressurePlateCallback);
|
||||||
|
|
||||||
NIBBLETYPE Meta = m_Chunk->GetMeta(a_RelBlockX, a_RelBlockY, a_RelBlockZ);
|
NIBBLETYPE Meta = m_Chunk->GetMeta(a_RelBlockX, a_RelBlockY, a_RelBlockZ);
|
||||||
if (PressurePlateCallback.FoundEntity())
|
if (PressurePlateCallback.FoundEntity())
|
||||||
@ -1333,7 +1341,7 @@ void cIncrementalRedstoneSimulator::HandlePressurePlate(int a_RelBlockX, int a_R
|
|||||||
m_Chunk->BroadcastSoundEffect("random.click", (int)((BlockX + 0.5) * 8.0), (int)((a_RelBlockY + 0.1) * 8.0), (int)((BlockZ + 0.5) * 8.0), 0.3F, 0.6F);
|
m_Chunk->BroadcastSoundEffect("random.click", (int)((BlockX + 0.5) * 8.0), (int)((a_RelBlockY + 0.1) * 8.0), (int)((BlockZ + 0.5) * 8.0), 0.3F, 0.6F);
|
||||||
}
|
}
|
||||||
m_Chunk->SetMeta(a_RelBlockX, a_RelBlockY, a_RelBlockZ, E_META_PRESSURE_PLATE_RAISED);
|
m_Chunk->SetMeta(a_RelBlockX, a_RelBlockY, a_RelBlockZ, E_META_PRESSURE_PLATE_RAISED);
|
||||||
m_World.WakeUpSimulators(BlockX, a_RelBlockY, BlockZ);
|
WAKE_SIMULATOR_IF_DIRTY(m_Chunk, BlockX, a_RelBlockY, BlockZ);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1349,6 +1357,131 @@ void cIncrementalRedstoneSimulator::HandlePressurePlate(int a_RelBlockX, int a_R
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cIncrementalRedstoneSimulator::HandleTripwireHook(int a_RelBlockX, int a_RelBlockY, int a_RelBlockZ)
|
||||||
|
{
|
||||||
|
int BlockX = m_Chunk->GetPosX() * cChunkDef::Width + a_RelBlockX;
|
||||||
|
int BlockZ = m_Chunk->GetPosZ() * cChunkDef::Width + a_RelBlockZ;
|
||||||
|
int RelX = a_RelBlockX, RelZ = a_RelBlockZ;
|
||||||
|
bool FoundActivated = false;
|
||||||
|
eBlockFace FaceToGoTowards = cBlockTripwireHookHandler::MetadataToDirection(m_Chunk->GetMeta(a_RelBlockX, a_RelBlockY, a_RelBlockZ));
|
||||||
|
|
||||||
|
for (int i = 0; i < 40; ++i) // Tripwires can be connected up to 40 blocks
|
||||||
|
{
|
||||||
|
BLOCKTYPE Type;
|
||||||
|
NIBBLETYPE Meta;
|
||||||
|
|
||||||
|
AddFaceDirection(RelX, a_RelBlockY, RelZ, FaceToGoTowards);
|
||||||
|
m_Chunk->UnboundedRelGetBlock(RelX, a_RelBlockY, RelZ, Type, Meta);
|
||||||
|
|
||||||
|
if (Type == E_BLOCK_TRIPWIRE)
|
||||||
|
{
|
||||||
|
if (Meta == 0x1)
|
||||||
|
{
|
||||||
|
FoundActivated = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (Type == E_BLOCK_TRIPWIRE_HOOK)
|
||||||
|
{
|
||||||
|
if (ReverseBlockFace(cBlockTripwireHookHandler::MetadataToDirection(Meta)) == FaceToGoTowards)
|
||||||
|
{
|
||||||
|
// Other hook not facing in opposite direction
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Tripwire hook not connected at all, AND away all the power state bits
|
||||||
|
m_Chunk->SetMeta(a_RelBlockX, a_RelBlockY, a_RelBlockZ, m_Chunk->GetMeta(a_RelBlockX, a_RelBlockY, a_RelBlockZ) & 0x3);
|
||||||
|
WAKE_SIMULATOR_IF_DIRTY(m_Chunk, BlockX, a_RelBlockY, BlockZ);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Tripwire hook not connected at all, AND away all the power state bits
|
||||||
|
m_Chunk->SetMeta(a_RelBlockX, a_RelBlockY, a_RelBlockZ, m_Chunk->GetMeta(a_RelBlockX, a_RelBlockY, a_RelBlockZ) & 0x3);
|
||||||
|
WAKE_SIMULATOR_IF_DIRTY(m_Chunk, BlockX, a_RelBlockY, BlockZ);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (FoundActivated)
|
||||||
|
{
|
||||||
|
// Connected and activated, set the 3rd and 4th highest bits
|
||||||
|
m_Chunk->SetMeta(a_RelBlockX, a_RelBlockY, a_RelBlockZ, m_Chunk->GetMeta(a_RelBlockX, a_RelBlockY, a_RelBlockZ) | 0xC);
|
||||||
|
SetAllDirsAsPowered(a_RelBlockX, a_RelBlockY, a_RelBlockZ);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Connected but not activated, AND away the highest bit
|
||||||
|
m_Chunk->SetMeta(a_RelBlockX, a_RelBlockY, a_RelBlockZ, (m_Chunk->GetMeta(a_RelBlockX, a_RelBlockY, a_RelBlockZ) & 0x7) | 0x4);
|
||||||
|
WAKE_SIMULATOR_IF_DIRTY(m_Chunk, BlockX, a_RelBlockY, BlockZ);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cIncrementalRedstoneSimulator::HandleTripwire(int a_RelBlockX, int a_RelBlockY, int a_RelBlockZ)
|
||||||
|
{
|
||||||
|
int BlockX = m_Chunk->GetPosX() * cChunkDef::Width + a_RelBlockX;
|
||||||
|
int BlockZ = m_Chunk->GetPosZ() * cChunkDef::Width + a_RelBlockZ;
|
||||||
|
|
||||||
|
class cTripwireCallback :
|
||||||
|
public cEntityCallback
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
cTripwireCallback(int a_BlockX, int a_BlockY, int a_BlockZ) :
|
||||||
|
m_FoundEntity(false),
|
||||||
|
m_X(a_BlockX),
|
||||||
|
m_Y(a_BlockY),
|
||||||
|
m_Z(a_BlockZ)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool Item(cEntity * a_Entity) override
|
||||||
|
{
|
||||||
|
cBoundingBox bbWire(m_X, m_X + 1, m_Y, m_Y + 0.1, m_Z, m_Z + 1);
|
||||||
|
cBoundingBox bbEntity(a_Entity->GetPosition(), a_Entity->GetWidth() / 2, a_Entity->GetHeight());
|
||||||
|
|
||||||
|
if (bbEntity.DoesIntersect(bbWire))
|
||||||
|
{
|
||||||
|
m_FoundEntity = true;
|
||||||
|
return true; // One entity is sufficient to trigger the wire
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FoundEntity(void) const
|
||||||
|
{
|
||||||
|
return m_FoundEntity;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool m_FoundEntity;
|
||||||
|
|
||||||
|
int m_X;
|
||||||
|
int m_Y;
|
||||||
|
int m_Z;
|
||||||
|
};
|
||||||
|
|
||||||
|
cTripwireCallback TripwireCallback(BlockX, a_RelBlockY, BlockZ);
|
||||||
|
m_World.ForEachEntityInChunk(m_Chunk->GetPosX(), m_Chunk->GetPosZ(), TripwireCallback);
|
||||||
|
|
||||||
|
if (TripwireCallback.FoundEntity())
|
||||||
|
{
|
||||||
|
m_Chunk->SetMeta(a_RelBlockX, a_RelBlockY, a_RelBlockZ, 0x1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_Chunk->SetMeta(a_RelBlockX, a_RelBlockY, a_RelBlockZ, 0x0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool cIncrementalRedstoneSimulator::AreCoordsDirectlyPowered(int a_RelBlockX, int a_RelBlockY, int a_RelBlockZ)
|
bool cIncrementalRedstoneSimulator::AreCoordsDirectlyPowered(int a_RelBlockX, int a_RelBlockY, int a_RelBlockZ)
|
||||||
{
|
{
|
||||||
int BlockX = (m_Chunk->GetPosX() * cChunkDef::Width) + a_RelBlockX;
|
int BlockX = (m_Chunk->GetPosX() * cChunkDef::Width) + a_RelBlockX;
|
||||||
|
@ -102,6 +102,11 @@ private:
|
|||||||
void HandleDaylightSensor(int a_RelBlockX, int a_RelBlockY, int a_RelBlockZ);
|
void HandleDaylightSensor(int a_RelBlockX, int a_RelBlockY, int a_RelBlockZ);
|
||||||
/** Handles pressure plates */
|
/** Handles pressure plates */
|
||||||
void HandlePressurePlate(int a_RelBlockX, int a_RelBlockY, int a_RelBlockZ, BLOCKTYPE a_MyType);
|
void HandlePressurePlate(int a_RelBlockX, int a_RelBlockY, int a_RelBlockZ, BLOCKTYPE a_MyType);
|
||||||
|
/** Handles tripwire hooks
|
||||||
|
Performs correct meta and power setting for self by going in the direction it faces and looking for a continous line of tripwire bounded by another oppositely facing hook
|
||||||
|
If this line is complete, it verifies that at least on wire reports an entity is on top (via its meta), and performs its task
|
||||||
|
*/
|
||||||
|
void HandleTripwireHook(int a_RelBlockX, int a_RelBlockY, int a_RelBlockZ);
|
||||||
/* ==================== */
|
/* ==================== */
|
||||||
|
|
||||||
/* ====== CARRIERS ====== */
|
/* ====== CARRIERS ====== */
|
||||||
@ -134,6 +139,8 @@ private:
|
|||||||
void HandleFenceGate(int a_RelBlockX, int a_RelBlockY, int a_RelBlockZ);
|
void HandleFenceGate(int a_RelBlockX, int a_RelBlockY, int a_RelBlockZ);
|
||||||
/** Handles noteblocks */
|
/** Handles noteblocks */
|
||||||
void HandleNoteBlock(int a_RelBlockX, int a_RelBlockY, int a_RelBlockZ);
|
void HandleNoteBlock(int a_RelBlockX, int a_RelBlockY, int a_RelBlockZ);
|
||||||
|
/** Handles tripwires */
|
||||||
|
void HandleTripwire(int a_RelBlockX, int a_RelBlockY, int a_RelBlockZ);
|
||||||
/* ===================== */
|
/* ===================== */
|
||||||
|
|
||||||
/* ====== Helper functions ====== */
|
/* ====== Helper functions ====== */
|
||||||
@ -271,6 +278,7 @@ private:
|
|||||||
case E_BLOCK_TNT:
|
case E_BLOCK_TNT:
|
||||||
case E_BLOCK_TRAPDOOR:
|
case E_BLOCK_TRAPDOOR:
|
||||||
case E_BLOCK_TRIPWIRE_HOOK:
|
case E_BLOCK_TRIPWIRE_HOOK:
|
||||||
|
case E_BLOCK_TRIPWIRE:
|
||||||
case E_BLOCK_WOODEN_BUTTON:
|
case E_BLOCK_WOODEN_BUTTON:
|
||||||
case E_BLOCK_WOODEN_DOOR:
|
case E_BLOCK_WOODEN_DOOR:
|
||||||
case E_BLOCK_WOODEN_PRESSURE_PLATE:
|
case E_BLOCK_WOODEN_PRESSURE_PLATE:
|
||||||
|
Loading…
Reference in New Issue
Block a user