Fixed redstone simulator crash found in #570
This commit is contained in:
parent
07fb1bca23
commit
ed7816419d
@ -499,13 +499,14 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
/// Generic template that can store any kind of data together with a triplet of 3 coords:
|
/// Generic template that can store any kind of data together with a triplet of 3 coords:
|
||||||
template <typename X> class cCoordWithData
|
template <typename X, typename Y> class cCoordWithData
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
int x;
|
int x;
|
||||||
int y;
|
int y;
|
||||||
int z;
|
int z;
|
||||||
X Data;
|
X Data;
|
||||||
|
Y SecondData;
|
||||||
|
|
||||||
cCoordWithData(int a_X, int a_Y, int a_Z) :
|
cCoordWithData(int a_X, int a_Y, int a_Z) :
|
||||||
x(a_X), y(a_Y), z(a_Z)
|
x(a_X), y(a_Y), z(a_Z)
|
||||||
@ -516,14 +517,19 @@ public:
|
|||||||
x(a_X), y(a_Y), z(a_Z), Data(a_Data)
|
x(a_X), y(a_Y), z(a_Z), Data(a_Data)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cCoordWithData(int a_X, int a_Y, int a_Z, const X & a_Data, const Y & a_SecondData) :
|
||||||
|
x(a_X), y(a_Y), z(a_Z), Data(a_Data), SecondData(a_SecondData)
|
||||||
|
{
|
||||||
|
}
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
// Illegal in C++03: typedef std::list< cCoordWithData<X> > cCoordWithDataList<X>;
|
typedef cCoordWithData<int, void *> cCoordWithInt;
|
||||||
typedef cCoordWithData<int> cCoordWithInt;
|
typedef cCoordWithData<BLOCKTYPE, bool> cCoordWithBlockAndBool;
|
||||||
typedef cCoordWithData<BLOCKTYPE> cCoordWithBlock;
|
|
||||||
typedef std::list<cCoordWithInt> cCoordWithIntList;
|
typedef std::list<cCoordWithInt> cCoordWithIntList;
|
||||||
typedef std::vector<cCoordWithInt> cCoordWithIntVector;
|
typedef std::vector<cCoordWithInt> cCoordWithIntVector;
|
||||||
typedef std::vector<cCoordWithBlock> cCoordWithBlockVector;
|
typedef std::vector<cCoordWithBlockAndBool> cCoordWithBlockAndBoolVector;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -9,7 +9,6 @@
|
|||||||
#include "../Blocks/BlockTorch.h"
|
#include "../Blocks/BlockTorch.h"
|
||||||
#include "../Blocks/BlockDoor.h"
|
#include "../Blocks/BlockDoor.h"
|
||||||
#include "../Piston.h"
|
#include "../Piston.h"
|
||||||
#include "../Tracer.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -170,7 +169,7 @@ void cRedstoneSimulator::AddBlock(int a_BlockX, int a_BlockY, int a_BlockZ, cChu
|
|||||||
{
|
{
|
||||||
if (!IsAllowedBlock(Block))
|
if (!IsAllowedBlock(Block))
|
||||||
{
|
{
|
||||||
ChunkData.erase(itr); // The new blocktype is not redstone; it must be removed from this list
|
itr->SecondData = true; // The new blocktype is not redstone; it must be queued to be removed from this list
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -185,7 +184,7 @@ void cRedstoneSimulator::AddBlock(int a_BlockX, int a_BlockY, int a_BlockZ, cChu
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ChunkData.push_back(cCoordWithBlock(RelX, a_BlockY, RelZ, Block));
|
ChunkData.push_back(cCoordWithBlockAndBool(RelX, a_BlockY, RelZ, Block, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -208,8 +207,14 @@ void cRedstoneSimulator::SimulateChunk(float a_Dt, int a_ChunkX, int a_ChunkZ, c
|
|||||||
int BaseX = a_Chunk->GetPosX() * cChunkDef::Width;
|
int BaseX = a_Chunk->GetPosX() * cChunkDef::Width;
|
||||||
int BaseZ = a_Chunk->GetPosZ() * cChunkDef::Width;
|
int BaseZ = a_Chunk->GetPosZ() * cChunkDef::Width;
|
||||||
|
|
||||||
for (cRedstoneSimulatorChunkData::const_iterator dataitr = ChunkData.begin(); dataitr != ChunkData.end(); ++dataitr)
|
for (cRedstoneSimulatorChunkData::iterator dataitr = ChunkData.begin(); dataitr != ChunkData.end();)
|
||||||
{
|
{
|
||||||
|
if (dataitr->SecondData)
|
||||||
|
{
|
||||||
|
dataitr = ChunkData.erase(dataitr);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
int a_X = BaseX + dataitr->x;
|
int a_X = BaseX + dataitr->x;
|
||||||
int a_Z = BaseZ + dataitr->z;
|
int a_Z = BaseZ + dataitr->z;
|
||||||
switch (dataitr->Data)
|
switch (dataitr->Data)
|
||||||
@ -279,6 +284,7 @@ void cRedstoneSimulator::SimulateChunk(float a_Dt, int a_ChunkX, int a_ChunkZ, c
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
++dataitr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -917,7 +923,7 @@ void cRedstoneSimulator::HandlePressurePlate(int a_BlockX, int a_BlockY, int a_B
|
|||||||
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(a_BlockX + 0.5f, (float)a_BlockY, a_BlockZ + 0.5f), 0.5f);
|
cPlayer * a_Player = m_World.FindClosestPlayer(Vector3f(a_BlockX + 0.5f, (float)a_BlockY, a_BlockZ + 0.5f), 0.5f, false);
|
||||||
|
|
||||||
if (a_Player != NULL)
|
if (a_Player != NULL)
|
||||||
{
|
{
|
||||||
@ -948,20 +954,15 @@ void cRedstoneSimulator::HandlePressurePlate(int a_BlockX, int a_BlockY, int a_B
|
|||||||
|
|
||||||
virtual bool Item(cEntity * a_Entity) override
|
virtual bool Item(cEntity * a_Entity) override
|
||||||
{
|
{
|
||||||
cTracer LineOfSight(m_World);
|
|
||||||
|
|
||||||
Vector3f EntityPos = a_Entity->GetPosition();
|
Vector3f EntityPos = a_Entity->GetPosition();
|
||||||
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);
|
||||||
float Distance = (EntityPos - BlockPos).Length();
|
float Distance = (EntityPos - BlockPos).Length();
|
||||||
|
|
||||||
if (Distance < 0.5)
|
if (Distance < 0.5)
|
||||||
{
|
|
||||||
if (!LineOfSight.Trace(BlockPos, (EntityPos - BlockPos), (int)(EntityPos - BlockPos).Length()))
|
|
||||||
{
|
{
|
||||||
m_Entity = a_Entity;
|
m_Entity = a_Entity;
|
||||||
return true; // Break out, we only need to know for wooden plates that at least one entity is on top
|
return true; // Break out, we only need to know for wooden plates that at least one entity is on top
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
#include "Simulator.h"
|
#include "Simulator.h"
|
||||||
|
|
||||||
/// Per-chunk data for the simulator, specified individual chunks to simulate; 'Data' is not used
|
/// Per-chunk data for the simulator, specified individual chunks to simulate; 'Data' is not used
|
||||||
typedef cCoordWithBlockVector cRedstoneSimulatorChunkData;
|
typedef cCoordWithBlockAndBoolVector cRedstoneSimulatorChunkData;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user