summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/BlockEntities/JukeboxEntity.cpp48
-rw-r--r--src/BlockEntities/JukeboxEntity.h16
-rw-r--r--src/BlockID.h4
-rw-r--r--src/Entities/Player.cpp13
-rw-r--r--src/GroupManager.cpp47
-rw-r--r--src/GroupManager.h2
-rw-r--r--src/Log.cpp4
-rw-r--r--src/Mobs/Mooshroom.cpp2
-rw-r--r--src/Root.cpp4
-rw-r--r--src/Server.cpp2
-rw-r--r--src/WorldStorage/FastNBT.h9
-rw-r--r--src/main.cpp27
12 files changed, 137 insertions, 41 deletions
diff --git a/src/BlockEntities/JukeboxEntity.cpp b/src/BlockEntities/JukeboxEntity.cpp
index 33042179d..c96253b11 100644
--- a/src/BlockEntities/JukeboxEntity.cpp
+++ b/src/BlockEntities/JukeboxEntity.cpp
@@ -30,48 +30,70 @@ cJukeboxEntity::~cJukeboxEntity()
void cJukeboxEntity::UsedBy(cPlayer * a_Player)
{
- if (m_Record == 0)
+ if (IsPlayingRecord())
+ {
+ EjectRecord();
+ }
+ else
{
const cItem & HeldItem = a_Player->GetEquippedItem();
- if (HeldItem.m_ItemType >= 2256 && HeldItem.m_ItemType <= 2267)
+ if (PlayRecord(HeldItem.m_ItemType))
{
- m_Record = HeldItem.m_ItemType;
a_Player->GetInventory().RemoveOneEquippedItem();
- PlayRecord();
}
}
- else
- {
- EjectRecord();
- }
}
-void cJukeboxEntity::PlayRecord(void)
+bool cJukeboxEntity::PlayRecord(int a_Record)
{
+ if (!IsRecordItem(a_Record))
+ {
+ // This isn't a Record Item
+ return false;
+ }
+ if (IsPlayingRecord())
+ {
+ // A Record is already in the Jukebox.
+ EjectRecord();
+ }
+ m_Record = a_Record;
m_World->BroadcastSoundParticleEffect(1005, m_PosX, m_PosY, m_PosZ, m_Record);
+ m_World->SetBlockMeta(m_PosX, m_PosY, m_PosZ, E_META_JUKEBOX_ON);
+ return true;
}
-void cJukeboxEntity::EjectRecord(void)
+bool cJukeboxEntity::EjectRecord(void)
{
- if ((m_Record < E_ITEM_FIRST_DISC) || (m_Record > E_ITEM_LAST_DISC))
+ if (!IsPlayingRecord())
{
// There's no record here
- return;
+ return false;
}
cItems Drops;
Drops.push_back(cItem(m_Record, 1, 0));
+ m_Record = 0;
m_World->SpawnItemPickups(Drops, m_PosX + 0.5, m_PosY + 1, m_PosZ + 0.5, 8);
m_World->BroadcastSoundParticleEffect(1005, m_PosX, m_PosY, m_PosZ, 0);
- m_Record = 0;
+ m_World->SetBlockMeta(m_PosX, m_PosY, m_PosZ, E_META_JUKEBOX_OFF);
+ return true;
+}
+
+
+
+
+
+bool cJukeboxEntity::IsPlayingRecord(void)
+{
+ return (m_Record != 0);
}
diff --git a/src/BlockEntities/JukeboxEntity.h b/src/BlockEntities/JukeboxEntity.h
index 734d7bb66..01ce52494 100644
--- a/src/BlockEntities/JukeboxEntity.h
+++ b/src/BlockEntities/JukeboxEntity.h
@@ -37,10 +37,20 @@ public:
int GetRecord(void);
void SetRecord(int a_Record);
- void PlayRecord(void);
- /// Ejects the currently held record as a pickup. Does nothing when no record inserted.
- void EjectRecord(void);
+ /** Play a Record. Return false, when a_Record isn't a Record */
+ bool PlayRecord(int a_Record);
+
+ /** Ejects the currently held record as a pickup. Return false when no record inserted. */
+ bool EjectRecord(void);
+
+ /** Is in the Jukebox a Record? */
+ bool IsPlayingRecord(void);
+
+ static bool IsRecordItem(int a_Item)
+ {
+ return ((a_Item >= E_ITEM_FIRST_DISC) && (a_Item <= E_ITEM_LAST_DISC));
+ }
// tolua_end
diff --git a/src/BlockID.h b/src/BlockID.h
index 3413555f4..861bb8dae 100644
--- a/src/BlockID.h
+++ b/src/BlockID.h
@@ -466,6 +466,10 @@ enum
E_META_FLOWER_PINK_TULIP = 7,
E_META_FLOWER_OXEYE_DAISY = 8,
+ // E_BLOCK_JUKEBOX metas
+ E_META_JUKEBOX_OFF = 0,
+ E_META_JUKEBOX_ON = 1,
+
// E_BLOCK_HOPPER metas:
E_META_HOPPER_FACING_YM = 0,
E_META_HOPPER_UNATTACHED = 1, // Hopper doesn't move items up, there's no YP
diff --git a/src/Entities/Player.cpp b/src/Entities/Player.cpp
index 0152bfc5b..e0f0b9222 100644
--- a/src/Entities/Player.cpp
+++ b/src/Entities/Player.cpp
@@ -1532,7 +1532,11 @@ void cPlayer::LoadPermissionsFromDisk()
AStringVector Split = StringSplit( Groups, "," );
for( unsigned int i = 0; i < Split.size(); i++ )
{
- AddToGroup( Split[i].c_str() );
+ if (!cRoot::Get()->GetGroupManager()->ExistsGroup(Split[i]))
+ {
+ LOGWARNING("The group %s for player %s was not found!", Split[i].c_str(), m_PlayerName.c_str());
+ }
+ AddToGroup(Split[i].c_str());
}
}
else
@@ -1544,12 +1548,7 @@ void cPlayer::LoadPermissionsFromDisk()
}
else
{
- LOGWARN("Regenerating users.ini, player %s will be added to the \"Default\" group", m_PlayerName.c_str());
- IniFile.AddHeaderComment(" This is the file in which the group the player belongs to is stored");
- IniFile.AddHeaderComment(" The format is: [PlayerName] | Groups=GroupName");
-
- IniFile.SetValue(m_PlayerName, "Groups", "Default");
- IniFile.WriteFile("users.ini");
+ cRoot::Get()->GetGroupManager()->CheckUsers();
AddToGroup("Default");
}
ResolvePermissions();
diff --git a/src/GroupManager.cpp b/src/GroupManager.cpp
index 723b86f94..5125e7586 100644
--- a/src/GroupManager.cpp
+++ b/src/GroupManager.cpp
@@ -46,6 +46,7 @@ cGroupManager::cGroupManager()
LOGD("-- Loading Groups --");
LoadGroups();
+ CheckUsers();
LOGD("-- Groups Successfully Loaded --");
}
@@ -54,6 +55,42 @@ cGroupManager::cGroupManager()
+void cGroupManager::CheckUsers(void)
+{
+ cIniFile IniFile;
+ if (!IniFile.ReadFile("users.ini"))
+ {
+ LOGWARN("Regenerating users.ini, all users will be reset");
+ IniFile.AddHeaderComment(" This is the file in which the group the player belongs to is stored");
+ IniFile.AddHeaderComment(" The format is: [PlayerName] | Groups=GroupName");
+
+ IniFile.WriteFile("users.ini");
+ return;
+ }
+
+ unsigned int NumKeys = IniFile.GetNumKeys();
+ for (size_t i = 0; i < NumKeys; i++)
+ {
+ AString Player = IniFile.GetKeyName( i );
+ AString Groups = IniFile.GetValue(Player, "Groups", "");
+ if (!Groups.empty())
+ {
+ AStringVector Split = StringSplit( Groups, "," );
+ for( unsigned int i = 0; i < Split.size(); i++ )
+ {
+ if (!ExistsGroup(Split[i]))
+ {
+ LOGWARNING("The group %s for player %s was not found!", Split[i].c_str(), Player.c_str());
+ }
+ }
+ }
+ }
+}
+
+
+
+
+
void cGroupManager::LoadGroups()
{
cIniFile IniFile;
@@ -137,6 +174,16 @@ void cGroupManager::LoadGroups()
+bool cGroupManager::ExistsGroup( const AString & a_Name )
+{
+ GroupMap::iterator itr = m_pState->Groups.find( a_Name );
+ return ( itr != m_pState->Groups.end() );
+}
+
+
+
+
+
cGroup* cGroupManager::GetGroup( const AString & a_Name )
{
GroupMap::iterator itr = m_pState->Groups.find( a_Name );
diff --git a/src/GroupManager.h b/src/GroupManager.h
index 02a58fe4e..377a54c98 100644
--- a/src/GroupManager.h
+++ b/src/GroupManager.h
@@ -14,8 +14,10 @@ class cGroup;
class cGroupManager
{
public:
+ bool ExistsGroup(const AString & a_Name);
cGroup * GetGroup(const AString & a_Name);
void LoadGroups(void);
+ void CheckUsers(void);
private:
friend class cRoot;
diff --git a/src/Log.cpp b/src/Log.cpp
index 2d6be0f59..1ea327d5d 100644
--- a/src/Log.cpp
+++ b/src/Log.cpp
@@ -42,7 +42,7 @@ cLog::~cLog()
-cLog* cLog::GetInstance()
+cLog * cLog::GetInstance()
{
if (s_Log != NULL)
{
@@ -92,7 +92,7 @@ void cLog::ClearLog()
if( m_File )
fclose (m_File);
#endif
- m_File = 0;
+ m_File = NULL;
}
diff --git a/src/Mobs/Mooshroom.cpp b/src/Mobs/Mooshroom.cpp
index 8e4c52ae6..81bd3e3b4 100644
--- a/src/Mobs/Mooshroom.cpp
+++ b/src/Mobs/Mooshroom.cpp
@@ -67,6 +67,8 @@ void cMooshroom::OnRightClicked(cPlayer & a_Player)
cItems Drops;
Drops.push_back(cItem(E_BLOCK_RED_MUSHROOM, 5, 0));
m_World->SpawnItemPickups(Drops, GetPosX(), GetPosY(), GetPosZ(), 10);
+ m_World->SpawnMob(GetPosX(), GetPosY(), GetPosZ(), cMonster::mtCow);
+ Destroy();
} break;
}
}
diff --git a/src/Root.cpp b/src/Root.cpp
index 206255916..af2cb9e4b 100644
--- a/src/Root.cpp
+++ b/src/Root.cpp
@@ -194,7 +194,7 @@ void cRoot::Start(void)
#if !defined(ANDROID_NDK)
LOGD("Starting InputThread...");
m_InputThread = new cThread( InputThread, this, "cRoot::InputThread" );
- m_InputThread->Start( false ); // We should NOT wait? Otherwise we canīt stop the server from other threads than the input thread
+ m_InputThread->Start( false ); // We should NOT wait? Otherwise we can't stop the server from other threads than the input thread
#endif
long long finishmseconds = Time.GetNowTime();
@@ -536,7 +536,9 @@ void cRoot::SaveAllChunks(void)
void cRoot::ReloadGroups(void)
{
+ LOG("Reload groups ...");
m_GroupManager->LoadGroups();
+ m_GroupManager->CheckUsers();
}
diff --git a/src/Server.cpp b/src/Server.cpp
index c60418b41..fcbcaa919 100644
--- a/src/Server.cpp
+++ b/src/Server.cpp
@@ -472,6 +472,8 @@ void cServer::ExecuteConsoleCommand(const AString & a_Cmd, cCommandOutputCallbac
if (split[0] == "reloadgroups")
{
cRoot::Get()->ReloadGroups();
+ a_Output.Out("Groups reloaded!");
+ a_Output.Finished();
return;
}
diff --git a/src/WorldStorage/FastNBT.h b/src/WorldStorage/FastNBT.h
index a78b610cb..49f97c458 100644
--- a/src/WorldStorage/FastNBT.h
+++ b/src/WorldStorage/FastNBT.h
@@ -173,13 +173,14 @@ public:
{
ASSERT(m_Tags[a_Tag].m_Type == TAG_Float);
- // Cause a compile-time error if sizeof(int) != sizeof(float)
- char Check1[sizeof(int) - sizeof(float) + 1]; // sizeof(int) >= sizeof(float)
- char Check2[sizeof(float) - sizeof(int) + 1]; // sizeof(float) >= sizeof(int)
+ // Cause a compile-time error if sizeof(float) != 4
+ // If your platform produces a compiler error here, you'll need to add code that manually decodes 32-bit floats
+ char Check1[5 - sizeof(float)]; // sizeof(float) <= 4
+ char Check2[sizeof(float) - 3]; // sizeof(float) >= 4
UNUSED(Check1);
UNUSED(Check2);
- int i = GetBEInt(m_Data + m_Tags[a_Tag].m_DataStart);
+ Int32 i = GetBEInt(m_Data + m_Tags[a_Tag].m_DataStart);
float f;
memcpy(&f, &i, sizeof(f));
return f;
diff --git a/src/main.cpp b/src/main.cpp
index 4d2801926..2ae8a413b 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -243,31 +243,36 @@ int main( int argc, char **argv )
// Check if comm logging is to be enabled:
for (int i = 0; i < argc; i++)
{
+ AString Arg(argv[i]);
if (
- (NoCaseCompare(argv[i], "/commlog") == 0) ||
- (NoCaseCompare(argv[i], "/logcomm") == 0)
+ (NoCaseCompare(Arg, "/commlog") == 0) ||
+ (NoCaseCompare(Arg, "/logcomm") == 0)
)
{
g_ShouldLogCommIn = true;
g_ShouldLogCommOut = true;
}
- if (
- (NoCaseCompare(argv[i], "/commlogin") == 0) ||
- (NoCaseCompare(argv[i], "/comminlog") == 0) ||
- (NoCaseCompare(argv[i], "/logcommin") == 0)
+ else if (
+ (NoCaseCompare(Arg, "/commlogin") == 0) ||
+ (NoCaseCompare(Arg, "/comminlog") == 0) ||
+ (NoCaseCompare(Arg, "/logcommin") == 0)
)
{
g_ShouldLogCommIn = true;
}
- if (
- (NoCaseCompare(argv[i], "/commlogout") == 0) ||
- (NoCaseCompare(argv[i], "/commoutlog") == 0) ||
- (NoCaseCompare(argv[i], "/logcommout") == 0)
+ else if (
+ (NoCaseCompare(Arg, "/commlogout") == 0) ||
+ (NoCaseCompare(Arg, "/commoutlog") == 0) ||
+ (NoCaseCompare(Arg, "/logcommout") == 0)
)
{
g_ShouldLogCommOut = true;
}
- }
+ else if (NoCaseCompare(Arg, "nooutbuf") == 0)
+ {
+ setvbuf(stdout, NULL, _IONBF, 0);
+ }
+ } // for i - argv[]
#if !defined(ANDROID_NDK)
try