1
0

- improved Simulator system

-> Manager handles all ticks -> advantage: Much easier to add new simulators, because you only have to register them in the manager

- moved sand and gravel simulation to a Simulator-class (cSandSimulator)

- Made Squid a little bit more funny and realistic, because it dies now when it´s not in water

-Escaping mobs run now faster than normal (They just walked away before :D)

git-svn-id: http://mc-server.googlecode.com/svn/trunk@125 0a769ca7-a7f5-676a-18bf-c427514a06d6
This commit is contained in:
lapayo94@gmail.com 2011-12-26 20:57:12 +00:00
parent 92e0ba6645
commit 9f77572fb0
17 changed files with 340 additions and 71 deletions

View File

@ -257,11 +257,14 @@
<ClCompile Include="..\source\cRedstone.cpp" /> <ClCompile Include="..\source\cRedstone.cpp" />
<ClCompile Include="..\Source\cReferenceManager.cpp" /> <ClCompile Include="..\Source\cReferenceManager.cpp" />
<ClCompile Include="..\Source\cRoot.cpp" /> <ClCompile Include="..\Source\cRoot.cpp" />
<ClCompile Include="..\source\cSandSimulator.cpp" />
<ClCompile Include="..\Source\cSemaphore.cpp" /> <ClCompile Include="..\Source\cSemaphore.cpp" />
<ClCompile Include="..\source\cServer.cpp" /> <ClCompile Include="..\source\cServer.cpp" />
<ClCompile Include="..\source\cSheep.cpp" /> <ClCompile Include="..\source\cSheep.cpp" />
<ClCompile Include="..\Source\cSignEntity.cpp" /> <ClCompile Include="..\Source\cSignEntity.cpp" />
<ClCompile Include="..\source\cSilverfish.cpp" /> <ClCompile Include="..\source\cSilverfish.cpp" />
<ClCompile Include="..\source\cSimulator.cpp" />
<ClCompile Include="..\source\cSimulatorManager.cpp" />
<ClCompile Include="..\source\cSkeleton.cpp" /> <ClCompile Include="..\source\cSkeleton.cpp" />
<ClCompile Include="..\source\cSleep.cpp" /> <ClCompile Include="..\source\cSleep.cpp" />
<ClCompile Include="..\source\cSlime.cpp" /> <ClCompile Include="..\source\cSlime.cpp" />
@ -399,12 +402,15 @@
<ClInclude Include="..\source\cRedstone.h" /> <ClInclude Include="..\source\cRedstone.h" />
<ClInclude Include="..\Source\cReferenceManager.h" /> <ClInclude Include="..\Source\cReferenceManager.h" />
<ClInclude Include="..\Source\cRoot.h" /> <ClInclude Include="..\Source\cRoot.h" />
<ClInclude Include="..\source\cSandSimulator.h" />
<ClInclude Include="..\Source\cSemaphore.h" /> <ClInclude Include="..\Source\cSemaphore.h" />
<ClInclude Include="..\source\cServer.h" /> <ClInclude Include="..\source\cServer.h" />
<ClInclude Include="..\source\cSheep.h" /> <ClInclude Include="..\source\cSheep.h" />
<ClInclude Include="..\Source\cSign.h" /> <ClInclude Include="..\Source\cSign.h" />
<ClInclude Include="..\Source\cSignEntity.h" /> <ClInclude Include="..\Source\cSignEntity.h" />
<ClInclude Include="..\source\cSilverfish.h" /> <ClInclude Include="..\source\cSilverfish.h" />
<ClInclude Include="..\source\cSimulator.h" />
<ClInclude Include="..\source\cSimulatorManager.h" />
<ClInclude Include="..\source\cSkeleton.h" /> <ClInclude Include="..\source\cSkeleton.h" />
<ClInclude Include="..\source\cSleep.h" /> <ClInclude Include="..\source\cSleep.h" />
<ClInclude Include="..\source\cSlime.h" /> <ClInclude Include="..\source\cSlime.h" />

View File

