Noticias:

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

Menú Principal

Fences + Commandos

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

Tema anterior - Siguiente tema

Swarlog


Index: /trunk/aCis_gameserver/java/net/sf/l2j/gameserver/network/serverpackets/ExColosseumFenceInfoPacket.java
===================================================================
--- /trunk/aCis_gameserver/java/net/sf/l2j/gameserver/network/serverpackets/ExColosseumFenceInfoPacket.java    (revision 20)
+++ /trunk/aCis_gameserver/java/net/sf/l2j/gameserver/network/serverpackets/ExColosseumFenceInfoPacket.java    (revision 20)
@@ -0,0 +1,35 @@
+package net.sf.l2j.gameserver.network.serverpackets;
+
+import net.sf.l2j.gameserver.model.actor.instance.L2FenceInstance;
+
+public class ExColosseumFenceInfoPacket extends L2GameServerPacket
+{
+    private static final String _S__FE_03_EXCOLOSSEUMFENCEINFOPACKET = "[S] FE:03 ExColosseumFenceInfoPacket";
+    private L2FenceInstance _fence;
+   
+    public ExColosseumFenceInfoPacket(L2FenceInstance fence)
+    {
+        _fence = fence;
+    }
+   
+    @Override
+    protected void writeImpl()
+    {
+        writeC(0xfe);
+        writeH(0x09);
+       
+        writeD(_fence.getObjectId());
+        writeD(_fence.getType());
+        writeD(_fence.getX());
+        writeD(_fence.getY());
+        writeD(_fence.getZ());
+        writeD(_fence.getWidth());
+        writeD(_fence.getLength());
+    }
+   
+    @Override
+    public String getType()
+    {
+        return _S__FE_03_EXCOLOSSEUMFENCEINFOPACKET;
+    }
+}
Index: /trunk/aCis_gameserver/java/net/sf/l2j/gameserver/model/actor/instance/L2FenceInstance.java
===================================================================
--- /trunk/aCis_gameserver/java/net/sf/l2j/gameserver/model/actor/instance/L2FenceInstance.java    (revision 20)
+++ /trunk/aCis_gameserver/java/net/sf/l2j/gameserver/model/actor/instance/L2FenceInstance.java    (revision 20)
@@ -0,0 +1,129 @@
+package net.sf.l2j.gameserver.model.actor.instance;
+
+import net.sf.l2j.gameserver.model.L2Object;
+import net.sf.l2j.gameserver.model.actor.L2Character;
+import net.sf.l2j.gameserver.network.L2GameClient;
+import net.sf.l2j.gameserver.network.serverpackets.ActionFailed;
+import net.sf.l2j.gameserver.network.serverpackets.ExColosseumFenceInfoPacket;
+import net.sf.l2j.gameserver.network.serverpackets.MyTargetSelected;
+
+public final class L2FenceInstance extends L2Object
+{
+    private int _type;
+    private int _width;
+    private int _length;
+    private int xMin;
+    private int xMax;
+    private int yMin;
+    private int yMax;
+   
+    public L2FenceInstance(int objectId, int type, int width, int length, int x, int y)
+    {
+        super(objectId);
+        _type = type;
+        _width = width;
+        _length = length;
+       
+        xMin = x - width / 2;
+        xMax = x + width / 2;
+        yMin = y - length / 2;
+        yMax = y + length / 2;
+    }
+   
+    public boolean isBetween(int x, int y, int tx, int ty)
+    {
+        if (x < xMin && tx < xMin)
+            return false;
+       
+        if (x > xMax && tx > xMax)
+            return false;
+       
+        if (y < yMin && ty < yMin)
+            return false;
+       
+        if (y > yMax && ty > yMax)
+            return false;
+       
+        if (x > xMin && tx > xMin && x < xMax && tx < xMax && y > yMin && ty > yMin && y < yMax && ty < yMax)
+            return false;
+       
+        if (crossLinePart(xMin, yMin, xMax, yMin, x, y, tx, ty) || crossLinePart(xMax, yMin, xMax, yMax, x, y, tx, ty) || crossLinePart(xMax, yMax, xMin, yMax, x, y, tx, ty) || crossLinePart(xMin, yMax, xMin, yMin, x, y, tx, ty))
+            return true;
+       
+        return false;
+    }
+   
+    private boolean crossLinePart(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
+    {
+        float[] result = intersection(x1, y1, x2, y2, x3, y3, x4, y4);
+       
+        if (result == null)
+            return false;
+       
+        float xCross = result[0];
+        float yCross = result[1];
+       
+        if (xCross <= xMax && xCross >= xMin || yCross <= yMax && yCross >= yMin)
+            return true;
+       
+        return false;
+    }
+   
+    private static float[] intersection(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4)
+    {
+        float d = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);
+        if (d == 0)
+            return null;
+       
+        float xi = ((x3 - x4) * (x1 * y2 - y1 * x2) - (x1 - x2) * (x3 * y4 - y3 * x4)) / d;
+        float yi = ((y3 - y4) * (x1 * y2 - y1 * x2) - (y1 - y2) * (x3 * y4 - y3 * x4)) / d;
+       
+        float[] result = new float[2];
+        result[0] = xi;
+        result[1] = yi;
+        return result;
+    }
+   
+    @Override
+    public void sendInfo(L2PcInstance activeChar)
+    {
+        activeChar.sendPacket(new ExColosseumFenceInfoPacket(this));
+    }
+   
+    public int getType()
+    {
+        return _type;
+    }
+   
+    public int getWidth()
+    {
+        return _width;
+    }
+   
+    public int getLength()
+    {
+        return _length;
+    }
+   
+    @Override
+    public boolean isAutoAttackable(L2Character attacker)
+    {
+        return false;
+    }
+   
+    public void onActionShift(L2GameClient client)
+    {
+        L2PcInstance player = client.getActiveChar();
+        if (player == null)
+            return;
+       
+        if (player.isGM())
+        {
+            player.setTarget(this);
+            MyTargetSelected my = new MyTargetSelected(getObjectId(), 0);
+            player.sendPacket(my);
+        }
+        else
+            player.sendPacket(ActionFailed.STATIC_PACKET);
+    }
+}
Index: /trunk/aCis_gameserver/java/net/sf/l2j/gameserver/datatables/FenceTable.java
===================================================================
--- /trunk/aCis_gameserver/java/net/sf/l2j/gameserver/datatables/FenceTable.java    (revision 20)
+++ /trunk/aCis_gameserver/java/net/sf/l2j/gameserver/datatables/FenceTable.java    (revision 20)
@@ -0,0 +1,57 @@
+package net.sf.l2j.gameserver.datatables;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import net.sf.l2j.gameserver.model.L2Object;
+import net.sf.l2j.gameserver.model.actor.instance.L2FenceInstance;
+
+public class FenceTable
+{
+    public static ArrayList<L2FenceInstance> fences = new ArrayList<>();
+   
+    public static void addFence(L2FenceInstance fence)
+    {
+        fences.add(fence);
+    }
+   
+    public static ArrayList<L2FenceInstance> getAllFences()
+    {
+        return fences;
+    }
+   
+    public static void removeFence(L2FenceInstance fence)
+    {
+        if (fences.contains(fence))
+            fences.remove(fence);
+    }
+   
+    public static boolean canSeeTarget(L2Object source, int x, int y)
+    {
+        Collection<L2Object> objects = source.getKnownList().getKnownObjects();
+       
+        for (L2Object obj : objects)
+        {
+            if (obj instanceof L2FenceInstance)
+            {
+                L2FenceInstance fence = (L2FenceInstance) obj;
+               
+                if (fence.isBetween(source.getX(), source.getY(), x, y))
+                    return false;
+            }
+        }
+       
+        return true;
+    }
+   
+    public static boolean canSeeTarget(int x, int y, int tx, int ty)
+    {
+        for (L2FenceInstance fence : fences)
+        {
+            if (fence.isBetween(x, y, tx, ty))
+                return false;
+        }
+       
+        return true;
+    }
+}
Index: /trunk/aCis_gameserver/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminSpawn.java
===================================================================
--- /trunk/aCis_gameserver/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminSpawn.java    (revision 19)
+++ /trunk/aCis_gameserver/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminSpawn.java    (revision 20)
@@ -22,9 +22,13 @@
 import java.util.regex.Pattern;
 
