From 3e1b9de2a8a106d9471abbd1b232078eae268fbc Mon Sep 17 00:00:00 2001 From: shennetsind Date: Sun, 27 Oct 2013 19:27:09 -0200 Subject: Fixed Bug #7418 Item rentals now take place after status changes arrive, guaranteeing that items that expired cancel their effects properly. Thanks to kyeme, malufett. http://hercules.ws/board/tracker/issue-7418-setmount-boarding-hatler/ Signed-off-by: shennetsind --- src/map/chrif.c | 2 ++ src/map/pc.c | 34 +++++++++++++++++++++++----------- src/map/pc.h | 3 +++ 3 files changed, 28 insertions(+), 11 deletions(-) (limited to 'src/map') diff --git a/src/map/chrif.c b/src/map/chrif.c index 4efc5bce4..a13217060 100644 --- a/src/map/chrif.c +++ b/src/map/chrif.c @@ -1212,6 +1212,8 @@ int chrif_load_scdata(int fd) { data = (struct status_change_data*)RFIFOP(fd,14 + i*sizeof(struct status_change_data)); status->change_start(&sd->bl, (sc_type)data->type, 10000, data->val1, data->val2, data->val3, data->val4, data->tick, 15); } + + pc->scdata_received(sd); #endif return 0; diff --git a/src/map/pc.c b/src/map/pc.c index f25dd8911..0244c6c84 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -443,7 +443,20 @@ int pc_inventory_rental_clear(struct map_session_data *sd) return 1; } - +/* assumes i is valid (from default areas where it is called, it is) */ +void pc_rental_expire(struct map_session_data *sd, int i) { + short nameid = sd->status.inventory[i].nameid; + + /* Soon to be dropped, we got plans to integrate it with item db */ + switch( nameid ) { + case ITEMID_REINS_OF_MOUNT: + status_change_end(&sd->bl,SC_ALL_RIDING,INVALID_TIMER); + break; + } + + clif->rental_expired(sd->fd, i, sd->status.inventory[i].nameid); + pc->delitem(sd, i, sd->status.inventory[i].amount, 0, 0, LOG_TYPE_OTHER); +} void pc_inventory_rentals(struct map_session_data *sd) { int i, c = 0; @@ -457,12 +470,7 @@ void pc_inventory_rentals(struct map_session_data *sd) continue; if( sd->status.inventory[i].expire_time <= time(NULL) ) { - if( sd->status.inventory[i].nameid == ITEMID_REINS_OF_MOUNT - && sd->sc.data[SC_ALL_RIDING] ) { - status_change_end(&sd->bl,SC_ALL_RIDING,INVALID_TIMER); - } - clif->rental_expired(sd->fd, i, sd->status.inventory[i].nameid); - pc->delitem(sd, i, sd->status.inventory[i].amount, 0, 0, LOG_TYPE_OTHER); + pc->rental_expire(sd,i); } else { expire_tick = (int64)(sd->status.inventory[i].expire_time - time(NULL)) * 1000; clif->rental_time(sd->fd, sd->status.inventory[i].nameid, (int)(expire_tick / 1000)); @@ -1269,8 +1277,6 @@ int pc_reg_received(struct map_session_data *sd) clif->pLoadEndAck(sd->fd, sd); } - pc->inventory_rentals(sd); - if( sd->sc.option & OPTION_INVISIBLE ) { sd->vd.class_ = INVISIBLE_CLASS; clif->message(sd->fd, msg_txt(11)); // Invisible: On @@ -3929,8 +3935,7 @@ int pc_additem(struct map_session_data *sd,struct item *item_data,int amount,e_l /* rental item check */ if( item_data->expire_time ) { if( time(NULL) > item_data->expire_time ) { - clif->rental_expired(sd->fd, i, sd->status.inventory[i].nameid); - pc->delitem(sd, i, sd->status.inventory[i].amount, 1, 0, LOG_TYPE_OTHER); + pc->rental_expire(sd,i); } else { int seconds = (int)( item_data->expire_time - time(NULL) ); clif->rental_time(sd->fd, sd->status.inventory[i].nameid, seconds); @@ -10132,6 +10137,10 @@ void pc_bank_withdraw(struct map_session_data *sd, int money) { clif->bank_withdraw(sd,BWA_SUCCESS); } } +/* status change data arrived from char-server */ +void pc_scdata_received(struct map_session_data *sd) { + pc->inventory_rentals(sd); +} /*========================================== * pc Init/Terminate @@ -10459,4 +10468,7 @@ void pc_defaults(void) { pc->bank_withdraw = pc_bank_withdraw; pc->bank_deposit = pc_bank_deposit; + + pc->rental_expire = pc_rental_expire; + pc->scdata_received = pc_scdata_received; } diff --git a/src/map/pc.h b/src/map/pc.h index fdcf395a7..14e1da5f4 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -978,6 +978,9 @@ struct pc_interface { void (*bank_deposit) (struct map_session_data *sd, int money); void (*bank_withdraw) (struct map_session_data *sd, int money); + + void (*rental_expire) (struct map_session_data *sd, int i); + void (*scdata_received) (struct map_session_data *sd); }; struct pc_interface *pc; -- cgit v1.2.3-70-g09d2