Hello everyone, here's a simple and useful idea for any type of server.
This code applies a discount when a player makes a purchase inside a clan’s castle or clan hall, offering a benefit to clan members who own a castle or clan hall.
Important: Merchant transactions must be handled through multisell, not buylist. The discount is directly applied within the multisell, so the price shown is already reduced.
"For example, if a scroll costs 1000 Adena and you set a 20% discount in the config, the final price when purchasing inside a castle or clan hall will be 800 Adena."
This code is developed on the public aCis 401 revision.
public static int CLAN_BASE_OWNERSHIP_MERCHANT_DISCOUNT;
CLAN_BASE_OWNERSHIP_MERCHANT_DISCOUNT = clans.getProperty("ClanBaseOwnershipMechantDiscount", 20);
# If clan owns a clan hall or castle, all members have a discount of X% at merchant transactions (multisell).
# Discount applies only inside the base (castle or clan hall).
ClanBaseOwnershipMechantDiscount = 20
/**
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/data/xml/MultisellData.java b/aCis_gameserver/java/net/sf/l2j/gameserver/data/xml/MultisellData.java
index 556e111..bbf8e69 100644
--- a/aCis_gameserver/java/net/sf/l2j/gameserver/data/xml/MultisellData.java
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/data/xml/MultisellData.java
@@ -101,7 +101,7 @@
do
{
// send list at least once even if size = 0
- player.sendPacket(new MultiSellList(list, index));
+ player.sendPacket(new MultiSellList(list, index, player));
index += PAGE_SIZE;
}
while (index < list.getEntries().size());
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/network/clientpackets/MultiSellChoose.java b/aCis_gameserver/java/net/sf/l2j/gameserver/network/clientpackets/MultiSellChoose.java
index 7c82c5b..1654abc 100644
--- a/aCis_gameserver/java/net/sf/l2j/gameserver/network/clientpackets/MultiSellChoose.java
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/network/clientpackets/MultiSellChoose.java
@@ -6,6 +6,7 @@
import net.sf.l2j.Config;
import net.sf.l2j.gameserver.enums.FloodProtector;
import net.sf.l2j.gameserver.enums.StatusType;
+import net.sf.l2j.gameserver.enums.ZoneId;
import net.sf.l2j.gameserver.enums.items.CrystalType;
import net.sf.l2j.gameserver.model.Augmentation;
import net.sf.l2j.gameserver.model.actor.Player;
@@ -225,6 +226,20 @@
return;
}
+ if (player.isInsideZone(ZoneId.CLAN_HALL) && player.getClan() != null && player.getClan().hasClanHall())
+ {
+ e.setItemCount(e.getItemCount() * (100 - Config.CLAN_BASE_OWNERSHIP_MERCHANT_DISCOUNT) / 100);
+ if (e.getItemCount() == 0)
+ e.setItemCount(1);
+ }
+
+ if (player.isInsideZone(ZoneId.CASTLE) && player.getClan() != null && player.getClan().hasCastle())
+ {
+ e.setItemCount(e.getItemCount() * (100 - Config.CLAN_BASE_OWNERSHIP_MERCHANT_DISCOUNT) / 100);
+ if (e.getItemCount() == 0)
+ e.setItemCount(1);
+ }
+
if (Config.BLACKSMITH_USE_RECIPES || !e.getMaintainIngredient())
{
// if it's a stackable item, just reduce the amount from the first (only) instance that is found in the inventory
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/network/serverpackets/MultiSellList.java b/aCis_gameserver/java/net/sf/l2j/gameserver/network/serverpackets/MultiSellList.java
index 9269b06..c6102a0 100644
--- a/aCis_gameserver/java/net/sf/l2j/gameserver/network/serverpackets/MultiSellList.java
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/network/serverpackets/MultiSellList.java
@@ -2,6 +2,9 @@
import static net.sf.l2j.gameserver.data.xml.MultisellData.PAGE_SIZE;
+import net.sf.l2j.Config;
+import net.sf.l2j.gameserver.enums.ZoneId;
+import net.sf.l2j.gameserver.model.actor.Player;
import net.sf.l2j.gameserver.model.multisell.Entry;
import net.sf.l2j.gameserver.model.multisell.Ingredient;
import net.sf.l2j.gameserver.model.multisell.ListContainer;
@@ -15,7 +18,9 @@
private boolean _finished;
- public MultiSellList(ListContainer list, int index)
+ private Player _player;
+
+ public MultiSellList(ListContainer list, int index, Player player)
{
_list = list;
_index = index;
@@ -28,6 +33,8 @@
}
else
_finished = true;
+
+ _player = player;
}
@Override
@@ -74,7 +81,14 @@
{
writeH(ing.getItemId());
writeH(ing.getTemplate() != null ? ing.getTemplate().getType2() : 65535);
- writeD(ing.getItemCount());
+
+ if (_player.isInsideZone(ZoneId.CLAN_HALL) && _player.getClan() != null && _player.getClan().hasClanHall())
+ writeD((ing.getItemCount() * (100 - Config.CLAN_BASE_OWNERSHIP_MERCHANT_DISCOUNT) / 100) < 1 ? 1 : ing.getItemCount() * 80 / 100);
+ else if (_player.isInsideZone(ZoneId.CASTLE) && _player.getClan() != null && _player.getClan().hasCastle())
+ writeD((ing.getItemCount() * (100 - Config.CLAN_BASE_OWNERSHIP_MERCHANT_DISCOUNT) / 100) < 1 ? 1 : ing.getItemCount() * 80 / 100);
+ else
+ writeD(ing.getItemCount());
+
writeH(ing.getEnchantLevel());
writeD(0x00); // TODO: i.getAugmentId()
writeD(0x00); // TODO: i.getManaLeft()