+import javolution.text.TextBuilder;
+
 import net.sf.l2j.gameserver.SevenSigns;
+import net.sf.l2j.gameserver.datatables.FenceTable;
 import net.sf.l2j.gameserver.datatables.GmListTable;
 import net.sf.l2j.gameserver.datatables.NpcTable;
 import net.sf.l2j.gameserver.datatables.SpawnTable;
 import net.sf.l2j.gameserver.handler.IAdminCommandHandler;
+import net.sf.l2j.gameserver.idfactory.IdFactory;
 import net.sf.l2j.gameserver.instancemanager.DayNightSpawnManager;
 import net.sf.l2j.gameserver.instancemanager.RaidBossSpawnManager;
@@ -32,5 +36,7 @@
 import net.sf.l2j.gameserver.model.L2Spawn;
 import net.sf.l2j.gameserver.model.L2World;
+import net.sf.l2j.gameserver.model.L2WorldRegion;
 import net.sf.l2j.gameserver.model.actor.L2Npc;
+import net.sf.l2j.gameserver.model.actor.instance.L2FenceInstance;
 import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
 import net.sf.l2j.gameserver.network.SystemMessageId;
@@ -63,5 +69,8 @@
         "admin_show_npcs",
         "admin_spawnnight",
-        "admin_spawnday"
+        "admin_spawnday",
+        "admin_spawnfence",
+        "admin_deletefence",
+        "admin_listfence"
     };
     
