diff --git a/res/e3a/items.xml b/res/e3a/items.xml
index 7d7e6b286..fa3af4b41 100644
--- a/res/e3a/items.xml
+++ b/res/e3a/items.xml
@@ -81,9 +81,7 @@
- -
-
-
+
diff --git a/res/eressea/items.xml b/res/eressea/items.xml
index 69f84c890..c0b8b5126 100644
--- a/res/eressea/items.xml
+++ b/res/eressea/items.xml
@@ -17,21 +17,15 @@
- -
-
-
+
- -
-
-
+
- -
-
-
+
@@ -44,23 +38,17 @@
- -
-
-
+
- -
-
-
+
- -
-
-
+
diff --git a/src/helpers.c b/src/helpers.c
index ad222a0c6..e5bdf6ff9 100644
--- a/src/helpers.c
+++ b/src/helpers.c
@@ -490,14 +490,18 @@ static int lua_equipmentcallback(const struct equipment *eq, unit * u)
}
/** callback for an item-use function written in lua. */
-int
-lua_useitem(struct unit *u, const struct item_type *itype, int amount,
+static int
+use_item_lua(struct unit *u, const struct item_type *itype, int amount,
struct order *ord)
{
lua_State *L = (lua_State *)global.vm_state;
int result = 0;
char fname[64];
+ if (itype->use) {
+ return itype->use(u, itype, amount, ord);
+ }
+
strlcpy(fname, "use_", sizeof(fname));
strlcat(fname, itype->rtype->_name, sizeof(fname));
@@ -551,7 +555,6 @@ void register_tolua_helpers(void)
register_function((pf_generic)lua_callspell, TOLUA_CAST "lua_castspell");
register_function((pf_generic)lua_initfamiliar,
TOLUA_CAST "lua_initfamiliar");
- register_item_use(&lua_useitem, TOLUA_CAST "lua_useitem");
register_function((pf_generic)lua_getresource,
TOLUA_CAST "lua_getresource");
register_function((pf_generic)lua_canuse_item,
@@ -565,6 +568,7 @@ void register_tolua_helpers(void)
register_function((pf_generic)lua_maintenance,
TOLUA_CAST "lua_maintenance");
+ item_use_fun = use_item_lua;
res_produce_fun = produce_resource_lua;
res_limit_fun = limit_resource_lua;
register_item_give(lua_giveitem, TOLUA_CAST "lua_giveitem");
diff --git a/src/kernel/item.h b/src/kernel/item.h
index a2e588318..b0bc10cd8 100644
--- a/src/kernel/item.h
+++ b/src/kernel/item.h
@@ -107,6 +107,7 @@ extern "C" {
#define ITF_BIG 0x0008 /* big item, e.g. does not fit in a bag of holding */
#define ITF_ANIMAL 0x0010 /* an animal */
#define ITF_VEHICLE 0x0020 /* a vehicle, drawn by two animals */
+#define ITF_CANUSE 0x0040 /* can be used with use_item_fun callout */
/* error codes for item_type::use */
#define ECUSTOM -1
diff --git a/src/kernel/resources.c b/src/kernel/resources.c
index f99783763..10cb2bab6 100644
--- a/src/kernel/resources.c
+++ b/src/kernel/resources.c
@@ -213,6 +213,8 @@ struct rawmaterial_type *rmt_create(struct resource_type *rtype)
return rmtype;
}
+int(*item_use_fun)(struct unit *u, const struct item_type *itype, int amount,
+ struct order *ord);
int(*res_limit_fun)(const struct region *, const struct resource_type *);
void(*res_produce_fun)(struct region *, const struct resource_type *, int);
diff --git a/src/kernel/resources.h b/src/kernel/resources.h
index b448425f4..7f48fa0dd 100644
--- a/src/kernel/resources.h
+++ b/src/kernel/resources.h
@@ -74,7 +74,8 @@ extern "C" {
extern int(*res_limit_fun)(const struct region *, const struct resource_type *);
extern void(*res_produce_fun)(struct region *, const struct resource_type *, int);
-
+ extern int (*item_use_fun)(struct unit *, const struct item_type *, int amount,
+ struct order *ord);
int limit_resource(const struct region *r, const struct resource_type *rtype);
void produce_resource(struct region *r, const struct resource_type *rtype, int amount);
diff --git a/src/kernel/xmlreader.c b/src/kernel/xmlreader.c
index f5e45dd5c..6f62738e3 100644
--- a/src/kernel/xmlreader.c
+++ b/src/kernel/xmlreader.c
@@ -767,6 +767,8 @@ static item_type *xml_readitem(xmlXPathContextPtr xpath, resource_type * rtype)
if (xml_bvalue(node, "cursed", false))
flags |= ITF_CURSED;
+ if (xml_bvalue(node, "use", false))
+ flags |= ITF_CANUSE;
if (xml_bvalue(node, "notlost", false))
flags |= ITF_NOTLOST;
if (xml_bvalue(node, "herb", false))
@@ -849,6 +851,7 @@ static item_type *xml_readitem(xmlXPathContextPtr xpath, resource_type * rtype)
struct order *))fun;
}
else if (strcmp((const char *)propValue, "use") == 0) {
+ itype->flags |= ITF_CANUSE;
itype->use =
(int(*)(struct unit *, const struct item_type *, int,
struct order *))fun;
diff --git a/src/laws.c b/src/laws.c
index 09b1439c0..0d0e53110 100644
--- a/src/laws.c
+++ b/src/laws.c
@@ -3252,8 +3252,8 @@ static int use_item(unit * u, const item_type * itype, int amount, struct order
return ENOITEM;
}
- if (itype->use) {
- int result = itype->use(u, itype, amount, ord);
+ if (itype->flags & ITF_CANUSE) {
+ int result = item_use_fun(u, itype, amount, ord);
if (result > 0) {
use_pooled(u, itype->rtype, GET_DEFAULT, result);
}