diff options
author | Haruna <haru@dotalux.com> | 2015-08-11 02:36:37 +0200 |
---|---|---|
committer | Haruna <haru@dotalux.com> | 2015-08-11 02:36:37 +0200 |
commit | e556fc1b65905ad186de70a9774b8b0aceee9bc0 (patch) | |
tree | ae7b0364ce80f7a479b3a10b6221b925f6e709ed | |
parent | 5ad96bcc2af2a5a76348fca87e52a0f038461808 (diff) | |
parent | 30bb5f0fb8c45b518993527fad628754c2723581 (diff) | |
download | hercules-e556fc1b65905ad186de70a9774b8b0aceee9bc0.tar.gz hercules-e556fc1b65905ad186de70a9774b8b0aceee9bc0.tar.bz2 hercules-e556fc1b65905ad186de70a9774b8b0aceee9bc0.tar.xz hercules-e556fc1b65905ad186de70a9774b8b0aceee9bc0.zip |
Merge pull request #625 from 4144/scripthooks
Add scripts invoking hooks
-rw-r--r-- | src/map/instance.c | 2 | ||||
-rw-r--r-- | src/map/npc.c | 22 | ||||
-rw-r--r-- | src/map/npc_chat.c | 2 | ||||
-rw-r--r-- | src/map/pc.c | 34 | ||||
-rw-r--r-- | src/map/pet.c | 2 | ||||
-rw-r--r-- | src/map/script.c | 59 | ||||
-rw-r--r-- | src/map/script.h | 8 | ||||
-rw-r--r-- | src/map/skill.c | 4 | ||||
-rw-r--r-- | src/map/status.c | 18 |
9 files changed, 103 insertions, 48 deletions
diff --git a/src/map/instance.c b/src/map/instance.c index f5688d02c..92acd1bbb 100644 --- a/src/map/instance.c +++ b/src/map/instance.c @@ -357,7 +357,7 @@ int instance_init_npc(struct block_list* bl, va_list args) { snprintf(evname, EVENT_NAME_LENGTH, "%s::OnInstanceInit", nd->exname); if( ( ev = strdb_get(npc->ev_db, evname) ) ) - script->run(ev->nd->u.scr.script, ev->pos, 0, ev->nd->bl.id); + script->run_npc(ev->nd->u.scr.script, ev->pos, 0, ev->nd->bl.id); return 1; } diff --git a/src/map/npc.c b/src/map/npc.c index 6acb93266..8733ee7e4 100644 --- a/src/map/npc.c +++ b/src/map/npc.c @@ -396,7 +396,7 @@ void npc_event_doall_sub(void *key, void *data, va_list ap) npc->event_sub(map->id2sd(rid), ev, buf); } else { - script->run(ev->nd->u.scr.script, ev->pos, rid, ev->nd->bl.id); + script->run_npc(ev->nd->u.scr.script, ev->pos, rid, ev->nd->bl.id); } (*c)++; } @@ -411,7 +411,7 @@ int npc_event_do(const char* name) else { struct event_data *ev = strdb_get(npc->ev_db, name); if (ev) { - script->run(ev->nd->u.scr.script, ev->pos, 0, ev->nd->bl.id); + script->run_npc(ev->nd->u.scr.script, ev->pos, 0, ev->nd->bl.id); return 1; } } @@ -596,7 +596,7 @@ int npc_timerevent(int tid, int64 tick, int id, intptr_t data) { } // Run the script - script->run(nd->u.scr.script,te->pos,nd->u.scr.rid,nd->bl.id); + script->run_npc(nd->u.scr.script,te->pos,nd->u.scr.rid,nd->bl.id); nd->u.scr.rid = old_rid; // Attached-rid should be restored anyway. if( sd ) @@ -745,7 +745,7 @@ void npc_timerevent_quit(struct map_session_data* sd) nd->u.scr.timer = ted->time; //Execute label - script->run(nd->u.scr.script,ev->pos,sd->bl.id,nd->bl.id); + script->run_npc(nd->u.scr.script,ev->pos,sd->bl.id,nd->bl.id); //Restore previous data. nd->u.scr.rid = old_rid; @@ -822,7 +822,7 @@ int npc_event_sub(struct map_session_data* sd, struct event_data* ev, const char npc->event_dequeue(sd); return 2; } - script->run(ev->nd->u.scr.script,ev->pos,sd->bl.id,ev->nd->bl.id); + script->run_npc(ev->nd->u.scr.script,ev->pos,sd->bl.id,ev->nd->bl.id); return 0; } @@ -1067,7 +1067,7 @@ int npc_touch_areanpc2(struct mob_data *md) break; // No OnTouchNPC Event md->areanpc_id = map->list[m].npc[i]->bl.id; id = md->bl.id; // Stores Unique ID - script->run(ev->nd->u.scr.script, ev->pos, md->bl.id, ev->nd->bl.id); + script->run_npc(ev->nd->u.scr.script, ev->pos, md->bl.id, ev->nd->bl.id); if( map->id2md(id) == NULL ) return 1; // Not Warped, but killed break; } @@ -1255,7 +1255,7 @@ int npc_click(struct map_session_data* sd, struct npc_data* nd) if( !npc->trader_open(sd,nd) ) return 1; } else - script->run(nd->u.scr.script,0,sd->bl.id,nd->bl.id); + script->run_npc(nd->u.scr.script,0,sd->bl.id,nd->bl.id); break; case TOMB: npc->run_tomb(sd,nd); @@ -1654,7 +1654,7 @@ void npc_trader_count_funds(struct npc_data *nd, struct map_session_data *sd) { snprintf(evname, EVENT_NAME_LENGTH, "%s::OnCountFunds",nd->exname); if ( (ev = strdb_get(npc->ev_db, evname)) ) - script->run(ev->nd->u.scr.script, ev->pos, sd->bl.id, ev->nd->bl.id); + script->run_npc(ev->nd->u.scr.script, ev->pos, sd->bl.id, ev->nd->bl.id); else ShowError("npc_trader_count_funds: '%s' event '%s' not found, operation failed\n",nd->exname,evname); @@ -1682,7 +1682,7 @@ bool npc_trader_pay(struct npc_data *nd, struct map_session_data *sd, int price, pc->setreg(sd,script->add_str("@price"),price); pc->setreg(sd,script->add_str("@points"),points); - script->run(ev->nd->u.scr.script, ev->pos, sd->bl.id, ev->nd->bl.id); + script->run_npc(ev->nd->u.scr.script, ev->pos, sd->bl.id, ev->nd->bl.id); } else ShowError("npc_trader_pay: '%s' event '%s' not found, operation failed\n",nd->exname,evname); @@ -3037,7 +3037,7 @@ const char* npc_parse_script(char* w1, char* w2, char* w3, char* w4, const char* if( ( ev = (struct event_data*)strdb_get(npc->ev_db, evname) ) ) { //Execute OnInit - script->run(nd->u.scr.script,ev->pos,0,nd->bl.id); + script->run_npc(nd->u.scr.script,ev->pos,0,nd->bl.id); } } @@ -3208,7 +3208,7 @@ const char* npc_parse_duplicate(char* w1, char* w2, char* w3, char* w4, const ch if( ( ev = (struct event_data*)strdb_get(npc->ev_db, evname) ) ) { //Execute OnInit - script->run(nd->u.scr.script,ev->pos,0,nd->bl.id); + script->run_npc(nd->u.scr.script,ev->pos,0,nd->bl.id); } } diff --git a/src/map/npc_chat.c b/src/map/npc_chat.c index 3fe379f36..67b78dcea 100644 --- a/src/map/npc_chat.c +++ b/src/map/npc_chat.c @@ -371,7 +371,7 @@ int npc_chat_sub(struct block_list* bl, va_list ap) } // run the npc script - script->run(nd->u.scr.script,lst[i].pos,sd->bl.id,nd->bl.id); + script->run_npc(nd->u.scr.script,lst[i].pos,sd->bl.id,nd->bl.id); return 0; } } diff --git a/src/map/pc.c b/src/map/pc.c index 5abf1050f..ec74e2da8 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -4882,7 +4882,6 @@ int pc_isUseitem(struct map_session_data *sd,int n) int pc_useitem(struct map_session_data *sd,int n) { int64 tick = timer->gettick(); int amount, nameid, i; - struct script_code *item_script; nullpo_ret(sd); @@ -4994,7 +4993,6 @@ int pc_useitem(struct map_session_data *sd,int n) { sd->catch_target_class = -1; amount = sd->status.inventory[n].amount; - item_script = sd->inventory_data[n]->script; //Check if the item is to be consumed immediately [Skotlex] if (sd->inventory_data[n]->flag.delay_consume || sd->inventory_data[n]->flag.keepafteruse) clif->useitemack(sd,n,amount,true); @@ -5006,26 +5004,23 @@ int pc_useitem(struct map_session_data *sd,int n) { clif->useitemack(sd, n, 0, false); } } + if(sd->status.inventory[n].card[0]==CARD0_CREATE && pc->famerank(MakeDWord(sd->status.inventory[n].card[2],sd->status.inventory[n].card[3]), MAPID_ALCHEMIST)) { - script->potion_flag = 2; // Famous player's potions have 50% more efficiency - if (sd->sc.data[SC_SOULLINK] && sd->sc.data[SC_SOULLINK]->val2 == SL_ROGUE) - script->potion_flag = 3; //Even more effective potions. + script->potion_flag = 2; // Famous player's potions have 50% more efficiency + if (sd->sc.data[SC_SOULLINK] && sd->sc.data[SC_SOULLINK]->val2 == SL_ROGUE) + script->potion_flag = 3; //Even more effective potions. } //Update item use time. sd->canuseitem_tick = tick + battle_config.item_use_interval; if( itemdb_iscashfood(nameid) ) sd->canusecashfood_tick = tick + battle_config.cashfood_use_interval; - - script->current_item_id = nameid; - - script->run(item_script,0,sd->bl.id,npc->fake_nd->bl.id); - - script->current_item_id = 0; + + script->run_use_script(sd, sd->inventory_data[n], npc->fake_nd->bl.id); + script->potion_flag = 0; - return 1; } @@ -9642,7 +9637,8 @@ int pc_equipitem(struct map_session_data *sd,int n,int req_pos) //OnEquip script [Skotlex] if (id->equip_script) - script->run(id->equip_script,0,sd->bl.id,npc->fake_nd->bl.id); + script->run_item_equip_script(sd, id, npc->fake_nd->bl.id); + if(itemdb_isspecial(sd->status.inventory[n].card[0])) ; //No cards else { @@ -9651,8 +9647,8 @@ int pc_equipitem(struct map_session_data *sd,int n,int req_pos) if (!sd->status.inventory[n].card[i]) continue; if ( ( data = itemdb->exists(sd->status.inventory[n].card[i]) ) != NULL ) { - if( data->equip_script ) - script->run(data->equip_script,0,sd->bl.id,npc->fake_nd->bl.id); + if (data->equip_script) + script->run_item_equip_script(sd, data, npc->fake_nd->bl.id); } } } @@ -9819,10 +9815,10 @@ int pc_unequipitem(struct map_session_data *sd,int n,int flag) if ( battle_config.unequip_restricted_equipment & 1 ) { ARR_FIND(0, map->list[sd->bl.m].zone->disabled_items_count, i, map->list[sd->bl.m].zone->disabled_items[i] == sd->status.inventory[n].nameid); if ( i == map->list[sd->bl.m].zone->disabled_items_count ) - script->run(sd->inventory_data[n]->unequip_script,0,sd->bl.id,npc->fake_nd->bl.id); + script->run_item_unequip_script(sd, sd->inventory_data[n], npc->fake_nd->bl.id); } else - script->run(sd->inventory_data[n]->unequip_script,0,sd->bl.id,npc->fake_nd->bl.id); + script->run_item_unequip_script(sd, sd->inventory_data[n], npc->fake_nd->bl.id); } if(itemdb_isspecial(sd->status.inventory[n].card[0])) ; //No cards @@ -9838,10 +9834,10 @@ int pc_unequipitem(struct map_session_data *sd,int n,int flag) int j; ARR_FIND(0, map->list[sd->bl.m].zone->disabled_items_count, j, map->list[sd->bl.m].zone->disabled_items[j] == sd->status.inventory[n].card[i]); if ( j == map->list[sd->bl.m].zone->disabled_items_count ) - script->run(data->unequip_script,0,sd->bl.id,npc->fake_nd->bl.id); + script->run_item_unequip_script(sd, data, npc->fake_nd->bl.id); } else - script->run(data->unequip_script,0,sd->bl.id,npc->fake_nd->bl.id); + script->run_item_unequip_script(sd, data, npc->fake_nd->bl.id); } } diff --git a/src/map/pet.c b/src/map/pet.c index 2379ec984..b612a9505 100644 --- a/src/map/pet.c +++ b/src/map/pet.c @@ -367,7 +367,7 @@ int pet_data_init(struct map_session_data *sd, struct s_pet *petinfo) pd->state.skillbonus = 0; if( battle_config.pet_status_support ) - script->run(pet->db[i].pet_script,0,sd->bl.id,0); + script->run_pet(pet->db[i].pet_script,0,sd->bl.id,0); if( pd->petDB ) { if( pd->petDB->equip_script ) diff --git a/src/map/script.c b/src/map/script.c index 4c669bf20..23c6af0f8 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -4035,7 +4035,7 @@ int run_func(struct script_state *st) /*========================================== * script execution *------------------------------------------*/ -void run_script(struct script_code *rootscript,int pos,int rid,int oid) { +void run_script(struct script_code *rootscript, int pos, int rid, int oid) { struct script_state *st; if( rootscript == NULL || pos < 0 ) @@ -10453,7 +10453,7 @@ BUILDIN(itemeffect) { } } - script->run( item_data->script, 0, sd->bl.id, nd->bl.id ); + script->run_use_script(sd, item_data, nd->bl.id); return true; } @@ -19834,6 +19834,54 @@ bool script_hp_add(char *name, char *args, bool (*func)(struct script_state *st) return script->add_builtin(&buildin, true); } +void script_run_use_script(struct map_session_data *sd, struct item_data *data, int oid) __attribute__((nonnull (1))); + +/** + * Run use script for item. + * + * @param sd player session data. Must be correct and checked before. + * @param n item index in inventory. Must be correct and checked before. + * @param oid npc id. Can be also 0 or fake npc id. + */ +void script_run_use_script(struct map_session_data *sd, struct item_data *data, int oid) +{ + script->current_item_id = data->nameid; + script->run(data->script, 0, sd->bl.id, oid); + script->current_item_id = 0; +} + +void script_run_item_equip_script(struct map_session_data *sd, struct item_data *data, int oid) __attribute__((nonnull (1, 2))); + +/** + * Run item equip script for item. + * + * @param sd player session data. Must be correct and checked before. + * @param data equipped item data. Must be correct and checked before. + * @param oid npc id. Can be also 0 or fake npc id. + */ +void script_run_item_equip_script(struct map_session_data *sd, struct item_data *data, int oid) +{ + script->current_item_id = data->nameid; + script->run(data->equip_script, 0, sd->bl.id, oid); + script->current_item_id = 0; +} + +void script_run_item_unequip_script(struct map_session_data *sd, struct item_data *data, int oid) __attribute__((nonnull (1, 2))); + +/** + * Run item unequip script for item. + * + * @param sd player session data. Must be correct and checked before. + * @param data unequipped item data. Must be correct and checked before. + * @param oid npc id. Can be also 0 or fake npc id. + */ +void script_run_item_unequip_script(struct map_session_data *sd, struct item_data *data, int oid) +{ + script->current_item_id = data->nameid; + script->run(data->unequip_script, 0, sd->bl.id, oid); + script->current_item_id = 0; +} + #define BUILDIN_DEF(x,args) { buildin_ ## x , #x , args, false } #define BUILDIN_DEF2(x,x2,args) { buildin_ ## x , x2 , args, false } #define BUILDIN_DEF_DEPRECATED(x,args) { buildin_ ## x , #x , args, true } @@ -20613,6 +20661,8 @@ void script_defaults(void) { script->get_constant = script_get_constant; script->label_add = script_label_add; script->run = run_script; + script->run_npc = run_script; + script->run_pet = run_script; script->run_main = run_script_main; script->run_timer = run_script_timer; script->set_var = set_var; @@ -20778,5 +20828,8 @@ void script_defaults(void) { script->add_language = script_add_language; script->get_translation_file_name = script_get_translation_file_name; script->parser_clean_leftovers = script_parser_clean_leftovers; - + + script->run_use_script = script_run_use_script; + script->run_item_equip_script = script_run_item_equip_script; + script->run_item_unequip_script = script_run_item_unequip_script; } diff --git a/src/map/script.h b/src/map/script.h index 93d60f416..b3d2a3c8a 100644 --- a/src/map/script.h +++ b/src/map/script.h @@ -19,6 +19,7 @@ * Declarations **/ struct eri; +struct item_data; /** * Defines @@ -636,7 +637,9 @@ struct script_interface { void (*set_constant2) (const char *name, int value, bool isparameter); bool (*get_constant) (const char* name, int* value); void (*label_add)(int key, int pos); - void (*run) (struct script_code *rootscript,int pos,int rid,int oid); + void (*run) (struct script_code *rootscript, int pos, int rid, int oid); + void (*run_npc) (struct script_code *rootscript, int pos, int rid, int oid); + void (*run_pet) (struct script_code *rootscript, int pos, int rid, int oid); void (*run_main) (struct script_state *st); int (*run_timer) (int tid, int64 tick, int id, intptr_t data); int (*set_var) (struct map_session_data *sd, char *name, void *val); @@ -765,6 +768,9 @@ struct script_interface { uint8 (*add_language) (const char *name); const char *(*get_translation_file_name) (const char *file); void (*parser_clean_leftovers) (void); + void (*run_use_script) (struct map_session_data *sd, struct item_data *data, int oid); + void (*run_item_equip_script) (struct map_session_data *sd, struct item_data *data, int oid); + void (*run_item_unequip_script) (struct map_session_data *sd, struct item_data *data, int oid); }; struct script_interface *script; diff --git a/src/map/skill.c b/src/map/skill.c index f2154aa22..e3f85f8d1 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -6858,7 +6858,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin script->potion_flag = 1; script->potion_hp = script->potion_sp = script->potion_per_hp = script->potion_per_sp = 0; script->potion_target = bl->id; - script->run(sd->inventory_data[i]->script,0,sd->bl.id,0); + script->run_use_script(sd, sd->inventory_data[i], 0); script->potion_flag = script->potion_target = 0; if( sd->sc.data[SC_SOULLINK] && sd->sc.data[SC_SOULLINK]->val2 == SL_ALCHEMIST ) bonus += sd->status.base_level; @@ -10539,7 +10539,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui script->potion_flag = 1; script->potion_hp = 0; script->potion_sp = 0; - script->run(sd->inventory_data[j]->script,0,sd->bl.id,0); + script->run_use_script(sd, sd->inventory_data[j], 0); script->potion_flag = 0; //Apply skill bonuses i = pc->checkskill(sd,CR_SLIMPITCHER)*10 diff --git a/src/map/status.c b/src/map/status.c index b513c6975..e70fb1eb1 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -2267,7 +2267,7 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt) { if (opt&SCO_FIRST && sd->inventory_data[index]->equip_script) { //Execute equip-script on login - script->run(sd->inventory_data[index]->equip_script,0,sd->bl.id,0); + script->run_item_equip_script(sd, sd->inventory_data[index], 0); if (!calculating) return 1; } @@ -2308,10 +2308,10 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt) { if(sd->inventory_data[index]->script) { if (wd == &sd->left_weapon) { sd->state.lr_flag = 1; - script->run(sd->inventory_data[index]->script,0,sd->bl.id,0); + script->run_use_script(sd, sd->inventory_data[index], 0); sd->state.lr_flag = 0; } else - script->run(sd->inventory_data[index]->script,0,sd->bl.id,0); + script->run_use_script(sd, sd->inventory_data[index], 0); if (!calculating) //Abort, script->run retriggered this. [Skotlex] return 1; } @@ -2334,7 +2334,7 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt) { if(sd->inventory_data[index]->script) { if( i == EQI_HAND_L ) //Shield sd->state.lr_flag = 3; - script->run(sd->inventory_data[index]->script,0,sd->bl.id,0); + script->run_use_script(sd, sd->inventory_data[index], 0); if( i == EQI_HAND_L ) //Shield sd->state.lr_flag = 0; if (!calculating) //Abort, script->run retriggered this. [Skotlex] @@ -2350,7 +2350,7 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt) { sd->bonus.arrow_atk += sd->inventory_data[index]->atk; sd->state.lr_flag = 2; if( !itemdb_is_GNthrowable(sd->inventory_data[index]->nameid) ) //don't run scripts on throwable items - script->run(sd->inventory_data[index]->script,0,sd->bl.id,0); + script->run_use_script(sd, sd->inventory_data[index], 0); sd->state.lr_flag = 0; if (!calculating) //Abort, script->run retriggered status_calc_pc. [Skotlex] return 1; @@ -2428,7 +2428,7 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt) { continue; if(opt&SCO_FIRST && data->equip_script) {//Execute equip-script on login - script->run(data->equip_script,0,sd->bl.id,0); + script->run_item_equip_script(sd, data, 0); if (!calculating) return 1; } @@ -2438,10 +2438,10 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt) { if(i == EQI_HAND_L && sd->status.inventory[index].equip == EQP_HAND_L) { //Left hand status. sd->state.lr_flag = 1; - script->run(data->script,0,sd->bl.id,0); + script->run_use_script(sd, data, 0); sd->state.lr_flag = 0; } else - script->run(data->script,0,sd->bl.id,0); + script->run_use_script(sd, data, 0); if (!calculating) //Abort, script->run his function. [Skotlex] return 1; } @@ -2451,7 +2451,7 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt) { if( sc->count && sc->data[SC_ITEMSCRIPT] ) { struct item_data *data = itemdb->exists(sc->data[SC_ITEMSCRIPT]->val1); if( data && data->script ) - script->run(data->script,0,sd->bl.id,0); + script->run_use_script(sd, data, 0); } status->calc_pc_additional(sd, opt); |