Jump to content

Recommended Posts

Posted (edited)

+++ java/net/sf/l2j/gameserver/network/clientpackets/RequestRecipeShopListSet.java 

+import net.sf.l2j.gameserver.model.zone.type.L2MultiFunctionZone;

@@ -62,6 +63,12 @@
                        return;
                }
               
+               if (player.isInsideZone(ZoneId.MULTI_FUNCTION) && !L2MultiFunctionZone.store_zone)
+               {
+                       player.sendMessage("You cannot craft while inside Multifunction zone.");
+                       return;
+               }
+              
                if (!player.isInsideZone(ZoneId.NO_STORE))
                {
                        player.sendPacket(SystemMessageId.NO_PRIVATE_WORKSHOP_HERE);

 

+++ java/net/sf/l2j/gameserver/network/clientpackets/Logout.java 

+import net.sf.l2j.gameserver.model.zone.type.L2MultiFunctionZone;

@@ -56,6 +57,13 @@
                        return;
                }
               
+               if (player.isInsideZone(ZoneId.MULTI_FUNCTION) && !L2MultiFunctionZone.logout_zone)
+               {
+                       player.sendMessage("You cannot Logout while inside a Multifunction zone.");
+                       player.sendPacket(ActionFailed.STATIC_PACKET);
+                       return;
+               }
+              
                if (player.isInsideZone(ZoneId.NO_RESTART))
                {
                        player.sendPacket(SystemMessageId.NO_LOGOUT_HERE);

+++java/net/sf/l2j/gameserver/model/zone/ZoneId.java

        DANGER_AREA(15),
        CAST_ON_ARTIFACT(16),
        NO_RESTART(17),
-       SCRIPT(18);
+       SCRIPT(18),
+       MULTI_FUNCTION(19);
       
        private final int _id;

+++java/net/sf/l2j/gameserver/network/clientpackets/SetPrivateStoreListBuy.java

+import net.sf.l2j.gameserver.model.zone.type.L2MultiFunctionZone;

@@ -83,6 +84,13 @@
                        return;
                }
               
+               if (player.isInsideZone(ZoneId.MULTI_FUNCTION) && !L2MultiFunctionZone.store_zone)
+               {
+                       player.sendPacket(new PrivateStoreManageListBuy(player));
+                       player.sendMessage("You cannot start store while inside Multifunction zone.");
+                       return;
+               }
+              
                if (!player.isInsideZone(ZoneId.NO_STORE))
                {
                        player.sendPacket(SystemMessageId.NO_PRIVATE_STORE_HERE);

+++java/net/sf/l2j/gameserver/network/clientpackets/SetPrivateStoreListSell.java

+import net.sf.l2j.gameserver.model.zone.type.L2MultiFunctionZone;

@@ -71,6 +72,13 @@
                        return;
                }
               
