1
0

- Linux compatible fixes including updated makefile

- Mersenne Twister still says uint32 but it's now signed for compatibility with random uses needing negative values
 - Server seed is sent to clients, but needs to be able to be signed long long later on for authentic reasons
 - Protocol Version is required to match to ensure client compatibility, this should probably have a settings.ini check as well as store the value there

git-svn-id: http://mc-server.googlecode.com/svn/trunk@121 0a769ca7-a7f5-676a-18bf-c427514a06d6
This commit is contained in:
mtilden@gmail.com 2011-12-26 09:09:47 +00:00
parent e2acb45d19
commit c7fa610be3
15 changed files with 125 additions and 47 deletions

View File

@ -77,6 +77,7 @@ MCServer : \
build/cChestEntity.o\
build/cChunk.o\
build/cChunkMap.o\
build/cChunkGenerator.o\
build/cClientHandle.o\
build/cCraftingWindow.o\
build/cCriticalSection.o\
@ -90,6 +91,9 @@ MCServer : \
build/cInventory.o\
build/cLog.o\
build/cMonster.o\
build/cAggressiveMonster.o\
build/cPassiveMonster.o\
build/cPassiveAggressiveMonster.o\
build/cRedstone.o\
build/cPiston.o\
build/cPawn.o\
@ -108,6 +112,7 @@ MCServer : \
build/cWebPlugin.o\
build/cWindow.o\
build/cWorld.o\
build/cWorldGenerator.o\
build/main.o\
build/ManualBindings.o\
build/Matrix4f.o\
@ -141,6 +146,7 @@ MCServer : \
build/cPacket_Handshake.o\
build/cPacket_InventoryProgressBar.o\
build/cPacket_InventorySlot.o\
build/cPacket_ItemData.o\
build/cPacket_ItemSwitch.o\
build/cPacket_KeepAlive.o\
build/cPacket_Login.o\
@ -149,6 +155,7 @@ MCServer : \
build/cPacket_MultiBlock.o\
build/cPacket_NamedEntitySpawn.o\
build/cPacket_PickupSpawn.o\
build/cPacket_PlayerListItem.o\
build/cPacket_PlayerLook.o\
build/cPacket_PlayerMoveLook.o\
build/cPacket_PlayerPosition.o\
@ -225,6 +232,7 @@ MCServer : \
build/zutil.o\
build/iniFile.o\
build/cSocket.o\
build/cFluidSimulator.o\
build/cWaterSimulator.o\
build/cLavaSimulator.o\
build/cFileFormatUpdater.o\
@ -268,6 +276,7 @@ MCServer : \
build/cChestEntity.o\
build/cChunk.o\
build/cChunkMap.o\
build/cChunkGenerator.o\
build/cClientHandle.o\
build/cCraftingWindow.o\
build/cCriticalSection.o\
@ -281,6 +290,9 @@ MCServer : \
build/cInventory.o\
build/cLog.o\
build/cMonster.o\
build/cAggressiveMonster.o\
build/cPassiveMonster.o\
build/cPassiveAggressiveMonster.o\
build/cRedstone.o\
build/cPiston.o\
build/cPawn.o\
@ -299,6 +311,7 @@ MCServer : \
build/cWebPlugin.o\
build/cWindow.o\
build/cWorld.o\
build/cWorldGenerator.o\
build/main.o\
build/ManualBindings.o\
build/Matrix4f.o\
@ -332,6 +345,7 @@ MCServer : \
build/cPacket_Handshake.o\
build/cPacket_InventoryProgressBar.o\
build/cPacket_InventorySlot.o\
build/cPacket_ItemData.o\
build/cPacket_ItemSwitch.o\
build/cPacket_KeepAlive.o\
build/cPacket_Login.o\
@ -340,6 +354,7 @@ MCServer : \
build/cPacket_MultiBlock.o\
build/cPacket_NamedEntitySpawn.o\
build/cPacket_PickupSpawn.o\
build/cPacket_PlayerListItem.o\
build/cPacket_PlayerLook.o\
build/cPacket_PlayerMoveLook.o\
build/cPacket_PlayerPosition.o\
@ -416,6 +431,7 @@ MCServer : \
build/zutil.o\
build/iniFile.o\
build/cSocket.o\
build/cFluidSimulator.o\
build/cWaterSimulator.o\
build/cLavaSimulator.o\
build/cFileFormatUpdater.o\
@ -462,6 +478,7 @@ clean :
build/cChestEntity.o\
build/cChunk.o\
build/cChunkMap.o\
build/cChunkGenerator.o\
build/cClientHandle.o\
build/cCraftingWindow.o\
build/cCriticalSection.o\
@ -475,6 +492,9 @@ clean :
build/cInventory.o\
build/cLog.o\
build/cMonster.o\
build/cAggressiveMonster.o\
build/cPassiveMonster.o\
build/cPassiveAggressiveMonster.o\
build/cRedstone.o\
build/cPiston.o\
build/cPawn.o\
@ -493,6 +513,7 @@ clean :
build/cWebPlugin.o\
build/cWindow.o\
build/cWorld.o\
build/cWorldGenerator.o\
build/main.o\
build/ManualBindings.o\
build/Matrix4f.o\
@ -526,6 +547,7 @@ clean :
build/cPacket_Handshake.o\
build/cPacket_InventoryProgressBar.o\
build/cPacket_InventorySlot.o\
build/cPacket_ItemData.o\
build/cPacket_ItemSwitch.o\
build/cPacket_KeepAlive.o\
build/cPacket_Login.o\
@ -534,6 +556,7 @@ clean :
build/cPacket_MultiBlock.o\
build/cPacket_NamedEntitySpawn.o\
build/cPacket_PickupSpawn.o\
build/cPacket_PlayerListItem.o\
build/cPacket_PlayerLook.o\
build/cPacket_PlayerMoveLook.o\
build/cPacket_PlayerPosition.o\
@ -610,6 +633,7 @@ clean :
build/zutil.o\
build/iniFile.o\
build/cSocket.o\
build/cFluidSimulator.o\
build/cWaterSimulator.o\
build/cLavaSimulator.o\
build/cFileFormatUpdater.o\
@ -673,6 +697,10 @@ build/cChunk.o : source/cChunk.cpp
build/cChunkMap.o : source/cChunkMap.cpp
$(CC) $(CC_OPTIONS) source/cChunkMap.cpp -c $(INCLUDE) -o build/cChunkMap.o
# Item # 10 -- cChunkGenerator --
build/cChunkGenerator.o : source/cChunkGenerator.cpp
$(CC) $(CC_OPTIONS) source/cChunkGenerator.cpp -c $(INCLUDE) -o build/cChunkGenerator.o
# Item # 11 -- cClientHandle --
build/cClientHandle.o : source/cClientHandle.cpp
@ -738,6 +766,18 @@ build/cLog.o : source/cLog.cpp
build/cMonster.o : source/cMonster.cpp
$(CC) $(CC_OPTIONS) source/cMonster.cpp -c $(INCLUDE) -o build/cMonster.o
# Item # 23 -- cAggressiveMonster --
build/cAggressiveMonster.o : source/cAggressiveMonster.cpp
$(CC) $(CC_OPTIONS) source/cAggressiveMonster.cpp -c $(INCLUDE) -o build/cAggressiveMonster.o
# Item # 23 -- cPassiveMonster --
build/cPassiveMonster.o : source/cPassiveMonster.cpp
$(CC) $(CC_OPTIONS) source/cPassiveMonster.cpp -c $(INCLUDE) -o build/cPassiveMonster.o
# Item # 23 -- cPassiveAgressiveMonster --
build/cPassiveAggressiveMonster.o : source/cPassiveAggressiveMonster.cpp
$(CC) $(CC_OPTIONS) source/cPassiveAggressiveMonster.cpp -c $(INCLUDE) -o build/cPassiveAggressiveMonster.o
# Item # 23 -- cRedstone --
build/cRedstone.o : source/cRedstone.cpp
@ -828,6 +868,10 @@ build/cWindow.o : source/cWindow.cpp
build/cWorld.o : source/cWorld.cpp
$(CC) $(CC_OPTIONS) source/cWorld.cpp -c $(INCLUDE) -o build/cWorld.o
# Item # 40 -- cWorldGenerator --
build/cWorldGenerator.o : source/cWorldGenerator.cpp
$(CC) $(CC_OPTIONS) source/cWorldGenerator.cpp -c $(INCLUDE) -o build/cWorldGenerator.o
# Item # 41 -- main --
build/main.o : source/main.cpp
@ -946,6 +990,9 @@ build/cPacket_InventoryProgressBar.o : source/packets/cPacket_InventoryProgressB
build/cPacket_InventorySlot.o : source/packets/cPacket_InventorySlot.cpp
$(CC) $(CC_OPTIONS) source/packets/cPacket_InventorySlot.cpp -c $(INCLUDE) -o build/cPacket_InventorySlot.o
build/cPacket_ItemData.o : source/packets/cPacket_ItemData.cpp
$(CC) $(CC_OPTIONS) source/packets/cPacket_ItemData.cpp -c $(INCLUDE) -o build/cPacket_ItemData.o
build/cPacket_ItemSwitch.o : source/packets/cPacket_ItemSwitch.cpp
$(CC) $(CC_OPTIONS) source/packets/cPacket_ItemSwitch.cpp -c $(INCLUDE) -o build/cPacket_ItemSwitch.o
@ -970,6 +1017,9 @@ build/cPacket_NamedEntitySpawn.o : source/packets/cPacket_NamedEntitySpawn.cpp
build/cPacket_PickupSpawn.o : source/packets/cPacket_PickupSpawn.cpp
$(CC) $(CC_OPTIONS) source/packets/cPacket_PickupSpawn.cpp -c $(INCLUDE) -o build/cPacket_PickupSpawn.o
build/cPacket_PlayerListItem.o : source/packets/cPacket_PlayerListItem.cpp
$(CC) $(CC_OPTIONS) source/packets/cPacket_PlayerListItem.cpp -c $(INCLUDE) -o build/cPacket_PlayerListItem.o
build/cPacket_PlayerLook.o : source/packets/cPacket_PlayerLook.cpp
$(CC) $(CC_OPTIONS) source/packets/cPacket_PlayerLook.cpp -c $(INCLUDE) -o build/cPacket_PlayerLook.o
@ -1398,6 +1448,9 @@ build/cMakeDir.o : source/cMakeDir.cpp
build/cSocket.o : source/cSocket.cpp
$(CC) $(CC_OPTIONS) source/cSocket.cpp -c $(INCLUDE) -o build/cSocket.o
build/cFluidSimulator.o : source/cFluidSimulator.cpp
$(CC) $(CC_OPTIONS) source/cFluidSimulator.cpp -c $(INCLUDE) -o build/cFluidSimulator.o
build/cWaterSimulator.o : source/cWaterSimulator.cpp
$(CC) $(CC_OPTIONS) source/cWaterSimulator.cpp -c $(INCLUDE) -o build/cWaterSimulator.o

