Noticias:

Debes de estar registrado para poder ver el contenido indicado. Registrate o Conectate

Menú Principal

Zona Custom PvP

Iniciado por Swarlog, Ago 19, 2022, 01:01 AM

Tema anterior - Siguiente tema

Swarlog

codigo para poner una zona de pvp zone custom. Permite restricciones de clases, restricciones de items etc.

### Eclipse Workspace Patch 1.0
#P L2J_DataPack_BETA
Index: dist/game/data/xsd/zones.xsd
===================================================================
--- dist/game/data/xsd/zones.xsd    (revision 9872)
+++ dist/game/data/xsd/zones.xsd    (working copy)
@@ -145,6 +145,7 @@
                                     <xs:enumeration value="TerritoryWarZone" />
                                     <xs:enumeration value="TownZone" />
                                     <xs:enumeration value="WaterZone" />
+                                    <xs:enumeration value="MultiFunctionZone" />
                                 </xs:restriction>
                             </xs:simpleType>
                         </xs:attribute>
Index: dist/game/data/zones/peace.xml
===================================================================
--- dist/game/data/zones/peace.xml    (revision 9872)
+++ dist/game/data/zones/peace.xml    (working copy)
@@ -948,4 +948,10 @@
         <node X="-113768" Y="-150965" />
         <node X="-115424" Y="-150965" />
     </zone>
+    <zone name="Custom" type="MultiFunctionZone" shape="NPoly" minZ="-15000" maxZ="-10000">
+        <node X="130000" Y="160000" />
+        <node X="130000" Y="130000" />
+        <node X="160000" Y="130000" />
+        <node X="160000" Y="160000" />
+    </zone>
 </list>
\ No newline at end of file
#P L2J_Server_BETA
Index: java/com/l2jserver/gameserver/network/serverpackets/Die.java
===================================================================
--- java/com/l2jserver/gameserver/network/serverpackets/Die.java    (revision 6165)
+++ java/com/l2jserver/gameserver/network/serverpackets/Die.java    (working copy)
@@ -31,6 +31,8 @@
 import com.l2jserver.gameserver.model.entity.Castle;
 import com.l2jserver.gameserver.model.entity.Fort;
 import com.l2jserver.gameserver.model.entity.clanhall.SiegableHall;
+import com.l2jserver.gameserver.model.zone.ZoneId;
+import com.l2jserver.gameserver.model.zone.type.L2MultiFunctionZone;
 
 public class Die extends L2GameServerPacket
 {
@@ -54,7 +56,7 @@
             _isJailed = player.isJailed();
         }
        
-        _canTeleport = cha.canRevive() && !cha.isPendingRevive();
+        _canTeleport = (cha.canRevive() && !cha.isPendingRevive()) || (cha.isInsideZone(ZoneId.MULTI_FUNCTION) && !L2MultiFunctionZone.revive);
         _sweepable = cha.isL2Attackable() && cha.isSweepActive();
     }
    
Index: java/com/l2jserver/gameserver/network/clientpackets/UseItem.java
===================================================================
--- java/com/l2jserver/gameserver/network/clientpackets/UseItem.java    (revision 6165)
+++ java/com/l2jserver/gameserver/network/clientpackets/UseItem.java    (working copy)
@@ -43,6 +43,8 @@
 import com.l2jserver.gameserver.model.items.type.L2ArmorType;
 import com.l2jserver.gameserver.model.items.type.L2WeaponType;
 import com.l2jserver.gameserver.model.skills.L2Skill;
+import com.l2jserver.gameserver.model.zone.ZoneId;
+import com.l2jserver.gameserver.model.zone.type.L2MultiFunctionZone;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
 import com.l2jserver.gameserver.network.serverpackets.ExUseSharedGroupItem;
@@ -128,6 +130,12 @@
             return;
         }
        
+        if (getClient().getActiveChar().isInsideZone(ZoneId.MULTI_FUNCTION) && !L2MultiFunctionZone.checkItem(item))
+        {
+            getClient().getActiveChar().sendMessage("You cannot use " + item.getName() + " inside this zone.");
+            return;
+        }
+       
         if (item.getItem().getType2() == L2Item.TYPE2_QUEST)
         {
             activeChar.sendPacket(SystemMessageId.CANNOT_USE_QUEST_ITEMS);
Index: java/com/l2jserver/gameserver/network/clientpackets/Logout.java
===================================================================
--- java/com/l2jserver/gameserver/network/clientpackets/Logout.java    (revision 6165)
+++ java/com/l2jserver/gameserver/network/clientpackets/Logout.java    (working copy)
@@ -26,6 +26,8 @@
 import com.l2jserver.gameserver.SevenSignsFestival;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.entity.L2Event;
+import com.l2jserver.gameserver.model.zone.ZoneId;
+import com.l2jserver.gameserver.model.zone.type.L2MultiFunctionZone;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
@@ -97,6 +99,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;
+        }
+       
         // Prevent player from logging out if they are a festival participant
         // and it is in progress, otherwise notify party members that the player
         // is not longer a participant.