@@ -190,23 +199,4 @@
             }
         }
-        else if (command.startsWith("admin_spawn"))
-        {
-            StringTokenizer st = new StringTokenizer(command, " ");
-            try
-            {
-                String cmd = st.nextToken();
-                String id = st.nextToken();
-                int respawnTime = st.hasMoreTokens() ? Integer.parseInt(st.nextToken()) : 0;
-               
-                if (cmd.equalsIgnoreCase("admin_spawn_once"))
-                    spawn(activeChar, id, respawnTime, false);
-                else
-                    spawn(activeChar, id, respawnTime, true);
-            }
-            catch (Exception e)
-            {
-                AdminHelpPage.showHelpPage(activeChar, "spawns.htm");
-            }
-        }
         else if (command.startsWith("admin_unspawnall"))
         {
@@ -234,4 +224,86 @@
             GmListTable.broadcastMessageToGMs("NPCs' respawn is now complete.");
         }
+        else if (command.startsWith("admin_spawnfence"))
+        {
+            StringTokenizer st = new StringTokenizer(command, " ");
+            try
+            {
+                st.nextToken();
+                int type = Integer.parseInt(st.nextToken());
+                int width = Integer.parseInt(st.nextToken());
+                int length = Integer.parseInt(st.nextToken());
+                int height = 1;
+                if (st.hasMoreTokens())
+                    height = Math.min(Integer.parseInt(st.nextToken()), 3);
+                for (int i = 0;i < height;i++)
+                {
+                    L2FenceInstance fence = new L2FenceInstance(IdFactory.getInstance().getNextId(), type, width, length, activeChar.getX(), activeChar.getY());
+                    fence.spawnMe(activeChar.getX(), activeChar.getY(), activeChar.getZ());
+                    FenceTable.addFence(fence);
+                }
+            }
+            catch (Exception e)
+            {
+                activeChar.sendMessage("Usage: //spawnfence <type> <width> <length> [<height>]");
+            }
+        }
+        else if (command.startsWith("admin_deletefence"))
+        {
+            StringTokenizer st = new StringTokenizer(command, " ");
+            st.nextToken();
+            try
+            {
+                L2Object fence = null;
+                if (activeChar.getTarget() instanceof L2FenceInstance)
+                    fence = activeChar.getTarget();
+                else if (st.hasMoreTokens())
+                {
+                    L2Object object = L2World.getInstance().findObject(Integer.parseInt(st.nextToken()));
+                    if (object instanceof L2FenceInstance)
+                        fence = object;
+                }
+                if (fence != null)
+                {
+                    L2WorldRegion region = fence.getWorldRegion();
+                    fence.decayMe();
+                    if (region != null)
+                        region.removeVisibleObject(fence);
+                    fence.getKnownList().removeAllKnownObjects();
+                    L2World.getInstance().removeObject(fence);
+                    activeChar.sendMessage("Deleted fence " + fence.getObjectId());
+                    if (fence instanceof L2FenceInstance)
+                        FenceTable.removeFence((L2FenceInstance) fence);
+                    if (st.hasMoreTokens())
+                        listFences(activeChar);
+                }
+                else
+                    throw new RuntimeException();
+            }
+            catch (Exception e)
+            {
+                activeChar.sendMessage("No fence targeted with shift+click or //deletefence <fence_objectId>");
+            }
+        }
+        else if (command.startsWith("admin_listfence"))
+            listFences(activeChar);
+        else if (command.startsWith("admin_spawn"))
+        {
+            StringTokenizer st = new StringTokenizer(command, " ");
+            try
+            {
+                String cmd = st.nextToken();
+                String id = st.nextToken();
+                int respawnTime = st.hasMoreTokens() ? Integer.parseInt(st.nextToken()) : 0;
+               
+                if (cmd.equalsIgnoreCase("admin_spawn_once"))
+                    spawn(activeChar, id, respawnTime, false);
+                else
+                    spawn(activeChar, id, respawnTime, true);
+            }
+            catch (Exception e)
+            {
+                AdminHelpPage.showHelpPage(activeChar, "spawns.htm");
+            }
+        }
         return true;
     }
