Patch with diff file created by Sebi (implemented some stuff like lava physics, drops are deleted when in lava, water is now slower, lava gives actual damage etc.). Pistons now work mostly as they should. They do not yet show the motion animation and do not emit sound. They do extend, push, and retract as they should though. Right now the only way to activate a piston is to light redstone wire adjacent to it with a redstone torch.
git-svn-id: http://mc-server.googlecode.com/svn/trunk@67 0a769ca7-a7f5-676a-18bf-c427514a06d6
This commit is contained in:
parent
6df50b40ee
commit
36f7084e3f
@ -244,6 +244,7 @@
|
||||
<ClCompile Include="..\Source\cGroupManager.cpp" />
|
||||
<ClCompile Include="..\Source\cHeartBeat.cpp" />
|
||||
<ClCompile Include="..\source\cItem.cpp" />
|
||||
<ClCompile Include="..\source\cLavaSimulator.cpp" />
|
||||
<ClCompile Include="..\Source\cLuaCommandBinder.cpp" />
|
||||
<ClCompile Include="..\source\cMakeDir.cpp" />
|
||||
<ClCompile Include="..\source\cMCLogger.cpp" />
|
||||
@ -373,6 +374,7 @@
|
||||
<ClInclude Include="..\Source\cGroupManager.h" />
|
||||
<ClInclude Include="..\Source\cHeartBeat.h" />
|
||||
<ClInclude Include="..\Source\cLadder.h" />
|
||||
<ClInclude Include="..\source\cLavaSimulator.h" />
|
||||
<ClInclude Include="..\Source\cLuaCommandBinder.h" />
|
||||
<ClInclude Include="..\source\cMakeDir.h" />
|
||||
<ClInclude Include="..\source\cMCLogger.h" />
|
||||
|
@ -382,6 +382,9 @@
|
||||
<Filter Include="cPiston">
|
||||
<UniqueIdentifier>{4f551776-009b-4f05-8ab8-748b82279a67}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="cLavaSimulator">
|
||||
<UniqueIdentifier>{b0401fd9-4021-4ab7-bf61-c8de112b4196}</UniqueIdentifier>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\source\cServer.cpp">
|
||||
@ -766,6 +769,9 @@
|
||||
<ClCompile Include="..\source\cPiston.cpp">
|
||||
<Filter>cPiston</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\source\cLavaSimulator.cpp">
|
||||
<Filter>cLavaSimulator</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\source\cServer.h">
|
||||
@ -1185,6 +1191,9 @@
|
||||
<ClInclude Include="..\source\cPiston.h">
|
||||
<Filter>cPiston</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\source\cLavaSimulator.h">
|
||||
<Filter>cLavaSimulator</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="..\source\AllToLua.pkg">
|
||||
|
6
makefile
6
makefile
@ -223,6 +223,7 @@ MCServer : \
|
||||
build/iniFile.o\
|
||||
build/cSocket.o\
|
||||
build/cWaterSimulator.o\
|
||||
build/cLavaSimulator.o\
|
||||
build/cFileFormatUpdater.o\
|
||||
build/cItem.o
|
||||
$(CC) $(LNK_OPTIONS) \
|
||||
@ -410,6 +411,7 @@ MCServer : \
|
||||
build/iniFile.o\
|
||||
build/cSocket.o\
|
||||
build/cWaterSimulator.o\
|
||||
build/cLavaSimulator.o\
|
||||
build/cFileFormatUpdater.o\
|
||||
build/cItem.o\
|
||||
-o MCServer
|
||||
@ -600,6 +602,7 @@ clean :
|
||||
build/iniFile.o\
|
||||
build/cSocket.o\
|
||||
build/cWaterSimulator.o\
|
||||
build/cLavaSimulator.o\
|
||||
build/cFileFormatUpdater.o\
|
||||
build/cItem.o\
|
||||
MCServer
|
||||
@ -1380,6 +1383,9 @@ build/cSocket.o : source/cSocket.cpp
|
||||
build/cWaterSimulator.o : source/cWaterSimulator.cpp
|
||||
$(CC) $(CC_OPTIONS) source/cWaterSimulator.cpp -c $(INCLUDE) -o build/cWaterSimulator.o
|
||||
|
||||
build/cLavaSimulator.o : source/cLavaSimulator.cpp
|
||||
$(CC) $(CC_OPTIONS) source/cLavaSimulator.cpp -c $(INCLUDE) -o build/cLavaSimulator.o
|
||||
|
||||
build/cFileFormatUpdater.o : source/cFileFormatUpdater.cpp
|
||||
$(CC) $(CC_OPTIONS) source/cFileFormatUpdater.cpp -c $(INCLUDE) -o build/cFileFormatUpdater.o
|
||||
|
||||
|
@ -22,7 +22,7 @@ protected:
|
||||
public:
|
||||
virtual ~cBlockEntity() {};
|
||||
virtual void Destroy() {};
|
||||
|
||||
|
||||
int GetPosX() { return m_PosX; }
|
||||
int GetPosY() { return m_PosY; }
|
||||
int GetPosZ() { return m_PosZ; }
|
||||
|
@ -337,7 +337,7 @@ void cChunk::Tick(float a_Dt)
|
||||
case E_BLOCK_GRASS:
|
||||
{
|
||||
char AboveBlock = GetBlock( Index+1 );
|
||||
if (!( (AboveBlock == 0) || (g_BlockOneHitDig[AboveBlock]) ) ) //changed to not allow grass if any one hit object is on top
|
||||
if (!( (AboveBlock == 0) || (g_BlockOneHitDig[AboveBlock]) || (g_BlockTransparent[AboveBlock]) ) ) //changed to not allow grass if any one hit object is on top
|
||||
{
|
||||
FastSetBlock( m_BlockTickX, m_BlockTickY, m_BlockTickZ, E_BLOCK_DIRT, GetLight( m_BlockMeta, Index ) );
|
||||
}
|
||||
@ -687,13 +687,13 @@ void cChunk::SpreadLight(char* a_LightBuffer)
|
||||
|
||||
float GetNoise( float x, float y, cNoise & a_Noise )
|
||||
{
|
||||
float oct1 = a_Noise.SSE_CubicNoise2D( x*cGenSettings::HeightFreq1, y*cGenSettings::HeightFreq1 )*cGenSettings::HeightAmp1;
|
||||
float oct2 = a_Noise.SSE_CubicNoise2D( x*cGenSettings::HeightFreq2, y*cGenSettings::HeightFreq2 )*cGenSettings::HeightAmp2;
|
||||
float oct3 = a_Noise.SSE_CubicNoise2D( x*cGenSettings::HeightFreq3, y*cGenSettings::HeightFreq3 )*cGenSettings::HeightAmp3;
|
||||
float oct1 = a_Noise.CubicNoise2D( x*cGenSettings::HeightFreq1, y*cGenSettings::HeightFreq1 )*cGenSettings::HeightAmp1;
|
||||
float oct2 = a_Noise.CubicNoise2D( x*cGenSettings::HeightFreq2, y*cGenSettings::HeightFreq2 )*cGenSettings::HeightAmp2;
|
||||
float oct3 = a_Noise.CubicNoise2D( x*cGenSettings::HeightFreq3, y*cGenSettings::HeightFreq3 )*cGenSettings::HeightAmp3;
|
||||
|
||||
float height = a_Noise.SSE_CubicNoise2D( x*0.1f, y*0.1f )*2;
|
||||
float height = a_Noise.CubicNoise2D( x*0.1f, y*0.1f )*2;
|
||||
|
||||
float flatness = ((a_Noise.SSE_CubicNoise2D( x*0.5f, y*0.5f ) + 1.f ) * 0.5f) * 1.1f; // 0 ... 1.5
|
||||
float flatness = ((a_Noise.CubicNoise2D( x*0.5f, y*0.5f ) + 1.f ) * 0.5f) * 1.1f; // 0 ... 1.5
|
||||
flatness *= flatness * flatness;
|
||||
|
||||
return (oct1 + oct2 + oct3) * flatness + height;
|
||||
@ -845,8 +845,8 @@ void cChunk::GenerateTerrain()
|
||||
// int yy = TopY;
|
||||
int zz = z + m_PosZ*16;
|
||||
|
||||
float val1 = m_Noise.SSE_CubicNoise2D( xx*0.1f, zz*0.1f );
|
||||
float val2 = m_Noise.SSE_CubicNoise2D( xx*0.01f, zz*0.01f );
|
||||
float val1 = m_Noise.CubicNoise2D( xx*0.1f, zz*0.1f );
|
||||
float val2 = m_Noise.CubicNoise2D( xx*0.01f, zz*0.01f );
|
||||
if( m_BlockType[index] == SandID )
|
||||
{
|
||||
if( (val1 + val2 > 0.f) && (rand()%128) > 124 && m_BlockType[index] == E_BLOCK_SAND )
|
||||
@ -861,8 +861,8 @@ void cChunk::GenerateTerrain()
|
||||
}
|
||||
else if( m_BlockType[index] == GrassID )
|
||||
{
|
||||
float val3 = m_Noise.SSE_CubicNoise2D( xx*0.01f+10, zz*0.01f+10 );
|
||||
float val4 = m_Noise.SSE_CubicNoise2D( xx*0.05f+20, zz*0.05f+20 );
|
||||
float val3 = m_Noise.CubicNoise2D( xx*0.01f+10, zz*0.01f+10 );
|
||||
float val4 = m_Noise.CubicNoise2D( xx*0.05f+20, zz*0.05f+20 );
|
||||
if( val1 + val2 > 0.2f && (rand()%128) > 124 )
|
||||
m_World->GrowTree( xx, TopY, zz );
|
||||
else if( val3 > 0.2f && (rand()%128) > 124 )
|
||||
|
@ -523,7 +523,6 @@ void cClientHandle::HandlePacket( cPacket* a_Packet )
|
||||
{
|
||||
if( World->DigBlock( PacketData->m_PosX, PacketData->m_PosY, PacketData->m_PosZ, PickupItem ) )
|
||||
{
|
||||
printf("OldBlock,E_BLOCK_REDSTONE_TORCH_ON: %i,%i\n", OldBlock, E_BLOCK_REDSTONE_TORCH_ON );
|
||||
if (OldBlock == E_BLOCK_REDSTONE_TORCH_ON) {
|
||||
cRedstone Redstone(World);
|
||||
Redstone.cRedstone::ChangeRedstoneTorch( PacketData->m_PosX, PacketData->m_PosY, PacketData->m_PosZ, false );
|
||||
@ -767,9 +766,9 @@ void cClientHandle::HandlePacket( cPacket* a_Packet )
|
||||
|
||||
//if( GetBlock( X, Y+1, Z ) == E_BLOCK_AIR )
|
||||
if( g_BlockTransparent[ (int)m_Player->GetWorld()->GetBlock( PacketData->m_PosX, PacketData->m_PosY+2, PacketData->m_PosZ ) ] == true ) {//if block above is transparent
|
||||
printf("transparent above me\n");
|
||||
//printf("transparent above me\n");
|
||||
} else {
|
||||
printf("transparent not above me\n");
|
||||
//printf("transparent not above me\n");
|
||||
}
|
||||
|
||||
cRedstone Redstone(m_Player->GetWorld());
|
||||
@ -1051,11 +1050,10 @@ void cClientHandle::Tick(float a_Dt)
|
||||
// Send health
|
||||
Send( cPacket_UpdateHealth( (short)m_Player->GetHealth() ) );
|
||||
|
||||
//quick bugfix to prevent players from spawning in ground
|
||||
//m_Player->TeleportTo( m_Player->GetPosX(), m_Player->GetPosY()+1, m_Player->GetPosZ() );
|
||||
|
||||
World->UnlockEntities();
|
||||
m_Player->TeleportTo( m_Player->GetPosX(), m_Player->GetPosY()+1, m_Player->GetPosZ() );
|
||||
|
||||
//quick bugfix to prevent players from spawning in ground
|
||||
m_Player->TeleportTo( m_Player->GetPosX(), m_Player->GetPosY()+2, m_Player->GetPosZ() );
|
||||
}
|
||||
}
|
||||
|
||||
|
216
source/cLavaSimulator.cpp
Normal file
216
source/cLavaSimulator.cpp
Normal file
@ -0,0 +1,216 @@
|
||||
#include "cLavaSimulator.h"
|
||||
#include "cWorld.h"
|
||||
#include "Vector3i.h"
|
||||
#include "BlockID.h"
|
||||
#include <vector>
|
||||
|
||||
class cLavaSimulator::LavaData
|
||||
{
|
||||
public:
|
||||
LavaData( cWorld* a_World )
|
||||
: m_ActiveLava( new std::vector< Vector3i >() )
|
||||
, m_Buffer( new std::vector< Vector3i >() )
|
||||
, m_World( a_World )
|
||||
{}
|
||||
|
||||
std::vector< Vector3i > GetLowestPoints( int a_X, int a_Y, int a_Z )
|
||||
{
|
||||
std::vector< Vector3i > Points;
|
||||
if( m_World->GetBlock(a_X, a_Y-1, a_Z) == E_BLOCK_AIR )
|
||||
{
|
||||
Points.push_back( Vector3i( a_X, a_Y-1, a_Z ) );
|
||||
return Points;
|
||||
}
|
||||
|
||||
Vector3i LowerPoints [] = {
|
||||
Vector3i( a_X-1, a_Y-1, a_Z ),
|
||||
Vector3i( a_X+1, a_Y-1, a_Z ),
|
||||
Vector3i( a_X, a_Y-1, a_Z-1 ),
|
||||
Vector3i( a_X, a_Y-1, a_Z+1 ),
|
||||
};
|
||||
bool bLavaFound = false;
|
||||
for( int i = 0; i < 4; ++i )
|
||||
{
|
||||
char Block1 = m_World->GetBlock( LowerPoints[i].x, LowerPoints[i].y, LowerPoints[i].z );
|
||||
char Block2 = m_World->GetBlock( LowerPoints[i].x, a_Y, LowerPoints[i].z );
|
||||
if( Block1 == E_BLOCK_AIR && Block2 == E_BLOCK_AIR )
|
||||
{
|
||||
Points.push_back( LowerPoints[i] );
|
||||
LowerPoints[i].y = a_Y;
|
||||
Points.push_back( LowerPoints[i] );
|
||||
}
|
||||
else if( (Block2 == E_BLOCK_LAVA || Block2 == E_BLOCK_STATIONARY_LAVA ) && ( Block1 == E_BLOCK_AIR || Block1 == E_BLOCK_LAVA || Block1 == E_BLOCK_STATIONARY_LAVA ) )
|
||||
{
|
||||
bLavaFound = true;
|
||||
}
|
||||
}
|
||||
|
||||
if( Points.size() == 0 && !bLavaFound )
|
||||
{
|
||||
Vector3i LevelPoints [] = {
|
||||
Vector3i( a_X-1, a_Y, a_Z ),
|
||||
Vector3i( a_X+1, a_Y, a_Z ),
|
||||
Vector3i( a_X, a_Y, a_Z-1 ),
|
||||
Vector3i( a_X, a_Y, a_Z+1 ),
|
||||
};
|
||||
for( int i = 0; i < 4; ++i )
|
||||
{
|
||||
char Block = m_World->GetBlock( LevelPoints[i].x, a_Y, LevelPoints[i].z );
|
||||
if( Block == E_BLOCK_AIR || Block == E_BLOCK_LAVA || Block == E_BLOCK_STATIONARY_LAVA )
|
||||
Points.push_back( LevelPoints[i] );
|
||||
}
|
||||
}
|
||||
return Points;
|
||||
}
|
||||
|
||||
std::vector< Vector3i >* m_ActiveLava;
|
||||
std::vector< Vector3i >* m_Buffer;
|
||||
cWorld* m_World;
|
||||
};
|
||||
|
||||
cLavaSimulator::cLavaSimulator( cWorld* a_World )
|
||||
: m_World( a_World )
|
||||
, m_Data( new LavaData( a_World ) )
|
||||
{
|
||||
}
|
||||
|
||||
cLavaSimulator::~cLavaSimulator()
|
||||
{
|
||||
}
|
||||
|
||||
void cLavaSimulator::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 cLavaSimulator::AddBlock( int a_X, int a_Y, int a_Z )
|
||||
{
|
||||
// Check for duplicates
|
||||
std::vector< Vector3i > & ActiveLava = *m_Data->m_ActiveLava;
|
||||
for( std::vector< Vector3i >::iterator itr = ActiveLava.begin(); itr != ActiveLava.end(); ++itr )
|
||||
{
|
||||
Vector3i & pos = *itr;
|
||||
if( pos.x == a_X && pos.y == a_Y && pos.z == a_Z )
|
||||
return;
|
||||
}
|
||||
|
||||
ActiveLava.push_back( Vector3i( a_X, a_Y, a_Z ) );
|
||||
}
|
||||
|
||||
char cLavaSimulator::GetHighestLevelAround( int a_X, int a_Y, int a_Z )
|
||||
{
|
||||
char Max = 8;
|
||||
#define __HIGHLEVEL_CHECK__( x, y, z ) \
|
||||
if( IsLavaBlock( m_World->GetBlock( x, y, z ) ) ) \
|
||||
{ \
|
||||
char Meta; \
|
||||
if( (Meta = m_World->GetBlockMeta( x, y, z ) ) < Max ) Max = Meta; \
|
||||
else if( Meta == 8 ) Max = 0; \
|
||||
if( Max == 0 ) return 0; \
|
||||
}
|
||||
|
||||
__HIGHLEVEL_CHECK__( a_X-1, a_Y, a_Z );
|
||||
__HIGHLEVEL_CHECK__( a_X+1, a_Y, a_Z );
|
||||
__HIGHLEVEL_CHECK__( a_X, a_Y, a_Z-1 );
|
||||
__HIGHLEVEL_CHECK__( a_X, a_Y, a_Z+1 );
|
||||
|
||||
return Max;
|
||||
}
|
||||
|
||||
void cLavaSimulator::Simulate( float a_Dt )
|
||||
{
|
||||
m_Timer += a_Dt;
|
||||
|
||||
std::swap( m_Data->m_ActiveLava, m_Data->m_Buffer ); // Swap so blocks can be added to empty ActiveLava array
|
||||
m_Data->m_ActiveLava->clear();
|
||||
|
||||
std::vector< Vector3i > & LavaBlocks = *m_Data->m_Buffer;
|
||||
for( std::vector< Vector3i >::iterator itr = LavaBlocks.begin(); itr != LavaBlocks.end(); ++itr )
|
||||
{
|
||||
Vector3i & pos = *itr;
|
||||
char BlockID = m_World->GetBlock( pos.x, pos.y, pos.z );
|
||||
if( IsLavaBlock( BlockID ) ) // only care about lava
|
||||
{
|
||||
bool bIsFed = false;
|
||||
char Meta = m_World->GetBlockMeta( pos.x, pos.y, pos.z );
|
||||
char Feed = Meta;
|
||||
if( Meta == 8 ) // Falling lava
|
||||
{
|
||||
if( IsLavaBlock( m_World->GetBlock(pos.x, pos.y+1, pos.z) ) ) // Block above is lava
|
||||
{
|
||||
bIsFed = true;
|
||||
Meta = 0; // Make it a full block
|
||||
}
|
||||
}
|
||||
else if( Meta <= 2 )
|
||||
{
|
||||
bIsFed = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if( (Feed = GetHighestLevelAround( pos.x, pos.y, pos.z )) < Meta )
|
||||
bIsFed = true;
|
||||
}
|
||||
|
||||
|
||||
if( bIsFed )
|
||||
{
|
||||
char DownID = m_World->GetBlock( pos.x, pos.y-1, pos.z );
|
||||
if( DownID == E_BLOCK_AIR || IsLavaBlock( DownID ) ) // free for Lava
|
||||
{
|
||||
m_World->FastSetBlock( pos.x, pos.y-1, pos.z, E_BLOCK_LAVA, 8 ); // falling
|
||||
AddBlock( pos.x, pos.y-1, pos.z );
|
||||
}
|
||||
else // Not falling Lava
|
||||
{
|
||||
if( Feed+2 < Meta )
|
||||
{
|
||||
m_World->FastSetBlock( pos.x, pos.y, pos.z, E_BLOCK_LAVA, Feed+2 );
|
||||
AddBlock( pos.x, pos.y, pos.z );
|
||||
}
|
||||
else if( Meta < 6 ) // 7 is only 1 unit high, so it cannot spread, lower than 7 can though.
|
||||
{
|
||||
std::vector< Vector3i > Points = m_Data->GetLowestPoints( pos.x, pos.y, pos.z );
|
||||
for( std::vector< Vector3i >::iterator itr = Points.begin(); itr != Points.end(); ++itr )
|
||||
{
|
||||
Vector3i & p = *itr;
|
||||
char BlockID = m_World->GetBlock( p.x, p.y, p.z );
|
||||
if( !IsLavaBlock( BlockID ) )
|
||||
{
|
||||
if( p.y == pos.y )
|
||||
m_World->FastSetBlock(p.x, p.y, p.z, E_BLOCK_LAVA, Meta+2);
|
||||
else
|
||||
m_World->FastSetBlock(p.x, p.y, p.z, E_BLOCK_LAVA, 8);
|
||||
AddBlock( p.x, p.y, p.z );
|
||||
}
|
||||
else // it's Lava
|
||||
{
|
||||
char PointMeta = m_World->GetBlockMeta( p.x, p.y, p.z );
|
||||
if( PointMeta > Meta+2 )
|
||||
{
|
||||
AddBlock( p.x, p.y, p.z );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else // not fed
|
||||
{
|
||||
m_World->FastSetBlock( pos.x, pos.y, pos.z, E_BLOCK_AIR, 0 );
|
||||
WakeUp( pos.x, pos.y, pos.z );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool cLavaSimulator::IsLavaBlock( char a_BlockID )
|
||||
{
|
||||
return a_BlockID == E_BLOCK_LAVA || a_BlockID == E_BLOCK_STATIONARY_LAVA;
|
||||
}
|
25
source/cLavaSimulator.h
Normal file
25
source/cLavaSimulator.h
Normal file
@ -0,0 +1,25 @@
|
||||
#pragma once
|
||||
|
||||
class Vector3i;
|
||||
class cWorld;
|
||||
class cLavaSimulator
|
||||
{
|
||||
public:
|
||||
cLavaSimulator( cWorld* a_World );
|
||||
~cLavaSimulator();
|
||||
|
||||
void Simulate( float a_Dt );
|
||||
void WakeUp( int a_X, int a_Y, int a_Z );
|
||||
|
||||
private:
|
||||
void AddBlock( int a_X, int a_Y, int a_Z);
|
||||
char GetHighestLevelAround( int a_X, int a_Y, int a_Z );
|
||||
|
||||
bool IsLavaBlock( char a_BlockID );
|
||||
|
||||
float m_Timer;
|
||||
cWorld* m_World;
|
||||
|
||||
class LavaData;
|
||||
LavaData* m_Data;
|
||||
};
|
@ -474,22 +474,22 @@ void cMonster::InStateIdle(float a_Dt) {
|
||||
void cMonster::InStateBurning(float a_Dt) {
|
||||
m_FireDamageInterval += a_Dt;
|
||||
char block = GetWorld()->GetBlock( (int)m_Pos->x, (int)m_Pos->y, (int)m_Pos->z );
|
||||
char bblock = GetWorld()->GetBlock( (int)m_Pos->x, (int)m_Pos->y -1, (int)m_Pos->z );
|
||||
char bblock = GetWorld()->GetBlock( (int)m_Pos->x, (int)m_Pos->y +1, (int)m_Pos->z );
|
||||
if(m_FireDamageInterval > 1) {
|
||||
|
||||
m_FireDamageInterval = 0;
|
||||
int rem = rand()%3 + 1; //Burn most of the time
|
||||
if(rem >= 2) {
|
||||
//printf("OUCH burning!!!\n");
|
||||
TakeDamage(1, this);
|
||||
}
|
||||
TakeDamage(1, this);
|
||||
|
||||
m_BurnPeriod++;
|
||||
if(block == E_BLOCK_LAVA || block == E_BLOCK_STATIONARY_LAVA || block == E_BLOCK_FIRE
|
||||
|| bblock == E_BLOCK_LAVA || bblock == E_BLOCK_STATIONARY_LAVA || bblock == E_BLOCK_FIRE)
|
||||
|| bblock == E_BLOCK_LAVA || bblock == E_BLOCK_STATIONARY_LAVA || bblock == E_BLOCK_FIRE) {
|
||||
m_BurnPeriod = 0;
|
||||
TakeDamage(6, this);
|
||||
}else{
|
||||
TakeDamage(1, this);
|
||||
}
|
||||
|
||||
if(m_BurnPeriod > 5) {
|
||||
|
||||
if(m_BurnPeriod > 8) {
|
||||
cChunk* InChunk = GetWorld()->GetChunkUnreliable( m_ChunkX, m_ChunkY, m_ChunkZ );
|
||||
m_EMMetaState = NORMAL;
|
||||
cPacket_Metadata md(NORMAL, GetUniqueID());
|
||||
|
@ -125,7 +125,8 @@ void cPickup::Tick(float a_Dt)
|
||||
return;
|
||||
}
|
||||
|
||||
HandlePhysics( a_Dt );
|
||||
if(!m_bCollected)
|
||||
HandlePhysics( a_Dt );
|
||||
|
||||
if( !m_bReplicated || m_bDirtyPosition )
|
||||
{
|
||||
@ -148,14 +149,18 @@ void cPickup::HandlePhysics(float a_Dt)
|
||||
if( m_bOnGround ) // check if it's still on the ground
|
||||
{
|
||||
cWorld* World = GetWorld();
|
||||
int BlockX = (int)m_Pos->x;
|
||||
if( m_Pos->x < 0 ) BlockX--;
|
||||
int BlockZ = (int)m_Pos->z;
|
||||
if( m_Pos->z < 0 ) BlockZ--;
|
||||
int BlockX = (m_Pos->x)<0 ? (int)m_Pos->x-1 : (int)m_Pos->x;
|
||||
int BlockZ = (m_Pos->z)<0 ? (int)m_Pos->z-1 : (int)m_Pos->z;
|
||||
if( World->GetBlock( BlockX, (int)m_Pos->y -1, BlockZ ) == E_BLOCK_AIR )
|
||||
{
|
||||
m_bOnGround = false;
|
||||
}
|
||||
char block = World->GetBlock( BlockX, (int)m_Pos->y - (int)m_bOnGround, BlockZ );
|
||||
if( block == E_BLOCK_STATIONARY_LAVA || block == E_BLOCK_LAVA ) {
|
||||
m_bCollected = true;
|
||||
m_Timer = 0;
|
||||
return;
|
||||
}
|
||||
if( World->GetBlock( BlockX, (int)m_Pos->y, BlockZ ) != E_BLOCK_AIR ) // If in ground itself, push it out
|
||||
{
|
||||
m_bOnGround = true;
|
||||
@ -211,7 +216,7 @@ void cPickup::HandlePhysics(float a_Dt)
|
||||
bool cPickup::CollectedBy( cPlayer* a_Dest )
|
||||
{
|
||||
if(m_bCollected) return false; // It's already collected!
|
||||
if(m_Timer < 1000.f) return false; // Not old enough
|
||||
if(m_Timer < 800.f) return false; // Not old enough
|
||||
|
||||
if( cRoot::Get()->GetPluginManager()->CallHook( cPluginManager::E_PLUGIN_COLLECT_ITEM, 2, this, a_Dest ) ) return false;
|
||||
|
||||
|
@ -14,76 +14,67 @@ void cPiston::ExtendPiston( int pistx, int pisty, int pistz )
|
||||
//cWorld* World = cRoot::Get()->GetWorld();
|
||||
char metadata = 0;
|
||||
char extmetadata = 0;
|
||||
int FirstFluidBlock = 0;
|
||||
int FirstFluidBlock = 0;
|
||||
char piston;
|
||||
|
||||
piston = m_World->GetBlock( pistx, pisty, pistz );
|
||||
|
||||
printf("psPiston1\n");
|
||||
|
||||
if ( piston == E_BLOCK_STICKY_PISTON ) {
|
||||
printf("psPiston2\n");
|
||||
extmetadata = 8;
|
||||
}//if sticky piston than top nibble bit is set to 1;
|
||||
|
||||
}//if sticky piston than top nibble's bit is set to 1;
|
||||
|
||||
if ( ( piston == E_BLOCK_STICKY_PISTON ) || ( piston == E_BLOCK_PISTON ) ) {
|
||||
metadata = m_World->GetBlockMeta( pistx, pisty, pistz);
|
||||
printf("psPiston3\n");
|
||||
printf("metadata %c\n",metadata);
|
||||
|
||||
if (metadata < 5) { //piston not extended
|
||||
|
||||
printf("metadata %c\n",metadata);
|
||||
metadata -= 8; //removing 8 from retracts it
|
||||
switch (metadata) {
|
||||
if ((int)metadata < 6) { //piston not extended
|
||||
switch ((int)metadata) {
|
||||
case 0:
|
||||
FirstFluidBlock = FindFluidBlock ( pistx, pisty, pistz, pistx, pisty-16, pistz );
|
||||
FirstFluidBlock = FindFluidBlock ( pistx, pisty-1, pistz, pistx, pisty-16, pistz );
|
||||
if (FirstFluidBlock > 0) {
|
||||
ChainMove ( pistx, pisty, pistz, pistx, pisty-FirstFluidBlock, pistz );
|
||||
}
|
||||
m_World->FastSetBlock( pistx, pisty, pistz, piston, (char)metadata + 8 );
|
||||
m_World->FastSetBlock( pistx, pisty-1, pistz, E_BLOCK_PISTON_EXTENSION, extmetadata );
|
||||
m_World->SetBlock( pistx, pisty-1, pistz, E_BLOCK_PISTON_EXTENSION, extmetadata );
|
||||
break;
|
||||
case 1:
|
||||
FirstFluidBlock = FindFluidBlock (pistx, pisty, pistz, pistx, pisty+16, pistz);
|
||||
if (FirstFluidBlock > 0) {
|
||||
ChainMove ( pistx, pisty, pistz, pistx, pisty+FirstFluidBlock, pistz );
|
||||
}
|
||||
FirstFluidBlock = FindFluidBlock (pistx, pisty+1, pistz, pistx, pisty+16, pistz);
|
||||
if (FirstFluidBlock > 0) {
|
||||
ChainMove ( pistx, pisty, pistz, pistx, pisty+FirstFluidBlock, pistz );
|
||||
}
|
||||
m_World->FastSetBlock( pistx, pisty, pistz, piston, (char)metadata + 8 );
|
||||
m_World->FastSetBlock( pistx, pisty+1, pistz, E_BLOCK_PISTON_EXTENSION, extmetadata+1 );
|
||||
m_World->SetBlock( pistx, pisty+1, pistz, E_BLOCK_PISTON_EXTENSION, extmetadata+1 );
|
||||
break;
|
||||
case 2:
|
||||
FirstFluidBlock = FindFluidBlock (pistx, pisty, pistz, pistx, pisty, pistz-16);
|
||||
if (FirstFluidBlock > 0) {
|
||||
ChainMove ( pistx, pisty, pistz, pistx, pisty, pistz-FirstFluidBlock );
|
||||
}
|
||||
FirstFluidBlock = FindFluidBlock (pistx, pisty, pistz-1, pistx, pisty, pistz-16);
|
||||
if (FirstFluidBlock > 0) {
|
||||
ChainMove ( pistx, pisty, pistz, pistx, pisty, pistz-FirstFluidBlock );
|
||||
}
|
||||
m_World->FastSetBlock( pistx, pisty, pistz, piston, (char)metadata + 8 );
|
||||
m_World->FastSetBlock( pistx, pisty, pistz-1, E_BLOCK_PISTON_EXTENSION, extmetadata+2 );
|
||||
m_World->SetBlock( pistx, pisty, pistz-1, E_BLOCK_PISTON_EXTENSION, extmetadata+2 );
|
||||
break;
|
||||
case 3:
|
||||
FirstFluidBlock = FindFluidBlock (pistx, pisty, pistz, pistx, pisty, pistz+16);
|
||||
if (FirstFluidBlock > 0) {
|
||||
ChainMove ( pistx, pisty, pistz, pistx, pisty, pistz+FirstFluidBlock );
|
||||
}
|
||||
m_World->FastSetBlock( pistx, pisty, pistz, piston, (char)metadata + 8 );
|
||||
m_World->FastSetBlock( pistx, pisty, pistz+1, E_BLOCK_PISTON_EXTENSION, extmetadata+3 );
|
||||
FirstFluidBlock = FindFluidBlock (pistx, pisty, pistz+1, pistx, pisty, pistz+16);
|
||||
if (FirstFluidBlock > 0) {
|
||||
ChainMove ( pistx, pisty, pistz, pistx, pisty, pistz+FirstFluidBlock );
|
||||
}
|
||||
m_World->FastSetBlock( pistx, pisty, pistz, piston, (char)metadata + 8 );
|
||||
m_World->SetBlock( pistx, pisty, pistz+1, E_BLOCK_PISTON_EXTENSION, extmetadata+3 );
|
||||
break;
|
||||
case 4:
|
||||
FirstFluidBlock = FindFluidBlock (pistx, pisty, pistz, pistx-16, pisty, pistz);
|
||||
if (FirstFluidBlock > 0) {
|
||||
ChainMove ( pistx, pisty, pistz, pistx-FirstFluidBlock, pisty, pistz );
|
||||
}
|
||||
m_World->FastSetBlock( pistx, pisty, pistz, piston, metadata + 8 );
|
||||
m_World->FastSetBlock( pistx, pisty+1, pistz, E_BLOCK_PISTON_EXTENSION, extmetadata+4 );
|
||||
FirstFluidBlock = FindFluidBlock (pistx-1, pisty, pistz, pistx-16, pisty, pistz);
|
||||
if (FirstFluidBlock > 0) {
|
||||
ChainMove ( pistx, pisty, pistz, pistx-FirstFluidBlock, pisty, pistz );
|
||||
}
|
||||
m_World->FastSetBlock( pistx, pisty, pistz, piston, metadata + 8 );
|
||||
m_World->SetBlock( pistx-1, pisty, pistz, E_BLOCK_PISTON_EXTENSION, extmetadata+4 );
|
||||
break;
|
||||
case 5:
|
||||
FirstFluidBlock = FindFluidBlock (pistx, pisty, pistz, pistx+16, pisty, pistz);
|
||||
if (FirstFluidBlock > 0) {
|
||||
ChainMove ( pistx, pisty, pistz, pistx+FirstFluidBlock, pisty, pistz );
|
||||
}
|
||||
m_World->FastSetBlock( pistx, pisty, pistz, piston, metadata + 8 );
|
||||
m_World->FastSetBlock( pistx, pisty+1, pistz, E_BLOCK_PISTON_EXTENSION, extmetadata+5 );
|
||||
FirstFluidBlock = FindFluidBlock (pistx+1, pisty, pistz, pistx+16, pisty, pistz);
|
||||
if (FirstFluidBlock > 0) {
|
||||
ChainMove ( pistx, pisty, pistz, pistx+FirstFluidBlock, pisty, pistz );
|
||||
}
|
||||
m_World->FastSetBlock( pistx, pisty, pistz, piston, metadata + 8 );
|
||||
m_World->SetBlock( pistx+1, pisty, pistz, E_BLOCK_PISTON_EXTENSION, extmetadata+5 );
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -93,9 +84,11 @@ void cPiston::ExtendPiston( int pistx, int pisty, int pistz )
|
||||
void cPiston::RetractPiston( int pistx, int pisty, int pistz )
|
||||
{
|
||||
char metadata = m_World->GetBlockMeta( pistx, pisty, pistz);
|
||||
char tempmeta;
|
||||
char tempblock;
|
||||
|
||||
if ( (int)m_World->GetBlock( pistx, pisty, pistz ) == E_BLOCK_PISTON ) {
|
||||
if (metadata > 5) { //piston retracted
|
||||
if (metadata > 5) { //piston retracted
|
||||
metadata -= 8;//set the piston to retracted state.
|
||||
|
||||
m_World->FastSetBlock( pistx, pisty, pistz, m_World->GetBlock( pistx, pisty, pistz ), metadata );
|
||||
@ -108,90 +101,102 @@ void cPiston::RetractPiston( int pistx, int pisty, int pistz )
|
||||
|
||||
case 1:
|
||||
if ( m_World->GetBlock( pistx, pisty+1, pistz ) == E_BLOCK_PISTON_EXTENSION ) {
|
||||
m_World->SetBlock( pistx, pisty+1, pistz, 0, 0 );
|
||||
m_World->SetBlock( pistx, pisty+1, pistz, 0, 0 );
|
||||
}
|
||||
break;
|
||||
|
||||
case 2:
|
||||
if ( m_World->GetBlock( pistx, pisty, pistz-1 ) == E_BLOCK_PISTON_EXTENSION ) {
|
||||
m_World->SetBlock( pistx, pisty, pistz-1, 0, 0 );
|
||||
m_World->SetBlock( pistx, pisty, pistz-1, 0, 0 );
|
||||
}
|
||||
break;
|
||||
|
||||
case 3:
|
||||
if ( m_World->GetBlock( pistx, pisty, pistz+1 ) == E_BLOCK_PISTON_EXTENSION ) {
|
||||
m_World->SetBlock( pistx, pisty, pistz+1, 0, 0 );
|
||||
m_World->SetBlock( pistx, pisty, pistz+1, 0, 0 );
|
||||
}
|
||||
break;
|
||||
|
||||
case 4:
|
||||
if ( m_World->GetBlock( pistx-1, pisty, pistz ) == E_BLOCK_PISTON_EXTENSION ) {
|
||||
m_World->SetBlock( pistx-1, pisty, pistz, 0, 0 );
|
||||
m_World->SetBlock( pistx-1, pisty, pistz, 0, 0 );
|
||||
}
|
||||
break;
|
||||
|
||||
case 5:
|
||||
if ( m_World->GetBlock( pistx+1, pisty, pistz ) == E_BLOCK_PISTON_EXTENSION ) {
|
||||
m_World->SetBlock( pistx+1, pisty, pistz, 0, 0 );
|
||||
m_World->SetBlock( pistx+1, pisty, pistz, 0, 0 );
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if ( (int)m_World->GetBlock( pistx, pisty, pistz ) == E_BLOCK_PISTON ) {
|
||||
if (metadata > 5) { //piston retracted
|
||||
metadata -= 8;//set the piston to retracted state.
|
||||
if ( (int)m_World->GetBlock( pistx, pisty, pistz ) == E_BLOCK_STICKY_PISTON ) {
|
||||
if (metadata > 5) { //piston retracted
|
||||
metadata -= 8;//set the piston to retracted state.
|
||||
m_World->FastSetBlock( pistx, pisty, pistz, m_World->GetBlock( pistx, pisty, pistz ), metadata );
|
||||
switch (metadata) {
|
||||
case 0:
|
||||
if ( m_World->GetBlock( pistx, pisty-1, pistz ) == E_BLOCK_PISTON_EXTENSION ) {
|
||||
tempblock = m_World->GetBlock( pistx, pisty-2, pistz );
|
||||
tempmeta = m_World->GetBlockMeta( pistx, pisty-2, pistz );
|
||||
m_World->SetBlock( pistx, pisty-1, pistz, 0, 0 );
|
||||
m_World->SetBlock( pistx, pisty-1, pistz, tempblock, tempmeta );
|
||||
m_World->SetBlock( pistx, pisty-2, pistz, 0, 0 );
|
||||
}
|
||||
break;
|
||||
|
||||
m_World->FastSetBlock( pistx, pisty, pistz, m_World->GetBlock( pistx, pisty, pistz ), metadata );
|
||||
switch (metadata) {
|
||||
case 0:
|
||||
if ( m_World->GetBlock( pistx, pisty-1, pistz ) == E_BLOCK_PISTON_EXTENSION ) {
|
||||
m_World->SetBlock( pistx, pisty-1, pistz, m_World->GetBlock( pistx, pisty-2, pistz ), m_World->GetBlockMeta( pistx, pisty-2, pistz ) );
|
||||
m_World->SetBlock( pistx, pisty-2, pistz, 0, 0 );
|
||||
}
|
||||
break;
|
||||
|
||||
case 1:
|
||||
if ( m_World->GetBlock( pistx, pisty+1, pistz ) == E_BLOCK_PISTON_EXTENSION ) {
|
||||
m_World->SetBlock( pistx, pisty-1, pistz, m_World->GetBlock( pistx, pisty-2, pistz ), m_World->GetBlockMeta( pistx, pisty-2, pistz ) );
|
||||
m_World->SetBlock( pistx, pisty-2, pistz, 0, 0 );
|
||||
}
|
||||
break;
|
||||
|
||||
case 2:
|
||||
if ( m_World->GetBlock( pistx, pisty, pistz-1) == E_BLOCK_PISTON_EXTENSION ) {
|
||||
m_World->SetBlock( pistx, pisty, pistz-1, m_World->GetBlock( pistx, pisty, pistz-2 ), m_World->GetBlockMeta( pistx, pisty, pistz-2 ) );
|
||||
m_World->SetBlock( pistx, pisty, pistz-2, 0, 0 );
|
||||
}
|
||||
break;
|
||||
|
||||
case 3:
|
||||
if ( m_World->GetBlock( pistx, pisty, pistz+1) == E_BLOCK_PISTON_EXTENSION ) {
|
||||
m_World->SetBlock( pistx, pisty, pistz+1, m_World->GetBlock( pistx, pisty, pistz+2 ), m_World->GetBlockMeta( pistx, pisty, pistz+2 ) );
|
||||
m_World->SetBlock( pistx, pisty, pistz+2, 0, 0 );
|
||||
}
|
||||
break;
|
||||
|
||||
case 4:
|
||||
if ( m_World->GetBlock( pistx-1, pisty, pistz) == E_BLOCK_PISTON_EXTENSION ) {
|
||||
m_World->SetBlock( pistx-1, pisty, pistz, m_World->GetBlock( pistx-2, pisty, pistz ), m_World->GetBlockMeta( pistx-2, pisty, pistz ) );
|
||||
m_World->SetBlock( pistx-2, pisty, pistz, 0, 0 );
|
||||
}
|
||||
break;
|
||||
|
||||
case 5:
|
||||
if ( m_World->GetBlock( pistx+1, pisty, pistz) == E_BLOCK_PISTON_EXTENSION ) {
|
||||
m_World->SetBlock( pistx+1, pisty, pistz, m_World->GetBlock( pistx+2, pisty, pistz ), m_World->GetBlockMeta( pistx+2, pisty, pistz ) );
|
||||
m_World->SetBlock( pistx+2, pisty, pistz, 0, 0 );
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
case 1:
|
||||
if ( m_World->GetBlock( pistx, pisty+1, pistz ) == E_BLOCK_PISTON_EXTENSION ) {
|
||||
tempblock = m_World->GetBlock( pistx, pisty+2, pistz );
|
||||
tempmeta = m_World->GetBlockMeta( pistx, pisty+2, pistz );
|
||||
m_World->SetBlock( pistx, pisty+1, pistz, 0, 0 );
|
||||
m_World->SetBlock( pistx, pisty+1, pistz, tempblock , tempmeta );
|
||||
m_World->SetBlock( pistx, pisty+2, pistz, 0, 0 );
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if ( m_World->GetBlock( pistx, pisty, pistz-1) == E_BLOCK_PISTON_EXTENSION ) {
|
||||
tempblock = m_World->GetBlock( pistx, pisty, pistz-2 );
|
||||
tempmeta = m_World->GetBlockMeta( pistx, pisty, pistz-2 );
|
||||
m_World->SetBlock( pistx, pisty, pistz-1, 0, 0 );
|
||||
m_World->SetBlock( pistx, pisty, pistz-1, tempblock, tempmeta );
|
||||
m_World->SetBlock( pistx, pisty, pistz-2, 0, 0 );
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if ( m_World->GetBlock( pistx, pisty, pistz+1) == E_BLOCK_PISTON_EXTENSION ) {
|
||||
tempblock = m_World->GetBlock( pistx, pisty, pistz+2 );
|
||||
tempmeta = m_World->GetBlockMeta( pistx, pisty, pistz+2 );
|
||||
m_World->SetBlock( pistx, pisty, pistz+1, 0, 0 );
|
||||
m_World->SetBlock( pistx, pisty, pistz+1, tempblock, tempmeta );
|
||||
m_World->SetBlock( pistx, pisty, pistz+2, 0, 0 );
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
if ( m_World->GetBlock( pistx-1, pisty, pistz) == E_BLOCK_PISTON_EXTENSION ) {
|
||||
tempblock = m_World->GetBlock( pistx-2, pisty, pistz );
|
||||
tempmeta = m_World->GetBlockMeta( pistx-2, pisty, pistz );
|
||||
m_World->SetBlock( pistx-1, pisty, pistz, 0, 0 );
|
||||
m_World->SetBlock( pistx-1, pisty, pistz, tempblock, tempmeta );
|
||||
m_World->SetBlock( pistx-2, pisty, pistz, 0, 0 );
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
if ( m_World->GetBlock( pistx+1, pisty, pistz) == E_BLOCK_PISTON_EXTENSION ) {
|
||||
tempblock = m_World->GetBlock( pistx+2, pisty, pistz );
|
||||
tempmeta = m_World->GetBlockMeta( pistx+2, pisty, pistz );
|
||||
m_World->SetBlock( pistx+1, pisty, pistz, 0, 0 );
|
||||
m_World->SetBlock( pistx+1, pisty, pistz, tempblock, tempmeta );
|
||||
m_World->SetBlock( pistx+2, pisty, pistz, 0, 0 );
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void cPiston::ChainMove ( int ax, int ay, int az, int bx, int by, int bz )
|
||||
@ -202,27 +207,23 @@ char lastblock;
|
||||
|
||||
if ( ( ax != bx ) && ( ay == by ) && ( az == bz ) ) { //move x
|
||||
|
||||
if ( ax < bx ) {
|
||||
if ( ax > bx ) {
|
||||
|
||||
while ( ax > bx ) {
|
||||
|
||||
lastmeta = m_World->GetBlockMeta( bx+1, by, bz);
|
||||
lastblock = m_World->GetBlockMeta( bx+1, by, bz);
|
||||
m_World->SetBlock( bx, by, bz, lastblock, lastmeta );
|
||||
bx+1;
|
||||
|
||||
lastmeta = m_World->GetBlockMeta( bx, by, bz);
|
||||
lastblock = m_World->GetBlock( bx, by, bz);
|
||||
m_World->SetBlock( bx+1, by, bz, lastblock, lastmeta );
|
||||
bx += 1;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
while ( ax < bx ) {
|
||||
|
||||
lastmeta = m_World->GetBlockMeta( bx-1, by, bz);
|
||||
lastblock = m_World->GetBlockMeta( bx-1, by, bz);
|
||||
m_World->SetBlock( bx, by, bz, lastblock, lastmeta );
|
||||
bx-1;
|
||||
|
||||
}
|
||||
while ( ax < bx ) {
|
||||
lastmeta = m_World->GetBlockMeta( bx, by, bz);
|
||||
lastblock = m_World->GetBlock( bx, by, bz);
|
||||
m_World->SetBlock( bx+1, by, bz, lastblock, lastmeta );
|
||||
bx -= 1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -230,57 +231,49 @@ char lastblock;
|
||||
|
||||
} else if ( ( ax == bx ) && ( ay != by ) && ( az == bz ) ) { //move y
|
||||
|
||||
if ( ay < by ) {
|
||||
if ( ay > by ) {
|
||||
|
||||
while ( ay > by ) {
|
||||
while ( ay > by ) {
|
||||
lastmeta = m_World->GetBlockMeta( bx, by, bz);
|
||||
lastblock = m_World->GetBlock( bx, by, bz);
|
||||
m_World->SetBlock( bx, by-1, bz, lastblock, lastmeta );
|
||||
by += 1 ;
|
||||
}
|
||||
|
||||
lastmeta = m_World->GetBlockMeta( bx, by+1, bz);
|
||||
lastblock = m_World->GetBlockMeta( bx, by+1, bz);
|
||||
m_World->SetBlock( bx, by, bz, lastblock, lastmeta );
|
||||
by+1;
|
||||
} else {
|
||||
|
||||
}
|
||||
while ( ay < by ) {
|
||||
lastmeta = m_World->GetBlockMeta( bx, by, bz);
|
||||
lastblock = m_World->GetBlock( bx, by, bz);
|
||||
m_World->SetBlock( bx, by+1, bz, lastblock, lastmeta );
|
||||
by -= 1;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
while ( ay < by ) {
|
||||
|
||||
lastmeta = m_World->GetBlockMeta( bx, by-1, bz);
|
||||
lastblock = m_World->GetBlockMeta( bx, by-1, bz);
|
||||
m_World->SetBlock( bx, by, bz, lastblock, lastmeta );
|
||||
by-1;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
m_World->SetBlock( ax, ay, az, 0, 0 );
|
||||
|
||||
} else if ( ( ax == bx ) && ( ay == by ) && ( az != bz ) ) { //move z
|
||||
|
||||
if ( az < bz ) {
|
||||
if ( az > bz ) {
|
||||
|
||||
while ( az > bz ) {
|
||||
while ( az > bz ) {
|
||||
lastmeta = m_World->GetBlockMeta( bx, by, bz );
|
||||
lastblock = m_World->GetBlock( bx, by, bz );
|
||||
m_World->SetBlock( bx, by, bz-1, lastblock, lastmeta );
|
||||
bz += 1;
|
||||
}
|
||||
|
||||
lastmeta = m_World->GetBlockMeta( bx, by, bz+1 );
|
||||
lastblock = m_World->GetBlockMeta( bx, by, bz+1 );
|
||||
m_World->SetBlock( bx, by, bz, lastblock, lastmeta );
|
||||
bz+1;
|
||||
} else {
|
||||
|
||||
}
|
||||
while ( az < bz ) {
|
||||
lastmeta = m_World->GetBlockMeta( bx, by, bz );
|
||||
lastblock = m_World->GetBlock( bx, by, bz );
|
||||
m_World->SetBlock( bx, by, bz+1, lastblock, lastmeta );
|
||||
bz -= 1;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
while ( az < bz ) {
|
||||
|
||||
lastmeta = m_World->GetBlockMeta( bx, by, bz-1 );
|
||||
lastblock = m_World->GetBlockMeta( bx, by, bz-1 );
|
||||
m_World->SetBlock( bx, by, bz, lastblock, lastmeta );
|
||||
bz-1;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
m_World->SetBlock( ax, ay, az, 0, 0 );
|
||||
|
||||
@ -299,104 +292,92 @@ int cPiston::FindFluidBlock ( int ax, int ay, int az, int bx, int by, int bz )
|
||||
|
||||
char thisblock;
|
||||
int cnt = 0;
|
||||
if ( ( ax != bx ) && ( ay == by ) && ( az == bz ) ) { //check x
|
||||
if ( ( ax != bx ) && ( ay == by ) && ( az == bz ) ) { //check x
|
||||
|
||||
if ( ax < bx ) {
|
||||
|
||||
while ( ax < bx ) {
|
||||
|
||||
thisblock = m_World->GetBlock( ax, ay, az);
|
||||
if ( (thisblock == 0) || (thisblock == E_BLOCK_STATIONARY_WATER) || (thisblock == E_BLOCK_WATER) || (thisblock == E_BLOCK_STATIONARY_LAVA) || (thisblock == E_BLOCK_LAVA) ) {
|
||||
return cnt;
|
||||
if ( ax < bx ) {
|
||||
while ( ax < bx ) {
|
||||
thisblock = m_World->GetBlock( ax, ay, az);
|
||||
if ( ((int)thisblock == 0) || ((int)thisblock == E_BLOCK_STATIONARY_WATER) || ((int)thisblock == E_BLOCK_WATER) || ((int)thisblock == E_BLOCK_STATIONARY_LAVA) || ((int)thisblock == E_BLOCK_LAVA) ) {
|
||||
return cnt;
|
||||
}
|
||||
cnt++;
|
||||
ax+1;
|
||||
}
|
||||
ax += 1;
|
||||
}
|
||||
|
||||
} else {
|
||||
} else {
|
||||
|
||||
while ( ax > bx ) {
|
||||
|
||||
thisblock = m_World->GetBlock( ax, ay, az);
|
||||
if ( (thisblock == 0) || (thisblock == E_BLOCK_STATIONARY_WATER) || (thisblock == E_BLOCK_WATER) || (thisblock == E_BLOCK_STATIONARY_LAVA) || (thisblock == E_BLOCK_LAVA) ) {
|
||||
return cnt;
|
||||
while ( ax > bx ) {
|
||||
thisblock = m_World->GetBlock( ax, ay, az);
|
||||
if ( ((int)thisblock == 0) || ((int)thisblock == E_BLOCK_STATIONARY_WATER) || ((int)thisblock == E_BLOCK_WATER) || ((int)thisblock == E_BLOCK_STATIONARY_LAVA) || ((int)thisblock == E_BLOCK_LAVA) ) {
|
||||
return cnt;
|
||||
}
|
||||
cnt++;
|
||||
ax-1;
|
||||
ax -= 1;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return cnt;
|
||||
|
||||
m_World->SetBlock( ax, ay, az, 0, 0 );
|
||||
} else if ( ( ax == bx ) && ( ay != by ) && ( az == bz ) ) { //check y
|
||||
|
||||
} else if ( ( ax == bx ) && ( ay != by ) && ( az == bz ) ) { //check y
|
||||
if ( ay < by ) {
|
||||
|
||||
if ( ay < by ) {
|
||||
|
||||
while ( ay < by ) {
|
||||
|
||||
thisblock = m_World->GetBlock( bx, by, bz);
|
||||
if ( (thisblock == 0) || (thisblock == E_BLOCK_STATIONARY_WATER) || (thisblock == E_BLOCK_WATER) || (thisblock == E_BLOCK_STATIONARY_LAVA) || (thisblock == E_BLOCK_LAVA) ) {
|
||||
return cnt;
|
||||
while ( ay < by ) {
|
||||
thisblock = m_World->GetBlock( ax, ay, az);
|
||||
if ( ((int)thisblock == 0) || ((int)thisblock == E_BLOCK_STATIONARY_WATER) || ((int)thisblock == E_BLOCK_WATER) || ((int)thisblock == E_BLOCK_STATIONARY_LAVA) || ((int)thisblock == E_BLOCK_LAVA) ) {
|
||||
return cnt;
|
||||
}
|
||||
cnt++;
|
||||
ay+1;
|
||||
ay += 1;
|
||||
}
|
||||
|
||||
}
|
||||
} else {
|
||||
|
||||
} else {
|
||||
|
||||
while ( ay > by ) {
|
||||
|
||||
thisblock = m_World->GetBlock( bx, by, bz);
|
||||
if ( (thisblock == 0) || (thisblock == E_BLOCK_STATIONARY_WATER) || (thisblock == E_BLOCK_WATER) || (thisblock == E_BLOCK_STATIONARY_LAVA) || (thisblock == E_BLOCK_LAVA) ) {
|
||||
return cnt;
|
||||
while ( ay > by ) {
|
||||
thisblock = m_World->GetBlock( ax, ay, az);
|
||||
if ( ((int)thisblock == 0) || ((int)thisblock == E_BLOCK_STATIONARY_WATER) || ((int)thisblock == E_BLOCK_WATER) || ((int)thisblock == E_BLOCK_STATIONARY_LAVA) || ((int)thisblock == E_BLOCK_LAVA) ) {
|
||||
return cnt;
|
||||
}
|
||||
cnt++;
|
||||
ay-1;
|
||||
ay -= 1;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return cnt;
|
||||
|
||||
m_World->SetBlock( ax, ay, az, 0, 0 );
|
||||
} else if ( ( ax == bx ) && ( ay == by ) && ( az != bz ) ) { //check z
|
||||
|
||||
} else if ( ( ax == bx ) && ( ay == by ) && ( az != bz ) ) { //check z
|
||||
if ( az < bz ) {
|
||||
|
||||
if ( az < bz ) {
|
||||
|
||||
while ( az < bz ) {
|
||||
|
||||
thisblock = m_World->GetBlock( ax, ay, az);
|
||||
if ( (thisblock == 0) || (thisblock == E_BLOCK_STATIONARY_WATER) || (thisblock == E_BLOCK_WATER) || (thisblock == E_BLOCK_STATIONARY_LAVA) || (thisblock == E_BLOCK_LAVA) ) {
|
||||
return cnt;
|
||||
while ( az < bz ) {
|
||||
thisblock = m_World->GetBlock( ax, ay, az);
|
||||
if ( ((int)thisblock == 0) || ((int)thisblock == E_BLOCK_STATIONARY_WATER) || ((int)thisblock == E_BLOCK_WATER) || ((int)thisblock == E_BLOCK_STATIONARY_LAVA) || ((int)thisblock == E_BLOCK_LAVA) ) {
|
||||
return cnt;
|
||||
}
|
||||
cnt++;
|
||||
az+1;
|
||||
az += 1;
|
||||
}
|
||||
|
||||
}
|
||||
} else {
|
||||
|
||||
} else {
|
||||
|
||||
while ( az > bz ) {
|
||||
|
||||
thisblock = m_World->GetBlock( ax, ay, az);
|
||||
if ( (thisblock == 0) || (thisblock == E_BLOCK_STATIONARY_WATER) || (thisblock == E_BLOCK_WATER) || (thisblock == E_BLOCK_STATIONARY_LAVA) || (thisblock == E_BLOCK_LAVA) ) {
|
||||
return cnt;
|
||||
while ( az > bz ) {
|
||||
thisblock = m_World->GetBlock( ax, ay, az);
|
||||
if ( ((int)thisblock == 0) || ((int)thisblock == E_BLOCK_STATIONARY_WATER) || ((int)thisblock == E_BLOCK_WATER) || ((int)thisblock == E_BLOCK_STATIONARY_LAVA) || ((int)thisblock == E_BLOCK_LAVA) ) {
|
||||
return cnt;
|
||||
}
|
||||
cnt++;
|
||||
az-1;
|
||||
az -= 1;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return cnt;
|
||||
|
||||
} else {
|
||||
|
||||
return cnt;
|
||||
|
||||
}
|
||||
} else {
|
||||
|
||||
return cnt;
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -40,7 +40,7 @@
|
||||
#include <sys/types.h>
|
||||
#define sprintf_s(dst, size, format, ...) sprintf(dst, format, __VA_ARGS__ )
|
||||
#endif
|
||||
|
||||
#define float2int(x) ((x)<0 ? ((int)(x))-1 : (int)(x))
|
||||
extern std::vector< std::string > StringSplit( std::string str, std::string delim);
|
||||
|
||||
CLASS_DEFINITION( cPlayer, cPawn );
|
||||
@ -81,7 +81,7 @@ cPlayer::cPlayer(cClientHandle* a_Client, const char* a_PlayerName)
|
||||
|
||||
m_TimeLastTeleportPacket = cWorld::GetTime();
|
||||
m_TimeLastPickupCheck = cWorld::GetTime();
|
||||
|
||||
|
||||
m_pState->PlayerName = a_PlayerName;
|
||||
m_bDirtyPosition = true; // So chunks are streamed to player at spawn
|
||||
|
||||
@ -104,6 +104,7 @@ cPlayer::~cPlayer(void)
|
||||
{
|
||||
SaveToDisk();
|
||||
m_ClientHandle = 0;
|
||||
|
||||
CloseWindow();
|
||||
if( m_Inventory )
|
||||
{
|
||||
@ -149,6 +150,7 @@ void cPlayer::Tick(float a_Dt)
|
||||
InChunk->Broadcast( EntityLook, m_ClientHandle );
|
||||
m_bDirtyOrientation = false;
|
||||
}
|
||||
|
||||
if(m_bDirtyPosition )
|
||||
{
|
||||
cRoot::Get()->GetPluginManager()->CallHook( cPluginManager::E_PLUGIN_PLAYER_MOVE, 1, this );
|
||||
@ -229,22 +231,21 @@ void cPlayer::Tick(float a_Dt)
|
||||
|
||||
void cPlayer::InStateBurning(float a_Dt) {
|
||||
m_FireDamageInterval += a_Dt;
|
||||
char block = GetWorld()->GetBlock( (int)m_Pos->x, (int)m_Pos->y, (int)m_Pos->z );
|
||||
char bblock = GetWorld()->GetBlock( (int)m_Pos->x, (int)m_Pos->y -1, (int)m_Pos->z );
|
||||
if(m_FireDamageInterval > 1000) {
|
||||
char block = GetWorld()->GetBlock( float2int(m_Pos->x), float2int(m_Pos->y), float2int(m_Pos->z) );
|
||||
char bblock = GetWorld()->GetBlock( float2int(m_Pos->x), float2int(m_Pos->y)+1, float2int(m_Pos->z) );
|
||||
if(m_FireDamageInterval > 800) {
|
||||
|
||||
m_FireDamageInterval = 0;
|
||||
int rem = rand()%3 + 1; //Burn most of the time
|
||||
if(rem >= 2) {
|
||||
//printf("OUCH burning!!!\n");
|
||||
TakeDamage(1, this);
|
||||
}
|
||||
|
||||
m_BurnPeriod++;
|
||||
if(block == E_BLOCK_LAVA || block == E_BLOCK_STATIONARY_LAVA || block == E_BLOCK_FIRE
|
||||
|| bblock == E_BLOCK_LAVA || bblock == E_BLOCK_STATIONARY_LAVA || bblock == E_BLOCK_FIRE)
|
||||
|| bblock == E_BLOCK_LAVA || bblock == E_BLOCK_STATIONARY_LAVA || bblock == E_BLOCK_FIRE) {
|
||||
m_BurnPeriod = 0;
|
||||
|
||||
if(m_BurnPeriod > 5) {
|
||||
TakeDamage(6, this);
|
||||
}else{
|
||||
TakeDamage(1, this);
|
||||
}
|
||||
if(m_BurnPeriod > 7) {
|
||||
|
||||
cChunk* InChunk = GetWorld()->GetChunkUnreliable( m_ChunkX, m_ChunkY, m_ChunkZ );
|
||||
e_EPMetaState = NORMAL;
|
||||
@ -261,14 +262,22 @@ void cPlayer::InStateBurning(float a_Dt) {
|
||||
|
||||
//----Change Entity MetaData
|
||||
void cPlayer::CheckMetaDataBurn() {
|
||||
char block = GetWorld()->GetBlock( (int)m_Pos->x, (int)m_Pos->y, (int)m_Pos->z );
|
||||
char bblock = GetWorld()->GetBlock( (int)m_Pos->x, (int)m_Pos->y -1, (int)m_Pos->z );
|
||||
if(m_bBurnable && e_EPMetaState != BURNING && (block == E_BLOCK_LAVA || block == E_BLOCK_STATIONARY_LAVA || block == E_BLOCK_FIRE
|
||||
char block = GetWorld()->GetBlock( float2int(m_Pos->x), float2int(m_Pos->y), float2int(m_Pos->z) );
|
||||
char bblock = GetWorld()->GetBlock( float2int(m_Pos->x), float2int(m_Pos->y)+1, float2int(m_Pos->z) );
|
||||
if(e_EPMetaState == BURNING && (block == E_BLOCK_WATER || block == E_BLOCK_STATIONARY_WATER
|
||||
|| bblock == E_BLOCK_WATER || bblock == E_BLOCK_STATIONARY_WATER)) {
|
||||
cChunk* InChunk = GetWorld()->GetChunkUnreliable( m_ChunkX, m_ChunkY, m_ChunkZ );
|
||||
if(!InChunk)
|
||||
return;
|
||||
e_EPMetaState = NORMAL;
|
||||
cPacket_Metadata md(NORMAL,GetUniqueID());
|
||||
InChunk->Broadcast(md);
|
||||
}else if(m_bBurnable && e_EPMetaState != BURNING && (block == E_BLOCK_LAVA || block == E_BLOCK_STATIONARY_LAVA || block == E_BLOCK_FIRE
|
||||
|| bblock == E_BLOCK_LAVA || bblock == E_BLOCK_STATIONARY_LAVA || bblock == E_BLOCK_FIRE)) {
|
||||
cChunk* InChunk = GetWorld()->GetChunkUnreliable( m_ChunkX, m_ChunkY, m_ChunkZ );
|
||||
if(!InChunk)
|
||||
return;
|
||||
printf("I should burn");
|
||||
printf("I should burn\n");
|
||||
e_EPMetaState = BURNING;
|
||||
cPacket_Metadata md(BURNING,GetUniqueID());
|
||||
InChunk->Broadcast(md);
|
||||
@ -282,7 +291,7 @@ void cPlayer::SetTouchGround( bool a_bTouchGround )
|
||||
if( !m_bTouchGround )
|
||||
{
|
||||
cWorld* World = GetWorld();
|
||||
char BlockID = World->GetBlock( (int)m_Pos->x, (int)m_Pos->y, (int)m_Pos->z );
|
||||
char BlockID = World->GetBlock( float2int(m_Pos->x), float2int(m_Pos->y), float2int(m_Pos->z) );
|
||||
if( BlockID != E_BLOCK_AIR )
|
||||
{
|
||||
m_bTouchGround = true;
|
||||
@ -371,6 +380,7 @@ void cPlayer::Respawn()
|
||||
//Packet.m_CreativeMode = (char)GetWorld()->GetGameMode();
|
||||
Packet.m_CreativeMode = (char)m_GameMode; //Set GameMode packet based on Player's GameMode;
|
||||
//Send Packet
|
||||
e_EPMetaState = NORMAL;
|
||||
m_ClientHandle->Send( Packet );
|
||||
TeleportTo( GetWorld()->GetSpawnX(), GetWorld()->GetSpawnY(), GetWorld()->GetSpawnZ() );
|
||||
SetVisible( true );
|
||||
|
@ -64,13 +64,10 @@ void cRedstone::ChangeRedstoneTorch( int fillx, int filly, int fillz, bool added
|
||||
void cRedstone::LightRedstone( int fillx, int filly, int fillz, char metadata)
|
||||
{
|
||||
if ( ( (int)m_World->GetBlock( fillx, filly, fillz ) == E_BLOCK_STICKY_PISTON ) || ( (int)m_World->GetBlock( fillx, filly, fillz ) == E_BLOCK_PISTON ) ) {
|
||||
printf("rsPiston 1\n");
|
||||
cPiston Piston(m_World);
|
||||
if (metadata > 0) {
|
||||
printf("rsPiston 2\n");
|
||||
Piston.ExtendPiston(fillx, filly, fillz);
|
||||
} else {
|
||||
printf("rsPiston 3\n");
|
||||
Piston.RetractPiston(fillx, filly, fillz);
|
||||
}
|
||||
} else if ( ( (int)m_World->GetBlock( fillx, filly, fillz ) == E_BLOCK_REDSTONE_WIRE) && ( (int)m_World->GetBlockMeta( fillx, filly, fillz) != metadata ) ) {
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include "../iniFile/iniFile.h"
|
||||
#include "cChunkMap.h"
|
||||
#include "cWaterSimulator.h"
|
||||
#include "cLavaSimulator.h"
|
||||
#include "cChicken.h"
|
||||
#include "cSpider.h"
|
||||
#include "cCow.h" //cow
|
||||
@ -47,6 +48,8 @@
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
float cWorld::m_Time = 0.f;
|
||||
|
||||
char g_BlockLightValue[128];
|
||||
@ -94,6 +97,7 @@ cWorld::~cWorld()
|
||||
UnlockEntities();
|
||||
|
||||
delete m_WaterSimulator;
|
||||
delete m_LavaSimulator;
|
||||
|
||||
UnloadUnusedChunks();
|
||||
delete m_ChunkMap;
|
||||
@ -114,9 +118,9 @@ cWorld::cWorld( const char* a_WorldName )
|
||||
cMakeDir::MakeDir(m_pState->WorldName.c_str());
|
||||
|
||||
srand( (unsigned int) time(0) );
|
||||
m_SpawnX = (double)((rand()%10000)-5000);
|
||||
m_SpawnX = (double)((rand()%1000)-500);
|
||||
m_SpawnY = 128;
|
||||
m_SpawnZ = (double)((rand()%10000)-5000);
|
||||
m_SpawnZ = (double)((rand()%1000)-500);
|
||||
m_WorldSeed = rand();
|
||||
m_GameMode = 0;
|
||||
|
||||
@ -187,6 +191,7 @@ cWorld::cWorld( const char* a_WorldName )
|
||||
m_ChunksCriticalSection = new cCriticalSection();
|
||||
|
||||
m_WaterSimulator = new cWaterSimulator( this );
|
||||
m_LavaSimulator = new cLavaSimulator( this );
|
||||
|
||||
memset( g_BlockLightValue, 0x0, 128 );
|
||||
memset( g_BlockSpreadLightFalloff, 0xf, 128 ); // 0xf means total falloff
|
||||
@ -263,6 +268,8 @@ void cWorld::Tick(float a_Dt)
|
||||
{
|
||||
m_Time+=a_Dt/1000.f;
|
||||
|
||||
CurrentTick++;
|
||||
|
||||
bool bSendTime = false;
|
||||
m_WorldTimeFraction+=a_Dt/1000.f;
|
||||
while( m_WorldTimeFraction > 1.f )
|
||||
@ -302,7 +309,10 @@ void cWorld::Tick(float a_Dt)
|
||||
}
|
||||
|
||||
m_ChunkMap->Tick(a_Dt);
|
||||
m_WaterSimulator->Simulate(a_Dt);
|
||||
if( CurrentTick % 6 == 0 )
|
||||
m_WaterSimulator->Simulate(a_Dt);
|
||||
if( CurrentTick % 12 == 0 )
|
||||
m_LavaSimulator->Simulate(a_Dt);
|
||||
UnlockChunks();
|
||||
|
||||
if( m_Time - m_LastSave > 60*5 ) // Save each 5 minutes
|
||||
@ -499,6 +509,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 )
|
||||
{
|
||||
m_WaterSimulator->WakeUp( a_X, a_Y, a_Z );
|
||||
m_LavaSimulator->WakeUp( a_X, a_Y, a_Z );
|
||||
|
||||
int ChunkX, ChunkY, ChunkZ;
|
||||
AbsoluteToRelative( a_X, a_Y, a_Z, ChunkX, ChunkY, ChunkZ );
|
||||
@ -556,6 +567,7 @@ bool cWorld::DigBlock( int a_X, int a_Y, int a_Z, cItem & a_PickupItem )
|
||||
{
|
||||
DestChunk->SetBlock(PosX, PosY, PosZ, 0, 0 );
|
||||
m_WaterSimulator->WakeUp( a_X, a_Y, a_Z );
|
||||
m_LavaSimulator->WakeUp( a_X, a_Y, a_Z );
|
||||
|
||||
if( !a_PickupItem.IsEmpty() )
|
||||
{
|
||||
|
@ -9,6 +9,7 @@ enum ENUM_ITEM_ID;
|
||||
#include <list>
|
||||
|
||||
class cWaterSimulator;
|
||||
class cLavaSimulator;
|
||||
class cChunkMap;
|
||||
class cItem;
|
||||
class cCriticalSection;
|
||||
@ -140,10 +141,12 @@ private:
|
||||
float m_LastSave;
|
||||
static float m_Time; // Time in seconds
|
||||
long long m_WorldTime; // Time in seconds*20, this is sent to clients (is wrapped)
|
||||
unsigned long long CurrentTick;
|
||||
int m_GameMode;
|
||||
float m_WorldTimeFraction; // When this > 1.f m_WorldTime is incremented by 20
|
||||
|
||||
cWaterSimulator* m_WaterSimulator;
|
||||
cLavaSimulator* m_LavaSimulator;
|
||||
|
||||
cCriticalSection* m_ClientHandleCriticalSection;
|
||||
cCriticalSection* m_EntitiesCriticalSection;
|
||||
|
Loading…
Reference in New Issue
Block a user