@ -397,15 +397,6 @@
<Filter Include="cChunkGenerator"> <Filter Include="cChunkGenerator">
<UniqueIdentifier>{0d6f822b-71eb-406f-b17a-d188c4924283}</UniqueIdentifier> <UniqueIdentifier>{0d6f822b-71eb-406f-b17a-d188c4924283}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="cFluidSimulator">
<UniqueIdentifier>{6f92474b-e2a5-4685-abf1-053b09dbc4f1}</UniqueIdentifier>
</Filter>
<Filter Include="cFluidSimulator\cWaterSimulator">
<UniqueIdentifier>{02fd457d-3735-4f4b-aaf2-f7701a7ee7bc}</UniqueIdentifier>
</Filter>
<Filter Include="cFluidSimulator\cLavaSimulator">
<UniqueIdentifier>{b0401fd9-4021-4ab7-bf61-c8de112b4196}</UniqueIdentifier>
</Filter>
<Filter Include="cEntity\cPawn\cMonster\Personalities"> <Filter Include="cEntity\cPawn\cMonster\Personalities">
<UniqueIdentifier>{b0f7c883-e2ca-4bba-89e3-c36656c3de39}</UniqueIdentifier> <UniqueIdentifier>{b0f7c883-e2ca-4bba-89e3-c36656c3de39}</UniqueIdentifier>
</Filter> </Filter>
@ -424,6 +415,21 @@
<Filter Include="cWorldGenerator"> <Filter Include="cWorldGenerator">
<UniqueIdentifier>{72727ea7-779f-439e-8f30-53bd6985c9e7}</UniqueIdentifier> <UniqueIdentifier>{72727ea7-779f-439e-8f30-53bd6985c9e7}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="cSimulator">
<UniqueIdentifier>{0c205a99-5597-4a79-81d1-5b2f882aecf2}</UniqueIdentifier>
</Filter>
<Filter Include="cSimulator\cFluidSimulator">
<UniqueIdentifier>{6f92474b-e2a5-4685-abf1-053b09dbc4f1}</UniqueIdentifier>
</Filter>
<Filter Include="cSimulator\cFluidSimulator\cWaterSimulator">
<UniqueIdentifier>{02fd457d-3735-4f4b-aaf2-f7701a7ee7bc}</UniqueIdentifier>
</Filter>
<Filter Include="cSimulator\cFluidSimulator\cLavaSimulator">
<UniqueIdentifier>{b0401fd9-4021-4ab7-bf61-c8de112b4196}</UniqueIdentifier>
</Filter>
<Filter Include="cSimulator\SandSimulator">
<UniqueIdentifier>{b3ebe846-5722-43f3-af56-e874e8fef7a5}</UniqueIdentifier>
</Filter>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="..\source\cServer.cpp"> <ClCompile Include="..\source\cServer.cpp">
@ -746,7 +752,7 @@
<Filter>Packets\cPacket_EntityStatus</Filter> <Filter>Packets\cPacket_EntityStatus</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\source\cWaterSimulator.cpp"> <ClCompile Include="..\source\cWaterSimulator.cpp">
<Filter>cFluidSimulator\cWaterSimulator</Filter> <Filter>cSimulator\cFluidSimulator\cWaterSimulator</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\source\cSocket.cpp"> <ClCompile Include="..\source\cSocket.cpp">
<Filter>Threading\cSocket</Filter> <Filter>Threading\cSocket</Filter>
@ -809,7 +815,7 @@
<Filter>cPiston</Filter> <Filter>cPiston</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\source\cLavaSimulator.cpp"> <ClCompile Include="..\source\cLavaSimulator.cpp">
<Filter>cFluidSimulator\cLavaSimulator</Filter> <Filter>cSimulator\cFluidSimulator\cLavaSimulator</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\source\SquirrelBindings.cpp"> <ClCompile Include="..\source\SquirrelBindings.cpp">
<Filter>LuaBindings\SquirrelBindings</Filter> <Filter>LuaBindings\SquirrelBindings</Filter>
@ -830,7 +836,7 @@
<Filter>cChunkGenerator</Filter> <Filter>cChunkGenerator</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\source\cFluidSimulator.cpp"> <ClCompile Include="..\source\cFluidSimulator.cpp">
<Filter>cFluidSimulator</Filter> <Filter>cSimulator\cFluidSimulator</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\source\cAggressiveMonster.cpp"> <ClCompile Include="..\source\cAggressiveMonster.cpp">
<Filter>cEntity\cPawn\cMonster\Personalities\Aggressive</Filter> <Filter>cEntity\cPawn\cMonster\Personalities\Aggressive</Filter>
@ -847,6 +853,15 @@
<ClCompile Include="..\source\cWorldGenerator.cpp"> <ClCompile Include="..\source\cWorldGenerator.cpp">
<Filter>cWorldGenerator</Filter> <Filter>cWorldGenerator</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\source\cSimulator.cpp">
<Filter>cSimulator</Filter>
</ClCompile>
<ClCompile Include="..\source\cSandSimulator.cpp">
<Filter>cSimulator\SandSimulator</Filter>
</ClCompile>
<ClCompile Include="..\source\cSimulatorManager.cpp">
<Filter>cSimulator</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\source\cServer.h"> <ClInclude Include="..\source\cServer.h">
@ -1201,7 +1216,7 @@
<Filter>Packets\cPacket_EntityStatus</Filter> <Filter>Packets\cPacket_EntityStatus</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\source\cWaterSimulator.h"> <ClInclude Include="..\source\cWaterSimulator.h">
<Filter>cFluidSimulator\cWaterSimulator</Filter> <Filter>cSimulator\cFluidSimulator\cWaterSimulator</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\source\cSocket.h"> <ClInclude Include="..\source\cSocket.h">
<Filter>Threading\cSocket</Filter> <Filter>Threading\cSocket</Filter>
@ -1267,7 +1282,7 @@
<Filter>cPiston</Filter> <Filter>cPiston</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\source\cLavaSimulator.h"> <ClInclude Include="..\source\cLavaSimulator.h">
<Filter>cFluidSimulator\cLavaSimulator</Filter> <Filter>cSimulator\cFluidSimulator\cLavaSimulator</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\source\SquirrelBindings.h"> <ClInclude Include="..\source\SquirrelBindings.h">
<Filter>LuaBindings\SquirrelBindings</Filter> <Filter>LuaBindings\SquirrelBindings</Filter>
@ -1288,7 +1303,7 @@
<Filter>cChunkGenerator</Filter> <Filter>cChunkGenerator</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\source\cFluidSimulator.h"> <ClInclude Include="..\source\cFluidSimulator.h">
<Filter>cFluidSimulator</Filter> <Filter>cSimulator\cFluidSimulator</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\source\cAggressiveMonster.h"> <ClInclude Include="..\source\cAggressiveMonster.h">
<Filter>cEntity\cPawn\cMonster\Personalities\Aggressive</Filter> <Filter>cEntity\cPawn\cMonster\Personalities\Aggressive</Filter>
@ -1305,6 +1320,15 @@
<ClInclude Include="..\source\cWorldGenerator.h"> <ClInclude Include="..\source\cWorldGenerator.h">
<Filter>cWorldGenerator</Filter> <Filter>cWorldGenerator</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\source\cSimulator.h">
<Filter>cSimulator</Filter>
</ClInclude>
<ClInclude Include="..\source\cSandSimulator.h">
<Filter>cSimulator\SandSimulator</Filter>
</ClInclude>
<ClInclude Include="..\source\cSimulatorManager.h">
<Filter>cSimulator</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="..\source\AllToLua.pkg"> <None Include="..\source\AllToLua.pkg">

