From b9e8e20c9cb87e441b3998b42f8d7f31c71f8a3f Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Fri, 2 Dec 2011 12:43:57 +0200 Subject: Script-defined creative inventory --- 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 +-- 6 files changed, 18 insertions(+), 162 deletions(-) delete mode 100644 src/content_craft.cpp delete mode 100644 src/content_craft.h (limited to 'src') diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3d9f49792..dca02f571 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 c34e72a8e..000000000 --- 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 ee59c077b..000000000 --- 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 dce454ea4..cb26fa472 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 2baf6f836..33b795415 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 3b2b45225..786a3600e 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; -- cgit v1.2.3