Merge branch 'master' into Slabs
commit
27b98dec2b
|
@ -0,0 +1,29 @@
|
|||
|
||||
-- @EnableMobDebug.lua
|
||||
|
||||
-- Enables the MobDebug debugger, used by ZeroBrane Studio, for a plugin
|
||||
-- Needs to be named with a @ at the start so that it's loaded as the first file of the plugin
|
||||
|
||||
--[[
|
||||
Usage:
|
||||
Copy this file to your plugin's folder when you want to debug that plugin
|
||||
You should neither check this file into the plugin's version control system,
|
||||
nor distribute it in the final release.
|
||||
--]]
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
-- Try to load the debugger, be silent about failures:
|
||||
local IsSuccess, MobDebug = pcall(require, "mobdebug")
|
||||
if (IsSuccess) then
|
||||
MobDebug.start()
|
||||
|
||||
-- The debugger will automatically put a breakpoint on this line, use this opportunity to set more breakpoints in your code
|
||||
LOG(cPluginManager:GetCurrentPlugin():GetName() .. ": MobDebug enabled")
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
Binary file not shown.
|
@ -47,8 +47,12 @@ if (WIN32)
|
|||
)
|
||||
endif()
|
||||
|
||||
set_target_properties(lua PROPERTIES OUTPUT_NAME "lua51")
|
||||
|
||||
# NOTE: The DLL for each configuration is stored at the same place, thus overwriting each other.
|
||||
# This is known, however such behavior is needed for LuaRocks - they always load "lua.dll"
|
||||
# This is known, however such behavior is needed for LuaRocks - they always load "lua5.1.dll" or "lua51.dll"
|
||||
# We make it work by compiling to "lua51.dll" and providing a proxy-DLL "lua5.1.dll"
|
||||
# See http://lua-users.org/wiki/LuaProxyDllFour for details
|
||||
else()
|
||||
add_library(lua ${SOURCE})
|
||||
endif()
|
||||
|
|
|
@ -30,48 +30,70 @@ cJukeboxEntity::~cJukeboxEntity()
|
|||
|
||||
void cJukeboxEntity::UsedBy(cPlayer * a_Player)
|
||||
{
|
||||
if (m_Record == 0)
|
||||
{
|
||||
const cItem & HeldItem = a_Player->GetEquippedItem();
|
||||
if (HeldItem.m_ItemType >= 2256 && HeldItem.m_ItemType <= 2267)
|
||||
{
|
||||
m_Record = HeldItem.m_ItemType;
|
||||
a_Player->GetInventory().RemoveOneEquippedItem();
|
||||
PlayRecord();
|
||||
}
|
||||
}
|
||||
else
|
||||
if (IsPlayingRecord())
|
||||
{
|
||||
EjectRecord();
|
||||
}
|
||||
else
|
||||
{
|
||||
const cItem & HeldItem = a_Player->GetEquippedItem();
|
||||
if (PlayRecord(HeldItem.m_ItemType))
|
||||
{
|
||||
a_Player->GetInventory().RemoveOneEquippedItem();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -1532,6 +1532,10 @@ void cPlayer::LoadPermissionsFromDisk()
|
|||
AStringVector Split = StringSplit( Groups, "," );
|
||||
for( unsigned int i = 0; i < Split.size(); i++ )
|
||||
{
|
||||
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());
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -92,7 +92,7 @@ void cLog::ClearLog()
|
|||
if( m_File )
|
||||
fclose (m_File);
|
||||
#endif
|
||||
m_File = 0;
|
||||
m_File = NULL;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
25
src/main.cpp
25
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
|
||||
|
|
Loading…
Reference in New Issue