From 2fb8faf3e6f875107a9e34a2d38e1ece16764a8d Mon Sep 17 00:00:00 2001 From: expwnent Date: Thu, 3 Jul 2014 10:36:55 -0400 Subject: [PATCH] Added Items::createItem function. --- NEWS | 1 + library/LuaApi.cpp | 1 + library/include/modules/Items.h | 3 + library/modules/Items.cpp | 138 ++++++++++++++++++++++---------- 4 files changed, 100 insertions(+), 43 deletions(-) diff --git a/NEWS b/NEWS index cfc096fba..8f8d0f61b 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,7 @@ DFHack future Internals: + Items module: added createItem function EventManager: EQUIPMENT_CHANGE now triggers for new units new events: diff --git a/library/LuaApi.cpp b/library/LuaApi.cpp index e830189c5..fcd7353ea 100644 --- a/library/LuaApi.cpp +++ b/library/LuaApi.cpp @@ -1479,6 +1479,7 @@ static const LuaWrapper::FunctionReg dfhack_items_module[] = { WRAPM(Items, getSubtypeDef), WRAPM(Items, getItemBaseValue), WRAPM(Items, getValue), + WRAPM(Items, createItem), WRAPN(moveToGround, items_moveToGround), WRAPN(moveToContainer, items_moveToContainer), WRAPN(moveToBuilding, items_moveToBuilding), diff --git a/library/include/modules/Items.h b/library/include/modules/Items.h index e5b6eb4df..f8cb6a0df 100644 --- a/library/include/modules/Items.h +++ b/library/include/modules/Items.h @@ -179,5 +179,8 @@ DFHACK_EXPORT int getItemBaseValue(int16_t item_type, int16_t item_subtype, int1 /// Gets the value of a specific item, ignoring civ values and trade agreements DFHACK_EXPORT int getValue(df::item *item); + +DFHACK_EXPORT int32_t createItem(df::item_type type, int16_t item_subtype, int16_t mat_type, int32_t mat_index, df::unit* creator); } } + diff --git a/library/modules/Items.cpp b/library/modules/Items.cpp index f25140217..31640dbb5 100644 --- a/library/modules/Items.cpp +++ b/library/modules/Items.cpp @@ -22,69 +22,72 @@ must not be misrepresented as being the original software. distribution. */ - +#include "Core.h" +#include "Error.h" #include "Internal.h" +#include "MemAccess.h" +#include "MiscUtils.h" +#include "Types.h" +#include "VersionInfo.h" -#include -#include -#include #include #include +#include +#include +#include #include using namespace std; -#include "Types.h" -#include "VersionInfo.h" -#include "MemAccess.h" +#include "ModuleFactory.h" +#include "modules/MapCache.h" #include "modules/Materials.h" #include "modules/Items.h" #include "modules/Units.h" -#include "modules/MapCache.h" -#include "ModuleFactory.h" -#include "Core.h" -#include "Error.h" -#include "MiscUtils.h" -#include "df/ui.h" -#include "df/world.h" -#include "df/item.h" +#include "df/body_part_raw.h" +#include "df/body_part_template_flags.h" #include "df/building.h" #include "df/building_actual.h" -#include "df/tool_uses.h" -#include "df/itemdef_weaponst.h" -#include "df/itemdef_trapcompst.h" -#include "df/itemdef_toyst.h" -#include "df/itemdef_toolst.h" -#include "df/itemdef_instrumentst.h" -#include "df/itemdef_armorst.h" +#include "df/caste_raw.h" +#include "df/creature_raw.h" +#include "df/general_ref.h" +#include "df/general_ref_building_holderst.h" +#include "df/general_ref_contained_in_itemst.h" +#include "df/general_ref_contains_itemst.h" +#include "df/general_ref_projectile.h" +#include "df/general_ref_unit_itemownerst.h" +#include "df/general_ref_unit_holderst.h" +#include "df/historical_entity.h" +#include "df/item.h" +#include "df/item_type.h" #include "df/itemdef_ammost.h" -#include "df/itemdef_siegeammost.h" +#include "df/itemdef_armorst.h" +#include "df/itemdef_foodst.h" #include "df/itemdef_glovesst.h" -#include "df/itemdef_shoesst.h" -#include "df/itemdef_shieldst.h" #include "df/itemdef_helmst.h" +#include "df/itemdef_instrumentst.h" #include "df/itemdef_pantsst.h" -#include "df/itemdef_foodst.h" -#include "df/trapcomp_flags.h" +#include "df/itemdef_shieldst.h" +#include "df/itemdef_shoesst.h" +#include "df/itemdef_siegeammost.h" +#include "df/itemdef_toolst.h" +#include "df/itemdef_toyst.h" +#include "df/itemdef_trapcompst.h" +#include "df/itemdef_weaponst.h" #include "df/job_item.h" -#include "df/general_ref.h" -#include "df/general_ref_unit_itemownerst.h" -#include "df/general_ref_contains_itemst.h" -#include "df/general_ref_contained_in_itemst.h" -#include "df/general_ref_building_holderst.h" -#include "df/general_ref_projectile.h" -#include "df/viewscreen_itemst.h" -#include "df/vermin.h" +#include "df/map_block.h" #include "df/proj_itemst.h" #include "df/proj_list_link.h" - -#include "df/unit_inventory_item.h" -#include "df/body_part_raw.h" +#include "df/reaction_product_itemst.h" +#include "df/tool_uses.h" +#include "df/trapcomp_flags.h" +#include "df/ui.h" #include "df/unit.h" -#include "df/creature_raw.h" -#include "df/caste_raw.h" -#include "df/body_part_template_flags.h" -#include "df/general_ref_unit_holderst.h" +#include "df/unit_inventory_item.h" +#include "df/vermin.h" +#include "df/viewscreen_itemst.h" +#include "df/world.h" +#include "df/world_site.h" using namespace DFHack; using namespace df::enums; @@ -1329,4 +1332,53 @@ int Items::getValue(df::item *item) value /= divisor; } return value; -} \ No newline at end of file +} + +int32_t Items::createItem(df::item_type item_type, int16_t item_subtype, int16_t mat_type, int32_t mat_index, df::unit* unit) { + //based on Quietust's plugins/createitem.cpp + df::map_block* block = Maps::getTileBlock(unit->pos.x, unit->pos.y, unit->pos.z); + CHECK_NULL_POINTER(block); + df::reaction_product_itemst* prod = df::allocate(); + prod->item_type = item_type; + prod->item_subtype = item_subtype; + prod->mat_type = mat_type; + prod->mat_index = mat_index; + prod->probability = 100; + prod->count = 1; + switch(item_type) { + case df::item_type::BAR: + case df::item_type::POWDER_MISC: + case df::item_type::LIQUID_MISC: + case df::item_type::DRINK: + prod->product_dimension = 150; + break; + case df::item_type::THREAD: + prod->product_dimension = 15000; + break; + case df::item_type::CLOTH: + prod->product_dimension = 10000; + break; + default: + prod->product_dimension = 1; + break; + } + + //makeItem + vector out_items; + vector in_reag; + vector in_items; + + df::enums::game_type::game_type type = *df::global::gametype; + prod->produce(unit, &out_items, &in_reag, &in_items, 1, job_skill::NONE, + df::historical_entity::find(unit->civ_id), + ((type == df::enums::game_type::DWARF_MAIN) || (type == df::enums::game_type::DWARF_RECLAIM)) ? df::world_site::find(df::global::ui->site_id) : NULL); + if ( out_items.size() != 1 ) + return -1; + + for (size_t a = 0; a < out_items.size(); a++ ) { + out_items[a]->moveToGround(unit->pos.x, unit->pos.y, unit->pos.z); + } + + return out_items[0]->id; +} +