+               if (player.isInsideZone(ZoneId.MULTI_FUNCTION) && !L2MultiFunctionZone.store_zone)
+               {
+                       player.sendPacket(new PrivateStoreManageListSell(player, _packageSale));
+                       player.sendMessage("You cannot start store while inside Multifunction zone.");
+                       return;
+               }
+              
                if (!player.getAccessLevel().allowTransaction())
                {
                        player.sendPacket(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT);

+++java/net/sf/l2j/gameserver/network/serverpackets/Die.java.

+import net.sf.l2j.gameserver.model.zone.ZoneId;
+import net.sf.l2j.gameserver.model.zone.type.L2MultiFunctionZone;
 
 public class Die extends L2GameServerPacket
 {
        private final int _charObjId;
        private final boolean _fake;
        private boolean _sweepable;
+       private boolean _canTeleport;
        private L2AccessLevel _access = AccessLevels._userAccessLevel;
@@ -47,6 +50,7 @@

                        Player player = (Player) cha;
                        _access = player.getAccessLevel();
                        _clan = player.getClan();
+                       _canTeleport = !(player.isInsideZone(ZoneId.MULTI_FUNCTION) && L2MultiFunctionZone.revive);
@@ -86,7 +90,7 @@
         }
         else
         {
-            writeD(0x01); // to nearest village
+            writeD(_canTeleport ? 0x01 : 0); // to nearest village
             
@@ -96,7 +100,7 @@
-                   if (_clan != null)
+                   if (_canTeleport && _clan != null)
                    {
                       

++++java/net/sf/l2j/gameserver/model/actor/instance/Player.java

+import net.sf.l2j.gameserver.model.zone.type.L2MultiFunctionZone;

@@ -4384,6 +4385,8 @@
                        // Add PvP point to attacker.
                        setPvpKills(getPvpKills() + 1);
                       
+                        L2MultiFunctionZone.givereward(this);
+                      
                        // Send a Server->Client UserInfo packet to attacker with its Karma and PK Counter
                        sendPacket(new UserInfo(this));
                }

++++java/net/sf/l2j/gameserver/model/itemcontainer/ItemContainer.java

 {
        protected static final Logger _log = Logger.getLogger(ItemContainer.class.getName());
       
-       protected final List<ItemInstance> _items;
+       public final List<ItemInstance> _items;
       
        protected ItemContainer()
        {

+++java/net/sf/l2j/gameserver/model/zone/type/L2MultiFunctionZone.java 

CREATE NEW THIS FILE DOES NOT EXIST!

package net.sf.l2j.gameserver.model.zone.type;

import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import net.sf.l2j.commons.concurrent.ThreadPool;
import net.sf.l2j.commons.random.Rnd;

import net.sf.l2j.gameserver.datatables.SkillTable;
import net.sf.l2j.gameserver.model.L2Skill;
import net.sf.l2j.gameserver.model.actor.Creature;
import net.sf.l2j.gameserver.model.actor.Summon;
import net.sf.l2j.gameserver.model.actor.instance.Player;
import net.sf.l2j.gameserver.model.item.instance.ItemInstance;
import net.sf.l2j.gameserver.model.itemcontainer.PcInventory;
import net.sf.l2j.gameserver.model.zone.L2ZoneType;
import net.sf.l2j.gameserver.model.zone.ZoneId;

public class L2MultiFunctionZone extends L2ZoneType
{
	public L2MultiFunctionZone(int id)
	{
		super(id);
		loadConfigs();
	}
	
	public static boolean pvp_enabled, restart_zone, store_zone, logout_zone, revive_noblesse, revive_heal, revive, remove_buffs, remove_pets, give_noblesse;
	
	static int radius, enchant, revive_delay;
	static int[][] spawn_loc;
	
	L2Skill noblesse = SkillTable.getInstance().getInfo(1323, 1);
	
	private static List<String> items = new ArrayList<>(), classes = new ArrayList<>(), grades = new ArrayList<>();
	public static List<int[]> rewards = new ArrayList<>();
	
	static String[] gradeNames =
	{
		"",
		"D",
		"C",
		"B",
		"A",
		"S"
	};
	
	@Override
	protected void onEnter(Creature character)
	{
		character.setInsideZone(ZoneId.NO_SUMMON_FRIEND, true);
		character.setInsideZone(ZoneId.MULTI_FUNCTION, true);
		
		if (character instanceof Player)
		{
			Player activeChar = ((Player) character);
			if (classes != null && classes.contains("" + activeChar.getClassId().getId()))
			{
				activeChar.teleToLocation(83597, 147888, -3405, 0);
				activeChar.sendMessage("Your class is not allowed in the MultiFunction zone.");
				return;
			}
			
			for (ItemInstance o : activeChar.getInventory()._items)
			{
				if (o.isEquipable() && o.isEquipped() && !checkItem(o))
				{
					int slot = activeChar.getInventory().getSlotFromItem(o);
					activeChar.getInventory().unEquipItemInBodySlotAndRecord(slot);
					activeChar.sendMessage(o.getItemName() + " unequiped because is not allowed inside this zone.");
				}
			}
			
			if (give_noblesse)
				noblesse.getEffects(activeChar, activeChar);
			if (pvp_enabled)
				activeChar.updatePvPFlag(1);
			
			activeChar.sendMessage("You entered in a MultiFunction zone.");
			clear(activeChar);
		}
	}
	
	@Override
	protected void onExit(Creature character)
	{
		character.setInsideZone(ZoneId.NO_SUMMON_FRIEND, false);
		character.setInsideZone(ZoneId.MULTI_FUNCTION, false);
		
		if (character instanceof Player)
		{
			Player activeChar = ((Player) character);
			activeChar.sendMessage("You left from a MultiFunction zone.");
			
			if (pvp_enabled)
				activeChar.updatePvPFlag(0);
		}
	}
	
	@Override
	public void onDieInside(final Creature character)
	{
		if (character instanceof Player)
		{
			final Player activeChar = ((Player) character);
			if (revive)
			{
				ThreadPool.schedule(new Runnable()
				{
					@Override
					public void run()
					{
						activeChar.doRevive();
						heal(activeChar);
						int[] loc = spawn_loc[Rnd.get(spawn_loc.length)];
						activeChar.teleToLocation(loc[0] + Rnd.get(-radius, radius), loc[1] + Rnd.get(-radius, radius), loc[2], 0);
					}
				}, revive_delay * 1000);
			}
		}
	}
	
	@Override
	public void onReviveInside(Creature character)
	{
		if (character instanceof Player)
		{
			Player activeChar = ((Player) character);
			if (revive_noblesse)
				noblesse.getEffects(activeChar, activeChar);
			if (revive_heal)
				heal(activeChar);
		}
	}
	
	static void heal(Player activeChar)
	{
		activeChar.setCurrentHp(activeChar.getMaxHp());
		activeChar.setCurrentCp(activeChar.getMaxCp());
		activeChar.setCurrentMp(activeChar.getMaxMp());
	}
	
	private static void clear(Player player)
	{
		if (remove_buffs)
		{
			player.stopAllEffects();
			
			if (remove_pets)
			{
				Summon pet = player.getPet();
				if (pet != null)
				{
					pet.stopAllEffects();
					pet.unSummon(player);
				}
			}
		}
		else
		{
			if (remove_pets)
			{
				Summon pet = player.getPet();
				if (pet != null)
					pet.unSummon(player);
			}
		}
	}
	
	public static void givereward(Player player)
	{
		if (player.isInsideZone(ZoneId.MULTI_FUNCTION))
		{
			for (int[] reward : rewards)
			{
				PcInventory inv = player.getInventory();
				inv.addItem("Custom Reward", reward[0], reward[1], player, player);
			}
		}
	}
	
	public static boolean checkItem(ItemInstance item)
	{
		int o = item.getItem().getCrystalType().ordinal();
		int e = item.getEnchantLevel();
		
		if (enchant != 0 && e >= enchant)
			return false;
		
		if (grades.contains(gradeNames[o]))
			return false;
		
		if (items != null && items.contains("" + item.getItemId()))
			return false;
		
		return true;
	}
	
	private static void loadConfigs()
	{
		try
		{
			Properties prop = new Properties();
			prop.load(new FileInputStream(new File("./config/MultiFunctionZone.properties")));
			pvp_enabled = Boolean.parseBoolean(prop.getProperty("EnablePvP", "False"));
			spawn_loc = parseItemsList(prop.getProperty("SpawnLoc", "150111,144740,-12248"));
			revive_delay = Integer.parseInt(prop.getProperty("ReviveDelay", "10"));
			if (revive_delay != 0)
				revive = true;
			give_noblesse = Boolean.parseBoolean(prop.getProperty("GiveNoblesse", "False"));
			String[] propertySplit = prop.getProperty("Items", "").split(",");
			if (propertySplit.length != 0)
				for (String i : propertySplit)
					items.add(i);
			propertySplit = prop.getProperty("Grades", "").split(",");
			if (propertySplit.length != 0)
				for (String i : propertySplit)
					if (i.equals("D") || i.equals("C") || i.equals("B") || i.equals("A") || i.equals("S"))
						grades.add(i);
			propertySplit = prop.getProperty("Classes", "").split(",");
			if (propertySplit.length != 0)
				for (String i : propertySplit)
					classes.add(i);
			radius = Integer.parseInt(prop.getProperty("RespawnRadius", "500"));
			enchant = Integer.parseInt(prop.getProperty("Enchant", "0"));
			remove_buffs = Boolean.parseBoolean(prop.getProperty("RemoveBuffs", "False"));
			remove_pets = Boolean.parseBoolean(prop.getProperty("RemovePets", "False"));
			restart_zone = Boolean.parseBoolean(prop.getProperty("NoRestartZone", "False"));
			store_zone = Boolean.parseBoolean(prop.getProperty("NoStoreZone", "False"));
			logout_zone = Boolean.parseBoolean(prop.getProperty("NoLogoutZone", "False"));
			revive_noblesse = Boolean.parseBoolean(prop.getProperty("ReviveNoblesse", "False"));
			revive_heal = Boolean.parseBoolean(prop.getProperty("ReviveHeal", "False"));
			propertySplit = prop.getProperty("Rewards", "57,100000").split(";");
			for (String reward : propertySplit)
			{
				String[] rewardSplit = reward.split(",");
				if (rewardSplit.length == 2)
				{
					try
					{
						rewards.add(new int[]
						{
							Integer.parseInt(rewardSplit[0]),
							Integer.parseInt(rewardSplit[1])
						});
					}
					catch (NumberFormatException nfe)
					{
						
					}
				}
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}
	
	private static int[][] parseItemsList(String line)
	{
		final String[] propertySplit = line.split(";");
		if (propertySplit.length == 0)
			return null;
		
		int i = 0;
		String[] valueSplit;
		final int[][] result = new int[propertySplit.length][];
		for (String value : propertySplit)
		{
			valueSplit = value.split(",");
			if (valueSplit.length != 3)
				return null;
			
			result[i] = new int[3];
			try
			{
				result[i][0] = Integer.parseInt(valueSplit[0]);
			}
			catch (NumberFormatException e)
			{
				return null;
			}
			
			try
			{
				result[i][1] = Integer.parseInt(valueSplit[1]);
			}
			catch (NumberFormatException e)
			{
				return null;
			}
			
			try
			{
				result[i][2] = Integer.parseInt(valueSplit[2]);
			}
			catch (NumberFormatException e)
			{
				return null;
			}
			i++;
		}
		return result;
	}
}

++++java/net/sf/l2j/gameserver/network/clientpackets/UseItem.java

 

+import net.sf.l2j.gameserver.model.zone.ZoneId;
+import net.sf.l2j.gameserver.model.zone.type.L2MultiFunctionZone;
@@ -96,6 +98,12 @@
                if (item == null)
                        return;
               
+               if (getClient().getActiveChar().isInsideZone(ZoneId.MULTI_FUNCTION) && !L2MultiFunctionZone.checkItem(item))
+               {
+                       getClient().getActiveChar().sendMessage("You cannot use " +item.getName()+ " inside this zone.");
+                       return;
+               }
+     

+++java/net/sf/l2j/gameserver/network/clientpackets/RequestRestart.java

+import net.sf.l2j.gameserver.model.zone.type.L2MultiFunctionZone;
@@ -54,6 +55,13 @@
                        return;
                }
               
+               if (player.isInsideZone(ZoneId.MULTI_FUNCTION) && !L2MultiFunctionZone.restart_zone)
+               {
+                       player.sendMessage("You cannot restart while inside a Multifunction zone.");
+                       sendPacket(RestartResponse.valueOf(false));
+                       return;
+               }
+              
                if (player.isInsideZone(ZoneId.NO_RESTART))
                {
                        player.sendPacket(SystemMessageId.NO_RESTART_HERE);

+++config/MultiFunctionZone.properties

# ---------------------------------------------------------------------------
# MultiFunctionZone
# ---------------------------------------------------------------------------
# This option will turn on PvP flag to all people when entering to the zone
EnablePvP = True

# If set to false, zone will be no-restart zone
NoRestartZone = False

# If set to false, zone will be no-logout zone
NoLogoutZone = False

# If set to false, zone will be no-store zone
NoStoreZone = False

# Give noblesse after revive?
ReviveNoblesse = False

# Heal after revive?
ReviveHeal = False

# Delay, in seconds, to wait before revive
# 0 to disable
ReviveDelay = 10

# Set the spawn points where players will be teleported on revive, if enabled
# example:150111,144740,-12248;143665,144418,-12022;144443,147685,-12139
SpawnLoc = 150111,144740,-12248;143665,144418,-12022;144443,147685,-12139

# Random respawn radius
RespawnRadius = 500

# If set to true, players will take noblesse blessing when entering
GiveNoblesse = True

# Remove buffs when entering to the zone
RemoveBuffs = False

# Remove pets when entering to the zone
RemovePets = False

# Special rewards when hunting inside this zone
# example: 57,100000;14720,1
Rewards = 57,100000;14720,1

# List of Items(id's) that won't be usable inside this area and also will be unequiped when entering
# (armor, weapons, scrolls, potions, etc), example: 728,7575, 6383, 1538
Items = 728,7575,6383,1538

# List of Grades that won't be usable inside this area and also will be unequiped when entering
# example: D,C,B,A,S
Grades = C,B,A

# Items with this enchant or more won't be usable inside this area and also will be unequiped when entering
# 0 to disable
Enchant = 0

# Players with one of that classes won't be able to enter to the zone
# example: 93,85,12
Classes = 92
\ No newline at end of file

+++ data/xml/zones/MultiFunctionZone.xml 

<?xml version="1.0" encoding="UTF-8"?>
<list>
	<zone type="MultiFunctionZone" shape="Cuboid" minZ="-3752" maxZ="-352"><!-- gludin_pvp -->
		<node X="-88411" Y="141732" />
		<node X="-87429" Y="142708" />
		<spawn X="-86979" Y="142402" Z="-3643" />
	</zone>
</list>

CREDITS: ^Wyatt

Edited by ThelwHelpRePaidia
  • 1 year later...
Posted

There's few errors and optimizations to do.

 

1 - static variables shouldn't be static, otherwise only one zone property will be loaded for all.

 

	public static boolean pvp_enabled, restart_zone, store_zone, logout_zone, revive_noblesse, revive_heal, revive, remove_buffs, remove_pets, give_noblesse;
	
	static int radius, enchant, revive_delay;
	static int[][] spawn_loc;
	
	L2Skill noblesse = SkillTable.getInstance().getInfo(1323, 1);
	
	private static List<String> items = new ArrayList<>(), classes = new ArrayList<>(), grades = new ArrayList<>();
	public static List<int[]> rewards = new ArrayList<>();

2 - You loop the player inventory for nothing if "enchant", "grades", "items"  "gradeNames" are empty.

			for (ItemInstance o : activeChar.getInventory()._items)
			{
				if (o.isEquipable() && o.isEquipped() && !checkItem(o))
				{
					int slot = activeChar.getInventory().getSlotFromItem(o);
					activeChar.getInventory().unEquipItemInBodySlotAndRecord(slot);
					activeChar.sendMessage(o.getItemName() + " unequiped because is not allowed inside this zone.");
				}
			}

3 - following code is redundant and could be cut by 2 (no needs to stopAllEffects on a unSummon case, IL got no buff saves).

		if (remove_buffs)
		{
			player.stopAllEffects();
			
			if (remove_pets)
			{
				Summon pet = player.getPet();
				if (pet != null)
				{
					pet.stopAllEffects();
					pet.unSummon(player);
				}
			}
		}
		else
		{
			if (remove_pets)
			{
				Summon pet = player.getPet();
				if (pet != null)
					pet.unSummon(player);
			}
		}

>

 

		if (remove_buffs)
			player.stopAllEffects();

		if (remove_pets)
		{
			Summon pet = player.getPet();
			if (pet != null)
				pet.unSummon(player);
		}

4 - Few places where it can benefit from aCis organization, like lambda uses for ThreadPool usage or ExProperties instead of Properties.

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