summaryrefslogtreecommitdiff
path: root/src/script
diff options
context:
space:
mode:
Diffstat (limited to 'src/script')
-rw-r--r--src/script/common/c_content.cpp1
-rw-r--r--src/script/common/c_content.h22
-rw-r--r--src/script/cpp_api/s_entity.h4
-rw-r--r--src/script/cpp_api/s_inventory.h2
-rw-r--r--src/script/cpp_api/s_item.h6
-rw-r--r--src/script/cpp_api/s_node.h2
-rw-r--r--src/script/cpp_api/s_nodemeta.h2
-rw-r--r--src/script/lua_api/l_env.cpp18
-rw-r--r--src/script/lua_api/l_inventory.cpp15
-rw-r--r--src/script/lua_api/l_object.cpp1
-rw-r--r--src/script/lua_api/luaapi.cpp172
-rw-r--r--src/script/lua_api/luaapi.h11
12 files changed, 204 insertions, 52 deletions
diff --git a/src/script/common/c_content.cpp b/src/script/common/c_content.cpp
index c7966a0be..64c76ef7c 100644
--- a/src/script/common/c_content.cpp
+++ b/src/script/common/c_content.cpp
@@ -389,6 +389,7 @@ ContentFeatures read_content_features(lua_State *L, int index)
f.liquid_viscosity = getintfield_default(L, index,
"liquid_viscosity", f.liquid_viscosity);
getboolfield(L, index, "liquid_renewable", f.liquid_renewable);
+ getboolfield(L, index, "drowning", f.drowning);
// Amount of light the node emits
f.light_source = getintfield_default(L, index,
"light_source", f.light_source);
diff --git a/src/script/common/c_content.h b/src/script/common/c_content.h
index 251a72e27..58be7118c 100644
--- a/src/script/common/c_content.h
+++ b/src/script/common/c_content.h
@@ -39,19 +39,19 @@ extern "C" {
#include "irrlichttypes_bloated.h"
#include "util/string.h"
-class MapNode;
+struct MapNode;
class INodeDefManager;
-class PointedThing;
-class ItemStack;
-class ItemDefinition;
-class ToolCapabilities;
-class ObjectProperties;
-class SimpleSoundSpec;
-class ServerSoundParams;
+struct PointedThing;
+struct ItemStack;
+struct ItemDefinition;
+struct ToolCapabilities;
+struct ObjectProperties;
+struct SimpleSoundSpec;
+struct ServerSoundParams;
class Inventory;
-class NodeBox;
-class ContentFeatures;
-class TileDef;
+struct NodeBox;
+struct ContentFeatures;
+struct TileDef;
class Server;
struct DigParams;
struct HitParams;
diff --git a/src/script/cpp_api/s_entity.h b/src/script/cpp_api/s_entity.h
index b95b6b4b4..8df9d7f00 100644
--- a/src/script/cpp_api/s_entity.h
+++ b/src/script/cpp_api/s_entity.h
@@ -23,8 +23,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "cpp_api/s_base.h"
#include "irr_v3d.h"
-class ObjectProperties;
-class ToolCapabilities;
+struct ObjectProperties;
+struct ToolCapabilities;
class ScriptApiEntity
: virtual public ScriptApiBase
diff --git a/src/script/cpp_api/s_inventory.h b/src/script/cpp_api/s_inventory.h
index bf3b5de85..d1a81de80 100644
--- a/src/script/cpp_api/s_inventory.h
+++ b/src/script/cpp_api/s_inventory.h
@@ -22,7 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "cpp_api/s_base.h"
-class ItemStack;
+struct ItemStack;
class ScriptApiDetached
: virtual public ScriptApiBase
diff --git a/src/script/cpp_api/s_item.h b/src/script/cpp_api/s_item.h
index 28ac444f6..0f2b16042 100644
--- a/src/script/cpp_api/s_item.h
+++ b/src/script/cpp_api/s_item.h
@@ -23,10 +23,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "cpp_api/s_base.h"
#include "irr_v3d.h"
-class PointedThing;
-class ItemStack;
+struct PointedThing;
+struct ItemStack;
class ServerActiveObject;
-class ItemDefinition;
+struct ItemDefinition;
class LuaItemStack;
class ModApiItemMod;
diff --git a/src/script/cpp_api/s_node.h b/src/script/cpp_api/s_node.h
index bff6072b9..a8c9b3a79 100644
--- a/src/script/cpp_api/s_node.h
+++ b/src/script/cpp_api/s_node.h
@@ -26,7 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "cpp_api/s_base.h"
#include "cpp_api/s_nodemeta.h"
-class MapNode;
+struct MapNode;
class ServerActiveObject;
class ScriptApiNode
diff --git a/src/script/cpp_api/s_nodemeta.h b/src/script/cpp_api/s_nodemeta.h
index 9be126c62..c2ebeba6d 100644
--- a/src/script/cpp_api/s_nodemeta.h
+++ b/src/script/cpp_api/s_nodemeta.h
@@ -24,7 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "cpp_api/s_item.h"
#include "irr_v3d.h"
-class ItemStack;
+struct ItemStack;
class ScriptApiNodemeta
: virtual public ScriptApiBase,
diff --git a/src/script/lua_api/l_env.cpp b/src/script/lua_api/l_env.cpp
index 58cf337ed..a287281a9 100644
--- a/src/script/lua_api/l_env.cpp
+++ b/src/script/lua_api/l_env.cpp
@@ -550,7 +550,7 @@ int ModApiEnvMod::l_line_of_sight(lua_State *L) {
GET_ENV_PTR;
// read position 1 from lua
- v3f pos1 = checkFloatPos(L, 2);
+ v3f pos1 = checkFloatPos(L, 1);
// read position 2 from lua
v3f pos2 = checkFloatPos(L, 2);
//read step size from lua
@@ -566,14 +566,14 @@ int ModApiEnvMod::l_find_path(lua_State *L)
{
GET_ENV_PTR;
- v3s16 pos1 = read_v3s16(L, 2);
- v3s16 pos2 = read_v3s16(L, 3);
- unsigned int searchdistance = luaL_checkint(L, 4);
- unsigned int max_jump = luaL_checkint(L, 5);
- unsigned int max_drop = luaL_checkint(L, 6);
+ v3s16 pos1 = read_v3s16(L, 1);
+ v3s16 pos2 = read_v3s16(L, 2);
+ unsigned int searchdistance = luaL_checkint(L, 3);
+ unsigned int max_jump = luaL_checkint(L, 4);
+ unsigned int max_drop = luaL_checkint(L, 5);
algorithm algo = A_PLAIN_NP;
- if(! lua_isnil(L, 7)) {
- std::string algorithm = luaL_checkstring(L,7);
+ if(! lua_isnil(L, 6)) {
+ std::string algorithm = luaL_checkstring(L,6);
if (algorithm == "A*")
algo = A_PLAIN;
@@ -680,6 +680,8 @@ bool ModApiEnvMod::Initialize(lua_State *L,int top)
retval &= API_FCT(get_perlin_map);
retval &= API_FCT(clear_objects);
retval &= API_FCT(spawn_tree);
+ retval &= API_FCT(find_path);
+ retval &= API_FCT(line_of_sight);
return retval;
}
diff --git a/src/script/lua_api/l_inventory.cpp b/src/script/lua_api/l_inventory.cpp
index 1404c3c8a..f57a4e8cd 100644
--- a/src/script/lua_api/l_inventory.cpp
+++ b/src/script/lua_api/l_inventory.cpp
@@ -121,6 +121,9 @@ int InvRef::l_set_size(lua_State *L)
const char *listname = luaL_checkstring(L, 2);
int newsize = luaL_checknumber(L, 3);
Inventory *inv = getinv(L, ref);
+ if(inv == NULL){
+ return 0;
+ }
if(newsize == 0){
inv->deleteList(listname);
reportInventoryChange(L, ref);
@@ -144,6 +147,9 @@ int InvRef::l_set_width(lua_State *L)
const char *listname = luaL_checkstring(L, 2);
int newwidth = luaL_checknumber(L, 3);
Inventory *inv = getinv(L, ref);
+ if(inv == NULL){
+ return 0;
+ }
InventoryList *list = inv->getList(listname);
if(list){
list->setWidth(newwidth);
@@ -195,7 +201,11 @@ int InvRef::l_get_list(lua_State *L)
InvRef *ref = checkobject(L, 1);
const char *listname = luaL_checkstring(L, 2);
Inventory *inv = getinv(L, ref);
- push_inventory_list(inv, listname, L);
+ if(inv){
+ push_inventory_list(inv, listname, L);
+ } else {
+ lua_pushnil(L);
+ }
return 1;
}
@@ -206,6 +216,9 @@ int InvRef::l_set_list(lua_State *L)
InvRef *ref = checkobject(L, 1);
const char *listname = luaL_checkstring(L, 2);
Inventory *inv = getinv(L, ref);
+ if(inv == NULL){
+ return 0;
+ }
InventoryList *list = inv->getList(listname);
if(list)
read_inventory_list(inv, listname, L, 3,
diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp
index 1e45610a6..f90b59285 100644
--- a/src/script/lua_api/l_object.cpp
+++ b/src/script/lua_api/l_object.cpp
@@ -62,6 +62,7 @@ struct EnumString es_HudBuiltinElement[] =
{HUD_FLAG_HEALTHBAR_VISIBLE, "healthbar"},
{HUD_FLAG_CROSSHAIR_VISIBLE, "crosshair"},
{HUD_FLAG_WIELDITEM_VISIBLE, "wielditem"},
+ {HUD_FLAG_BREATHBAR_VISIBLE, "breathbar"},
{0, NULL},
};
diff --git a/src/script/lua_api/luaapi.cpp b/src/script/lua_api/luaapi.cpp
index b75304b3a..e19c90952 100644
--- a/src/script/lua_api/luaapi.cpp
+++ b/src/script/lua_api/luaapi.cpp
@@ -43,6 +43,14 @@ struct EnumString ModApiBasic::es_OreType[] =
{0, NULL},
};
+struct EnumString ModApiBasic::es_DecorationType[] =
+{
+ {DECO_SIMPLE, "simple"},
+ {DECO_SCHEMATIC, "schematic"},
+ {DECO_LSYSTEM, "lsystem"},
+ {0, NULL},
+};
+
ModApiBasic::ModApiBasic() : ModApiBase() {
}
@@ -72,7 +80,7 @@ bool ModApiBasic::Initialize(lua_State* L,int top) {
retval &= API_FCT(get_ban_list);
retval &= API_FCT(get_ban_description);
retval &= API_FCT(ban_player);
- retval &= API_FCT(unban_player_of_ip);
+ retval &= API_FCT(unban_player_or_ip);
retval &= API_FCT(get_password_hash);
retval &= API_FCT(notify_authentication_modified);
@@ -92,17 +100,36 @@ bool ModApiBasic::Initialize(lua_State* L,int top) {
retval &= API_FCT(rollback_revert_actions_by);
retval &= API_FCT(register_ore);
+ retval &= API_FCT(register_decoration);
return retval;
}
-// debug(text)
+// debug(...)
// Writes a line to dstream
int ModApiBasic::l_debug(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- std::string text = lua_tostring(L, 1);
- dstream << text << std::endl;
+ // Handle multiple parameters to behave like standard lua print()
+ int n = lua_gettop(L);
+ lua_getglobal(L, "tostring");
+ for(int i = 1; i <= n; i++){
+ /*
+ Call tostring(i-th argument).
+ This is what print() does, and it behaves a bit
+ differently from directly calling lua_tostring.
+ */
+ lua_pushvalue(L, -1); /* function to be called */
+ lua_pushvalue(L, i); /* value to print */
+ lua_call(L, 1, 1);
+ const char *s = lua_tostring(L, -1);
+ if(i>1)
+ dstream << "\t";
+ if(s)
+ dstream << s;
+ lua_pop(L, 1);
+ }
+ dstream << std::endl;
return 0;
}
@@ -162,30 +189,28 @@ int ModApiBasic::l_register_biome(lua_State *L)
}
enum BiomeTerrainType terrain = (BiomeTerrainType)getenumfield(L, index,
- "terrain_type", es_BiomeTerrainType, BIOME_TERRAIN_NORMAL);
+ "terrain_type", es_BiomeTerrainType, BIOME_TERRAIN_NORMAL);
Biome *b = bmgr->createBiome(terrain);
- b->name = getstringfield_default(L, index, "name", "");
- b->top_nodename = getstringfield_default(L, index, "top_node", "");
- b->top_depth = getintfield_default(L, index, "top_depth", 0);
+ b->name = getstringfield_default(L, index, "name", "");
+ b->top_nodename = getstringfield_default(L, index, "top_node", "");
+ b->top_depth = getintfield_default(L, index, "top_depth", 0);
b->filler_nodename = getstringfield_default(L, index, "filler_node", "");
- b->filler_height = getintfield_default(L, index, "filler_height", 0);
- b->height_min = getintfield_default(L, index, "height_min", 0);
- b->height_max = getintfield_default(L, index, "height_max", 0);
- b->heat_point = getfloatfield_default(L, index, "heat_point", 0.);
- b->humidity_point = getfloatfield_default(L, index, "humidity_point", 0.);
-
- b->flags = 0; //reserved
- b->c_top = CONTENT_IGNORE;
+ b->filler_height = getintfield_default(L, index, "filler_height", 0);
+ b->height_min = getintfield_default(L, index, "height_min", 0);
+ b->height_max = getintfield_default(L, index, "height_max", 0);
+ b->heat_point = getfloatfield_default(L, index, "heat_point", 0.);
+ b->humidity_point = getfloatfield_default(L, index, "humidity_point", 0.);
+
+ b->flags = 0; //reserved
+ b->c_top = CONTENT_IGNORE;
b->c_filler = CONTENT_IGNORE;
+ verbosestream << "register_biome: " << b->name << std::endl;
bmgr->addBiome(b);
- verbosestream << "register_biome: " << b->name << std::endl;
return 0;
}
-
-
// setting_set(name, value)
int ModApiBasic::l_setting_set(lua_State *L)
{
@@ -353,7 +378,7 @@ int ModApiBasic::l_ban_player(lua_State *L)
}
// unban_player_or_ip()
-int ModApiBasic::l_unban_player_of_ip(lua_State *L)
+int ModApiBasic::l_unban_player_or_ip(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
const char * ip_or_name = luaL_checkstring(L, 1);
@@ -650,4 +675,111 @@ int ModApiBasic::l_register_ore(lua_State *L)
return 0;
}
+// register_decoration({lots of stuff})
+int ModApiBasic::l_register_decoration(lua_State *L)
+{
+ int index = 1;
+ luaL_checktype(L, index, LUA_TTABLE);
+
+ EmergeManager *emerge = getServer(L)->getEmergeManager();
+ BiomeDefManager *bdef = emerge->biomedef;
+
+ enum DecorationType decotype = (DecorationType)getenumfield(L, index,
+ "deco_type", es_DecorationType, -1);
+ if (decotype == -1) {
+ errorstream << "register_decoration: unrecognized "
+ "decoration placement type";
+ return 0;
+ }
+
+ Decoration *deco = createDecoration(decotype);
+ if (!deco) {
+ errorstream << "register_decoration: decoration placement type "
+ << decotype << " not implemented";
+ return 0;
+ }
+
+ deco->c_place_on = CONTENT_IGNORE;
+ deco->place_on_name = getstringfield_default(L, index, "place_on", "ignore");
+ deco->sidelen = getintfield_default(L, index, "sidelen", 8);
+ deco->fill_ratio = getfloatfield_default(L, index, "fill_ratio", 0.02);
+
+ lua_getfield(L, index, "noise_params");
+ deco->np = read_noiseparams(L, -1);
+ lua_pop(L, 1);
+
+ lua_getfield(L, index, "biomes");
+ if (lua_istable(L, -1)) {
+ lua_pushnil(L);
+ while (lua_next(L, -2)) {
+ const char *s = lua_tostring(L, -1);
+ u8 biomeid = bdef->getBiomeIdByName(s);
+ if (biomeid)
+ deco->biomes.insert(biomeid);
+
+ lua_pop(L, 1);
+ }
+ lua_pop(L, 1);
+ }
+
+ switch (decotype) {
+ case DECO_SIMPLE: {
+ DecoSimple *dsimple = (DecoSimple *)deco;
+ dsimple->c_deco = CONTENT_IGNORE;
+ dsimple->c_spawnby = CONTENT_IGNORE;
+ dsimple->spawnby_name = getstringfield_default(L, index, "spawn_by", "air");
+ dsimple->deco_height = getintfield_default(L, index, "height", 1);
+ dsimple->deco_height_max = getintfield_default(L, index, "height_max", 0);
+ dsimple->nspawnby = getintfield_default(L, index, "num_spawn_by", -1);
+
+ lua_getfield(L, index, "decoration");
+ if (lua_istable(L, -1)) {
+ lua_pushnil(L);
+ while (lua_next(L, -2)) {
+ const char *s = lua_tostring(L, -1);
+ std::string str(s);
+ dsimple->decolist_names.push_back(str);
+
+ lua_pop(L, 1);
+ }
+ } else if (lua_isstring(L, -1)) {
+ dsimple->deco_name = std::string(lua_tostring(L, -1));
+ } else {
+ dsimple->deco_name = std::string("air");
+ }
+ lua_pop(L, 1);
+
+ if (dsimple->deco_height <= 0) {
+ errorstream << "register_decoration: simple decoration height"
+ " must be greater than 0" << std::endl;
+ delete dsimple;
+ return 0;
+ }
+
+ break; }
+ case DECO_SCHEMATIC: {
+ //DecoSchematic *decoschematic = (DecoSchematic *)deco;
+
+ break; }
+ case DECO_LSYSTEM: {
+ //DecoLSystem *decolsystem = (DecoLSystem *)deco;
+
+ break; }
+ }
+
+ if (deco->sidelen <= 0) {
+ errorstream << "register_decoration: sidelen must be "
+ "greater than 0" << std::endl;
+ delete deco;
+ return 0;
+ }
+
+ emerge->decorations.push_back(deco);
+
+ verbosestream << "register_decoration: decoration '" << deco->getName()
+ << "' registered" << std::endl;
+ return 0;
+}
+
+
ModApiBasic modapibasic_prototype;
diff --git a/src/script/lua_api/luaapi.h b/src/script/lua_api/luaapi.h
index 592046965..d03c14117 100644
--- a/src/script/lua_api/luaapi.h
+++ b/src/script/lua_api/luaapi.h
@@ -45,9 +45,6 @@ private:
// get_server_status()
static int l_get_server_status(lua_State *L);
- // register_biome_groups({frequencies})
- static int l_register_biome_groups(lua_State *L);
-
// register_biome({lots of stuff})
static int l_register_biome(lua_State *L);
@@ -85,7 +82,7 @@ private:
static int l_ban_player(lua_State *L);
// unban_player_or_ip()
- static int l_unban_player_of_ip(lua_State *L);
+ static int l_unban_player_or_ip(lua_State *L);
// show_formspec(playername,formname,formspec)
static int l_show_formspec(lua_State *L);
@@ -130,9 +127,15 @@ private:
// rollback_revert_actions_by(actor, seconds) -> bool, log messages
static int l_rollback_revert_actions_by(lua_State *L);
+ // register_ore(oredesc)
static int l_register_ore(lua_State *L);
+
+ // register_decoration(deco)
+ static int l_register_decoration(lua_State *L);
static struct EnumString es_OreType[];
+ static struct EnumString es_DecorationType[];
+
};