From 0c183135c24c4b541393880e35a0f9a05ec9556e Mon Sep 17 00:00:00 2001 From: MobiusDev <8391001+MobiusDevelopment@users.noreply.github.com> Date: Sat, 19 Aug 2017 14:07:40 +0000 Subject: [PATCH] Fixed merchant tax problems. --- .../dist/game/config/Feature.ini | 12 +++++----- .../actor/instance/L2MerchantInstance.java | 5 ---- .../network/clientpackets/RequestBuyItem.java | 20 +++++++--------- .../clientpackets/RequestRefundItem.java | 15 ++++++++---- .../clientpackets/RequestSellItem.java | 24 ++++++++++--------- .../network/serverpackets/ExBuySellList.java | 2 +- .../network/serverpackets/SellList.java | 14 +++++------ .../dist/game/config/Feature.ini | 12 +++++----- .../actor/instance/L2MerchantInstance.java | 5 ---- .../network/clientpackets/RequestBuyItem.java | 20 +++++++--------- .../clientpackets/RequestRefundItem.java | 15 ++++++++---- .../clientpackets/RequestSellItem.java | 24 ++++++++++--------- .../network/serverpackets/ExBuySellList.java | 2 +- .../network/serverpackets/SellList.java | 14 +++++------ .../dist/game/config/Feature.ini | 12 +++++----- .../actor/instance/L2MerchantInstance.java | 5 ---- .../network/clientpackets/RequestBuyItem.java | 20 +++++++--------- .../clientpackets/RequestRefundItem.java | 15 ++++++++---- .../clientpackets/RequestSellItem.java | 24 ++++++++++--------- .../network/serverpackets/ExBuySellList.java | 2 +- .../network/serverpackets/SellList.java | 14 +++++------ 21 files changed, 135 insertions(+), 141 deletions(-) diff --git a/L2J_Mobius_Ertheia/dist/game/config/Feature.ini b/L2J_Mobius_Ertheia/dist/game/config/Feature.ini index cfae791e53..b6dcf580dd 100644 --- a/L2J_Mobius_Ertheia/dist/game/config/Feature.ini +++ b/L2J_Mobius_Ertheia/dist/game/config/Feature.ini @@ -15,27 +15,27 @@ SiegeHourList = 16,20 # Taxes for castles # Buy tax in percent when is castle owned by npc's. -# Defualt: 15 +# Default: 15 BuyTaxForNeutralSide = 15 # Buy tax in percent when is castle owned by player's and castle is on light side. -# Defualt: 0 +# Default: 0 BuyTaxForLightSide = 0 # Buy tax in percent when is castle owned by player's and castle is on dark side. -# Defualt: 30 +# Default: 30 BuyTaxForDarkSide = 30 # Sell tax in percent when is castle owned by npc's. -# Defualt: 15 +# Default: 15 SellTaxForNeutralSide = 15 # Sell tax in percent when is castle owned by player's and castle is on light side. -# Defualt: 0 +# Default: 0 SellTaxForLightSide = 0 # Sell tax in percent when is castle owned by player's and castle is on dark side. -# Defualt: 30 +# Default: 30 SellTaxForDarkSide = 30 # Teleport Function price diff --git a/L2J_Mobius_Ertheia/java/com/l2jmobius/gameserver/model/actor/instance/L2MerchantInstance.java b/L2J_Mobius_Ertheia/java/com/l2jmobius/gameserver/model/actor/instance/L2MerchantInstance.java index d4007832b2..b48afd7f29 100644 --- a/L2J_Mobius_Ertheia/java/com/l2jmobius/gameserver/model/actor/instance/L2MerchantInstance.java +++ b/L2J_Mobius_Ertheia/java/com/l2jmobius/gameserver/model/actor/instance/L2MerchantInstance.java @@ -100,11 +100,6 @@ public class L2MerchantInstance extends L2NpcInstance return getCastle() != null; } - public double getCastleTaxRate() - { - return hasCastle() ? getCastle().getTaxRate() : 0.0; - } - public int getTotalTax(TaxType taxType) { return hasCastle() ? getCastle().getTaxPercent(taxType) : 0; diff --git a/L2J_Mobius_Ertheia/java/com/l2jmobius/gameserver/network/clientpackets/RequestBuyItem.java b/L2J_Mobius_Ertheia/java/com/l2jmobius/gameserver/network/clientpackets/RequestBuyItem.java index 7774049402..1cf01cc7b3 100644 --- a/L2J_Mobius_Ertheia/java/com/l2jmobius/gameserver/network/clientpackets/RequestBuyItem.java +++ b/L2J_Mobius_Ertheia/java/com/l2jmobius/gameserver/network/clientpackets/RequestBuyItem.java @@ -25,8 +25,8 @@ import java.util.List; import com.l2jmobius.Config; import com.l2jmobius.commons.network.PacketReader; import com.l2jmobius.gameserver.data.xml.impl.BuyListData; +import com.l2jmobius.gameserver.enums.TaxType; import com.l2jmobius.gameserver.model.L2Object; -import com.l2jmobius.gameserver.model.actor.L2Character; import com.l2jmobius.gameserver.model.actor.instance.L2MerchantInstance; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.model.buylist.L2BuyList; @@ -102,7 +102,7 @@ public final class RequestBuyItem implements IClientIncomingPacket } final L2Object target = player.getTarget(); - L2Character merchant = null; + L2MerchantInstance merchant = null; if (!player.isGM() && (_listId != CUSTOM_CB_SELL_LIST)) { if (!(target instanceof L2MerchantInstance) || (!player.isInsideRadius(target, INTERACTION_DISTANCE, true, false)) || (player.getInstanceWorld() != target.getInstanceWorld())) @@ -110,11 +110,9 @@ public final class RequestBuyItem implements IClientIncomingPacket client.sendPacket(ActionFailed.STATIC_PACKET); return; } - merchant = (L2Character) target; + merchant = (L2MerchantInstance) target; } - double castleTaxRate = 0; - if ((merchant == null) && !player.isGM() && (_listId != CUSTOM_CB_SELL_LIST)) { client.sendPacket(ActionFailed.STATIC_PACKET); @@ -128,6 +126,7 @@ public final class RequestBuyItem implements IClientIncomingPacket return; } + double castleTaxRate = 0; if (merchant != null) { if (!buyList.isNpcAllowed(merchant.getId())) @@ -135,8 +134,7 @@ public final class RequestBuyItem implements IClientIncomingPacket client.sendPacket(ActionFailed.STATIC_PACKET); return; } - - castleTaxRate = ((L2MerchantInstance) merchant).getCastleTaxRate(); + castleTaxRate = merchant.getTotalTaxRate(TaxType.BUY); } long subTotal = 0; @@ -146,8 +144,6 @@ public final class RequestBuyItem implements IClientIncomingPacket long weight = 0; for (ItemHolder i : _items) { - long price = -1; - final Product product = buyList.getProductByItemId(i.getId()); if (product == null) { @@ -162,7 +158,7 @@ public final class RequestBuyItem implements IClientIncomingPacket return; } - price = product.getPrice(); + long price = product.getPrice(); if ((product.getItemId() >= 3960) && (product.getItemId() <= 4026)) { price *= Config.RATE_SIEGE_GUARDS_PRICE; @@ -259,9 +255,9 @@ public final class RequestBuyItem implements IClientIncomingPacket } // add to castle treasury - if (merchant instanceof L2MerchantInstance) + if (merchant != null) { - ((L2MerchantInstance) merchant).getCastle().addToTreasury((long) (subTotal * castleTaxRate)); + merchant.getCastle().addToTreasury((long) (subTotal * castleTaxRate)); } client.sendPacket(new ExUserInfoInvenWeight(player)); diff --git a/L2J_Mobius_Ertheia/java/com/l2jmobius/gameserver/network/clientpackets/RequestRefundItem.java b/L2J_Mobius_Ertheia/java/com/l2jmobius/gameserver/network/clientpackets/RequestRefundItem.java index dedd9545d3..3cc8f4c564 100644 --- a/L2J_Mobius_Ertheia/java/com/l2jmobius/gameserver/network/clientpackets/RequestRefundItem.java +++ b/L2J_Mobius_Ertheia/java/com/l2jmobius/gameserver/network/clientpackets/RequestRefundItem.java @@ -21,8 +21,8 @@ import static com.l2jmobius.gameserver.model.actor.L2Npc.INTERACTION_DISTANCE; import com.l2jmobius.Config; import com.l2jmobius.commons.network.PacketReader; import com.l2jmobius.gameserver.data.xml.impl.BuyListData; +import com.l2jmobius.gameserver.enums.TaxType; import com.l2jmobius.gameserver.model.L2Object; -import com.l2jmobius.gameserver.model.actor.L2Character; import com.l2jmobius.gameserver.model.actor.instance.L2MerchantInstance; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.model.buylist.L2BuyList; @@ -92,7 +92,7 @@ public final class RequestRefundItem implements IClientIncomingPacket } final L2Object target = player.getTarget(); - L2Character merchant = null; + L2MerchantInstance merchant = null; if (!player.isGM() && (_listId != CUSTOM_CB_SELL_LIST)) { if (!(target instanceof L2MerchantInstance) || !player.isInsideRadius(target, INTERACTION_DISTANCE, true, false) || (player.getInstanceId() != target.getInstanceId())) @@ -100,7 +100,7 @@ public final class RequestRefundItem implements IClientIncomingPacket client.sendPacket(ActionFailed.STATIC_PACKET); return; } - merchant = (L2Character) target; + merchant = (L2MerchantInstance) target; } if ((merchant == null) && !player.isGM() && (_listId != CUSTOM_CB_SELL_LIST)) @@ -164,7 +164,12 @@ public final class RequestRefundItem implements IClientIncomingPacket final long count = item.getCount(); weight += count * template.getWeight(); - adena += (count * template.getReferencePrice()) / 2; + long price = item.getReferencePrice() / 2; + if (merchant != null) + { + price -= (price * merchant.getTotalTaxRate(TaxType.SELL)); + } + adena += price * count; if (!template.isStackable()) { slots += count; @@ -208,6 +213,6 @@ public final class RequestRefundItem implements IClientIncomingPacket // Update current load status on player client.sendPacket(new ExUserInfoInvenWeight(player)); - client.sendPacket(new ExBuySellList(player, true)); + client.sendPacket(new ExBuySellList(player, true, merchant != null ? merchant.getTotalTaxRate(TaxType.SELL) : 0)); } } diff --git a/L2J_Mobius_Ertheia/java/com/l2jmobius/gameserver/network/clientpackets/RequestSellItem.java b/L2J_Mobius_Ertheia/java/com/l2jmobius/gameserver/network/clientpackets/RequestSellItem.java index 6070e90fb2..1076851410 100644 --- a/L2J_Mobius_Ertheia/java/com/l2jmobius/gameserver/network/clientpackets/RequestSellItem.java +++ b/L2J_Mobius_Ertheia/java/com/l2jmobius/gameserver/network/clientpackets/RequestSellItem.java @@ -27,7 +27,6 @@ import com.l2jmobius.commons.network.PacketReader; import com.l2jmobius.gameserver.data.xml.impl.BuyListData; import com.l2jmobius.gameserver.enums.TaxType; import com.l2jmobius.gameserver.model.L2Object; -import com.l2jmobius.gameserver.model.actor.L2Character; import com.l2jmobius.gameserver.model.actor.instance.L2MerchantInstance; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.model.buylist.L2BuyList; @@ -105,7 +104,7 @@ public final class RequestSellItem implements IClientIncomingPacket } final L2Object target = player.getTarget(); - L2Character merchant = null; + L2MerchantInstance merchant = null; if (!player.isGM() && (_listId != CUSTOM_CB_SELL_LIST)) { if ((target == null) || !player.isInsideRadius(target, INTERACTION_DISTANCE, true, false) || (player.getInstanceId() != target.getInstanceId())) @@ -115,7 +114,7 @@ public final class RequestSellItem implements IClientIncomingPacket } if (target instanceof L2MerchantInstance) { - merchant = (L2Character) target; + merchant = (L2MerchantInstance) target; } else { @@ -153,7 +152,11 @@ public final class RequestSellItem implements IClientIncomingPacket continue; } - final long price = item.getReferencePrice() / 2; + long price = item.getReferencePrice() / 2; + if (merchant != null) + { + price -= (price * merchant.getTotalTaxRate(TaxType.SELL)); + } totalPrice += price * i.getCount(); if (((MAX_ADENA / i.getCount()) < price) || (totalPrice > MAX_ADENA)) { @@ -171,19 +174,18 @@ public final class RequestSellItem implements IClientIncomingPacket } } + player.addAdena("Sell", totalPrice, merchant, false); + // add to castle treasury - if (merchant instanceof L2MerchantInstance) + if (merchant != null) { - final L2MerchantInstance npc = ((L2MerchantInstance) merchant); - final long taxCollection = (long) (totalPrice * (1.0 - npc.getTotalTaxRate(TaxType.SELL))); - npc.getCastle().addToTreasury(taxCollection); + final long taxCollection = (long) (totalPrice * (1.0 - merchant.getTotalTaxRate(TaxType.SELL))); + merchant.getCastle().addToTreasury(taxCollection); totalPrice -= taxCollection; } - player.addAdena("Sell", totalPrice, merchant, false); - // Update current load as well client.sendPacket(new ExUserInfoInvenWeight(player)); - client.sendPacket(new ExBuySellList(player, true)); + client.sendPacket(new ExBuySellList(player, true, merchant != null ? merchant.getTotalTaxRate(TaxType.SELL) : 0)); } } diff --git a/L2J_Mobius_Ertheia/java/com/l2jmobius/gameserver/network/serverpackets/ExBuySellList.java b/L2J_Mobius_Ertheia/java/com/l2jmobius/gameserver/network/serverpackets/ExBuySellList.java index ba31f33703..f793112067 100644 --- a/L2J_Mobius_Ertheia/java/com/l2jmobius/gameserver/network/serverpackets/ExBuySellList.java +++ b/L2J_Mobius_Ertheia/java/com/l2jmobius/gameserver/network/serverpackets/ExBuySellList.java @@ -79,7 +79,7 @@ public class ExBuySellList extends AbstractItemPacket { writeItem(packet, item); packet.writeD(i++); - packet.writeQ((item.getItem().getReferencePrice() / 2) * item.getCount()); + packet.writeQ((long) ((item.getItem().getReferencePrice() / 2) * _taxRate)); } } else diff --git a/L2J_Mobius_Ertheia/java/com/l2jmobius/gameserver/network/serverpackets/SellList.java b/L2J_Mobius_Ertheia/java/com/l2jmobius/gameserver/network/serverpackets/SellList.java index ed71bcd4ee..433eae9095 100644 --- a/L2J_Mobius_Ertheia/java/com/l2jmobius/gameserver/network/serverpackets/SellList.java +++ b/L2J_Mobius_Ertheia/java/com/l2jmobius/gameserver/network/serverpackets/SellList.java @@ -32,7 +32,7 @@ import com.l2jmobius.gameserver.network.OutgoingPackets; public class SellList implements IClientOutgoingPacket { private final L2PcInstance _activeChar; - private final L2MerchantInstance _lease; + private final L2MerchantInstance _merchant; private final long _money; private final List _sellList; @@ -44,10 +44,10 @@ public class SellList implements IClientOutgoingPacket public SellList(L2PcInstance player, L2MerchantInstance lease) { _activeChar = player; - _lease = lease; + _merchant = lease; _money = _activeChar.getAdena(); - if (_lease == null) + if (_merchant == null) { _sellList = new LinkedList<>(); final L2Summon pet = _activeChar.getPet(); @@ -71,15 +71,15 @@ public class SellList implements IClientOutgoingPacket OutgoingPackets.SELL_LIST.writeId(packet); packet.writeQ(_money); - packet.writeD(_lease == null ? 0x00 : 1000000 + _lease.getTemplate().getId()); + packet.writeD(_merchant == null ? 0x00 : 1000000 + _merchant.getTemplate().getId()); packet.writeH(_sellList.size()); for (L2ItemInstance item : _sellList) { int price = item.getItem().getReferencePrice() / 2; - if (_lease != null) + if (_merchant != null) { - price -= (price * _lease.getTotalTaxRate(TaxType.SELL)); + price -= (price * _merchant.getTotalTaxRate(TaxType.SELL)); } packet.writeH(item.getItem().getType1()); @@ -92,7 +92,7 @@ public class SellList implements IClientOutgoingPacket packet.writeH(item.getEnchantLevel()); packet.writeH(0x00); // TODO: Verify me packet.writeH(item.getCustomType2()); - packet.writeQ(item.getItem().getReferencePrice() / 2); + packet.writeQ(price); // T1 packet.writeH(item.getAttackAttributeType().getClientId()); packet.writeH(item.getAttackAttributePower()); diff --git a/L2J_Mobius_Helios/dist/game/config/Feature.ini b/L2J_Mobius_Helios/dist/game/config/Feature.ini index cfae791e53..b6dcf580dd 100644 --- a/L2J_Mobius_Helios/dist/game/config/Feature.ini +++ b/L2J_Mobius_Helios/dist/game/config/Feature.ini @@ -15,27 +15,27 @@ SiegeHourList = 16,20 # Taxes for castles # Buy tax in percent when is castle owned by npc's. -# Defualt: 15 +# Default: 15 BuyTaxForNeutralSide = 15 # Buy tax in percent when is castle owned by player's and castle is on light side. -# Defualt: 0 +# Default: 0 BuyTaxForLightSide = 0 # Buy tax in percent when is castle owned by player's and castle is on dark side. -# Defualt: 30 +# Default: 30 BuyTaxForDarkSide = 30 # Sell tax in percent when is castle owned by npc's. -# Defualt: 15 +# Default: 15 SellTaxForNeutralSide = 15 # Sell tax in percent when is castle owned by player's and castle is on light side. -# Defualt: 0 +# Default: 0 SellTaxForLightSide = 0 # Sell tax in percent when is castle owned by player's and castle is on dark side. -# Defualt: 30 +# Default: 30 SellTaxForDarkSide = 30 # Teleport Function price diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/model/actor/instance/L2MerchantInstance.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/model/actor/instance/L2MerchantInstance.java index d4007832b2..b48afd7f29 100644 --- a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/model/actor/instance/L2MerchantInstance.java +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/model/actor/instance/L2MerchantInstance.java @@ -100,11 +100,6 @@ public class L2MerchantInstance extends L2NpcInstance return getCastle() != null; } - public double getCastleTaxRate() - { - return hasCastle() ? getCastle().getTaxRate() : 0.0; - } - public int getTotalTax(TaxType taxType) { return hasCastle() ? getCastle().getTaxPercent(taxType) : 0; diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/network/clientpackets/RequestBuyItem.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/network/clientpackets/RequestBuyItem.java index eb676c9abb..80f66487bd 100644 --- a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/network/clientpackets/RequestBuyItem.java +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/network/clientpackets/RequestBuyItem.java @@ -25,8 +25,8 @@ import java.util.List; import com.l2jmobius.Config; import com.l2jmobius.commons.network.PacketReader; import com.l2jmobius.gameserver.data.xml.impl.BuyListData; +import com.l2jmobius.gameserver.enums.TaxType; import com.l2jmobius.gameserver.model.L2Object; -import com.l2jmobius.gameserver.model.actor.L2Character; import com.l2jmobius.gameserver.model.actor.instance.L2MerchantInstance; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.model.buylist.L2BuyList; @@ -102,7 +102,7 @@ public final class RequestBuyItem implements IClientIncomingPacket } final L2Object target = player.getTarget(); - L2Character merchant = null; + L2MerchantInstance merchant = null; if (!player.isGM() && (_listId != CUSTOM_CB_SELL_LIST)) { if (!(target instanceof L2MerchantInstance) || (!player.isInsideRadius(target, INTERACTION_DISTANCE, true, false)) || (player.getInstanceWorld() != target.getInstanceWorld())) @@ -110,11 +110,9 @@ public final class RequestBuyItem implements IClientIncomingPacket client.sendPacket(ActionFailed.STATIC_PACKET); return; } - merchant = (L2Character) target; + merchant = (L2MerchantInstance) target; } - double castleTaxRate = 0; - if ((merchant == null) && !player.isGM() && (_listId != CUSTOM_CB_SELL_LIST)) { client.sendPacket(ActionFailed.STATIC_PACKET); @@ -128,6 +126,7 @@ public final class RequestBuyItem implements IClientIncomingPacket return; } + double castleTaxRate = 0; if (merchant != null) { if (!buyList.isNpcAllowed(merchant.getId())) @@ -135,8 +134,7 @@ public final class RequestBuyItem implements IClientIncomingPacket client.sendPacket(ActionFailed.STATIC_PACKET); return; } - - castleTaxRate = ((L2MerchantInstance) merchant).getCastleTaxRate(); + castleTaxRate = merchant.getTotalTaxRate(TaxType.BUY); } long subTotal = 0; @@ -146,8 +144,6 @@ public final class RequestBuyItem implements IClientIncomingPacket long weight = 0; for (ItemHolder i : _items) { - long price = -1; - final Product product = buyList.getProductByItemId(i.getId()); if (product == null) { @@ -162,7 +158,7 @@ public final class RequestBuyItem implements IClientIncomingPacket return; } - price = product.getPrice(); + long price = product.getPrice(); if ((product.getItemId() >= 3960) && (product.getItemId() <= 4026)) { price *= Config.RATE_SIEGE_GUARDS_PRICE; @@ -259,9 +255,9 @@ public final class RequestBuyItem implements IClientIncomingPacket } // add to castle treasury - if (merchant instanceof L2MerchantInstance) + if (merchant != null) { - ((L2MerchantInstance) merchant).getCastle().addToTreasury((long) (subTotal * castleTaxRate)); + merchant.getCastle().addToTreasury((long) (subTotal * castleTaxRate)); } client.sendPacket(new ExUserInfoInvenWeight(player)); diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/network/clientpackets/RequestRefundItem.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/network/clientpackets/RequestRefundItem.java index dedd9545d3..3cc8f4c564 100644 --- a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/network/clientpackets/RequestRefundItem.java +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/network/clientpackets/RequestRefundItem.java @@ -21,8 +21,8 @@ import static com.l2jmobius.gameserver.model.actor.L2Npc.INTERACTION_DISTANCE; import com.l2jmobius.Config; import com.l2jmobius.commons.network.PacketReader; import com.l2jmobius.gameserver.data.xml.impl.BuyListData; +import com.l2jmobius.gameserver.enums.TaxType; import com.l2jmobius.gameserver.model.L2Object; -import com.l2jmobius.gameserver.model.actor.L2Character; import com.l2jmobius.gameserver.model.actor.instance.L2MerchantInstance; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.model.buylist.L2BuyList; @@ -92,7 +92,7 @@ public final class RequestRefundItem implements IClientIncomingPacket } final L2Object target = player.getTarget(); - L2Character merchant = null; + L2MerchantInstance merchant = null; if (!player.isGM() && (_listId != CUSTOM_CB_SELL_LIST)) { if (!(target instanceof L2MerchantInstance) || !player.isInsideRadius(target, INTERACTION_DISTANCE, true, false) || (player.getInstanceId() != target.getInstanceId())) @@ -100,7 +100,7 @@ public final class RequestRefundItem implements IClientIncomingPacket client.sendPacket(ActionFailed.STATIC_PACKET); return; } - merchant = (L2Character) target; + merchant = (L2MerchantInstance) target; } if ((merchant == null) && !player.isGM() && (_listId != CUSTOM_CB_SELL_LIST)) @@ -164,7 +164,12 @@ public final class RequestRefundItem implements IClientIncomingPacket final long count = item.getCount(); weight += count * template.getWeight(); - adena += (count * template.getReferencePrice()) / 2; + long price = item.getReferencePrice() / 2; + if (merchant != null) + { + price -= (price * merchant.getTotalTaxRate(TaxType.SELL)); + } + adena += price * count; if (!template.isStackable()) { slots += count; @@ -208,6 +213,6 @@ public final class RequestRefundItem implements IClientIncomingPacket // Update current load status on player client.sendPacket(new ExUserInfoInvenWeight(player)); - client.sendPacket(new ExBuySellList(player, true)); + client.sendPacket(new ExBuySellList(player, true, merchant != null ? merchant.getTotalTaxRate(TaxType.SELL) : 0)); } } diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/network/clientpackets/RequestSellItem.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/network/clientpackets/RequestSellItem.java index 6070e90fb2..1076851410 100644 --- a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/network/clientpackets/RequestSellItem.java +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/network/clientpackets/RequestSellItem.java @@ -27,7 +27,6 @@ import com.l2jmobius.commons.network.PacketReader; import com.l2jmobius.gameserver.data.xml.impl.BuyListData; import com.l2jmobius.gameserver.enums.TaxType; import com.l2jmobius.gameserver.model.L2Object; -import com.l2jmobius.gameserver.model.actor.L2Character; import com.l2jmobius.gameserver.model.actor.instance.L2MerchantInstance; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.model.buylist.L2BuyList; @@ -105,7 +104,7 @@ public final class RequestSellItem implements IClientIncomingPacket } final L2Object target = player.getTarget(); - L2Character merchant = null; + L2MerchantInstance merchant = null; if (!player.isGM() && (_listId != CUSTOM_CB_SELL_LIST)) { if ((target == null) || !player.isInsideRadius(target, INTERACTION_DISTANCE, true, false) || (player.getInstanceId() != target.getInstanceId())) @@ -115,7 +114,7 @@ public final class RequestSellItem implements IClientIncomingPacket } if (target instanceof L2MerchantInstance) { - merchant = (L2Character) target; + merchant = (L2MerchantInstance) target; } else { @@ -153,7 +152,11 @@ public final class RequestSellItem implements IClientIncomingPacket continue; } - final long price = item.getReferencePrice() / 2; + long price = item.getReferencePrice() / 2; + if (merchant != null) + { + price -= (price * merchant.getTotalTaxRate(TaxType.SELL)); + } totalPrice += price * i.getCount(); if (((MAX_ADENA / i.getCount()) < price) || (totalPrice > MAX_ADENA)) { @@ -171,19 +174,18 @@ public final class RequestSellItem implements IClientIncomingPacket } } + player.addAdena("Sell", totalPrice, merchant, false); + // add to castle treasury - if (merchant instanceof L2MerchantInstance) + if (merchant != null) { - final L2MerchantInstance npc = ((L2MerchantInstance) merchant); - final long taxCollection = (long) (totalPrice * (1.0 - npc.getTotalTaxRate(TaxType.SELL))); - npc.getCastle().addToTreasury(taxCollection); + final long taxCollection = (long) (totalPrice * (1.0 - merchant.getTotalTaxRate(TaxType.SELL))); + merchant.getCastle().addToTreasury(taxCollection); totalPrice -= taxCollection; } - player.addAdena("Sell", totalPrice, merchant, false); - // Update current load as well client.sendPacket(new ExUserInfoInvenWeight(player)); - client.sendPacket(new ExBuySellList(player, true)); + client.sendPacket(new ExBuySellList(player, true, merchant != null ? merchant.getTotalTaxRate(TaxType.SELL) : 0)); } } diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/network/serverpackets/ExBuySellList.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/network/serverpackets/ExBuySellList.java index ba31f33703..f793112067 100644 --- a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/network/serverpackets/ExBuySellList.java +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/network/serverpackets/ExBuySellList.java @@ -79,7 +79,7 @@ public class ExBuySellList extends AbstractItemPacket { writeItem(packet, item); packet.writeD(i++); - packet.writeQ((item.getItem().getReferencePrice() / 2) * item.getCount()); + packet.writeQ((long) ((item.getItem().getReferencePrice() / 2) * _taxRate)); } } else diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/network/serverpackets/SellList.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/network/serverpackets/SellList.java index ed71bcd4ee..433eae9095 100644 --- a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/network/serverpackets/SellList.java +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/network/serverpackets/SellList.java @@ -32,7 +32,7 @@ import com.l2jmobius.gameserver.network.OutgoingPackets; public class SellList implements IClientOutgoingPacket { private final L2PcInstance _activeChar; - private final L2MerchantInstance _lease; + private final L2MerchantInstance _merchant; private final long _money; private final List _sellList; @@ -44,10 +44,10 @@ public class SellList implements IClientOutgoingPacket public SellList(L2PcInstance player, L2MerchantInstance lease) { _activeChar = player; - _lease = lease; + _merchant = lease; _money = _activeChar.getAdena(); - if (_lease == null) + if (_merchant == null) { _sellList = new LinkedList<>(); final L2Summon pet = _activeChar.getPet(); @@ -71,15 +71,15 @@ public class SellList implements IClientOutgoingPacket OutgoingPackets.SELL_LIST.writeId(packet); packet.writeQ(_money); - packet.writeD(_lease == null ? 0x00 : 1000000 + _lease.getTemplate().getId()); + packet.writeD(_merchant == null ? 0x00 : 1000000 + _merchant.getTemplate().getId()); packet.writeH(_sellList.size()); for (L2ItemInstance item : _sellList) { int price = item.getItem().getReferencePrice() / 2; - if (_lease != null) + if (_merchant != null) { - price -= (price * _lease.getTotalTaxRate(TaxType.SELL)); + price -= (price * _merchant.getTotalTaxRate(TaxType.SELL)); } packet.writeH(item.getItem().getType1()); @@ -92,7 +92,7 @@ public class SellList implements IClientOutgoingPacket packet.writeH(item.getEnchantLevel()); packet.writeH(0x00); // TODO: Verify me packet.writeH(item.getCustomType2()); - packet.writeQ(item.getItem().getReferencePrice() / 2); + packet.writeQ(price); // T1 packet.writeH(item.getAttackAttributeType().getClientId()); packet.writeH(item.getAttackAttributePower()); diff --git a/L2J_Mobius_Underground/dist/game/config/Feature.ini b/L2J_Mobius_Underground/dist/game/config/Feature.ini index cfae791e53..b6dcf580dd 100644 --- a/L2J_Mobius_Underground/dist/game/config/Feature.ini +++ b/L2J_Mobius_Underground/dist/game/config/Feature.ini @@ -15,27 +15,27 @@ SiegeHourList = 16,20 # Taxes for castles # Buy tax in percent when is castle owned by npc's. -# Defualt: 15 +# Default: 15 BuyTaxForNeutralSide = 15 # Buy tax in percent when is castle owned by player's and castle is on light side. -# Defualt: 0 +# Default: 0 BuyTaxForLightSide = 0 # Buy tax in percent when is castle owned by player's and castle is on dark side. -# Defualt: 30 +# Default: 30 BuyTaxForDarkSide = 30 # Sell tax in percent when is castle owned by npc's. -# Defualt: 15 +# Default: 15 SellTaxForNeutralSide = 15 # Sell tax in percent when is castle owned by player's and castle is on light side. -# Defualt: 0 +# Default: 0 SellTaxForLightSide = 0 # Sell tax in percent when is castle owned by player's and castle is on dark side. -# Defualt: 30 +# Default: 30 SellTaxForDarkSide = 30 # Teleport Function price diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/model/actor/instance/L2MerchantInstance.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/model/actor/instance/L2MerchantInstance.java index d4007832b2..b48afd7f29 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/model/actor/instance/L2MerchantInstance.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/model/actor/instance/L2MerchantInstance.java @@ -100,11 +100,6 @@ public class L2MerchantInstance extends L2NpcInstance return getCastle() != null; } - public double getCastleTaxRate() - { - return hasCastle() ? getCastle().getTaxRate() : 0.0; - } - public int getTotalTax(TaxType taxType) { return hasCastle() ? getCastle().getTaxPercent(taxType) : 0; diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/network/clientpackets/RequestBuyItem.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/network/clientpackets/RequestBuyItem.java index 7774049402..1cf01cc7b3 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/network/clientpackets/RequestBuyItem.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/network/clientpackets/RequestBuyItem.java @@ -25,8 +25,8 @@ import java.util.List; import com.l2jmobius.Config; import com.l2jmobius.commons.network.PacketReader; import com.l2jmobius.gameserver.data.xml.impl.BuyListData; +import com.l2jmobius.gameserver.enums.TaxType; import com.l2jmobius.gameserver.model.L2Object; -import com.l2jmobius.gameserver.model.actor.L2Character; import com.l2jmobius.gameserver.model.actor.instance.L2MerchantInstance; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.model.buylist.L2BuyList; @@ -102,7 +102,7 @@ public final class RequestBuyItem implements IClientIncomingPacket } final L2Object target = player.getTarget(); - L2Character merchant = null; + L2MerchantInstance merchant = null; if (!player.isGM() && (_listId != CUSTOM_CB_SELL_LIST)) { if (!(target instanceof L2MerchantInstance) || (!player.isInsideRadius(target, INTERACTION_DISTANCE, true, false)) || (player.getInstanceWorld() != target.getInstanceWorld())) @@ -110,11 +110,9 @@ public final class RequestBuyItem implements IClientIncomingPacket client.sendPacket(ActionFailed.STATIC_PACKET); return; } - merchant = (L2Character) target; + merchant = (L2MerchantInstance) target; } - double castleTaxRate = 0; - if ((merchant == null) && !player.isGM() && (_listId != CUSTOM_CB_SELL_LIST)) { client.sendPacket(ActionFailed.STATIC_PACKET); @@ -128,6 +126,7 @@ public final class RequestBuyItem implements IClientIncomingPacket return; } + double castleTaxRate = 0; if (merchant != null) { if (!buyList.isNpcAllowed(merchant.getId())) @@ -135,8 +134,7 @@ public final class RequestBuyItem implements IClientIncomingPacket client.sendPacket(ActionFailed.STATIC_PACKET); return; } - - castleTaxRate = ((L2MerchantInstance) merchant).getCastleTaxRate(); + castleTaxRate = merchant.getTotalTaxRate(TaxType.BUY); } long subTotal = 0; @@ -146,8 +144,6 @@ public final class RequestBuyItem implements IClientIncomingPacket long weight = 0; for (ItemHolder i : _items) { - long price = -1; - final Product product = buyList.getProductByItemId(i.getId()); if (product == null) { @@ -162,7 +158,7 @@ public final class RequestBuyItem implements IClientIncomingPacket return; } - price = product.getPrice(); + long price = product.getPrice(); if ((product.getItemId() >= 3960) && (product.getItemId() <= 4026)) { price *= Config.RATE_SIEGE_GUARDS_PRICE; @@ -259,9 +255,9 @@ public final class RequestBuyItem implements IClientIncomingPacket } // add to castle treasury - if (merchant instanceof L2MerchantInstance) + if (merchant != null) { - ((L2MerchantInstance) merchant).getCastle().addToTreasury((long) (subTotal * castleTaxRate)); + merchant.getCastle().addToTreasury((long) (subTotal * castleTaxRate)); } client.sendPacket(new ExUserInfoInvenWeight(player)); diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/network/clientpackets/RequestRefundItem.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/network/clientpackets/RequestRefundItem.java index dedd9545d3..3cc8f4c564 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/network/clientpackets/RequestRefundItem.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/network/clientpackets/RequestRefundItem.java @@ -21,8 +21,8 @@ import static com.l2jmobius.gameserver.model.actor.L2Npc.INTERACTION_DISTANCE; import com.l2jmobius.Config; import com.l2jmobius.commons.network.PacketReader; import com.l2jmobius.gameserver.data.xml.impl.BuyListData; +import com.l2jmobius.gameserver.enums.TaxType; import com.l2jmobius.gameserver.model.L2Object; -import com.l2jmobius.gameserver.model.actor.L2Character; import com.l2jmobius.gameserver.model.actor.instance.L2MerchantInstance; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.model.buylist.L2BuyList; @@ -92,7 +92,7 @@ public final class RequestRefundItem implements IClientIncomingPacket } final L2Object target = player.getTarget(); - L2Character merchant = null; + L2MerchantInstance merchant = null; if (!player.isGM() && (_listId != CUSTOM_CB_SELL_LIST)) { if (!(target instanceof L2MerchantInstance) || !player.isInsideRadius(target, INTERACTION_DISTANCE, true, false) || (player.getInstanceId() != target.getInstanceId())) @@ -100,7 +100,7 @@ public final class RequestRefundItem implements IClientIncomingPacket client.sendPacket(ActionFailed.STATIC_PACKET); return; } - merchant = (L2Character) target; + merchant = (L2MerchantInstance) target; } if ((merchant == null) && !player.isGM() && (_listId != CUSTOM_CB_SELL_LIST)) @@ -164,7 +164,12 @@ public final class RequestRefundItem implements IClientIncomingPacket final long count = item.getCount(); weight += count * template.getWeight(); - adena += (count * template.getReferencePrice()) / 2; + long price = item.getReferencePrice() / 2; + if (merchant != null) + { + price -= (price * merchant.getTotalTaxRate(TaxType.SELL)); + } + adena += price * count; if (!template.isStackable()) { slots += count; @@ -208,6 +213,6 @@ public final class RequestRefundItem implements IClientIncomingPacket // Update current load status on player client.sendPacket(new ExUserInfoInvenWeight(player)); - client.sendPacket(new ExBuySellList(player, true)); + client.sendPacket(new ExBuySellList(player, true, merchant != null ? merchant.getTotalTaxRate(TaxType.SELL) : 0)); } } diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/network/clientpackets/RequestSellItem.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/network/clientpackets/RequestSellItem.java index 6070e90fb2..1076851410 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/network/clientpackets/RequestSellItem.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/network/clientpackets/RequestSellItem.java @@ -27,7 +27,6 @@ import com.l2jmobius.commons.network.PacketReader; import com.l2jmobius.gameserver.data.xml.impl.BuyListData; import com.l2jmobius.gameserver.enums.TaxType; import com.l2jmobius.gameserver.model.L2Object; -import com.l2jmobius.gameserver.model.actor.L2Character; import com.l2jmobius.gameserver.model.actor.instance.L2MerchantInstance; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.model.buylist.L2BuyList; @@ -105,7 +104,7 @@ public final class RequestSellItem implements IClientIncomingPacket } final L2Object target = player.getTarget(); - L2Character merchant = null; + L2MerchantInstance merchant = null; if (!player.isGM() && (_listId != CUSTOM_CB_SELL_LIST)) { if ((target == null) || !player.isInsideRadius(target, INTERACTION_DISTANCE, true, false) || (player.getInstanceId() != target.getInstanceId())) @@ -115,7 +114,7 @@ public final class RequestSellItem implements IClientIncomingPacket } if (target instanceof L2MerchantInstance) { - merchant = (L2Character) target; + merchant = (L2MerchantInstance) target; } else { @@ -153,7 +152,11 @@ public final class RequestSellItem implements IClientIncomingPacket continue; } - final long price = item.getReferencePrice() / 2; + long price = item.getReferencePrice() / 2; + if (merchant != null) + { + price -= (price * merchant.getTotalTaxRate(TaxType.SELL)); + } totalPrice += price * i.getCount(); if (((MAX_ADENA / i.getCount()) < price) || (totalPrice > MAX_ADENA)) { @@ -171,19 +174,18 @@ public final class RequestSellItem implements IClientIncomingPacket } } + player.addAdena("Sell", totalPrice, merchant, false); + // add to castle treasury - if (merchant instanceof L2MerchantInstance) + if (merchant != null) { - final L2MerchantInstance npc = ((L2MerchantInstance) merchant); - final long taxCollection = (long) (totalPrice * (1.0 - npc.getTotalTaxRate(TaxType.SELL))); - npc.getCastle().addToTreasury(taxCollection); + final long taxCollection = (long) (totalPrice * (1.0 - merchant.getTotalTaxRate(TaxType.SELL))); + merchant.getCastle().addToTreasury(taxCollection); totalPrice -= taxCollection; } - player.addAdena("Sell", totalPrice, merchant, false); - // Update current load as well client.sendPacket(new ExUserInfoInvenWeight(player)); - client.sendPacket(new ExBuySellList(player, true)); + client.sendPacket(new ExBuySellList(player, true, merchant != null ? merchant.getTotalTaxRate(TaxType.SELL) : 0)); } } diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/network/serverpackets/ExBuySellList.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/network/serverpackets/ExBuySellList.java index ba31f33703..f793112067 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/network/serverpackets/ExBuySellList.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/network/serverpackets/ExBuySellList.java @@ -79,7 +79,7 @@ public class ExBuySellList extends AbstractItemPacket { writeItem(packet, item); packet.writeD(i++); - packet.writeQ((item.getItem().getReferencePrice() / 2) * item.getCount()); + packet.writeQ((long) ((item.getItem().getReferencePrice() / 2) * _taxRate)); } } else diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/network/serverpackets/SellList.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/network/serverpackets/SellList.java index ed71bcd4ee..433eae9095 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/network/serverpackets/SellList.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/network/serverpackets/SellList.java @@ -32,7 +32,7 @@ import com.l2jmobius.gameserver.network.OutgoingPackets; public class SellList implements IClientOutgoingPacket { private final L2PcInstance _activeChar; - private final L2MerchantInstance _lease; + private final L2MerchantInstance _merchant; private final long _money; private final List _sellList; @@ -44,10 +44,10 @@ public class SellList implements IClientOutgoingPacket public SellList(L2PcInstance player, L2MerchantInstance lease) { _activeChar = player; - _lease = lease; + _merchant = lease; _money = _activeChar.getAdena(); - if (_lease == null) + if (_merchant == null) { _sellList = new LinkedList<>(); final L2Summon pet = _activeChar.getPet(); @@ -71,15 +71,15 @@ public class SellList implements IClientOutgoingPacket OutgoingPackets.SELL_LIST.writeId(packet); packet.writeQ(_money); - packet.writeD(_lease == null ? 0x00 : 1000000 + _lease.getTemplate().getId()); + packet.writeD(_merchant == null ? 0x00 : 1000000 + _merchant.getTemplate().getId()); packet.writeH(_sellList.size()); for (L2ItemInstance item : _sellList) { int price = item.getItem().getReferencePrice() / 2; - if (_lease != null) + if (_merchant != null) { - price -= (price * _lease.getTotalTaxRate(TaxType.SELL)); + price -= (price * _merchant.getTotalTaxRate(TaxType.SELL)); } packet.writeH(item.getItem().getType1()); @@ -92,7 +92,7 @@ public class SellList implements IClientOutgoingPacket packet.writeH(item.getEnchantLevel()); packet.writeH(0x00); // TODO: Verify me packet.writeH(item.getCustomType2()); - packet.writeQ(item.getItem().getReferencePrice() / 2); + packet.writeQ(price); // T1 packet.writeH(item.getAttackAttributeType().getClientId()); packet.writeH(item.getAttackAttributePower());