1
0

Merge pull request #941 from archshift/master

Fixed lots of warnings, and other small changes.
This commit is contained in:
Mattes D 2014-04-26 23:26:59 +02:00
commit da931da603
19 changed files with 172 additions and 174 deletions

View File

@ -324,7 +324,7 @@ eDimension StringToDimension(const AString & a_DimensionString)
{ dimOverworld, "Normal"}, { dimOverworld, "Normal"},
{ dimOverworld, "World"}, { dimOverworld, "World"},
{ dimNether, "Nether"}, { dimNether, "Nether"},
{ dimNether, "Hell"}, // Alternate name for End { dimNether, "Hell"}, // Alternate name for Nether
{ dimEnd, "End"}, { dimEnd, "End"},
{ dimEnd, "Sky"}, // Old name for End { dimEnd, "Sky"}, // Old name for End
} ; } ;
@ -337,7 +337,8 @@ eDimension StringToDimension(const AString & a_DimensionString)
} // for i - DimensionMap[] } // for i - DimensionMap[]
// Not found // Not found
return (eDimension)-1000; LOGWARNING("Unknown dimension: \"%s\". Setting to Overworld", a_DimensionString.c_str());
return dimOverworld;
} }

View File

@ -346,9 +346,8 @@ void cChunkMap::BroadcastAttachEntity(const cEntity & a_Entity, const cEntity *
void cChunkMap::BroadcastBlockAction(int a_BlockX, int a_BlockY, int a_BlockZ, char a_Byte1, char a_Byte2, BLOCKTYPE a_BlockType, const cClientHandle * a_Exclude) void cChunkMap::BroadcastBlockAction(int a_BlockX, int a_BlockY, int a_BlockZ, char a_Byte1, char a_Byte2, BLOCKTYPE a_BlockType, const cClientHandle * a_Exclude)
{ {
cCSLock Lock(m_CSLayers); cCSLock Lock(m_CSLayers);
int x, y, z, ChunkX, ChunkZ; int x, z, ChunkX, ChunkZ;
x = a_BlockX; x = a_BlockX;
y = a_BlockY;
z = a_BlockZ; z = a_BlockZ;
cChunkDef::BlockToChunk(x, z, ChunkX, ChunkZ); cChunkDef::BlockToChunk(x, z, ChunkX, ChunkZ);
cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ); cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ);
@ -1146,9 +1145,8 @@ BLOCKTYPE cChunkMap::GetBlock(int a_BlockX, int a_BlockY, int a_BlockZ)
// First check if it isn't queued in the m_FastSetBlockQueue: // First check if it isn't queued in the m_FastSetBlockQueue:
{ {
int X = a_BlockX, Y = a_BlockY, Z = a_BlockZ; int X = a_BlockX, Y = a_BlockY, Z = a_BlockZ;
int ChunkX, ChunkY, ChunkZ; int ChunkX, ChunkZ;
cChunkDef::AbsoluteToRelative(X, Y, Z, ChunkX, ChunkZ); cChunkDef::AbsoluteToRelative(X, Y, Z, ChunkX, ChunkZ);
ChunkY = 0;
cCSLock Lock(m_CSFastSetBlock); cCSLock Lock(m_CSFastSetBlock);
for (sSetBlockList::iterator itr = m_FastSetBlockQueue.begin(); itr != m_FastSetBlockQueue.end(); ++itr) for (sSetBlockList::iterator itr = m_FastSetBlockQueue.begin(); itr != m_FastSetBlockQueue.end(); ++itr)
{ {

View File

@ -186,6 +186,46 @@ void cClientHandle::GenerateOfflineUUID(void)
AString cClientHandle::FormatChatPrefix(bool ShouldAppendChatPrefixes, AString a_ChatPrefixS, AString m_Color1, AString m_Color2)
{
if (ShouldAppendChatPrefixes)
return Printf("%s[%s] %s", m_Color1.c_str(), a_ChatPrefixS.c_str(), m_Color2.c_str());
else
return Printf("%s", m_Color1.c_str());
}
AString cClientHandle::FormatMessageType(bool ShouldAppendChatPrefixes, eMessageType a_ChatPrefix, const AString &a_AdditionalData)
{
switch (a_ChatPrefix)
{
case mtCustom: return AString();
case mtFailure: return FormatChatPrefix(ShouldAppendChatPrefixes, "INFO", cChatColor::Rose, cChatColor::White);
case mtInformation: return FormatChatPrefix(ShouldAppendChatPrefixes, "INFO", cChatColor::Yellow, cChatColor::White);
case mtSuccess: return FormatChatPrefix(ShouldAppendChatPrefixes, "INFO", cChatColor::Green, cChatColor::White);
case mtWarning: return FormatChatPrefix(ShouldAppendChatPrefixes, "WARN", cChatColor::Rose, cChatColor::White);
case mtFatal: return FormatChatPrefix(ShouldAppendChatPrefixes, "FATAL", cChatColor::Red, cChatColor::White);
case mtDeath: return FormatChatPrefix(ShouldAppendChatPrefixes, "DEATH", cChatColor::Gray, cChatColor::White);
case mtJoin: return FormatChatPrefix(ShouldAppendChatPrefixes, "JOIN", cChatColor::Yellow, cChatColor::White);
case mtLeave: return FormatChatPrefix(ShouldAppendChatPrefixes, "LEAVE", cChatColor::Yellow, cChatColor::White);
case mtPrivateMessage:
{
if (ShouldAppendChatPrefixes)
return Printf("%s[MSG: %s] %s%s", cChatColor::LightBlue.c_str(), a_AdditionalData.c_str(), cChatColor::White.c_str(), cChatColor::Italic.c_str());
else
return Printf("%s: %s", a_AdditionalData.c_str(), cChatColor::LightBlue.c_str());
}
}
ASSERT(!"Unhandled chat prefix type!");
}
AString cClientHandle::GenerateOfflineUUID(const AString & a_Username) AString cClientHandle::GenerateOfflineUUID(const AString & a_Username)
{ {
// Proper format for a version 3 UUID is: // Proper format for a version 3 UUID is:
@ -1849,7 +1889,7 @@ void cClientHandle::SendBlockChanges(int a_ChunkX, int a_ChunkZ, const sSetBlock
void cClientHandle::SendChat(const AString & a_Message, eMessageType a_ChatPrefix, const AString & a_AdditionalData) void cClientHandle::SendChat(const AString & a_Message, eMessageType a_ChatPrefix, const AString & a_AdditionalData)
{ {
bool ShouldAppendChatPrefixes = true; bool ShouldAppendChatPrefixes = true;
if (GetPlayer()->GetWorld() == NULL) if (GetPlayer()->GetWorld() == NULL)
{ {
cWorld * World = cRoot::Get()->GetWorld(GetPlayer()->GetLoadedWorldName()); cWorld * World = cRoot::Get()->GetWorld(GetPlayer()->GetLoadedWorldName());
@ -1868,89 +1908,9 @@ void cClientHandle::SendChat(const AString & a_Message, eMessageType a_ChatPrefi
ShouldAppendChatPrefixes = false; ShouldAppendChatPrefixes = false;
} }
AString Message; AString Message = FormatMessageType(ShouldAppendChatPrefixes, a_ChatPrefix, a_AdditionalData);
switch (a_ChatPrefix) m_Protocol->SendChat(Message.append(a_Message));
{
case mtCustom: break;
case mtFailure:
{
if (ShouldAppendChatPrefixes)
Message = Printf("%s[INFO] %s", cChatColor::Rose.c_str(), cChatColor::White.c_str());
else
Message = Printf("%s", cChatColor::Rose.c_str());
break;
}
case mtInformation:
{
if (ShouldAppendChatPrefixes)
Message = Printf("%s[INFO] %s", cChatColor::Yellow.c_str(), cChatColor::White.c_str());
else
Message = Printf("%s", cChatColor::Yellow.c_str());
break;
}
case mtSuccess:
{
if (ShouldAppendChatPrefixes)
Message = Printf("%s[INFO] %s", cChatColor::Green.c_str(), cChatColor::White.c_str());
else
Message = Printf("%s", cChatColor::Green.c_str());
break;
}
case mtWarning:
{
if (ShouldAppendChatPrefixes)
Message = Printf("%s[WARN] %s", cChatColor::Rose.c_str(), cChatColor::White.c_str());
else
Message = Printf("%s", cChatColor::Rose.c_str());
break;
}
case mtFatal:
{
if (ShouldAppendChatPrefixes)
Message = Printf("%s[FATAL] %s", cChatColor::Red.c_str(), cChatColor::White.c_str());
else
Message = Printf("%s", cChatColor::Red.c_str());
break;
}
case mtDeath:
{
if (ShouldAppendChatPrefixes)
Message = Printf("%s[DEATH] %s", cChatColor::Gray.c_str(), cChatColor::White.c_str());
else
Message = Printf("%s", cChatColor::Gray.c_str());
break;
}
case mtPrivateMessage:
{
if (ShouldAppendChatPrefixes)
Message = Printf("%s[MSG: %s] %s%s", cChatColor::LightBlue.c_str(), a_AdditionalData.c_str(), cChatColor::White.c_str(), cChatColor::Italic.c_str());
else
Message = Printf("%s: %s", a_AdditionalData.c_str(), cChatColor::LightBlue.c_str());
break;
}
case mtJoin:
{
if (ShouldAppendChatPrefixes)
Message = Printf("%s[JOIN] %s", cChatColor::Yellow.c_str(), cChatColor::White.c_str());
else
Message = Printf("%s", cChatColor::Yellow.c_str());
break;
}
case mtLeave:
{
if (ShouldAppendChatPrefixes)
Message = Printf("%s[LEAVE] %s", cChatColor::Yellow.c_str(), cChatColor::White.c_str());
else
Message = Printf("%s", cChatColor::Yellow.c_str());
break;
}
default: ASSERT(!"Unhandled chat prefix type!"); return;
}
Message.append(a_Message);
m_Protocol->SendChat(Message);
} }

View File

@ -77,6 +77,11 @@ public:
This is used for the offline (non-auth) mode, when there's no UUID source. This is used for the offline (non-auth) mode, when there's no UUID source.
Each username generates a unique and constant UUID, so that when the player reconnects with the same name, their UUID is the same. */ Each username generates a unique and constant UUID, so that when the player reconnects with the same name, their UUID is the same. */
static AString GenerateOfflineUUID(const AString & a_Username); // tolua_export static AString GenerateOfflineUUID(const AString & a_Username); // tolua_export
/** Formats the type of message with the proper color and prefix for sending to the client. **/
AString FormatMessageType(bool ShouldAppendChatPrefixes, eMessageType a_ChatPrefix, const AString & a_AdditionalData);
AString FormatChatPrefix(bool ShouldAppendChatPrefixes, AString a_ChatPrefixS, AString m_Color1, AString m_Color2);
void Kick(const AString & a_Reason); // tolua_export void Kick(const AString & a_Reason); // tolua_export
void Authenticate(const AString & a_Name, const AString & a_UUID); // Called by cAuthenticator when the user passes authentication void Authenticate(const AString & a_Name, const AString & a_UUID); // Called by cAuthenticator when the user passes authentication

View File

@ -410,11 +410,8 @@ int cEntity::GetRawDamageAgainst(const cEntity & a_Receiver)
int cEntity::GetArmorCoverAgainst(const cEntity * a_Attacker, eDamageType a_DamageType, int a_Damage) bool cEntity::ArmorCoversAgainst(eDamageType a_DamageType)
{ {
// Returns the hitpoints out of a_RawDamage that the currently equipped armor would cover
// Filter out damage types that are not protected by armor:
// Ref.: http://www.minecraftwiki.net/wiki/Armor#Effects as of 2012_12_20 // Ref.: http://www.minecraftwiki.net/wiki/Armor#Effects as of 2012_12_20
switch (a_DamageType) switch (a_DamageType)
{ {
@ -429,9 +426,33 @@ int cEntity::GetArmorCoverAgainst(const cEntity * a_Attacker, eDamageType a_Dama
case dtLightning: case dtLightning:
case dtPlugin: case dtPlugin:
{ {
return 0; return false;
}
case dtAttack:
case dtArrowAttack:
case dtCactusContact:
case dtLavaContact:
case dtFireContact:
case dtEnderPearl:
case dtExplosion:
{
return true;
} }
} }
ASSERT(!"Invalid damage type!");
}
int cEntity::GetArmorCoverAgainst(const cEntity * a_Attacker, eDamageType a_DamageType, int a_Damage)
{
// Returns the hitpoints out of a_RawDamage that the currently equipped armor would cover
// Filter out damage types that are not protected by armor:
if (!ArmorCoversAgainst(a_DamageType)) return 0;
// Add up all armor points: // Add up all armor points:
// Ref.: http://www.minecraftwiki.net/wiki/Armor#Defense_points as of 2012_12_20 // Ref.: http://www.minecraftwiki.net/wiki/Armor#Defense_points as of 2012_12_20

View File

@ -270,6 +270,9 @@ public:
/// Returns the hitpoints that this pawn can deal to a_Receiver using its equipped items /// Returns the hitpoints that this pawn can deal to a_Receiver using its equipped items
virtual int GetRawDamageAgainst(const cEntity & a_Receiver); virtual int GetRawDamageAgainst(const cEntity & a_Receiver);
/** Returns whether armor will protect against the passed damage type **/
virtual bool ArmorCoversAgainst(eDamageType a_DamageType);
/// Returns the hitpoints out of a_RawDamage that the currently equipped armor would cover /// Returns the hitpoints out of a_RawDamage that the currently equipped armor would cover
virtual int GetArmorCoverAgainst(const cEntity * a_Attacker, eDamageType a_DamageType, int a_RawDamage); virtual int GetArmorCoverAgainst(const cEntity * a_Attacker, eDamageType a_DamageType, int a_RawDamage);

View File

@ -87,7 +87,9 @@ void cFallingBlock::Tick(float a_Dt, cChunk & a_Chunk)
AddSpeedY(MilliDt * -9.8f); AddSpeedY(MilliDt * -9.8f);
AddPosition(GetSpeed() * MilliDt); AddPosition(GetSpeed() * MilliDt);
if ((GetSpeedX() != 0) || (GetSpeedZ() != 0)) // If not static (One billionth precision) broadcast movement.
static const float epsilon = 0.000000001;
if ((fabs(GetSpeedX()) > epsilon) || (fabs(GetSpeedZ()) > epsilon))
{ {
BroadcastMovementUpdate(); BroadcastMovementUpdate();
} }

View File

@ -171,7 +171,6 @@ bool cLineBlockTracer::MoveToNextBlock(void)
double CoeffZ = (DestZ - m_StartZ) / m_DiffZ; double CoeffZ = (DestZ - m_StartZ) / m_DiffZ;
if (CoeffZ < Coeff) if (CoeffZ < Coeff)
{ {
Coeff = CoeffZ;
Direction = dirZ; Direction = dirZ;
} }
} }

View File

@ -9,7 +9,6 @@
cMCLogger * cMCLogger::s_MCLogger = NULL; cMCLogger * cMCLogger::s_MCLogger = NULL;
bool g_ShouldColorOutput = false;
#ifdef _WIN32 #ifdef _WIN32
#include <io.h> // Needed for _isatty(), not available on Linux #include <io.h> // Needed for _isatty(), not available on Linux
@ -33,7 +32,8 @@ cMCLogger * cMCLogger::GetInstance(void)
cMCLogger::cMCLogger(void) cMCLogger::cMCLogger(void):
m_ShouldColorOutput(false)
{ {
AString FileName; AString FileName;
Printf(FileName, "LOG_%d.txt", (int)time(NULL)); Printf(FileName, "LOG_%d.txt", (int)time(NULL));
@ -76,15 +76,15 @@ void cMCLogger::InitLog(const AString & a_FileName)
#ifdef _WIN32 #ifdef _WIN32
// See whether we are writing to a console the default console attrib: // See whether we are writing to a console the default console attrib:
g_ShouldColorOutput = (_isatty(_fileno(stdin)) != 0); m_ShouldColorOutput = (_isatty(_fileno(stdin)) != 0);
if (g_ShouldColorOutput) if (m_ShouldColorOutput)
{ {
CONSOLE_SCREEN_BUFFER_INFO sbi; CONSOLE_SCREEN_BUFFER_INFO sbi;
GetConsoleScreenBufferInfo(g_Console, &sbi); GetConsoleScreenBufferInfo(g_Console, &sbi);
g_DefaultConsoleAttrib = sbi.wAttributes; g_DefaultConsoleAttrib = sbi.wAttributes;
} }
#elif defined (__linux) && !defined(ANDROID_NDK) #elif defined (__linux) && !defined(ANDROID_NDK)
g_ShouldColorOutput = isatty(fileno(stdout)); m_ShouldColorOutput = isatty(fileno(stdout));
// TODO: Check if the terminal supports colors, somehow? // TODO: Check if the terminal supports colors, somehow?
#endif #endif
} }
@ -178,7 +178,7 @@ void cMCLogger::Error(const char * a_Format, va_list a_ArgList)
void cMCLogger::SetColor(eColorScheme a_Scheme) void cMCLogger::SetColor(eColorScheme a_Scheme)
{ {
if (!g_ShouldColorOutput) if (!m_ShouldColorOutput)
{ {
return; return;
} }
@ -211,7 +211,7 @@ void cMCLogger::SetColor(eColorScheme a_Scheme)
void cMCLogger::ResetColor(void) void cMCLogger::ResetColor(void)
{ {
if (!g_ShouldColorOutput) if (!m_ShouldColorOutput)
{ {
return; return;
} }

View File

@ -52,6 +52,7 @@ private:
cCriticalSection m_CriticalSection; cCriticalSection m_CriticalSection;
cLog * m_Log; cLog * m_Log;
static cMCLogger * s_MCLogger; static cMCLogger * s_MCLogger;
bool m_ShouldColorOutput;
/// Sets the specified color scheme in the terminal (TODO: if coloring available) /// Sets the specified color scheme in the terminal (TODO: if coloring available)

View File

@ -37,7 +37,7 @@ void cAggressiveMonster::InStateChasing(float a_Dt)
} }
} }
if (((float)m_FinalDestination.x != (float)m_Target->GetPosX()) || ((float)m_FinalDestination.z != (float)m_Target->GetPosZ())) if (!IsMovingToTargetPosition())
{ {
MoveToPosition(m_Target->GetPosition()); MoveToPosition(m_Target->GetPosition());
} }
@ -106,3 +106,18 @@ void cAggressiveMonster::Attack(float a_Dt)
bool cAggressiveMonster::IsMovingToTargetPosition()
{
float epsilon = 0.000000000001;
// Difference between destination x and target x is negligible (to 10^-12 precision)
if (fabsf((float)m_FinalDestination.x - (float)m_Target->GetPosX()) < epsilon)
{
return false;
}
// Difference between destination z and target z is negligible (to 10^-12 precision)
else if (fabsf(m_FinalDestination.z - (float)m_Target->GetPosZ()) > epsilon)
{
return false;
}
return true;
}

View File

@ -22,6 +22,10 @@ public:
virtual void EventSeePlayer(cEntity *) override; virtual void EventSeePlayer(cEntity *) override;
virtual void Attack(float a_Dt); virtual void Attack(float a_Dt);
protected:
/** Whether this mob's destination is the same as its target's position. */
bool IsMovingToTargetPosition();
} ; } ;

View File

@ -761,8 +761,10 @@ cMonster::eFamily cMonster::FamilyFromType(eType a_Type)
case mtChicken: return mfPassive; case mtChicken: return mfPassive;
case mtCow: return mfPassive; case mtCow: return mfPassive;
case mtCreeper: return mfHostile; case mtCreeper: return mfHostile;
case mtEnderDragon: return mfNoSpawn;
case mtEnderman: return mfHostile; case mtEnderman: return mfHostile;
case mtGhast: return mfHostile; case mtGhast: return mfHostile;
case mtGiant: return mfNoSpawn;
case mtHorse: return mfPassive; case mtHorse: return mfPassive;
case mtIronGolem: return mfPassive; case mtIronGolem: return mfPassive;
case mtMagmaCube: return mfHostile; case mtMagmaCube: return mfHostile;
@ -773,17 +775,20 @@ cMonster::eFamily cMonster::FamilyFromType(eType a_Type)
case mtSilverfish: return mfHostile; case mtSilverfish: return mfHostile;
case mtSkeleton: return mfHostile; case mtSkeleton: return mfHostile;
case mtSlime: return mfHostile; case mtSlime: return mfHostile;
case mtSnowGolem: return mfNoSpawn;
case mtSpider: return mfHostile; case mtSpider: return mfHostile;
case mtSquid: return mfWater; case mtSquid: return mfWater;
case mtVillager: return mfPassive; case mtVillager: return mfPassive;
case mtWitch: return mfHostile; case mtWitch: return mfHostile;
case mtWither: return mfHostile; case mtWither: return mfNoSpawn;
case mtWolf: return mfHostile; case mtWolf: return mfHostile;
case mtZombie: return mfHostile; case mtZombie: return mfHostile;
case mtZombiePigman: return mfHostile; case mtZombiePigman: return mfHostile;
} ;
case mtInvalidType: break;
}
ASSERT(!"Unhandled mob type"); ASSERT(!"Unhandled mob type");
return mfMaxplusone; return mfUnhandled;
} }
@ -794,10 +799,12 @@ int cMonster::GetSpawnDelay(cMonster::eFamily a_MobFamily)
{ {
switch (a_MobFamily) switch (a_MobFamily)
{ {
case mfHostile: return 40; case mfHostile: return 40;
case mfPassive: return 40; case mfPassive: return 40;
case mfAmbient: return 40; case mfAmbient: return 40;
case mfWater: return 400; case mfWater: return 400;
case mfNoSpawn: return -1;
case mfUnhandled: break;
} }
ASSERT(!"Unhandled mob family"); ASSERT(!"Unhandled mob family");
return -1; return -1;
@ -866,6 +873,7 @@ cMonster * cMonster::NewMonsterFromType(cMonster::eType a_MobType)
case mtEnderDragon: toReturn = new cEnderDragon(); break; case mtEnderDragon: toReturn = new cEnderDragon(); break;
case mtEnderman: toReturn = new cEnderman(); break; case mtEnderman: toReturn = new cEnderman(); break;
case mtGhast: toReturn = new cGhast(); break; case mtGhast: toReturn = new cGhast(); break;
case mtGiant: toReturn = new cGiant(); break;
case mtIronGolem: toReturn = new cIronGolem(); break; case mtIronGolem: toReturn = new cIronGolem(); break;
case mtMooshroom: toReturn = new cMooshroom(); break; case mtMooshroom: toReturn = new cMooshroom(); break;
case mtOcelot: toReturn = new cOcelot(); break; case mtOcelot: toReturn = new cOcelot(); break;

View File

@ -66,7 +66,8 @@ public:
mfAmbient = 2, // Bats mfAmbient = 2, // Bats
mfWater = 3, // Squid mfWater = 3, // Squid
mfMaxplusone, // Nothing. Be sure this is the last and the others are in order mfNoSpawn,
mfUnhandled, // Nothing. Be sure this is the last and the others are in order
} ; } ;
// tolua_end // tolua_end

View File

@ -67,11 +67,11 @@ bool cFile::Open(const AString & iFileName, eMode iMode)
case fmRead: Mode = "rb"; break; case fmRead: Mode = "rb"; break;
case fmWrite: Mode = "wb"; break; case fmWrite: Mode = "wb"; break;
case fmReadWrite: Mode = "rb+"; break; case fmReadWrite: Mode = "rb+"; break;
default: }
{ if (Mode == NULL)
ASSERT(!"Unhandled file mode"); {
return false; ASSERT(!"Unhandled file mode");
} return false;
} }
#ifdef _WIN32 #ifdef _WIN32

View File

@ -316,12 +316,9 @@ int cWorld::GetDefaultWeatherInterval(eWeather a_Weather)
{ {
return 2400 + (m_TickRand.randInt() % 4800); // 2 - 6 minutes return 2400 + (m_TickRand.randInt() % 4800); // 2 - 6 minutes
} }
default: }
{ LOGWARNING("%s: Missing default weather interval for weather %d.", __FUNCTION__, a_Weather);
LOGWARNING("%s: Missing default weather interval for weather %d.", __FUNCTION__, a_Weather); return -1;
return -1;
}
} // switch (Weather)
} }
@ -521,21 +518,6 @@ void cWorld::Start(void)
} }
AString Dimension = IniFile.GetValueSet("General", "Dimension", "Overworld"); AString Dimension = IniFile.GetValueSet("General", "Dimension", "Overworld");
m_Dimension = StringToDimension(Dimension); m_Dimension = StringToDimension(Dimension);
switch (m_Dimension)
{
case dimNether:
case dimOverworld:
case dimEnd:
{
break;
}
default:
{
LOGWARNING("Unknown dimension: \"%s\". Setting to Overworld", Dimension.c_str());
m_Dimension = dimOverworld;
break;
}
} // switch (m_Dimension)
// Try to find the "SpawnPosition" key and coord values in the world configuration, set the flag if found // Try to find the "SpawnPosition" key and coord values in the world configuration, set the flag if found
int KeyNum = IniFile.FindKey("SpawnPosition"); int KeyNum = IniFile.FindKey("SpawnPosition");
@ -592,12 +574,6 @@ void cWorld::Start(void)
case dimOverworld: DefaultMonsters = "bat, cavespider, chicken, cow, creeper, enderman, horse, mooshroom, ocelot, pig, sheep, silverfish, skeleton, slime, spider, squid, wolf, zombie"; break; case dimOverworld: DefaultMonsters = "bat, cavespider, chicken, cow, creeper, enderman, horse, mooshroom, ocelot, pig, sheep, silverfish, skeleton, slime, spider, squid, wolf, zombie"; break;
case dimNether: DefaultMonsters = "blaze, ghast, magmacube, skeleton, zombie, zombiepigman"; break; case dimNether: DefaultMonsters = "blaze, ghast, magmacube, skeleton, zombie, zombiepigman"; break;
case dimEnd: DefaultMonsters = "enderman"; break; case dimEnd: DefaultMonsters = "enderman"; break;
default:
{
ASSERT(!"Unhandled world dimension");
DefaultMonsters = "wither";
break;
}
} }
m_bAnimals = IniFile.GetValueSetB("Monsters", "AnimalsOn", true); m_bAnimals = IniFile.GetValueSetB("Monsters", "AnimalsOn", true);
AString AllMonsters = IniFile.GetValueSet("Monsters", "Types", DefaultMonsters); AString AllMonsters = IniFile.GetValueSet("Monsters", "Types", DefaultMonsters);
@ -687,6 +663,30 @@ void cWorld::GenerateRandomSpawn(void)
eWeather cWorld::ChooseNewWeather()
{
// Pick a new weather. Only reasonable transitions allowed:
switch (m_Weather)
{
case eWeather_Sunny:
case eWeather_ThunderStorm: return eWeather_Rain;
case eWeather_Rain:
{
// 1/8 chance of turning into a thunderstorm
return ((m_TickRand.randInt() % 256) < 32) ? eWeather_ThunderStorm : eWeather_Sunny;
}
}
LOGWARNING("Unknown current weather: %d. Setting sunny.", m_Weather);
ASSERT(!"Unknown weather");
return eWeather_Sunny;
}
void cWorld::Stop(void) void cWorld::Stop(void)
{ {
// Delete the clients that have been in this world: // Delete the clients that have been in this world:
@ -786,30 +786,8 @@ void cWorld::TickWeather(float a_Dt)
else else
{ {
// Change weather: // Change weather:
SetWeather(ChooseNewWeather());
// Pick a new weather. Only reasonable transitions allowed: }
eWeather NewWeather = m_Weather;
switch (m_Weather)
{
case eWeather_Sunny: NewWeather = eWeather_Rain; break;
case eWeather_ThunderStorm: NewWeather = eWeather_Rain; break;
case eWeather_Rain:
{
// 1/8 chance of turning into a thunderstorm
NewWeather = ((m_TickRand.randInt() % 256) < 32) ? eWeather_ThunderStorm : eWeather_Sunny;
break;
}
default:
{
LOGWARNING("Unknown current weather: %d. Setting sunny.", m_Weather);
ASSERT(!"Unknown weather");
NewWeather = eWeather_Sunny;
}
}
SetWeather(NewWeather);
} // else (m_WeatherInterval > 0)
if (m_Weather == eWeather_ThunderStorm) if (m_Weather == eWeather_ThunderStorm)
{ {

View File

@ -938,7 +938,10 @@ private:
/** <summary>Generates a random spawnpoint on solid land by walking chunks and finding their biomes</summary> */ /** <summary>Generates a random spawnpoint on solid land by walking chunks and finding their biomes</summary> */
void GenerateRandomSpawn(void); void GenerateRandomSpawn(void);
/** Chooses a reasonable transition from the current weather to a new weather **/
eWeather ChooseNewWeather(void);
/** Creates a new fluid simulator, loads its settings from the inifile (a_FluidName section) */ /** Creates a new fluid simulator, loads its settings from the inifile (a_FluidName section) */
cFluidSimulator * InitializeFluidSimulator(cIniFile & a_IniFile, const char * a_FluidName, BLOCKTYPE a_SimulateBlock, BLOCKTYPE a_StationaryBlock); cFluidSimulator * InitializeFluidSimulator(cIniFile & a_IniFile, const char * a_FluidName, BLOCKTYPE a_SimulateBlock, BLOCKTYPE a_StationaryBlock);

View File

@ -621,10 +621,10 @@ void cNBTChunkSerializer::AddHangingEntity(cHangingEntity * a_Hanging)
m_Writer.AddInt("TileZ", a_Hanging->GetTileZ()); m_Writer.AddInt("TileZ", a_Hanging->GetTileZ());
switch (a_Hanging->GetDirection()) switch (a_Hanging->GetDirection())
{ {
case 0: m_Writer.AddByte("Dir", (unsigned char)2); break; case BLOCK_FACE_YM: m_Writer.AddByte("Dir", (unsigned char)2); break;
case 1: m_Writer.AddByte("Dir", (unsigned char)1); break; case BLOCK_FACE_YP: m_Writer.AddByte("Dir", (unsigned char)1); break;
case 2: m_Writer.AddByte("Dir", (unsigned char)0); break; case BLOCK_FACE_ZM: m_Writer.AddByte("Dir", (unsigned char)0); break;
case 3: m_Writer.AddByte("Dir", (unsigned char)3); break; case BLOCK_FACE_ZP: m_Writer.AddByte("Dir", (unsigned char)3); break;
} }
} }

View File

@ -797,7 +797,6 @@ void cWSSCompact::cPAKFile::UpdateChunk2To3()
++index2; ++index2;
} }
InChunkOffset += index2 / 2; InChunkOffset += index2 / 2;
index2 = 0;
AString Converted(ConvertedData, ExpectedSize); AString Converted(ConvertedData, ExpectedSize);