2013-08-04 17:11:25 -04:00
|
|
|
|
|
|
|
// LuaState.h
|
|
|
|
|
|
|
|
// Declares the cLuaState class representing the wrapper over lua_State *, provides associated helper functions
|
|
|
|
|
2013-08-06 02:01:00 -04:00
|
|
|
/*
|
|
|
|
The contained lua_State can be either owned or attached.
|
|
|
|
Owned lua_State is created by calling Create() and the cLuaState automatically closes the state
|
|
|
|
Or, lua_State can be attached by calling Attach(), the cLuaState doesn't close such a state
|
|
|
|
Attaching a state will automatically close an owned state.
|
2013-08-06 02:59:54 -04:00
|
|
|
|
2014-07-01 16:19:14 -04:00
|
|
|
Calling a Lua function is done internally by pushing the function using PushFunction(), then pushing the
|
|
|
|
arguments and finally executing CallFunction(). cLuaState automatically keeps track of the number of
|
|
|
|
arguments and the name of the function (for logging purposes). After the call the return values are read from
|
|
|
|
the stack using GetStackValue(). All of this is wrapped in a templated function overloads cLuaState::Call(),
|
|
|
|
which is generated automatically by gen_LuaState_Call.lua script file into the LuaState_Call.inc file.
|
2013-08-07 08:26:18 -04:00
|
|
|
|
|
|
|
Reference management is provided by the cLuaState::cRef class. This is used when you need to hold a reference to
|
|
|
|
any Lua object across several function calls; usually this is used for callbacks. The class is RAII-like, with
|
|
|
|
automatic resource management.
|
2013-08-06 02:01:00 -04:00
|
|
|
*/
|
2013-08-04 17:11:25 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
2013-08-07 08:26:18 -04:00
|
|
|
extern "C"
|
|
|
|
{
|
2013-11-26 12:14:46 -05:00
|
|
|
#include "lua/src/lauxlib.h"
|
2013-08-07 08:26:18 -04:00
|
|
|
}
|
2013-08-04 17:11:25 -04:00
|
|
|
|
2014-03-11 10:01:17 -04:00
|
|
|
#include "../Vector3.h"
|
2014-07-03 11:49:21 -04:00
|
|
|
#include "../Defines.h"
|
2014-03-11 10:01:17 -04:00
|
|
|
|
2013-08-04 17:11:25 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-04-29 09:14:22 -04:00
|
|
|
class cBlockArea;
|
2015-04-23 13:41:01 -04:00
|
|
|
class cBlockEntity;
|
|
|
|
class cBoundingBox;
|
|
|
|
class cChunkDesc;
|
|
|
|
class cClientHandle;
|
|
|
|
class cCraftingGrid;
|
|
|
|
class cCraftingRecipe;
|
2013-08-06 02:59:54 -04:00
|
|
|
class cEntity;
|
2015-04-23 13:41:01 -04:00
|
|
|
class cHopperEntity;
|
2013-08-06 02:59:54 -04:00
|
|
|
class cItem;
|
|
|
|
class cItems;
|
2015-04-23 13:41:01 -04:00
|
|
|
class cLuaServerHandle;
|
|
|
|
class cLuaTCPLink;
|
|
|
|
class cLuaUDPEndpoint;
|
2015-04-23 16:20:31 -04:00
|
|
|
class cMapManager;
|
2015-04-23 13:41:01 -04:00
|
|
|
class cMonster;
|
2013-08-06 02:59:54 -04:00
|
|
|
class cPickup;
|
2015-04-23 13:41:01 -04:00
|
|
|
class cPlayer;
|
|
|
|
class cPlugin;
|
2013-08-19 03:39:18 -04:00
|
|
|
class cPluginLua;
|
2015-04-23 13:41:01 -04:00
|
|
|
class cPluginManager;
|
|
|
|
class cProjectileEntity;
|
|
|
|
class cRoot;
|
|
|
|
class cScoreboard;
|
|
|
|
class cTNTEntity;
|
2013-08-08 10:30:02 -04:00
|
|
|
class cWebAdmin;
|
2015-04-23 13:41:01 -04:00
|
|
|
class cWindow;
|
|
|
|
class cWorld;
|
|
|
|
struct HTTPRequest;
|
2013-08-08 10:30:02 -04:00
|
|
|
struct HTTPTemplateRequest;
|
2015-04-23 13:41:01 -04:00
|
|
|
struct TakeDamageInfo;
|
2014-09-03 11:00:26 -04:00
|
|
|
|
2015-04-29 09:14:22 -04:00
|
|
|
typedef cBlockArea * pBlockArea;
|
2015-04-23 13:41:01 -04:00
|
|
|
typedef cBoundingBox * pBoundingBox;
|
2015-04-23 16:20:31 -04:00
|
|
|
typedef cMapManager * pMapManager;
|
2015-04-23 13:41:01 -04:00
|
|
|
typedef cPluginManager * pPluginManager;
|
|
|
|
typedef cRoot * pRoot;
|
|
|
|
typedef cScoreboard * pScoreboard;
|
|
|
|
typedef cWorld * pWorld;
|
2015-03-21 13:17:26 -04:00
|
|
|
typedef cClientHandle * pClientHandle;
|
2013-08-06 02:59:54 -04:00
|
|
|
|
2013-08-04 17:11:25 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-01-21 16:59:08 -05:00
|
|
|
/** Encapsulates a Lua state and provides some syntactic sugar for common operations */
|
2013-08-04 17:11:25 -04:00
|
|
|
class cLuaState
|
|
|
|
{
|
|
|
|
public:
|
2013-08-07 08:26:18 -04:00
|
|
|
|
2014-02-09 12:39:22 -05:00
|
|
|
/** Used for storing references to object in the global registry.
|
|
|
|
Can be bound (contains a reference) or unbound (doesn't contain reference).
|
|
|
|
The reference can also be reset by calling RefStack(). */
|
2013-08-07 08:26:18 -04:00
|
|
|
class cRef
|
|
|
|
{
|
|
|
|
public:
|
2014-02-09 12:39:22 -05:00
|
|
|
/** Creates an unbound reference object. */
|
|
|
|
cRef(void);
|
|
|
|
|
2014-01-21 16:59:08 -05:00
|
|
|
/** Creates a reference in the specified LuaState for object at the specified StackPos */
|
2013-08-07 08:26:18 -04:00
|
|
|
cRef(cLuaState & a_LuaState, int a_StackPos);
|
2015-01-30 15:24:02 -05:00
|
|
|
|
|
|
|
/** Moves the reference from the specified instance into a newly created instance.
|
|
|
|
The old instance is then "!IsValid()". */
|
|
|
|
cRef(cRef && a_FromRef);
|
2014-02-09 12:39:22 -05:00
|
|
|
|
2013-08-07 08:26:18 -04:00
|
|
|
~cRef();
|
|
|
|
|
2014-02-09 12:39:22 -05:00
|
|
|
/** Creates a reference to Lua object at the specified stack pos, binds this object to it.
|
|
|
|
Calls UnRef() first if previously bound to another reference. */
|
|
|
|
void RefStack(cLuaState & a_LuaState, int a_StackPos);
|
|
|
|
|
|
|
|
/** Removes the bound reference, resets the object to Unbound state. */
|
|
|
|
void UnRef(void);
|
|
|
|
|
2014-01-21 16:59:08 -05:00
|
|
|
/** Returns true if the reference is valid */
|
2013-08-07 08:26:18 -04:00
|
|
|
bool IsValid(void) const {return (m_Ref != LUA_REFNIL); }
|
|
|
|
|
2014-01-21 16:59:08 -05:00
|
|
|
/** Allows to use this class wherever an int (i. e. ref) is to be used */
|
2013-08-21 15:29:30 -04:00
|
|
|
operator int(void) const { return m_Ref; }
|
2013-08-07 08:26:18 -04:00
|
|
|
|
|
|
|
protected:
|
2014-02-09 12:39:22 -05:00
|
|
|
cLuaState * m_LuaState;
|
2013-08-07 08:26:18 -04:00
|
|
|
int m_Ref;
|
|
|
|
} ;
|
2013-08-08 08:08:21 -04:00
|
|
|
|
|
|
|
|
2014-01-11 16:51:10 -05:00
|
|
|
/** Used for calling functions stored in a reference-stored table */
|
|
|
|
class cTableRef
|
|
|
|
{
|
|
|
|
int m_TableRef;
|
|
|
|
const char * m_FnName;
|
|
|
|
public:
|
|
|
|
cTableRef(int a_TableRef, const char * a_FnName) :
|
|
|
|
m_TableRef(a_TableRef),
|
|
|
|
m_FnName(a_FnName)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
int GetTableRef(void) const { return m_TableRef; }
|
|
|
|
const char * GetFnName(void) const { return m_FnName; }
|
|
|
|
} ;
|
|
|
|
|
|
|
|
|
2014-01-21 16:59:08 -05:00
|
|
|
/** A dummy class that's used only to delimit function args from return values for cLuaState::Call() */
|
2013-08-08 08:08:21 -04:00
|
|
|
class cRet
|
|
|
|
{
|
|
|
|
} ;
|
|
|
|
|
|
|
|
static const cRet Return; // Use this constant to delimit function args from return values for cLuaState::Call()
|
2013-08-07 08:26:18 -04:00
|
|
|
|
|
|
|
|
2013-08-04 17:11:25 -04:00
|
|
|
/** Creates a new instance. The LuaState is not initialized.
|
2014-07-17 16:15:34 -04:00
|
|
|
a_SubsystemName is used for reporting problems in the console, it is "plugin %s" for plugins,
|
2013-08-04 17:11:25 -04:00
|
|
|
or "LuaScript" for the cLuaScript template
|
|
|
|
*/
|
|
|
|
cLuaState(const AString & a_SubsystemName);
|
|
|
|
|
2013-08-06 02:01:00 -04:00
|
|
|
/** Creates a new instance. The a_AttachState is attached.
|
|
|
|
Subsystem name is set to "<attached>".
|
|
|
|
*/
|
|
|
|
explicit cLuaState(lua_State * a_AttachState);
|
|
|
|
|
2013-08-04 17:11:25 -04:00
|
|
|
~cLuaState();
|
|
|
|
|
2014-01-21 16:59:08 -05:00
|
|
|
/** Allows this object to be used in the same way as a lua_State *, for example in the LuaLib functions */
|
2013-08-04 17:11:25 -04:00
|
|
|
operator lua_State * (void) { return m_LuaState; }
|
|
|
|
|
2014-03-12 08:05:28 -04:00
|
|
|
/** Creates the m_LuaState, if not closed already. This state will be automatically closed in the destructor.
|
|
|
|
The regular Lua libs are registered, but the MCS API is not registered (so that Lua can be used as
|
|
|
|
lite-config as well), use RegisterAPILibs() to do that. */
|
2013-08-04 17:11:25 -04:00
|
|
|
void Create(void);
|
|
|
|
|
2014-03-12 08:05:28 -04:00
|
|
|
/** Registers all the API libraries that MCS provides into m_LuaState. */
|
|
|
|
void RegisterAPILibs(void);
|
|
|
|
|
2014-01-21 16:59:08 -05:00
|
|
|
/** Closes the m_LuaState, if not closed already */
|
2013-08-04 17:11:25 -04:00
|
|
|
void Close(void);
|
|
|
|
|
2014-01-21 16:59:08 -05:00
|
|
|
/** Attaches the specified state. Operations will be carried out on this state, but it will not be closed in the destructor */
|
2013-08-06 02:01:00 -04:00
|
|
|
void Attach(lua_State * a_State);
|
|
|
|
|
2014-01-21 16:59:08 -05:00
|
|
|
/** Detaches a previously attached state. */
|
2013-08-06 02:01:00 -04:00
|
|
|
void Detach(void);
|
|
|
|
|
2014-01-21 16:59:08 -05:00
|
|
|
/** Returns true if the m_LuaState is valid */
|
2014-10-20 16:55:07 -04:00
|
|
|
bool IsValid(void) const { return (m_LuaState != nullptr); }
|
2013-08-04 17:11:25 -04:00
|
|
|
|
2014-02-17 17:12:46 -05:00
|
|
|
/** Adds the specified path to package.<a_PathVariable> */
|
|
|
|
void AddPackagePath(const AString & a_PathVariable, const AString & a_Path);
|
|
|
|
|
2013-08-04 17:11:25 -04:00
|
|
|
/** Loads the specified file
|
|
|
|
Returns false and logs a warning to the console if not successful (but the LuaState is kept open).
|
|
|
|
m_SubsystemName is displayed in the warning log message.
|
|
|
|
*/
|
|
|
|
bool LoadFile(const AString & a_FileName);
|
|
|
|
|
2014-01-21 16:59:08 -05:00
|
|
|
/** Returns true if a_FunctionName is a valid Lua function that can be called */
|
2013-08-08 10:02:07 -04:00
|
|
|
bool HasFunction(const char * a_FunctionName);
|
|
|
|
|
2015-02-12 14:05:55 -05:00
|
|
|
void PushNil(void);
|
|
|
|
|
2014-06-03 13:29:04 -04:00
|
|
|
// Push a const value onto the stack (keep alpha-sorted):
|
2013-08-08 08:08:21 -04:00
|
|
|
void Push(const AString & a_String);
|
|
|
|
void Push(const AStringVector & a_Vector);
|
2014-06-03 13:29:04 -04:00
|
|
|
void Push(const cCraftingGrid * a_Grid);
|
|
|
|
void Push(const cCraftingRecipe * a_Recipe);
|
2013-08-08 08:08:21 -04:00
|
|
|
void Push(const char * a_Value);
|
2014-06-03 13:29:04 -04:00
|
|
|
void Push(const cItems & a_Items);
|
2013-08-08 08:08:21 -04:00
|
|
|
void Push(const cPlayer * a_Player);
|
2014-06-03 13:29:04 -04:00
|
|
|
void Push(const HTTPRequest * a_Request);
|
|
|
|
void Push(const HTTPTemplateRequest * a_Request);
|
|
|
|
void Push(const Vector3d & a_Vector);
|
2014-08-22 04:33:15 -04:00
|
|
|
void Push(const Vector3d * a_Vector);
|
|
|
|
void Push(const Vector3i & a_Vector);
|
|
|
|
void Push(const Vector3i * a_Vector);
|
2014-06-03 13:29:04 -04:00
|
|
|
|
|
|
|
// Push a value onto the stack (keep alpha-sorted):
|
|
|
|
void Push(bool a_Value);
|
|
|
|
void Push(cBlockEntity * a_BlockEntity);
|
|
|
|
void Push(cChunkDesc * a_ChunkDesc);
|
|
|
|
void Push(cClientHandle * a_ClientHandle);
|
2013-08-08 08:08:21 -04:00
|
|
|
void Push(cEntity * a_Entity);
|
2014-06-03 13:29:04 -04:00
|
|
|
void Push(cHopperEntity * a_Hopper);
|
2013-08-08 08:08:21 -04:00
|
|
|
void Push(cItem * a_Item);
|
|
|
|
void Push(cItems * a_Items);
|
2015-01-30 15:24:02 -05:00
|
|
|
void Push(cLuaServerHandle * a_ServerHandle);
|
2015-01-28 09:14:05 -05:00
|
|
|
void Push(cLuaTCPLink * a_TCPLink);
|
2015-02-20 08:28:05 -05:00
|
|
|
void Push(cLuaUDPEndpoint * a_UDPEndpoint);
|
2014-06-03 13:29:04 -04:00
|
|
|
void Push(cMonster * a_Monster);
|
2013-08-08 08:08:21 -04:00
|
|
|
void Push(cPickup * a_Pickup);
|
2014-06-03 13:29:04 -04:00
|
|
|
void Push(cPlayer * a_Player);
|
2015-04-23 13:41:01 -04:00
|
|
|
void Push(cPlugin * a_Plugin);
|
2013-08-19 03:39:18 -04:00
|
|
|
void Push(cPluginLua * a_Plugin);
|
2014-06-03 13:29:04 -04:00
|
|
|
void Push(cProjectileEntity * a_ProjectileEntity);
|
Added OnExploding() and OnExploded() hooks.
As requested in FS 413, with extra parameters:
World, BlockX, BlockY, BlockZ, Size, CanCauseFire, Source, SourceData
OnExploding() can return 3 values:
StopHook, CanCauseFire, ExplosionSize
2013-08-09 08:58:43 -04:00
|
|
|
void Push(cTNTEntity * a_TNTEntity);
|
2014-06-03 13:29:04 -04:00
|
|
|
void Push(cWebAdmin * a_WebAdmin);
|
|
|
|
void Push(cWindow * a_Window);
|
|
|
|
void Push(cWorld * a_World);
|
|
|
|
void Push(double a_Value);
|
|
|
|
void Push(int a_Value);
|
|
|
|
void Push(TakeDamageInfo * a_TDI);
|
|
|
|
void Push(Vector3d * a_Vector);
|
Added OnExploding() and OnExploded() hooks.
As requested in FS 413, with extra parameters:
World, BlockX, BlockY, BlockZ, Size, CanCauseFire, Source, SourceData
OnExploding() can return 3 values:
StopHook, CanCauseFire, ExplosionSize
2013-08-09 08:58:43 -04:00
|
|
|
void Push(Vector3i * a_Vector);
|
2014-03-20 04:16:47 -04:00
|
|
|
void Push(void * a_Ptr);
|
2015-01-11 16:12:26 -05:00
|
|
|
void Push(std::chrono::milliseconds a_time);
|
2014-03-04 15:55:24 -05:00
|
|
|
|
2015-04-23 13:41:01 -04:00
|
|
|
// GetStackValue() retrieves the value at a_StackPos, if it is a valid type. If not, a_Value is unchanged.
|
|
|
|
// Enum values are clamped to their allowed range.
|
2014-03-04 15:55:24 -05:00
|
|
|
void GetStackValue(int a_StackPos, AString & a_Value);
|
2015-04-29 09:14:22 -04:00
|
|
|
void GetStackValue(int a_StackPos, BLOCKTYPE & a_Value);
|
2015-04-23 13:41:01 -04:00
|
|
|
void GetStackValue(int a_StackPos, bool & a_Value);
|
|
|
|
void GetStackValue(int a_StackPos, cRef & a_Ref);
|
2014-03-04 15:55:24 -05:00
|
|
|
void GetStackValue(int a_StackPos, double & a_Value);
|
2014-07-03 11:49:21 -04:00
|
|
|
void GetStackValue(int a_StackPos, eWeather & a_Value);
|
2015-04-23 13:41:01 -04:00
|
|
|
void GetStackValue(int a_StackPos, int & a_Value);
|
2015-04-29 09:14:22 -04:00
|
|
|
void GetStackValue(int a_StackPos, pBlockArea & a_Value);
|
2014-09-03 11:00:26 -04:00
|
|
|
void GetStackValue(int a_StackPos, pBoundingBox & a_Value);
|
2015-03-21 13:17:26 -04:00
|
|
|
void GetStackValue(int a_StackPos, pClientHandle & a_Value);
|
2015-04-23 16:20:31 -04:00
|
|
|
void GetStackValue(int a_StackPos, pMapManager & a_Value);
|
2015-04-23 13:41:01 -04:00
|
|
|
void GetStackValue(int a_StackPos, pPluginManager & a_Value);
|
|
|
|
void GetStackValue(int a_StackPos, pRoot & a_Value);
|
|
|
|
void GetStackValue(int a_StackPos, pScoreboard & a_Value);
|
2014-09-03 11:00:26 -04:00
|
|
|
void GetStackValue(int a_StackPos, pWorld & a_Value);
|
2014-07-03 11:49:21 -04:00
|
|
|
|
2014-10-15 12:50:32 -04:00
|
|
|
/** Call the specified Lua function.
|
|
|
|
Returns true if call succeeded, false if there was an error.
|
|
|
|
A special param of cRet & signifies the end of param list and the start of return values.
|
|
|
|
Example call: Call(Fn, Param1, Param2, Param3, cLuaState::Return, Ret1, Ret2) */
|
|
|
|
template <typename FnT, typename... Args>
|
2014-10-16 10:11:35 -04:00
|
|
|
bool Call(const FnT & a_Function, Args &&... args)
|
2014-10-15 12:50:32 -04:00
|
|
|
{
|
2014-10-31 14:25:31 -04:00
|
|
|
if (!PushFunction(a_Function))
|
|
|
|
{
|
|
|
|
// Pushing the function failed
|
|
|
|
return false;
|
|
|
|
}
|
2014-10-15 12:50:32 -04:00
|
|
|
return PushCallPop(args...);
|
|
|
|
}
|
2014-01-11 16:51:10 -05:00
|
|
|
|
2014-10-15 12:50:32 -04:00
|
|
|
/** Retrieves a list of values from the Lua stack, starting at the specified index. */
|
|
|
|
template <typename T, typename... Args>
|
2014-10-16 10:11:35 -04:00
|
|
|
inline void GetStackValues(int a_StartStackPos, T & a_Ret, Args &&... args)
|
2014-10-15 12:50:32 -04:00
|
|
|
{
|
|
|
|
GetStackValue(a_StartStackPos, a_Ret);
|
|
|
|
GetStackValues(a_StartStackPos + 1, args...);
|
|
|
|
}
|
2013-08-08 10:02:07 -04:00
|
|
|
|
2014-01-21 16:59:08 -05:00
|
|
|
/** Returns true if the specified parameters on the stack are of the specified usertable type; also logs warning if not. Used for static functions */
|
2013-11-22 10:49:38 -05:00
|
|
|
bool CheckParamUserTable(int a_StartParam, const char * a_UserTable, int a_EndParam = -1);
|
|
|
|
|
2014-01-21 16:59:08 -05:00
|
|
|
/** Returns true if the specified parameters on the stack are of the specified usertype; also logs warning if not. Used for regular functions */
|
2013-08-07 08:26:18 -04:00
|
|
|
bool CheckParamUserType(int a_StartParam, const char * a_UserType, int a_EndParam = -1);
|
|
|
|
|
2014-01-21 16:59:08 -05:00
|
|
|
/** Returns true if the specified parameters on the stack are tables; also logs warning if not */
|
2013-08-07 08:26:18 -04:00
|
|
|
bool CheckParamTable(int a_StartParam, int a_EndParam = -1);
|
|
|
|
|
2014-01-21 16:59:08 -05:00
|
|
|
/** Returns true if the specified parameters on the stack are numbers; also logs warning if not */
|
2013-08-07 08:26:18 -04:00
|
|
|
bool CheckParamNumber(int a_StartParam, int a_EndParam = -1);
|
|
|
|
|
2014-01-21 16:59:08 -05:00
|
|
|
/** Returns true if the specified parameters on the stack are strings; also logs warning if not */
|
2013-11-22 14:11:24 -05:00
|
|
|
bool CheckParamString(int a_StartParam, int a_EndParam = -1);
|
|
|
|
|
2014-01-21 16:59:08 -05:00
|
|
|
/** Returns true if the specified parameters on the stack are functions; also logs warning if not */
|
2014-01-19 17:45:26 -05:00
|
|
|
bool CheckParamFunction(int a_StartParam, int a_EndParam = -1);
|
|
|
|
|
2014-02-11 09:03:35 -05:00
|
|
|
/** Returns true if the specified parameters on the stack are functions or nils; also logs warning if not */
|
|
|
|
bool CheckParamFunctionOrNil(int a_StartParam, int a_EndParam = -1);
|
|
|
|
|
2014-01-21 16:59:08 -05:00
|
|
|
/** Returns true if the specified parameter on the stack is nil (indicating an end-of-parameters) */
|
2013-08-07 08:26:18 -04:00
|
|
|
bool CheckParamEnd(int a_Param);
|
|
|
|
|
2015-03-21 13:17:26 -04:00
|
|
|
bool IsParamUserType(int a_Param, AString a_UserType);
|
|
|
|
|
|
|
|
bool IsParamNumber(int a_Param);
|
|
|
|
|
2014-01-21 16:59:08 -05:00
|
|
|
/** If the status is nonzero, prints the text on the top of Lua stack and returns true */
|
2013-08-04 17:11:25 -04:00
|
|
|
bool ReportErrors(int status);
|
|
|
|
|
2014-01-21 16:59:08 -05:00
|
|
|
/** If the status is nonzero, prints the text on the top of Lua stack and returns true */
|
2013-08-04 17:11:25 -04:00
|
|
|
static bool ReportErrors(lua_State * a_LuaState, int status);
|
|
|
|
|
2014-01-21 16:59:08 -05:00
|
|
|
/** Logs all items in the current stack trace to the server console */
|
2014-03-19 17:55:47 -04:00
|
|
|
void LogStackTrace(int a_StartingDepth = 0);
|
2013-08-21 14:06:37 -04:00
|
|
|
|
2014-01-21 16:59:08 -05:00
|
|
|
/** Logs all items in the current stack trace to the server console */
|
2014-03-19 17:55:47 -04:00
|
|
|
static void LogStackTrace(lua_State * a_LuaState, int a_StartingDepth = 0);
|
2014-01-11 16:51:10 -05:00
|
|
|
|
2014-01-21 16:59:08 -05:00
|
|
|
/** Returns the type of the item on the specified position in the stack */
|
2013-08-21 14:06:37 -04:00
|
|
|
AString GetTypeText(int a_StackPos);
|
|
|
|
|
2014-01-21 16:59:08 -05:00
|
|
|
/** Calls the function specified by its name, with arguments copied off the foreign state.
|
|
|
|
If successful, keeps the return values on the stack and returns their number.
|
|
|
|
If unsuccessful, returns a negative number and keeps the stack position unchanged. */
|
|
|
|
int CallFunctionWithForeignParams(
|
|
|
|
const AString & a_FunctionName,
|
|
|
|
cLuaState & a_SrcLuaState,
|
|
|
|
int a_SrcParamStart,
|
|
|
|
int a_SrcParamEnd
|
|
|
|
);
|
|
|
|
|
|
|
|
/** Copies objects on the stack from the specified state.
|
|
|
|
Only numbers, bools, strings and userdatas are copied.
|
|
|
|
If successful, returns the number of objects copied.
|
|
|
|
If failed, returns a negative number and rewinds the stack position. */
|
|
|
|
int CopyStackFrom(cLuaState & a_SrcLuaState, int a_SrcStart, int a_SrcEnd);
|
|
|
|
|
|
|
|
/** Reads the value at the specified stack position as a string and sets it to a_String. */
|
|
|
|
void ToString(int a_StackPos, AString & a_String);
|
|
|
|
|
|
|
|
/** Logs all the elements' types on the API stack, with an optional header for the listing. */
|
2014-10-20 16:55:07 -04:00
|
|
|
void LogStack(const char * a_Header = nullptr);
|
2014-01-21 16:59:08 -05:00
|
|
|
|
|
|
|
/** Logs all the elements' types on the API stack, with an optional header for the listing. */
|
2014-10-20 16:55:07 -04:00
|
|
|
static void LogStack(lua_State * a_LuaState, const char * a_Header = nullptr);
|
2014-01-21 16:59:08 -05:00
|
|
|
|
2013-08-04 17:11:25 -04:00
|
|
|
protected:
|
2014-10-15 12:50:32 -04:00
|
|
|
|
2013-08-04 17:11:25 -04:00
|
|
|
lua_State * m_LuaState;
|
|
|
|
|
2014-01-21 16:59:08 -05:00
|
|
|
/** If true, the state is owned by this object and will be auto-Closed. False => attached state */
|
2013-08-06 02:01:00 -04:00
|
|
|
bool m_IsOwned;
|
|
|
|
|
2013-08-04 17:11:25 -04:00
|
|
|
/** The subsystem name is used for reporting errors to the console, it is either "plugin %s" or "LuaScript"
|
|
|
|
whatever is given to the constructor
|
|
|
|
*/
|
|
|
|
AString m_SubsystemName;
|
2013-08-06 02:59:54 -04:00
|
|
|
|
2014-01-21 16:59:08 -05:00
|
|
|
/** Name of the currently pushed function (for the Push / Call chain) */
|
2013-08-06 02:59:54 -04:00
|
|
|
AString m_CurrentFunctionName;
|
|
|
|
|
2014-01-21 16:59:08 -05:00
|
|
|
/** Number of arguments currently pushed (for the Push / Call chain) */
|
2013-08-06 02:59:54 -04:00
|
|
|
int m_NumCurrentFunctionArgs;
|
2014-01-11 16:51:10 -05:00
|
|
|
|
2014-10-15 12:50:32 -04:00
|
|
|
/** Variadic template terminator: If there's nothing more to push / pop, just call the function.
|
|
|
|
Note that there are no return values either, because those are prefixed by a cRet value, so the arg list is never empty. */
|
|
|
|
bool PushCallPop(void)
|
|
|
|
{
|
|
|
|
return CallFunction(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Variadic template recursor: More params to push. Push them and recurse. */
|
2014-10-19 12:45:32 -04:00
|
|
|
template <typename T, typename... Args>
|
2014-10-16 10:11:35 -04:00
|
|
|
inline bool PushCallPop(T a_Param, Args &&... args)
|
2014-10-15 12:50:32 -04:00
|
|
|
{
|
|
|
|
Push(a_Param);
|
|
|
|
return PushCallPop(args...);
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Variadic template terminator: If there's nothing more to push, but return values to collect, call the function and collect the returns. */
|
|
|
|
template <typename... Args>
|
2014-10-16 10:11:35 -04:00
|
|
|
bool PushCallPop(cLuaState::cRet, Args &&... args)
|
2014-10-15 12:50:32 -04:00
|
|
|
{
|
|
|
|
// Calculate the number of return values (number of args left):
|
2015-01-31 10:44:14 -05:00
|
|
|
int NumReturns = sizeof...(args);
|
2014-10-15 12:50:32 -04:00
|
|
|
|
|
|
|
// Call the function:
|
|
|
|
if (!CallFunction(NumReturns))
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Collect the return values:
|
|
|
|
GetStackValues(-NumReturns, args...);
|
|
|
|
lua_pop(m_LuaState, NumReturns);
|
|
|
|
|
|
|
|
// All successful:
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Variadic template terminator: If there are no more values to get, bail out.
|
|
|
|
This function is not available in the public API, because it's an error to request no values directly; only internal functions can do that.
|
|
|
|
If you get a compile error saying this function is not accessible, check your calling code, you aren't reading any stack values. */
|
|
|
|
void GetStackValues(int a_StartingStackPos)
|
|
|
|
{
|
|
|
|
// Do nothing
|
|
|
|
}
|
|
|
|
|
2014-01-11 16:51:10 -05:00
|
|
|
/** Pushes the function of the specified name onto the stack.
|
|
|
|
Returns true if successful. Logs a warning on failure (incl. m_SubsystemName)
|
|
|
|
*/
|
|
|
|
bool PushFunction(const char * a_FunctionName);
|
|
|
|
|
|
|
|
/** Pushes a function that has been saved into the global registry, identified by a_FnRef.
|
|
|
|
Returns true if successful. Logs a warning on failure
|
|
|
|
*/
|
|
|
|
bool PushFunction(int a_FnRef);
|
|
|
|
|
2014-09-03 17:05:03 -04:00
|
|
|
/** Pushes a function that has been saved as a reference.
|
|
|
|
Returns true if successful. Logs a warning on failure
|
|
|
|
*/
|
|
|
|
bool PushFunction(const cRef & a_FnRef)
|
|
|
|
{
|
|
|
|
return PushFunction((int)a_FnRef);
|
|
|
|
}
|
|
|
|
|
2014-01-11 16:51:10 -05:00
|
|
|
/** Pushes a function that is stored in a referenced table by name
|
|
|
|
Returns true if successful. Logs a warning on failure
|
|
|
|
*/
|
|
|
|
bool PushFunction(const cTableRef & a_TableRef);
|
|
|
|
|
2014-01-21 16:59:08 -05:00
|
|
|
/** Pushes a usertype of the specified class type onto the stack */
|
2014-01-11 16:51:10 -05:00
|
|
|
void PushUserType(void * a_Object, const char * a_Type);
|
|
|
|
|
|
|
|
/**
|
|
|
|
Calls the function that has been pushed onto the stack by PushFunction(),
|
|
|
|
with arguments pushed by PushXXX().
|
|
|
|
Returns true if successful, logs a warning on failure.
|
|
|
|
*/
|
|
|
|
bool CallFunction(int a_NumReturnValues);
|
|
|
|
|
2014-01-11 17:10:40 -05:00
|
|
|
/** Used as the error reporting function for function calls */
|
|
|
|
static int ReportFnCallErrors(lua_State * a_LuaState);
|
2013-08-04 17:11:25 -04:00
|
|
|
} ;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|