From 36e4e442f21ed7193c4510a9bb4fcc733f821757 Mon Sep 17 00:00:00 2001 From: shennetsind Date: Sun, 3 Jun 2012 22:41:52 +0000 Subject: Adding new config min_npc_vending_distance which simulates the official 'no vending near npcs' feature. super mega credits to masao git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@16227 54d463be-8e91-2dee-dedb-b68131a5f0ec --- conf/battle/player.conf | 4 ++++ src/map/battle.c | 1 + src/map/battle.h | 1 + src/map/clif.c | 9 +++++++++ src/map/vending.c | 28 ++++++++++++++++++++++++++-- src/map/vending.h | 1 + 6 files changed, 42 insertions(+), 2 deletions(-) diff --git a/conf/battle/player.conf b/conf/battle/player.conf index ecb96fde6..33275e74e 100644 --- a/conf/battle/player.conf +++ b/conf/battle/player.conf @@ -135,3 +135,7 @@ character_size: 0 // Set to the time in seconds where an idle character will stop receiving // items from Autoloot (0: disabled). idle_no_autoloot: 0 + +// Minimum distance a vending must be from a NPC in order to be placed +// Default: 3 (0: disabled). +min_npc_vending_distance: 3 \ No newline at end of file diff --git a/src/map/battle.c b/src/map/battle.c index 71c4f1e7f..f407b49c9 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -5329,6 +5329,7 @@ static const struct _battle_data { { "skill_amotion_leniency", &battle_config.skill_amotion_leniency, 90, 0, 100 }, { "mvp_tomb_enabled", &battle_config.mvp_tomb_enabled, 1, 0, 1 }, { "feature.atcommand_suggestions", &battle_config.atcommand_suggestions_enabled, 0, 0, 1 }, + { "min_npc_vending_distance", &battle_config.min_npc_vending_distance, 0, 0, 100 }, }; diff --git a/src/map/battle.h b/src/map/battle.h index bf381927d..22ae1c13a 100644 --- a/src/map/battle.h +++ b/src/map/battle.h @@ -473,6 +473,7 @@ extern struct Battle_Config int mvp_tomb_enabled; int atcommand_suggestions_enabled; + int min_npc_vending_distance; } battle_config; void do_init_battle(void); diff --git a/src/map/clif.c b/src/map/clif.c index f5066551a..87263e72e 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -11734,6 +11734,15 @@ void clif_parse_OpenVending(int fd, struct map_session_data* sd) clif_displaymessage (sd->fd, msg_txt(204)); // "You can't open a shop on this cell." 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; + } + if( message[0] == '\0' ) // invalid input return; 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 := {.w .w .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++ ) diff --git a/src/map/vending.h b/src/map/vending.h index 6cfc90820..b67f22916 100644 --- a/src/map/vending.h +++ b/src/map/vending.h @@ -21,5 +21,6 @@ void vending_vendinglistreq(struct map_session_data* sd, int id); void vending_purchasereq(struct map_session_data* sd, int aid, int uid, const uint8* data, int count); bool vending_search(struct map_session_data* sd, unsigned short nameid); bool vending_searchall(struct map_session_data* sd, const struct s_search_store_search* s); +bool vending_checknearnpc(struct block_list * bl); #endif /* _VENDING_H_ */ -- cgit v1.2.3-60-g2f50