Index: java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
===================================================================
--- java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java    (revision 6165)
+++ java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java    (working copy)
@@ -241,6 +241,7 @@
 import com.l2jserver.gameserver.model.zone.L2ZoneType;
 import com.l2jserver.gameserver.model.zone.ZoneId;
 import com.l2jserver.gameserver.model.zone.type.L2BossZone;
+import com.l2jserver.gameserver.model.zone.type.L2MultiFunctionZone;
 import com.l2jserver.gameserver.model.zone.type.L2NoRestartZone;
 import com.l2jserver.gameserver.network.L2GameClient;
 import com.l2jserver.gameserver.network.SystemMessageId;
@@ -5811,6 +5812,8 @@
             // Add karma to attacker and increase its PK counter
             setPvpKills(getPvpKills() + 1);
            
+            L2MultiFunctionZone.givereward(this);
+           
             // Send a Server->Client UserInfo packet to attacker with its Karma and PK Counter
             sendPacket(new UserInfo(this));
             sendPacket(new ExBrExtraUserInfo(this));
Index: java/com/l2jserver/gameserver/model/zone/type/L2MultiFunctionZone.java
===================================================================
--- java/com/l2jserver/gameserver/model/zone/type/L2MultiFunctionZone.java    (revision 0)
+++ java/com/l2jserver/gameserver/model/zone/type/L2MultiFunctionZone.java    (working copy)
@@ -0,0 +1,381 @@
+/*
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.l2jserver.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 javolution.util.FastList;
+
+import com.l2jserver.gameserver.ThreadPoolManager;
+import com.l2jserver.gameserver.datatables.SkillTable;
+import com.l2jserver.gameserver.model.actor.L2Character;
+import com.l2jserver.gameserver.model.actor.L2Summon;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.itemcontainer.PcInventory;
+import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
+import com.l2jserver.gameserver.model.skills.L2Skill;
+import com.l2jserver.gameserver.model.zone.ZoneId;
+import com.l2jserver.util.Rnd;
+
+/**
+ * @author Wyatt
+ * @version 1.3
+ */
+
+public class L2MultiFunctionZone extends L2RespawnZone
+{
+   
+    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 FastList<>();
+    private static List<String> grades = new FastList<>(), classes = new FastList<>();
+    public static List<int[]> rewards;
+    static String[] gradeNames =
+    {
+        "",
+        "D",
+        "C",
+        "B",
+        "A",
+        "S",
+        "S80",
+        "S84"
+    };
+   
+    @Override
+    protected void onEnter(L2Character character)
+    {
+        character.setInsideZone(ZoneId.NO_SUMMON_FRIEND, true);
+        character.setInsideZone(ZoneId.MULTI_FUNCTION, true);
+        if (!store_zone)
+        {
+            character.setInsideZone(ZoneId.NO_STORE, true);
+        }
+       
+        if (character instanceof L2PcInstance)
+        {
+            L2PcInstance activeChar = ((L2PcInstance) character);
+            if ((classes != null) && classes.contains("" + activeChar.getClassId().getId()))
+            {
+                activeChar.teleToLocation(83597, 147888, -3405);
+                activeChar.sendMessage("Your class is not allowed in the MultiFunction zone.");
+                return;
+            }
+           
+            for (L2ItemInstance o : activeChar.getInventory()._items)
+            {
+                if (o.isEquipable() && o.isEquipped() && !checkItem(o))
+                {
+                    int slot = activeChar.getInventory().getSlotFromItem(o);
+                    activeChar.getInventory().unEquipItemInBodySlot(slot);
+                    activeChar.sendMessage(o.getName() + " unequiped because is not allowed inside this zone.");
+                }
+            }
+            activeChar.sendMessage("You entered in a MultiFunction zone.");
+            clear(activeChar);
+            if (give_noblesse)
+            {
+                noblesse.getEffects(activeChar, activeChar);
+            }
+            if (pvp_enabled)
+            {
+                activeChar.updatePvPFlag(1);
+            }
+        }
+    }
+   
+    @Override
+    protected void onExit(L2Character character)
+    {
+        character.setInsideZone(ZoneId.NO_SUMMON_FRIEND, false);
+        character.setInsideZone(ZoneId.MULTI_FUNCTION, false);
+        if (!store_zone)
+        {
+            character.setInsideZone(ZoneId.NO_STORE, false);
+        }
+       
+        if (character instanceof L2PcInstance)
+        {
+            L2PcInstance activeChar = ((L2PcInstance) character);
+            activeChar.sendMessage("You left from a MultiFunction zone.");
+           
+            if (pvp_enabled)
+            {
+                activeChar.stopPvPFlag();
+            }
+        }
+    }
+   
+    @Override
+    public void onDieInside(final L2Character character)
+    {
+        if (character instanceof L2PcInstance)
+        {
+            final L2PcInstance activeChar = ((L2PcInstance) character);
+            if (revive)
+            {
+                ThreadPoolManager.getInstance().scheduleGeneral(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]);
+                    }
+                }, revive_delay * 1000);
+            }
+        }
+    }
+   
+    @Override
+    public void onReviveInside(L2Character character)
+    {
+        if (character instanceof L2PcInstance)
+        {
+            L2PcInstance activeChar = ((L2PcInstance) character);
+            if (revive_noblesse)
+            {
+                noblesse.getEffects(activeChar, activeChar);
+            }
+            if (revive_heal)
+            {
+                heal(activeChar);
+            }
+        }
+    }
+   
+    private void clear(L2PcInstance player)
+    {
+        if (remove_buffs)
+        {
+            player.stopAllEffectsExceptThoseThatLastThroughDeath();
+            if (remove_pets)
+            {
+                L2Summon pet = player.getSummon();
+                if (pet != null)
+                {
+                    pet.stopAllEffectsExceptThoseThatLastThroughDeath();
+                    pet.unSummon(player);
+                }
+            }
+        }
+        else
+        {
+            if (remove_pets)
+            {
+                L2Summon pet = player.getSummon();
+                if (pet != null)
+                {
+                    pet.unSummon(player);
+                }
+            }
+        }
+    }
+   
+    static void heal(L2PcInstance activeChar)
+    {
+        activeChar.setCurrentHp(activeChar.getMaxHp());
+        activeChar.setCurrentCp(activeChar.getMaxCp());
+        activeChar.setCurrentMp(activeChar.getMaxMp());
+    }
+   
+    public static void givereward(L2PcInstance 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(L2ItemInstance item)
+    {
+        int o = item.getItem().getCrystalType();
+        int e = item.getEnchantLevel();
+       
+        if ((enchant != 0) && (e >= enchant))
+        {
+            return false;
+        }
+       
+        if (grades.contains(gradeNames[o]))
+        {
+            return false;
+        }
+       
+        if ((items != null) && items.contains("" + item.getId()))
+        {
+            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") || i.equals("S80") || i.equals("S84"))
+                    {
+                        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"));
+            rewards = new ArrayList<>();
+            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;
+    }
+}
\ No newline at end of file
Index: java/com/l2jserver/gameserver/network/clientpackets/RequestRestart.java
===================================================================
--- java/com/l2jserver/gameserver/network/clientpackets/RequestRestart.java    (revision 6165)
+++ java/com/l2jserver/gameserver/network/clientpackets/RequestRestart.java    (working copy)
@@ -27,6 +27,8 @@
 import com.l2jserver.gameserver.instancemanager.AntiFeedManager;
 import com.l2jserver.gameserver.model.L2Party;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.zone.ZoneId;
+import com.l2jserver.gameserver.model.zone.type.L2MultiFunctionZone;
 import com.l2jserver.gameserver.network.L2GameClient;
 import com.l2jserver.gameserver.network.L2GameClient.GameClientState;
 import com.l2jserver.gameserver.network.SystemMessageId;
@@ -91,6 +93,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;
+        }
+       
         // Prevent player from restarting if they are a festival participant
         // and it is in progress, otherwise notify party members that the player
         // is not longer a participant.
Index: java/com/l2jserver/gameserver/model/itemcontainer/ItemContainer.java
===================================================================
--- java/com/l2jserver/gameserver/model/itemcontainer/ItemContainer.java    (revision 6165)
+++ java/com/l2jserver/gameserver/model/itemcontainer/ItemContainer.java    (working copy)
@@ -46,7 +46,7 @@
 {
     protected static final Logger _log = Logger.getLogger(ItemContainer.class.getName());
    
-    protected final List<L2ItemInstance> _items;
+    public final List<L2ItemInstance> _items;
    
     protected ItemContainer()
     {
Index: dist/game/config/MultiFunctionZone.properties
===================================================================
--- dist/game/config/MultiFunctionZone.properties    (revision 0)
+++ dist/game/config/MultiFunctionZone.properties    (working copy)
@@ -0,0 +1,60 @@
+# ---------------------------------------------------------------------------
+# MultiFunctionZone - custom addon for your server
+# ---------------------------------------------------------------------------
+# 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,S80,S84
+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
Index: java/com/l2jserver/gameserver/model/zone/ZoneId.java
===================================================================
--- java/com/l2jserver/gameserver/model/zone/ZoneId.java    (revision 6165)
+++ java/com/l2jserver/gameserver/model/zone/ZoneId.java    (working copy)
@@ -46,7 +46,8 @@
     ALTERED(19),
     NO_BOOKMARK(20),
     NO_ITEM_DROP(21),
-    NO_RESTART(22);
+    NO_RESTART(22),
+    MULTI_FUNCTION(23);
    
     private final int _id;

funcional en la ultima rev de l2jserver.