View File

@ -63,7 +63,7 @@
class MTRand {
// Data
public:
typedef unsigned long uint32; // unsigned integer type, at least 32 bits
typedef long uint32; // unsigned integer type, at least 32 bits
enum { N = 624 }; // length of state vector
enum { SAVE = N + 1 }; // length of array for save()

View File

@ -2,6 +2,7 @@
#include "Vector3f.h"
#include "cPlayer.h"
#include "MersenneTwister.h"
cAggressiveMonster::cAggressiveMonster()
@ -58,7 +59,8 @@ void cAggressiveMonster::Tick(float a_Dt)
if(m_SeePlayerInterval > 1)
{
int rem = rand() % 3 + 1; //check most of the time but miss occasionally
MTRand r1;
int rem = r1.randInt() % 3 + 1; //check most of the time but miss occasionally
m_SeePlayerInterval = 0.0;
if(rem >= 2)

View File

@ -2,9 +2,11 @@
#include "Defines.h"
#include "BlockID.h"
#include "stdlib.h"
#include "MersenneTwister.h"
ENUM_ITEM_ID cBlockToPickup::ToPickup( unsigned char a_BlockID, ENUM_ITEM_ID a_UsedItemID )
{
MTRand r1;
(void)a_UsedItemID;
switch( a_BlockID )
@ -28,7 +30,7 @@ ENUM_ITEM_ID cBlockToPickup::ToPickup( unsigned char a_BlockID, ENUM_ITEM_ID a_U
if( a_UsedItemID == E_ITEM_SHEARS )
return E_ITEM_LEAVES;
else
if(rand() % 5 == 0) return E_ITEM_SAPLING;
if(r1.randInt() % 5 == 0) return E_ITEM_SAPLING;
return E_ITEM_EMPTY;
case E_BLOCK_COAL_ORE:
return E_ITEM_COAL;
@ -67,17 +69,18 @@ ENUM_ITEM_ID cBlockToPickup::ToPickup( unsigned char a_BlockID, ENUM_ITEM_ID a_U
char cBlockToPickup::PickupCount(unsigned char a_BlockID)
{
MTRand r1;
switch(a_BlockID)
{
case E_BLOCK_REDSTONE_ORE_GLOWING:
case E_BLOCK_REDSTONE_ORE:
return rand() % 2 + 4;
return r1.randInt() % 2 + 4;
case E_BLOCK_GLOWSTONE:
return rand() % 3 + 2;
return r1.randInt() % 3 + 2;
case E_BLOCK_MELON:
return rand() % 8 + 3;
return r1.randInt() % 8 + 3;
case E_BLOCK_LAPIS_ORE:
return rand() % 5 + 4;
return r1.randInt() % 5 + 4;
default:
return 1;
}

View File

@ -30,6 +30,7 @@
#include "cCriticalSection.h"
#include "cWorldGenerator.h"
#include "cBlockToPickup.h"
#include "MersenneTwister.h"
#include "packets/cPacket_DestroyEntity.h"
#include "packets/cPacket_PreChunk.h"
@ -333,11 +334,11 @@ void cChunk::Tick(float a_Dt)
break;
};
}
MTRand r1;
// Tick dem blocks
int RandomX = rand();
int RandomY = rand();
int RandomZ = rand();
int RandomX = r1.randInt();
int RandomY = r1.randInt();
int RandomZ = r1.randInt();
for(int i = 0; i < 50; i++)
{

View File

@ -82,7 +82,7 @@ public:
void AddTickBlockEntity( cFurnaceEntity* a_Entity );
void RemoveTickBlockEntity( cFurnaceEntity* a_Entity );
inline static unsigned int cChunk::MakeIndex(int x, int y, int z )
inline static unsigned int MakeIndex(int x, int y, int z )
{
if( x < 16 && x > -1 && y < 128 && y > -1 && z < 16 && z > -1 )
return y + (z * 128) + (x * 128 * 16);

View File

@ -70,7 +70,6 @@
#ifndef _WIN32
#define sprintf_s(dst, size, format, ...) sprintf(dst, format, __VA_ARGS__ )
#include <stdlib.h> // rand()
#endif
#define AddPistonDir( x, y, z, dir, amount ) switch(dir) { case 0: (y)-=(amount); break; case 1: (y)+=(amount); break;\
@ -84,7 +83,7 @@ typedef std::list<cPacket*> PacketList;
struct cClientHandle::sClientHandleState
{
sClientHandleState()
: ProtocolVersion( 0 )
: ProtocolVersion( 22 )
, pReceiveThread( 0 )
, pSendThread( 0 )
, pAuthenticateThread( 0 )
@ -458,6 +457,10 @@ void cClientHandle::HandlePacket( cPacket* a_Packet )
{
LOG("LOGIN %s", GetUsername() );
cPacket_Login* PacketData = reinterpret_cast<cPacket_Login*>(a_Packet);
if (PacketData->m_ProtocolVersion != m_pState->ProtocolVersion) {
Kick("Your client is outdated!");
return;
}
if( m_pState->Username.compare( PacketData->m_Username ) != 0 )
{
Kick("Login Username does not match Handshake username!");
@ -1243,9 +1246,10 @@ void cClientHandle::Tick(float a_Dt)
LoginResponse.m_ProtocolVersion = m_Player->GetUniqueID();
//LoginResponse.m_Username = "";
LoginResponse.m_ServerMode = m_Player->GetGameMode(); //set gamemode from player.
LoginResponse.m_MapSeed = 0;
LoginResponse.m_MapSeed = cRoot::Get()->GetWorld()->GetWorldSeed();
LoginResponse.m_Dimension = 0;
LoginResponse.m_MaxPlayers = (unsigned char)cRoot::Get()->GetWorld()->GetMaxPlayers();
LoginResponse.m_Difficulty = 2;
Send( LoginResponse );
// Send Weather if raining:

View File

@ -11,6 +11,7 @@
#include "cPickup.h"
#include "cItem.h"
#include "cMonsterConfig.h"
#include "MersenneTwister.h"
#include "packets/cPacket_SpawnMob.h"
#include "packets/cPacket_EntityLook.h"
@ -64,7 +65,8 @@ cMonster::cMonster()
LOG("In state: %s",GetState());
m_Health = 10;
int RandVal = rand() % 4;
MTRand r1;
int RandVal = r1.randInt() % 4;
if( RandVal == 0 )
m_MobType = 90; // Pig
else if( RandVal == 1 )
@ -418,12 +420,13 @@ void cMonster::EventLosePlayer(){
void cMonster::InStateIdle(float a_Dt) {
idle_interval += a_Dt;
if(idle_interval > 1) { //at this interval the results are predictable
int rem = rand()%6 + 1;
MTRand r1;
int rem = r1.randInt()%6 + 1;
//LOG("Moving: int: %3.3f rem: %i",idle_interval,rem);
idle_interval = 0;
Vector3f Dist;
Dist.x = (float)((rand()%11)-5);
Dist.z = (float)((rand()%11)-5);
Dist.x = (float)((r1.randInt()%11)-5);
Dist.z = (float)((r1.randInt()%11)-5);
if( Dist.SqrLength() > 2 && rem >= 3)
{
m_Destination->x = (float)(m_Pos->x + Dist.x);
@ -581,5 +584,6 @@ void cMonster::DropItem(ENUM_ITEM_ID a_Item, unsigned int a_Count)
void cMonster::RandomDropItem(ENUM_ITEM_ID a_Item, unsigned int a_Min, unsigned int a_Max)
{
return cMonster::DropItem(a_Item, rand() % (a_Max + 1) + a_Min);
MTRand r1;
return cMonster::DropItem(a_Item, r1.randInt() % (a_Max + 1) + a_Min);
}

View File

@ -3,6 +3,7 @@
#include "Defines.h"
#include "cWorld.h"
#include "BlockID.h"
#include <string.h>
class Vector3f;
class cClientHandle;

View File

@ -1,4 +1,5 @@
#include "cPassiveMonster.h"
#include "MersenneTwister.h"
cPassiveMonster::cPassiveMonster()
@ -24,7 +25,8 @@ void cPassiveMonster::Tick(float a_Dt)
if(m_SeePlayerInterval > 1)
{
int rem = rand() % 3 + 1; //check most of the time but miss occasionally
MTRand r1;
int rem = r1.randInt() % 3 + 1; //check most of the time but miss occasionally
m_SeePlayerInterval = 0.0;
if(rem >= 2) {

View File

@ -17,6 +17,7 @@
#include "cRoot.h"
#include "cMakeDir.h"
#include "cTimer.h"
#include "MersenneTwister.h"
#include "packets/cPacket_NamedEntitySpawn.h"
#include "packets/cPacket_EntityLook.h"
@ -375,15 +376,16 @@ void cPlayer::KilledBy( cEntity* a_Killer )
m_bVisible = false; // So new clients don't see the player
MTRand r1;
// Puke out all the items
cItem* Items = m_Inventory->GetSlots();
for( unsigned int i = 1; i < m_Inventory->c_NumSlots; ++i )
{
if( !Items[i].IsEmpty() )
{
float SpeedX = ((rand()%1000)-500) /100.f;
float SpeedY = ((rand()%1000)) /100.f;
float SpeedZ = ((rand()%1000)-500) /100.f;
float SpeedX = ((r1.randInt()%1000)-500) /100.f;
float SpeedY = ((r1.randInt()%1000)) /100.f;
float SpeedZ = ((r1.randInt()%1000)-500) /100.f;
cPickup* Pickup = new cPickup( (int)(m_Pos->x*32), (int)(m_Pos->y*32), (int)(m_Pos->z*32), Items[i], SpeedX, SpeedY, SpeedZ );
Pickup->Initialize( GetWorld() );
}

View File

@ -18,7 +18,7 @@ public:
int GetWindowID() { return m_WindowID; }
void SetWindowID( int a_WindowID ) { m_WindowID = a_WindowID; }
static enum WindowType {
enum WindowType {
Chest,
Workbench,
Furnace,

View File

@ -34,6 +34,7 @@
#include "cGenSettings.h"
#include "cMakeDir.h"
#include "cChunkGenerator.h"
#include "MersenneTwister.h"
#include "packets/cPacket_TimeUpdate.h"
@ -65,7 +66,8 @@ bool g_BlockPistonBreakable[128];
#define RECI_RAND_MAX (1.f/RAND_MAX)
inline float fRadRand( float a_Radius )
{
return ((float)rand() * RECI_RAND_MAX)*a_Radius - a_Radius*0.5f;
MTRand r1;
return ((float)r1.rand() * RECI_RAND_MAX)*a_Radius - a_Radius*0.5f;
}
struct sSetBlockData
@ -141,11 +143,11 @@ cWorld::cWorld( const char* a_WorldName )
cMakeDir::MakeDir(m_pState->WorldName.c_str());
srand( (unsigned int) time(0) );
m_SpawnX = (double)((rand()%1000)-500);
MTRand r1;
m_SpawnX = (double)((r1.randInt()%1000)-500);
m_SpawnY = 128;
m_SpawnZ = (double)((rand()%1000)-500);
m_WorldSeed = rand();
m_SpawnZ = (double)((r1.randInt()%1000)-500);
m_WorldSeed = r1.randInt();
m_GameMode = 0;
cIniFile IniFile( m_pState->WorldName + "/world.ini");
@ -411,11 +413,12 @@ void cWorld::Tick(float a_Dt)
m_LavaSimulator->Simulate(a_Dt);
UnlockChunks();
MTRand r1;
////////////////Weather///////////////////////
if ( GetWeather() == 0 ) { //if sunny
if( CurrentTick % 19 == 0 ) { //every 20 ticks random weather
randWeather = (rand() %10000);
randWeather = (r1.randInt() %10000);
if (randWeather == 0) {
LOG("Starting Rainstorm!");
SetWeather ( 1 );
@ -428,7 +431,7 @@ void cWorld::Tick(float a_Dt)
if ( GetWeather() != 0 ) { //if raining or thunderstorm
if( CurrentTick % 19 == 0 ) { //every 20 ticks random weather
randWeather = (rand() %4999);
randWeather = (r1.randInt() %4999);
if (randWeather == 0) { //2% chance per second
LOG("Back to sunny!");
SetWeather ( 0 );
@ -440,7 +443,7 @@ void cWorld::Tick(float a_Dt)
}
if ( GetWeather() == 2 ) { //if thunderstorm
if (rand() %199 == 0) { //0.5% chance per tick of thunderbolt
if (r1.randInt() %199 == 0) { //0.5% chance per tick of thunderbolt
CastThunderbolt ( 0, 0, 0 ); //todo: find random possitions near players to cast thunderbolts.
}
}
@ -480,17 +483,17 @@ void cWorld::Tick(float a_Dt)
cMonster *Monster = 0;
//srand ( time(NULL) ); // Only seed random ONCE! Is already done in the cWorld constructor
int dayRand = rand() % 6; //added mob code
int nightRand = rand() % 10; //added mob code
int dayRand = r1.randInt() % 6; //added mob code
int nightRand = r1.randInt() % 10; //added mob code
int RandomPlayerIdx = rand() & m_pState->Players.size();
int RandomPlayerIdx = r1.randInt() & m_pState->Players.size();
PlayerList::iterator itr = m_pState->Players.begin();
for( int i = 1; i < RandomPlayerIdx; i++ )
itr++;
cPlayer* Player = *itr;
Vector3d SpawnPos = Player->GetPosition();
SpawnPos += Vector3d( (double)(rand()%64)-32, (double)(rand()%64)-32, (double)(rand()%64)-32 );
SpawnPos += Vector3d( (double)(r1.randInt()%64)-32, (double)(r1.randInt()%64)-32, (double)(r1.randInt()%64)-32 );
char Height = GetHeight( (int)SpawnPos.x, (int)SpawnPos.z );
if(m_WorldTime >= 12000 + 1000) {
@ -581,7 +584,8 @@ void cWorld::GrowTree( int a_X, int a_Y, int a_Z )
// converted from php to lua then lua to c++
// build trunk
int trunk = rand() % (7 - 5 + 1) + 5;
MTRand r1;
int trunk = r1.randInt() % (7 - 5 + 1) + 5;
for (int i = 0; i < trunk; i++)
{
if( GetBlock( a_X, a_Y + i, a_Z ) == E_BLOCK_AIR )
@ -598,7 +602,7 @@ void cWorld::GrowTree( int a_X, int a_Y, int a_Z )
for (int i = a_X - radius; i <= a_X + radius; i++) {
for (int k = a_Z-radius; k <= a_Z + radius; k++) {
// small chance to be missing a block to add a little random
if (k != a_Z || i != a_X && (rand() % 100 + 1) > 20) {
if (k != a_Z || i != a_X && (r1.randInt() % 100 + 1) > 20) {
if( GetBlock( i, a_Y + j, k ) == E_BLOCK_AIR )
FastSetBlock(i, a_Y+j, k, E_BLOCK_LEAVES, 0 );
}

View File

@ -10,6 +10,7 @@ enum ENUM_ITEM_ID;
#include <list>
#include <vector>
#include <string>
class cPacket;
class cRedstone;

View File

@ -3,6 +3,7 @@
#include "cWorld.h"
#include "cChunk.h"
#include "cGenSettings.h"
#include "MersenneTwister.h"
#include "BlockID.h"
#include "Vector3i.h"
@ -205,7 +206,7 @@ void cWorldGenerator::GenerateFoliage( cChunk* a_Chunk )
BlockType[ index ] = (char)GrassID;
}
MTRand r1;
// Plant sum trees
{
int xx = x + PosX*16;
@ -215,10 +216,10 @@ void cWorldGenerator::GenerateFoliage( cChunk* a_Chunk )
float val2 = m_Noise.CubicNoise2D( xx*0.01f, zz*0.01f );
if( BlockType[index] == SandID )
{
if( (val1 + val2 > 0.f) && (rand()%128) > 124 && BlockType[index] == E_BLOCK_SAND )
if( (val1 + val2 > 0.f) && (r1.randInt()%128) > 124 && BlockType[index] == E_BLOCK_SAND )
{
BlockType[ cChunk::MakeIndex(x, TopY+1, z) ] = E_BLOCK_CACTUS;
if( (rand() & 3) == 3 )
if( (r1.randInt() & 3) == 3 )
{
BlockType[ cChunk::MakeIndex(x, TopY+2, z) ] = E_BLOCK_CACTUS;
}
@ -229,15 +230,15 @@ void cWorldGenerator::GenerateFoliage( cChunk* a_Chunk )
{
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 )
if( val1 + val2 > 0.2f && (r1.randInt()%128) > 124 )
World->GrowTree( xx, TopY, zz );
else if( val3 > 0.2f && (rand()%128) > 124 )
else if( val3 > 0.2f && (r1.randInt()%128) > 124 )
BlockType[ cChunk::MakeIndex(x, TopY+1, z) ] = E_BLOCK_YELLOW_FLOWER;
else if( val4 > 0.2f && (rand()%128) > 124 )
else if( val4 > 0.2f && (r1.randInt()%128) > 124 )
BlockType[ cChunk::MakeIndex(x, TopY+1, z) ] = E_BLOCK_RED_ROSE;
else if( val1+val2+val3+val4 > 0.2f && (rand()%128) > 124 )
else if( val1+val2+val3+val4 > 0.2f && (r1.randInt()%128) > 124 )
BlockType[ cChunk::MakeIndex(x, TopY+1, z) ] = E_BLOCK_RED_MUSHROOM;
else if( val1+val2+val3+val4 > 0.2f && (rand()%128) > 124 )
else if( val1+val2+val3+val4 > 0.2f && (r1.randInt()%128) > 124 )
BlockType[ cChunk::MakeIndex(x, TopY+1, z) ] = E_BLOCK_BROWN_MUSHROOM;
}
}