View File

@ -232,6 +232,9 @@ MCServer : \
build/zutil.o\ build/zutil.o\
build/iniFile.o\ build/iniFile.o\
build/cSocket.o\ build/cSocket.o\
build/cSimulator.o\
build/cSimulatorManager.o\
build/cSandSimulator.o\
build/cFluidSimulator.o\ build/cFluidSimulator.o\
build/cWaterSimulator.o\ build/cWaterSimulator.o\
build/cLavaSimulator.o\ build/cLavaSimulator.o\
@ -431,6 +434,9 @@ MCServer : \
build/zutil.o\ build/zutil.o\
build/iniFile.o\ build/iniFile.o\
build/cSocket.o\ build/cSocket.o\
build/cSimulator.o\
build/cSimulatorManager.o\
build/cSandSimulator.o\
build/cFluidSimulator.o\ build/cFluidSimulator.o\
build/cWaterSimulator.o\ build/cWaterSimulator.o\
build/cLavaSimulator.o\ build/cLavaSimulator.o\
@ -633,6 +639,9 @@ clean :
build/zutil.o\ build/zutil.o\
build/iniFile.o\ build/iniFile.o\
build/cSocket.o\ build/cSocket.o\
build/cSimulator.o\
build/cSimulatorManager.o\
build/cSandSimulator.o\
build/cFluidSimulator.o\ build/cFluidSimulator.o\
build/cWaterSimulator.o\ build/cWaterSimulator.o\
build/cLavaSimulator.o\ build/cLavaSimulator.o\
@ -1448,6 +1457,15 @@ build/cMakeDir.o : source/cMakeDir.cpp
build/cSocket.o : source/cSocket.cpp build/cSocket.o : source/cSocket.cpp
$(CC) $(CC_OPTIONS) source/cSocket.cpp -c $(INCLUDE) -o build/cSocket.o $(CC) $(CC_OPTIONS) source/cSocket.cpp -c $(INCLUDE) -o build/cSocket.o
build/cSimulator.o : source/cSimulator.cpp
$(CC) $(CC_OPTIONS) source/cSimulator.cpp -c $(INCLUDE) -o build/cSimulator.o
build/cSimulatorManager.o : source/cSimulatorManager.cpp
$(CC) $(CC_OPTIONS) source/cSimulatorManager.cpp -c $(INCLUDE) -o build/cSimulatorManager.o
build/cSandSimulator.o : source/cSandSimulator.cpp
$(CC) $(CC_OPTIONS) source/cSandSimulator.cpp -c $(INCLUDE) -o build/cSandSimulator.o
build/cFluidSimulator.o : source/cFluidSimulator.cpp build/cFluidSimulator.o : source/cFluidSimulator.cpp
$(CC) $(CC_OPTIONS) source/cFluidSimulator.cpp -c $(INCLUDE) -o build/cFluidSimulator.o $(CC) $(CC_OPTIONS) source/cFluidSimulator.cpp -c $(INCLUDE) -o build/cFluidSimulator.o
@ -1463,5 +1481,4 @@ build/cFileFormatUpdater.o : source/cFileFormatUpdater.cpp
build/cItem.o : source/cItem.cpp build/cItem.o : source/cItem.cpp
$(CC) $(CC_OPTIONS) source/cItem.cpp -c $(INCLUDE) -o build/cItem.o $(CC) $(CC_OPTIONS) source/cItem.cpp -c $(INCLUDE) -o build/cItem.o
##### END RUN #### ##### END RUN ####

