1
0

Merge branch 'master' into BlockTracing

This commit is contained in:
madmaxoft 2013-08-05 16:02:41 +02:00
commit c0066e7260
14 changed files with 1199 additions and 719 deletions

View File

@ -1852,6 +1852,10 @@
RelativePath="..\source\blocks\BlockCactus.h" RelativePath="..\source\blocks\BlockCactus.h"
> >
</File> </File>
<File
RelativePath="..\source\Blocks\BlockCarpet.h"
>
</File>
<File <File
RelativePath="..\source\Blocks\BlockCauldron.h" RelativePath="..\source\Blocks\BlockCauldron.h"
> >

View File

@ -0,0 +1,89 @@
<?xml version="1.0" encoding="UTF-8"?>
<VisualStudioUserFile
ProjectType="Visual C++"
Version="9,00"
ShowAllFiles="false"
>
<Configurations>
<Configuration
Name="Debug|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory="..\MCServer"
CommandArguments=""
Attach="false"
DebuggerType="3"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor="0"
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
<Configuration
Name="Release|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory="..\MCServer"
CommandArguments=""
Attach="false"
DebuggerType="3"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor="0"
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
<Configuration
Name="Release profiled|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory="..\MCServer"
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="ASAGA"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor="0"
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
</Configurations>
</VisualStudioUserFile>

File diff suppressed because it is too large Load Diff

View File