@@ -340,3 +412,17 @@
         activeChar.sendPacket(html);
     }
+   
+    private static void listFences(L2PcInstance activeChar)
+    {
+        TextBuilder tb = new TextBuilder();
+       
+        tb.append("<html><body>Total Fences: " + FenceTable.getAllFences().size() + "<br><br>");
+        for (L2FenceInstance fence : FenceTable.getAllFences())
+            tb.append("<a action=\"bypass -h admin_deletefence " + fence.getObjectId() + " 1\">Fence: " + fence.getObjectId() + " [" + fence.getX() + " " + fence.getY() + " " + fence.getZ() + "]</a><br>");
+        tb.append("</body></html>");
+       
+        NpcHtmlMessage html = new NpcHtmlMessage(0);
+        html.setHtml(tb.toString());
+        activeChar.sendPacket(html);
+    }
 }
Index: /trunk/aCis_gameserver/java/net/sf/l2j/gameserver/GeoEngine.java
===================================================================
--- /trunk/aCis_gameserver/java/net/sf/l2j/gameserver/GeoEngine.java    (revision 19)
+++ /trunk/aCis_gameserver/java/net/sf/l2j/gameserver/GeoEngine.java    (revision 20)
@@ -35,4 +35,5 @@
 import net.sf.l2j.Config;
 import net.sf.l2j.gameserver.datatables.DoorTable;
+import net.sf.l2j.gameserver.datatables.FenceTable;
 import net.sf.l2j.gameserver.model.L2Object;
 import net.sf.l2j.gameserver.model.L2Spawn;
@@ -118,4 +119,7 @@
             return false;
         
+        if (!FenceTable.canSeeTarget(cha, target.getX(), target.getY()))
+            return false;
+       
         if (cha.getZ() >= target.getZ())
             return canSeeTarget(cha.getX(), cha.getY(), cha.getZ(), target.getX(), target.getY(), target.getZ());
@@ -167,7 +171,11 @@
     public boolean canSeeTargetDebug(L2PcInstance gm, L2Object target)
     {
+        if (!FenceTable.canSeeTarget(gm, target.getX(), target.getY()))
+            return false;
+       
         // comments: see above
         int z = gm.getZ() + 45;
         int z2 = target.getZ() + 45;
+       
         if (target instanceof L2DoorInstance)
         {
@@ -206,4 +214,7 @@
         Location startpoint = new Location(x, y, z);
         if (DoorTable.getInstance().checkIfDoorsBetween(x, y, z, tx, ty, tz))
+            return startpoint;
+       
+        if (!FenceTable.canSeeTarget(x,y, tx, ty))
             return startpoint;
         
Index: /trunk/aCis_datapack/data/xml/admin_commands_rights.xml
===================================================================
--- /trunk/aCis_datapack/data/xml/admin_commands_rights.xml    (revision 19)
+++ /trunk/aCis_datapack/data/xml/admin_commands_rights.xml    (revision 20)
@@ -380,3 +380,8 @@
     <aCar name="admin_zone_visual_clear" accessLevel="1" />
     
+    <!-- FENCES -->
+    <aCar name="admin_spawnfence" accessLevel="1" />
+    <aCar name="admin_deletefence" accessLevel="1" />
+    <aCar name="admin_listfence" accessLevel="1" />
+
 </list>