View File

@ -257,8 +257,7 @@ void cChunk::Tick(float a_Dt)
int wX, wY, wZ; int wX, wY, wZ;
PositionToWorldPosition(X, Y, Z, wX, wY, wZ); PositionToWorldPosition(X, Y, Z, wX, wY, wZ);
m_World->GetWaterSimulator()->WakeUp( wX, wY, wZ ); m_World->GetSimulatorManager()->WakeUp(wX, wY, wZ);
m_World->GetLavaSimulator()->WakeUp( wX, wY, wZ );
if (isRedstone) { if (isRedstone) {
cRedstone Redstone(m_World); cRedstone Redstone(m_World);
Redstone.ChangeRedstone( (X+m_PosX*16), (Y+m_PosY*16), (Z+m_PosZ*16), false ); Redstone.ChangeRedstone( (X+m_PosX*16), (Y+m_PosY*16), (Z+m_PosZ*16), false );
@ -306,30 +305,6 @@ void cChunk::Tick(float a_Dt)
} }
} }
break; break;
case E_BLOCK_STATIONARY_WATER:
case E_BLOCK_WATER:
break;
case E_BLOCK_GRAVEL:
case E_BLOCK_SAND:
{
char BottomBlock = GetBlock( X, Y-1, Z );
if( BottomBlock == E_BLOCK_AIR || IsBlockWater(BottomBlock) || IsBlockLava(BottomBlock) )
{
SetBlock( X, Y, Z, E_BLOCK_AIR, 0 );
SetBlock( X, Y-1, Z, BlockID, 0 );
int wX, wY, wZ;
PositionToWorldPosition(X, Y, Z, wX, wY, wZ);
m_World->GetWaterSimulator()->WakeUp( wX, wY, wZ );
m_World->GetLavaSimulator()->WakeUp( wX, wY, wZ );
m_World->GetWaterSimulator()->WakeUp( wX, wY - 1, wZ );
m_World->GetLavaSimulator()->WakeUp( wX, wY - 1, wZ );
}
}
break;
default: default:
break; break;
}; };

View File

