conf/battle/items.conf | 3 +++
src/map/battle.c | 1 +
src/map/battle.h | 1 +
src/map/vending.c | 28 ++++++++++++++++++++++++----
4 files changed, 29 insertions(+), 4 deletions(-)
diff --git a/conf/battle/items.conf b/conf/battle/items.conf
index 3a4eb80..683438b 100644
--- a/conf/battle/items.conf
+++ b/conf/battle/items.conf
@@ -21,6 +21,9 @@ vending_over_max: yes
// the vender will not get the whole price paid (they get 100% - this tax).
vending_tax: 200
+// Tax apply to vender.
+vending_tax_ally: 5000
+
// Show the buyer's name when successfully vended an item
buyer_name: yes
diff --git a/src/map/battle.c b/src/map/battle.c
index 1a04aef..f2771e8 100644
--- a/src/map/battle.c
+++ b/src/map/battle.c
@@ -6555,6 +6555,7 @@ bool battle_check_range(struct block_list *src, struct block_list *bl, int range
{ "homunculus_show_growth", &battle_config.homunculus_show_growth, 0, 0, 1, },
{ "homunculus_friendly_rate", &battle_config.homunculus_friendly_rate, 100, 0, INT_MAX, },
{ "vending_tax", &battle_config.vending_tax, 0, 0, 10000, },
+ { "vending_tax_ally", &battle_config.vending_tax_ally, 0, 0, 10000, },
{ "day_duration", &battle_config.day_duration, 0, 0, INT_MAX, },
{ "night_duration", &battle_config.night_duration, 0, 0, INT_MAX, },
{ "mob_remove_delay", &battle_config.mob_remove_delay, 60000, 1000, INT_MAX, },
diff --git a/src/map/battle.h b/src/map/battle.h
index 0fcef72..bbc7878 100644
--- a/src/map/battle.h
+++ b/src/map/battle.h
@@ -254,6 +254,7 @@ struct Battle_Config {
int vending_max_value;
int vending_over_max;
int vending_tax;
+ int vending_tax_ally;
int show_steal_in_same_party;
int party_share_type;
int party_hp_mode;
diff --git a/src/map/vending.c b/src/map/vending.c
index 78bc79a..2ba20f5 100644
--- a/src/map/vending.c
+++ b/src/map/vending.c
@@ -159,10 +159,30 @@ void vending_purchasereq(struct map_session_data* sd, int aid, unsigned int uid,
}
}
- pc->payzeny(sd, (int)z, LOG_TYPE_VENDING, vsd);
- if( battle_config.vending_tax )
- z -= z * (battle_config.vending_tax/10000.);
- pc->getzeny(vsd, (int)z, LOG_TYPE_VENDING, sd);
+ {
+ struct guild * g = guild->search( sd->status.guild_id );
+ if ( !g ) { // this is seriously needed to prevent map-server crash when the buyer doesn't have a guild
+ pc->payzeny(sd, (int)z, LOG_TYPE_VENDING, vsd);
+ if( battle_config.vending_tax )
+ z -= z * (battle_config.vending_tax/10000.);
+ pc->getzeny(vsd, (int)z, LOG_TYPE_VENDING, sd);
+ }
+ else {
+ ARR_FIND( 0, MAX_GUILDALLIANCE, i, vsd->status.guild_id == g->alliance[i].guild_id );
+ if ( vsd->status.guild_id == sd->status.guild_id || i < MAX_GUILDALLIANCE ) {
+ pc->payzeny(sd, (int)z, LOG_TYPE_VENDING, vsd);
+ if( battle_config.vending_tax_ally )
+ z -= z * (battle_config.vending_tax_ally/10000.);
+ pc->getzeny(vsd, (int)z, LOG_TYPE_VENDING, sd);
+ }
+ else {
+ pc->payzeny(sd, (int)z, LOG_TYPE_VENDING, vsd);
+ if( battle_config.vending_tax )
+ z -= z * (battle_config.vending_tax/10000.);
+ pc->getzeny(vsd, (int)z, LOG_TYPE_VENDING, sd);
+ }
+ }
+ }
for( i = 0; i < count; i++ ) {
short amount = *(uint16*)(data + 4*i + 0);