Jump to content

Recommended Posts

Posted

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()

 

  • Thanks 1

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...