1
0
Fork 0

conflict resolution

This commit is contained in:
p-mcgowan 2014-12-04 13:31:58 -08:00
commit 8557ab18d0
8 changed files with 79 additions and 40 deletions

View File

@ -233,8 +233,8 @@ static int tolua_AllToLua_StringToMobType00(lua_State* tolua_S)
#ifndef TOLUA_RELEASE #ifndef TOLUA_RELEASE
tolua_Error tolua_err; tolua_Error tolua_err;
if ( if (
!tolua_iscppstring(tolua_S,1,0,&tolua_err) || !tolua_iscppstring(tolua_S, 1, 0, &tolua_err) ||
!tolua_isnoobj(tolua_S,2,&tolua_err) !tolua_isnoobj(tolua_S, 2, &tolua_err)
) )
goto tolua_lerror; goto tolua_lerror;
else else

View File

@ -120,6 +120,11 @@ cPlayer::cPlayer(cClientHandle* a_Client, const AString & a_PlayerName) :
{ {
m_CanFly = true; m_CanFly = true;
} }
if (World->IsGameModeSpectator()) // Otherwise Player will fall out of the world on join
{
m_CanFly = true;
m_IsFlying = true;
}
} }
cRoot::Get()->GetServer()->PlayerCreated(this); cRoot::Get()->GetServer()->PlayerCreated(this);
@ -1074,7 +1079,7 @@ bool cPlayer::IsGameModeAdventure(void) const
bool cPlayer::IsGameModeSpectator(void) const bool cPlayer::IsGameModeSpectator(void) const
{ {
return (m_GameMode == gmSpectator) || // Either the player is explicitly in Spectator return (m_GameMode == gmSpectator) || // Either the player is explicitly in Spectator
((m_GameMode == gmNotSet) && m_World->IsGameModeSpectator()); // or they inherit from the world and the world is Adventure ((m_GameMode == gmNotSet) && m_World->IsGameModeSpectator()); // or they inherit from the world and the world is Spectator
} }
@ -1893,8 +1898,8 @@ void cPlayer::UseEquippedItem(int a_Amount)
void cPlayer::TickBurning(cChunk & a_Chunk) void cPlayer::TickBurning(cChunk & a_Chunk)
{ {
// Don't burn in creative and stop burning in creative if necessary // Don't burn in creative or spectator and stop burning in creative if necessary
if (!IsGameModeCreative()) if (!IsGameModeCreative() && !IsGameModeSpectator())
{ {
super::TickBurning(a_Chunk); super::TickBurning(a_Chunk);
} }
@ -1913,9 +1918,9 @@ void cPlayer::HandleFood(void)
{ {
// Ref.: http://www.minecraftwiki.net/wiki/Hunger // Ref.: http://www.minecraftwiki.net/wiki/Hunger
if (IsGameModeCreative()) if (IsGameModeCreative() || IsGameModeSpectator())
{ {
// Hunger is disabled for Creative // Hunger is disabled for Creative and Spectator
return; return;
} }
@ -2080,7 +2085,7 @@ void cPlayer::UpdateMovementStats(const Vector3d & a_DeltaPos)
void cPlayer::ApplyFoodExhaustionFromMovement() void cPlayer::ApplyFoodExhaustionFromMovement()
{ {
if (IsGameModeCreative()) if (IsGameModeCreative() || IsGameModeSpectator())
{ {
return; return;
} }

View File

@ -7,6 +7,7 @@
#include "DungeonRoomsFinisher.h" #include "DungeonRoomsFinisher.h"
#include "../FastRandom.h" #include "../FastRandom.h"
#include "../BlockEntities/ChestEntity.h" #include "../BlockEntities/ChestEntity.h"
#include "../BlockEntities/MobSpawnerEntity.h"
@ -57,6 +58,22 @@ public:
int SecondChestPos = (FirstChestPos + 2 + (rnd % (NumPositions - 3))) % NumPositions; int SecondChestPos = (FirstChestPos + 2 + (rnd % (NumPositions - 3))) % NumPositions;
m_Chest1 = DecodeChestCoords(FirstChestPos, SizeX, SizeZ); m_Chest1 = DecodeChestCoords(FirstChestPos, SizeX, SizeZ);
m_Chest2 = DecodeChestCoords(SecondChestPos, SizeX, SizeZ); m_Chest2 = DecodeChestCoords(SecondChestPos, SizeX, SizeZ);
// Choose what the mobspawner will spawn.
// 25% chance for a spider, 25% for a skeleton and 50% chance to get a zombie spawer.
int MobType = (a_Noise.IntNoise3DInt(a_OriginX, m_FloorHeight, a_OriginZ) / 7) % 100;
if (MobType <= 25)
{
m_MonsterType = mtSkeleton;
}
else if (MobType <= 50)
{
m_MonsterType = mtSpider;
}
else
{
m_MonsterType = mtZombie;
}
} }
protected: protected:
@ -76,6 +93,8 @@ protected:
/** The (absolute) coords of the second chest. The Y coord represents the chest's Meta value (facing). */ /** The (absolute) coords of the second chest. The Y coord represents the chest's Meta value (facing). */
Vector3i m_Chest2; Vector3i m_Chest2;
/** The monster type for the mobspawner entity. */
eMonsterType m_MonsterType;
/** Decodes the position index along the room walls into a proper 2D position for a chest. /** Decodes the position index along the room walls into a proper 2D position for a chest.
@ -246,7 +265,9 @@ protected:
) )
{ {
a_ChunkDesc.SetBlockTypeMeta(CenterX, b, CenterZ, E_BLOCK_MOB_SPAWNER, 0); a_ChunkDesc.SetBlockTypeMeta(CenterX, b, CenterZ, E_BLOCK_MOB_SPAWNER, 0);
// TODO: Set the spawned mob cMobSpawnerEntity * MobSpawner = static_cast<cMobSpawnerEntity *>(a_ChunkDesc.GetBlockEntity(CenterX, b, CenterZ));
ASSERT((MobSpawner != nullptr) && (MobSpawner->GetBlockType() == E_BLOCK_MOB_SPAWNER));
MobSpawner->SetEntity(m_MonsterType);
} }
} }
} ; } ;

View File

@ -65,7 +65,7 @@ void cFinishGenNetherClumpFoliage::GenFinish(cChunkDesc & a_ChunkDesc)
{ {
continue; continue;
} }
// Choose what block to use. // Choose what block to use.
NOISE_DATATYPE BlockType = m_Noise.IntNoise3D((int) ChunkX, y, (int) ChunkZ); NOISE_DATATYPE BlockType = m_Noise.IntNoise3D((int) ChunkX, y, (int) ChunkZ);
if (BlockType < -0.7) if (BlockType < -0.7)
@ -195,10 +195,10 @@ void cFinishGenTallGrass::GenFinish(cChunkDesc & a_ChunkDesc)
{ {
continue; continue;
} }
// Get the top block + 1. This is the place where the grass would finaly be placed: // Get the top block + 1. This is the place where the grass would finaly be placed:
int y = a_ChunkDesc.GetHeight(x, z) + 1; int y = a_ChunkDesc.GetHeight(x, z) + 1;
if (y >= 255) if (y >= 255)
{ {
continue; continue;
@ -281,7 +281,7 @@ bool cFinishGenSprinkleFoliage::TryAddSugarcane(cChunkDesc & a_ChunkDesc, int a_
{ {
return false; return false;
} }
// All conditions met, place a sugarcane here: // All conditions met, place a sugarcane here:
a_ChunkDesc.SetBlockType(a_RelX, a_RelY + 1, a_RelZ, E_BLOCK_SUGARCANE); a_ChunkDesc.SetBlockType(a_RelX, a_RelY + 1, a_RelZ, E_BLOCK_SUGARCANE);
return true; return true;
@ -294,7 +294,7 @@ bool cFinishGenSprinkleFoliage::TryAddSugarcane(cChunkDesc & a_ChunkDesc, int a_
void cFinishGenSprinkleFoliage::GenFinish(cChunkDesc & a_ChunkDesc) void cFinishGenSprinkleFoliage::GenFinish(cChunkDesc & a_ChunkDesc)
{ {
// Generate small foliage (1-block): // Generate small foliage (1-block):
// TODO: Update heightmap with 1-block-tall foliage // TODO: Update heightmap with 1-block-tall foliage
for (int z = 0; z < cChunkDef::Width; z++) for (int z = 0; z < cChunkDef::Width; z++)
{ {
@ -319,7 +319,7 @@ void cFinishGenSprinkleFoliage::GenFinish(cChunkDesc & a_ChunkDesc)
// WEIRD, since we're using heightmap, so there should NOT be anything above it // WEIRD, since we're using heightmap, so there should NOT be anything above it
continue; continue;
} }
const float xx = (float)BlockX; const float xx = (float)BlockX;
float val1 = m_Noise.CubicNoise2D(xx * 0.1f, zz * 0.1f); float val1 = m_Noise.CubicNoise2D(xx * 0.1f, zz * 0.1f);
float val2 = m_Noise.CubicNoise2D(xx * 0.01f, zz * 0.01f); float val2 = m_Noise.CubicNoise2D(xx * 0.01f, zz * 0.01f);
@ -359,7 +359,7 @@ void cFinishGenSprinkleFoliage::GenFinish(cChunkDesc & a_ChunkDesc)
} }
break; break;
} // case E_BLOCK_GRASS } // case E_BLOCK_GRASS
case E_BLOCK_SAND: case E_BLOCK_SAND:
{ {
int y = Top + 1; int y = Top + 1;
@ -783,7 +783,7 @@ void cFinishGenPreSimulator::StationarizeFluid(
} // for y } // for y
} // for x } // for x
} // for z } // for z
// Turn fluid at the chunk edges into non-stationary fluid: // Turn fluid at the chunk edges into non-stationary fluid:
for (int y = 0; y < cChunkDef::Height; y++) for (int y = 0; y < cChunkDef::Height; y++)
{ {
@ -875,12 +875,12 @@ void cFinishGenFluidSprings::GenFinish(cChunkDesc & a_ChunkDesc)
// Not in this chunk // Not in this chunk
return; return;
} }
// Get the height at which to try: // Get the height at which to try:
int Height = m_Noise.IntNoise3DInt(128 * a_ChunkDesc.GetChunkX(), 1024, 256 * a_ChunkDesc.GetChunkZ()) / 11; int Height = m_Noise.IntNoise3DInt(128 * a_ChunkDesc.GetChunkX(), 1024, 256 * a_ChunkDesc.GetChunkZ()) / 11;
Height %= m_HeightDistribution.GetSum(); Height %= m_HeightDistribution.GetSum();
Height = m_HeightDistribution.MapValue(Height); Height = m_HeightDistribution.MapValue(Height);
// Try adding the spring at the height, if unsuccessful, move lower: // Try adding the spring at the height, if unsuccessful, move lower:
for (int y = Height; y > 1; y--) for (int y = Height; y > 1; y--)
{ {
@ -918,7 +918,7 @@ bool cFinishGenFluidSprings::TryPlaceSpring(cChunkDesc & a_ChunkDesc, int x, int
{ {
return false; return false;
} }
static const struct static const struct
{ {
int x, y, z; int x, y, z;
@ -949,7 +949,7 @@ bool cFinishGenFluidSprings::TryPlaceSpring(cChunkDesc & a_ChunkDesc, int x, int
{ {
return false; return false;
} }
// Has exactly one air neighbor, place a spring: // Has exactly one air neighbor, place a spring:
a_ChunkDesc.SetBlockTypeMeta(x, y, z, m_Fluid, 0); a_ChunkDesc.SetBlockTypeMeta(x, y, z, m_Fluid, 0);
return true; return true;

View File

@ -141,14 +141,14 @@ class cFinishGenSprinkleFoliage :
{ {
public: public:
cFinishGenSprinkleFoliage(int a_Seed) : m_Noise(a_Seed), m_Seed(a_Seed) {} cFinishGenSprinkleFoliage(int a_Seed) : m_Noise(a_Seed), m_Seed(a_Seed) {}
protected: protected:
cNoise m_Noise; cNoise m_Noise;
int m_Seed; int m_Seed;
/// Tries to place sugarcane at the coords specified, returns true if successful /// Tries to place sugarcane at the coords specified, returns true if successful
bool TryAddSugarcane(cChunkDesc & a_ChunkDesc, int a_RelX, int a_RelY, int a_RelZ); bool TryAddSugarcane(cChunkDesc & a_ChunkDesc, int a_RelX, int a_RelY, int a_RelZ);
// Returns true is the specified biome is a desert or its variant // Returns true is the specified biome is a desert or its variant
static bool IsDesertVariant(EMCSBiome a_biome); static bool IsDesertVariant(EMCSBiome a_biome);
@ -189,31 +189,31 @@ public:
{ {
m_IsAllowedBelow[idx] = false; m_IsAllowedBelow[idx] = false;
} }
// Load the allowed blocks into m_IsAllowedBelow // Load the allowed blocks into m_IsAllowedBelow
for (BlockList::iterator itr = a_AllowedBelow.begin(); itr != a_AllowedBelow.end(); ++itr) for (BlockList::iterator itr = a_AllowedBelow.begin(); itr != a_AllowedBelow.end(); ++itr)
{ {
m_IsAllowedBelow[*itr] = true; m_IsAllowedBelow[*itr] = true;
} }
// Initialize all the biome types. // Initialize all the biome types.
for (size_t idx = 0; idx < ARRAYCOUNT(m_IsBiomeAllowed); ++idx) for (size_t idx = 0; idx < ARRAYCOUNT(m_IsBiomeAllowed); ++idx)
{ {
m_IsBiomeAllowed[idx] = false; m_IsBiomeAllowed[idx] = false;
} }
// Load the allowed biomes into m_IsBiomeAllowed // Load the allowed biomes into m_IsBiomeAllowed
for (BiomeList::iterator itr = a_Biomes.begin(); itr != a_Biomes.end(); ++itr) for (BiomeList::iterator itr = a_Biomes.begin(); itr != a_Biomes.end(); ++itr)
{ {
m_IsBiomeAllowed[*itr] = true; m_IsBiomeAllowed[*itr] = true;
} }
} }
protected: protected:
cNoise m_Noise; cNoise m_Noise;
BLOCKTYPE m_BlockType; BLOCKTYPE m_BlockType;
int m_Amount; ///< Relative amount of blocks to try adding. 1 = one block per 256 biome columns. int m_Amount; ///< Relative amount of blocks to try adding. 1 = one block per 256 biome columns.
int GetNumToGen(const cChunkDef::BiomeMap & a_BiomeMap); int GetNumToGen(const cChunkDef::BiomeMap & a_BiomeMap);
// Returns true if the given biome is a biome that is allowed. // Returns true if the given biome is a biome that is allowed.
@ -228,7 +228,7 @@ protected:
return m_IsAllowedBelow[a_BlockBelow]; return m_IsAllowedBelow[a_BlockBelow];
} }
// cFinishGen override: // cFinishGen override:
virtual void GenFinish(cChunkDesc & a_ChunkDesc) override; virtual void GenFinish(cChunkDesc & a_ChunkDesc) override;
} ; } ;
@ -245,11 +245,11 @@ public:
m_Level(a_Level) m_Level(a_Level)
{ {
} }
int GetLevel(void) const { return m_Level; } int GetLevel(void) const { return m_Level; }
protected: protected:
int m_Level; int m_Level;
// cFinishGen override: // cFinishGen override:
virtual void GenFinish(cChunkDesc & a_ChunkDesc) override; virtual void GenFinish(cChunkDesc & a_ChunkDesc) override;
} ; } ;
@ -263,7 +263,7 @@ class cFinishGenPreSimulator :
{ {
public: public:
cFinishGenPreSimulator(bool a_PreSimulateFallingBlocks, bool a_PreSimulateWater, bool a_PreSimulateLava); cFinishGenPreSimulator(bool a_PreSimulateFallingBlocks, bool a_PreSimulateWater, bool a_PreSimulateLava);
protected: protected:
bool m_PreSimulateFallingBlocks; bool m_PreSimulateFallingBlocks;
@ -275,7 +275,7 @@ protected:
cChunkDef::BlockTypes & a_BlockTypes, // Block types to read and change cChunkDef::BlockTypes & a_BlockTypes, // Block types to read and change
cChunkDef::HeightMap & a_HeightMap // Height map to update by the current data cChunkDef::HeightMap & a_HeightMap // Height map to update by the current data
); );
/** For each fluid block: /** For each fluid block:
- if all surroundings are of the same fluid, makes it stationary; otherwise makes it flowing (excl. top) - if all surroundings are of the same fluid, makes it stationary; otherwise makes it flowing (excl. top)
- all fluid on the chunk's edge is made flowing - all fluid on the chunk's edge is made flowing
@ -300,7 +300,7 @@ class cFinishGenFluidSprings :
{ {
public: public:
cFinishGenFluidSprings(int a_Seed, BLOCKTYPE a_Fluid, cIniFile & a_IniFile, eDimension a_Dimension); cFinishGenFluidSprings(int a_Seed, BLOCKTYPE a_Fluid, cIniFile & a_IniFile, eDimension a_Dimension);
protected: protected:
cNoise m_Noise; cNoise m_Noise;

View File

@ -285,6 +285,19 @@ bool cMobSpawner::CanSpawnHere(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_R
) )
); );
} }
case mtMooshroom:
{
return (
(TargetBlock == E_BLOCK_AIR) &&
(BlockAbove == E_BLOCK_AIR) &&
(BlockBelow == E_BLOCK_MYCELIUM) &&
(
(a_Biome == biMushroomShore) ||
(a_Biome == biMushroomIsland)
)
);
}
default: default:
{ {

View File

@ -49,17 +49,17 @@ void cPig::OnRightClicked(cPlayer & a_Player)
a_Player.Detach(); a_Player.Detach();
return; return;
} }
if (m_Attachee->IsPlayer()) if (m_Attachee->IsPlayer())
{ {
// Another player is already sitting in here, cannot attach // Another player is already sitting in here, cannot attach
return; return;
} }
// Detach whatever is sitting in this pig now: // Detach whatever is sitting in this pig now:
m_Attachee->Detach(); m_Attachee->Detach();
} }
// Attach the player to this pig // Attach the player to this pig
a_Player.AttachTo(this); a_Player.AttachTo(this);
} }
@ -100,7 +100,7 @@ void cPig::Tick(float a_Dt, cChunk & a_Chunk)
bool cPig::DoTakeDamage(TakeDamageInfo & a_TDI) bool cPig::DoTakeDamage(TakeDamageInfo & a_TDI)
{ {
if (!super::DoTakeDamage(a_TDI)) if (!super::DoTakeDamage(a_TDI))
{ {
return false; return false;

View File

@ -614,7 +614,7 @@ void cWorld::Start(void)
} }
// Adjust the enum-backed variables into their respective bounds: // Adjust the enum-backed variables into their respective bounds:
m_GameMode = (eGameMode) Clamp(GameMode, (int)gmSurvival, (int)gmAdventure); m_GameMode = (eGameMode) Clamp(GameMode, (int)gmSurvival, (int)gmSpectator);
m_TNTShrapnelLevel = (eShrapnelLevel)Clamp(TNTShrapnelLevel, (int)slNone, (int)slAll); m_TNTShrapnelLevel = (eShrapnelLevel)Clamp(TNTShrapnelLevel, (int)slNone, (int)slAll);
m_Weather = (eWeather) Clamp(Weather, (int)wSunny, (int)wStorm); m_Weather = (eWeather) Clamp(Weather, (int)wSunny, (int)wStorm);