From e3136c2d0f16557370e25a077891df5cca2e020f Mon Sep 17 00:00:00 2001 From: "madmaxoft@gmail.com" Date: Sat, 25 May 2013 11:57:28 +0000 Subject: Fixed the cWorld:DoWithChestAt(), DoWithDispenserAt() and DoWithFurnaceAt() callbacks binding. They are now doing what the comment said they are doing. git-svn-id: http://mc-server.googlecode.com/svn/trunk@1506 0a769ca7-a7f5-676a-18bf-c427514a06d6 --- source/Chunk.h | 4 ++-- source/ChunkMap.h | 4 ++-- source/ManualBindings.cpp | 26 +++++++++++++++++++++----- source/World.h | 4 ++-- 4 files changed, 27 insertions(+), 11 deletions(-) (limited to 'source') diff --git a/source/Chunk.h b/source/Chunk.h index 09536f099..67a834b26 100644 --- a/source/Chunk.h +++ b/source/Chunk.h @@ -197,10 +197,10 @@ public: /// Calls the callback for the chest at the specified coords; returns false if there's no chest at those coords, true if found bool DoWithChestAt(int a_BlockX, int a_BlockY, int a_BlockZ, cChestCallback & a_Callback); // Lua-acessible - /// Calls the callback for the dispenser at the specified coords; returns false if there's no dispenser at those coords, true if found + /// Calls the callback for the dispenser at the specified coords; returns false if there's no dispenser at those coords or callback returns true, returns true if found bool DoWithDispenserAt(int a_BlockX, int a_BlockY, int a_BlockZ, cDispenserCallback & a_Callback); - /// Calls the callback for the furnace at the specified coords; returns false if there's no furnace at those coords, true if found + /// Calls the callback for the furnace at the specified coords; returns false if there's no furnace at those coords or callback returns true, returns true if found bool DoWithFurnaceAt(int a_BlockX, int a_BlockY, int a_BlockZ, cFurnaceCallback & a_Callback); // Lua-accessible /// Retrieves the test on the sign at the specified coords; returns false if there's no sign at those coords, true if found diff --git a/source/ChunkMap.h b/source/ChunkMap.h index a2fb5abff..0dc18636b 100644 --- a/source/ChunkMap.h +++ b/source/ChunkMap.h @@ -216,10 +216,10 @@ public: /// Calls the callback for the chest at the specified coords; returns false if there's no chest at those coords, true if found bool DoWithChestAt (int a_BlockX, int a_BlockY, int a_BlockZ, cChestCallback & a_Callback); // Lua-acessible - /// Calls the callback for the dispenser at the specified coords; returns false if there's no dispenser at those coords, true if found + /// Calls the callback for the dispenser at the specified coords; returns false if there's no dispenser at those coords or callback returns true, returns true if found bool DoWithDispenserAt(int a_BlockX, int a_BlockY, int a_BlockZ, cDispenserCallback & a_Callback); - /// Calls the callback for the furnace at the specified coords; returns false if there's no furnace at those coords, true if found + /// Calls the callback for the furnace at the specified coords; returns false if there's no furnace at those coords or callback returns true, returns true if found bool DoWithFurnaceAt(int a_BlockX, int a_BlockY, int a_BlockZ, cFurnaceCallback & a_Callback); // Lua-accessible /// Retrieves the test on the sign at the specified coords; returns false if there's no sign at those coords, true if found diff --git a/source/ManualBindings.cpp b/source/ManualBindings.cpp index 659edf23f..db1d65f53 100644 --- a/source/ManualBindings.cpp +++ b/source/ManualBindings.cpp @@ -14,6 +14,7 @@ #include "StringMap.h" #include "ClientHandle.h" #include "ChestEntity.h" +#include "DispenserEntity.h" #include "FurnaceEntity.h" #include "md5/md5.h" @@ -211,8 +212,15 @@ static int tolua_DoWith(lua_State* tolua_S) } int s = lua_pcall(LuaState, (TableRef == LUA_REFNIL ? 1 : 2), 1, 0); - report_errors(LuaState, s); - return true; + if (report_errors(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; @@ -299,8 +307,15 @@ static int tolua_DoWithXYZ(lua_State* tolua_S) } int s = lua_pcall(LuaState, (TableRef == LUA_REFNIL ? 1 : 2), 1, 0); - report_errors(LuaState, s); - return true; + if (report_errors(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; @@ -392,7 +407,7 @@ static int tolua_ForEachInChunk(lua_State* tolua_S) if (lua_isboolean(LuaState, -1)) { - return (tolua_toboolean( LuaState, -1, 0) > 0); + return (tolua_toboolean(LuaState, -1, 0) > 0); } return false; /* Continue enumeration */ } @@ -1160,6 +1175,7 @@ void ManualBindings::Bind( lua_State* tolua_S ) tolua_function(tolua_S, "DoWithPlayer", tolua_DoWith); tolua_function(tolua_S, "FindAndDoWithPlayer", tolua_DoWith); tolua_function(tolua_S, "DoWithChestAt", tolua_DoWithXYZ); + tolua_function(tolua_S, "DoWithDispenserAt", tolua_DoWithXYZ); tolua_endmodule(tolua_S); tolua_beginmodule(tolua_S, "cPlugin"); diff --git a/source/World.h b/source/World.h index 4f55be48a..a79da3923 100644 --- a/source/World.h +++ b/source/World.h @@ -348,10 +348,10 @@ public: /// Calls the callback for the chest at the specified coords; returns false if there's no chest at those coords, true if found bool DoWithChestAt (int a_BlockX, int a_BlockY, int a_BlockZ, cChestCallback & a_Callback); // Exported in ManualBindings.cpp - /// Calls the callback for the dispenser at the specified coords; returns false if there's no dispenser at those coords, true if found + /// Calls the callback for the dispenser at the specified coords; returns false if there's no dispenser at those coords or callback returns true, returns true if found bool DoWithDispenserAt(int a_BlockX, int a_BlockY, int a_BlockZ, cDispenserCallback & a_Callback); - /// Calls the callback for the furnace at the specified coords; returns false if there's no furnace at those coords, true if found + /// Calls the callback for the furnace at the specified coords; returns false if there's no furnace at those coords or callback returns true, returns true if found bool DoWithFurnaceAt(int a_BlockX, int a_BlockY, int a_BlockZ, cFurnaceCallback & a_Callback); // Exported in ManualBindings.cpp /// Retrieves the test on the sign at the specified coords; returns false if there's no sign at those coords, true if found -- cgit v1.2.3