diff options
Diffstat (limited to 'src/map/vending.c')
-rw-r--r-- | src/map/vending.c | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/src/map/vending.c b/src/map/vending.c index 6deba0e55..e84ac488f 100644 --- a/src/map/vending.c +++ b/src/map/vending.c @@ -12,6 +12,7 @@ #include "chrif.h" #include "vending.h" #include "pc.h" +#include "npc.h" #include "skill.h" #include "battle.h" #include "log.h" @@ -233,13 +234,27 @@ void vending_purchasereq(struct map_session_data* sd, int aid, int uid, const ui } } } +static int vending_checknearnpc_sub(struct block_list* bl, va_list args) { + struct npc_data *nd = (struct npc_data*)bl; + + if( nd->sc.option & (OPTION_HIDE|OPTION_INVISIBLE) ) + return 1; + return 1; +} +bool vending_checknearnpc(struct block_list * bl) { + + if( battle_config.min_npc_vending_distance > 0 && + map_foreachinrange(vending_checknearnpc_sub,bl, battle_config.min_npc_vending_distance, BL_NPC) ) + return true; + + return false; +} /*========================================== * Open shop * data := {<index>.w <amount>.w <value>.l}[count] *------------------------------------------*/ -void vending_openvending(struct map_session_data* sd, const char* message, bool flag, const uint8* data, int count) -{ +void vending_openvending(struct map_session_data* sd, const char* message, bool flag, const uint8* data, int count) { int i, j; int vending_skill_lvl; nullpo_retv(sd); @@ -265,6 +280,15 @@ void vending_openvending(struct map_session_data* sd, const char* message, bool return; } + if( vending_checknearnpc(&sd->bl) ) { + char output[50]; + sprintf(output,"You're too close to a NPC, you must be at least %d cells away from any NPC.",battle_config.min_npc_vending_distance); + clif_displaymessage(sd->fd, output); + clif_skill_fail(sd, MC_VENDING, USESKILL_FAIL_LEVEL, 0); + return; + } + + // filter out invalid items i = 0; for( j = 0; j < count; j++ ) |