mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
Add get_wielded_item
This commit is contained in:
parent
44ca9c9cb2
commit
88df9fb5b6
15 changed files with 92 additions and 33 deletions
|
@ -43,6 +43,12 @@ Client *ModApiBase::getClient(lua_State *L)
|
|||
return getScriptApiBase(L)->getClient();
|
||||
}
|
||||
#endif
|
||||
|
||||
IGameDef *ModApiBase::getGameDef(lua_State *L)
|
||||
{
|
||||
return getScriptApiBase(L)->getGameDef();
|
||||
}
|
||||
|
||||
Environment *ModApiBase::getEnv(lua_State *L)
|
||||
{
|
||||
return getScriptApiBase(L)->getEnv();
|
||||
|
|
|
@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
|
||||
#include "common/c_types.h"
|
||||
#include "common/c_internal.h"
|
||||
#include "gamedef.h"
|
||||
|
||||
extern "C" {
|
||||
#include <lua.h>
|
||||
|
@ -46,6 +47,8 @@ public:
|
|||
static Client* getClient(lua_State *L);
|
||||
#endif // !SERVER
|
||||
|
||||
static IGameDef* getGameDef(lua_State *L);
|
||||
|
||||
static Environment* getEnv(lua_State *L);
|
||||
static GUIEngine* getGuiEngine(lua_State *L);
|
||||
// When we are not loading the mod, this function returns "."
|
||||
|
|
|
@ -25,6 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
#include "gettext.h"
|
||||
#include "common/c_converter.h"
|
||||
#include "common/c_content.h"
|
||||
#include "lua_api/l_item.h"
|
||||
|
||||
int ModApiClient::l_get_current_modname(lua_State *L)
|
||||
{
|
||||
|
@ -132,6 +133,23 @@ int ModApiClient::l_get_node_or_nil(lua_State *L)
|
|||
return 1;
|
||||
}
|
||||
|
||||
int ModApiClient::l_get_wielded_item(lua_State *L)
|
||||
{
|
||||
Client *client = getClient(L);
|
||||
|
||||
Inventory local_inventory(client->idef());
|
||||
client->getLocalInventory(local_inventory);
|
||||
|
||||
InventoryList *mlist = local_inventory.getList("main");
|
||||
|
||||
if (mlist && client->getPlayerItem() < mlist->getSize()) {
|
||||
LuaItemStack::create(L, mlist->getItem(client->getPlayerItem()));
|
||||
} else {
|
||||
LuaItemStack::create(L, ItemStack());
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
void ModApiClient::Initialize(lua_State *L, int top)
|
||||
{
|
||||
API_FCT(get_current_modname);
|
||||
|
@ -143,4 +161,5 @@ void ModApiClient::Initialize(lua_State *L, int top)
|
|||
API_FCT(gettext);
|
||||
API_FCT(get_node);
|
||||
API_FCT(get_node_or_nil);
|
||||
API_FCT(get_wielded_item);
|
||||
}
|
||||
|
|
|
@ -53,7 +53,8 @@ private:
|
|||
// get_node_or_nil(pos)
|
||||
static int l_get_node_or_nil(lua_State *L);
|
||||
|
||||
|
||||
// get_wielded_item()
|
||||
static int l_get_wielded_item(lua_State *L);
|
||||
|
||||
public:
|
||||
static void Initialize(lua_State *L, int top);
|
||||
|
|
|
@ -472,7 +472,7 @@ int ModApiEnvMod::l_add_item(lua_State *L)
|
|||
// pos
|
||||
//v3f pos = checkFloatPos(L, 1);
|
||||
// item
|
||||
ItemStack item = read_item(L, 2,getServer(L));
|
||||
ItemStack item = read_item(L, 2,getServer(L)->idef());
|
||||
if(item.empty() || !item.isKnown(getServer(L)->idef()))
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -194,7 +194,7 @@ int InvRef::l_set_stack(lua_State *L)
|
|||
InvRef *ref = checkobject(L, 1);
|
||||
const char *listname = luaL_checkstring(L, 2);
|
||||
int i = luaL_checknumber(L, 3) - 1;
|
||||
ItemStack newitem = read_item(L, 4, getServer(L));
|
||||
ItemStack newitem = read_item(L, 4, getServer(L)->idef());
|
||||
InventoryList *list = getlist(L, ref, listname);
|
||||
if(list != NULL && i >= 0 && i < (int) list->getSize()){
|
||||
list->changeItem(i, newitem);
|
||||
|
@ -295,7 +295,7 @@ int InvRef::l_add_item(lua_State *L)
|
|||
NO_MAP_LOCK_REQUIRED;
|
||||
InvRef *ref = checkobject(L, 1);
|
||||
const char *listname = luaL_checkstring(L, 2);
|
||||
ItemStack item = read_item(L, 3, getServer(L));
|
||||
ItemStack item = read_item(L, 3, getServer(L)->idef());
|
||||
InventoryList *list = getlist(L, ref, listname);
|
||||
if(list){
|
||||
ItemStack leftover = list->addItem(item);
|
||||
|
@ -315,7 +315,7 @@ int InvRef::l_room_for_item(lua_State *L)
|
|||
NO_MAP_LOCK_REQUIRED;
|
||||
InvRef *ref = checkobject(L, 1);
|
||||
const char *listname = luaL_checkstring(L, 2);
|
||||
ItemStack item = read_item(L, 3, getServer(L));
|
||||
ItemStack item = read_item(L, 3, getServer(L)->idef());
|
||||
InventoryList *list = getlist(L, ref, listname);
|
||||
if(list){
|
||||
lua_pushboolean(L, list->roomForItem(item));
|
||||
|
@ -332,7 +332,7 @@ int InvRef::l_contains_item(lua_State *L)
|
|||
NO_MAP_LOCK_REQUIRED;
|
||||
InvRef *ref = checkobject(L, 1);
|
||||
const char *listname = luaL_checkstring(L, 2);
|
||||
ItemStack item = read_item(L, 3, getServer(L));
|
||||
ItemStack item = read_item(L, 3, getServer(L)->idef());
|
||||
InventoryList *list = getlist(L, ref, listname);
|
||||
if(list){
|
||||
lua_pushboolean(L, list->containsItem(item));
|
||||
|
@ -349,7 +349,7 @@ int InvRef::l_remove_item(lua_State *L)
|
|||
NO_MAP_LOCK_REQUIRED;
|
||||
InvRef *ref = checkobject(L, 1);
|
||||
const char *listname = luaL_checkstring(L, 2);
|
||||
ItemStack item = read_item(L, 3, getServer(L));
|
||||
ItemStack item = read_item(L, 3, getServer(L)->idef());
|
||||
InventoryList *list = getlist(L, ref, listname);
|
||||
if(list){
|
||||
ItemStack removed = list->removeItem(item);
|
||||
|
|
|
@ -190,7 +190,7 @@ int LuaItemStack::l_replace(lua_State *L)
|
|||
{
|
||||
NO_MAP_LOCK_REQUIRED;
|
||||
LuaItemStack *o = checkobject(L, 1);
|
||||
o->m_stack = read_item(L,2,getServer(L));
|
||||
o->m_stack = read_item(L, 2, getGameDef(L)->idef());
|
||||
lua_pushboolean(L, true);
|
||||
return 1;
|
||||
}
|
||||
|
@ -250,7 +250,7 @@ int LuaItemStack::l_get_stack_max(lua_State *L)
|
|||
NO_MAP_LOCK_REQUIRED;
|
||||
LuaItemStack *o = checkobject(L, 1);
|
||||
ItemStack &item = o->m_stack;
|
||||
lua_pushinteger(L, item.getStackMax(getServer(L)->idef()));
|
||||
lua_pushinteger(L, item.getStackMax(getGameDef(L)->idef()));
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -260,7 +260,7 @@ int LuaItemStack::l_get_free_space(lua_State *L)
|
|||
NO_MAP_LOCK_REQUIRED;
|
||||
LuaItemStack *o = checkobject(L, 1);
|
||||
ItemStack &item = o->m_stack;
|
||||
lua_pushinteger(L, item.freeSpace(getServer(L)->idef()));
|
||||
lua_pushinteger(L, item.freeSpace(getGameDef(L)->idef()));
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -271,7 +271,7 @@ int LuaItemStack::l_is_known(lua_State *L)
|
|||
NO_MAP_LOCK_REQUIRED;
|
||||
LuaItemStack *o = checkobject(L, 1);
|
||||
ItemStack &item = o->m_stack;
|
||||
bool is_known = item.isKnown(getServer(L)->idef());
|
||||
bool is_known = item.isKnown(getGameDef(L)->idef());
|
||||
lua_pushboolean(L, is_known);
|
||||
return 1;
|
||||
}
|
||||
|
@ -307,7 +307,7 @@ int LuaItemStack::l_get_tool_capabilities(lua_State *L)
|
|||
LuaItemStack *o = checkobject(L, 1);
|
||||
ItemStack &item = o->m_stack;
|
||||
const ToolCapabilities &prop =
|
||||
item.getToolCapabilities(getServer(L)->idef());
|
||||
item.getToolCapabilities(getGameDef(L)->idef());
|
||||
push_tool_capabilities(L, prop);
|
||||
return 1;
|
||||
}
|
||||
|
@ -322,7 +322,7 @@ int LuaItemStack::l_add_wear(lua_State *L)
|
|||
LuaItemStack *o = checkobject(L, 1);
|
||||
ItemStack &item = o->m_stack;
|
||||
int amount = lua_tointeger(L, 2);
|
||||
bool result = item.addWear(amount, getServer(L)->idef());
|
||||
bool result = item.addWear(amount, getGameDef(L)->idef());
|
||||
lua_pushboolean(L, result);
|
||||
return 1;
|
||||
}
|
||||
|
@ -334,8 +334,8 @@ int LuaItemStack::l_add_item(lua_State *L)
|
|||
NO_MAP_LOCK_REQUIRED;
|
||||
LuaItemStack *o = checkobject(L, 1);
|
||||
ItemStack &item = o->m_stack;
|
||||
ItemStack newitem = read_item(L,-1, getServer(L));
|
||||
ItemStack leftover = item.addItem(newitem, getServer(L)->idef());
|
||||
ItemStack newitem = read_item(L, -1, getGameDef(L)->idef());
|
||||
ItemStack leftover = item.addItem(newitem, getGameDef(L)->idef());
|
||||
create(L, leftover);
|
||||
return 1;
|
||||
}
|
||||
|
@ -348,9 +348,9 @@ int LuaItemStack::l_item_fits(lua_State *L)
|
|||
NO_MAP_LOCK_REQUIRED;
|
||||
LuaItemStack *o = checkobject(L, 1);
|
||||
ItemStack &item = o->m_stack;
|
||||
ItemStack newitem = read_item(L, 2, getServer(L));
|
||||
ItemStack newitem = read_item(L, 2, getGameDef(L)->idef());
|
||||
ItemStack restitem;
|
||||
bool fits = item.itemFits(newitem, &restitem, getServer(L)->idef());
|
||||
bool fits = item.itemFits(newitem, &restitem, getGameDef(L)->idef());
|
||||
lua_pushboolean(L, fits); // first return value
|
||||
create(L, restitem); // second return value
|
||||
return 2;
|
||||
|
@ -407,7 +407,7 @@ ItemStack& LuaItemStack::getItem()
|
|||
int LuaItemStack::create_object(lua_State *L)
|
||||
{
|
||||
NO_MAP_LOCK_REQUIRED;
|
||||
ItemStack item = read_item(L, 1, getServer(L));
|
||||
ItemStack item = read_item(L, 1, getGameDef(L)->idef());
|
||||
LuaItemStack *o = new LuaItemStack(item);
|
||||
*(void **)(lua_newuserdata(L, sizeof(void *))) = o;
|
||||
luaL_getmetatable(L, className);
|
||||
|
@ -596,7 +596,7 @@ int ModApiItemMod::l_get_content_id(lua_State *L)
|
|||
NO_MAP_LOCK_REQUIRED;
|
||||
std::string name = luaL_checkstring(L, 1);
|
||||
|
||||
INodeDefManager *ndef = getServer(L)->getNodeDefManager();
|
||||
INodeDefManager *ndef = getGameDef(L)->getNodeDefManager();
|
||||
content_t c = ndef->getId(name);
|
||||
|
||||
lua_pushinteger(L, c);
|
||||
|
@ -609,7 +609,7 @@ int ModApiItemMod::l_get_name_from_content_id(lua_State *L)
|
|||
NO_MAP_LOCK_REQUIRED;
|
||||
content_t c = luaL_checkint(L, 1);
|
||||
|
||||
INodeDefManager *ndef = getServer(L)->getNodeDefManager();
|
||||
INodeDefManager *ndef = getGameDef(L)->getNodeDefManager();
|
||||
const char *name = ndef->get(c).name.c_str();
|
||||
|
||||
lua_pushstring(L, name);
|
||||
|
|
|
@ -364,7 +364,7 @@ int ObjectRef::l_set_wielded_item(lua_State *L)
|
|||
ServerActiveObject *co = getobject(ref);
|
||||
if (co == NULL) return 0;
|
||||
// Do it
|
||||
ItemStack item = read_item(L, 2, getServer(L));
|
||||
ItemStack item = read_item(L, 2, getServer(L)->idef());
|
||||
bool success = co->setWieldedItem(item);
|
||||
if (success && co->getType() == ACTIVEOBJECT_TYPE_PLAYER) {
|
||||
getServer(L)->SendInventory(((PlayerSAO*)co));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue