aboutsummaryrefslogtreecommitdiff
path: root/src/scriptapi.cpp
diff options
context:
space:
mode:
authorPerttu Ahola <celeron55@gmail.com>2011-12-03 18:18:59 +0200
committerPerttu Ahola <celeron55@gmail.com>2011-12-03 18:18:59 +0200
commit7d37913ea4f83807c508cec81b39744d69f481f8 (patch)
treeeaf6e035f40e8a82a5aabe06fdb73bcfce895224 /src/scriptapi.cpp
parentac56053c74387caad518a2233accad14d7d855ef (diff)
downloadminetest-7d37913ea4f83807c508cec81b39744d69f481f8.tar.gz
minetest-7d37913ea4f83807c508cec81b39744d69f481f8.tar.bz2
minetest-7d37913ea4f83807c508cec81b39744d69f481f8.zip
Add ABM required neighbor check
Diffstat (limited to 'src/scriptapi.cpp')
-rw-r--r--src/scriptapi.cpp32
1 files changed, 30 insertions, 2 deletions
diff --git a/src/scriptapi.cpp b/src/scriptapi.cpp
index c9f132f4a..3fe69e709 100644
--- a/src/scriptapi.cpp
+++ b/src/scriptapi.cpp
@@ -709,15 +709,18 @@ private:
int m_id;
std::set<std::string> m_trigger_contents;
+ std::set<std::string> m_required_neighbors;
float m_trigger_interval;
u32 m_trigger_chance;
public:
LuaABM(lua_State *L, int id,
const std::set<std::string> &trigger_contents,
+ const std::set<std::string> &required_neighbors,
float trigger_interval, u32 trigger_chance):
m_lua(L),
m_id(id),
m_trigger_contents(trigger_contents),
+ m_required_neighbors(required_neighbors),
m_trigger_interval(trigger_interval),
m_trigger_chance(trigger_chance)
{
@@ -726,6 +729,10 @@ public:
{
return m_trigger_contents;
}
+ virtual std::set<std::string> getRequiredNeighbors()
+ {
+ return m_required_neighbors;
+ }
virtual float getTriggerInterval()
{
return m_trigger_interval;
@@ -2575,7 +2582,9 @@ void scriptapi_add_environment(lua_State *L, ServerEnvironment *env)
lua_pushlightuserdata(L, env);
lua_setfield(L, LUA_REGISTRYINDEX, "minetest_env");
- /* Add ActiveBlockModifiers to environment */
+ /*
+ Add ActiveBlockModifiers to environment
+ */
// Get minetest.registered_abms
lua_getglobal(L, "minetest");
@@ -2603,6 +2612,25 @@ void scriptapi_add_environment(lua_State *L, ServerEnvironment *env)
// removes value, keeps key for next iteration
lua_pop(L, 1);
}
+ } else if(lua_isstring(L, -1)){
+ trigger_contents.insert(lua_tostring(L, -1));
+ }
+ lua_pop(L, 1);
+
+ std::set<std::string> required_neighbors;
+ lua_getfield(L, current_abm, "neighbors");
+ if(lua_istable(L, -1)){
+ int table = lua_gettop(L);
+ lua_pushnil(L);
+ while(lua_next(L, table) != 0){
+ // key at index -2 and value at index -1
+ luaL_checktype(L, -1, LUA_TSTRING);
+ required_neighbors.insert(lua_tostring(L, -1));
+ // removes value, keeps key for next iteration
+ lua_pop(L, 1);
+ }
+ } else if(lua_isstring(L, -1)){
+ required_neighbors.insert(lua_tostring(L, -1));
}
lua_pop(L, 1);
@@ -2613,7 +2641,7 @@ void scriptapi_add_environment(lua_State *L, ServerEnvironment *env)
getintfield(L, current_abm, "chance", trigger_chance);
LuaABM *abm = new LuaABM(L, id, trigger_contents,
- trigger_interval, trigger_chance);
+ required_neighbors, trigger_interval, trigger_chance);
env->addActiveBlockModifier(abm);