@ -30,135 +30,155 @@
class cIniFile // tolua_export // tolua_begin
{ // tolua_export
class cIniFile
{
private: private:
bool caseInsensitive; bool m_IsCaseInsensitive;
std::string path; std::string m_Path;
struct key {
struct key
{
std::vector<std::string> names; std::vector<std::string> names;
std::vector<std::string> values; std::vector<std::string> values;
std::vector<std::string> comments; std::vector<std::string> comments;
}; } ;
std::vector<key> keys;
std::vector<std::string> names; std::vector<key> keys;
std::vector<std::string> names;
std::vector<std::string> comments; std::vector<std::string> comments;
std::string CheckCase( std::string s) const;
/// If the object is case-insensitive, returns s as lowercase; otherwise returns s as-is
std::string CheckCase(const std::string & s) const;
public: public:
enum errors{ noID = -1}; // tolua_export enum errors
cIniFile( const std::string iniPath = ""); // tolua_export {
virtual ~cIniFile() {} noID = -1,
};
/// Creates a new instance; sets m_Path to a_Path, but doesn't read the file
cIniFile(const std::string & a_Path = "");
// Sets whether or not keynames and valuenames should be case sensitive. // Sets whether or not keynames and valuenames should be case sensitive.
// The default is case insensitive. // The default is case insensitive.
void CaseSensitive() {caseInsensitive = false;} // tolua_export void CaseSensitive (void) { m_IsCaseInsensitive = false; }
void CaseInsensitive() {caseInsensitive = true;} // tolua_export void CaseInsensitive(void) { m_IsCaseInsensitive = true; }
// Sets path of ini file to read and write from. // Sets path of ini file to read and write from.
void Path(const std::string & newPath) {path = newPath;} // tolua_export void Path(const std::string & newPath) {m_Path = newPath;}
std::string Path() const {return path;} // tolua_export const std::string & Path(void) const {return m_Path;}
void SetPath(const std::string & newPath) {Path( newPath);} // tolua_export void SetPath(const std::string & newPath) {Path(newPath);}
// Reads ini file specified using path. /** Reads the ini file specified in m_Path
// Returns true if successful, false otherwise. If the file doesn't exist and a_AllowExampleRedirect is true, tries to read <basename>.example.ini, and
bool ReadFile(); // tolua_export writes its contents as <basename>.ini, if successful.
Returns true if successful, false otherwise.
*/
bool ReadFile(bool a_AllowExampleRedirect = true);
// Writes data stored in class to ini file. /// Writes data stored in class to ini file specified in m_Path
bool WriteFile(); // tolua_export bool WriteFile(void) const;
// Deletes all stored ini data. /// Deletes all stored ini data (but doesn't touch the file)
void Erase(); // tolua_export void Clear(void);
void Clear() {Erase();} // tolua_export void Reset(void) { Clear(); }
void Reset() {Erase();} // tolua_export void Erase(void) { Clear(); } // OBSOLETE, this name is misguiding and will be removed from the interface
// Returns index of specified key, or noID if not found. /// Returns index of specified key, or noID if not found
long FindKey( const std::string & keyname) const; // tolua_export long FindKey(const std::string & keyname) const;
// Returns index of specified value, in the specified key, or noID if not found. /// Returns index of specified value, in the specified key, or noID if not found
long FindValue( const unsigned keyID, const std::string & valuename) const; // tolua_export long FindValue(const unsigned keyID, const std::string & valuename) const;
// Returns number of keys currently in the ini. /// Returns number of keys currently in the ini
unsigned NumKeys() const {return names.size();} // tolua_export unsigned NumKeys (void) const {return names.size();}
unsigned GetNumKeys() const {return NumKeys();} // tolua_export unsigned GetNumKeys(void) const {return NumKeys();}
// Add a key name. /// Add a key name
unsigned AddKeyName( const std::string & keyname); // tolua_export unsigned AddKeyName(const std::string & keyname);
// Returns key names by index. // Returns key names by index.
std::string KeyName( const unsigned keyID) const; // tolua_export std::string KeyName(const unsigned keyID) const;
std::string GetKeyName( const unsigned keyID) const {return KeyName(keyID);} // tolua_export std::string GetKeyName(const unsigned keyID) const {return KeyName(keyID);}
// Returns number of values stored for specified key. // Returns number of values stored for specified key.
unsigned NumValues( const std::string & keyname); // tolua_export unsigned NumValues (const std::string & keyname);
unsigned GetNumValues( const std::string & keyname) {return NumValues( keyname);} // tolua_export unsigned GetNumValues(const std::string & keyname) {return NumValues(keyname);}
unsigned NumValues( const unsigned keyID); // tolua_export unsigned NumValues (const unsigned keyID);
unsigned GetNumValues( const unsigned keyID) {return NumValues( keyID);} // tolua_export unsigned GetNumValues(const unsigned keyID) {return NumValues(keyID);}
// Returns value name by index for a given keyname or keyID. // Returns value name by index for a given keyname or keyID.
std::string ValueName( const std::string & keyname, const unsigned valueID) const; // tolua_export std::string ValueName( const std::string & keyname, const unsigned valueID) const;
std::string GetValueName( const std::string & keyname, const unsigned valueID) const { // tolua_export std::string GetValueName( const std::string & keyname, const unsigned valueID) const
return ValueName( keyname, valueID); {
} // tolua_export return ValueName(keyname, valueID);
std::string ValueName( const unsigned keyID, const unsigned valueID) const; // tolua_export }
std::string GetValueName( const unsigned keyID, const unsigned valueID) const { // tolua_export std::string ValueName (const unsigned keyID, const unsigned valueID) const;
return ValueName( keyID, valueID); std::string GetValueName(const unsigned keyID, const unsigned valueID) const
} // tolua_export {
return ValueName(keyID, valueID);
}
// Gets value of [keyname] valuename =. // Gets value of [keyname] valuename =.
// Overloaded to return string, int, and double. // Overloaded to return string, int, and double.
// Returns defValue if key/value not found. // Returns defValue if key/value not found.
AString GetValue (const AString & keyname, const AString & valuename, const AString & defValue = "") const; // tolua_export AString GetValue (const AString & keyname, const AString & valuename, const AString & defValue = "") const;
AString GetValue (const unsigned keyID, const unsigned valueID, const AString & defValue = "") const; // tolua_export AString GetValue (const unsigned keyID, const unsigned valueID, const AString & defValue = "") const;
double GetValueF(const AString & keyname, const AString & valuename, const double defValue = 0) const; // tolua_export double GetValueF(const AString & keyname, const AString & valuename, const double defValue = 0) const;
int GetValueI(const AString & keyname, const AString & valuename, const int defValue = 0) const; // tolua_export int GetValueI(const AString & keyname, const AString & valuename, const int defValue = 0) const;
bool GetValueB(const AString & keyname, const AString & valuename, const bool defValue = false) const { // tolua_export bool GetValueB(const AString & keyname, const AString & valuename, const bool defValue = false) const
return ( GetValueI( keyname, valuename, int( defValue)) > 0); {
} // tolua_export return (GetValueI(keyname, valuename, int(defValue)) > 0);
}
// Gets the value; if not found, write the default to the INI file // Gets the value; if not found, write the default to the INI file
AString GetValueSet (const AString & keyname, const AString & valuename, const AString & defValue = ""); // tolua_export AString GetValueSet (const AString & keyname, const AString & valuename, const AString & defValue = "");
double GetValueSetF(const AString & keyname, const AString & valuename, const double defValue = 0.0); // tolua_export double GetValueSetF(const AString & keyname, const AString & valuename, const double defValue = 0.0);
int GetValueSetI(const AString & keyname, const AString & valuename, const int defValue = 0); // tolua_export int GetValueSetI(const AString & keyname, const AString & valuename, const int defValue = 0);
bool GetValueSetB(const AString & keyname, const AString & valuename, const bool defValue = false) { // tolua_export bool GetValueSetB(const AString & keyname, const AString & valuename, const bool defValue = false)
{
return (GetValueSetI(keyname, valuename, defValue ? 1 : 0) > 0); return (GetValueSetI(keyname, valuename, defValue ? 1 : 0) > 0);
} // tolua_export }
// Sets value of [keyname] valuename =. // Sets value of [keyname] valuename =.
// Specify the optional paramter as false (0) if you do not want it to create // Specify the optional paramter as false (0) if you do not want it to create
// the key if it doesn't exist. Returns true if data entered, false otherwise. // the key if it doesn't exist. Returns true if data entered, false otherwise.
// Overloaded to accept string, int, and double. // Overloaded to accept string, int, and double.
bool SetValue( const unsigned keyID, const unsigned valueID, const std::string & value); // tolua_export bool SetValue( const unsigned keyID, const unsigned valueID, const std::string & value);
bool SetValue( const std::string & keyname, const std::string & valuename, const std::string & value, const bool create = true); // tolua_export bool SetValue( const std::string & keyname, const std::string & valuename, const std::string & value, const bool create = true);
bool SetValueI( const std::string & keyname, const std::string & valuename, const int value, const bool create = true); // tolua_export bool SetValueI( const std::string & keyname, const std::string & valuename, const int value, const bool create = true);
bool SetValueB( const std::string & keyname, const std::string & valuename, const bool value, const bool create = true) { // tolua_export bool SetValueB( const std::string & keyname, const std::string & valuename, const bool value, const bool create = true)
{
return SetValueI( keyname, valuename, int(value), create); return SetValueI( keyname, valuename, int(value), create);
} // tolua_export }
bool SetValueF( const std::string & keyname, const std::string & valuename, const double value, const bool create = true); // tolua_export bool SetValueF( const std::string & keyname, const std::string & valuename, const double value, const bool create = true);
bool SetValueV( const std::string & keyname, const std::string & valuename, char *format, ...); bool SetValueV( const std::string & keyname, const std::string & valuename, char *format, ...);
// Deletes specified value. // Deletes specified value.
// Returns true if value existed and deleted, false otherwise. // Returns true if value existed and deleted, false otherwise.
bool DeleteValueByID( const unsigned keyID, const unsigned valueID ); // tolua_export bool DeleteValueByID( const unsigned keyID, const unsigned valueID );
bool DeleteValue( const std::string & keyname, const std::string & valuename); // tolua_export bool DeleteValue( const std::string & keyname, const std::string & valuename);
// Deletes specified key and all values contained within. // Deletes specified key and all values contained within.
// Returns true if key existed and deleted, false otherwise. // Returns true if key existed and deleted, false otherwise.
bool DeleteKey(const std::string & keyname); // tolua_export bool DeleteKey(const std::string & keyname);
// Header comment functions. // Header comment functions.
// Header comments are those comments before the first key. // Header comments are those comments before the first key.
// //
// Number of header comments. // Number of header comments.
unsigned NumHeaderComments() {return comments.size();} // tolua_export unsigned NumHeaderComments(void) {return comments.size();}
// Add a header comment. // Add a header comment.
void HeaderComment( const std::string & comment); // tolua_export void HeaderComment(const std::string & comment);
// Return a header comment. // Return a header comment.
std::string HeaderComment( const unsigned commentID) const; // tolua_export std::string HeaderComment(const unsigned commentID) const;
// Delete a header comment. // Delete a header comment.
bool DeleteHeaderComment( unsigned commentID); // tolua_export bool DeleteHeaderComment(unsigned commentID);
// Delete all header comments. // Delete all header comments.
void DeleteHeaderComments() {comments.clear();} // tolua_export void DeleteHeaderComments(void) {comments.clear();}
// Key comment functions. // Key comment functions.
// Key comments are those comments within a key. Any comments // Key comments are those comments within a key. Any comments
@ -167,20 +187,26 @@ public:
// the CIniFile::WriteFile() is called. // the CIniFile::WriteFile() is called.
// //
// Number of key comments. // Number of key comments.
unsigned NumKeyComments( const unsigned keyID) const; // tolua_export unsigned NumKeyComments( const unsigned keyID) const;
unsigned NumKeyComments( const std::string & keyname) const; // tolua_export unsigned NumKeyComments( const std::string & keyname) const;
// Add a key comment. // Add a key comment.
bool KeyComment( const unsigned keyID, const std::string & comment); // tolua_export bool KeyComment(const unsigned keyID, const std::string & comment);
bool KeyComment( const std::string & keyname, const std::string & comment); // tolua_export bool KeyComment(const std::string & keyname, const std::string & comment);
// Return a key comment. // Return a key comment.
std::string KeyComment( const unsigned keyID, const unsigned commentID) const; // tolua_export std::string KeyComment(const unsigned keyID, const unsigned commentID) const;
std::string KeyComment( const std::string & keyname, const unsigned commentID) const; // tolua_export std::string KeyComment(const std::string & keyname, const unsigned commentID) const;
// Delete a key comment. // Delete a key comment.
bool DeleteKeyComment( const unsigned keyID, const unsigned commentID); // tolua_export bool DeleteKeyComment(const unsigned keyID, const unsigned commentID);
bool DeleteKeyComment( const std::string & keyname, const unsigned commentID); // tolua_export bool DeleteKeyComment(const std::string & keyname, const unsigned commentID);
// Delete all comments for a key. // Delete all comments for a key.
bool DeleteKeyComments( const unsigned keyID); // tolua_export bool DeleteKeyComments(const unsigned keyID);
bool DeleteKeyComments( const std::string & keyname); // tolua_export bool DeleteKeyComments(const std::string & keyname);
}; // tolua_export };
// tolua_end
#endif #endif

View File

@ -169,6 +169,8 @@ enum ENUM_BLOCK_ID
E_BLOCK_DROPPER = 158, E_BLOCK_DROPPER = 158,
E_BLOCK_CARPET = 171,
// Keep these two as the last values, without a number - they will get their correct number assigned automagically by C++ // Keep these two as the last values, without a number - they will get their correct number assigned automagically by C++
// IsValidBlock() depends on this // IsValidBlock() depends on this
E_BLOCK_NUMBER_OF_TYPES, ///< Number of individual (different) blocktypes E_BLOCK_NUMBER_OF_TYPES, ///< Number of individual (different) blocktypes

View File

@ -0,0 +1,54 @@
// BlockCarpet.h
// Declares the cBlockCarpetHandler class representing the handler for the carpet block
#pragma once
class cBlockCarpetHandler :
public cBlockHandler
{
public:
cBlockCarpetHandler(BLOCKTYPE a_BlockType);
virtual const char * GetStepSound(void) override
{
return "step.cloth";
}
virtual bool GetPlacementBlockTypeMeta(
cWorld * a_World, cPlayer * a_Player,
int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace,
int a_CursorX, int a_CursorY, int a_CursorZ,
BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta
) override
{
a_BlockType = m_BlockType;
a_BlockMeta = a_Player->GetEquippedItem().m_ItemDamage & 0x0f;
return true;
}
virtual void ConvertToPickups(cItems & a_Pickups, NIBBLETYPE a_BlockMeta) override
{
a_Pickups.push_back(cItem(E_BLOCK_CARPET, a_BlockMeta));
}
virtual bool CanBeAt(int a_RelX, int a_RelY, int a_RelZ, const cChunk & a_Chunk) override
{
return ((a_RelY > 0) && (a_Chunk.GetBlock(a_RelX, a_RelY - 1, a_RelZ) != E_BLOCK_AIR));
}
} ;

View File

@ -3,6 +3,7 @@
#include "BlockEntity.h" #include "BlockEntity.h"
#include "../World.h" #include "../World.h"
#include "../BlockArea.h"
#include "../Player.h" #include "../Player.h"

View File

@ -5,6 +5,8 @@
#pragma once #pragma once
#include "../Piston.h"

View File

@ -5,59 +5,60 @@
#include "../World.h" #include "../World.h"
#include "../Root.h" #include "../Root.h"
#include "../PluginManager.h" #include "../PluginManager.h"
#include "BlockSand.h"
#include "BlockGravel.h"
#include "BlockDoor.h"
#include "BlockFire.h"
#include "BlockRedstone.h"
#include "BlockRedstoneTorch.h"
#include "BlockRedstoneRepeater.h"
#include "BlockPiston.h"
#include "BlockWorkbench.h"
#include "BlockEntity.h"
#include "BlockVine.h"
#include "BlockTallGrass.h"
#include "BlockSnow.h"
#include "BlockCloth.h"
#include "BlockSlab.h"
#include "BlockDirt.h"
#include "BlockTorch.h"
#include "BlockWood.h"
#include "BlockLeaves.h"
#include "BlockSapling.h"
#include "BlockFluid.h"
#include "BlockChest.h"
#include "BlockFurnace.h"
#include "BlockDropSpenser.h"
#include "BlockStairs.h"
#include "BlockLadder.h"
#include "BlockLever.h"
#include "BlockSign.h"
#include "BlockCrops.h"
#include "BlockSugarcane.h"
#include "BlockFlower.h"
#include "BlockMushroom.h"
#include "BlockCactus.h"
#include "BlockStems.h"
#include "BlockGlowstone.h"
#include "BlockStone.h"
#include "BlockMelon.h"
#include "BlockIce.h"
#include "BlockOre.h"
#include "BlockNote.h"
#include "BlockBed.h" #include "BlockBed.h"
#include "BlockFarmland.h"
#include "BlockMycelium.h"
#include "BlockRail.h"
#include "BlockGlass.h"
#include "BlockEnderchest.h"
#include "BlockFenceGate.h"
#include "BlockFlowerPot.h"
#include "BlockCauldron.h"
#include "BlockBrewingStand.h" #include "BlockBrewingStand.h"
#include "BlockCactus.h"
#include "BlockCarpet.h"
#include "BlockCauldron.h"
#include "BlockChest.h"
#include "BlockCloth.h"
#include "BlockCobWeb.h" #include "BlockCobWeb.h"
#include "BlockCrops.h"
#include "BlockDeadBush.h" #include "BlockDeadBush.h"
#include "BlockDirt.h"
#include "BlockDoor.h"
#include "BlockDropSpenser.h"
#include "BlockEnderchest.h"
#include "BlockEntity.h"
#include "BlockFarmland.h"
#include "BlockFenceGate.h"
#include "BlockFire.h"
#include "BlockFlower.h"
#include "BlockFlowerPot.h"
#include "BlockFluid.h"
#include "BlockFurnace.h"
#include "BlockGlass.h"
#include "BlockGlowstone.h"
#include "BlockGravel.h"
#include "BlockHopper.h" #include "BlockHopper.h"
#include "BlockIce.h"
#include "BlockLadder.h"
#include "BlockLeaves.h"
#include "BlockLever.h"
#include "BlockMelon.h"
#include "BlockMushroom.h"
#include "BlockMycelium.h"
#include "BlockNote.h"
#include "BlockOre.h"
#include "BlockPiston.h"
#include "BlockRail.h"
#include "BlockRedstone.h"
#include "BlockRedstoneRepeater.h"
#include "BlockRedstoneTorch.h"
#include "BlockSand.h"
#include "BlockSapling.h"
#include "BlockSign.h"
#include "BlockSlab.h"
#include "BlockSnow.h"
#include "BlockStairs.h"
#include "BlockStems.h"
#include "BlockStone.h"
#include "BlockSugarcane.h"
#include "BlockTallGrass.h"
#include "BlockTorch.h"
#include "BlockVine.h"
#include "BlockWood.h"
#include "BlockWorkbench.h"

View File

@ -47,11 +47,8 @@ cGroupManager::cGroupManager()
cIniFile IniFile("groups.ini"); cIniFile IniFile("groups.ini");
if (!IniFile.ReadFile()) if (!IniFile.ReadFile())
{ {
LOGINFO("groups.ini inaccessible, using groups.example.ini for defaults!"); LOGWARNING("groups.ini inaccessible, no groups are defined");
IniFile.Path("groups.example.ini"); return;
IniFile.ReadFile();
IniFile.Path("groups.ini");
IniFile.WriteFile();
} }
unsigned int NumKeys = IniFile.GetNumKeys(); unsigned int NumKeys = IniFile.GetNumKeys();

View File

@ -10,6 +10,9 @@
cMCLogger * cMCLogger::s_MCLogger = NULL; cMCLogger * cMCLogger::s_MCLogger = NULL;
#ifdef _WIN32
HANDLE g_Console = GetStdHandle(STD_OUTPUT_HANDLE);
#endif
@ -145,8 +148,7 @@ void cMCLogger::Error(const char* a_Format, va_list a_ArgList)
void cMCLogger::SetColor( unsigned char a_Color ) void cMCLogger::SetColor( unsigned char a_Color )
{ {
#ifdef _WIN32 #ifdef _WIN32
HANDLE hConsole = GetStdHandle( STD_OUTPUT_HANDLE ); SetConsoleTextAttribute(g_Console, a_Color);
SetConsoleTextAttribute( hConsole, a_Color );
#else #else
(void)a_Color; (void)a_Color;
#endif #endif

View File

@ -170,7 +170,7 @@ cPlugin_NewLua * GetLuaPlugin(lua_State * L)
template< template<
class Ty1, class Ty1,
class Ty2, class Ty2,
@ -178,87 +178,177 @@ template<
> >
static int tolua_DoWith(lua_State* tolua_S) static int tolua_DoWith(lua_State* tolua_S)
{ {
int NumArgs = lua_gettop(tolua_S) - 1; /* This includes 'self' */ int NumArgs = lua_gettop(tolua_S) - 1; /* This includes 'self' */
if ((NumArgs != 2) && (NumArgs != 3)) if ((NumArgs != 2) && (NumArgs != 3))
{ {
return lua_do_error(tolua_S, "Error in function call '#funcname#': Requires 2 or 3 arguments, got %i", NumArgs); return lua_do_error(tolua_S, "Error in function call '#funcname#': Requires 2 or 3 arguments, got %i", NumArgs);
} }
Ty1 * self = (Ty1 *) tolua_tousertype(tolua_S, 1, 0); Ty1 * self = (Ty1 *) tolua_tousertype(tolua_S, 1, 0);
const char * ItemName = tolua_tocppstring(tolua_S, 2, ""); const char * ItemName = tolua_tocppstring(tolua_S, 2, "");
if ((ItemName == NULL) || (ItemName[0] == 0)) if ((ItemName == NULL) || (ItemName[0] == 0))
{
return lua_do_error(tolua_S, "Error in function call '#funcname#': Expected a non-empty string for parameter #1", NumArgs);
}
if (!lua_isfunction( tolua_S, 3))
{
return lua_do_error(tolua_S, "Error in function call '#funcname#': Expected a function for parameter #2", NumArgs);
}
/* luaL_ref gets reference to value on top of the stack, the table is the last argument and therefore on the top */
int TableRef = LUA_REFNIL;
if (NumArgs == 3)
{
TableRef = luaL_ref(tolua_S, LUA_REGISTRYINDEX);
if (TableRef == LUA_REFNIL)
{
return lua_do_error(tolua_S, "Error in function call '#funcname#': Could not get value reference of parameter #3", NumArgs);
}
}
/* table value is popped, and now function is on top of the stack */
int FuncRef = luaL_ref(tolua_S, LUA_REGISTRYINDEX);
if (FuncRef == LUA_REFNIL)
{
return lua_do_error(tolua_S, "Error in function call '#funcname#': Could not get function reference of parameter #2", NumArgs);
}
class cLuaCallback : public cItemCallback<Ty2>
{ {
public: return lua_do_error(tolua_S, "Error in function call '#funcname#': Expected a non-empty string for parameter #1", NumArgs);
cLuaCallback(lua_State* a_LuaState, int a_FuncRef, int a_TableRef) }
: LuaState( a_LuaState ) if (!lua_isfunction( tolua_S, 3))
, FuncRef( a_FuncRef ) {
, TableRef( a_TableRef ) return lua_do_error(tolua_S, "Error in function call '#funcname#': Expected a function for parameter #2", NumArgs);
{} }
private: /* luaL_ref gets reference to value on top of the stack, the table is the last argument and therefore on the top */
virtual bool Item(Ty2 * a_Item) override int TableRef = LUA_REFNIL;
{ if (NumArgs == 3)
lua_rawgeti( LuaState, LUA_REGISTRYINDEX, FuncRef); /* Push function reference */ {
TableRef = luaL_ref(tolua_S, LUA_REGISTRYINDEX);
if (TableRef == LUA_REFNIL)
{
return lua_do_error(tolua_S, "Error in function call '#funcname#': Could not get value reference of parameter #3", NumArgs);
}
}
/* table value is popped, and now function is on top of the stack */
int FuncRef = luaL_ref(tolua_S, LUA_REGISTRYINDEX);
if (FuncRef == LUA_REFNIL)
{
return lua_do_error(tolua_S, "Error in function call '#funcname#': Could not get function reference of parameter #2", NumArgs);
}
class cLuaCallback : public cItemCallback<Ty2>
{
public:
cLuaCallback(lua_State* a_LuaState, int a_FuncRef, int a_TableRef)
: LuaState( a_LuaState )
, FuncRef( a_FuncRef )
, TableRef( a_TableRef )
{}
private:
virtual bool Item(Ty2 * a_Item) override
{
lua_rawgeti( LuaState, LUA_REGISTRYINDEX, FuncRef); /* Push function reference */
tolua_pushusertype(LuaState, a_Item, Ty2::GetClassStatic()); tolua_pushusertype(LuaState, a_Item, Ty2::GetClassStatic());
if (TableRef != LUA_REFNIL) if (TableRef != LUA_REFNIL)
{ {
lua_rawgeti( LuaState, LUA_REGISTRYINDEX, TableRef); /* Push table reference */ lua_rawgeti( LuaState, LUA_REGISTRYINDEX, TableRef); /* Push table reference */
} }
int s = lua_pcall(LuaState, (TableRef == LUA_REFNIL ? 1 : 2), 1, 0); int s = lua_pcall(LuaState, (TableRef == LUA_REFNIL ? 1 : 2), 1, 0);
if (cLuaState::ReportErrors(LuaState, s)) if (cLuaState::ReportErrors(LuaState, s))
{ {
return true; // Abort enumeration return true; // Abort enumeration
} }
if (lua_isboolean(LuaState, -1)) if (lua_isboolean(LuaState, -1))
{ {
return (tolua_toboolean(LuaState, -1, 0) > 0); return (tolua_toboolean(LuaState, -1, 0) > 0);
} }
return false; /* Continue enumeration */ return false; /* Continue enumeration */
} }
lua_State * LuaState; lua_State * LuaState;
int FuncRef; int FuncRef;
int TableRef; int TableRef;
} Callback(tolua_S, FuncRef, TableRef); } Callback(tolua_S, FuncRef, TableRef);
bool bRetVal = (self->*Func1)(ItemName, Callback); bool bRetVal = (self->*Func1)(ItemName, Callback);
/* Unreference the values again, so the LUA_REGISTRYINDEX can make place for other references */ /* Unreference the values again, so the LUA_REGISTRYINDEX can make place for other references */
luaL_unref(tolua_S, LUA_REGISTRYINDEX, TableRef); luaL_unref(tolua_S, LUA_REGISTRYINDEX, TableRef);
luaL_unref(tolua_S, LUA_REGISTRYINDEX, FuncRef); luaL_unref(tolua_S, LUA_REGISTRYINDEX, FuncRef);
/* Push return value on stack */ /* Push return value on stack */
tolua_pushboolean(tolua_S, bRetVal ); tolua_pushboolean(tolua_S, bRetVal );
return 1; return 1;
}
template<
class Ty1,
class Ty2,
bool (Ty1::*Func1)(int, cItemCallback<Ty2> &)
>
static int tolua_DoWithID(lua_State* tolua_S)
{
int NumArgs = lua_gettop(tolua_S) - 1; /* This includes 'self' */
if ((NumArgs != 2) && (NumArgs != 3))
{
return lua_do_error(tolua_S, "Error in function call '#funcname#': Requires 2 or 3 arguments, got %i", NumArgs);
}
Ty1 * self = (Ty1 *)tolua_tousertype(tolua_S, 1, 0);
int ItemID = (int)tolua_tonumber(tolua_S, 2, 0);
if (!lua_isfunction(tolua_S, 3))
{
return lua_do_error(tolua_S, "Error in function call '#funcname#': Expected a function for parameter #2", NumArgs);
}
/* luaL_ref gets reference to value on top of the stack, the table is the last argument and therefore on the top */
int TableRef = LUA_REFNIL;
if (NumArgs == 3)
{
TableRef = luaL_ref(tolua_S, LUA_REGISTRYINDEX);
if (TableRef == LUA_REFNIL)
{
return lua_do_error(tolua_S, "Error in function call '#funcname#': Could not get value reference of parameter #3", NumArgs);
}
}
/* table value is popped, and now function is on top of the stack */
int FuncRef = luaL_ref(tolua_S, LUA_REGISTRYINDEX);
if (FuncRef == LUA_REFNIL)
{
return lua_do_error(tolua_S, "Error in function call '#funcname#': Could not get function reference of parameter #2", NumArgs);
}
class cLuaCallback : public cItemCallback<Ty2>
{
public:
cLuaCallback(lua_State * a_LuaState, int a_FuncRef, int a_TableRef) :
LuaState(a_LuaState),
FuncRef(a_FuncRef),
TableRef(a_TableRef)
{}
private:
virtual bool Item(Ty2 * a_Item) override
{
lua_rawgeti(LuaState, LUA_REGISTRYINDEX, FuncRef); // Push function to call
tolua_pushusertype(LuaState, a_Item, Ty2::GetClassStatic()); // Push the item
if (TableRef != LUA_REFNIL)
{
lua_rawgeti(LuaState, LUA_REGISTRYINDEX, TableRef); // Push the optional callbackdata param
}
int s = lua_pcall(LuaState, (TableRef == LUA_REFNIL ? 1 : 2), 1, 0);
if (cLuaState::ReportErrors(LuaState, s))
{
return true; // Abort enumeration
}
if (lua_isboolean(LuaState, -1))
{
return (tolua_toboolean(LuaState, -1, 0) > 0);
}
return false; /* Continue enumeration */
}
lua_State * LuaState;
int FuncRef;
int TableRef;
} Callback(tolua_S, FuncRef, TableRef);
bool bRetVal = (self->*Func1)(ItemID, Callback);
/* Unreference the values again, so the LUA_REGISTRYINDEX can make place for other references */
luaL_unref(tolua_S, LUA_REGISTRYINDEX, TableRef);
luaL_unref(tolua_S, LUA_REGISTRYINDEX, FuncRef);
/* Push return value on stack */
tolua_pushboolean(tolua_S, bRetVal );
return 1;
} }
@ -270,89 +360,89 @@ template< class Ty1,
bool (Ty1::*Func1)(int, int, int, cItemCallback<Ty2> &) > bool (Ty1::*Func1)(int, int, int, cItemCallback<Ty2> &) >
static int tolua_DoWithXYZ(lua_State* tolua_S) static int tolua_DoWithXYZ(lua_State* tolua_S)
{ {
int NumArgs = lua_gettop(tolua_S) - 1; /* This includes 'self' */ int NumArgs = lua_gettop(tolua_S) - 1; /* This includes 'self' */
if ((NumArgs != 4) && (NumArgs != 5)) if ((NumArgs != 4) && (NumArgs != 5))
{ {
return lua_do_error(tolua_S, "Error in function call '#funcname#': Requires 4 or 5 arguments, got %i", NumArgs); return lua_do_error(tolua_S, "Error in function call '#funcname#': Requires 4 or 5 arguments, got %i", NumArgs);
} }
Ty1 * self = (Ty1 *) tolua_tousertype(tolua_S, 1, 0); Ty1 * self = (Ty1 *) tolua_tousertype(tolua_S, 1, 0);
if (!lua_isnumber(tolua_S, 2) || !lua_isnumber(tolua_S, 3) || !lua_isnumber(tolua_S, 4)) if (!lua_isnumber(tolua_S, 2) || !lua_isnumber(tolua_S, 3) || !lua_isnumber(tolua_S, 4))
{ {
return lua_do_error(tolua_S, "Error in function call '#funcname#': Expected a number for parameters #1, #2 and #3"); return lua_do_error(tolua_S, "Error in function call '#funcname#': Expected a number for parameters #1, #2 and #3");
} }
int ItemX = ((int)tolua_tonumber(tolua_S, 2, 0)); int ItemX = ((int)tolua_tonumber(tolua_S, 2, 0));
int ItemY = ((int)tolua_tonumber(tolua_S, 3, 0)); int ItemY = ((int)tolua_tonumber(tolua_S, 3, 0));
int ItemZ = ((int)tolua_tonumber(tolua_S, 4, 0)); int ItemZ = ((int)tolua_tonumber(tolua_S, 4, 0));
LOG("x %i y %i z %i", ItemX, ItemY, ItemZ ); LOG("x %i y %i z %i", ItemX, ItemY, ItemZ );
if (!lua_isfunction( tolua_S, 5)) if (!lua_isfunction( tolua_S, 5))
{ {
return lua_do_error(tolua_S, "Error in function call '#funcname#': Expected a function for parameter #4"); return lua_do_error(tolua_S, "Error in function call '#funcname#': Expected a function for parameter #4");
} }
/* luaL_ref gets reference to value on top of the stack, the table is the last argument and therefore on the top */ /* luaL_ref gets reference to value on top of the stack, the table is the last argument and therefore on the top */
int TableRef = LUA_REFNIL; int TableRef = LUA_REFNIL;
if (NumArgs == 5) if (NumArgs == 5)
{ {
TableRef = luaL_ref(tolua_S, LUA_REGISTRYINDEX); TableRef = luaL_ref(tolua_S, LUA_REGISTRYINDEX);
if (TableRef == LUA_REFNIL) if (TableRef == LUA_REFNIL)
{ {
return lua_do_error(tolua_S, "Error in function call '#funcname#': Could not get value reference of parameter #5"); return lua_do_error(tolua_S, "Error in function call '#funcname#': Could not get value reference of parameter #5");
} }
} }
/* table value is popped, and now function is on top of the stack */ /* table value is popped, and now function is on top of the stack */
int FuncRef = luaL_ref(tolua_S, LUA_REGISTRYINDEX); int FuncRef = luaL_ref(tolua_S, LUA_REGISTRYINDEX);
if (FuncRef == LUA_REFNIL) if (FuncRef == LUA_REFNIL)
{ {
return lua_do_error(tolua_S, "Error in function call '#funcname#': Could not get function reference of parameter #4"); return lua_do_error(tolua_S, "Error in function call '#funcname#': Could not get function reference of parameter #4");
} }
class cLuaCallback : public cItemCallback<Ty2> class cLuaCallback : public cItemCallback<Ty2>
{ {
public: public:
cLuaCallback(lua_State* a_LuaState, int a_FuncRef, int a_TableRef) cLuaCallback(lua_State* a_LuaState, int a_FuncRef, int a_TableRef)
: LuaState( a_LuaState ) : LuaState( a_LuaState )
, FuncRef( a_FuncRef ) , FuncRef( a_FuncRef )
, TableRef( a_TableRef ) , TableRef( a_TableRef )
{} {}
private: private:
virtual bool Item(Ty2 * a_Item) override virtual bool Item(Ty2 * a_Item) override
{ {
lua_rawgeti( LuaState, LUA_REGISTRYINDEX, FuncRef); /* Push function reference */ lua_rawgeti( LuaState, LUA_REGISTRYINDEX, FuncRef); /* Push function reference */
tolua_pushusertype(LuaState, a_Item, Ty2::GetClassStatic()); tolua_pushusertype(LuaState, a_Item, Ty2::GetClassStatic());
if (TableRef != LUA_REFNIL) if (TableRef != LUA_REFNIL)
{ {
lua_rawgeti( LuaState, LUA_REGISTRYINDEX, TableRef); /* Push table reference */ lua_rawgeti( LuaState, LUA_REGISTRYINDEX, TableRef); /* Push table reference */
} }
int s = lua_pcall(LuaState, (TableRef == LUA_REFNIL ? 1 : 2), 1, 0); int s = lua_pcall(LuaState, (TableRef == LUA_REFNIL ? 1 : 2), 1, 0);
if (cLuaState::ReportErrors(LuaState, s)) if (cLuaState::ReportErrors(LuaState, s))
{ {
return true; // Abort enumeration return true; // Abort enumeration
} }
if (lua_isboolean(LuaState, -1)) if (lua_isboolean(LuaState, -1))
{ {
return (tolua_toboolean(LuaState, -1, 0) > 0); return (tolua_toboolean(LuaState, -1, 0) > 0);
} }
return false; /* Continue enumeration */ return false; /* Continue enumeration */
} }
lua_State * LuaState; lua_State * LuaState;
int FuncRef; int FuncRef;
int TableRef; int TableRef;
} Callback(tolua_S, FuncRef, TableRef); } Callback(tolua_S, FuncRef, TableRef);
bool bRetVal = (self->*Func1)(ItemX, ItemY, ItemZ, Callback); bool bRetVal = (self->*Func1)(ItemX, ItemY, ItemZ, Callback);
/* Unreference the values again, so the LUA_REGISTRYINDEX can make place for other references */ /* Unreference the values again, so the LUA_REGISTRYINDEX can make place for other references */
luaL_unref(tolua_S, LUA_REGISTRYINDEX, TableRef); luaL_unref(tolua_S, LUA_REGISTRYINDEX, TableRef);
luaL_unref(tolua_S, LUA_REGISTRYINDEX, FuncRef); luaL_unref(tolua_S, LUA_REGISTRYINDEX, FuncRef);
/* Push return value on stack */ /* Push return value on stack */
tolua_pushboolean(tolua_S, bRetVal ); tolua_pushboolean(tolua_S, bRetVal );
return 1; return 1;
} }
@ -364,89 +454,89 @@ template< class Ty1,
bool (Ty1::*Func1)(int, int, cItemCallback<Ty2> &) > bool (Ty1::*Func1)(int, int, cItemCallback<Ty2> &) >
static int tolua_ForEachInChunk(lua_State* tolua_S) static int tolua_ForEachInChunk(lua_State* tolua_S)
{ {
int NumArgs = lua_gettop(tolua_S) - 1; /* This includes 'self' */ int NumArgs = lua_gettop(tolua_S) - 1; /* This includes 'self' */
if ((NumArgs != 3) && (NumArgs != 4)) if ((NumArgs != 3) && (NumArgs != 4))
{ {
return lua_do_error(tolua_S, "Error in function call '#funcname#': Requires 3 or 4 arguments, got %i", NumArgs); return lua_do_error(tolua_S, "Error in function call '#funcname#': Requires 3 or 4 arguments, got %i", NumArgs);
} }
Ty1 * self = (Ty1 *) tolua_tousertype(tolua_S, 1, 0); Ty1 * self = (Ty1 *) tolua_tousertype(tolua_S, 1, 0);
if (!lua_isnumber(tolua_S, 2) || !lua_isnumber(tolua_S, 3)) if (!lua_isnumber(tolua_S, 2) || !lua_isnumber(tolua_S, 3))
{ {
return lua_do_error(tolua_S, "Error in function call '#funcname#': Expected a number for parameters #1 and #2"); return lua_do_error(tolua_S, "Error in function call '#funcname#': Expected a number for parameters #1 and #2");
} }
int ChunkX = ((int)tolua_tonumber(tolua_S, 2, 0)); int ChunkX = ((int)tolua_tonumber(tolua_S, 2, 0));
int ChunkZ = ((int)tolua_tonumber(tolua_S, 3, 0)); int ChunkZ = ((int)tolua_tonumber(tolua_S, 3, 0));
if (!lua_isfunction( tolua_S, 4)) if (!lua_isfunction( tolua_S, 4))
{ {
return lua_do_error(tolua_S, "Error in function call '#funcname#': Expected a function for parameter #3"); return lua_do_error(tolua_S, "Error in function call '#funcname#': Expected a function for parameter #3");
} }
/* luaL_ref gets reference to value on top of the stack, the table is the last argument and therefore on the top */ /* luaL_ref gets reference to value on top of the stack, the table is the last argument and therefore on the top */
int TableRef = LUA_REFNIL; int TableRef = LUA_REFNIL;
if (NumArgs == 4) if (NumArgs == 4)
{ {
TableRef = luaL_ref(tolua_S, LUA_REGISTRYINDEX); TableRef = luaL_ref(tolua_S, LUA_REGISTRYINDEX);
if (TableRef == LUA_REFNIL) if (TableRef == LUA_REFNIL)
{ {
return lua_do_error(tolua_S, "Error in function call '#funcname#': Could not get value reference of parameter #4"); return lua_do_error(tolua_S, "Error in function call '#funcname#': Could not get value reference of parameter #4");
} }
} }
/* table value is popped, and now function is on top of the stack */ /* table value is popped, and now function is on top of the stack */
int FuncRef = luaL_ref(tolua_S, LUA_REGISTRYINDEX); int FuncRef = luaL_ref(tolua_S, LUA_REGISTRYINDEX);
if (FuncRef == LUA_REFNIL) if (FuncRef == LUA_REFNIL)
{ {
return lua_do_error(tolua_S, "Error in function call '#funcname#': Could not get function reference of parameter #3"); return lua_do_error(tolua_S, "Error in function call '#funcname#': Could not get function reference of parameter #3");
} }
class cLuaCallback : public cItemCallback<Ty2> class cLuaCallback : public cItemCallback<Ty2>
{ {
public: public:
cLuaCallback(lua_State* a_LuaState, int a_FuncRef, int a_TableRef) cLuaCallback(lua_State* a_LuaState, int a_FuncRef, int a_TableRef)
: LuaState( a_LuaState ) : LuaState( a_LuaState )
, FuncRef( a_FuncRef ) , FuncRef( a_FuncRef )
, TableRef( a_TableRef ) , TableRef( a_TableRef )
{} {}
private: private:
virtual bool Item(Ty2 * a_Item) override virtual bool Item(Ty2 * a_Item) override
{ {
lua_rawgeti( LuaState, LUA_REGISTRYINDEX, FuncRef); /* Push function reference */ lua_rawgeti( LuaState, LUA_REGISTRYINDEX, FuncRef); /* Push function reference */
tolua_pushusertype(LuaState, a_Item, Ty2::GetClassStatic()); tolua_pushusertype(LuaState, a_Item, Ty2::GetClassStatic());
if (TableRef != LUA_REFNIL) if (TableRef != LUA_REFNIL)
{ {
lua_rawgeti( LuaState, LUA_REGISTRYINDEX, TableRef); /* Push table reference */ lua_rawgeti( LuaState, LUA_REGISTRYINDEX, TableRef); /* Push table reference */
} }
int s = lua_pcall(LuaState, (TableRef == LUA_REFNIL ? 1 : 2), 1, 0); int s = lua_pcall(LuaState, (TableRef == LUA_REFNIL ? 1 : 2), 1, 0);
if (cLuaState::ReportErrors(LuaState, s)) if (cLuaState::ReportErrors(LuaState, s))
{ {
return true; /* Abort enumeration */ return true; /* Abort enumeration */
} }
if (lua_isboolean(LuaState, -1)) if (lua_isboolean(LuaState, -1))
{ {
return (tolua_toboolean(LuaState, -1, 0) > 0); return (tolua_toboolean(LuaState, -1, 0) > 0);
} }
return false; /* Continue enumeration */ return false; /* Continue enumeration */
} }
lua_State * LuaState; lua_State * LuaState;
int FuncRef; int FuncRef;
int TableRef; int TableRef;
} Callback(tolua_S, FuncRef, TableRef); } Callback(tolua_S, FuncRef, TableRef);
bool bRetVal = (self->*Func1)(ChunkX, ChunkZ, Callback); bool bRetVal = (self->*Func1)(ChunkX, ChunkZ, Callback);
/* Unreference the values again, so the LUA_REGISTRYINDEX can make place for other references */ /* Unreference the values again, so the LUA_REGISTRYINDEX can make place for other references */
luaL_unref(tolua_S, LUA_REGISTRYINDEX, TableRef); luaL_unref(tolua_S, LUA_REGISTRYINDEX, TableRef);
luaL_unref(tolua_S, LUA_REGISTRYINDEX, FuncRef); luaL_unref(tolua_S, LUA_REGISTRYINDEX, FuncRef);
/* Push return value on stack */ /* Push return value on stack */
tolua_pushboolean(tolua_S, bRetVal ); tolua_pushboolean(tolua_S, bRetVal );
return 1; return 1;
} }
@ -454,7 +544,7 @@ static int tolua_ForEachInChunk(lua_State* tolua_S)
template< class Ty1, template< class Ty1,
class Ty2, class Ty2,
bool (Ty1::*Func1)(cItemCallback<Ty2> &) > bool (Ty1::*Func1)(cItemCallback<Ty2> &) >
static int tolua_ForEach(lua_State * tolua_S) static int tolua_ForEach(lua_State * tolua_S)
{ {
@ -597,6 +687,52 @@ tolua_lerror:
static int tolua_cWorld_TryGetHeight(lua_State * tolua_S)
{
// Exported manually, because tolua would require the out-only param a_Height to be used when calling
// Takes (a_World,) a_BlockX, a_BlockZ
// Returns Height, IsValid
#ifndef TOLUA_RELEASE
tolua_Error tolua_err;
if (
!tolua_isusertype (tolua_S, 1, "cWorld", 0, &tolua_err) ||
!tolua_isnumber (tolua_S, 2, 0, &tolua_err) ||
!tolua_isnumber (tolua_S, 3, 0, &tolua_err) ||
!tolua_isnoobj (tolua_S, 4, &tolua_err)
)
goto tolua_lerror;
else
#endif
{
cWorld * self = (cWorld *) tolua_tousertype (tolua_S, 1, 0);
int BlockX = (int) tolua_tonumber (tolua_S, 2, 0);
int BlockZ = (int) tolua_tonumber (tolua_S, 3, 0);
#ifndef TOLUA_RELEASE
if (self == NULL)
{
tolua_error(tolua_S, "Invalid 'self' in function 'TryGetHeight'", NULL);
}
#endif
{
int Height = 0;
bool res = self->TryGetHeight(BlockX, BlockZ, Height);
tolua_pushnumber(tolua_S, Height);
tolua_pushboolean(tolua_S, res ? 1 : 0);
}
}
return 1;
#ifndef TOLUA_RELEASE
tolua_lerror:
tolua_error(tolua_S, "#ferror in function 'TryGetHeight'.", &tolua_err);
return 0;
#endif
}
static int tolua_cPluginManager_GetAllPlugins(lua_State * tolua_S) static int tolua_cPluginManager_GetAllPlugins(lua_State * tolua_S)
{ {
cPluginManager* self = (cPluginManager*) tolua_tousertype(tolua_S,1,0); cPluginManager* self = (cPluginManager*) tolua_tousertype(tolua_S,1,0);
@ -1373,25 +1509,27 @@ void ManualBindings::Bind(lua_State * tolua_S)
tolua_function(tolua_S, "LOGERROR", tolua_LOGERROR); tolua_function(tolua_S, "LOGERROR", tolua_LOGERROR);
tolua_beginmodule(tolua_S, "cRoot"); tolua_beginmodule(tolua_S, "cRoot");
tolua_function(tolua_S, "ForEachWorld", tolua_ForEach<cRoot, cWorld, &cRoot::ForEachWorld>);
tolua_function(tolua_S, "FindAndDoWithPlayer", tolua_DoWith <cRoot, cPlayer, &cRoot::FindAndDoWithPlayer>); tolua_function(tolua_S, "FindAndDoWithPlayer", tolua_DoWith <cRoot, cPlayer, &cRoot::FindAndDoWithPlayer>);
tolua_function(tolua_S, "ForEachPlayer", tolua_ForEach<cRoot, cPlayer, &cRoot::ForEachPlayer>); tolua_function(tolua_S, "ForEachPlayer", tolua_ForEach<cRoot, cPlayer, &cRoot::ForEachPlayer>);
tolua_function(tolua_S, "ForEachWorld", tolua_ForEach<cRoot, cWorld, &cRoot::ForEachWorld>);
tolua_endmodule(tolua_S); tolua_endmodule(tolua_S);
tolua_beginmodule(tolua_S, "cWorld"); tolua_beginmodule(tolua_S, "cWorld");
tolua_function(tolua_S, "ForEachPlayer", tolua_ForEach<cWorld, cPlayer, &cWorld::ForEachPlayer>);
tolua_function(tolua_S, "ForEachEntity", tolua_ForEach<cWorld, cEntity, &cWorld::ForEachEntity>);
tolua_function(tolua_S, "ForEachEntityInChunk", tolua_ForEachInChunk<cWorld, cEntity, &cWorld::ForEachEntityInChunk>);
tolua_function(tolua_S, "ForEachChestInChunk", tolua_ForEachInChunk<cWorld, cChestEntity, &cWorld::ForEachChestInChunk>);
tolua_function(tolua_S, "ForEachFurnaceInChunk", tolua_ForEachInChunk<cWorld, cFurnaceEntity, &cWorld::ForEachFurnaceInChunk>);
tolua_function(tolua_S, "DoWithPlayer", tolua_DoWith<cWorld, cPlayer, &cWorld::DoWithPlayer>);
tolua_function(tolua_S, "FindAndDoWithPlayer", tolua_DoWith<cWorld, cPlayer, &cWorld::FindAndDoWithPlayer>);
tolua_function(tolua_S, "DoWithChestAt", tolua_DoWithXYZ<cWorld, cChestEntity, &cWorld::DoWithChestAt>); tolua_function(tolua_S, "DoWithChestAt", tolua_DoWithXYZ<cWorld, cChestEntity, &cWorld::DoWithChestAt>);
tolua_function(tolua_S, "DoWithDispenserAt", tolua_DoWithXYZ<cWorld, cDispenserEntity, &cWorld::DoWithDispenserAt>); tolua_function(tolua_S, "DoWithDispenserAt", tolua_DoWithXYZ<cWorld, cDispenserEntity, &cWorld::DoWithDispenserAt>);
tolua_function(tolua_S, "DoWithDropperAt", tolua_DoWithXYZ<cWorld, cDropperEntity, &cWorld::DoWithDropperAt>);
tolua_function(tolua_S, "DoWithDropSpenserAt", tolua_DoWithXYZ<cWorld, cDropSpenserEntity, &cWorld::DoWithDropSpenserAt>); tolua_function(tolua_S, "DoWithDropSpenserAt", tolua_DoWithXYZ<cWorld, cDropSpenserEntity, &cWorld::DoWithDropSpenserAt>);
tolua_function(tolua_S, "DoWithDropperAt", tolua_DoWithXYZ<cWorld, cDropperEntity, &cWorld::DoWithDropperAt>);
tolua_function(tolua_S, "DoWithEntityByID", tolua_DoWithID< cWorld, cEntity, &cWorld::DoWithEntityByID>);
tolua_function(tolua_S, "DoWithFurnaceAt", tolua_DoWithXYZ<cWorld, cFurnaceEntity, &cWorld::DoWithFurnaceAt>); tolua_function(tolua_S, "DoWithFurnaceAt", tolua_DoWithXYZ<cWorld, cFurnaceEntity, &cWorld::DoWithFurnaceAt>);
tolua_function(tolua_S, "DoWithPlayer", tolua_DoWith< cWorld, cPlayer, &cWorld::DoWithPlayer>);
tolua_function(tolua_S, "FindAndDoWithPlayer", tolua_DoWith< cWorld, cPlayer, &cWorld::FindAndDoWithPlayer>);
tolua_function(tolua_S, "ForEachChestInChunk", tolua_ForEachInChunk<cWorld, cChestEntity, &cWorld::ForEachChestInChunk>);
tolua_function(tolua_S, "ForEachEntity", tolua_ForEach< cWorld, cEntity, &cWorld::ForEachEntity>);
tolua_function(tolua_S, "ForEachEntityInChunk", tolua_ForEachInChunk<cWorld, cEntity, &cWorld::ForEachEntityInChunk>);
tolua_function(tolua_S, "ForEachFurnaceInChunk", tolua_ForEachInChunk<cWorld, cFurnaceEntity, &cWorld::ForEachFurnaceInChunk>);
tolua_function(tolua_S, "ForEachPlayer", tolua_ForEach< cWorld, cPlayer, &cWorld::ForEachPlayer>);
tolua_function(tolua_S, "SetSignLines", tolua_cWorld_SetSignLines); tolua_function(tolua_S, "SetSignLines", tolua_cWorld_SetSignLines);
tolua_function(tolua_S, "TryGetHeight", tolua_cWorld_TryGetHeight);
tolua_function(tolua_S, "UpdateSign", tolua_cWorld_SetSignLines); tolua_function(tolua_S, "UpdateSign", tolua_cWorld_SetSignLines);
tolua_endmodule(tolua_S); tolua_endmodule(tolua_S);
@ -1400,11 +1538,11 @@ void ManualBindings::Bind(lua_State * tolua_S)
tolua_endmodule(tolua_S); tolua_endmodule(tolua_S);
tolua_beginmodule(tolua_S, "cPluginManager"); tolua_beginmodule(tolua_S, "cPluginManager");
tolua_function(tolua_S, "GetAllPlugins", tolua_cPluginManager_GetAllPlugins);
tolua_function(tolua_S, "BindCommand", tolua_cPluginManager_BindCommand); tolua_function(tolua_S, "BindCommand", tolua_cPluginManager_BindCommand);
tolua_function(tolua_S, "BindConsoleCommand", tolua_cPluginManager_BindConsoleCommand); tolua_function(tolua_S, "BindConsoleCommand", tolua_cPluginManager_BindConsoleCommand);
tolua_function(tolua_S, "ForEachCommand", tolua_cPluginManager_ForEachCommand); tolua_function(tolua_S, "ForEachCommand", tolua_cPluginManager_ForEachCommand);
tolua_function(tolua_S, "ForEachConsoleCommand", tolua_cPluginManager_ForEachConsoleCommand); tolua_function(tolua_S, "ForEachConsoleCommand", tolua_cPluginManager_ForEachConsoleCommand);
tolua_function(tolua_S, "GetAllPlugins", tolua_cPluginManager_GetAllPlugins);
tolua_endmodule(tolua_S); tolua_endmodule(tolua_S);
tolua_beginmodule(tolua_S, "cPlayer"); tolua_beginmodule(tolua_S, "cPlayer");
@ -1419,17 +1557,17 @@ void ManualBindings::Bind(lua_State * tolua_S)
tolua_endmodule(tolua_S); tolua_endmodule(tolua_S);
tolua_beginmodule(tolua_S, "cPlugin_NewLua"); tolua_beginmodule(tolua_S, "cPlugin_NewLua");
tolua_function(tolua_S, "AddWebTab", tolua_cPlugin_NewLua_AddWebTab);
tolua_function(tolua_S, "AddTab", tolua_cPlugin_NewLua_AddTab); tolua_function(tolua_S, "AddTab", tolua_cPlugin_NewLua_AddTab);
tolua_function(tolua_S, "AddWebTab", tolua_cPlugin_NewLua_AddWebTab);
tolua_endmodule(tolua_S); tolua_endmodule(tolua_S);
tolua_cclass(tolua_S,"HTTPRequest","HTTPRequest","",NULL); tolua_cclass(tolua_S,"HTTPRequest","HTTPRequest","",NULL);
tolua_beginmodule(tolua_S,"HTTPRequest"); tolua_beginmodule(tolua_S,"HTTPRequest");
// tolua_variable(tolua_S,"Method",tolua_get_HTTPRequest_Method,tolua_set_HTTPRequest_Method); // tolua_variable(tolua_S,"Method",tolua_get_HTTPRequest_Method,tolua_set_HTTPRequest_Method);
// tolua_variable(tolua_S,"Path",tolua_get_HTTPRequest_Path,tolua_set_HTTPRequest_Path); // tolua_variable(tolua_S,"Path",tolua_get_HTTPRequest_Path,tolua_set_HTTPRequest_Path);
tolua_variable(tolua_S,"FormData",tolua_get_HTTPRequest_FormData,0);
tolua_variable(tolua_S,"Params",tolua_get_HTTPRequest_Params,0); tolua_variable(tolua_S,"Params",tolua_get_HTTPRequest_Params,0);
tolua_variable(tolua_S,"PostParams",tolua_get_HTTPRequest_PostParams,0); tolua_variable(tolua_S,"PostParams",tolua_get_HTTPRequest_PostParams,0);
tolua_variable(tolua_S,"FormData",tolua_get_HTTPRequest_FormData,0);
tolua_endmodule(tolua_S); tolua_endmodule(tolua_S);
tolua_beginmodule(tolua_S, "cWebAdmin"); tolua_beginmodule(tolua_S, "cWebAdmin");
@ -1441,8 +1579,8 @@ void ManualBindings::Bind(lua_State * tolua_S)
tolua_endmodule(tolua_S); tolua_endmodule(tolua_S);
tolua_beginmodule(tolua_S, "cClientHandle"); tolua_beginmodule(tolua_S, "cClientHandle");
tolua_constant(tolua_S, "MIN_VIEW_DISTANCE", cClientHandle::MIN_VIEW_DISTANCE);
tolua_constant(tolua_S, "MAX_VIEW_DISTANCE", cClientHandle::MAX_VIEW_DISTANCE); tolua_constant(tolua_S, "MAX_VIEW_DISTANCE", cClientHandle::MAX_VIEW_DISTANCE);
tolua_constant(tolua_S, "MIN_VIEW_DISTANCE", cClientHandle::MIN_VIEW_DISTANCE);
tolua_endmodule(tolua_S); tolua_endmodule(tolua_S);
tolua_beginmodule(tolua_S, "cItemGrid"); tolua_beginmodule(tolua_S, "cItemGrid");

View File

@ -112,10 +112,7 @@ void cRoot::Start(void)
cIniFile IniFile("settings.ini"); cIniFile IniFile("settings.ini");
if (!IniFile.ReadFile()) if (!IniFile.ReadFile())
{ {
LOGINFO("settings.ini inaccessible, using settings.example.ini for defaults!"); LOGWARNING("settings.ini inaccessible, all settings are reset to default values");
IniFile.Path("settings.example.ini");
IniFile.ReadFile();
IniFile.Path("settings.ini");
} }
m_PrimaryServerVersion = IniFile.GetValueI("Server", "PrimaryServerVersion", 0); m_PrimaryServerVersion = IniFile.GetValueI("Server", "PrimaryServerVersion", 0);
if (m_PrimaryServerVersion == 0) if (m_PrimaryServerVersion == 0)
@ -139,23 +136,19 @@ void cRoot::Start(void)
cIniFile WebIniFile("webadmin.ini"); cIniFile WebIniFile("webadmin.ini");
if (!WebIniFile.ReadFile()) if (!WebIniFile.ReadFile())
{ {
LOGINFO("webadmin.ini inaccessible, using webadmin.example.ini for defaults!"); LOGWARNING("webadmin.ini inaccessible, wabadmin is disabled");
WebIniFile.Path("webadmin.example.ini");
WebIniFile.ReadFile();
WebIniFile.Path("webadmin.ini");
WebIniFile.WriteFile();
} }
if (WebIniFile.GetValueB("WebAdmin", "Enabled", false )) if (WebIniFile.GetValueB("WebAdmin", "Enabled", false))
{ {
LOG("Creating WebAdmin..."); LOG("Creating WebAdmin...");
m_WebAdmin = new cWebAdmin(8080); m_WebAdmin = new cWebAdmin(8080);
} }
LOG("Loading settings..."); LOG("Loading settings...");
m_GroupManager = new cGroupManager(); m_GroupManager = new cGroupManager();
m_CraftingRecipes = new cCraftingRecipes; m_CraftingRecipes = new cCraftingRecipes;
m_FurnaceRecipe = new cFurnaceRecipe(); m_FurnaceRecipe = new cFurnaceRecipe();
LOG("Loading worlds..."); LOG("Loading worlds...");
LoadWorlds(); LoadWorlds();

View File

@ -129,7 +129,7 @@ public:
// tolua_end // tolua_end
/// Retrieves the world height at the specified coords; returns false if chunk not loaded / generated /// Retrieves the world height at the specified coords; returns false if chunk not loaded / generated
bool TryGetHeight(int a_BlockX, int a_BlockZ, int & a_Height); // TODO: Export in ManualBindings.cpp bool TryGetHeight(int a_BlockX, int a_BlockZ, int & a_Height); // Exported in ManualBindings.cpp
// Broadcast respective packets to all clients of the chunk where the event is taking place // Broadcast respective packets to all clients of the chunk where the event is taking place
// (Please keep these alpha-sorted) // (Please keep these alpha-sorted)
@ -174,7 +174,7 @@ public:
If a_MarkDirty is set, the chunk is set as dirty (used after generating) If a_MarkDirty is set, the chunk is set as dirty (used after generating)
*/ */
void SetChunkData( void SetChunkData(
int a_ChunkX, int a_ChunkZ, int a_ChunkX, int a_ChunkZ,
const BLOCKTYPE * a_BlockTypes, const BLOCKTYPE * a_BlockTypes,
const NIBBLETYPE * a_BlockMeta, const NIBBLETYPE * a_BlockMeta,
const NIBBLETYPE * a_BlockLight, const NIBBLETYPE * a_BlockLight,
@ -245,7 +245,7 @@ public:
bool ForEachEntityInChunk(int a_ChunkX, int a_ChunkZ, cEntityCallback & a_Callback); // Exported in ManualBindings.cpp bool ForEachEntityInChunk(int a_ChunkX, int a_ChunkZ, cEntityCallback & a_Callback); // Exported in ManualBindings.cpp
/// Calls the callback if the entity with the specified ID is found, with the entity object as the callback param. Returns true if entity found and callback returned false. /// Calls the callback if the entity with the specified ID is found, with the entity object as the callback param. Returns true if entity found and callback returned false.
bool DoWithEntityByID(int a_UniqueID, cEntityCallback & a_Callback); // TODO: Exported in ManualBindings.cpp bool DoWithEntityByID(int a_UniqueID, cEntityCallback & a_Callback); // Exported in ManualBindings.cpp
/// Compares clients of two chunks, calls the callback accordingly /// Compares clients of two chunks, calls the callback accordingly
void CompareChunkClients(int a_ChunkX1, int a_ChunkZ1, int a_ChunkX2, int a_ChunkZ2, cClientDiffCallback & a_Callback); void CompareChunkClients(int a_ChunkX1, int a_ChunkZ1, int a_ChunkX2, int a_ChunkZ2, cClientDiffCallback & a_Callback);
@ -319,8 +319,8 @@ public:
void SetBlockMeta(const Vector3i & a_Pos, NIBBLETYPE a_MetaData ) { SetBlockMeta( a_Pos.x, a_Pos.y, a_Pos.z, a_MetaData ); } void SetBlockMeta(const Vector3i & a_Pos, NIBBLETYPE a_MetaData ) { SetBlockMeta( a_Pos.x, a_Pos.y, a_Pos.z, a_MetaData ); }
// tolua_end // tolua_end
/** Writes the block area into the specified coords. /** Writes the block area into the specified coords.
Returns true if all chunks have been processed. Returns true if all chunks have been processed.
Prefer cBlockArea::Write() instead, this is the internal implementation; cBlockArea does error checking, too. Prefer cBlockArea::Write() instead, this is the internal implementation; cBlockArea does error checking, too.
a_DataTypes is a bitmask of cBlockArea::baXXX constants ORed together. a_DataTypes is a bitmask of cBlockArea::baXXX constants ORed together.
*/ */