From 748b121703fa28b10933f4432c09391e66179118 Mon Sep 17 00:00:00 2001 From: Tiger Wang Date: Sun, 28 Mar 2021 14:40:57 +0100 Subject: Unify DoWithBlockEntity (#5168) + DoWith calls now broadcast the block entity and mark the chunk dirty + Add block entity change queue to synchronise BE updates with block updates * Fixed a few incorrect assertions about BE type - Remove manual overloads --- src/Bindings/ManualBindings.h | 222 ------------------------------------------ 1 file changed, 222 deletions(-) (limited to 'src/Bindings/ManualBindings.h') diff --git a/src/Bindings/ManualBindings.h b/src/Bindings/ManualBindings.h index a23c5d2e4..780c6ce41 100644 --- a/src/Bindings/ManualBindings.h +++ b/src/Bindings/ManualBindings.h @@ -211,228 +211,6 @@ public: - /** Template for the bindings for the DoWithXYZAt(X, Y, Z) functions that don't need to check their coords. */ - template < - class SELF, - class ITEM, - bool (SELF::*DoWithFn)(int, int, int, cFunctionRef) - > - static int DoWithXYZ(lua_State * tolua_S) - { - // Check params: - cLuaState L(tolua_S); - if ( - !L.CheckParamNumber(2, 4) || - !L.CheckParamFunction(5) || - !L.CheckParamEnd(6) - ) - { - return 0; - } - - // Get parameters: - SELF * Self = nullptr; - int BlockX = 0; - int BlockY = 0; - int BlockZ = 0; - cLuaState::cRef FnRef; - L.GetStackValues(1, Self, BlockX, BlockY, BlockZ, FnRef); - if (Self == nullptr) - { - return lua_do_error(tolua_S, "Error in function call '#funcname#': Invalid 'self'"); - } - if (!FnRef.IsValid()) - { - return lua_do_error(tolua_S, "Error in function call '#funcname#': Expected a valid callback function for parameter #5"); - } - - // Call the DoWith function: - bool res = (Self->*DoWithFn)(BlockX, BlockY, BlockZ, [&](ITEM & a_Item) - { - bool ret = false; - L.Call(FnRef, &a_Item, cLuaState::Return, ret); - return ret; - } - ); - - // Push the result as the return value: - L.Push(res); - return 1; - } - - - - - - /** Template for the bindings for the DoWithXYZAt(X, Y, Z) functions that need to check their coords. */ - template < - class SELF, - class ITEM, - bool (SELF::*DoWithFn)(int, int, int, cFunctionRef), - bool (SELF::*CoordCheckFn)(int, int, int) const - > - static int DoWithXYZ(lua_State * tolua_S) - { - // Check params: - cLuaState L(tolua_S); - if ( - !L.CheckParamNumber(2, 4) || - !L.CheckParamFunction(5) || - !L.CheckParamEnd(6) - ) - { - return 0; - } - - // Get parameters: - SELF * Self = nullptr; - int BlockX = 0; - int BlockY = 0; - int BlockZ = 0; - cLuaState::cRef FnRef; - L.GetStackValues(1, Self, BlockX, BlockY, BlockZ, FnRef); - if (Self == nullptr) - { - return L.ApiParamError("Invalid 'self'"); - } - if (!FnRef.IsValid()) - { - return L.ApiParamError("Expected a valid callback function for parameter #5"); - } - if (!(Self->*CoordCheckFn)(BlockX, BlockY, BlockZ)) - { - return L.FApiParamError("The provided coordinates ({0}) are not valid", - Vector3i{BlockX, BlockY, BlockZ} - ); - } - - // Call the DoWith function: - bool res = (Self->*DoWithFn)(BlockX, BlockY, BlockZ, [&](ITEM & a_Item) - { - bool ret = false; - L.Call(FnRef, &a_Item, cLuaState::Return, ret); - return ret; - } - ); - - // Push the result as the return value: - L.Push(res); - return 1; - } - - - - - - template < - class Ty1, - class Ty2, - bool (Ty1::*ForEachFn)(int, int, cFunctionRef) - > - static int ForEachInChunk(lua_State * tolua_S) - { - // Check params: - cLuaState L(tolua_S); - if ( - !L.CheckParamNumber(2, 3) || - !L.CheckParamFunction(4) || - !L.CheckParamEnd(5) - ) - { - return 0; - } - - // Get parameters: - Ty1 * Self = nullptr; - int ChunkX = 0; - int ChunkZ = 0; - cLuaState::cRef FnRef; - L.GetStackValues(1, Self, ChunkX, ChunkZ, FnRef); - if (Self == nullptr) - { - return lua_do_error(tolua_S, "Error in function call '#funcname#': Invalid 'self'"); - } - if (!FnRef.IsValid()) - { - return lua_do_error(tolua_S, "Error in function call '#funcname#': Expected a valid callback function for parameter #4"); - } - - // Call the DoWith function: - bool res = (Self->*ForEachFn)(ChunkX, ChunkZ, [&](Ty2 & a_Item) - { - bool ret = false; - L.Call(FnRef, &a_Item, cLuaState::Return, ret); - return ret; - } - ); - - // Push the result as the return value: - L.Push(res); - return 1; - } - - - - - - template < - class Ty1, - class Ty2, - bool (Ty1::*ForEachFn)(const cBoundingBox &, cFunctionRef) - > - static int ForEachInBox(lua_State * tolua_S) - { - // Check params: - cLuaState L(tolua_S); - if ( - !L.CheckParamUserType(1, "cWorld") || - !L.CheckParamUserType(2, "cBoundingBox") || - !L.CheckParamFunction(3) || - !L.CheckParamEnd(4) - ) - { - return 0; - } - - // Get the params: - Ty1 * Self = nullptr; - cBoundingBox * Box = nullptr; - cLuaState::cRef FnRef; - L.GetStackValues(1, Self, Box, FnRef); - if ((Self == nullptr) || (Box == nullptr)) - { - LOGWARNING("Invalid world (%p) or boundingbox (%p)", static_cast(Self), static_cast(Box)); - L.LogStackTrace(); - return 0; - } - if (!FnRef.IsValid()) - { - return lua_do_error(tolua_S, "Error in function call '#funcname#': Expected a valid callback function for parameter #2"); - } - - bool res = (Self->*ForEachFn)(*Box, [&](Ty2 & a_Item) - { - bool ret = false; - if (!L.Call(FnRef, &a_Item, cLuaState::Return, ret)) - { - LOGWARNING("Failed to call Lua callback"); - L.LogStackTrace(); - return true; // Abort enumeration - } - - return ret; - } - ); - - // Push the result as the return value: - L.Push(res); - return 1; - } - - - - - template < class Ty1, class Ty2, -- cgit v1.2.3