@ -72,7 +72,7 @@ public:
}; };
cFluidSimulator::cFluidSimulator( cWorld* a_World ) cFluidSimulator::cFluidSimulator( cWorld* a_World )
: m_World(a_World) : cSimulator(a_World)
, m_Data(0) , m_Data(0)
{ {
m_Data = new FluidData(a_World, this); m_Data = new FluidData(a_World, this);
@ -80,17 +80,7 @@ cFluidSimulator::cFluidSimulator( cWorld* a_World )
cFluidSimulator::~cFluidSimulator() cFluidSimulator::~cFluidSimulator()
{ {
} delete m_Data;
void cFluidSimulator::WakeUp( int a_X, int a_Y, int a_Z )
{
AddBlock( a_X, a_Y, a_Z );
AddBlock( a_X-1, a_Y, a_Z );
AddBlock( a_X+1, a_Y, a_Z );
AddBlock( a_X, a_Y-1, a_Z );
AddBlock( a_X, a_Y+1, a_Z );
AddBlock( a_X, a_Y, a_Z-1 );
AddBlock( a_X, a_Y, a_Z+1 );
} }
void cFluidSimulator::AddBlock( int a_X, int a_Y, int a_Z ) void cFluidSimulator::AddBlock( int a_X, int a_Y, int a_Z )
@ -99,8 +89,8 @@ void cFluidSimulator::AddBlock( int a_X, int a_Y, int a_Z )
std::vector< Vector3i > & ActiveFluid = *m_Data->m_ActiveFluid; std::vector< Vector3i > & ActiveFluid = *m_Data->m_ActiveFluid;
for( std::vector< Vector3i >::iterator itr = ActiveFluid.begin(); itr != ActiveFluid.end(); ++itr ) for( std::vector< Vector3i >::iterator itr = ActiveFluid.begin(); itr != ActiveFluid.end(); ++itr )
{ {
Vector3i & pos = *itr; Vector3i & Pos = *itr;
if( pos.x == a_X && pos.y == a_Y && pos.z == a_Z ) if( Pos.x == a_X && Pos.y == a_Y && Pos.z == a_Z )
return; return;
} }

View File

@ -1,5 +1,7 @@
#pragma once #pragma once
#include "cSimulator.h"
//TODO This definitly needs a better naming :D but how? //TODO This definitly needs a better naming :D but how?
enum Direction enum Direction
@ -15,14 +17,13 @@ enum Direction
class Vector3i; class Vector3i;
class cWorld; class cWorld;
class cFluidSimulator class cFluidSimulator : public cSimulator
{ {
public: public:
cFluidSimulator( cWorld* a_World ); cFluidSimulator( cWorld* a_World );
~cFluidSimulator(); ~cFluidSimulator();
virtual void Simulate( float a_Dt ); virtual void Simulate( float a_Dt );
void WakeUp( int a_X, int a_Y, int a_Z );
//Gets the flowing direction. if a_Over is true also the block over the current block affects the direction (standard) //Gets the flowing direction. if a_Over is true also the block over the current block affects the direction (standard)
Direction GetFlowingDirection(int a_X, int a_Y, int a_Z, bool a_Over = true); Direction GetFlowingDirection(int a_X, int a_Y, int a_Z, bool a_Over = true);
@ -31,12 +32,11 @@ public:
virtual inline bool IsPassableForFluid( char a_BlockID ) = 0; virtual inline bool IsPassableForFluid( char a_BlockID ) = 0;
protected: protected:
void AddBlock( int a_X, int a_Y, int a_Z); virtual void AddBlock( int a_X, int a_Y, int a_Z);
char GetHighestLevelAround( int a_X, int a_Y, int a_Z ); char GetHighestLevelAround( int a_X, int a_Y, int a_Z );
float m_Timer; float m_Timer;
cWorld* m_World;
class FluidData; class FluidData;
FluidData* m_Data; FluidData* m_Data;

View File

@ -14,7 +14,8 @@ cPassiveMonster::~cPassiveMonster()
void cPassiveMonster::TakeDamage(int a_Damage, cEntity* a_Instigator) void cPassiveMonster::TakeDamage(int a_Damage, cEntity* a_Instigator)
{ {
cMonster::TakeDamage(a_Damage, a_Instigator); cMonster::TakeDamage(a_Damage, a_Instigator);
m_EMState = ESCAPING; if(a_Instigator != this)
m_EMState = ESCAPING;
} }
void cPassiveMonster::Tick(float a_Dt) void cPassiveMonster::Tick(float a_Dt)

74
source/cSandSimulator.cpp Normal file
View File

@ -0,0 +1,74 @@
#include "cSandSimulator.h"
#include "cWorld.h"
#include "Vector3i.h"
#include "BlockID.h"
#include "Defines.h"
#include <vector>
cSandSimulator::cSandSimulator( cWorld* a_World )
: cSimulator(a_World)
, m_Blocks(new std::vector <Vector3i *>)
, m_Buffer(new std::vector <Vector3i *>)
{
}
cSandSimulator::~cSandSimulator()
{
delete m_Buffer;
delete m_Blocks;
}
void cSandSimulator::Simulate( float a_Dt )
{
m_Buffer->clear();
std::swap( m_Blocks, m_Buffer );
for( std::vector<Vector3i *>::iterator itr = m_Buffer->begin(); itr != m_Buffer->end(); ++itr )
{
Vector3i *Pos = *itr;
char BlockID = m_World->GetBlock(Pos->x, Pos->y, Pos->z);
if(!IsAllowedBlock(BlockID))
continue;
char BottomBlock = m_World->GetBlock( Pos->x, Pos->y - 1, Pos->z );
if( IsPassable(BottomBlock) )
{
m_World->SetBlock( Pos->x, Pos->y, Pos->z, E_BLOCK_AIR, 0 );
m_World->SetBlock( Pos->x, Pos->y - 1, Pos->z, BlockID, 0 );
}
}
}
bool cSandSimulator::IsAllowedBlock( char a_BlockID )
{
return a_BlockID == E_BLOCK_SAND
|| a_BlockID == E_BLOCK_GRAVEL;
}
void cSandSimulator::AddBlock(int a_X, int a_Y, int a_Z)
{
Vector3i *Block = new Vector3i(a_X, a_Y, a_Z);
//check for duplicates
for( std::vector<Vector3i *>::iterator itr = m_Blocks->begin(); itr != m_Blocks->end(); ++itr )
{
Vector3i *Pos = *itr;
if( Pos->x == a_X && Pos->y == a_Y && Pos->z == a_Z )
return;
}
m_Blocks->push_back(Block);
}
bool cSandSimulator::IsPassable( char a_BlockID )
{
return a_BlockID == E_BLOCK_AIR
|| IsBlockWater(a_BlockID)
|| IsBlockLava(a_BlockID);
}

24
source/cSandSimulator.h Normal file
View File

@ -0,0 +1,24 @@
#pragma once
#include "cSimulator.h"
#include "cBlockEntity.h"
#include "vector"
class Vector3i;
class cWorld;
class cSandSimulator : public cSimulator
{
public:
cSandSimulator( cWorld* a_World );
~cSandSimulator();
virtual void Simulate( float a_Dt );
virtual inline bool IsAllowedBlock( char a_BlockID );
virtual inline bool IsPassable( char a_BlockID );
protected:
virtual void AddBlock(int a_X, int a_Y, int a_Z);
std::vector <Vector3i *> *m_Blocks;
std::vector <Vector3i *> *m_Buffer;
};

27
source/cSimulator.cpp Normal file
View File

@ -0,0 +1,27 @@
#include "cSimulator.h"
#include "cWorld.h"
#include "Vector3i.h"
#include "BlockID.h"
#include "Defines.h"
#include <vector>
cSimulator::cSimulator( cWorld* a_World )
: m_World(a_World)
{
}
cSimulator::~cSimulator()
{
}
void cSimulator::WakeUp( int a_X, int a_Y, int a_Z )
{
AddBlock( a_X, a_Y, a_Z );
AddBlock( a_X-1, a_Y, a_Z );
AddBlock( a_X+1, a_Y, a_Z );
AddBlock( a_X, a_Y-1, a_Z );
AddBlock( a_X, a_Y+1, a_Z );
AddBlock( a_X, a_Y, a_Z-1 );
AddBlock( a_X, a_Y, a_Z+1 );
}

20
source/cSimulator.h Normal file
View File

@ -0,0 +1,20 @@
#pragma once
class Vector3i;
class cWorld;
class cSimulator
{
public:
cSimulator( cWorld* a_World );
~cSimulator();
virtual void Simulate( float a_Dt ) = 0;
virtual inline void WakeUp( int a_X, int a_Y, int a_Z ); //Used often so inline saves some calls
virtual inline bool IsAllowedBlock( char a_BlockID ) = 0;
protected:
virtual void AddBlock(int a_X, int a_Y, int a_Z) = 0;
cWorld *m_World;
};

View File

@ -0,0 +1,38 @@
#include "cSimulatorManager.h"
#include <vector>
cSimulatorManager::cSimulatorManager()
{
}
cSimulatorManager::~cSimulatorManager()
{
}
void cSimulatorManager::Simulate( float a_Dt )
{
m_Ticks++;
for( std::vector <std::pair<cSimulator *, short> *>::iterator itr = m_Simulators.begin(); itr != m_Simulators.end(); ++itr )
{
if(m_Ticks % (*itr)->second == 0)
(*itr)->first->Simulate(a_Dt);
}
}
void cSimulatorManager::WakeUp(int a_X, int a_Y, int a_Z)
{
for( std::vector <std::pair<cSimulator *, short> *>::iterator itr = m_Simulators.begin(); itr != m_Simulators.end(); ++itr )
{
(*itr)->first->WakeUp(a_X, a_Y, a_Z);
}
}
void cSimulatorManager::RegisterSimulator(cSimulator *a_Simulator, short a_Rate)
{
//TODO needs some checking
std::pair<cSimulator *, short> *Pair = new std::pair<cSimulator *, short>(a_Simulator, a_Rate);
m_Simulators.push_back(Pair);
}

View File

@ -0,0 +1,20 @@
#pragma once
#include "cSimulator.h"
#include <vector>
class cSimulatorManager
{
public:
cSimulatorManager();
~cSimulatorManager();
void Simulate( float a_Dt );
void WakeUp(int a_X, int a_Y, int a_Z);
void RegisterSimulator(cSimulator *a_Simulator, short a_Rate);
protected:
std::vector <std::pair<cSimulator *, short> *> m_Simulators;
long long m_Ticks;
};

View File

@ -1,13 +1,16 @@
#include "cSquid.h" #include "cSquid.h"
#include "Vector3d.h"
cSquid::cSquid() cSquid::cSquid()
{ {
m_MobType = 94; m_MobType = 94;
GetMonsterConfig("Squid"); GetMonsterConfig("Squid");
m_NoWater = 0.f;
} }
cSquid::~cSquid() cSquid::~cSquid()
{ {
} }
bool cSquid::IsA( const char* a_EntityType ) bool cSquid::IsA( const char* a_EntityType )
@ -23,3 +26,25 @@ void cSquid::KilledBy( cEntity* a_Killer )
cMonster::KilledBy( a_Killer ); cMonster::KilledBy( a_Killer );
} }
void cSquid::Tick(float a_Dt)
{
cPassiveMonster::Tick(a_Dt);
Vector3d Pos = GetPosition();
//TODO Not a real behavior, but cool :D
if(!IsBlockWater(GetWorld()->GetBlock(Pos.x, Pos.y, Pos.z)))
{
//Die slowly Muhahaha :D (To prevent all this squids on the land :D)
m_NoWater += a_Dt;
if(m_NoWater > 1000.f)
{
m_NoWater -= 1000.f;
TakeDamage(1, this);
}
}
}

View File

@ -8,6 +8,11 @@ public:
cSquid(); cSquid();
~cSquid(); ~cSquid();
virtual void Tick(float a_Dt);
virtual bool IsA( const char* a_EntityType ); virtual bool IsA( const char* a_EntityType );
virtual void KilledBy( cEntity* a_Killer ); virtual void KilledBy( cEntity* a_Killer );
protected:
float m_NoWater;
}; };

