summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshennetsind <shennetsind@54d463be-8e91-2dee-dedb-b68131a5f0ec>2012-06-03 22:41:52 +0000
committershennetsind <shennetsind@54d463be-8e91-2dee-dedb-b68131a5f0ec>2012-06-03 22:41:52 +0000
commit36e4e442f21ed7193c4510a9bb4fcc733f821757 (patch)
treeda37bf7188e018d6fa150ba17d8bfdc9ee1d92fa
parentd6087662f5c19b693a000126d02ced43aad5d2f7 (diff)
downloadhercules-36e4e442f21ed7193c4510a9bb4fcc733f821757.tar.gz
hercules-36e4e442f21ed7193c4510a9bb4fcc733f821757.tar.bz2
hercules-36e4e442f21ed7193c4510a9bb4fcc733f821757.tar.xz
hercules-36e4e442f21ed7193c4510a9bb4fcc733f821757.zip
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
-rw-r--r--conf/battle/player.conf4
-rw-r--r--src/map/battle.c1
-rw-r--r--src/map/battle.h1
-rw-r--r--src/map/clif.c9
-rw-r--r--src/map/vending.c28
-rw-r--r--src/map/vending.h1
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 := {<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++ )
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_ */