From b97d33ca28df239da85b5ba1b95d65b40a5ac1f9 Mon Sep 17 00:00:00 2001 From: lethosor Date: Tue, 5 Apr 2016 11:43:02 -0400 Subject: [PATCH] moveToBuilding improvements - Don't set in_building by default when use_mode is 0 (consistent with most vanilla DF items) - make use_mode optional and default to 0 (including in Lua API) Resolves #885 --- docs/Lua API.rst | 7 ++++++- library/LuaApi.cpp | 20 +++++++++++++------- library/include/modules/Items.h | 3 ++- library/modules/Items.cpp | 6 ++++-- 4 files changed, 25 insertions(+), 11 deletions(-) diff --git a/docs/Lua API.rst b/docs/Lua API.rst index b95615d4e..4e3cf9be2 100644 --- a/docs/Lua API.rst +++ b/docs/Lua API.rst @@ -1205,10 +1205,15 @@ Items module Move the item to the container. Returns *false* if impossible. -* ``dfhack.items.moveToBuilding(item,building,use_mode)`` +* ``dfhack.items.moveToBuilding(item,building[,use_mode[,force_in_building])`` Move the item to the building. Returns *false* if impossible. + ``use_mode`` defaults to 0. If set to 2, the item will be treated as part of the building. + + If ``force_in_building`` is true, the item will be considered to be stored by the building + (used for items temporarily used in traps in vanilla DF) + * ``dfhack.items.moveToInventory(item,unit,use_mode,body_part)`` Move the item to the unit inventory. Returns *false* if impossible. diff --git a/library/LuaApi.cpp b/library/LuaApi.cpp index 7af4f8c49..08cfc5c21 100644 --- a/library/LuaApi.cpp +++ b/library/LuaApi.cpp @@ -1597,12 +1597,6 @@ static bool items_moveToContainer(df::item *item, df::item *container) return Items::moveToContainer(mc, item, container); } -static bool items_moveToBuilding(df::item *item, df::building_actual *building, int use_mode) -{ - MapExtras::MapCache mc; - return Items::moveToBuilding(mc, item, building,use_mode); -} - static bool items_moveToInventory (df::item *item, df::unit *unit, df::unit_inventory_item::T_mode mode, int body_part) { @@ -1653,7 +1647,6 @@ static const LuaWrapper::FunctionReg dfhack_items_module[] = { WRAPM(Items, createItem), WRAPN(moveToGround, items_moveToGround), WRAPN(moveToContainer, items_moveToContainer), - WRAPN(moveToBuilding, items_moveToBuilding), WRAPN(moveToInventory, items_moveToInventory), WRAPN(makeProjectile, items_makeProjectile), WRAPN(remove, items_remove), @@ -1675,9 +1668,22 @@ static int items_getContainedItems(lua_State *state) return 1; } +static int items_moveToBuilding(lua_State *state) +{ + MapExtras::MapCache mc; + auto item = Lua::CheckDFObject(state, 1); + auto building = Lua::CheckDFObject(state, 2); + int use_mode = luaL_optint(state, 3, 0); + bool force_in_building = lua_toboolean(state, 4); + lua_pushboolean(state, Items::moveToBuilding(mc, item, building, use_mode, force_in_building)); + return 1; +} + + static const luaL_Reg dfhack_items_funcs[] = { { "getPosition", items_getPosition }, { "getContainedItems", items_getContainedItems }, + { "moveToBuilding", items_moveToBuilding }, { NULL, NULL } }; diff --git a/library/include/modules/Items.h b/library/include/modules/Items.h index f8cb6a0df..d77b5b369 100644 --- a/library/include/modules/Items.h +++ b/library/include/modules/Items.h @@ -164,7 +164,8 @@ DFHACK_EXPORT std::string getDescription(df::item *item, int type = 0, bool deco DFHACK_EXPORT bool moveToGround(MapExtras::MapCache &mc, df::item *item, df::coord pos); DFHACK_EXPORT bool moveToContainer(MapExtras::MapCache &mc, df::item *item, df::item *container); -DFHACK_EXPORT bool moveToBuilding(MapExtras::MapCache &mc, df::item *item, df::building_actual *building,int16_t use_mode); +DFHACK_EXPORT bool moveToBuilding(MapExtras::MapCache &mc, df::item *item, df::building_actual *building, + int16_t use_mode = 0, bool force_in_building = false); DFHACK_EXPORT bool moveToInventory(MapExtras::MapCache &mc, df::item *item, df::unit *unit, df::unit_inventory_item::T_mode mode = df::unit_inventory_item::Hauled, int body_part = -1); diff --git a/library/modules/Items.cpp b/library/modules/Items.cpp index b4539abdd..4c224a0d6 100644 --- a/library/modules/Items.cpp +++ b/library/modules/Items.cpp @@ -892,7 +892,8 @@ bool DFHack::Items::moveToContainer(MapExtras::MapCache &mc, df::item *item, df: return true; } -bool DFHack::Items::moveToBuilding(MapExtras::MapCache &mc, df::item *item, df::building_actual *building,int16_t use_mode) +bool DFHack::Items::moveToBuilding(MapExtras::MapCache &mc, df::item *item, df::building_actual *building, + int16_t use_mode, bool force_in_building) { CHECK_NULL_POINTER(item); CHECK_NULL_POINTER(building); @@ -915,7 +916,8 @@ bool DFHack::Items::moveToBuilding(MapExtras::MapCache &mc, df::item *item, df:: item->pos.x=building->centerx; item->pos.y=building->centery; item->pos.z=building->z; - item->flags.bits.in_building=true; + if (use_mode == 2 || force_in_building) + item->flags.bits.in_building=true; ref->building_id=building->id; item->general_refs.push_back(ref);