View File

@ -13,8 +13,10 @@
#include "cRoot.h" #include "cRoot.h"
#include "../iniFile/iniFile.h" #include "../iniFile/iniFile.h"
#include "cChunkMap.h" #include "cChunkMap.h"
#include "cSimulatorManager.h"
#include "cWaterSimulator.h" #include "cWaterSimulator.h"
#include "cLavaSimulator.h" #include "cLavaSimulator.h"
#include "cSandSimulator.h"
#include "cChicken.h" #include "cChicken.h"
#include "cSpider.h" #include "cSpider.h"
#include "cCow.h" //cow #include "cCow.h" //cow
@ -119,6 +121,8 @@ cWorld::~cWorld()
} }
UnlockEntities(); UnlockEntities();
delete m_SimulatorManager;
delete m_SandSimulator;
delete m_WaterSimulator; delete m_WaterSimulator;
delete m_LavaSimulator; delete m_LavaSimulator;
@ -219,8 +223,20 @@ cWorld::cWorld( const char* a_WorldName )
m_EntitiesCriticalSection = new cCriticalSection(); m_EntitiesCriticalSection = new cCriticalSection();
m_ChunksCriticalSection = new cCriticalSection(); m_ChunksCriticalSection = new cCriticalSection();
//Simulators:
m_SimulatorManager = new cSimulatorManager();
m_WaterSimulator = new cWaterSimulator( this ); m_WaterSimulator = new cWaterSimulator( this );
m_SimulatorManager->RegisterSimulator(m_WaterSimulator, 6);
m_LavaSimulator = new cLavaSimulator( this ); m_LavaSimulator = new cLavaSimulator( this );
m_SimulatorManager->RegisterSimulator(m_LavaSimulator, 12);
m_SandSimulator = new cSandSimulator(this);
m_SimulatorManager->RegisterSimulator(m_SandSimulator, 1);
memset( g_BlockLightValue, 0x0, 128 ); memset( g_BlockLightValue, 0x0, 128 );
memset( g_BlockSpreadLightFalloff, 0xf, 128 ); // 0xf means total falloff memset( g_BlockSpreadLightFalloff, 0xf, 128 ); // 0xf means total falloff
@ -407,10 +423,9 @@ void cWorld::Tick(float a_Dt)
} }
m_ChunkMap->Tick(a_Dt); m_ChunkMap->Tick(a_Dt);
if( CurrentTick % 6 == 0 )
m_WaterSimulator->Simulate(a_Dt); GetSimulatorManager()->Simulate(a_Dt);
if( CurrentTick % 12 == 0 )
m_LavaSimulator->Simulate(a_Dt);
UnlockChunks(); UnlockChunks();
MTRand r1; MTRand r1;
@ -700,8 +715,7 @@ cChunk* cWorld::GetChunkOfBlock( int a_X, int a_Y, int a_Z )
void cWorld::SetBlock( int a_X, int a_Y, int a_Z, char a_BlockType, char a_BlockMeta ) void cWorld::SetBlock( int a_X, int a_Y, int a_Z, char a_BlockType, char a_BlockMeta )
{ {
m_WaterSimulator->WakeUp( a_X, a_Y, a_Z ); this->GetSimulatorManager()->WakeUp(a_X, a_Y, a_Z);
m_LavaSimulator->WakeUp( a_X, a_Y, a_Z );
int ChunkX, ChunkY, ChunkZ; int ChunkX, ChunkY, ChunkZ;
AbsoluteToRelative( a_X, a_Y, a_Z, ChunkX, ChunkY, ChunkZ ); AbsoluteToRelative( a_X, a_Y, a_Z, ChunkX, ChunkY, ChunkZ );
@ -785,8 +799,8 @@ bool cWorld::DigBlock( int a_X, int a_Y, int a_Z, cItem & a_PickupItem )
if(DestChunk) if(DestChunk)
{ {
DestChunk->SetBlock(PosX, PosY, PosZ, E_BLOCK_AIR, 0 ); DestChunk->SetBlock(PosX, PosY, PosZ, E_BLOCK_AIR, 0 );
m_WaterSimulator->WakeUp( a_X, a_Y, a_Z );
m_LavaSimulator->WakeUp( a_X, a_Y, a_Z ); GetSimulatorManager()->WakeUp(a_X, a_Y, a_Z);
if( !a_PickupItem.IsEmpty() ) if( !a_PickupItem.IsEmpty() )
{ {

View File

@ -12,10 +12,13 @@ enum ENUM_ITEM_ID;
#include <vector> #include <vector>
#include <string> #include <string>
#include "cSimulatorManager.h"
class cPacket; class cPacket;
class cRedstone; class cRedstone;
class cWaterSimulator; class cWaterSimulator;
class cLavaSimulator; class cLavaSimulator;
class cSandSimulator;
class cChunkMap; class cChunkMap;
class cItem; class cItem;
class cCriticalSection; class cCriticalSection;
@ -24,6 +27,8 @@ class cClientHandle;
class cChunk; class cChunk;
class cEntity; class cEntity;
class cBlockEntity; class cBlockEntity;
class cWorld //tolua_export class cWorld //tolua_export
{ //tolua_export { //tolua_export
public: public:
@ -92,8 +97,9 @@ public:
const double & GetSpawnY(); //tolua_export const double & GetSpawnY(); //tolua_export
const double & GetSpawnZ() { return m_SpawnZ; } //tolua_export const double & GetSpawnZ() { return m_SpawnZ; } //tolua_export
cWaterSimulator *GetWaterSimulator() { return m_WaterSimulator; } inline cSimulatorManager *GetSimulatorManager() { return m_SimulatorManager; }
cLavaSimulator *GetLavaSimulator() { return m_LavaSimulator; } inline cWaterSimulator *GetWaterSimulator() { return m_WaterSimulator; }
inline cLavaSimulator *GetLavaSimulator() { return m_LavaSimulator; }
cBlockEntity* GetBlockEntity( int a_X, int a_Y, int a_Z ); //tolua_export cBlockEntity* GetBlockEntity( int a_X, int a_Y, int a_Z ); //tolua_export
@ -173,9 +179,12 @@ private:
int m_GameMode; int m_GameMode;
float m_WorldTimeFraction; // When this > 1.f m_WorldTime is incremented by 20 float m_WorldTimeFraction; // When this > 1.f m_WorldTime is incremented by 20
cSimulatorManager *m_SimulatorManager;
cSandSimulator *m_SandSimulator;
cWaterSimulator* m_WaterSimulator; cWaterSimulator* m_WaterSimulator;
cLavaSimulator* m_LavaSimulator; cLavaSimulator* m_LavaSimulator;
cCriticalSection* m_ClientHandleCriticalSection; cCriticalSection* m_ClientHandleCriticalSection;
cCriticalSection* m_EntitiesCriticalSection; cCriticalSection* m_EntitiesCriticalSection;
cCriticalSection* m_ChunksCriticalSection; cCriticalSection* m_ChunksCriticalSection;