diff options
author | gumi <git@gumi.ca> | 2020-08-22 14:03:02 +0000 |
---|---|---|
committer | gumi <git@gumi.ca> | 2020-08-22 14:03:02 +0000 |
commit | f47ed38b0e286c059d7f4ca9a36676788a6177e9 (patch) | |
tree | f8d1004e1ed1a144ec4d51f5ec067ab85be291f6 /src/emap | |
parent | b5cc367814b76f960f7366352a2a23d5cb1e7ab9 (diff) | |
parent | 6ecfee0a8a9a84ccb659bd41dfb9f108eeffb9e7 (diff) | |
download | evol-hercules-f47ed38b0e286c059d7f4ca9a36676788a6177e9.tar.gz evol-hercules-f47ed38b0e286c059d7f4ca9a36676788a6177e9.tar.bz2 evol-hercules-f47ed38b0e286c059d7f4ca9a36676788a6177e9.tar.xz evol-hercules-f47ed38b0e286c059d7f4ca9a36676788a6177e9.zip |
Merge branch 'card-group' into 'master'
Allow to use item groups in AllowCards
See merge request evol/evol-hercules!27
Diffstat (limited to 'src/emap')
-rw-r--r-- | src/emap/init.c | 1 | ||||
-rw-r--r-- | src/emap/pc.c | 55 | ||||
-rw-r--r-- | src/emap/pc.h | 5 | ||||
-rw-r--r-- | src/emap/script.c | 6 |
4 files changed, 64 insertions, 3 deletions
diff --git a/src/emap/init.c b/src/emap/init.c index 19eaea5..a4902ba 100644 --- a/src/emap/init.c +++ b/src/emap/init.c @@ -270,6 +270,7 @@ HPExport void plugin_init (void) addHookPre(battle, weapon_attack, ebattle_weapon_attack_pre); addHookPre(bg, team_warp, ebg_team_warp_pre); addHookPre(pc, can_Adopt, epc_can_Adopt_pre); + addHookPre(pc, additem, epc_additem_pre); addHookPre(pc, adoption, epc_adoption_pre); addHookPre(pc, readparam, epc_readparam_pre); addHookPre(pc, setparam, epc_setparam_pre); diff --git a/src/emap/pc.c b/src/emap/pc.c index 21e59aa..68b892c 100644 --- a/src/emap/pc.c +++ b/src/emap/pc.c @@ -461,6 +461,29 @@ int epc_setnewpc_post(int retVal, return retVal; } +int epc_additem_pre(struct map_session_data **sdPtr __attribute__ ((unused)), + const struct item **item_dataPtr, + int *amountPtr __attribute__ ((unused)), + e_log_pick_type *log_typePtr __attribute__ ((unused))) +{ +#ifndef IT_VIRTUAL + return 0; +#endif + + const struct item *item_data = *item_dataPtr; + + if (item_data != NULL) { + struct item_data *data = itemdb->search(item_data->nameid); + + if (data != NULL && data->type == IT_VIRTUAL) { + hookStop(); + return 1; + } + } + + return 0; +} + int epc_additem_post(int retVal, struct map_session_data *sd, const struct item *item_data, @@ -542,11 +565,28 @@ bool epc_can_insert_card_into_post(bool retVal, const int newCardId = sd->status.inventory[idx_card].nameid; int cardAmountLimit = 0; + struct item_group *card_group = NULL; + for (f = 0; f < sz; f ++) { struct ItemCardExt *const card = &VECTOR_INDEX(data->allowedCards, f); - if (card->id == newCardId) - { + struct item_data *card_itemdata = itemdb->search(card->id); + + if (card_itemdata->group != NULL) { + card_group = card_itemdata->group; + + for (int c = 0; c < card_group->qty; c++) { + if (card_group->nameid[c] == newCardId) { + cardAmountLimit = card->amount; + break; + } + } + + if (cardAmountLimit) { + // we found it in a group, so break + break; + } + } else if (card->id == newCardId) { cardAmountLimit = card->amount; break; } @@ -559,8 +599,17 @@ bool epc_can_insert_card_into_post(bool retVal, for (f = 0; f < slots; f ++) { const int cardId = sd->status.inventory[idx_equip].card[f]; - if (cardId == newCardId) + if (cardId == newCardId) { cardsAmount ++; + } else if (card_group != NULL) { + // use the same counter for all cards that belong to the group + for (int c = 0; c < card_group->qty; c++) { + if (card_group->nameid[c] == cardId) { + cardsAmount++; + break; + } + } + } } return cardAmountLimit > cardsAmount; } diff --git a/src/emap/pc.h b/src/emap/pc.h index db1a912..1cbd3c1 100644 --- a/src/emap/pc.h +++ b/src/emap/pc.h @@ -63,6 +63,11 @@ int epc_setnewpc_post(int retVal, int sex, int fd); +int epc_additem_pre(struct map_session_data **sdPtr, + const struct item **item_dataPtr, + int *amountPtr, + e_log_pick_type *log_typePtr); + int epc_additem_post(int retVal, struct map_session_data *sd, const struct item *item_data, diff --git a/src/emap/script.c b/src/emap/script.c index d2a64e4..778ebe0 100644 --- a/src/emap/script.c +++ b/src/emap/script.c @@ -109,6 +109,12 @@ void escript_hardcoded_constants_pre(void) script->set_constant("NPCSUBTYPE_SCRIPT", SCRIPT, false, false); script->set_constant("NPCSUBTYPE_CASHSHOP", CASHSHOP, false, false); script->set_constant("NPCSUBTYPE_TOMB", TOMB, false, false); + + // new item types +#ifdef IT_VIRTUAL + script->set_constant("IT_VIRTUAL", IT_VIRTUAL, false, false); +#endif + script->constdb_comment(NULL); eskill_addskill_conststants(); } |