(https://www.united-extreme.com/u3games/foro/proxy.php?request=http%3A%2F%2Fl2edit.ru%2Fdopjavaserv3%2Ff079fff0cd1d.jpg&hash=eb0f41bd5a68d04ce7cef61a63560001e42f8893)
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>