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://svn.code.sf.net/p/rathena/svn/trunk@16227 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
shennetsind 2012-06-03 22:41:52 +00:00
parent b3481a4aaf
commit 049b2552cd
6 changed files with 42 additions and 2 deletions

View File

@ -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

View File

@ -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 },
};

View File

@ -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);

View File

@ -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;

View File

@ -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++ )

View File

@ -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_ */