From b9e8e20c9cb87e441b3998b42f8d7f31c71f8a3f Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Fri, 2 Dec 2011 12:43:57 +0200 Subject: [PATCH] Script-defined creative inventory --- data/builtin.lua | 10 +++ data/mods/default/init.lua | 33 ++++++++++ src/CMakeLists.txt | 1 - src/content_craft.cpp | 127 ------------------------------------- src/content_craft.h | 30 --------- src/scriptapi.cpp | 13 +++- src/scriptapi.h | 2 + src/server.cpp | 7 +- 8 files changed, 61 insertions(+), 162 deletions(-) delete mode 100644 src/content_craft.cpp delete mode 100644 src/content_craft.h diff --git a/data/builtin.lua b/data/builtin.lua index bfdb45d..a9412a9 100644 --- a/data/builtin.lua +++ b/data/builtin.lua @@ -327,6 +327,16 @@ minetest.craftitem_eat = function(hp_change) end end +-- +-- Creative inventory +-- + +minetest.creative_inventory = {} + +minetest.add_to_creative_inventory = function(itemstring) + table.insert(minetest.creative_inventory, itemstring) +end + -- -- Callback registration -- diff --git a/data/mods/default/init.lua b/data/mods/default/init.lua index 6b313f6..0ea6779 100644 --- a/data/mods/default/init.lua +++ b/data/mods/default/init.lua @@ -41,6 +41,7 @@ -- minetest.register_on_respawnplayer(func(ObjectRef)) -- ^ return true in func to disable regular player placement -- minetest.register_on_chat_message(func(name, message)) +-- minetest.add_to_creative_inventory(itemstring) -- minetest.setting_get(name) -> string or nil -- minetest.setting_getbool(name) -> boolean value or nil -- minetest.chat_send_all(text) @@ -1344,6 +1345,38 @@ minetest.register_craftitem("apple_iron", { print(dump(minetest.registered_craftitems)) +-- +-- Creative inventory +-- + +minetest.add_to_creative_inventory('tool MesePick 0') +minetest.add_to_creative_inventory('tool SteelPick 0') +minetest.add_to_creative_inventory('tool SteelAxe 0') +minetest.add_to_creative_inventory('tool SteelShovel 0') + +minetest.add_to_creative_inventory('node torch 0') +minetest.add_to_creative_inventory('node cobble 0') +minetest.add_to_creative_inventory('node dirt 0') +minetest.add_to_creative_inventory('node stone 0') +minetest.add_to_creative_inventory('node sand 0') +minetest.add_to_creative_inventory('node sandstone 0') +minetest.add_to_creative_inventory('node clay 0') +minetest.add_to_creative_inventory('node brick 0') +minetest.add_to_creative_inventory('node tree 0') +minetest.add_to_creative_inventory('node leaves 0') +minetest.add_to_creative_inventory('node cactus 0') +minetest.add_to_creative_inventory('node papyrus 0') +minetest.add_to_creative_inventory('node bookshelf 0') +minetest.add_to_creative_inventory('node glass 0') +minetest.add_to_creative_inventory('node fence 0') +minetest.add_to_creative_inventory('node rail 0') +minetest.add_to_creative_inventory('node mese 0') +minetest.add_to_creative_inventory('node chest 0') +minetest.add_to_creative_inventory('node furnace 0') +minetest.add_to_creative_inventory('node sign_wall 0') +minetest.add_to_creative_inventory('node water_source 0') +minetest.add_to_creative_inventory('node lava_source 0') +minetest.add_to_creative_inventory('node ladder 0') -- -- Some common functions diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3d9f497..dca02f5 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -108,7 +108,6 @@ set(common_SRCS content_sao.cpp mapgen.cpp content_nodemeta.cpp - content_craft.cpp content_mapnode.cpp auth.cpp collision.cpp diff --git a/src/content_craft.cpp b/src/content_craft.cpp deleted file mode 100644 index c34e72a..0000000 --- a/src/content_craft.cpp +++ /dev/null @@ -1,127 +0,0 @@ -/* -Minetest-c55 -Copyright (C) 2010-2011 celeron55, Perttu Ahola - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#include "content_craft.h" -#include "inventory.h" -#include "content_mapnode.h" -#include "player.h" -#include "mapnode.h" // For content_t -#include "gamedef.h" - -void craft_set_creative_inventory(Player *player, IGameDef *gamedef) -{ - INodeDefManager *ndef = gamedef->ndef(); - - player->resetInventory(); - - // Give some good tools - { - InventoryItem *item = new ToolItem(gamedef, "MesePick", 0); - void* r = player->inventory.addItem("main", item); - assert(r == NULL); - } - { - InventoryItem *item = new ToolItem(gamedef, "SteelPick", 0); - void* r = player->inventory.addItem("main", item); - assert(r == NULL); - } - { - InventoryItem *item = new ToolItem(gamedef, "SteelAxe", 0); - void* r = player->inventory.addItem("main", item); - assert(r == NULL); - } - { - InventoryItem *item = new ToolItem(gamedef, "SteelShovel", 0); - void* r = player->inventory.addItem("main", item); - assert(r == NULL); - } - - /* - Give materials - */ - - // CONTENT_IGNORE-terminated list - content_t material_items[] = { - LEGN(ndef, "CONTENT_TORCH"), - LEGN(ndef, "CONTENT_COBBLE"), - LEGN(ndef, "CONTENT_MUD"), - LEGN(ndef, "CONTENT_STONE"), - LEGN(ndef, "CONTENT_SAND"), - LEGN(ndef, "CONTENT_SANDSTONE"), - LEGN(ndef, "CONTENT_CLAY"), - LEGN(ndef, "CONTENT_BRICK"), - LEGN(ndef, "CONTENT_TREE"), - LEGN(ndef, "CONTENT_LEAVES"), - LEGN(ndef, "CONTENT_CACTUS"), - LEGN(ndef, "CONTENT_PAPYRUS"), - LEGN(ndef, "CONTENT_BOOKSHELF"), - LEGN(ndef, "CONTENT_GLASS"), - LEGN(ndef, "CONTENT_FENCE"), - LEGN(ndef, "CONTENT_RAIL"), - LEGN(ndef, "CONTENT_MESE"), - LEGN(ndef, "CONTENT_WATERSOURCE"), - LEGN(ndef, "CONTENT_CLOUD"), - LEGN(ndef, "CONTENT_CHEST"), - LEGN(ndef, "CONTENT_FURNACE"), - LEGN(ndef, "CONTENT_SIGN_WALL"), - LEGN(ndef, "CONTENT_LAVASOURCE"), - CONTENT_IGNORE - }; - - content_t *mip = material_items; - for(u16 i=0; iinventory.addItem("main", item); - - mip++; - } - -#if 0 - assert(USEFUL_LEGN(ndef, "CONTENT_COUNT") <= PLAYER_INVENTORY_SIZE); - - // add torch first - InventoryItem *item = new MaterialItem(gamedef, LEGN(ndef, "CONTENT_TORCH"), 1); - player->inventory.addItem("main", item); - - // Then others - for(u16 i=0; iinventory.addItem("main", item); - } -#endif - - /*// Sign - { - InventoryItem *item = new MapBlockObjectItem(gamedef, "Sign Example text"); - void* r = player->inventory.addItem("main", item); - assert(r == NULL); - }*/ -} - - diff --git a/src/content_craft.h b/src/content_craft.h deleted file mode 100644 index ee59c07..0000000 --- a/src/content_craft.h +++ /dev/null @@ -1,30 +0,0 @@ -/* -Minetest-c55 -Copyright (C) 2010-2011 celeron55, Perttu Ahola - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#ifndef CONTENT_CRAFT_HEADER -#define CONTENT_CRAFT_HEADER - -class InventoryItem; -class Player; -class IGameDef; - -void craft_set_creative_inventory(Player *player, IGameDef *gamedef); - -#endif - diff --git a/src/scriptapi.cpp b/src/scriptapi.cpp index dce454e..cb26fa4 100644 --- a/src/scriptapi.cpp +++ b/src/scriptapi.cpp @@ -402,6 +402,8 @@ static void setfloatfield(lua_State *L, int table, static void inventory_set_list_from_lua(Inventory *inv, const char *name, lua_State *L, int tableindex, IGameDef *gamedef, int forcesize=-1) { + if(tableindex < 0) + tableindex = lua_gettop(L) + 1 + tableindex; // If nil, delete list if(lua_isnil(L, tableindex)){ inv->deleteList(name); @@ -1808,7 +1810,7 @@ private: // Return lua_pushboolean(L, added); if(!added) - lua_pushstring(L, "does not fit"); + lua_pushstring(L, "failed to add item"); return 2; } catch(SerializationError &e){ // Return @@ -2693,6 +2695,15 @@ bool scriptapi_on_respawnplayer(lua_State *L, ServerActiveObject *player) return positioning_handled_by_some; } +void scriptapi_get_creative_inventory(lua_State *L, ServerRemotePlayer *player) +{ + lua_getglobal(L, "minetest"); + lua_getfield(L, -1, "creative_inventory"); + luaL_checktype(L, -1, LUA_TTABLE); + inventory_set_list_from_lua(&player->inventory, "main", L, -1, + player->getEnv()->getGameDef(), PLAYER_INVENTORY_SIZE); +} + /* craftitem */ diff --git a/src/scriptapi.h b/src/scriptapi.h index 2baf6f8..33b7954 100644 --- a/src/scriptapi.h +++ b/src/scriptapi.h @@ -31,6 +31,7 @@ typedef struct lua_State lua_State; struct LuaEntityProperties; struct PointedThing; //class IGameDef; +class ServerRemotePlayer; void scriptapi_export(lua_State *L, Server *server); void scriptapi_add_environment(lua_State *L, ServerEnvironment *env); @@ -60,6 +61,7 @@ void scriptapi_environment_on_generated(lua_State *L, v3s16 minp, v3s16 maxp); /* misc */ void scriptapi_on_newplayer(lua_State *L, ServerActiveObject *player); bool scriptapi_on_respawnplayer(lua_State *L, ServerActiveObject *player); +void scriptapi_get_creative_inventory(lua_State *L, ServerRemotePlayer *player); /* craftitem */ void scriptapi_add_craftitem(lua_State *L, const char *name); diff --git a/src/server.cpp b/src/server.cpp index 3b2b452..786a360 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -33,7 +33,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "servercommand.h" #include "filesys.h" #include "content_mapnode.h" -#include "content_craft.h" #include "content_nodemeta.h" #include "mapblock.h" #include "serverobject.h" @@ -4723,7 +4722,8 @@ ServerRemotePlayer *Server::emergePlayer(const char *name, u16 peer_id) player->inventory_backup = new Inventory(); *(player->inventory_backup) = player->inventory; // Set creative inventory - craft_set_creative_inventory(player, this); + player->resetInventory(); + scriptapi_get_creative_inventory(m_lua, player); } return player; @@ -4767,7 +4767,8 @@ ServerRemotePlayer *Server::emergePlayer(const char *name, u16 peer_id) player->inventory_backup = new Inventory(); *(player->inventory_backup) = player->inventory; // Set creative inventory - craft_set_creative_inventory(player, this); + player->resetInventory(); + scriptapi_get_creative_inventory(m_lua, player); } return player;