From 0e55e85e9e9a6a4028a29e8c214b69cbc3a54ffe Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sat, 17 Oct 2015 16:15:51 +0300 Subject: Add support for insert cards script. --- src/emap/data/itemd.c | 1 + src/emap/init.c | 2 ++ src/emap/itemdb.c | 4 ++++ src/emap/pc.c | 31 +++++++++++++++++++++++++++++++ src/emap/pc.h | 4 ++++ src/emap/script.c | 14 ++++++++++++++ src/emap/script.h | 1 + src/emap/struct/itemdext.h | 1 + 8 files changed, 58 insertions(+) (limited to 'src/emap') diff --git a/src/emap/data/itemd.c b/src/emap/data/itemd.c index a32c308..c5ae309 100644 --- a/src/emap/data/itemd.c +++ b/src/emap/data/itemd.c @@ -69,6 +69,7 @@ struct ItemdExt *itemd_create(void) data->charmItem = false; data->dropScript = NULL; data->takeScript = NULL; + data->insertScript = NULL; memset(&data->allowedCards, 0, sizeof(data->allowedCards)); return data; } diff --git a/src/emap/init.c b/src/emap/init.c index 19fbc10..08a0a4d 100644 --- a/src/emap/init.c +++ b/src/emap/init.c @@ -160,6 +160,7 @@ HPExport void plugin_init (void) addHookPre("pc->delitem", epc_delitem_pre); addHookPre("pc->dropitem", epc_dropitem_pre); addHookPre("pc->takeitem", epc_takeitem_pre); + addHookPre("pc->insert_card", epc_insert_card_pre); addHookPre("mob->deleteslave_sub", emob_deleteslave_sub); addHookPre("mob->read_db_additional_fields", emob_read_db_additional_fields); addHookPre("npc->parse_unknown_mapflag", enpc_parse_unknown_mapflag); @@ -224,6 +225,7 @@ HPExport void plugin_init (void) addHookPost("pc->dropitem", epc_dropitem_post); addHookPost("pc->takeitem", epc_takeitem_post); addHookPost("pc->can_insert_card_into", epc_can_insert_card_into_post); + addHookPost("pc->insert_card", epc_insert_card_post); langScriptId = script->add_str("Lang"); } diff --git a/src/emap/itemdb.c b/src/emap/itemdb.c index a689613..9b0aabb 100644 --- a/src/emap/itemdb.c +++ b/src/emap/itemdb.c @@ -98,6 +98,8 @@ void eitemdb_readdb_additional_fields(int *itemid, data->dropScript = *str ? script->parse(str, source, -item->nameid, SCRIPT_IGNORE_EXTERNAL_BRACKETS, NULL) : NULL; if (libconfig->setting_lookup_string(it, "OnTakeScript", &str)) data->takeScript = *str ? script->parse(str, source, -item->nameid, SCRIPT_IGNORE_EXTERNAL_BRACKETS, NULL) : NULL; + if (libconfig->setting_lookup_string(it, "OnInsertCardScript", &str)) + data->insertScript = *str ? script->parse(str, source, -item->nameid, SCRIPT_IGNORE_EXTERNAL_BRACKETS, NULL) : NULL; config_setting_t *group = libconfig->setting_get_member(it, "AllowCards"); if (group) @@ -138,4 +140,6 @@ void edestroy_item_data(struct item_data* self, int *free_selfPtr) script->free_code(data->dropScript); if (data->takeScript) script->free_code(data->takeScript); + if (data->insertScript) + script->free_code(data->insertScript); } diff --git a/src/emap/pc.c b/src/emap/pc.c index 705c3dc..9e599ee 100644 --- a/src/emap/pc.c +++ b/src/emap/pc.c @@ -522,3 +522,34 @@ int epc_takeitem_post(int retVal, struct map_session_data *sd, struct flooritem_ } return retVal; } + +int epc_insert_card_pre(struct map_session_data* sd, int *idx_card, int *idx_equip) +{ + if (!sd || *idx_equip < 0 || *idx_equip >= MAX_INVENTORY || + *idx_card < 0 || *idx_card >= MAX_INVENTORY) + { + tempN = 0; + tempId = 0; + tempAmount = 0; + return 0; + } + tempN = *idx_equip; + tempId = sd->status.inventory[*idx_equip].nameid; + tempAmount = sd->status.inventory[*idx_card].nameid; + return 1; +} + +int epc_insert_card_post(int retVal, struct map_session_data* sd, int *idx_card, int *idx_equip) +{ + if (retVal && *idx_equip == tempN && tempId) + { + struct item_data *item = itemdb->search(tempId); + if (!item) + return retVal; + struct ItemdExt *data = itemd_get(item); + if (!data) + return retVal; + script_run_card_script(sd, data->insertScript, tempId, tempAmount); + } + return retVal; +} diff --git a/src/emap/pc.h b/src/emap/pc.h index 3e58cf0..92af4cf 100644 --- a/src/emap/pc.h +++ b/src/emap/pc.h @@ -62,4 +62,8 @@ int epc_takeitem_pre(struct map_session_data *sd, struct flooritem_data *fitem); int epc_takeitem_post(int retVal, struct map_session_data *sd, struct flooritem_data *fitem); +int epc_insert_card_pre(struct map_session_data* sd, int *idx_card, int *idx_equip); + +int epc_insert_card_post(int retVal, struct map_session_data* sd, int *idx_card, int *idx_equip); + #endif // EVOL_MAP_PC diff --git a/src/emap/script.c b/src/emap/script.c index 905bcf5..098fc6e 100644 --- a/src/emap/script.c +++ b/src/emap/script.c @@ -319,6 +319,20 @@ void script_run_item_amount_script(TBL_PC *sd, struct script_code *itemScript, i script->current_item_id = 0; } +void script_run_card_script(TBL_PC *sd, struct script_code *itemScript, int itemId, int cardId) +{ + if (!itemScript) + return; + + script->current_item_id = itemId; + pc->setreg(sd, script->add_str("@itemId"), itemId); + pc->setreg(sd, script->add_str("@cardId"), cardId); + script->run(itemScript, 0, sd->bl.id, npc->fake_nd->bl.id); + pc->setreg(sd, script->add_str("@itemId"), 0); + pc->setreg(sd, script->add_str("@cardId"), 0); + script->current_item_id = 0; +} + uint32 MakeDWord(uint16 word0, uint16 word1) { return ((uint32)(word0)) | ((uint32)(word1 << 0x10)); diff --git a/src/emap/script.h b/src/emap/script.h index e6b8c70..edbd010 100644 --- a/src/emap/script.h +++ b/src/emap/script.h @@ -9,6 +9,7 @@ int eget_val_npcscope_num(struct script_state* st, struct reg_db *n, struct scri void eset_reg_npcscope_str(struct script_state* st, struct reg_db *n, int64 *num, const char* name, const char *str); char *eget_val_npcscope_str(struct script_state* st, struct reg_db *n, struct script_data* data); void script_run_item_amount_script(TBL_PC *sd, struct script_code *itemScript, int itemId, int amount); +void script_run_card_script(TBL_PC *sd, struct script_code *itemScript, int itemId, int cardId); BUILDIN(l); BUILDIN(lg); diff --git a/src/emap/struct/itemdext.h b/src/emap/struct/itemdext.h index 8ce5997..5fd7159 100644 --- a/src/emap/struct/itemdext.h +++ b/src/emap/struct/itemdext.h @@ -36,6 +36,7 @@ struct ItemdExt struct ItemCardExt allowedCards[100]; struct script_code *dropScript; struct script_code *takeScript; + struct script_code *insertScript; bool allowPickup; bool charmItem; -- cgit v1.2.3-60-g2f50