2011-12-25 08:20:06 -08:00
# pragma once
2011-12-26 12:57:12 -08:00
# include "cSimulator.h"
2012-02-14 05:37:13 -08:00
# include "Vector3i.h"
2011-12-26 12:57:12 -08:00
2011-12-25 08:20:06 -08:00
//TODO This definitly needs a better naming :D but how?
enum Direction
{
X_PLUS ,
X_MINUS ,
Y_PLUS ,
Y_MINUS ,
Z_PLUS ,
Z_MINUS ,
NONE
} ;
class Vector3i ;
class cWorld ;
2011-12-26 12:57:12 -08:00
class cFluidSimulator : public cSimulator
2011-12-25 08:20:06 -08:00
{
public :
cFluidSimulator ( cWorld * a_World ) ;
~ cFluidSimulator ( ) ;
virtual void Simulate ( float a_Dt ) ;
//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 ) ;
2012-02-02 04:43:30 -08:00
virtual bool IsAllowedBlock ( char a_BlockID ) = 0 ;
2012-02-14 05:37:13 -08:00
virtual bool IsStationaryBlock ( char a_BlockID ) ;
2012-02-02 04:43:30 -08:00
virtual bool IsPassableForFluid ( char a_BlockID ) ;
2012-01-23 07:11:45 -08:00
bool CanWashAway ( char a_BlockID ) ;
2012-02-14 05:37:13 -08:00
bool IsSolidBlock ( char a_BlockID ) ;
2011-12-25 08:20:06 -08:00
protected :
2011-12-26 12:57:12 -08:00
virtual void AddBlock ( int a_X , int a_Y , int a_Z ) ;
2011-12-25 08:20:06 -08:00
char GetHighestLevelAround ( int a_X , int a_Y , int a_Z ) ;
2012-02-14 05:37:13 -08:00
bool UniqueSituation ( Vector3i a_Pos ) ; //Applys special for this fluid rules like generation of water betwin sources, returns false if it is necessary to apply general rules
void ApplyUniqueToNearest ( Vector3i a_Pos ) ;
2011-12-25 08:20:06 -08:00
float m_Timer ;
class FluidData ;
FluidData * m_Data ;
//Customize
char m_FluidBlock ;
2012-02-14 05:37:13 -08:00
char m_StationaryFluidBlock ;
2011-12-25 08:20:06 -08:00
char m_MaxHeight ;
char m_FlowReduction ;
} ;