summaryrefslogtreecommitdiff
path: root/src/emap
diff options
context:
space:
mode:
Diffstat (limited to 'src/emap')
-rw-r--r--src/emap/init.c1
-rw-r--r--src/emap/script_buildins.c85
-rw-r--r--src/emap/script_buildins.h1
3 files changed, 87 insertions, 0 deletions
diff --git a/src/emap/init.c b/src/emap/init.c
index a9aaba5..4e63623 100644
--- a/src/emap/init.c
+++ b/src/emap/init.c
@@ -144,6 +144,7 @@ HPExport void plugin_init (void)
addScriptCommand("downrefindex", "ii", downRefIndex);
addScriptCommand("successrefindex", "ii", successRefIndex);
addScriptCommand("successremovecardsindex", "i", successRemoveCardsIndex);
+ addScriptCommand("failedremovecardsindex", "ii", failedRemoveCardsIndex);
addScriptCommand("isstr", "v", isStr);
addScriptCommand("setbgteam", "ii", setBgTeam);
addScriptCommand("checknpccell", "siii", checkNpcCell);
diff --git a/src/emap/script_buildins.c b/src/emap/script_buildins.c
index cbd246b..d62d4bc 100644
--- a/src/emap/script_buildins.c
+++ b/src/emap/script_buildins.c
@@ -1247,6 +1247,91 @@ BUILDIN(successRemoveCardsIndex)
return true;
}
+/// <type>=0 : will destroy both the item and the cards.
+/// <type>=1 : will keep the item, but destroy the cards.
+/// <type>=2 : will keep the cards, but destroy the item.
+/// <type>=? : will just display the failure effect.
+BUILDIN(failedRemoveCardsIndex)
+{
+ int i = -1, c, cardflag = 0;
+
+ getSD()
+ getInventoryIndex(2)
+
+ if (sd->status.inventory[n].nameid <= 0 || sd->status.inventory[n].amount <= 0)
+ return false;
+
+ i = n;
+
+ int typefail = script_getnum(st, 3);
+
+ if (itemdb_isspecial(sd->status.inventory[i].card[0]))
+ return true;
+
+ for (c = sd->inventory_data[i]->slot - 1; c >= 0; --c)
+ {
+ if (sd->status.inventory[i].card[c] && itemdb_type(sd->status.inventory[i].card[c]) == IT_CARD)
+ {
+ cardflag = 1;
+
+ if (typefail == 2)
+ { // add cards to inventory, clear
+ int flag;
+ struct item item_tmp;
+
+ memset(&item_tmp, 0, sizeof(item_tmp));
+
+ item_tmp.nameid = sd->status.inventory[i].card[c];
+ item_tmp.identify = 1;
+
+ if((flag = pc->additem(sd, &item_tmp, 1, LOG_TYPE_SCRIPT)))
+ {
+ clif->additem(sd, 0, 0, flag);
+ map->addflooritem(&sd->bl, &item_tmp, 1, sd->bl.m, sd->bl.x, sd->bl.y, 0, 0, 0, 0);
+ }
+ }
+ }
+ }
+
+ if (cardflag == 1)
+ {
+ if (typefail == 0 || typefail == 2)
+ {
+ // destroy the item
+ pc->delitem(sd, i, 1, 0, DELITEM_FAILREFINE, LOG_TYPE_SCRIPT);
+ }
+ else if (typefail == 1)
+ {
+ // destroy the card
+ int flag, j;
+ struct item item_tmp;
+
+ memset(&item_tmp, 0, sizeof(item_tmp));
+
+ item_tmp.nameid = sd->status.inventory[i].nameid;
+ item_tmp.identify = 1;
+ item_tmp.refine = sd->status.inventory[i].refine;
+ item_tmp.attribute = sd->status.inventory[i].attribute;
+ item_tmp.expire_time = sd->status.inventory[i].expire_time;
+ item_tmp.bound = sd->status.inventory[i].bound;
+
+ for (j = sd->inventory_data[i]->slot; j < MAX_SLOTS; j++)
+ item_tmp.card[j] = sd->status.inventory[i].card[j];
+
+ pc->delitem(sd, i, 1, 0, DELITEM_FAILREFINE, LOG_TYPE_SCRIPT);
+
+ if((flag = pc->additem(sd, &item_tmp, 1, LOG_TYPE_SCRIPT)))
+ {
+ clif->additem(sd, 0, 0, flag);
+ map->addflooritem(&sd->bl, &item_tmp, 1, sd->bl.m, sd->bl.x, sd->bl.y, 0, 0, 0, 0);
+ }
+ }
+ clif->misceffect(&sd->bl, 2);
+ }
+
+ return true;
+}
+
// return paramater type
// 0 - int
// 1 - string
diff --git a/src/emap/script_buildins.h b/src/emap/script_buildins.h
index b3c3598..1d83813 100644
--- a/src/emap/script_buildins.h
+++ b/src/emap/script_buildins.h
@@ -48,6 +48,7 @@ BUILDIN(failedRefIndex);
BUILDIN(downRefIndex);
BUILDIN(successRefIndex);
BUILDIN(successRemoveCardsIndex);
+BUILDIN(failedRemoveCardsIndex);
BUILDIN(isStr);
BUILDIN(npcSit);
BUILDIN(npcStand);