1
0
Fork 0

Moved ApiParamError into cLuaState.

This commit is contained in:
Mattes D 2017-06-26 08:56:55 +02:00
parent f6bab71d05
commit e05ca49459
5 changed files with 144 additions and 114 deletions

View File

@ -1775,7 +1775,33 @@ bool cLuaState::CheckParamSelf(const char * a_SelfClassName)
VERIFY(lua_getstack(m_LuaState, 0, &entry)); VERIFY(lua_getstack(m_LuaState, 0, &entry));
VERIFY(lua_getinfo (m_LuaState, "n", &entry)); VERIFY(lua_getinfo (m_LuaState, "n", &entry));
AString ErrMsg = Printf( AString ErrMsg = Printf(
"Error in function '%s'. The 'self' parameter is not of the expected type, \"instance of %s\". Make sure you're using the correct calling convention (obj:fn() instead of obj.fn()).", "Error in function '%s'. The 'self' parameter is not of the expected type, \"instance of %s\". " \
"Make sure you're using the correct calling convention (obj:fn() instead of obj.fn()).",
(entry.name != nullptr) ? entry.name : "<unknown>", a_SelfClassName
);
tolua_error(m_LuaState, ErrMsg.c_str(), &tolua_err);
return false;
}
bool cLuaState::CheckParamStaticSelf(const char * a_SelfClassName)
{
tolua_Error tolua_err;
if (tolua_isusertable(m_LuaState, 1, a_SelfClassName, 0, &tolua_err) && !lua_isnil(m_LuaState, 1))
{
return true;
}
// Not the correct parameter
lua_Debug entry;
VERIFY(lua_getstack(m_LuaState, 0, &entry));
VERIFY(lua_getinfo (m_LuaState, "n", &entry));
AString ErrMsg = Printf(
"Error in function '%s'. The 'self' parameter is not of the expected type, \"class %s\". " \
"Make sure you're using the correct calling convention (cClassName:fn() instead of cClassName.fn() or obj:fn()).",
(entry.name != nullptr) ? entry.name : "<unknown>", a_SelfClassName (entry.name != nullptr) ? entry.name : "<unknown>", a_SelfClassName
); );
tolua_error(m_LuaState, ErrMsg.c_str(), &tolua_err); tolua_error(m_LuaState, ErrMsg.c_str(), &tolua_err);
@ -1863,6 +1889,46 @@ void cLuaState::LogStackTrace(lua_State * a_LuaState, int a_StartingDepth)
int cLuaState::ApiParamError(const char * a_MsgFormat, ...)
{
// Retrieve current function name
lua_Debug entry;
VERIFY(lua_getstack(m_LuaState, 0, &entry));
VERIFY(lua_getinfo(m_LuaState, "n", &entry));
// Compose the error message:
va_list argp;
va_start(argp, a_MsgFormat);
AString msg;
#ifdef __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wformat-nonliteral"
#endif
AppendVPrintf(msg, a_MsgFormat, argp);
#ifdef __clang__
#pragma clang diagnostic pop
#endif
va_end(argp);
AString errorMsg = Printf("%s: %s", (entry.name != nullptr) ? entry.name : "<unknown function>", msg.c_str());
// Log everything into the console:
LOGWARNING("%s", errorMsg.c_str());
// cLuaState::LogStackTrace(a_LuaState); // Do NOT log stack trace, it is already output as part of the Lua error handling
LogStackValues(m_LuaState, "Parameters on the stack");
// Raise Lua error:
lua_pushstring(m_LuaState, errorMsg.c_str());
return lua_error(m_LuaState);
}
AString cLuaState::GetTypeText(int a_StackPos) AString cLuaState::GetTypeText(int a_StackPos)
{ {
return lua_typename(m_LuaState, lua_type(m_LuaState, a_StackPos)); return lua_typename(m_LuaState, lua_type(m_LuaState, a_StackPos));

View File

@ -792,6 +792,10 @@ public:
Returns false and logs a special warning ("wrong calling convention") if not. */ Returns false and logs a special warning ("wrong calling convention") if not. */
bool CheckParamSelf(const char * a_SelfClassName); bool CheckParamSelf(const char * a_SelfClassName);
/** Returns true if the first parameter is the expected class (static).
Returns false and logs a special warning ("wrong calling convention") if not. */
bool CheckParamStaticSelf(const char * a_SelfClassName);
bool IsParamUserType(int a_Param, AString a_UserType); bool IsParamUserType(int a_Param, AString a_UserType);
bool IsParamNumber(int a_Param); bool IsParamNumber(int a_Param);
@ -808,6 +812,11 @@ public:
/** Logs all items in the current stack trace to the server console */ /** Logs all items in the current stack trace to the server console */
static void LogStackTrace(lua_State * a_LuaState, int a_StartingDepth = 0); static void LogStackTrace(lua_State * a_LuaState, int a_StartingDepth = 0);
/** Formats and prints the message, prefixed with the current function name, then logs the stack contents and raises a Lua error.
To be used for bindings when they detect bad parameters.
Doesn't return, but a dummy return type is provided so that Lua API functions may do "return ApiParamError(...)". */
int ApiParamError(const char * a_MsgFormat, ...);
/** Returns the type of the item on the specified position in the stack */ /** Returns the type of the item on the specified position in the stack */
AString GetTypeText(int a_StackPos); AString GetTypeText(int a_StackPos);

View File

@ -132,46 +132,6 @@ int cManualBindings::lua_do_error(lua_State * L, const char * a_pFormat, ...)
int cManualBindings::ApiParamError(lua_State * a_LuaState, const char * a_MsgFormat, ...)
{
// Retrieve current function name
lua_Debug entry;
VERIFY(lua_getstack(a_LuaState, 0, &entry));
VERIFY(lua_getinfo(a_LuaState, "n", &entry));
// Compose the error message:
va_list argp;
va_start(argp, a_MsgFormat);
AString msg;
#ifdef __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wformat-nonliteral"
#endif
AppendVPrintf(msg, a_MsgFormat, argp);
#ifdef __clang__
#pragma clang diagnostic pop
#endif
va_end(argp);
AString errorMsg = Printf("%s: %s", (entry.name != nullptr) ? entry.name : "<unknown function>", msg.c_str());
// Log everything into the console:
LOGWARNING("%s", errorMsg.c_str());
// cLuaState::LogStackTrace(a_LuaState); // Do NOT log stack trace, it is already output as part of the Lua error handling
cLuaState::LogStackValues(a_LuaState, "Parameters on the stack");
// Raise Lua error:
lua_pushstring(a_LuaState, errorMsg.c_str());
return lua_error(a_LuaState);
}
// Lua bound functions with special return types // Lua bound functions with special return types
static int tolua_Clamp(lua_State * tolua_S) static int tolua_Clamp(lua_State * tolua_S)
{ {

View File

@ -52,11 +52,6 @@ public:
static int tolua_do_error(lua_State * L, const char * a_pMsg, tolua_Error * a_pToLuaError); static int tolua_do_error(lua_State * L, const char * a_pMsg, tolua_Error * a_pToLuaError);
static int lua_do_error(lua_State * L, const char * a_pFormat, ...); static int lua_do_error(lua_State * L, const char * a_pFormat, ...);
/** Formats and prints the message, prefixed with the current function name, then logs the stack contents and raises a Lua error.
To be used for bindings when they detect bad parameters.
Doesn't return, but a dummy return type is provided so that Lua API functions may do "return ApiParamError(...)". */
static int ApiParamError(lua_State * a_LuaState, const char * a_MsgFormat, ...);
/** Binds the DoWith(ItemName) functions of regular classes. */ /** Binds the DoWith(ItemName) functions of regular classes. */
template < template <

View File

@ -31,7 +31,7 @@ static int readCuboidOverloadParams(cLuaState & a_LuaState, int a_StartParam, cC
// Assume the 6-number version: // Assume the 6-number version:
if (!a_LuaState.GetStackValues(a_StartParam, a_Cuboid.p1.x, a_Cuboid.p2.x, a_Cuboid.p1.y, a_Cuboid.p2.y, a_Cuboid.p1.z, a_Cuboid.p2.z)) if (!a_LuaState.GetStackValues(a_StartParam, a_Cuboid.p1.x, a_Cuboid.p2.x, a_Cuboid.p1.y, a_Cuboid.p2.y, a_Cuboid.p1.z, a_Cuboid.p2.z))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Cannot read the bounds parameters, expected 6 numbers."); return a_LuaState.ApiParamError("Cannot read the bounds parameters, expected 6 numbers.");
} }
return a_StartParam + 6; return a_StartParam + 6;
} }
@ -41,7 +41,7 @@ static int readCuboidOverloadParams(cLuaState & a_LuaState, int a_StartParam, cC
cCuboid * c; cCuboid * c;
if (!a_LuaState.GetStackValues(a_StartParam, c)) if (!a_LuaState.GetStackValues(a_StartParam, c))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Cannot read the bounds parameter, expected a cCuboid instance."); return a_LuaState.ApiParamError("Cannot read the bounds parameter, expected a cCuboid instance.");
} }
a_Cuboid = *c; a_Cuboid = *c;
return a_StartParam + 1; return a_StartParam + 1;
@ -53,7 +53,7 @@ static int readCuboidOverloadParams(cLuaState & a_LuaState, int a_StartParam, cC
Vector3i * p2; Vector3i * p2;
if (!a_LuaState.GetStackValues(a_StartParam, p1, p2)) if (!a_LuaState.GetStackValues(a_StartParam, p1, p2))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Cannot read the bounds parameter, expected two Vector3i instances."); return a_LuaState.ApiParamError("Cannot read the bounds parameter, expected two Vector3i instances.");
} }
a_Cuboid.p1 = *p1; a_Cuboid.p1 = *p1;
a_Cuboid.p2 = *p2; a_Cuboid.p2 = *p2;
@ -79,7 +79,7 @@ static int readVector3iOverloadParams(cLuaState & a_LuaState, int a_StartParam,
// Assume the 3-number version: // Assume the 3-number version:
if (!a_LuaState.GetStackValues(a_StartParam, a_Coords.x, a_Coords.y, a_Coords.z)) if (!a_LuaState.GetStackValues(a_StartParam, a_Coords.x, a_Coords.y, a_Coords.z))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Cannot read the %s, expected 3 numbers.", a_ParamName); return a_LuaState.ApiParamError("Cannot read the %s, expected 3 numbers.", a_ParamName);
} }
return a_StartParam + 3; return a_StartParam + 3;
} }
@ -89,7 +89,7 @@ static int readVector3iOverloadParams(cLuaState & a_LuaState, int a_StartParam,
Vector3i * c; Vector3i * c;
if (!a_LuaState.GetStackValues(a_StartParam, c)) if (!a_LuaState.GetStackValues(a_StartParam, c))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Cannot read the %s, expected a Vector3i instance.", a_ParamName); return a_LuaState.ApiParamError("Cannot read the %s, expected a Vector3i instance.", a_ParamName);
} }
a_Coords = *c; a_Coords = *c;
return a_StartParam + 1; return a_StartParam + 1;
@ -111,11 +111,11 @@ static int tolua_cBlockArea_Create(lua_State * a_LuaState)
cBlockArea * self = nullptr; cBlockArea * self = nullptr;
if (!L.GetStackValues(1, self)) if (!L.GetStackValues(1, self))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Cannot read self."); return L.ApiParamError("Cannot read self.");
} }
if (self == nullptr) if (self == nullptr)
{ {
return cManualBindings::ApiParamError(a_LuaState, "Invalid 'self', must not be nil."); return L.ApiParamError("Invalid 'self', must not be nil.");
} }
int dataTypes = cBlockArea::baTypes | cBlockArea::baMetas | cBlockArea::baBlockEntities; int dataTypes = cBlockArea::baTypes | cBlockArea::baMetas | cBlockArea::baBlockEntities;
@ -124,13 +124,13 @@ static int tolua_cBlockArea_Create(lua_State * a_LuaState)
L.GetStackValue(dataTypesIdx, dataTypes); L.GetStackValue(dataTypesIdx, dataTypes);
if (!cBlockArea::IsValidDataTypeCombination(dataTypes)) if (!cBlockArea::IsValidDataTypeCombination(dataTypes))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Invalid combination of baDataTypes specified (%d).", dataTypes); return L.ApiParamError("Invalid combination of baDataTypes specified (%d).", dataTypes);
} }
// Create the area: // Create the area:
if ((size.x <= 0) || (size.y <= 0) || (size.z <= 0)) if ((size.x <= 0) || (size.y <= 0) || (size.z <= 0))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Invalid sizes, must be greater than zero, got {%d, %d, %d}", size.x, size.y, size.z); return L.ApiParamError("Invalid sizes, must be greater than zero, got {%d, %d, %d}", size.x, size.y, size.z);
} }
ASSERT(self != nullptr); ASSERT(self != nullptr);
self->Create(size, dataTypes); self->Create(size, dataTypes);
@ -155,11 +155,11 @@ static int tolua_cBlockArea_FillRelCuboid(lua_State * a_LuaState)
cBlockArea * self = nullptr; cBlockArea * self = nullptr;
if (!L.GetStackValues(1, self)) if (!L.GetStackValues(1, self))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Cannot read self."); return L.ApiParamError("Cannot read self.");
} }
if (self == nullptr) if (self == nullptr)
{ {
return cManualBindings::ApiParamError(a_LuaState, "Invalid 'self', must not be nil."); return L.ApiParamError("Invalid 'self', must not be nil.");
} }
// Check and get the overloaded params: // Check and get the overloaded params:
@ -170,12 +170,12 @@ static int tolua_cBlockArea_FillRelCuboid(lua_State * a_LuaState)
NIBBLETYPE blockMeta = 0, blockLight = 0, blockSkyLight = 0x0f; NIBBLETYPE blockMeta = 0, blockLight = 0, blockSkyLight = 0x0f;
if (!L.GetStackValues(nextIdx, dataTypes, blockType)) if (!L.GetStackValues(nextIdx, dataTypes, blockType))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Cannot read the datatypes or block type params"); return L.ApiParamError("Cannot read the datatypes or block type params");
} }
L.GetStackValues(nextIdx + 2, blockMeta, blockLight, blockSkyLight); // These values are optional L.GetStackValues(nextIdx + 2, blockMeta, blockLight, blockSkyLight); // These values are optional
if (!cBlockArea::IsValidDataTypeCombination(dataTypes)) if (!cBlockArea::IsValidDataTypeCombination(dataTypes))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Invalid baDataTypes combination (%d).", dataTypes); return L.ApiParamError("Invalid baDataTypes combination (%d).", dataTypes);
} }
// Check the coords, shift if needed: // Check the coords, shift if needed:
@ -206,18 +206,18 @@ static int tolua_cBlockArea_GetBlockTypeMeta(lua_State * a_LuaState)
cBlockArea * self; cBlockArea * self;
if (!L.GetStackValues(1, self)) if (!L.GetStackValues(1, self))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Cannot read 'self'"); return L.ApiParamError("Cannot read 'self'");
} }
if (self == nullptr) if (self == nullptr)
{ {
return cManualBindings::ApiParamError(a_LuaState, "Invalid 'self', must not be nil."); return L.ApiParamError("Invalid 'self', must not be nil.");
} }
Vector3i coords; Vector3i coords;
readVector3iOverloadParams(L, 2, coords, "coords"); readVector3iOverloadParams(L, 2, coords, "coords");
if (!self->IsValidCoords(coords)) if (!self->IsValidCoords(coords))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Coords ({%d, %d, %d}) out of range ({%d, %d, %d} - {%d, %d, %d}).", return L.ApiParamError("Coords ({%d, %d, %d}) out of range ({%d, %d, %d} - {%d, %d, %d}).",
coords.x, coords.y, coords.z, coords.x, coords.y, coords.z,
self->GetOriginX(), self->GetOriginY(), self->GetOriginZ(), self->GetOriginX(), self->GetOriginY(), self->GetOriginZ(),
self->GetOriginX() + self->GetSizeX() - 1, self->GetOriginY() + self->GetSizeY() - 1, self->GetOriginZ() + self->GetSizeZ() - 1 self->GetOriginX() + self->GetSizeX() - 1, self->GetOriginY() + self->GetSizeY() - 1, self->GetOriginZ() + self->GetSizeZ() - 1
@ -250,11 +250,11 @@ static int tolua_cBlockArea_GetCoordRange(lua_State * a_LuaState)
cBlockArea * self; cBlockArea * self;
if (!L.GetStackValues(1, self)) if (!L.GetStackValues(1, self))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Cannot read the 'self' parameter."); return L.ApiParamError("Cannot read the 'self' parameter.");
} }
if (self == nullptr) if (self == nullptr)
{ {
return cManualBindings::ApiParamError(a_LuaState, "Invalid 'self', must not be nil."); return L.ApiParamError("Invalid 'self', must not be nil.");
} }
L.Push(self->GetSizeX() - 1, self->GetSizeY() - 1, self->GetSizeZ() - 1); L.Push(self->GetSizeX() - 1, self->GetSizeY() - 1, self->GetSizeZ() - 1);
@ -280,15 +280,15 @@ static int tolua_cBlockArea_GetNonAirCropRelCoords(lua_State * a_LuaState)
BLOCKTYPE ignoreBlockType = E_BLOCK_AIR; BLOCKTYPE ignoreBlockType = E_BLOCK_AIR;
if (!L.GetStackValues(1, self, ignoreBlockType)) if (!L.GetStackValues(1, self, ignoreBlockType))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Cannot read params"); return L.ApiParamError("Cannot read params");
} }
if (self == nullptr) if (self == nullptr)
{ {
return cManualBindings::ApiParamError(a_LuaState, "Invalid 'self', must not be nil"); return L.ApiParamError("Invalid 'self', must not be nil");
} }
if (!self->HasBlockTypes()) if (!self->HasBlockTypes())
{ {
return cManualBindings::ApiParamError(a_LuaState, "The area doesn't contain baTypes datatype"); return L.ApiParamError("The area doesn't contain baTypes datatype");
} }
// Calculate the crop coords: // Calculate the crop coords:
@ -320,11 +320,11 @@ static int tolua_cBlockArea_GetOrigin(lua_State * a_LuaState)
cBlockArea * self; cBlockArea * self;
if (!L.GetStackValues(1, self)) if (!L.GetStackValues(1, self))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Cannot read the 'self' parameter."); return L.ApiParamError("Cannot read the 'self' parameter.");
} }
if (self == nullptr) if (self == nullptr)
{ {
return cManualBindings::ApiParamError(a_LuaState, "Invalid 'self', must not be nil."); return L.ApiParamError("Invalid 'self', must not be nil.");
} }
// Push the three origin coords: // Push the three origin coords:
@ -350,26 +350,26 @@ static int tolua_cBlockArea_GetRelBlockTypeMeta(lua_State * a_LuaState)
cBlockArea * self; cBlockArea * self;
if (!L.GetStackValues(1, self)) if (!L.GetStackValues(1, self))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Cannot read the 'self' parameter."); return L.ApiParamError("Cannot read the 'self' parameter.");
} }
if (self == nullptr) if (self == nullptr)
{ {
return cManualBindings::ApiParamError(a_LuaState, "Invalid 'self', must not be nil."); return L.ApiParamError("Invalid 'self', must not be nil.");
} }
if (!self->HasBlockTypes()) if (!self->HasBlockTypes())
{ {
return cManualBindings::ApiParamError(a_LuaState, "The area doesn't contain baTypes datatype"); return L.ApiParamError("The area doesn't contain baTypes datatype");
} }
if (!self->HasBlockMetas()) if (!self->HasBlockMetas())
{ {
return cManualBindings::ApiParamError(a_LuaState, "The area doesn't contain baMetas datatype"); return L.ApiParamError("The area doesn't contain baMetas datatype");
} }
Vector3i coords; Vector3i coords;
readVector3iOverloadParams(L, 2, coords, "coords"); readVector3iOverloadParams(L, 2, coords, "coords");
if (!self->IsValidRelCoords(coords)) if (!self->IsValidRelCoords(coords))
{ {
return cManualBindings::ApiParamError(a_LuaState, "The coords ({%d, %d, %d}) are out of range (max {%d, %d, %d}).", return L.ApiParamError("The coords ({%d, %d, %d}) are out of range (max {%d, %d, %d}).",
coords.x, coords.y, coords.z, coords.x, coords.y, coords.z,
self->GetSizeX() - 1, self->GetSizeY() - 1, self->GetSizeZ() - 1 self->GetSizeX() - 1, self->GetSizeY() - 1, self->GetSizeZ() - 1
); );
@ -401,11 +401,11 @@ static int tolua_cBlockArea_GetSize(lua_State * a_LuaState)
cBlockArea * self; cBlockArea * self;
if (!L.GetStackValues(1, self)) if (!L.GetStackValues(1, self))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Cannot read the 'self' parameter."); return L.ApiParamError("Cannot read the 'self' parameter.");
} }
if (self == nullptr) if (self == nullptr)
{ {
return cManualBindings::ApiParamError(a_LuaState, "Invalid 'self', must not be nil."); return L.ApiParamError("Invalid 'self', must not be nil.");
} }
L.Push(self->GetSizeX(), self->GetSizeY(), self->GetSizeZ()); L.Push(self->GetSizeX(), self->GetSizeY(), self->GetSizeZ());
@ -433,11 +433,11 @@ static int tolua_cBlockArea_LoadFromSchematicFile(lua_State * a_LuaState)
AString fileName; AString fileName;
if (!L.GetStackValues(1, self, fileName)) if (!L.GetStackValues(1, self, fileName))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Cannot read the parameters."); return L.ApiParamError("Cannot read the parameters.");
} }
if (self == nullptr) if (self == nullptr)
{ {
return cManualBindings::ApiParamError(a_LuaState, "Invalid 'self', must not be nil."); return L.ApiParamError("Invalid 'self', must not be nil.");
} }
L.Push(cSchematicFileSerializer::LoadFromSchematicFile(*self, fileName)); L.Push(cSchematicFileSerializer::LoadFromSchematicFile(*self, fileName));
@ -465,11 +465,11 @@ static int tolua_cBlockArea_LoadFromSchematicString(lua_State * a_LuaState)
AString data; AString data;
if (!L.GetStackValues(1, self, data)) if (!L.GetStackValues(1, self, data))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Cannot read the parameters."); return L.ApiParamError("Cannot read the parameters.");
} }
if (self == nullptr) if (self == nullptr)
{ {
return cManualBindings::ApiParamError(a_LuaState, "Invalid 'self', must not be nil."); return L.ApiParamError("Invalid 'self', must not be nil.");
} }
L.Push(cSchematicFileSerializer::LoadFromSchematicString(*self, data)); L.Push(cSchematicFileSerializer::LoadFromSchematicString(*self, data));
@ -498,11 +498,11 @@ static int tolua_cBlockArea_Read(lua_State * a_LuaState)
cWorld * world = nullptr; cWorld * world = nullptr;
if (!L.GetStackValues(1, self, world)) if (!L.GetStackValues(1, self, world))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Cannot read self or world."); return L.ApiParamError("Cannot read self or world.");
} }
if (world == nullptr) if (world == nullptr)
{ {
return cManualBindings::ApiParamError(a_LuaState, "Invalid world instance. The world must be not nil."); return L.ApiParamError("Invalid world instance. The world must be not nil.");
} }
// Check and get the overloaded params: // Check and get the overloaded params:
@ -512,7 +512,7 @@ static int tolua_cBlockArea_Read(lua_State * a_LuaState)
L.GetStackValues(dataTypesIdx, dataTypes); L.GetStackValues(dataTypesIdx, dataTypes);
if (!cBlockArea::IsValidDataTypeCombination(dataTypes)) if (!cBlockArea::IsValidDataTypeCombination(dataTypes))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Invalid baDataTypes combination (%d).", dataTypes); return L.ApiParamError("Invalid baDataTypes combination (%d).", dataTypes);
} }
// Check the coords, shift if needed: // Check the coords, shift if needed:
@ -574,7 +574,7 @@ static int tolua_cBlockArea_RelLine(lua_State * a_LuaState)
cBlockArea * self = nullptr; cBlockArea * self = nullptr;
if (!L.GetStackValues(1, self)) if (!L.GetStackValues(1, self))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Cannot read self."); return L.ApiParamError("Cannot read self.");
} }
// Check and get the overloaded params: // Check and get the overloaded params:
@ -588,11 +588,11 @@ static int tolua_cBlockArea_RelLine(lua_State * a_LuaState)
L.GetStackValues(idx, dataTypes, blockType, blockMeta, blockLight, blockSkyLight); L.GetStackValues(idx, dataTypes, blockType, blockMeta, blockLight, blockSkyLight);
if (!cBlockArea::IsValidDataTypeCombination(dataTypes)) if (!cBlockArea::IsValidDataTypeCombination(dataTypes))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Invalid baDataTypes combination (%d).", dataTypes); return L.ApiParamError("Invalid baDataTypes combination (%d).", dataTypes);
} }
if ((self->GetDataTypes() & dataTypes) != dataTypes) if ((self->GetDataTypes() & dataTypes) != dataTypes)
{ {
return cManualBindings::ApiParamError(a_LuaState, "Requested datatypes not present in the cBlockArea. Got only 0x%02x, requested 0x%02x", return L.ApiParamError("Requested datatypes not present in the cBlockArea. Got only 0x%02x, requested 0x%02x",
self->GetDataTypes(), dataTypes self->GetDataTypes(), dataTypes
); );
} }
@ -623,11 +623,11 @@ static int tolua_cBlockArea_SaveToSchematicFile(lua_State * a_LuaState)
AString fileName; AString fileName;
if (!L.GetStackValues(1, self, fileName)) if (!L.GetStackValues(1, self, fileName))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Cannot read the parameters."); return L.ApiParamError("Cannot read the parameters.");
} }
if (self == nullptr) if (self == nullptr)
{ {
return cManualBindings::ApiParamError(a_LuaState, "Invalid 'self', must not be nil."); return L.ApiParamError("Invalid 'self', must not be nil.");
} }
L.Push(cSchematicFileSerializer::SaveToSchematicFile(*self, fileName)); L.Push(cSchematicFileSerializer::SaveToSchematicFile(*self, fileName));
@ -653,11 +653,11 @@ static int tolua_cBlockArea_SaveToSchematicString(lua_State * a_LuaState)
cBlockArea * self; cBlockArea * self;
if (!L.GetStackValues(1, self)) if (!L.GetStackValues(1, self))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Cannot read the 'self' parameter."); return L.ApiParamError("Cannot read the 'self' parameter.");
} }
if (self == nullptr) if (self == nullptr)
{ {
return cManualBindings::ApiParamError(a_LuaState, "Invalid 'self', must not be nil."); return L.ApiParamError("Invalid 'self', must not be nil.");
} }
AString data; AString data;
@ -691,11 +691,11 @@ static int tolua_cBlockArea_Write(lua_State * a_LuaState)
cWorld * world = nullptr; cWorld * world = nullptr;
if (!L.GetStackValues(1, self, world)) if (!L.GetStackValues(1, self, world))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Cannot read self or world."); return L.ApiParamError("Cannot read self or world.");
} }
if (world == nullptr) if (world == nullptr)
{ {
return cManualBindings::ApiParamError(a_LuaState, "Invalid world instance. The world must be not nil."); return L.ApiParamError("Invalid world instance. The world must be not nil.");
} }
// Check and get the overloaded params: // Check and get the overloaded params:
@ -707,11 +707,11 @@ static int tolua_cBlockArea_Write(lua_State * a_LuaState)
// Check the dataType parameter validity: // Check the dataType parameter validity:
if (!cBlockArea::IsValidDataTypeCombination(dataTypes)) if (!cBlockArea::IsValidDataTypeCombination(dataTypes))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Invalid datatype combination (%d).", dataTypes); return L.ApiParamError("Invalid datatype combination (%d).", dataTypes);
} }
if ((self->GetDataTypes() & dataTypes) != dataTypes) if ((self->GetDataTypes() & dataTypes) != dataTypes)
{ {
return cManualBindings::ApiParamError(a_LuaState, "Requesting datatypes not present in the cBlockArea. Got only 0x%02x, requested 0x%02x", return L.ApiParamError("Requesting datatypes not present in the cBlockArea. Got only 0x%02x, requested 0x%02x",
self->GetDataTypes(), dataTypes self->GetDataTypes(), dataTypes
); );
} }
@ -766,13 +766,13 @@ static int GetBlock(lua_State * a_LuaState)
cBlockArea * self; cBlockArea * self;
if (!L.GetStackValues(1, self)) if (!L.GetStackValues(1, self))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Cannot read the 'self' param."); return L.ApiParamError("Cannot read the 'self' param.");
} }
// Check the datatype's presence: // Check the datatype's presence:
if ((self->GetDataTypes() & DataTypeFlag) == 0) if ((self->GetDataTypes() & DataTypeFlag) == 0)
{ {
return cManualBindings::ApiParamError(a_LuaState, "The area doesn't contain the datatype (%d).", DataTypeFlag); return L.ApiParamError("The area doesn't contain the datatype (%d).", DataTypeFlag);
} }
// Read the overloaded params: // Read the overloaded params:
@ -780,7 +780,7 @@ static int GetBlock(lua_State * a_LuaState)
readVector3iOverloadParams(L, 2, coords, "coords"); readVector3iOverloadParams(L, 2, coords, "coords");
if (!self->IsValidCoords(coords)) if (!self->IsValidCoords(coords))
{ {
return cManualBindings::ApiParamError(a_LuaState, "The coords ({%d, %d, %d}) are out of range ({%d, %d, %d} - {%d, %d, %d}).", return L.ApiParamError("The coords ({%d, %d, %d}) are out of range ({%d, %d, %d} - {%d, %d, %d}).",
coords.x, coords.y, coords.z, coords.x, coords.y, coords.z,
self->GetOriginX(), self->GetOriginY(), self->GetOriginZ(), self->GetOriginX(), self->GetOriginY(), self->GetOriginZ(),
self->GetOriginX() + self->GetSizeX() - 1, self->GetOriginY() + self->GetSizeY() - 1, self->GetOriginZ() + self->GetSizeZ() - 1 self->GetOriginX() + self->GetSizeX() - 1, self->GetOriginY() + self->GetSizeY() - 1, self->GetOriginZ() + self->GetSizeZ() - 1
@ -819,13 +819,13 @@ static int GetRelBlock(lua_State * a_LuaState)
cBlockArea * self; cBlockArea * self;
if (!L.GetStackValues(1, self)) if (!L.GetStackValues(1, self))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Cannot read the 'self' param."); return L.ApiParamError("Cannot read the 'self' param.");
} }
// Check the datatype's presence: // Check the datatype's presence:
if ((self->GetDataTypes() & DataTypeFlag) == 0) if ((self->GetDataTypes() & DataTypeFlag) == 0)
{ {
return cManualBindings::ApiParamError(a_LuaState, "The area doesn't contain the datatype (%d).", DataTypeFlag); return L.ApiParamError("The area doesn't contain the datatype (%d).", DataTypeFlag);
} }
// Read the overloaded params: // Read the overloaded params:
@ -833,7 +833,7 @@ static int GetRelBlock(lua_State * a_LuaState)
readVector3iOverloadParams(L, 2, coords, "coords"); readVector3iOverloadParams(L, 2, coords, "coords");
if (!self->IsValidRelCoords(coords)) if (!self->IsValidRelCoords(coords))
{ {
return cManualBindings::ApiParamError(a_LuaState, "The coords ({%d, %d, %d}) are out of range ({%d, %d, %d}).", return L.ApiParamError("The coords ({%d, %d, %d}) are out of range ({%d, %d, %d}).",
coords.x, coords.y, coords.z, coords.x, coords.y, coords.z,
self->GetSizeX(), self->GetSizeY(), self->GetSizeZ() self->GetSizeX(), self->GetSizeY(), self->GetSizeZ()
); );
@ -871,13 +871,13 @@ static int SetBlock(lua_State * a_LuaState)
cBlockArea * self; cBlockArea * self;
if (!L.GetStackValues(1, self)) if (!L.GetStackValues(1, self))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Cannot read the 'self' param."); return L.ApiParamError("Cannot read the 'self' param.");
} }
// Check the datatype's presence: // Check the datatype's presence:
if ((self->GetDataTypes() & DataTypeFlag) == 0) if ((self->GetDataTypes() & DataTypeFlag) == 0)
{ {
return cManualBindings::ApiParamError(a_LuaState, "The area doesn't contain the datatype (%d).", DataTypeFlag); return L.ApiParamError("The area doesn't contain the datatype (%d).", DataTypeFlag);
} }
// Read the overloaded params: // Read the overloaded params:
@ -885,7 +885,7 @@ static int SetBlock(lua_State * a_LuaState)
auto idx = readVector3iOverloadParams(L, 2, coords, "coords"); auto idx = readVector3iOverloadParams(L, 2, coords, "coords");
if (!self->IsValidCoords(coords)) if (!self->IsValidCoords(coords))
{ {
return cManualBindings::ApiParamError(a_LuaState, "The coords ({%d, %d, %d}) are out of range ({%d, %d, %d} - {%d, %d, %d}).", return L.ApiParamError("The coords ({%d, %d, %d}) are out of range ({%d, %d, %d} - {%d, %d, %d}).",
coords.x, coords.y, coords.z, coords.x, coords.y, coords.z,
self->GetOriginX(), self->GetOriginY(), self->GetOriginZ(), self->GetOriginX(), self->GetOriginY(), self->GetOriginZ(),
self->GetOriginX() + self->GetSizeX() - 1, self->GetOriginY() + self->GetSizeY() - 1, self->GetOriginZ() + self->GetSizeZ() - 1 self->GetOriginX() + self->GetSizeX() - 1, self->GetOriginY() + self->GetSizeY() - 1, self->GetOriginZ() + self->GetSizeZ() - 1
@ -926,13 +926,13 @@ static int SetRelBlock(lua_State * a_LuaState)
cBlockArea * self; cBlockArea * self;
if (!L.GetStackValues(1, self)) if (!L.GetStackValues(1, self))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Cannot read the 'self' param."); return L.ApiParamError("Cannot read the 'self' param.");
} }
// Check the datatype's presence: // Check the datatype's presence:
if ((self->GetDataTypes() & DataTypeFlag) == 0) if ((self->GetDataTypes() & DataTypeFlag) == 0)
{ {
return cManualBindings::ApiParamError(a_LuaState, "The area doesn't contain the datatype (%d).", DataTypeFlag); return L.ApiParamError("The area doesn't contain the datatype (%d).", DataTypeFlag);
} }
// Read the overloaded params: // Read the overloaded params:
@ -940,7 +940,7 @@ static int SetRelBlock(lua_State * a_LuaState)
auto idx = readVector3iOverloadParams(L, 2, coords, "coords"); auto idx = readVector3iOverloadParams(L, 2, coords, "coords");
if (!self->IsValidRelCoords(coords)) if (!self->IsValidRelCoords(coords))
{ {
return cManualBindings::ApiParamError(a_LuaState, "The coords ({%d, %d, %d}) are out of range ({%d, %d, %d}).", return L.ApiParamError("The coords ({%d, %d, %d}) are out of range ({%d, %d, %d}).",
coords.x, coords.y, coords.z, coords.x, coords.y, coords.z,
self->GetSizeX(), self->GetSizeY(), self->GetSizeZ() self->GetSizeX(), self->GetSizeY(), self->GetSizeZ()
); );
@ -970,13 +970,13 @@ static int tolua_cBlockArea_SetBlockTypeMeta(lua_State * a_LuaState)
cBlockArea * self; cBlockArea * self;
if (!L.GetStackValues(1, self)) if (!L.GetStackValues(1, self))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Cannot read the 'self' param."); return L.ApiParamError("Cannot read the 'self' param.");
} }
// Check if block types and metas are present: // Check if block types and metas are present:
if (!self->HasBlockTypes() || !self->HasBlockMetas()) if (!self->HasBlockTypes() || !self->HasBlockMetas())
{ {
return cManualBindings::ApiParamError(a_LuaState, "The area doesn't contain the datatypes baTypes and baMetas."); return L.ApiParamError("The area doesn't contain the datatypes baTypes and baMetas.");
} }
// Read the overloaded params: // Read the overloaded params:
@ -984,7 +984,7 @@ static int tolua_cBlockArea_SetBlockTypeMeta(lua_State * a_LuaState)
auto idx = readVector3iOverloadParams(L, 2, coords, "coords"); auto idx = readVector3iOverloadParams(L, 2, coords, "coords");
if (!self->IsValidCoords(coords)) if (!self->IsValidCoords(coords))
{ {
return cManualBindings::ApiParamError(a_LuaState, "The coords ({%d, %d, %d}) are out of range ({%d, %d, %d} - {%d, %d, %d}).", return L.ApiParamError("The coords ({%d, %d, %d}) are out of range ({%d, %d, %d} - {%d, %d, %d}).",
coords.x, coords.y, coords.z, coords.x, coords.y, coords.z,
self->GetOriginX(), self->GetOriginY(), self->GetOriginZ(), self->GetOriginX(), self->GetOriginY(), self->GetOriginZ(),
self->GetOriginX() + self->GetSizeX() - 1, self->GetOriginY() + self->GetSizeY() - 1, self->GetOriginZ() + self->GetSizeZ() - 1 self->GetOriginX() + self->GetSizeX() - 1, self->GetOriginY() + self->GetSizeY() - 1, self->GetOriginZ() + self->GetSizeZ() - 1
@ -995,7 +995,7 @@ static int tolua_cBlockArea_SetBlockTypeMeta(lua_State * a_LuaState)
NIBBLETYPE meta; NIBBLETYPE meta;
if (!L.GetStackValues(idx, block, meta)) if (!L.GetStackValues(idx, block, meta))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Bad number for block type or meta type."); return L.ApiParamError("Bad number for block type or meta type.");
} }
// Set block type and meta: // Set block type and meta:
@ -1020,13 +1020,13 @@ static int tolua_cBlockArea_SetRelBlockTypeMeta(lua_State * a_LuaState)
cBlockArea * self; cBlockArea * self;
if (!L.GetStackValues(1, self)) if (!L.GetStackValues(1, self))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Cannot read the 'self' param."); return L.ApiParamError("Cannot read the 'self' param.");
} }
// Check if block types and metas are present: // Check if block types and metas are present:
if (!self->HasBlockTypes() || !self->HasBlockMetas()) if (!self->HasBlockTypes() || !self->HasBlockMetas())
{ {
return cManualBindings::ApiParamError(a_LuaState, "The area doesn't contain the datatypes baTypes and baMetas."); return L.ApiParamError("The area doesn't contain the baTypes or baMetas datatypes (0x%02x).", self->GetDataTypes());
} }
// Read the overloaded params: // Read the overloaded params:
@ -1034,7 +1034,7 @@ static int tolua_cBlockArea_SetRelBlockTypeMeta(lua_State * a_LuaState)
auto idx = readVector3iOverloadParams(L, 2, coords, "coords"); auto idx = readVector3iOverloadParams(L, 2, coords, "coords");
if (!self->IsValidRelCoords(coords)) if (!self->IsValidRelCoords(coords))
{ {
return cManualBindings::ApiParamError(a_LuaState, "The coords ({%d, %d, %d}) are out of range ({%d, %d, %d}).", return L.ApiParamError("The coords ({%d, %d, %d}) are out of range ({%d, %d, %d}).",
coords.x, coords.y, coords.z, coords.x, coords.y, coords.z,
self->GetSizeX(), self->GetSizeY(), self->GetSizeZ() self->GetSizeX(), self->GetSizeY(), self->GetSizeZ()
); );
@ -1044,7 +1044,7 @@ static int tolua_cBlockArea_SetRelBlockTypeMeta(lua_State * a_LuaState)
NIBBLETYPE meta; NIBBLETYPE meta;
if (!L.GetStackValues(idx, block, meta)) if (!L.GetStackValues(idx, block, meta))
{ {
return cManualBindings::ApiParamError(a_LuaState, "Bad number for block type or meta type."); return L.ApiParamError("Bad number for block type or meta type.");
} }
// Set block type and meta: // Set block type and meta: