From b3c92bebee255587ca97b7b40edbd1528715ddeb Mon Sep 17 00:00:00 2001
From: MobiusDevelopment <8391001+MobiusDevelopment@users.noreply.github.com>
Date: Tue, 16 Aug 2022 21:02:41 +0000
Subject: [PATCH] Implemented admin delete_group command.
---
.../dist/game/config/AdminCommands.xml | 1 +
.../admincommandhandlers/AdminDelete.java | 132 +++++++++++++++---
.../l2jmobius/gameserver/data/SpawnTable.java | 128 ++++++++++++-----
.../dist/game/config/AdminCommands.xml | 1 +
.../admincommandhandlers/AdminDelete.java | 132 +++++++++++++++---
.../l2jmobius/gameserver/data/SpawnTable.java | 128 ++++++++++++-----
.../dist/game/config/AdminCommands.xml | 1 +
.../admincommandhandlers/AdminDelete.java | 132 +++++++++++++++---
.../l2jmobius/gameserver/data/SpawnTable.java | 128 ++++++++++++-----
.../dist/game/config/AdminCommands.xml | 1 +
.../admincommandhandlers/AdminDelete.java | 132 +++++++++++++++---
.../l2jmobius/gameserver/data/SpawnTable.java | 128 ++++++++++++-----
.../dist/game/config/AdminCommands.xml | 1 +
.../admincommandhandlers/AdminDelete.java | 132 +++++++++++++++---
.../l2jmobius/gameserver/data/SpawnTable.java | 128 ++++++++++++-----
.../dist/game/config/AdminCommands.xml | 1 +
.../admincommandhandlers/AdminDelete.java | 132 +++++++++++++++---
.../l2jmobius/gameserver/data/SpawnTable.java | 128 ++++++++++++-----
.../dist/game/config/AdminCommands.xml | 1 +
.../admincommandhandlers/AdminDelete.java | 132 +++++++++++++++---
.../l2jmobius/gameserver/data/SpawnTable.java | 128 ++++++++++++-----
.../dist/game/config/AdminCommands.xml | 1 +
.../admincommandhandlers/AdminDelete.java | 132 +++++++++++++++---
.../l2jmobius/gameserver/data/SpawnTable.java | 128 ++++++++++++-----
.../dist/game/config/AdminCommands.xml | 1 +
.../admincommandhandlers/AdminDelete.java | 132 +++++++++++++++---
.../l2jmobius/gameserver/data/SpawnTable.java | 128 ++++++++++++-----
.../dist/game/config/AdminCommands.xml | 1 +
.../admincommandhandlers/AdminDelete.java | 132 +++++++++++++++---
.../l2jmobius/gameserver/data/SpawnTable.java | 128 ++++++++++++-----
.../dist/game/config/AdminCommands.xml | 1 +
.../admincommandhandlers/AdminDelete.java | 132 +++++++++++++++---
.../l2jmobius/gameserver/data/SpawnTable.java | 128 ++++++++++++-----
.../dist/game/config/AdminCommands.xml | 1 +
.../admincommandhandlers/AdminDelete.java | 132 +++++++++++++++---
.../l2jmobius/gameserver/data/SpawnTable.java | 128 ++++++++++++-----
.../dist/game/config/AdminCommands.xml | 1 +
.../admincommandhandlers/AdminDelete.java | 111 ++++++++++++---
.../l2jmobius/gameserver/data/SpawnTable.java | 97 +++++++++----
.../dist/game/config/AdminCommands.xml | 1 +
.../admincommandhandlers/AdminDelete.java | 111 ++++++++++++---
.../l2jmobius/gameserver/data/SpawnTable.java | 97 +++++++++----
.../dist/game/config/AdminCommands.xml | 1 +
.../admincommandhandlers/AdminDelete.java | 111 ++++++++++++---
.../l2jmobius/gameserver/data/SpawnTable.java | 97 +++++++++----
.../dist/game/config/AdminCommands.xml | 1 +
.../admincommandhandlers/AdminDelete.java | 132 +++++++++++++++---
.../l2jmobius/gameserver/data/SpawnTable.java | 128 ++++++++++++-----
.../dist/game/config/AdminCommands.xml | 1 +
.../admincommandhandlers/AdminDelete.java | 132 +++++++++++++++---
.../l2jmobius/gameserver/data/SpawnTable.java | 128 ++++++++++++-----
.../dist/game/config/AdminCommands.xml | 1 +
.../admincommandhandlers/AdminDelete.java | 132 +++++++++++++++---
.../l2jmobius/gameserver/data/SpawnTable.java | 128 ++++++++++++-----
.../dist/game/config/AdminCommands.xml | 1 +
.../admincommandhandlers/AdminDelete.java | 132 +++++++++++++++---
.../l2jmobius/gameserver/data/SpawnTable.java | 128 ++++++++++++-----
.../dist/game/config/AdminCommands.xml | 1 +
.../admincommandhandlers/AdminDelete.java | 132 +++++++++++++++---
.../l2jmobius/gameserver/data/SpawnTable.java | 128 ++++++++++++-----
.../dist/game/config/AdminCommands.xml | 1 +
.../admincommandhandlers/AdminDelete.java | 132 +++++++++++++++---
.../l2jmobius/gameserver/data/SpawnTable.java | 128 ++++++++++++-----
.../dist/game/config/AdminCommands.xml | 1 +
.../admincommandhandlers/AdminDelete.java | 132 +++++++++++++++---
.../l2jmobius/gameserver/data/SpawnTable.java | 128 ++++++++++++-----
.../dist/game/config/AdminCommands.xml | 1 +
.../admincommandhandlers/AdminDelete.java | 132 +++++++++++++++---
.../l2jmobius/gameserver/data/SpawnTable.java | 128 ++++++++++++-----
.../dist/game/config/AdminCommands.xml | 1 +
.../admincommandhandlers/AdminDelete.java | 132 +++++++++++++++---
.../l2jmobius/gameserver/data/SpawnTable.java | 128 ++++++++++++-----
.../dist/game/config/AdminCommands.xml | 1 +
.../admincommandhandlers/AdminDelete.java | 132 +++++++++++++++---
.../l2jmobius/gameserver/data/SpawnTable.java | 128 ++++++++++++-----
.../dist/game/config/AdminCommands.xml | 1 +
.../admincommandhandlers/AdminDelete.java | 132 +++++++++++++++---
.../l2jmobius/gameserver/data/SpawnTable.java | 128 ++++++++++++-----
.../dist/game/config/AdminCommands.xml | 1 +
.../admincommandhandlers/AdminDelete.java | 132 +++++++++++++++---
.../l2jmobius/gameserver/data/SpawnTable.java | 128 ++++++++++++-----
.../dist/game/config/AdminCommands.xml | 1 +
.../admincommandhandlers/AdminDelete.java | 132 +++++++++++++++---
.../l2jmobius/gameserver/data/SpawnTable.java | 128 ++++++++++++-----
84 files changed, 5602 insertions(+), 1550 deletions(-)
diff --git a/L2J_Mobius_01.0_Ertheia/dist/game/config/AdminCommands.xml b/L2J_Mobius_01.0_Ertheia/dist/game/config/AdminCommands.xml
index 9b610a1b81..f15749aadb 100644
--- a/L2J_Mobius_01.0_Ertheia/dist/game/config/AdminCommands.xml
+++ b/L2J_Mobius_01.0_Ertheia/dist/game/config/AdminCommands.xml
@@ -95,6 +95,7 @@
+
diff --git a/L2J_Mobius_01.0_Ertheia/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java b/L2J_Mobius_01.0_Ertheia/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
index cd80804c69..0a91636ead 100644
--- a/L2J_Mobius_01.0_Ertheia/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
+++ b/L2J_Mobius_01.0_Ertheia/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
@@ -16,7 +16,11 @@
*/
package handlers.admincommandhandlers;
+import java.util.Collections;
+import java.util.List;
+
import org.l2jmobius.gameserver.data.SpawnTable;
+import org.l2jmobius.gameserver.handler.AdminCommandHandler;
import org.l2jmobius.gameserver.handler.IAdminCommandHandler;
import org.l2jmobius.gameserver.instancemanager.DBSpawnManager;
import org.l2jmobius.gameserver.model.Spawn;
@@ -24,23 +28,32 @@ import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
import org.l2jmobius.gameserver.util.BuilderUtil;
import org.l2jmobius.gameserver.util.Util;
/**
- * This class handles following admin commands: - delete = deletes target
+ * @author Mobius
*/
public class AdminDelete implements IAdminCommandHandler
{
private static final String[] ADMIN_COMMANDS =
{
- "admin_delete"
+ "admin_delete", // supports range parameter
+ "admin_delete_group" // for territory spawns
};
@Override
public boolean useAdminCommand(String command, Player activeChar)
{
- if (command.startsWith("admin_delete"))
+ if (command.contains("group"))
+ {
+ handleDeleteGroup(activeChar);
+ }
+ else if (command.startsWith("admin_delete"))
{
final String[] split = command.split(" ");
handleDelete(activeChar, (split.length > 1) && Util.isDigit(split[1]) ? Integer.parseInt(split[1]) : 0);
@@ -48,48 +61,125 @@ public class AdminDelete implements IAdminCommandHandler
return true;
}
- private void handleDelete(Player activeChar, int range)
+ private void handleDelete(Player player, int range)
{
if (range > 0)
{
- World.getInstance().forEachVisibleObjectInRange(activeChar, Npc.class, range, target ->
- {
- deleteNpc(activeChar, target);
- });
+ World.getInstance().forEachVisibleObjectInRange(player, Npc.class, range, target -> deleteNpc(player, target));
return;
}
- final WorldObject obj = activeChar.getTarget();
+ final WorldObject obj = player.getTarget();
if (obj instanceof Npc)
{
- deleteNpc(activeChar, (Npc) obj);
+ deleteNpc(player, (Npc) obj);
}
else
{
- BuilderUtil.sendSysMessage(activeChar, "Incorrect target.");
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
}
}
- private void deleteNpc(Player activeChar, Npc target)
+ private void handleDeleteGroup(Player player)
+ {
+ final WorldObject obj = player.getTarget();
+ if (obj instanceof Npc)
+ {
+ deleteGroup(player, (Npc) obj);
+ }
+ else
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ }
+
+ private void deleteNpc(Player player, Npc target)
{
- target.deleteMe();
-
final Spawn spawn = target.getSpawn();
if (spawn != null)
{
- spawn.stopRespawn();
-
- if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ if (territories.isEmpty())
{
- DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ }
+ }
+ if (territories.isEmpty())
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
else
{
- SpawnTable.getInstance().deleteSpawn(spawn, true);
+ AdminCommandHandler.getInstance().useAdminCommand(player, AdminDelete.ADMIN_COMMANDS[1], true);
+ }
+ }
+ }
+
+ private void deleteGroup(Player player, Npc target)
+ {
+ final Spawn spawn = target.getSpawn();
+ if (spawn != null)
+ {
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
+ {
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
+ }
+ }
+ if (territories.isEmpty())
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ else
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+
+ if (group != null)
+ {
+ for (NpcSpawnTemplate template : group.getSpawns())
+ {
+ template.despawn();
+ }
+ }
+ else if (simpleTerritory && (npcSpawnTemplate != null))
+ {
+ npcSpawnTemplate.despawn();
+ }
+
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " group from " + target.getObjectId() + ".");
}
}
-
- BuilderUtil.sendSysMessage(activeChar, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
@Override
diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/data/SpawnTable.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/data/SpawnTable.java
index 986e4f1195..869f325b27 100644
--- a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/data/SpawnTable.java
+++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/data/SpawnTable.java
@@ -22,6 +22,7 @@ import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -33,6 +34,9 @@ import org.l2jmobius.gameserver.data.xml.NpcData;
import org.l2jmobius.gameserver.model.Spawn;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
/**
* Spawn data retriever.
@@ -202,50 +206,104 @@ public class SpawnTable
{
final BufferedReader reader = new BufferedReader(new FileReader(spawnFile));
final BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
- final String spawnId = String.valueOf(spawn.getId());
- final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
- final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
- final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
boolean found = false; // in XML you can have more than one spawn with same coords
boolean isMultiLine = false; // in case spawn has more stats
boolean lastLineFound = false; // used to check for empty file
int lineCount = 0;
String currentLine;
- while ((currentLine = reader.readLine()) != null)
+
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
{
- if (!found)
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
{
- if (isMultiLine)
- {
- if (currentLine.contains(""))
- {
- found = true;
- }
- continue;
- }
- if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
- {
- if (!currentLine.contains("/>") && !currentLine.contains(""))
- {
- isMultiLine = true;
- }
- else
- {
- found = true;
- }
- continue;
- }
- }
- writer.write(currentLine + Config.EOL);
- if (currentLine.contains(""))
- {
- lastLineFound = true;
- }
- if (!lastLineFound)
- {
- lineCount++;
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
}
}
+
+ if (territories.isEmpty())
+ {
+ final String spawnId = String.valueOf(spawn.getId());
+ final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
+ final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
+ final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
+ while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains(""))
+ {
+ found = true;
+ }
+ continue;
+ }
+ if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
+ {
+ if (!currentLine.contains("/>") && !currentLine.contains(""))
+ {
+ isMultiLine = true;
+ }
+ else
+ {
+ found = true;
+ }
+ continue;
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+ else
+ {
+ SEARCH: while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains("") || (simpleTerritory && currentLine.contains("")))
+ {
+ found = true;
+ }
+ continue;
+ }
+ for (SpawnTerritory territory : territories)
+ {
+ if (currentLine.contains('"' + territory.getName() + '"'))
+ {
+ isMultiLine = true;
+ continue SEARCH;
+ }
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+
writer.close();
reader.close();
spawnFile.delete();
diff --git a/L2J_Mobius_02.5_Underground/dist/game/config/AdminCommands.xml b/L2J_Mobius_02.5_Underground/dist/game/config/AdminCommands.xml
index 9b610a1b81..f15749aadb 100644
--- a/L2J_Mobius_02.5_Underground/dist/game/config/AdminCommands.xml
+++ b/L2J_Mobius_02.5_Underground/dist/game/config/AdminCommands.xml
@@ -95,6 +95,7 @@
+
diff --git a/L2J_Mobius_02.5_Underground/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java b/L2J_Mobius_02.5_Underground/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
index cd80804c69..0a91636ead 100644
--- a/L2J_Mobius_02.5_Underground/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
+++ b/L2J_Mobius_02.5_Underground/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
@@ -16,7 +16,11 @@
*/
package handlers.admincommandhandlers;
+import java.util.Collections;
+import java.util.List;
+
import org.l2jmobius.gameserver.data.SpawnTable;
+import org.l2jmobius.gameserver.handler.AdminCommandHandler;
import org.l2jmobius.gameserver.handler.IAdminCommandHandler;
import org.l2jmobius.gameserver.instancemanager.DBSpawnManager;
import org.l2jmobius.gameserver.model.Spawn;
@@ -24,23 +28,32 @@ import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
import org.l2jmobius.gameserver.util.BuilderUtil;
import org.l2jmobius.gameserver.util.Util;
/**
- * This class handles following admin commands: - delete = deletes target
+ * @author Mobius
*/
public class AdminDelete implements IAdminCommandHandler
{
private static final String[] ADMIN_COMMANDS =
{
- "admin_delete"
+ "admin_delete", // supports range parameter
+ "admin_delete_group" // for territory spawns
};
@Override
public boolean useAdminCommand(String command, Player activeChar)
{
- if (command.startsWith("admin_delete"))
+ if (command.contains("group"))
+ {
+ handleDeleteGroup(activeChar);
+ }
+ else if (command.startsWith("admin_delete"))
{
final String[] split = command.split(" ");
handleDelete(activeChar, (split.length > 1) && Util.isDigit(split[1]) ? Integer.parseInt(split[1]) : 0);
@@ -48,48 +61,125 @@ public class AdminDelete implements IAdminCommandHandler
return true;
}
- private void handleDelete(Player activeChar, int range)
+ private void handleDelete(Player player, int range)
{
if (range > 0)
{
- World.getInstance().forEachVisibleObjectInRange(activeChar, Npc.class, range, target ->
- {
- deleteNpc(activeChar, target);
- });
+ World.getInstance().forEachVisibleObjectInRange(player, Npc.class, range, target -> deleteNpc(player, target));
return;
}
- final WorldObject obj = activeChar.getTarget();
+ final WorldObject obj = player.getTarget();
if (obj instanceof Npc)
{
- deleteNpc(activeChar, (Npc) obj);
+ deleteNpc(player, (Npc) obj);
}
else
{
- BuilderUtil.sendSysMessage(activeChar, "Incorrect target.");
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
}
}
- private void deleteNpc(Player activeChar, Npc target)
+ private void handleDeleteGroup(Player player)
+ {
+ final WorldObject obj = player.getTarget();
+ if (obj instanceof Npc)
+ {
+ deleteGroup(player, (Npc) obj);
+ }
+ else
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ }
+
+ private void deleteNpc(Player player, Npc target)
{
- target.deleteMe();
-
final Spawn spawn = target.getSpawn();
if (spawn != null)
{
- spawn.stopRespawn();
-
- if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ if (territories.isEmpty())
{
- DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ }
+ }
+ if (territories.isEmpty())
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
else
{
- SpawnTable.getInstance().deleteSpawn(spawn, true);
+ AdminCommandHandler.getInstance().useAdminCommand(player, AdminDelete.ADMIN_COMMANDS[1], true);
+ }
+ }
+ }
+
+ private void deleteGroup(Player player, Npc target)
+ {
+ final Spawn spawn = target.getSpawn();
+ if (spawn != null)
+ {
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
+ {
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
+ }
+ }
+ if (territories.isEmpty())
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ else
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+
+ if (group != null)
+ {
+ for (NpcSpawnTemplate template : group.getSpawns())
+ {
+ template.despawn();
+ }
+ }
+ else if (simpleTerritory && (npcSpawnTemplate != null))
+ {
+ npcSpawnTemplate.despawn();
+ }
+
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " group from " + target.getObjectId() + ".");
}
}
-
- BuilderUtil.sendSysMessage(activeChar, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
@Override
diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/data/SpawnTable.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/data/SpawnTable.java
index 986e4f1195..869f325b27 100644
--- a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/data/SpawnTable.java
+++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/data/SpawnTable.java
@@ -22,6 +22,7 @@ import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -33,6 +34,9 @@ import org.l2jmobius.gameserver.data.xml.NpcData;
import org.l2jmobius.gameserver.model.Spawn;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
/**
* Spawn data retriever.
@@ -202,50 +206,104 @@ public class SpawnTable
{
final BufferedReader reader = new BufferedReader(new FileReader(spawnFile));
final BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
- final String spawnId = String.valueOf(spawn.getId());
- final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
- final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
- final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
boolean found = false; // in XML you can have more than one spawn with same coords
boolean isMultiLine = false; // in case spawn has more stats
boolean lastLineFound = false; // used to check for empty file
int lineCount = 0;
String currentLine;
- while ((currentLine = reader.readLine()) != null)
+
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
{
- if (!found)
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
{
- if (isMultiLine)
- {
- if (currentLine.contains(""))
- {
- found = true;
- }
- continue;
- }
- if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
- {
- if (!currentLine.contains("/>") && !currentLine.contains(""))
- {
- isMultiLine = true;
- }
- else
- {
- found = true;
- }
- continue;
- }
- }
- writer.write(currentLine + Config.EOL);
- if (currentLine.contains(""))
- {
- lastLineFound = true;
- }
- if (!lastLineFound)
- {
- lineCount++;
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
}
}
+
+ if (territories.isEmpty())
+ {
+ final String spawnId = String.valueOf(spawn.getId());
+ final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
+ final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
+ final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
+ while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains(""))
+ {
+ found = true;
+ }
+ continue;
+ }
+ if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
+ {
+ if (!currentLine.contains("/>") && !currentLine.contains(""))
+ {
+ isMultiLine = true;
+ }
+ else
+ {
+ found = true;
+ }
+ continue;
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+ else
+ {
+ SEARCH: while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains("") || (simpleTerritory && currentLine.contains("")))
+ {
+ found = true;
+ }
+ continue;
+ }
+ for (SpawnTerritory territory : territories)
+ {
+ if (currentLine.contains('"' + territory.getName() + '"'))
+ {
+ isMultiLine = true;
+ continue SEARCH;
+ }
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+
writer.close();
reader.close();
spawnFile.delete();
diff --git a/L2J_Mobius_03.0_Helios/dist/game/config/AdminCommands.xml b/L2J_Mobius_03.0_Helios/dist/game/config/AdminCommands.xml
index 9b610a1b81..f15749aadb 100644
--- a/L2J_Mobius_03.0_Helios/dist/game/config/AdminCommands.xml
+++ b/L2J_Mobius_03.0_Helios/dist/game/config/AdminCommands.xml
@@ -95,6 +95,7 @@
+
diff --git a/L2J_Mobius_03.0_Helios/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java b/L2J_Mobius_03.0_Helios/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
index cd80804c69..0a91636ead 100644
--- a/L2J_Mobius_03.0_Helios/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
+++ b/L2J_Mobius_03.0_Helios/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
@@ -16,7 +16,11 @@
*/
package handlers.admincommandhandlers;
+import java.util.Collections;
+import java.util.List;
+
import org.l2jmobius.gameserver.data.SpawnTable;
+import org.l2jmobius.gameserver.handler.AdminCommandHandler;
import org.l2jmobius.gameserver.handler.IAdminCommandHandler;
import org.l2jmobius.gameserver.instancemanager.DBSpawnManager;
import org.l2jmobius.gameserver.model.Spawn;
@@ -24,23 +28,32 @@ import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
import org.l2jmobius.gameserver.util.BuilderUtil;
import org.l2jmobius.gameserver.util.Util;
/**
- * This class handles following admin commands: - delete = deletes target
+ * @author Mobius
*/
public class AdminDelete implements IAdminCommandHandler
{
private static final String[] ADMIN_COMMANDS =
{
- "admin_delete"
+ "admin_delete", // supports range parameter
+ "admin_delete_group" // for territory spawns
};
@Override
public boolean useAdminCommand(String command, Player activeChar)
{
- if (command.startsWith("admin_delete"))
+ if (command.contains("group"))
+ {
+ handleDeleteGroup(activeChar);
+ }
+ else if (command.startsWith("admin_delete"))
{
final String[] split = command.split(" ");
handleDelete(activeChar, (split.length > 1) && Util.isDigit(split[1]) ? Integer.parseInt(split[1]) : 0);
@@ -48,48 +61,125 @@ public class AdminDelete implements IAdminCommandHandler
return true;
}
- private void handleDelete(Player activeChar, int range)
+ private void handleDelete(Player player, int range)
{
if (range > 0)
{
- World.getInstance().forEachVisibleObjectInRange(activeChar, Npc.class, range, target ->
- {
- deleteNpc(activeChar, target);
- });
+ World.getInstance().forEachVisibleObjectInRange(player, Npc.class, range, target -> deleteNpc(player, target));
return;
}
- final WorldObject obj = activeChar.getTarget();
+ final WorldObject obj = player.getTarget();
if (obj instanceof Npc)
{
- deleteNpc(activeChar, (Npc) obj);
+ deleteNpc(player, (Npc) obj);
}
else
{
- BuilderUtil.sendSysMessage(activeChar, "Incorrect target.");
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
}
}
- private void deleteNpc(Player activeChar, Npc target)
+ private void handleDeleteGroup(Player player)
+ {
+ final WorldObject obj = player.getTarget();
+ if (obj instanceof Npc)
+ {
+ deleteGroup(player, (Npc) obj);
+ }
+ else
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ }
+
+ private void deleteNpc(Player player, Npc target)
{
- target.deleteMe();
-
final Spawn spawn = target.getSpawn();
if (spawn != null)
{
- spawn.stopRespawn();
-
- if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ if (territories.isEmpty())
{
- DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ }
+ }
+ if (territories.isEmpty())
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
else
{
- SpawnTable.getInstance().deleteSpawn(spawn, true);
+ AdminCommandHandler.getInstance().useAdminCommand(player, AdminDelete.ADMIN_COMMANDS[1], true);
+ }
+ }
+ }
+
+ private void deleteGroup(Player player, Npc target)
+ {
+ final Spawn spawn = target.getSpawn();
+ if (spawn != null)
+ {
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
+ {
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
+ }
+ }
+ if (territories.isEmpty())
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ else
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+
+ if (group != null)
+ {
+ for (NpcSpawnTemplate template : group.getSpawns())
+ {
+ template.despawn();
+ }
+ }
+ else if (simpleTerritory && (npcSpawnTemplate != null))
+ {
+ npcSpawnTemplate.despawn();
+ }
+
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " group from " + target.getObjectId() + ".");
}
}
-
- BuilderUtil.sendSysMessage(activeChar, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
@Override
diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/data/SpawnTable.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/data/SpawnTable.java
index 986e4f1195..869f325b27 100644
--- a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/data/SpawnTable.java
+++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/data/SpawnTable.java
@@ -22,6 +22,7 @@ import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -33,6 +34,9 @@ import org.l2jmobius.gameserver.data.xml.NpcData;
import org.l2jmobius.gameserver.model.Spawn;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
/**
* Spawn data retriever.
@@ -202,50 +206,104 @@ public class SpawnTable
{
final BufferedReader reader = new BufferedReader(new FileReader(spawnFile));
final BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
- final String spawnId = String.valueOf(spawn.getId());
- final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
- final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
- final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
boolean found = false; // in XML you can have more than one spawn with same coords
boolean isMultiLine = false; // in case spawn has more stats
boolean lastLineFound = false; // used to check for empty file
int lineCount = 0;
String currentLine;
- while ((currentLine = reader.readLine()) != null)
+
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
{
- if (!found)
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
{
- if (isMultiLine)
- {
- if (currentLine.contains(""))
- {
- found = true;
- }
- continue;
- }
- if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
- {
- if (!currentLine.contains("/>") && !currentLine.contains(""))
- {
- isMultiLine = true;
- }
- else
- {
- found = true;
- }
- continue;
- }
- }
- writer.write(currentLine + Config.EOL);
- if (currentLine.contains(""))
- {
- lastLineFound = true;
- }
- if (!lastLineFound)
- {
- lineCount++;
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
}
}
+
+ if (territories.isEmpty())
+ {
+ final String spawnId = String.valueOf(spawn.getId());
+ final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
+ final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
+ final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
+ while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains(""))
+ {
+ found = true;
+ }
+ continue;
+ }
+ if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
+ {
+ if (!currentLine.contains("/>") && !currentLine.contains(""))
+ {
+ isMultiLine = true;
+ }
+ else
+ {
+ found = true;
+ }
+ continue;
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+ else
+ {
+ SEARCH: while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains("") || (simpleTerritory && currentLine.contains("")))
+ {
+ found = true;
+ }
+ continue;
+ }
+ for (SpawnTerritory territory : territories)
+ {
+ if (currentLine.contains('"' + territory.getName() + '"'))
+ {
+ isMultiLine = true;
+ continue SEARCH;
+ }
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+
writer.close();
reader.close();
spawnFile.delete();
diff --git a/L2J_Mobius_04.0_GrandCrusade/dist/game/config/AdminCommands.xml b/L2J_Mobius_04.0_GrandCrusade/dist/game/config/AdminCommands.xml
index 9b610a1b81..f15749aadb 100644
--- a/L2J_Mobius_04.0_GrandCrusade/dist/game/config/AdminCommands.xml
+++ b/L2J_Mobius_04.0_GrandCrusade/dist/game/config/AdminCommands.xml
@@ -95,6 +95,7 @@
+
diff --git a/L2J_Mobius_04.0_GrandCrusade/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java b/L2J_Mobius_04.0_GrandCrusade/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
index cd80804c69..0a91636ead 100644
--- a/L2J_Mobius_04.0_GrandCrusade/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
+++ b/L2J_Mobius_04.0_GrandCrusade/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
@@ -16,7 +16,11 @@
*/
package handlers.admincommandhandlers;
+import java.util.Collections;
+import java.util.List;
+
import org.l2jmobius.gameserver.data.SpawnTable;
+import org.l2jmobius.gameserver.handler.AdminCommandHandler;
import org.l2jmobius.gameserver.handler.IAdminCommandHandler;
import org.l2jmobius.gameserver.instancemanager.DBSpawnManager;
import org.l2jmobius.gameserver.model.Spawn;
@@ -24,23 +28,32 @@ import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
import org.l2jmobius.gameserver.util.BuilderUtil;
import org.l2jmobius.gameserver.util.Util;
/**
- * This class handles following admin commands: - delete = deletes target
+ * @author Mobius
*/
public class AdminDelete implements IAdminCommandHandler
{
private static final String[] ADMIN_COMMANDS =
{
- "admin_delete"
+ "admin_delete", // supports range parameter
+ "admin_delete_group" // for territory spawns
};
@Override
public boolean useAdminCommand(String command, Player activeChar)
{
- if (command.startsWith("admin_delete"))
+ if (command.contains("group"))
+ {
+ handleDeleteGroup(activeChar);
+ }
+ else if (command.startsWith("admin_delete"))
{
final String[] split = command.split(" ");
handleDelete(activeChar, (split.length > 1) && Util.isDigit(split[1]) ? Integer.parseInt(split[1]) : 0);
@@ -48,48 +61,125 @@ public class AdminDelete implements IAdminCommandHandler
return true;
}
- private void handleDelete(Player activeChar, int range)
+ private void handleDelete(Player player, int range)
{
if (range > 0)
{
- World.getInstance().forEachVisibleObjectInRange(activeChar, Npc.class, range, target ->
- {
- deleteNpc(activeChar, target);
- });
+ World.getInstance().forEachVisibleObjectInRange(player, Npc.class, range, target -> deleteNpc(player, target));
return;
}
- final WorldObject obj = activeChar.getTarget();
+ final WorldObject obj = player.getTarget();
if (obj instanceof Npc)
{
- deleteNpc(activeChar, (Npc) obj);
+ deleteNpc(player, (Npc) obj);
}
else
{
- BuilderUtil.sendSysMessage(activeChar, "Incorrect target.");
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
}
}
- private void deleteNpc(Player activeChar, Npc target)
+ private void handleDeleteGroup(Player player)
+ {
+ final WorldObject obj = player.getTarget();
+ if (obj instanceof Npc)
+ {
+ deleteGroup(player, (Npc) obj);
+ }
+ else
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ }
+
+ private void deleteNpc(Player player, Npc target)
{
- target.deleteMe();
-
final Spawn spawn = target.getSpawn();
if (spawn != null)
{
- spawn.stopRespawn();
-
- if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ if (territories.isEmpty())
{
- DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ }
+ }
+ if (territories.isEmpty())
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
else
{
- SpawnTable.getInstance().deleteSpawn(spawn, true);
+ AdminCommandHandler.getInstance().useAdminCommand(player, AdminDelete.ADMIN_COMMANDS[1], true);
+ }
+ }
+ }
+
+ private void deleteGroup(Player player, Npc target)
+ {
+ final Spawn spawn = target.getSpawn();
+ if (spawn != null)
+ {
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
+ {
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
+ }
+ }
+ if (territories.isEmpty())
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ else
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+
+ if (group != null)
+ {
+ for (NpcSpawnTemplate template : group.getSpawns())
+ {
+ template.despawn();
+ }
+ }
+ else if (simpleTerritory && (npcSpawnTemplate != null))
+ {
+ npcSpawnTemplate.despawn();
+ }
+
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " group from " + target.getObjectId() + ".");
}
}
-
- BuilderUtil.sendSysMessage(activeChar, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
@Override
diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/data/SpawnTable.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/data/SpawnTable.java
index 986e4f1195..869f325b27 100644
--- a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/data/SpawnTable.java
+++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/data/SpawnTable.java
@@ -22,6 +22,7 @@ import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -33,6 +34,9 @@ import org.l2jmobius.gameserver.data.xml.NpcData;
import org.l2jmobius.gameserver.model.Spawn;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
/**
* Spawn data retriever.
@@ -202,50 +206,104 @@ public class SpawnTable
{
final BufferedReader reader = new BufferedReader(new FileReader(spawnFile));
final BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
- final String spawnId = String.valueOf(spawn.getId());
- final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
- final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
- final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
boolean found = false; // in XML you can have more than one spawn with same coords
boolean isMultiLine = false; // in case spawn has more stats
boolean lastLineFound = false; // used to check for empty file
int lineCount = 0;
String currentLine;
- while ((currentLine = reader.readLine()) != null)
+
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
{
- if (!found)
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
{
- if (isMultiLine)
- {
- if (currentLine.contains(""))
- {
- found = true;
- }
- continue;
- }
- if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
- {
- if (!currentLine.contains("/>") && !currentLine.contains(""))
- {
- isMultiLine = true;
- }
- else
- {
- found = true;
- }
- continue;
- }
- }
- writer.write(currentLine + Config.EOL);
- if (currentLine.contains(""))
- {
- lastLineFound = true;
- }
- if (!lastLineFound)
- {
- lineCount++;
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
}
}
+
+ if (territories.isEmpty())
+ {
+ final String spawnId = String.valueOf(spawn.getId());
+ final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
+ final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
+ final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
+ while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains(""))
+ {
+ found = true;
+ }
+ continue;
+ }
+ if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
+ {
+ if (!currentLine.contains("/>") && !currentLine.contains(""))
+ {
+ isMultiLine = true;
+ }
+ else
+ {
+ found = true;
+ }
+ continue;
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+ else
+ {
+ SEARCH: while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains("") || (simpleTerritory && currentLine.contains("")))
+ {
+ found = true;
+ }
+ continue;
+ }
+ for (SpawnTerritory territory : territories)
+ {
+ if (currentLine.contains('"' + territory.getName() + '"'))
+ {
+ isMultiLine = true;
+ continue SEARCH;
+ }
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+
writer.close();
reader.close();
spawnFile.delete();
diff --git a/L2J_Mobius_05.0_Salvation/dist/game/config/AdminCommands.xml b/L2J_Mobius_05.0_Salvation/dist/game/config/AdminCommands.xml
index 9b610a1b81..f15749aadb 100644
--- a/L2J_Mobius_05.0_Salvation/dist/game/config/AdminCommands.xml
+++ b/L2J_Mobius_05.0_Salvation/dist/game/config/AdminCommands.xml
@@ -95,6 +95,7 @@
+
diff --git a/L2J_Mobius_05.0_Salvation/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java b/L2J_Mobius_05.0_Salvation/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
index cd80804c69..0a91636ead 100644
--- a/L2J_Mobius_05.0_Salvation/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
+++ b/L2J_Mobius_05.0_Salvation/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
@@ -16,7 +16,11 @@
*/
package handlers.admincommandhandlers;
+import java.util.Collections;
+import java.util.List;
+
import org.l2jmobius.gameserver.data.SpawnTable;
+import org.l2jmobius.gameserver.handler.AdminCommandHandler;
import org.l2jmobius.gameserver.handler.IAdminCommandHandler;
import org.l2jmobius.gameserver.instancemanager.DBSpawnManager;
import org.l2jmobius.gameserver.model.Spawn;
@@ -24,23 +28,32 @@ import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
import org.l2jmobius.gameserver.util.BuilderUtil;
import org.l2jmobius.gameserver.util.Util;
/**
- * This class handles following admin commands: - delete = deletes target
+ * @author Mobius
*/
public class AdminDelete implements IAdminCommandHandler
{
private static final String[] ADMIN_COMMANDS =
{
- "admin_delete"
+ "admin_delete", // supports range parameter
+ "admin_delete_group" // for territory spawns
};
@Override
public boolean useAdminCommand(String command, Player activeChar)
{
- if (command.startsWith("admin_delete"))
+ if (command.contains("group"))
+ {
+ handleDeleteGroup(activeChar);
+ }
+ else if (command.startsWith("admin_delete"))
{
final String[] split = command.split(" ");
handleDelete(activeChar, (split.length > 1) && Util.isDigit(split[1]) ? Integer.parseInt(split[1]) : 0);
@@ -48,48 +61,125 @@ public class AdminDelete implements IAdminCommandHandler
return true;
}
- private void handleDelete(Player activeChar, int range)
+ private void handleDelete(Player player, int range)
{
if (range > 0)
{
- World.getInstance().forEachVisibleObjectInRange(activeChar, Npc.class, range, target ->
- {
- deleteNpc(activeChar, target);
- });
+ World.getInstance().forEachVisibleObjectInRange(player, Npc.class, range, target -> deleteNpc(player, target));
return;
}
- final WorldObject obj = activeChar.getTarget();
+ final WorldObject obj = player.getTarget();
if (obj instanceof Npc)
{
- deleteNpc(activeChar, (Npc) obj);
+ deleteNpc(player, (Npc) obj);
}
else
{
- BuilderUtil.sendSysMessage(activeChar, "Incorrect target.");
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
}
}
- private void deleteNpc(Player activeChar, Npc target)
+ private void handleDeleteGroup(Player player)
+ {
+ final WorldObject obj = player.getTarget();
+ if (obj instanceof Npc)
+ {
+ deleteGroup(player, (Npc) obj);
+ }
+ else
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ }
+
+ private void deleteNpc(Player player, Npc target)
{
- target.deleteMe();
-
final Spawn spawn = target.getSpawn();
if (spawn != null)
{
- spawn.stopRespawn();
-
- if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ if (territories.isEmpty())
{
- DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ }
+ }
+ if (territories.isEmpty())
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
else
{
- SpawnTable.getInstance().deleteSpawn(spawn, true);
+ AdminCommandHandler.getInstance().useAdminCommand(player, AdminDelete.ADMIN_COMMANDS[1], true);
+ }
+ }
+ }
+
+ private void deleteGroup(Player player, Npc target)
+ {
+ final Spawn spawn = target.getSpawn();
+ if (spawn != null)
+ {
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
+ {
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
+ }
+ }
+ if (territories.isEmpty())
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ else
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+
+ if (group != null)
+ {
+ for (NpcSpawnTemplate template : group.getSpawns())
+ {
+ template.despawn();
+ }
+ }
+ else if (simpleTerritory && (npcSpawnTemplate != null))
+ {
+ npcSpawnTemplate.despawn();
+ }
+
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " group from " + target.getObjectId() + ".");
}
}
-
- BuilderUtil.sendSysMessage(activeChar, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
@Override
diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/data/SpawnTable.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/data/SpawnTable.java
index 986e4f1195..869f325b27 100644
--- a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/data/SpawnTable.java
+++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/data/SpawnTable.java
@@ -22,6 +22,7 @@ import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -33,6 +34,9 @@ import org.l2jmobius.gameserver.data.xml.NpcData;
import org.l2jmobius.gameserver.model.Spawn;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
/**
* Spawn data retriever.
@@ -202,50 +206,104 @@ public class SpawnTable
{
final BufferedReader reader = new BufferedReader(new FileReader(spawnFile));
final BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
- final String spawnId = String.valueOf(spawn.getId());
- final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
- final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
- final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
boolean found = false; // in XML you can have more than one spawn with same coords
boolean isMultiLine = false; // in case spawn has more stats
boolean lastLineFound = false; // used to check for empty file
int lineCount = 0;
String currentLine;
- while ((currentLine = reader.readLine()) != null)
+
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
{
- if (!found)
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
{
- if (isMultiLine)
- {
- if (currentLine.contains(""))
- {
- found = true;
- }
- continue;
- }
- if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
- {
- if (!currentLine.contains("/>") && !currentLine.contains(""))
- {
- isMultiLine = true;
- }
- else
- {
- found = true;
- }
- continue;
- }
- }
- writer.write(currentLine + Config.EOL);
- if (currentLine.contains(""))
- {
- lastLineFound = true;
- }
- if (!lastLineFound)
- {
- lineCount++;
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
}
}
+
+ if (territories.isEmpty())
+ {
+ final String spawnId = String.valueOf(spawn.getId());
+ final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
+ final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
+ final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
+ while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains(""))
+ {
+ found = true;
+ }
+ continue;
+ }
+ if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
+ {
+ if (!currentLine.contains("/>") && !currentLine.contains(""))
+ {
+ isMultiLine = true;
+ }
+ else
+ {
+ found = true;
+ }
+ continue;
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+ else
+ {
+ SEARCH: while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains("") || (simpleTerritory && currentLine.contains("")))
+ {
+ found = true;
+ }
+ continue;
+ }
+ for (SpawnTerritory territory : territories)
+ {
+ if (currentLine.contains('"' + territory.getName() + '"'))
+ {
+ isMultiLine = true;
+ continue SEARCH;
+ }
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+
writer.close();
reader.close();
spawnFile.delete();
diff --git a/L2J_Mobius_05.5_EtinasFate/dist/game/config/AdminCommands.xml b/L2J_Mobius_05.5_EtinasFate/dist/game/config/AdminCommands.xml
index 0b241388aa..5a47afe018 100644
--- a/L2J_Mobius_05.5_EtinasFate/dist/game/config/AdminCommands.xml
+++ b/L2J_Mobius_05.5_EtinasFate/dist/game/config/AdminCommands.xml
@@ -95,6 +95,7 @@
+
diff --git a/L2J_Mobius_05.5_EtinasFate/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java b/L2J_Mobius_05.5_EtinasFate/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
index cd80804c69..0a91636ead 100644
--- a/L2J_Mobius_05.5_EtinasFate/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
+++ b/L2J_Mobius_05.5_EtinasFate/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
@@ -16,7 +16,11 @@
*/
package handlers.admincommandhandlers;
+import java.util.Collections;
+import java.util.List;
+
import org.l2jmobius.gameserver.data.SpawnTable;
+import org.l2jmobius.gameserver.handler.AdminCommandHandler;
import org.l2jmobius.gameserver.handler.IAdminCommandHandler;
import org.l2jmobius.gameserver.instancemanager.DBSpawnManager;
import org.l2jmobius.gameserver.model.Spawn;
@@ -24,23 +28,32 @@ import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
import org.l2jmobius.gameserver.util.BuilderUtil;
import org.l2jmobius.gameserver.util.Util;
/**
- * This class handles following admin commands: - delete = deletes target
+ * @author Mobius
*/
public class AdminDelete implements IAdminCommandHandler
{
private static final String[] ADMIN_COMMANDS =
{
- "admin_delete"
+ "admin_delete", // supports range parameter
+ "admin_delete_group" // for territory spawns
};
@Override
public boolean useAdminCommand(String command, Player activeChar)
{
- if (command.startsWith("admin_delete"))
+ if (command.contains("group"))
+ {
+ handleDeleteGroup(activeChar);
+ }
+ else if (command.startsWith("admin_delete"))
{
final String[] split = command.split(" ");
handleDelete(activeChar, (split.length > 1) && Util.isDigit(split[1]) ? Integer.parseInt(split[1]) : 0);
@@ -48,48 +61,125 @@ public class AdminDelete implements IAdminCommandHandler
return true;
}
- private void handleDelete(Player activeChar, int range)
+ private void handleDelete(Player player, int range)
{
if (range > 0)
{
- World.getInstance().forEachVisibleObjectInRange(activeChar, Npc.class, range, target ->
- {
- deleteNpc(activeChar, target);
- });
+ World.getInstance().forEachVisibleObjectInRange(player, Npc.class, range, target -> deleteNpc(player, target));
return;
}
- final WorldObject obj = activeChar.getTarget();
+ final WorldObject obj = player.getTarget();
if (obj instanceof Npc)
{
- deleteNpc(activeChar, (Npc) obj);
+ deleteNpc(player, (Npc) obj);
}
else
{
- BuilderUtil.sendSysMessage(activeChar, "Incorrect target.");
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
}
}
- private void deleteNpc(Player activeChar, Npc target)
+ private void handleDeleteGroup(Player player)
+ {
+ final WorldObject obj = player.getTarget();
+ if (obj instanceof Npc)
+ {
+ deleteGroup(player, (Npc) obj);
+ }
+ else
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ }
+
+ private void deleteNpc(Player player, Npc target)
{
- target.deleteMe();
-
final Spawn spawn = target.getSpawn();
if (spawn != null)
{
- spawn.stopRespawn();
-
- if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ if (territories.isEmpty())
{
- DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ }
+ }
+ if (territories.isEmpty())
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
else
{
- SpawnTable.getInstance().deleteSpawn(spawn, true);
+ AdminCommandHandler.getInstance().useAdminCommand(player, AdminDelete.ADMIN_COMMANDS[1], true);
+ }
+ }
+ }
+
+ private void deleteGroup(Player player, Npc target)
+ {
+ final Spawn spawn = target.getSpawn();
+ if (spawn != null)
+ {
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
+ {
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
+ }
+ }
+ if (territories.isEmpty())
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ else
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+
+ if (group != null)
+ {
+ for (NpcSpawnTemplate template : group.getSpawns())
+ {
+ template.despawn();
+ }
+ }
+ else if (simpleTerritory && (npcSpawnTemplate != null))
+ {
+ npcSpawnTemplate.despawn();
+ }
+
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " group from " + target.getObjectId() + ".");
}
}
-
- BuilderUtil.sendSysMessage(activeChar, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
@Override
diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/data/SpawnTable.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/data/SpawnTable.java
index 986e4f1195..869f325b27 100644
--- a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/data/SpawnTable.java
+++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/data/SpawnTable.java
@@ -22,6 +22,7 @@ import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -33,6 +34,9 @@ import org.l2jmobius.gameserver.data.xml.NpcData;
import org.l2jmobius.gameserver.model.Spawn;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
/**
* Spawn data retriever.
@@ -202,50 +206,104 @@ public class SpawnTable
{
final BufferedReader reader = new BufferedReader(new FileReader(spawnFile));
final BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
- final String spawnId = String.valueOf(spawn.getId());
- final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
- final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
- final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
boolean found = false; // in XML you can have more than one spawn with same coords
boolean isMultiLine = false; // in case spawn has more stats
boolean lastLineFound = false; // used to check for empty file
int lineCount = 0;
String currentLine;
- while ((currentLine = reader.readLine()) != null)
+
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
{
- if (!found)
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
{
- if (isMultiLine)
- {
- if (currentLine.contains(""))
- {
- found = true;
- }
- continue;
- }
- if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
- {
- if (!currentLine.contains("/>") && !currentLine.contains(""))
- {
- isMultiLine = true;
- }
- else
- {
- found = true;
- }
- continue;
- }
- }
- writer.write(currentLine + Config.EOL);
- if (currentLine.contains(""))
- {
- lastLineFound = true;
- }
- if (!lastLineFound)
- {
- lineCount++;
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
}
}
+
+ if (territories.isEmpty())
+ {
+ final String spawnId = String.valueOf(spawn.getId());
+ final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
+ final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
+ final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
+ while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains(""))
+ {
+ found = true;
+ }
+ continue;
+ }
+ if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
+ {
+ if (!currentLine.contains("/>") && !currentLine.contains(""))
+ {
+ isMultiLine = true;
+ }
+ else
+ {
+ found = true;
+ }
+ continue;
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+ else
+ {
+ SEARCH: while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains("") || (simpleTerritory && currentLine.contains("")))
+ {
+ found = true;
+ }
+ continue;
+ }
+ for (SpawnTerritory territory : territories)
+ {
+ if (currentLine.contains('"' + territory.getName() + '"'))
+ {
+ isMultiLine = true;
+ continue SEARCH;
+ }
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+
writer.close();
reader.close();
spawnFile.delete();
diff --git a/L2J_Mobius_06.0_Fafurion/dist/game/config/AdminCommands.xml b/L2J_Mobius_06.0_Fafurion/dist/game/config/AdminCommands.xml
index 0b241388aa..5a47afe018 100644
--- a/L2J_Mobius_06.0_Fafurion/dist/game/config/AdminCommands.xml
+++ b/L2J_Mobius_06.0_Fafurion/dist/game/config/AdminCommands.xml
@@ -95,6 +95,7 @@
+
diff --git a/L2J_Mobius_06.0_Fafurion/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java b/L2J_Mobius_06.0_Fafurion/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
index cd80804c69..0a91636ead 100644
--- a/L2J_Mobius_06.0_Fafurion/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
+++ b/L2J_Mobius_06.0_Fafurion/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
@@ -16,7 +16,11 @@
*/
package handlers.admincommandhandlers;
+import java.util.Collections;
+import java.util.List;
+
import org.l2jmobius.gameserver.data.SpawnTable;
+import org.l2jmobius.gameserver.handler.AdminCommandHandler;
import org.l2jmobius.gameserver.handler.IAdminCommandHandler;
import org.l2jmobius.gameserver.instancemanager.DBSpawnManager;
import org.l2jmobius.gameserver.model.Spawn;
@@ -24,23 +28,32 @@ import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
import org.l2jmobius.gameserver.util.BuilderUtil;
import org.l2jmobius.gameserver.util.Util;
/**
- * This class handles following admin commands: - delete = deletes target
+ * @author Mobius
*/
public class AdminDelete implements IAdminCommandHandler
{
private static final String[] ADMIN_COMMANDS =
{
- "admin_delete"
+ "admin_delete", // supports range parameter
+ "admin_delete_group" // for territory spawns
};
@Override
public boolean useAdminCommand(String command, Player activeChar)
{
- if (command.startsWith("admin_delete"))
+ if (command.contains("group"))
+ {
+ handleDeleteGroup(activeChar);
+ }
+ else if (command.startsWith("admin_delete"))
{
final String[] split = command.split(" ");
handleDelete(activeChar, (split.length > 1) && Util.isDigit(split[1]) ? Integer.parseInt(split[1]) : 0);
@@ -48,48 +61,125 @@ public class AdminDelete implements IAdminCommandHandler
return true;
}
- private void handleDelete(Player activeChar, int range)
+ private void handleDelete(Player player, int range)
{
if (range > 0)
{
- World.getInstance().forEachVisibleObjectInRange(activeChar, Npc.class, range, target ->
- {
- deleteNpc(activeChar, target);
- });
+ World.getInstance().forEachVisibleObjectInRange(player, Npc.class, range, target -> deleteNpc(player, target));
return;
}
- final WorldObject obj = activeChar.getTarget();
+ final WorldObject obj = player.getTarget();
if (obj instanceof Npc)
{
- deleteNpc(activeChar, (Npc) obj);
+ deleteNpc(player, (Npc) obj);
}
else
{
- BuilderUtil.sendSysMessage(activeChar, "Incorrect target.");
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
}
}
- private void deleteNpc(Player activeChar, Npc target)
+ private void handleDeleteGroup(Player player)
+ {
+ final WorldObject obj = player.getTarget();
+ if (obj instanceof Npc)
+ {
+ deleteGroup(player, (Npc) obj);
+ }
+ else
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ }
+
+ private void deleteNpc(Player player, Npc target)
{
- target.deleteMe();
-
final Spawn spawn = target.getSpawn();
if (spawn != null)
{
- spawn.stopRespawn();
-
- if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ if (territories.isEmpty())
{
- DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ }
+ }
+ if (territories.isEmpty())
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
else
{
- SpawnTable.getInstance().deleteSpawn(spawn, true);
+ AdminCommandHandler.getInstance().useAdminCommand(player, AdminDelete.ADMIN_COMMANDS[1], true);
+ }
+ }
+ }
+
+ private void deleteGroup(Player player, Npc target)
+ {
+ final Spawn spawn = target.getSpawn();
+ if (spawn != null)
+ {
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
+ {
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
+ }
+ }
+ if (territories.isEmpty())
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ else
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+
+ if (group != null)
+ {
+ for (NpcSpawnTemplate template : group.getSpawns())
+ {
+ template.despawn();
+ }
+ }
+ else if (simpleTerritory && (npcSpawnTemplate != null))
+ {
+ npcSpawnTemplate.despawn();
+ }
+
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " group from " + target.getObjectId() + ".");
}
}
-
- BuilderUtil.sendSysMessage(activeChar, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
@Override
diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/data/SpawnTable.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/data/SpawnTable.java
index 986e4f1195..869f325b27 100644
--- a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/data/SpawnTable.java
+++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/data/SpawnTable.java
@@ -22,6 +22,7 @@ import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -33,6 +34,9 @@ import org.l2jmobius.gameserver.data.xml.NpcData;
import org.l2jmobius.gameserver.model.Spawn;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
/**
* Spawn data retriever.
@@ -202,50 +206,104 @@ public class SpawnTable
{
final BufferedReader reader = new BufferedReader(new FileReader(spawnFile));
final BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
- final String spawnId = String.valueOf(spawn.getId());
- final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
- final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
- final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
boolean found = false; // in XML you can have more than one spawn with same coords
boolean isMultiLine = false; // in case spawn has more stats
boolean lastLineFound = false; // used to check for empty file
int lineCount = 0;
String currentLine;
- while ((currentLine = reader.readLine()) != null)
+
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
{
- if (!found)
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
{
- if (isMultiLine)
- {
- if (currentLine.contains(""))
- {
- found = true;
- }
- continue;
- }
- if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
- {
- if (!currentLine.contains("/>") && !currentLine.contains(""))
- {
- isMultiLine = true;
- }
- else
- {
- found = true;
- }
- continue;
- }
- }
- writer.write(currentLine + Config.EOL);
- if (currentLine.contains(""))
- {
- lastLineFound = true;
- }
- if (!lastLineFound)
- {
- lineCount++;
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
}
}
+
+ if (territories.isEmpty())
+ {
+ final String spawnId = String.valueOf(spawn.getId());
+ final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
+ final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
+ final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
+ while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains(""))
+ {
+ found = true;
+ }
+ continue;
+ }
+ if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
+ {
+ if (!currentLine.contains("/>") && !currentLine.contains(""))
+ {
+ isMultiLine = true;
+ }
+ else
+ {
+ found = true;
+ }
+ continue;
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+ else
+ {
+ SEARCH: while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains("") || (simpleTerritory && currentLine.contains("")))
+ {
+ found = true;
+ }
+ continue;
+ }
+ for (SpawnTerritory territory : territories)
+ {
+ if (currentLine.contains('"' + territory.getName() + '"'))
+ {
+ isMultiLine = true;
+ continue SEARCH;
+ }
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+
writer.close();
reader.close();
spawnFile.delete();
diff --git a/L2J_Mobius_07.0_PreludeOfWar/dist/game/config/AdminCommands.xml b/L2J_Mobius_07.0_PreludeOfWar/dist/game/config/AdminCommands.xml
index 0b241388aa..5a47afe018 100644
--- a/L2J_Mobius_07.0_PreludeOfWar/dist/game/config/AdminCommands.xml
+++ b/L2J_Mobius_07.0_PreludeOfWar/dist/game/config/AdminCommands.xml
@@ -95,6 +95,7 @@
+
diff --git a/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java b/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
index cd80804c69..0a91636ead 100644
--- a/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
+++ b/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
@@ -16,7 +16,11 @@
*/
package handlers.admincommandhandlers;
+import java.util.Collections;
+import java.util.List;
+
import org.l2jmobius.gameserver.data.SpawnTable;
+import org.l2jmobius.gameserver.handler.AdminCommandHandler;
import org.l2jmobius.gameserver.handler.IAdminCommandHandler;
import org.l2jmobius.gameserver.instancemanager.DBSpawnManager;
import org.l2jmobius.gameserver.model.Spawn;
@@ -24,23 +28,32 @@ import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
import org.l2jmobius.gameserver.util.BuilderUtil;
import org.l2jmobius.gameserver.util.Util;
/**
- * This class handles following admin commands: - delete = deletes target
+ * @author Mobius
*/
public class AdminDelete implements IAdminCommandHandler
{
private static final String[] ADMIN_COMMANDS =
{
- "admin_delete"
+ "admin_delete", // supports range parameter
+ "admin_delete_group" // for territory spawns
};
@Override
public boolean useAdminCommand(String command, Player activeChar)
{
- if (command.startsWith("admin_delete"))
+ if (command.contains("group"))
+ {
+ handleDeleteGroup(activeChar);
+ }
+ else if (command.startsWith("admin_delete"))
{
final String[] split = command.split(" ");
handleDelete(activeChar, (split.length > 1) && Util.isDigit(split[1]) ? Integer.parseInt(split[1]) : 0);
@@ -48,48 +61,125 @@ public class AdminDelete implements IAdminCommandHandler
return true;
}
- private void handleDelete(Player activeChar, int range)
+ private void handleDelete(Player player, int range)
{
if (range > 0)
{
- World.getInstance().forEachVisibleObjectInRange(activeChar, Npc.class, range, target ->
- {
- deleteNpc(activeChar, target);
- });
+ World.getInstance().forEachVisibleObjectInRange(player, Npc.class, range, target -> deleteNpc(player, target));
return;
}
- final WorldObject obj = activeChar.getTarget();
+ final WorldObject obj = player.getTarget();
if (obj instanceof Npc)
{
- deleteNpc(activeChar, (Npc) obj);
+ deleteNpc(player, (Npc) obj);
}
else
{
- BuilderUtil.sendSysMessage(activeChar, "Incorrect target.");
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
}
}
- private void deleteNpc(Player activeChar, Npc target)
+ private void handleDeleteGroup(Player player)
+ {
+ final WorldObject obj = player.getTarget();
+ if (obj instanceof Npc)
+ {
+ deleteGroup(player, (Npc) obj);
+ }
+ else
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ }
+
+ private void deleteNpc(Player player, Npc target)
{
- target.deleteMe();
-
final Spawn spawn = target.getSpawn();
if (spawn != null)
{
- spawn.stopRespawn();
-
- if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ if (territories.isEmpty())
{
- DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ }
+ }
+ if (territories.isEmpty())
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
else
{
- SpawnTable.getInstance().deleteSpawn(spawn, true);
+ AdminCommandHandler.getInstance().useAdminCommand(player, AdminDelete.ADMIN_COMMANDS[1], true);
+ }
+ }
+ }
+
+ private void deleteGroup(Player player, Npc target)
+ {
+ final Spawn spawn = target.getSpawn();
+ if (spawn != null)
+ {
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
+ {
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
+ }
+ }
+ if (territories.isEmpty())
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ else
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+
+ if (group != null)
+ {
+ for (NpcSpawnTemplate template : group.getSpawns())
+ {
+ template.despawn();
+ }
+ }
+ else if (simpleTerritory && (npcSpawnTemplate != null))
+ {
+ npcSpawnTemplate.despawn();
+ }
+
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " group from " + target.getObjectId() + ".");
}
}
-
- BuilderUtil.sendSysMessage(activeChar, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
@Override
diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/data/SpawnTable.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/data/SpawnTable.java
index 986e4f1195..869f325b27 100644
--- a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/data/SpawnTable.java
+++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/data/SpawnTable.java
@@ -22,6 +22,7 @@ import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -33,6 +34,9 @@ import org.l2jmobius.gameserver.data.xml.NpcData;
import org.l2jmobius.gameserver.model.Spawn;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
/**
* Spawn data retriever.
@@ -202,50 +206,104 @@ public class SpawnTable
{
final BufferedReader reader = new BufferedReader(new FileReader(spawnFile));
final BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
- final String spawnId = String.valueOf(spawn.getId());
- final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
- final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
- final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
boolean found = false; // in XML you can have more than one spawn with same coords
boolean isMultiLine = false; // in case spawn has more stats
boolean lastLineFound = false; // used to check for empty file
int lineCount = 0;
String currentLine;
- while ((currentLine = reader.readLine()) != null)
+
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
{
- if (!found)
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
{
- if (isMultiLine)
- {
- if (currentLine.contains(""))
- {
- found = true;
- }
- continue;
- }
- if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
- {
- if (!currentLine.contains("/>") && !currentLine.contains(""))
- {
- isMultiLine = true;
- }
- else
- {
- found = true;
- }
- continue;
- }
- }
- writer.write(currentLine + Config.EOL);
- if (currentLine.contains(""))
- {
- lastLineFound = true;
- }
- if (!lastLineFound)
- {
- lineCount++;
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
}
}
+
+ if (territories.isEmpty())
+ {
+ final String spawnId = String.valueOf(spawn.getId());
+ final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
+ final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
+ final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
+ while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains(""))
+ {
+ found = true;
+ }
+ continue;
+ }
+ if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
+ {
+ if (!currentLine.contains("/>") && !currentLine.contains(""))
+ {
+ isMultiLine = true;
+ }
+ else
+ {
+ found = true;
+ }
+ continue;
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+ else
+ {
+ SEARCH: while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains("") || (simpleTerritory && currentLine.contains("")))
+ {
+ found = true;
+ }
+ continue;
+ }
+ for (SpawnTerritory territory : territories)
+ {
+ if (currentLine.contains('"' + territory.getName() + '"'))
+ {
+ isMultiLine = true;
+ continue SEARCH;
+ }
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+
writer.close();
reader.close();
spawnFile.delete();
diff --git a/L2J_Mobius_08.2_Homunculus/dist/game/config/AdminCommands.xml b/L2J_Mobius_08.2_Homunculus/dist/game/config/AdminCommands.xml
index 9c81de1af5..c8cdfea921 100644
--- a/L2J_Mobius_08.2_Homunculus/dist/game/config/AdminCommands.xml
+++ b/L2J_Mobius_08.2_Homunculus/dist/game/config/AdminCommands.xml
@@ -95,6 +95,7 @@
+
diff --git a/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java b/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
index cd80804c69..0a91636ead 100644
--- a/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
+++ b/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
@@ -16,7 +16,11 @@
*/
package handlers.admincommandhandlers;
+import java.util.Collections;
+import java.util.List;
+
import org.l2jmobius.gameserver.data.SpawnTable;
+import org.l2jmobius.gameserver.handler.AdminCommandHandler;
import org.l2jmobius.gameserver.handler.IAdminCommandHandler;
import org.l2jmobius.gameserver.instancemanager.DBSpawnManager;
import org.l2jmobius.gameserver.model.Spawn;
@@ -24,23 +28,32 @@ import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
import org.l2jmobius.gameserver.util.BuilderUtil;
import org.l2jmobius.gameserver.util.Util;
/**
- * This class handles following admin commands: - delete = deletes target
+ * @author Mobius
*/
public class AdminDelete implements IAdminCommandHandler
{
private static final String[] ADMIN_COMMANDS =
{
- "admin_delete"
+ "admin_delete", // supports range parameter
+ "admin_delete_group" // for territory spawns
};
@Override
public boolean useAdminCommand(String command, Player activeChar)
{
- if (command.startsWith("admin_delete"))
+ if (command.contains("group"))
+ {
+ handleDeleteGroup(activeChar);
+ }
+ else if (command.startsWith("admin_delete"))
{
final String[] split = command.split(" ");
handleDelete(activeChar, (split.length > 1) && Util.isDigit(split[1]) ? Integer.parseInt(split[1]) : 0);
@@ -48,48 +61,125 @@ public class AdminDelete implements IAdminCommandHandler
return true;
}
- private void handleDelete(Player activeChar, int range)
+ private void handleDelete(Player player, int range)
{
if (range > 0)
{
- World.getInstance().forEachVisibleObjectInRange(activeChar, Npc.class, range, target ->
- {
- deleteNpc(activeChar, target);
- });
+ World.getInstance().forEachVisibleObjectInRange(player, Npc.class, range, target -> deleteNpc(player, target));
return;
}
- final WorldObject obj = activeChar.getTarget();
+ final WorldObject obj = player.getTarget();
if (obj instanceof Npc)
{
- deleteNpc(activeChar, (Npc) obj);
+ deleteNpc(player, (Npc) obj);
}
else
{
- BuilderUtil.sendSysMessage(activeChar, "Incorrect target.");
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
}
}
- private void deleteNpc(Player activeChar, Npc target)
+ private void handleDeleteGroup(Player player)
+ {
+ final WorldObject obj = player.getTarget();
+ if (obj instanceof Npc)
+ {
+ deleteGroup(player, (Npc) obj);
+ }
+ else
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ }
+
+ private void deleteNpc(Player player, Npc target)
{
- target.deleteMe();
-
final Spawn spawn = target.getSpawn();
if (spawn != null)
{
- spawn.stopRespawn();
-
- if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ if (territories.isEmpty())
{
- DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ }
+ }
+ if (territories.isEmpty())
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
else
{
- SpawnTable.getInstance().deleteSpawn(spawn, true);
+ AdminCommandHandler.getInstance().useAdminCommand(player, AdminDelete.ADMIN_COMMANDS[1], true);
+ }
+ }
+ }
+
+ private void deleteGroup(Player player, Npc target)
+ {
+ final Spawn spawn = target.getSpawn();
+ if (spawn != null)
+ {
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
+ {
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
+ }
+ }
+ if (territories.isEmpty())
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ else
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+
+ if (group != null)
+ {
+ for (NpcSpawnTemplate template : group.getSpawns())
+ {
+ template.despawn();
+ }
+ }
+ else if (simpleTerritory && (npcSpawnTemplate != null))
+ {
+ npcSpawnTemplate.despawn();
+ }
+
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " group from " + target.getObjectId() + ".");
}
}
-
- BuilderUtil.sendSysMessage(activeChar, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
@Override
diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/data/SpawnTable.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/data/SpawnTable.java
index 986e4f1195..869f325b27 100644
--- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/data/SpawnTable.java
+++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/data/SpawnTable.java
@@ -22,6 +22,7 @@ import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -33,6 +34,9 @@ import org.l2jmobius.gameserver.data.xml.NpcData;
import org.l2jmobius.gameserver.model.Spawn;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
/**
* Spawn data retriever.
@@ -202,50 +206,104 @@ public class SpawnTable
{
final BufferedReader reader = new BufferedReader(new FileReader(spawnFile));
final BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
- final String spawnId = String.valueOf(spawn.getId());
- final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
- final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
- final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
boolean found = false; // in XML you can have more than one spawn with same coords
boolean isMultiLine = false; // in case spawn has more stats
boolean lastLineFound = false; // used to check for empty file
int lineCount = 0;
String currentLine;
- while ((currentLine = reader.readLine()) != null)
+
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
{
- if (!found)
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
{
- if (isMultiLine)
- {
- if (currentLine.contains(""))
- {
- found = true;
- }
- continue;
- }
- if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
- {
- if (!currentLine.contains("/>") && !currentLine.contains(""))
- {
- isMultiLine = true;
- }
- else
- {
- found = true;
- }
- continue;
- }
- }
- writer.write(currentLine + Config.EOL);
- if (currentLine.contains(""))
- {
- lastLineFound = true;
- }
- if (!lastLineFound)
- {
- lineCount++;
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
}
}
+
+ if (territories.isEmpty())
+ {
+ final String spawnId = String.valueOf(spawn.getId());
+ final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
+ final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
+ final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
+ while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains(""))
+ {
+ found = true;
+ }
+ continue;
+ }
+ if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
+ {
+ if (!currentLine.contains("/>") && !currentLine.contains(""))
+ {
+ isMultiLine = true;
+ }
+ else
+ {
+ found = true;
+ }
+ continue;
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+ else
+ {
+ SEARCH: while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains("") || (simpleTerritory && currentLine.contains("")))
+ {
+ found = true;
+ }
+ continue;
+ }
+ for (SpawnTerritory territory : territories)
+ {
+ if (currentLine.contains('"' + territory.getName() + '"'))
+ {
+ isMultiLine = true;
+ continue SEARCH;
+ }
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+
writer.close();
reader.close();
spawnFile.delete();
diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/config/AdminCommands.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/config/AdminCommands.xml
index 9c81de1af5..c8cdfea921 100644
--- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/config/AdminCommands.xml
+++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/config/AdminCommands.xml
@@ -95,6 +95,7 @@
+
diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
index cd80804c69..0a91636ead 100644
--- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
+++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
@@ -16,7 +16,11 @@
*/
package handlers.admincommandhandlers;
+import java.util.Collections;
+import java.util.List;
+
import org.l2jmobius.gameserver.data.SpawnTable;
+import org.l2jmobius.gameserver.handler.AdminCommandHandler;
import org.l2jmobius.gameserver.handler.IAdminCommandHandler;
import org.l2jmobius.gameserver.instancemanager.DBSpawnManager;
import org.l2jmobius.gameserver.model.Spawn;
@@ -24,23 +28,32 @@ import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
import org.l2jmobius.gameserver.util.BuilderUtil;
import org.l2jmobius.gameserver.util.Util;
/**
- * This class handles following admin commands: - delete = deletes target
+ * @author Mobius
*/
public class AdminDelete implements IAdminCommandHandler
{
private static final String[] ADMIN_COMMANDS =
{
- "admin_delete"
+ "admin_delete", // supports range parameter
+ "admin_delete_group" // for territory spawns
};
@Override
public boolean useAdminCommand(String command, Player activeChar)
{
- if (command.startsWith("admin_delete"))
+ if (command.contains("group"))
+ {
+ handleDeleteGroup(activeChar);
+ }
+ else if (command.startsWith("admin_delete"))
{
final String[] split = command.split(" ");
handleDelete(activeChar, (split.length > 1) && Util.isDigit(split[1]) ? Integer.parseInt(split[1]) : 0);
@@ -48,48 +61,125 @@ public class AdminDelete implements IAdminCommandHandler
return true;
}
- private void handleDelete(Player activeChar, int range)
+ private void handleDelete(Player player, int range)
{
if (range > 0)
{
- World.getInstance().forEachVisibleObjectInRange(activeChar, Npc.class, range, target ->
- {
- deleteNpc(activeChar, target);
- });
+ World.getInstance().forEachVisibleObjectInRange(player, Npc.class, range, target -> deleteNpc(player, target));
return;
}
- final WorldObject obj = activeChar.getTarget();
+ final WorldObject obj = player.getTarget();
if (obj instanceof Npc)
{
- deleteNpc(activeChar, (Npc) obj);
+ deleteNpc(player, (Npc) obj);
}
else
{
- BuilderUtil.sendSysMessage(activeChar, "Incorrect target.");
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
}
}
- private void deleteNpc(Player activeChar, Npc target)
+ private void handleDeleteGroup(Player player)
+ {
+ final WorldObject obj = player.getTarget();
+ if (obj instanceof Npc)
+ {
+ deleteGroup(player, (Npc) obj);
+ }
+ else
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ }
+
+ private void deleteNpc(Player player, Npc target)
{
- target.deleteMe();
-
final Spawn spawn = target.getSpawn();
if (spawn != null)
{
- spawn.stopRespawn();
-
- if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ if (territories.isEmpty())
{
- DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ }
+ }
+ if (territories.isEmpty())
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
else
{
- SpawnTable.getInstance().deleteSpawn(spawn, true);
+ AdminCommandHandler.getInstance().useAdminCommand(player, AdminDelete.ADMIN_COMMANDS[1], true);
+ }
+ }
+ }
+
+ private void deleteGroup(Player player, Npc target)
+ {
+ final Spawn spawn = target.getSpawn();
+ if (spawn != null)
+ {
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
+ {
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
+ }
+ }
+ if (territories.isEmpty())
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ else
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+
+ if (group != null)
+ {
+ for (NpcSpawnTemplate template : group.getSpawns())
+ {
+ template.despawn();
+ }
+ }
+ else if (simpleTerritory && (npcSpawnTemplate != null))
+ {
+ npcSpawnTemplate.despawn();
+ }
+
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " group from " + target.getObjectId() + ".");
}
}
-
- BuilderUtil.sendSysMessage(activeChar, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
@Override
diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/data/SpawnTable.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/data/SpawnTable.java
index 986e4f1195..869f325b27 100644
--- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/data/SpawnTable.java
+++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/data/SpawnTable.java
@@ -22,6 +22,7 @@ import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -33,6 +34,9 @@ import org.l2jmobius.gameserver.data.xml.NpcData;
import org.l2jmobius.gameserver.model.Spawn;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
/**
* Spawn data retriever.
@@ -202,50 +206,104 @@ public class SpawnTable
{
final BufferedReader reader = new BufferedReader(new FileReader(spawnFile));
final BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
- final String spawnId = String.valueOf(spawn.getId());
- final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
- final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
- final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
boolean found = false; // in XML you can have more than one spawn with same coords
boolean isMultiLine = false; // in case spawn has more stats
boolean lastLineFound = false; // used to check for empty file
int lineCount = 0;
String currentLine;
- while ((currentLine = reader.readLine()) != null)
+
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
{
- if (!found)
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
{
- if (isMultiLine)
- {
- if (currentLine.contains(""))
- {
- found = true;
- }
- continue;
- }
- if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
- {
- if (!currentLine.contains("/>") && !currentLine.contains(""))
- {
- isMultiLine = true;
- }
- else
- {
- found = true;
- }
- continue;
- }
- }
- writer.write(currentLine + Config.EOL);
- if (currentLine.contains(""))
- {
- lastLineFound = true;
- }
- if (!lastLineFound)
- {
- lineCount++;
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
}
}
+
+ if (territories.isEmpty())
+ {
+ final String spawnId = String.valueOf(spawn.getId());
+ final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
+ final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
+ final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
+ while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains(""))
+ {
+ found = true;
+ }
+ continue;
+ }
+ if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
+ {
+ if (!currentLine.contains("/>") && !currentLine.contains(""))
+ {
+ isMultiLine = true;
+ }
+ else
+ {
+ found = true;
+ }
+ continue;
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+ else
+ {
+ SEARCH: while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains("") || (simpleTerritory && currentLine.contains("")))
+ {
+ found = true;
+ }
+ continue;
+ }
+ for (SpawnTerritory territory : territories)
+ {
+ if (currentLine.contains('"' + territory.getName() + '"'))
+ {
+ isMultiLine = true;
+ continue SEARCH;
+ }
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+
writer.close();
reader.close();
spawnFile.delete();
diff --git a/L2J_Mobius_10.1_MasterClass/dist/game/config/AdminCommands.xml b/L2J_Mobius_10.1_MasterClass/dist/game/config/AdminCommands.xml
index 9c81de1af5..c8cdfea921 100644
--- a/L2J_Mobius_10.1_MasterClass/dist/game/config/AdminCommands.xml
+++ b/L2J_Mobius_10.1_MasterClass/dist/game/config/AdminCommands.xml
@@ -95,6 +95,7 @@
+
diff --git a/L2J_Mobius_10.1_MasterClass/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java b/L2J_Mobius_10.1_MasterClass/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
index cd80804c69..0a91636ead 100644
--- a/L2J_Mobius_10.1_MasterClass/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
+++ b/L2J_Mobius_10.1_MasterClass/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
@@ -16,7 +16,11 @@
*/
package handlers.admincommandhandlers;
+import java.util.Collections;
+import java.util.List;
+
import org.l2jmobius.gameserver.data.SpawnTable;
+import org.l2jmobius.gameserver.handler.AdminCommandHandler;
import org.l2jmobius.gameserver.handler.IAdminCommandHandler;
import org.l2jmobius.gameserver.instancemanager.DBSpawnManager;
import org.l2jmobius.gameserver.model.Spawn;
@@ -24,23 +28,32 @@ import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
import org.l2jmobius.gameserver.util.BuilderUtil;
import org.l2jmobius.gameserver.util.Util;
/**
- * This class handles following admin commands: - delete = deletes target
+ * @author Mobius
*/
public class AdminDelete implements IAdminCommandHandler
{
private static final String[] ADMIN_COMMANDS =
{
- "admin_delete"
+ "admin_delete", // supports range parameter
+ "admin_delete_group" // for territory spawns
};
@Override
public boolean useAdminCommand(String command, Player activeChar)
{
- if (command.startsWith("admin_delete"))
+ if (command.contains("group"))
+ {
+ handleDeleteGroup(activeChar);
+ }
+ else if (command.startsWith("admin_delete"))
{
final String[] split = command.split(" ");
handleDelete(activeChar, (split.length > 1) && Util.isDigit(split[1]) ? Integer.parseInt(split[1]) : 0);
@@ -48,48 +61,125 @@ public class AdminDelete implements IAdminCommandHandler
return true;
}
- private void handleDelete(Player activeChar, int range)
+ private void handleDelete(Player player, int range)
{
if (range > 0)
{
- World.getInstance().forEachVisibleObjectInRange(activeChar, Npc.class, range, target ->
- {
- deleteNpc(activeChar, target);
- });
+ World.getInstance().forEachVisibleObjectInRange(player, Npc.class, range, target -> deleteNpc(player, target));
return;
}
- final WorldObject obj = activeChar.getTarget();
+ final WorldObject obj = player.getTarget();
if (obj instanceof Npc)
{
- deleteNpc(activeChar, (Npc) obj);
+ deleteNpc(player, (Npc) obj);
}
else
{
- BuilderUtil.sendSysMessage(activeChar, "Incorrect target.");
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
}
}
- private void deleteNpc(Player activeChar, Npc target)
+ private void handleDeleteGroup(Player player)
+ {
+ final WorldObject obj = player.getTarget();
+ if (obj instanceof Npc)
+ {
+ deleteGroup(player, (Npc) obj);
+ }
+ else
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ }
+
+ private void deleteNpc(Player player, Npc target)
{
- target.deleteMe();
-
final Spawn spawn = target.getSpawn();
if (spawn != null)
{
- spawn.stopRespawn();
-
- if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ if (territories.isEmpty())
{
- DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ }
+ }
+ if (territories.isEmpty())
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
else
{
- SpawnTable.getInstance().deleteSpawn(spawn, true);
+ AdminCommandHandler.getInstance().useAdminCommand(player, AdminDelete.ADMIN_COMMANDS[1], true);
+ }
+ }
+ }
+
+ private void deleteGroup(Player player, Npc target)
+ {
+ final Spawn spawn = target.getSpawn();
+ if (spawn != null)
+ {
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
+ {
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
+ }
+ }
+ if (territories.isEmpty())
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ else
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+
+ if (group != null)
+ {
+ for (NpcSpawnTemplate template : group.getSpawns())
+ {
+ template.despawn();
+ }
+ }
+ else if (simpleTerritory && (npcSpawnTemplate != null))
+ {
+ npcSpawnTemplate.despawn();
+ }
+
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " group from " + target.getObjectId() + ".");
}
}
-
- BuilderUtil.sendSysMessage(activeChar, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
@Override
diff --git a/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/data/SpawnTable.java b/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/data/SpawnTable.java
index 986e4f1195..869f325b27 100644
--- a/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/data/SpawnTable.java
+++ b/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/data/SpawnTable.java
@@ -22,6 +22,7 @@ import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -33,6 +34,9 @@ import org.l2jmobius.gameserver.data.xml.NpcData;
import org.l2jmobius.gameserver.model.Spawn;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
/**
* Spawn data retriever.
@@ -202,50 +206,104 @@ public class SpawnTable
{
final BufferedReader reader = new BufferedReader(new FileReader(spawnFile));
final BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
- final String spawnId = String.valueOf(spawn.getId());
- final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
- final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
- final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
boolean found = false; // in XML you can have more than one spawn with same coords
boolean isMultiLine = false; // in case spawn has more stats
boolean lastLineFound = false; // used to check for empty file
int lineCount = 0;
String currentLine;
- while ((currentLine = reader.readLine()) != null)
+
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
{
- if (!found)
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
{
- if (isMultiLine)
- {
- if (currentLine.contains(""))
- {
- found = true;
- }
- continue;
- }
- if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
- {
- if (!currentLine.contains("/>") && !currentLine.contains(""))
- {
- isMultiLine = true;
- }
- else
- {
- found = true;
- }
- continue;
- }
- }
- writer.write(currentLine + Config.EOL);
- if (currentLine.contains(""))
- {
- lastLineFound = true;
- }
- if (!lastLineFound)
- {
- lineCount++;
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
}
}
+
+ if (territories.isEmpty())
+ {
+ final String spawnId = String.valueOf(spawn.getId());
+ final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
+ final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
+ final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
+ while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains(""))
+ {
+ found = true;
+ }
+ continue;
+ }
+ if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
+ {
+ if (!currentLine.contains("/>") && !currentLine.contains(""))
+ {
+ isMultiLine = true;
+ }
+ else
+ {
+ found = true;
+ }
+ continue;
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+ else
+ {
+ SEARCH: while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains("") || (simpleTerritory && currentLine.contains("")))
+ {
+ found = true;
+ }
+ continue;
+ }
+ for (SpawnTerritory territory : territories)
+ {
+ if (currentLine.contains('"' + territory.getName() + '"'))
+ {
+ isMultiLine = true;
+ continue SEARCH;
+ }
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+
writer.close();
reader.close();
spawnFile.delete();
diff --git a/L2J_Mobius_10.2_MasterClass/dist/game/config/AdminCommands.xml b/L2J_Mobius_10.2_MasterClass/dist/game/config/AdminCommands.xml
index 9c81de1af5..c8cdfea921 100644
--- a/L2J_Mobius_10.2_MasterClass/dist/game/config/AdminCommands.xml
+++ b/L2J_Mobius_10.2_MasterClass/dist/game/config/AdminCommands.xml
@@ -95,6 +95,7 @@
+
diff --git a/L2J_Mobius_10.2_MasterClass/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java b/L2J_Mobius_10.2_MasterClass/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
index cd80804c69..0a91636ead 100644
--- a/L2J_Mobius_10.2_MasterClass/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
+++ b/L2J_Mobius_10.2_MasterClass/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
@@ -16,7 +16,11 @@
*/
package handlers.admincommandhandlers;
+import java.util.Collections;
+import java.util.List;
+
import org.l2jmobius.gameserver.data.SpawnTable;
+import org.l2jmobius.gameserver.handler.AdminCommandHandler;
import org.l2jmobius.gameserver.handler.IAdminCommandHandler;
import org.l2jmobius.gameserver.instancemanager.DBSpawnManager;
import org.l2jmobius.gameserver.model.Spawn;
@@ -24,23 +28,32 @@ import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
import org.l2jmobius.gameserver.util.BuilderUtil;
import org.l2jmobius.gameserver.util.Util;
/**
- * This class handles following admin commands: - delete = deletes target
+ * @author Mobius
*/
public class AdminDelete implements IAdminCommandHandler
{
private static final String[] ADMIN_COMMANDS =
{
- "admin_delete"
+ "admin_delete", // supports range parameter
+ "admin_delete_group" // for territory spawns
};
@Override
public boolean useAdminCommand(String command, Player activeChar)
{
- if (command.startsWith("admin_delete"))
+ if (command.contains("group"))
+ {
+ handleDeleteGroup(activeChar);
+ }
+ else if (command.startsWith("admin_delete"))
{
final String[] split = command.split(" ");
handleDelete(activeChar, (split.length > 1) && Util.isDigit(split[1]) ? Integer.parseInt(split[1]) : 0);
@@ -48,48 +61,125 @@ public class AdminDelete implements IAdminCommandHandler
return true;
}
- private void handleDelete(Player activeChar, int range)
+ private void handleDelete(Player player, int range)
{
if (range > 0)
{
- World.getInstance().forEachVisibleObjectInRange(activeChar, Npc.class, range, target ->
- {
- deleteNpc(activeChar, target);
- });
+ World.getInstance().forEachVisibleObjectInRange(player, Npc.class, range, target -> deleteNpc(player, target));
return;
}
- final WorldObject obj = activeChar.getTarget();
+ final WorldObject obj = player.getTarget();
if (obj instanceof Npc)
{
- deleteNpc(activeChar, (Npc) obj);
+ deleteNpc(player, (Npc) obj);
}
else
{
- BuilderUtil.sendSysMessage(activeChar, "Incorrect target.");
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
}
}
- private void deleteNpc(Player activeChar, Npc target)
+ private void handleDeleteGroup(Player player)
+ {
+ final WorldObject obj = player.getTarget();
+ if (obj instanceof Npc)
+ {
+ deleteGroup(player, (Npc) obj);
+ }
+ else
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ }
+
+ private void deleteNpc(Player player, Npc target)
{
- target.deleteMe();
-
final Spawn spawn = target.getSpawn();
if (spawn != null)
{
- spawn.stopRespawn();
-
- if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ if (territories.isEmpty())
{
- DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ }
+ }
+ if (territories.isEmpty())
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
else
{
- SpawnTable.getInstance().deleteSpawn(spawn, true);
+ AdminCommandHandler.getInstance().useAdminCommand(player, AdminDelete.ADMIN_COMMANDS[1], true);
+ }
+ }
+ }
+
+ private void deleteGroup(Player player, Npc target)
+ {
+ final Spawn spawn = target.getSpawn();
+ if (spawn != null)
+ {
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
+ {
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
+ }
+ }
+ if (territories.isEmpty())
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ else
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+
+ if (group != null)
+ {
+ for (NpcSpawnTemplate template : group.getSpawns())
+ {
+ template.despawn();
+ }
+ }
+ else if (simpleTerritory && (npcSpawnTemplate != null))
+ {
+ npcSpawnTemplate.despawn();
+ }
+
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " group from " + target.getObjectId() + ".");
}
}
-
- BuilderUtil.sendSysMessage(activeChar, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
@Override
diff --git a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/data/SpawnTable.java b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/data/SpawnTable.java
index 986e4f1195..869f325b27 100644
--- a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/data/SpawnTable.java
+++ b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/data/SpawnTable.java
@@ -22,6 +22,7 @@ import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -33,6 +34,9 @@ import org.l2jmobius.gameserver.data.xml.NpcData;
import org.l2jmobius.gameserver.model.Spawn;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
/**
* Spawn data retriever.
@@ -202,50 +206,104 @@ public class SpawnTable
{
final BufferedReader reader = new BufferedReader(new FileReader(spawnFile));
final BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
- final String spawnId = String.valueOf(spawn.getId());
- final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
- final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
- final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
boolean found = false; // in XML you can have more than one spawn with same coords
boolean isMultiLine = false; // in case spawn has more stats
boolean lastLineFound = false; // used to check for empty file
int lineCount = 0;
String currentLine;
- while ((currentLine = reader.readLine()) != null)
+
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
{
- if (!found)
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
{
- if (isMultiLine)
- {
- if (currentLine.contains(""))
- {
- found = true;
- }
- continue;
- }
- if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
- {
- if (!currentLine.contains("/>") && !currentLine.contains(""))
- {
- isMultiLine = true;
- }
- else
- {
- found = true;
- }
- continue;
- }
- }
- writer.write(currentLine + Config.EOL);
- if (currentLine.contains(""))
- {
- lastLineFound = true;
- }
- if (!lastLineFound)
- {
- lineCount++;
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
}
}
+
+ if (territories.isEmpty())
+ {
+ final String spawnId = String.valueOf(spawn.getId());
+ final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
+ final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
+ final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
+ while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains(""))
+ {
+ found = true;
+ }
+ continue;
+ }
+ if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
+ {
+ if (!currentLine.contains("/>") && !currentLine.contains(""))
+ {
+ isMultiLine = true;
+ }
+ else
+ {
+ found = true;
+ }
+ continue;
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+ else
+ {
+ SEARCH: while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains("") || (simpleTerritory && currentLine.contains("")))
+ {
+ found = true;
+ }
+ continue;
+ }
+ for (SpawnTerritory territory : territories)
+ {
+ if (currentLine.contains('"' + territory.getName() + '"'))
+ {
+ isMultiLine = true;
+ continue SEARCH;
+ }
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+
writer.close();
reader.close();
spawnFile.delete();
diff --git a/L2J_Mobius_CT_0_Interlude/dist/game/config/AdminCommands.xml b/L2J_Mobius_CT_0_Interlude/dist/game/config/AdminCommands.xml
index 795ad3e6fb..7ea77c0e13 100644
--- a/L2J_Mobius_CT_0_Interlude/dist/game/config/AdminCommands.xml
+++ b/L2J_Mobius_CT_0_Interlude/dist/game/config/AdminCommands.xml
@@ -91,6 +91,7 @@
+
diff --git a/L2J_Mobius_CT_0_Interlude/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java b/L2J_Mobius_CT_0_Interlude/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
index a8f66a0311..4d55c37bc5 100644
--- a/L2J_Mobius_CT_0_Interlude/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
+++ b/L2J_Mobius_CT_0_Interlude/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
@@ -17,6 +17,7 @@
package handlers.admincommandhandlers;
import org.l2jmobius.gameserver.data.SpawnTable;
+import org.l2jmobius.gameserver.handler.AdminCommandHandler;
import org.l2jmobius.gameserver.handler.IAdminCommandHandler;
import org.l2jmobius.gameserver.instancemanager.RaidBossSpawnManager;
import org.l2jmobius.gameserver.model.Spawn;
@@ -24,23 +25,29 @@ import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.model.zone.type.NpcSpawnTerritory;
import org.l2jmobius.gameserver.util.BuilderUtil;
import org.l2jmobius.gameserver.util.Util;
/**
- * This class handles following admin commands: - delete = deletes target
+ * @author Mobius
*/
public class AdminDelete implements IAdminCommandHandler
{
private static final String[] ADMIN_COMMANDS =
{
- "admin_delete"
+ "admin_delete", // supports range parameter
+ "admin_delete_group" // for territory spawns
};
@Override
public boolean useAdminCommand(String command, Player activeChar)
{
- if (command.startsWith("admin_delete"))
+ if (command.contains("group"))
+ {
+ handleDeleteGroup(activeChar);
+ }
+ else if (command.startsWith("admin_delete"))
{
final String[] split = command.split(" ");
handleDelete(activeChar, (split.length > 1) && Util.isDigit(split[1]) ? Integer.parseInt(split[1]) : 0);
@@ -48,48 +55,110 @@ public class AdminDelete implements IAdminCommandHandler
return true;
}
- private void handleDelete(Player activeChar, int range)
+ private void handleDelete(Player player, int range)
{
if (range > 0)
{
- World.getInstance().forEachVisibleObjectInRange(activeChar, Npc.class, range, target ->
- {
- deleteNpc(activeChar, target);
- });
+ World.getInstance().forEachVisibleObjectInRange(player, Npc.class, range, target -> deleteNpc(player, target));
return;
}
- final WorldObject obj = activeChar.getTarget();
+ final WorldObject obj = player.getTarget();
if (obj instanceof Npc)
{
- deleteNpc(activeChar, (Npc) obj);
+ deleteNpc(player, (Npc) obj);
}
else
{
- BuilderUtil.sendSysMessage(activeChar, "Incorrect target.");
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
}
}
- private void deleteNpc(Player activeChar, Npc target)
+ private void handleDeleteGroup(Player player)
+ {
+ final WorldObject obj = player.getTarget();
+ if (obj instanceof Npc)
+ {
+ deleteGroup(player, (Npc) obj);
+ }
+ else
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ }
+
+ private void deleteNpc(Player player, Npc target)
{
- target.deleteMe();
-
final Spawn spawn = target.getSpawn();
if (spawn != null)
{
- spawn.stopRespawn();
-
- if (RaidBossSpawnManager.getInstance().isDefined(spawn.getId()))
+ final NpcSpawnTerritory npcSpawnTerritory = spawn.getSpawnTerritory();
+ if (npcSpawnTerritory == null)
{
- RaidBossSpawnManager.getInstance().deleteSpawn(spawn, true);
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (RaidBossSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ RaidBossSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
else
{
- SpawnTable.getInstance().deleteSpawn(spawn, true);
+ AdminCommandHandler.getInstance().useAdminCommand(player, AdminDelete.ADMIN_COMMANDS[1], true);
+ }
+ }
+ }
+
+ private void deleteGroup(Player player, Npc target)
+ {
+ final Spawn spawn = target.getSpawn();
+ if (spawn != null)
+ {
+ final NpcSpawnTerritory npcSpawnTerritory = spawn.getSpawnTerritory();
+ if (npcSpawnTerritory == null)
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ else
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (RaidBossSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ RaidBossSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+
+ for (WorldObject wo : World.getInstance().getVisibleObjects())
+ {
+ if (!wo.isNpc())
+ {
+ continue;
+ }
+
+ final Spawn npcSpawn = ((Npc) wo).getSpawn();
+ if (npcSpawn != null)
+ {
+ final NpcSpawnTerritory territory = npcSpawn.getSpawnTerritory();
+ if ((territory != null) && !territory.getName().isEmpty() && territory.getName().equals(npcSpawnTerritory.getName()))
+ {
+ ((Npc) wo).deleteMe();
+ npcSpawn.stopRespawn();
+ }
+ }
+ }
+
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " group from " + target.getObjectId() + ".");
}
}
-
- BuilderUtil.sendSysMessage(activeChar, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
@Override
diff --git a/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/data/SpawnTable.java b/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/data/SpawnTable.java
index bcec58896d..3549709790 100644
--- a/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/data/SpawnTable.java
+++ b/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/data/SpawnTable.java
@@ -600,50 +600,89 @@ public class SpawnTable implements IXmlReader
{
final BufferedReader reader = new BufferedReader(new FileReader(spawnFile));
final BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
- final String spawnId = String.valueOf(spawn.getId());
- final String spawnX = String.valueOf(spawnLocation != null ? spawnLocation.getX() : spawn.getX());
- final String spawnY = String.valueOf(spawnLocation != null ? spawnLocation.getY() : spawn.getY());
- final String spawnZ = String.valueOf(spawnLocation != null ? spawnLocation.getX() : spawn.getZ());
+
boolean found = false; // in XML you can have more than one spawn with same coords
boolean isMultiLine = false; // in case spawn has more stats
boolean lastLineFound = false; // used to check for empty file
int lineCount = 0;
String currentLine;
- while ((currentLine = reader.readLine()) != null)
+
+ final NpcSpawnTerritory npcSpawnTerritory = spawn.getSpawnTerritory();
+ if (npcSpawnTerritory == null)
{
- if (!found)
+ final String spawnId = String.valueOf(spawn.getId());
+ final String spawnX = String.valueOf(spawnLocation != null ? spawnLocation.getX() : spawn.getX());
+ final String spawnY = String.valueOf(spawnLocation != null ? spawnLocation.getY() : spawn.getY());
+ final String spawnZ = String.valueOf(spawnLocation != null ? spawnLocation.getX() : spawn.getZ());
+
+ while ((currentLine = reader.readLine()) != null)
{
- if (isMultiLine)
+ if (!found)
{
- if (currentLine.contains(""))
+ if (isMultiLine)
{
- found = true;
+ if (currentLine.contains(""))
+ {
+ found = true;
+ }
+ continue;
+ }
+ if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
+ {
+ if (!currentLine.contains("/>") && !currentLine.contains(""))
+ {
+ isMultiLine = true;
+ }
+ else
+ {
+ found = true;
+ }
+ continue;
}
- continue;
}
- if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
{
- if (!currentLine.contains("/>") && !currentLine.contains(""))
- {
- isMultiLine = true;
- }
- else
- {
- found = true;
- }
- continue;
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
}
- }
- writer.write(currentLine + Config.EOL);
- if (currentLine.contains(""))
- {
- lastLineFound = true;
- }
- if (!lastLineFound)
- {
- lineCount++;
}
}
+ else
+ {
+ SEARCH: while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains(""))
+ {
+ found = true;
+ }
+ continue;
+ }
+ if (currentLine.contains('"' + npcSpawnTerritory.getName() + '"'))
+ {
+ isMultiLine = true;
+ continue SEARCH;
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+
writer.close();
reader.close();
spawnFile.delete();
diff --git a/L2J_Mobius_CT_2.4_Epilogue/dist/game/config/AdminCommands.xml b/L2J_Mobius_CT_2.4_Epilogue/dist/game/config/AdminCommands.xml
index a8f235a84f..e72b550b92 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/dist/game/config/AdminCommands.xml
+++ b/L2J_Mobius_CT_2.4_Epilogue/dist/game/config/AdminCommands.xml
@@ -91,6 +91,7 @@
+
diff --git a/L2J_Mobius_CT_2.4_Epilogue/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java b/L2J_Mobius_CT_2.4_Epilogue/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
index a8f66a0311..4d55c37bc5 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
@@ -17,6 +17,7 @@
package handlers.admincommandhandlers;
import org.l2jmobius.gameserver.data.SpawnTable;
+import org.l2jmobius.gameserver.handler.AdminCommandHandler;
import org.l2jmobius.gameserver.handler.IAdminCommandHandler;
import org.l2jmobius.gameserver.instancemanager.RaidBossSpawnManager;
import org.l2jmobius.gameserver.model.Spawn;
@@ -24,23 +25,29 @@ import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.model.zone.type.NpcSpawnTerritory;
import org.l2jmobius.gameserver.util.BuilderUtil;
import org.l2jmobius.gameserver.util.Util;
/**
- * This class handles following admin commands: - delete = deletes target
+ * @author Mobius
*/
public class AdminDelete implements IAdminCommandHandler
{
private static final String[] ADMIN_COMMANDS =
{
- "admin_delete"
+ "admin_delete", // supports range parameter
+ "admin_delete_group" // for territory spawns
};
@Override
public boolean useAdminCommand(String command, Player activeChar)
{
- if (command.startsWith("admin_delete"))
+ if (command.contains("group"))
+ {
+ handleDeleteGroup(activeChar);
+ }
+ else if (command.startsWith("admin_delete"))
{
final String[] split = command.split(" ");
handleDelete(activeChar, (split.length > 1) && Util.isDigit(split[1]) ? Integer.parseInt(split[1]) : 0);
@@ -48,48 +55,110 @@ public class AdminDelete implements IAdminCommandHandler
return true;
}
- private void handleDelete(Player activeChar, int range)
+ private void handleDelete(Player player, int range)
{
if (range > 0)
{
- World.getInstance().forEachVisibleObjectInRange(activeChar, Npc.class, range, target ->
- {
- deleteNpc(activeChar, target);
- });
+ World.getInstance().forEachVisibleObjectInRange(player, Npc.class, range, target -> deleteNpc(player, target));
return;
}
- final WorldObject obj = activeChar.getTarget();
+ final WorldObject obj = player.getTarget();
if (obj instanceof Npc)
{
- deleteNpc(activeChar, (Npc) obj);
+ deleteNpc(player, (Npc) obj);
}
else
{
- BuilderUtil.sendSysMessage(activeChar, "Incorrect target.");
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
}
}
- private void deleteNpc(Player activeChar, Npc target)
+ private void handleDeleteGroup(Player player)
+ {
+ final WorldObject obj = player.getTarget();
+ if (obj instanceof Npc)
+ {
+ deleteGroup(player, (Npc) obj);
+ }
+ else
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ }
+
+ private void deleteNpc(Player player, Npc target)
{
- target.deleteMe();
-
final Spawn spawn = target.getSpawn();
if (spawn != null)
{
- spawn.stopRespawn();
-
- if (RaidBossSpawnManager.getInstance().isDefined(spawn.getId()))
+ final NpcSpawnTerritory npcSpawnTerritory = spawn.getSpawnTerritory();
+ if (npcSpawnTerritory == null)
{
- RaidBossSpawnManager.getInstance().deleteSpawn(spawn, true);
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (RaidBossSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ RaidBossSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
else
{
- SpawnTable.getInstance().deleteSpawn(spawn, true);
+ AdminCommandHandler.getInstance().useAdminCommand(player, AdminDelete.ADMIN_COMMANDS[1], true);
+ }
+ }
+ }
+
+ private void deleteGroup(Player player, Npc target)
+ {
+ final Spawn spawn = target.getSpawn();
+ if (spawn != null)
+ {
+ final NpcSpawnTerritory npcSpawnTerritory = spawn.getSpawnTerritory();
+ if (npcSpawnTerritory == null)
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ else
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (RaidBossSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ RaidBossSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+
+ for (WorldObject wo : World.getInstance().getVisibleObjects())
+ {
+ if (!wo.isNpc())
+ {
+ continue;
+ }
+
+ final Spawn npcSpawn = ((Npc) wo).getSpawn();
+ if (npcSpawn != null)
+ {
+ final NpcSpawnTerritory territory = npcSpawn.getSpawnTerritory();
+ if ((territory != null) && !territory.getName().isEmpty() && territory.getName().equals(npcSpawnTerritory.getName()))
+ {
+ ((Npc) wo).deleteMe();
+ npcSpawn.stopRespawn();
+ }
+ }
+ }
+
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " group from " + target.getObjectId() + ".");
}
}
-
- BuilderUtil.sendSysMessage(activeChar, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
@Override
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/data/SpawnTable.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/data/SpawnTable.java
index bcec58896d..3549709790 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/data/SpawnTable.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/data/SpawnTable.java
@@ -600,50 +600,89 @@ public class SpawnTable implements IXmlReader
{
final BufferedReader reader = new BufferedReader(new FileReader(spawnFile));
final BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
- final String spawnId = String.valueOf(spawn.getId());
- final String spawnX = String.valueOf(spawnLocation != null ? spawnLocation.getX() : spawn.getX());
- final String spawnY = String.valueOf(spawnLocation != null ? spawnLocation.getY() : spawn.getY());
- final String spawnZ = String.valueOf(spawnLocation != null ? spawnLocation.getX() : spawn.getZ());
+
boolean found = false; // in XML you can have more than one spawn with same coords
boolean isMultiLine = false; // in case spawn has more stats
boolean lastLineFound = false; // used to check for empty file
int lineCount = 0;
String currentLine;
- while ((currentLine = reader.readLine()) != null)
+
+ final NpcSpawnTerritory npcSpawnTerritory = spawn.getSpawnTerritory();
+ if (npcSpawnTerritory == null)
{
- if (!found)
+ final String spawnId = String.valueOf(spawn.getId());
+ final String spawnX = String.valueOf(spawnLocation != null ? spawnLocation.getX() : spawn.getX());
+ final String spawnY = String.valueOf(spawnLocation != null ? spawnLocation.getY() : spawn.getY());
+ final String spawnZ = String.valueOf(spawnLocation != null ? spawnLocation.getX() : spawn.getZ());
+
+ while ((currentLine = reader.readLine()) != null)
{
- if (isMultiLine)
+ if (!found)
{
- if (currentLine.contains(""))
+ if (isMultiLine)
{
- found = true;
+ if (currentLine.contains(""))
+ {
+ found = true;
+ }
+ continue;
+ }
+ if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
+ {
+ if (!currentLine.contains("/>") && !currentLine.contains(""))
+ {
+ isMultiLine = true;
+ }
+ else
+ {
+ found = true;
+ }
+ continue;
}
- continue;
}
- if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
{
- if (!currentLine.contains("/>") && !currentLine.contains(""))
- {
- isMultiLine = true;
- }
- else
- {
- found = true;
- }
- continue;
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
}
- }
- writer.write(currentLine + Config.EOL);
- if (currentLine.contains(""))
- {
- lastLineFound = true;
- }
- if (!lastLineFound)
- {
- lineCount++;
}
}
+ else
+ {
+ SEARCH: while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains(""))
+ {
+ found = true;
+ }
+ continue;
+ }
+ if (currentLine.contains('"' + npcSpawnTerritory.getName() + '"'))
+ {
+ isMultiLine = true;
+ continue SEARCH;
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+
writer.close();
reader.close();
spawnFile.delete();
diff --git a/L2J_Mobius_CT_2.6_HighFive/dist/game/config/AdminCommands.xml b/L2J_Mobius_CT_2.6_HighFive/dist/game/config/AdminCommands.xml
index a8f235a84f..e72b550b92 100644
--- a/L2J_Mobius_CT_2.6_HighFive/dist/game/config/AdminCommands.xml
+++ b/L2J_Mobius_CT_2.6_HighFive/dist/game/config/AdminCommands.xml
@@ -91,6 +91,7 @@
+
diff --git a/L2J_Mobius_CT_2.6_HighFive/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java b/L2J_Mobius_CT_2.6_HighFive/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
index a8f66a0311..4d55c37bc5 100644
--- a/L2J_Mobius_CT_2.6_HighFive/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
+++ b/L2J_Mobius_CT_2.6_HighFive/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
@@ -17,6 +17,7 @@
package handlers.admincommandhandlers;
import org.l2jmobius.gameserver.data.SpawnTable;
+import org.l2jmobius.gameserver.handler.AdminCommandHandler;
import org.l2jmobius.gameserver.handler.IAdminCommandHandler;
import org.l2jmobius.gameserver.instancemanager.RaidBossSpawnManager;
import org.l2jmobius.gameserver.model.Spawn;
@@ -24,23 +25,29 @@ import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.model.zone.type.NpcSpawnTerritory;
import org.l2jmobius.gameserver.util.BuilderUtil;
import org.l2jmobius.gameserver.util.Util;
/**
- * This class handles following admin commands: - delete = deletes target
+ * @author Mobius
*/
public class AdminDelete implements IAdminCommandHandler
{
private static final String[] ADMIN_COMMANDS =
{
- "admin_delete"
+ "admin_delete", // supports range parameter
+ "admin_delete_group" // for territory spawns
};
@Override
public boolean useAdminCommand(String command, Player activeChar)
{
- if (command.startsWith("admin_delete"))
+ if (command.contains("group"))
+ {
+ handleDeleteGroup(activeChar);
+ }
+ else if (command.startsWith("admin_delete"))
{
final String[] split = command.split(" ");
handleDelete(activeChar, (split.length > 1) && Util.isDigit(split[1]) ? Integer.parseInt(split[1]) : 0);
@@ -48,48 +55,110 @@ public class AdminDelete implements IAdminCommandHandler
return true;
}
- private void handleDelete(Player activeChar, int range)
+ private void handleDelete(Player player, int range)
{
if (range > 0)
{
- World.getInstance().forEachVisibleObjectInRange(activeChar, Npc.class, range, target ->
- {
- deleteNpc(activeChar, target);
- });
+ World.getInstance().forEachVisibleObjectInRange(player, Npc.class, range, target -> deleteNpc(player, target));
return;
}
- final WorldObject obj = activeChar.getTarget();
+ final WorldObject obj = player.getTarget();
if (obj instanceof Npc)
{
- deleteNpc(activeChar, (Npc) obj);
+ deleteNpc(player, (Npc) obj);
}
else
{
- BuilderUtil.sendSysMessage(activeChar, "Incorrect target.");
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
}
}
- private void deleteNpc(Player activeChar, Npc target)
+ private void handleDeleteGroup(Player player)
+ {
+ final WorldObject obj = player.getTarget();
+ if (obj instanceof Npc)
+ {
+ deleteGroup(player, (Npc) obj);
+ }
+ else
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ }
+
+ private void deleteNpc(Player player, Npc target)
{
- target.deleteMe();
-
final Spawn spawn = target.getSpawn();
if (spawn != null)
{
- spawn.stopRespawn();
-
- if (RaidBossSpawnManager.getInstance().isDefined(spawn.getId()))
+ final NpcSpawnTerritory npcSpawnTerritory = spawn.getSpawnTerritory();
+ if (npcSpawnTerritory == null)
{
- RaidBossSpawnManager.getInstance().deleteSpawn(spawn, true);
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (RaidBossSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ RaidBossSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
else
{
- SpawnTable.getInstance().deleteSpawn(spawn, true);
+ AdminCommandHandler.getInstance().useAdminCommand(player, AdminDelete.ADMIN_COMMANDS[1], true);
+ }
+ }
+ }
+
+ private void deleteGroup(Player player, Npc target)
+ {
+ final Spawn spawn = target.getSpawn();
+ if (spawn != null)
+ {
+ final NpcSpawnTerritory npcSpawnTerritory = spawn.getSpawnTerritory();
+ if (npcSpawnTerritory == null)
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ else
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (RaidBossSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ RaidBossSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+
+ for (WorldObject wo : World.getInstance().getVisibleObjects())
+ {
+ if (!wo.isNpc())
+ {
+ continue;
+ }
+
+ final Spawn npcSpawn = ((Npc) wo).getSpawn();
+ if (npcSpawn != null)
+ {
+ final NpcSpawnTerritory territory = npcSpawn.getSpawnTerritory();
+ if ((territory != null) && !territory.getName().isEmpty() && territory.getName().equals(npcSpawnTerritory.getName()))
+ {
+ ((Npc) wo).deleteMe();
+ npcSpawn.stopRespawn();
+ }
+ }
+ }
+
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " group from " + target.getObjectId() + ".");
}
}
-
- BuilderUtil.sendSysMessage(activeChar, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
@Override
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/data/SpawnTable.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/data/SpawnTable.java
index bcec58896d..3549709790 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/data/SpawnTable.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/data/SpawnTable.java
@@ -600,50 +600,89 @@ public class SpawnTable implements IXmlReader
{
final BufferedReader reader = new BufferedReader(new FileReader(spawnFile));
final BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
- final String spawnId = String.valueOf(spawn.getId());
- final String spawnX = String.valueOf(spawnLocation != null ? spawnLocation.getX() : spawn.getX());
- final String spawnY = String.valueOf(spawnLocation != null ? spawnLocation.getY() : spawn.getY());
- final String spawnZ = String.valueOf(spawnLocation != null ? spawnLocation.getX() : spawn.getZ());
+
boolean found = false; // in XML you can have more than one spawn with same coords
boolean isMultiLine = false; // in case spawn has more stats
boolean lastLineFound = false; // used to check for empty file
int lineCount = 0;
String currentLine;
- while ((currentLine = reader.readLine()) != null)
+
+ final NpcSpawnTerritory npcSpawnTerritory = spawn.getSpawnTerritory();
+ if (npcSpawnTerritory == null)
{
- if (!found)
+ final String spawnId = String.valueOf(spawn.getId());
+ final String spawnX = String.valueOf(spawnLocation != null ? spawnLocation.getX() : spawn.getX());
+ final String spawnY = String.valueOf(spawnLocation != null ? spawnLocation.getY() : spawn.getY());
+ final String spawnZ = String.valueOf(spawnLocation != null ? spawnLocation.getX() : spawn.getZ());
+
+ while ((currentLine = reader.readLine()) != null)
{
- if (isMultiLine)
+ if (!found)
{
- if (currentLine.contains(""))
+ if (isMultiLine)
{
- found = true;
+ if (currentLine.contains(""))
+ {
+ found = true;
+ }
+ continue;
+ }
+ if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
+ {
+ if (!currentLine.contains("/>") && !currentLine.contains(""))
+ {
+ isMultiLine = true;
+ }
+ else
+ {
+ found = true;
+ }
+ continue;
}
- continue;
}
- if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
{
- if (!currentLine.contains("/>") && !currentLine.contains(""))
- {
- isMultiLine = true;
- }
- else
- {
- found = true;
- }
- continue;
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
}
- }
- writer.write(currentLine + Config.EOL);
- if (currentLine.contains(""))
- {
- lastLineFound = true;
- }
- if (!lastLineFound)
- {
- lineCount++;
}
}
+ else
+ {
+ SEARCH: while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains(""))
+ {
+ found = true;
+ }
+ continue;
+ }
+ if (currentLine.contains('"' + npcSpawnTerritory.getName() + '"'))
+ {
+ isMultiLine = true;
+ continue SEARCH;
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+
writer.close();
reader.close();
spawnFile.delete();
diff --git a/L2J_Mobius_Classic_1.0/dist/game/config/AdminCommands.xml b/L2J_Mobius_Classic_1.0/dist/game/config/AdminCommands.xml
index 9b610a1b81..f15749aadb 100644
--- a/L2J_Mobius_Classic_1.0/dist/game/config/AdminCommands.xml
+++ b/L2J_Mobius_Classic_1.0/dist/game/config/AdminCommands.xml
@@ -95,6 +95,7 @@
+
diff --git a/L2J_Mobius_Classic_1.0/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java b/L2J_Mobius_Classic_1.0/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
index cd80804c69..0a91636ead 100644
--- a/L2J_Mobius_Classic_1.0/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
+++ b/L2J_Mobius_Classic_1.0/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
@@ -16,7 +16,11 @@
*/
package handlers.admincommandhandlers;
+import java.util.Collections;
+import java.util.List;
+
import org.l2jmobius.gameserver.data.SpawnTable;
+import org.l2jmobius.gameserver.handler.AdminCommandHandler;
import org.l2jmobius.gameserver.handler.IAdminCommandHandler;
import org.l2jmobius.gameserver.instancemanager.DBSpawnManager;
import org.l2jmobius.gameserver.model.Spawn;
@@ -24,23 +28,32 @@ import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
import org.l2jmobius.gameserver.util.BuilderUtil;
import org.l2jmobius.gameserver.util.Util;
/**
- * This class handles following admin commands: - delete = deletes target
+ * @author Mobius
*/
public class AdminDelete implements IAdminCommandHandler
{
private static final String[] ADMIN_COMMANDS =
{
- "admin_delete"
+ "admin_delete", // supports range parameter
+ "admin_delete_group" // for territory spawns
};
@Override
public boolean useAdminCommand(String command, Player activeChar)
{
- if (command.startsWith("admin_delete"))
+ if (command.contains("group"))
+ {
+ handleDeleteGroup(activeChar);
+ }
+ else if (command.startsWith("admin_delete"))
{
final String[] split = command.split(" ");
handleDelete(activeChar, (split.length > 1) && Util.isDigit(split[1]) ? Integer.parseInt(split[1]) : 0);
@@ -48,48 +61,125 @@ public class AdminDelete implements IAdminCommandHandler
return true;
}
- private void handleDelete(Player activeChar, int range)
+ private void handleDelete(Player player, int range)
{
if (range > 0)
{
- World.getInstance().forEachVisibleObjectInRange(activeChar, Npc.class, range, target ->
- {
- deleteNpc(activeChar, target);
- });
+ World.getInstance().forEachVisibleObjectInRange(player, Npc.class, range, target -> deleteNpc(player, target));
return;
}
- final WorldObject obj = activeChar.getTarget();
+ final WorldObject obj = player.getTarget();
if (obj instanceof Npc)
{
- deleteNpc(activeChar, (Npc) obj);
+ deleteNpc(player, (Npc) obj);
}
else
{
- BuilderUtil.sendSysMessage(activeChar, "Incorrect target.");
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
}
}
- private void deleteNpc(Player activeChar, Npc target)
+ private void handleDeleteGroup(Player player)
+ {
+ final WorldObject obj = player.getTarget();
+ if (obj instanceof Npc)
+ {
+ deleteGroup(player, (Npc) obj);
+ }
+ else
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ }
+
+ private void deleteNpc(Player player, Npc target)
{
- target.deleteMe();
-
final Spawn spawn = target.getSpawn();
if (spawn != null)
{
- spawn.stopRespawn();
-
- if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ if (territories.isEmpty())
{
- DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ }
+ }
+ if (territories.isEmpty())
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
else
{
- SpawnTable.getInstance().deleteSpawn(spawn, true);
+ AdminCommandHandler.getInstance().useAdminCommand(player, AdminDelete.ADMIN_COMMANDS[1], true);
+ }
+ }
+ }
+
+ private void deleteGroup(Player player, Npc target)
+ {
+ final Spawn spawn = target.getSpawn();
+ if (spawn != null)
+ {
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
+ {
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
+ }
+ }
+ if (territories.isEmpty())
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ else
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+
+ if (group != null)
+ {
+ for (NpcSpawnTemplate template : group.getSpawns())
+ {
+ template.despawn();
+ }
+ }
+ else if (simpleTerritory && (npcSpawnTemplate != null))
+ {
+ npcSpawnTemplate.despawn();
+ }
+
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " group from " + target.getObjectId() + ".");
}
}
-
- BuilderUtil.sendSysMessage(activeChar, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
@Override
diff --git a/L2J_Mobius_Classic_1.0/java/org/l2jmobius/gameserver/data/SpawnTable.java b/L2J_Mobius_Classic_1.0/java/org/l2jmobius/gameserver/data/SpawnTable.java
index 986e4f1195..869f325b27 100644
--- a/L2J_Mobius_Classic_1.0/java/org/l2jmobius/gameserver/data/SpawnTable.java
+++ b/L2J_Mobius_Classic_1.0/java/org/l2jmobius/gameserver/data/SpawnTable.java
@@ -22,6 +22,7 @@ import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -33,6 +34,9 @@ import org.l2jmobius.gameserver.data.xml.NpcData;
import org.l2jmobius.gameserver.model.Spawn;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
/**
* Spawn data retriever.
@@ -202,50 +206,104 @@ public class SpawnTable
{
final BufferedReader reader = new BufferedReader(new FileReader(spawnFile));
final BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
- final String spawnId = String.valueOf(spawn.getId());
- final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
- final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
- final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
boolean found = false; // in XML you can have more than one spawn with same coords
boolean isMultiLine = false; // in case spawn has more stats
boolean lastLineFound = false; // used to check for empty file
int lineCount = 0;
String currentLine;
- while ((currentLine = reader.readLine()) != null)
+
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
{
- if (!found)
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
{
- if (isMultiLine)
- {
- if (currentLine.contains(""))
- {
- found = true;
- }
- continue;
- }
- if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
- {
- if (!currentLine.contains("/>") && !currentLine.contains(""))
- {
- isMultiLine = true;
- }
- else
- {
- found = true;
- }
- continue;
- }
- }
- writer.write(currentLine + Config.EOL);
- if (currentLine.contains(""))
- {
- lastLineFound = true;
- }
- if (!lastLineFound)
- {
- lineCount++;
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
}
}
+
+ if (territories.isEmpty())
+ {
+ final String spawnId = String.valueOf(spawn.getId());
+ final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
+ final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
+ final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
+ while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains(""))
+ {
+ found = true;
+ }
+ continue;
+ }
+ if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
+ {
+ if (!currentLine.contains("/>") && !currentLine.contains(""))
+ {
+ isMultiLine = true;
+ }
+ else
+ {
+ found = true;
+ }
+ continue;
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+ else
+ {
+ SEARCH: while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains("") || (simpleTerritory && currentLine.contains("")))
+ {
+ found = true;
+ }
+ continue;
+ }
+ for (SpawnTerritory territory : territories)
+ {
+ if (currentLine.contains('"' + territory.getName() + '"'))
+ {
+ isMultiLine = true;
+ continue SEARCH;
+ }
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+
writer.close();
reader.close();
spawnFile.delete();
diff --git a/L2J_Mobius_Classic_1.5_AgeOfSplendor/dist/game/config/AdminCommands.xml b/L2J_Mobius_Classic_1.5_AgeOfSplendor/dist/game/config/AdminCommands.xml
index 9b610a1b81..f15749aadb 100644
--- a/L2J_Mobius_Classic_1.5_AgeOfSplendor/dist/game/config/AdminCommands.xml
+++ b/L2J_Mobius_Classic_1.5_AgeOfSplendor/dist/game/config/AdminCommands.xml
@@ -95,6 +95,7 @@
+
diff --git a/L2J_Mobius_Classic_1.5_AgeOfSplendor/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java b/L2J_Mobius_Classic_1.5_AgeOfSplendor/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
index cd80804c69..0a91636ead 100644
--- a/L2J_Mobius_Classic_1.5_AgeOfSplendor/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
+++ b/L2J_Mobius_Classic_1.5_AgeOfSplendor/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
@@ -16,7 +16,11 @@
*/
package handlers.admincommandhandlers;
+import java.util.Collections;
+import java.util.List;
+
import org.l2jmobius.gameserver.data.SpawnTable;
+import org.l2jmobius.gameserver.handler.AdminCommandHandler;
import org.l2jmobius.gameserver.handler.IAdminCommandHandler;
import org.l2jmobius.gameserver.instancemanager.DBSpawnManager;
import org.l2jmobius.gameserver.model.Spawn;
@@ -24,23 +28,32 @@ import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
import org.l2jmobius.gameserver.util.BuilderUtil;
import org.l2jmobius.gameserver.util.Util;
/**
- * This class handles following admin commands: - delete = deletes target
+ * @author Mobius
*/
public class AdminDelete implements IAdminCommandHandler
{
private static final String[] ADMIN_COMMANDS =
{
- "admin_delete"
+ "admin_delete", // supports range parameter
+ "admin_delete_group" // for territory spawns
};
@Override
public boolean useAdminCommand(String command, Player activeChar)
{
- if (command.startsWith("admin_delete"))
+ if (command.contains("group"))
+ {
+ handleDeleteGroup(activeChar);
+ }
+ else if (command.startsWith("admin_delete"))
{
final String[] split = command.split(" ");
handleDelete(activeChar, (split.length > 1) && Util.isDigit(split[1]) ? Integer.parseInt(split[1]) : 0);
@@ -48,48 +61,125 @@ public class AdminDelete implements IAdminCommandHandler
return true;
}
- private void handleDelete(Player activeChar, int range)
+ private void handleDelete(Player player, int range)
{
if (range > 0)
{
- World.getInstance().forEachVisibleObjectInRange(activeChar, Npc.class, range, target ->
- {
- deleteNpc(activeChar, target);
- });
+ World.getInstance().forEachVisibleObjectInRange(player, Npc.class, range, target -> deleteNpc(player, target));
return;
}
- final WorldObject obj = activeChar.getTarget();
+ final WorldObject obj = player.getTarget();
if (obj instanceof Npc)
{
- deleteNpc(activeChar, (Npc) obj);
+ deleteNpc(player, (Npc) obj);
}
else
{
- BuilderUtil.sendSysMessage(activeChar, "Incorrect target.");
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
}
}
- private void deleteNpc(Player activeChar, Npc target)
+ private void handleDeleteGroup(Player player)
+ {
+ final WorldObject obj = player.getTarget();
+ if (obj instanceof Npc)
+ {
+ deleteGroup(player, (Npc) obj);
+ }
+ else
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ }
+
+ private void deleteNpc(Player player, Npc target)
{
- target.deleteMe();
-
final Spawn spawn = target.getSpawn();
if (spawn != null)
{
- spawn.stopRespawn();
-
- if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ if (territories.isEmpty())
{
- DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ }
+ }
+ if (territories.isEmpty())
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
else
{
- SpawnTable.getInstance().deleteSpawn(spawn, true);
+ AdminCommandHandler.getInstance().useAdminCommand(player, AdminDelete.ADMIN_COMMANDS[1], true);
+ }
+ }
+ }
+
+ private void deleteGroup(Player player, Npc target)
+ {
+ final Spawn spawn = target.getSpawn();
+ if (spawn != null)
+ {
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
+ {
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
+ }
+ }
+ if (territories.isEmpty())
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ else
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+
+ if (group != null)
+ {
+ for (NpcSpawnTemplate template : group.getSpawns())
+ {
+ template.despawn();
+ }
+ }
+ else if (simpleTerritory && (npcSpawnTemplate != null))
+ {
+ npcSpawnTemplate.despawn();
+ }
+
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " group from " + target.getObjectId() + ".");
}
}
-
- BuilderUtil.sendSysMessage(activeChar, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
@Override
diff --git a/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/gameserver/data/SpawnTable.java b/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/gameserver/data/SpawnTable.java
index 986e4f1195..869f325b27 100644
--- a/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/gameserver/data/SpawnTable.java
+++ b/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/gameserver/data/SpawnTable.java
@@ -22,6 +22,7 @@ import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -33,6 +34,9 @@ import org.l2jmobius.gameserver.data.xml.NpcData;
import org.l2jmobius.gameserver.model.Spawn;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
/**
* Spawn data retriever.
@@ -202,50 +206,104 @@ public class SpawnTable
{
final BufferedReader reader = new BufferedReader(new FileReader(spawnFile));
final BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
- final String spawnId = String.valueOf(spawn.getId());
- final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
- final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
- final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
boolean found = false; // in XML you can have more than one spawn with same coords
boolean isMultiLine = false; // in case spawn has more stats
boolean lastLineFound = false; // used to check for empty file
int lineCount = 0;
String currentLine;
- while ((currentLine = reader.readLine()) != null)
+
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
{
- if (!found)
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
{
- if (isMultiLine)
- {
- if (currentLine.contains(""))
- {
- found = true;
- }
- continue;
- }
- if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
- {
- if (!currentLine.contains("/>") && !currentLine.contains(""))
- {
- isMultiLine = true;
- }
- else
- {
- found = true;
- }
- continue;
- }
- }
- writer.write(currentLine + Config.EOL);
- if (currentLine.contains(""))
- {
- lastLineFound = true;
- }
- if (!lastLineFound)
- {
- lineCount++;
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
}
}
+
+ if (territories.isEmpty())
+ {
+ final String spawnId = String.valueOf(spawn.getId());
+ final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
+ final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
+ final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
+ while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains(""))
+ {
+ found = true;
+ }
+ continue;
+ }
+ if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
+ {
+ if (!currentLine.contains("/>") && !currentLine.contains(""))
+ {
+ isMultiLine = true;
+ }
+ else
+ {
+ found = true;
+ }
+ continue;
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+ else
+ {
+ SEARCH: while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains("") || (simpleTerritory && currentLine.contains("")))
+ {
+ found = true;
+ }
+ continue;
+ }
+ for (SpawnTerritory territory : territories)
+ {
+ if (currentLine.contains('"' + territory.getName() + '"'))
+ {
+ isMultiLine = true;
+ continue SEARCH;
+ }
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+
writer.close();
reader.close();
spawnFile.delete();
diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/config/AdminCommands.xml b/L2J_Mobius_Classic_2.0_Saviors/dist/game/config/AdminCommands.xml
index 9b610a1b81..f15749aadb 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/config/AdminCommands.xml
+++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/config/AdminCommands.xml
@@ -95,6 +95,7 @@
+
diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
index cd80804c69..0a91636ead 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
@@ -16,7 +16,11 @@
*/
package handlers.admincommandhandlers;
+import java.util.Collections;
+import java.util.List;
+
import org.l2jmobius.gameserver.data.SpawnTable;
+import org.l2jmobius.gameserver.handler.AdminCommandHandler;
import org.l2jmobius.gameserver.handler.IAdminCommandHandler;
import org.l2jmobius.gameserver.instancemanager.DBSpawnManager;
import org.l2jmobius.gameserver.model.Spawn;
@@ -24,23 +28,32 @@ import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
import org.l2jmobius.gameserver.util.BuilderUtil;
import org.l2jmobius.gameserver.util.Util;
/**
- * This class handles following admin commands: - delete = deletes target
+ * @author Mobius
*/
public class AdminDelete implements IAdminCommandHandler
{
private static final String[] ADMIN_COMMANDS =
{
- "admin_delete"
+ "admin_delete", // supports range parameter
+ "admin_delete_group" // for territory spawns
};
@Override
public boolean useAdminCommand(String command, Player activeChar)
{
- if (command.startsWith("admin_delete"))
+ if (command.contains("group"))
+ {
+ handleDeleteGroup(activeChar);
+ }
+ else if (command.startsWith("admin_delete"))
{
final String[] split = command.split(" ");
handleDelete(activeChar, (split.length > 1) && Util.isDigit(split[1]) ? Integer.parseInt(split[1]) : 0);
@@ -48,48 +61,125 @@ public class AdminDelete implements IAdminCommandHandler
return true;
}
- private void handleDelete(Player activeChar, int range)
+ private void handleDelete(Player player, int range)
{
if (range > 0)
{
- World.getInstance().forEachVisibleObjectInRange(activeChar, Npc.class, range, target ->
- {
- deleteNpc(activeChar, target);
- });
+ World.getInstance().forEachVisibleObjectInRange(player, Npc.class, range, target -> deleteNpc(player, target));
return;
}
- final WorldObject obj = activeChar.getTarget();
+ final WorldObject obj = player.getTarget();
if (obj instanceof Npc)
{
- deleteNpc(activeChar, (Npc) obj);
+ deleteNpc(player, (Npc) obj);
}
else
{
- BuilderUtil.sendSysMessage(activeChar, "Incorrect target.");
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
}
}
- private void deleteNpc(Player activeChar, Npc target)
+ private void handleDeleteGroup(Player player)
+ {
+ final WorldObject obj = player.getTarget();
+ if (obj instanceof Npc)
+ {
+ deleteGroup(player, (Npc) obj);
+ }
+ else
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ }
+
+ private void deleteNpc(Player player, Npc target)
{
- target.deleteMe();
-
final Spawn spawn = target.getSpawn();
if (spawn != null)
{
- spawn.stopRespawn();
-
- if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ if (territories.isEmpty())
{
- DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ }
+ }
+ if (territories.isEmpty())
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
else
{
- SpawnTable.getInstance().deleteSpawn(spawn, true);
+ AdminCommandHandler.getInstance().useAdminCommand(player, AdminDelete.ADMIN_COMMANDS[1], true);
+ }
+ }
+ }
+
+ private void deleteGroup(Player player, Npc target)
+ {
+ final Spawn spawn = target.getSpawn();
+ if (spawn != null)
+ {
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
+ {
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
+ }
+ }
+ if (territories.isEmpty())
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ else
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+
+ if (group != null)
+ {
+ for (NpcSpawnTemplate template : group.getSpawns())
+ {
+ template.despawn();
+ }
+ }
+ else if (simpleTerritory && (npcSpawnTemplate != null))
+ {
+ npcSpawnTemplate.despawn();
+ }
+
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " group from " + target.getObjectId() + ".");
}
}
-
- BuilderUtil.sendSysMessage(activeChar, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
@Override
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/data/SpawnTable.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/data/SpawnTable.java
index 986e4f1195..869f325b27 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/data/SpawnTable.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/data/SpawnTable.java
@@ -22,6 +22,7 @@ import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -33,6 +34,9 @@ import org.l2jmobius.gameserver.data.xml.NpcData;
import org.l2jmobius.gameserver.model.Spawn;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
/**
* Spawn data retriever.
@@ -202,50 +206,104 @@ public class SpawnTable
{
final BufferedReader reader = new BufferedReader(new FileReader(spawnFile));
final BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
- final String spawnId = String.valueOf(spawn.getId());
- final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
- final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
- final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
boolean found = false; // in XML you can have more than one spawn with same coords
boolean isMultiLine = false; // in case spawn has more stats
boolean lastLineFound = false; // used to check for empty file
int lineCount = 0;
String currentLine;
- while ((currentLine = reader.readLine()) != null)
+
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
{
- if (!found)
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
{
- if (isMultiLine)
- {
- if (currentLine.contains(""))
- {
- found = true;
- }
- continue;
- }
- if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
- {
- if (!currentLine.contains("/>") && !currentLine.contains(""))
- {
- isMultiLine = true;
- }
- else
- {
- found = true;
- }
- continue;
- }
- }
- writer.write(currentLine + Config.EOL);
- if (currentLine.contains(""))
- {
- lastLineFound = true;
- }
- if (!lastLineFound)
- {
- lineCount++;
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
}
}
+
+ if (territories.isEmpty())
+ {
+ final String spawnId = String.valueOf(spawn.getId());
+ final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
+ final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
+ final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
+ while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains(""))
+ {
+ found = true;
+ }
+ continue;
+ }
+ if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
+ {
+ if (!currentLine.contains("/>") && !currentLine.contains(""))
+ {
+ isMultiLine = true;
+ }
+ else
+ {
+ found = true;
+ }
+ continue;
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+ else
+ {
+ SEARCH: while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains("") || (simpleTerritory && currentLine.contains("")))
+ {
+ found = true;
+ }
+ continue;
+ }
+ for (SpawnTerritory territory : territories)
+ {
+ if (currentLine.contains('"' + territory.getName() + '"'))
+ {
+ isMultiLine = true;
+ continue SEARCH;
+ }
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+
writer.close();
reader.close();
spawnFile.delete();
diff --git a/L2J_Mobius_Classic_2.5_Zaken/dist/game/config/AdminCommands.xml b/L2J_Mobius_Classic_2.5_Zaken/dist/game/config/AdminCommands.xml
index 9b610a1b81..f15749aadb 100644
--- a/L2J_Mobius_Classic_2.5_Zaken/dist/game/config/AdminCommands.xml
+++ b/L2J_Mobius_Classic_2.5_Zaken/dist/game/config/AdminCommands.xml
@@ -95,6 +95,7 @@
+
diff --git a/L2J_Mobius_Classic_2.5_Zaken/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java b/L2J_Mobius_Classic_2.5_Zaken/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
index cd80804c69..0a91636ead 100644
--- a/L2J_Mobius_Classic_2.5_Zaken/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
+++ b/L2J_Mobius_Classic_2.5_Zaken/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
@@ -16,7 +16,11 @@
*/
package handlers.admincommandhandlers;
+import java.util.Collections;
+import java.util.List;
+
import org.l2jmobius.gameserver.data.SpawnTable;
+import org.l2jmobius.gameserver.handler.AdminCommandHandler;
import org.l2jmobius.gameserver.handler.IAdminCommandHandler;
import org.l2jmobius.gameserver.instancemanager.DBSpawnManager;
import org.l2jmobius.gameserver.model.Spawn;
@@ -24,23 +28,32 @@ import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
import org.l2jmobius.gameserver.util.BuilderUtil;
import org.l2jmobius.gameserver.util.Util;
/**
- * This class handles following admin commands: - delete = deletes target
+ * @author Mobius
*/
public class AdminDelete implements IAdminCommandHandler
{
private static final String[] ADMIN_COMMANDS =
{
- "admin_delete"
+ "admin_delete", // supports range parameter
+ "admin_delete_group" // for territory spawns
};
@Override
public boolean useAdminCommand(String command, Player activeChar)
{
- if (command.startsWith("admin_delete"))
+ if (command.contains("group"))
+ {
+ handleDeleteGroup(activeChar);
+ }
+ else if (command.startsWith("admin_delete"))
{
final String[] split = command.split(" ");
handleDelete(activeChar, (split.length > 1) && Util.isDigit(split[1]) ? Integer.parseInt(split[1]) : 0);
@@ -48,48 +61,125 @@ public class AdminDelete implements IAdminCommandHandler
return true;
}
- private void handleDelete(Player activeChar, int range)
+ private void handleDelete(Player player, int range)
{
if (range > 0)
{
- World.getInstance().forEachVisibleObjectInRange(activeChar, Npc.class, range, target ->
- {
- deleteNpc(activeChar, target);
- });
+ World.getInstance().forEachVisibleObjectInRange(player, Npc.class, range, target -> deleteNpc(player, target));
return;
}
- final WorldObject obj = activeChar.getTarget();
+ final WorldObject obj = player.getTarget();
if (obj instanceof Npc)
{
- deleteNpc(activeChar, (Npc) obj);
+ deleteNpc(player, (Npc) obj);
}
else
{
- BuilderUtil.sendSysMessage(activeChar, "Incorrect target.");
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
}
}
- private void deleteNpc(Player activeChar, Npc target)
+ private void handleDeleteGroup(Player player)
+ {
+ final WorldObject obj = player.getTarget();
+ if (obj instanceof Npc)
+ {
+ deleteGroup(player, (Npc) obj);
+ }
+ else
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ }
+
+ private void deleteNpc(Player player, Npc target)
{
- target.deleteMe();
-
final Spawn spawn = target.getSpawn();
if (spawn != null)
{
- spawn.stopRespawn();
-
- if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ if (territories.isEmpty())
{
- DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ }
+ }
+ if (territories.isEmpty())
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
else
{
- SpawnTable.getInstance().deleteSpawn(spawn, true);
+ AdminCommandHandler.getInstance().useAdminCommand(player, AdminDelete.ADMIN_COMMANDS[1], true);
+ }
+ }
+ }
+
+ private void deleteGroup(Player player, Npc target)
+ {
+ final Spawn spawn = target.getSpawn();
+ if (spawn != null)
+ {
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
+ {
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
+ }
+ }
+ if (territories.isEmpty())
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ else
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+
+ if (group != null)
+ {
+ for (NpcSpawnTemplate template : group.getSpawns())
+ {
+ template.despawn();
+ }
+ }
+ else if (simpleTerritory && (npcSpawnTemplate != null))
+ {
+ npcSpawnTemplate.despawn();
+ }
+
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " group from " + target.getObjectId() + ".");
}
}
-
- BuilderUtil.sendSysMessage(activeChar, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
@Override
diff --git a/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/data/SpawnTable.java b/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/data/SpawnTable.java
index 986e4f1195..869f325b27 100644
--- a/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/data/SpawnTable.java
+++ b/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/data/SpawnTable.java
@@ -22,6 +22,7 @@ import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -33,6 +34,9 @@ import org.l2jmobius.gameserver.data.xml.NpcData;
import org.l2jmobius.gameserver.model.Spawn;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
/**
* Spawn data retriever.
@@ -202,50 +206,104 @@ public class SpawnTable
{
final BufferedReader reader = new BufferedReader(new FileReader(spawnFile));
final BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
- final String spawnId = String.valueOf(spawn.getId());
- final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
- final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
- final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
boolean found = false; // in XML you can have more than one spawn with same coords
boolean isMultiLine = false; // in case spawn has more stats
boolean lastLineFound = false; // used to check for empty file
int lineCount = 0;
String currentLine;
- while ((currentLine = reader.readLine()) != null)
+
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
{
- if (!found)
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
{
- if (isMultiLine)
- {
- if (currentLine.contains(""))
- {
- found = true;
- }
- continue;
- }
- if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
- {
- if (!currentLine.contains("/>") && !currentLine.contains(""))
- {
- isMultiLine = true;
- }
- else
- {
- found = true;
- }
- continue;
- }
- }
- writer.write(currentLine + Config.EOL);
- if (currentLine.contains(""))
- {
- lastLineFound = true;
- }
- if (!lastLineFound)
- {
- lineCount++;
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
}
}
+
+ if (territories.isEmpty())
+ {
+ final String spawnId = String.valueOf(spawn.getId());
+ final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
+ final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
+ final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
+ while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains(""))
+ {
+ found = true;
+ }
+ continue;
+ }
+ if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
+ {
+ if (!currentLine.contains("/>") && !currentLine.contains(""))
+ {
+ isMultiLine = true;
+ }
+ else
+ {
+ found = true;
+ }
+ continue;
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+ else
+ {
+ SEARCH: while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains("") || (simpleTerritory && currentLine.contains("")))
+ {
+ found = true;
+ }
+ continue;
+ }
+ for (SpawnTerritory territory : territories)
+ {
+ if (currentLine.contains('"' + territory.getName() + '"'))
+ {
+ isMultiLine = true;
+ continue SEARCH;
+ }
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+
writer.close();
reader.close();
spawnFile.delete();
diff --git a/L2J_Mobius_Classic_2.7_Antharas/dist/game/config/AdminCommands.xml b/L2J_Mobius_Classic_2.7_Antharas/dist/game/config/AdminCommands.xml
index 9b610a1b81..f15749aadb 100644
--- a/L2J_Mobius_Classic_2.7_Antharas/dist/game/config/AdminCommands.xml
+++ b/L2J_Mobius_Classic_2.7_Antharas/dist/game/config/AdminCommands.xml
@@ -95,6 +95,7 @@
+
diff --git a/L2J_Mobius_Classic_2.7_Antharas/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java b/L2J_Mobius_Classic_2.7_Antharas/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
index cd80804c69..0a91636ead 100644
--- a/L2J_Mobius_Classic_2.7_Antharas/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
+++ b/L2J_Mobius_Classic_2.7_Antharas/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
@@ -16,7 +16,11 @@
*/
package handlers.admincommandhandlers;
+import java.util.Collections;
+import java.util.List;
+
import org.l2jmobius.gameserver.data.SpawnTable;
+import org.l2jmobius.gameserver.handler.AdminCommandHandler;
import org.l2jmobius.gameserver.handler.IAdminCommandHandler;
import org.l2jmobius.gameserver.instancemanager.DBSpawnManager;
import org.l2jmobius.gameserver.model.Spawn;
@@ -24,23 +28,32 @@ import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
import org.l2jmobius.gameserver.util.BuilderUtil;
import org.l2jmobius.gameserver.util.Util;
/**
- * This class handles following admin commands: - delete = deletes target
+ * @author Mobius
*/
public class AdminDelete implements IAdminCommandHandler
{
private static final String[] ADMIN_COMMANDS =
{
- "admin_delete"
+ "admin_delete", // supports range parameter
+ "admin_delete_group" // for territory spawns
};
@Override
public boolean useAdminCommand(String command, Player activeChar)
{
- if (command.startsWith("admin_delete"))
+ if (command.contains("group"))
+ {
+ handleDeleteGroup(activeChar);
+ }
+ else if (command.startsWith("admin_delete"))
{
final String[] split = command.split(" ");
handleDelete(activeChar, (split.length > 1) && Util.isDigit(split[1]) ? Integer.parseInt(split[1]) : 0);
@@ -48,48 +61,125 @@ public class AdminDelete implements IAdminCommandHandler
return true;
}
- private void handleDelete(Player activeChar, int range)
+ private void handleDelete(Player player, int range)
{
if (range > 0)
{
- World.getInstance().forEachVisibleObjectInRange(activeChar, Npc.class, range, target ->
- {
- deleteNpc(activeChar, target);
- });
+ World.getInstance().forEachVisibleObjectInRange(player, Npc.class, range, target -> deleteNpc(player, target));
return;
}
- final WorldObject obj = activeChar.getTarget();
+ final WorldObject obj = player.getTarget();
if (obj instanceof Npc)
{
- deleteNpc(activeChar, (Npc) obj);
+ deleteNpc(player, (Npc) obj);
}
else
{
- BuilderUtil.sendSysMessage(activeChar, "Incorrect target.");
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
}
}
- private void deleteNpc(Player activeChar, Npc target)
+ private void handleDeleteGroup(Player player)
+ {
+ final WorldObject obj = player.getTarget();
+ if (obj instanceof Npc)
+ {
+ deleteGroup(player, (Npc) obj);
+ }
+ else
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ }
+
+ private void deleteNpc(Player player, Npc target)
{
- target.deleteMe();
-
final Spawn spawn = target.getSpawn();
if (spawn != null)
{
- spawn.stopRespawn();
-
- if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ if (territories.isEmpty())
{
- DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ }
+ }
+ if (territories.isEmpty())
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
else
{
- SpawnTable.getInstance().deleteSpawn(spawn, true);
+ AdminCommandHandler.getInstance().useAdminCommand(player, AdminDelete.ADMIN_COMMANDS[1], true);
+ }
+ }
+ }
+
+ private void deleteGroup(Player player, Npc target)
+ {
+ final Spawn spawn = target.getSpawn();
+ if (spawn != null)
+ {
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
+ {
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
+ }
+ }
+ if (territories.isEmpty())
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ else
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+
+ if (group != null)
+ {
+ for (NpcSpawnTemplate template : group.getSpawns())
+ {
+ template.despawn();
+ }
+ }
+ else if (simpleTerritory && (npcSpawnTemplate != null))
+ {
+ npcSpawnTemplate.despawn();
+ }
+
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " group from " + target.getObjectId() + ".");
}
}
-
- BuilderUtil.sendSysMessage(activeChar, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
@Override
diff --git a/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/data/SpawnTable.java b/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/data/SpawnTable.java
index 986e4f1195..869f325b27 100644
--- a/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/data/SpawnTable.java
+++ b/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/data/SpawnTable.java
@@ -22,6 +22,7 @@ import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -33,6 +34,9 @@ import org.l2jmobius.gameserver.data.xml.NpcData;
import org.l2jmobius.gameserver.model.Spawn;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
/**
* Spawn data retriever.
@@ -202,50 +206,104 @@ public class SpawnTable
{
final BufferedReader reader = new BufferedReader(new FileReader(spawnFile));
final BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
- final String spawnId = String.valueOf(spawn.getId());
- final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
- final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
- final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
boolean found = false; // in XML you can have more than one spawn with same coords
boolean isMultiLine = false; // in case spawn has more stats
boolean lastLineFound = false; // used to check for empty file
int lineCount = 0;
String currentLine;
- while ((currentLine = reader.readLine()) != null)
+
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
{
- if (!found)
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
{
- if (isMultiLine)
- {
- if (currentLine.contains(""))
- {
- found = true;
- }
- continue;
- }
- if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
- {
- if (!currentLine.contains("/>") && !currentLine.contains(""))
- {
- isMultiLine = true;
- }
- else
- {
- found = true;
- }
- continue;
- }
- }
- writer.write(currentLine + Config.EOL);
- if (currentLine.contains(""))
- {
- lastLineFound = true;
- }
- if (!lastLineFound)
- {
- lineCount++;
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
}
}
+
+ if (territories.isEmpty())
+ {
+ final String spawnId = String.valueOf(spawn.getId());
+ final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
+ final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
+ final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
+ while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains(""))
+ {
+ found = true;
+ }
+ continue;
+ }
+ if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
+ {
+ if (!currentLine.contains("/>") && !currentLine.contains(""))
+ {
+ isMultiLine = true;
+ }
+ else
+ {
+ found = true;
+ }
+ continue;
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+ else
+ {
+ SEARCH: while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains("") || (simpleTerritory && currentLine.contains("")))
+ {
+ found = true;
+ }
+ continue;
+ }
+ for (SpawnTerritory territory : territories)
+ {
+ if (currentLine.contains('"' + territory.getName() + '"'))
+ {
+ isMultiLine = true;
+ continue SEARCH;
+ }
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+
writer.close();
reader.close();
spawnFile.delete();
diff --git a/L2J_Mobius_Classic_2.8_SevenSigns/dist/game/config/AdminCommands.xml b/L2J_Mobius_Classic_2.8_SevenSigns/dist/game/config/AdminCommands.xml
index 9b610a1b81..f15749aadb 100644
--- a/L2J_Mobius_Classic_2.8_SevenSigns/dist/game/config/AdminCommands.xml
+++ b/L2J_Mobius_Classic_2.8_SevenSigns/dist/game/config/AdminCommands.xml
@@ -95,6 +95,7 @@
+
diff --git a/L2J_Mobius_Classic_2.8_SevenSigns/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java b/L2J_Mobius_Classic_2.8_SevenSigns/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
index cd80804c69..0a91636ead 100644
--- a/L2J_Mobius_Classic_2.8_SevenSigns/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
+++ b/L2J_Mobius_Classic_2.8_SevenSigns/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
@@ -16,7 +16,11 @@
*/
package handlers.admincommandhandlers;
+import java.util.Collections;
+import java.util.List;
+
import org.l2jmobius.gameserver.data.SpawnTable;
+import org.l2jmobius.gameserver.handler.AdminCommandHandler;
import org.l2jmobius.gameserver.handler.IAdminCommandHandler;
import org.l2jmobius.gameserver.instancemanager.DBSpawnManager;
import org.l2jmobius.gameserver.model.Spawn;
@@ -24,23 +28,32 @@ import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
import org.l2jmobius.gameserver.util.BuilderUtil;
import org.l2jmobius.gameserver.util.Util;
/**
- * This class handles following admin commands: - delete = deletes target
+ * @author Mobius
*/
public class AdminDelete implements IAdminCommandHandler
{
private static final String[] ADMIN_COMMANDS =
{
- "admin_delete"
+ "admin_delete", // supports range parameter
+ "admin_delete_group" // for territory spawns
};
@Override
public boolean useAdminCommand(String command, Player activeChar)
{
- if (command.startsWith("admin_delete"))
+ if (command.contains("group"))
+ {
+ handleDeleteGroup(activeChar);
+ }
+ else if (command.startsWith("admin_delete"))
{
final String[] split = command.split(" ");
handleDelete(activeChar, (split.length > 1) && Util.isDigit(split[1]) ? Integer.parseInt(split[1]) : 0);
@@ -48,48 +61,125 @@ public class AdminDelete implements IAdminCommandHandler
return true;
}
- private void handleDelete(Player activeChar, int range)
+ private void handleDelete(Player player, int range)
{
if (range > 0)
{
- World.getInstance().forEachVisibleObjectInRange(activeChar, Npc.class, range, target ->
- {
- deleteNpc(activeChar, target);
- });
+ World.getInstance().forEachVisibleObjectInRange(player, Npc.class, range, target -> deleteNpc(player, target));
return;
}
- final WorldObject obj = activeChar.getTarget();
+ final WorldObject obj = player.getTarget();
if (obj instanceof Npc)
{
- deleteNpc(activeChar, (Npc) obj);
+ deleteNpc(player, (Npc) obj);
}
else
{
- BuilderUtil.sendSysMessage(activeChar, "Incorrect target.");
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
}
}
- private void deleteNpc(Player activeChar, Npc target)
+ private void handleDeleteGroup(Player player)
+ {
+ final WorldObject obj = player.getTarget();
+ if (obj instanceof Npc)
+ {
+ deleteGroup(player, (Npc) obj);
+ }
+ else
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ }
+
+ private void deleteNpc(Player player, Npc target)
{
- target.deleteMe();
-
final Spawn spawn = target.getSpawn();
if (spawn != null)
{
- spawn.stopRespawn();
-
- if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ if (territories.isEmpty())
{
- DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ }
+ }
+ if (territories.isEmpty())
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
else
{
- SpawnTable.getInstance().deleteSpawn(spawn, true);
+ AdminCommandHandler.getInstance().useAdminCommand(player, AdminDelete.ADMIN_COMMANDS[1], true);
+ }
+ }
+ }
+
+ private void deleteGroup(Player player, Npc target)
+ {
+ final Spawn spawn = target.getSpawn();
+ if (spawn != null)
+ {
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
+ {
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
+ }
+ }
+ if (territories.isEmpty())
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ else
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+
+ if (group != null)
+ {
+ for (NpcSpawnTemplate template : group.getSpawns())
+ {
+ template.despawn();
+ }
+ }
+ else if (simpleTerritory && (npcSpawnTemplate != null))
+ {
+ npcSpawnTemplate.despawn();
+ }
+
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " group from " + target.getObjectId() + ".");
}
}
-
- BuilderUtil.sendSysMessage(activeChar, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
@Override
diff --git a/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/data/SpawnTable.java b/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/data/SpawnTable.java
index 986e4f1195..869f325b27 100644
--- a/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/data/SpawnTable.java
+++ b/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/data/SpawnTable.java
@@ -22,6 +22,7 @@ import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -33,6 +34,9 @@ import org.l2jmobius.gameserver.data.xml.NpcData;
import org.l2jmobius.gameserver.model.Spawn;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
/**
* Spawn data retriever.
@@ -202,50 +206,104 @@ public class SpawnTable
{
final BufferedReader reader = new BufferedReader(new FileReader(spawnFile));
final BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
- final String spawnId = String.valueOf(spawn.getId());
- final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
- final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
- final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
boolean found = false; // in XML you can have more than one spawn with same coords
boolean isMultiLine = false; // in case spawn has more stats
boolean lastLineFound = false; // used to check for empty file
int lineCount = 0;
String currentLine;
- while ((currentLine = reader.readLine()) != null)
+
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
{
- if (!found)
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
{
- if (isMultiLine)
- {
- if (currentLine.contains(""))
- {
- found = true;
- }
- continue;
- }
- if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
- {
- if (!currentLine.contains("/>") && !currentLine.contains(""))
- {
- isMultiLine = true;
- }
- else
- {
- found = true;
- }
- continue;
- }
- }
- writer.write(currentLine + Config.EOL);
- if (currentLine.contains(""))
- {
- lastLineFound = true;
- }
- if (!lastLineFound)
- {
- lineCount++;
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
}
}
+
+ if (territories.isEmpty())
+ {
+ final String spawnId = String.valueOf(spawn.getId());
+ final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
+ final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
+ final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
+ while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains(""))
+ {
+ found = true;
+ }
+ continue;
+ }
+ if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
+ {
+ if (!currentLine.contains("/>") && !currentLine.contains(""))
+ {
+ isMultiLine = true;
+ }
+ else
+ {
+ found = true;
+ }
+ continue;
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+ else
+ {
+ SEARCH: while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains("") || (simpleTerritory && currentLine.contains("")))
+ {
+ found = true;
+ }
+ continue;
+ }
+ for (SpawnTerritory territory : territories)
+ {
+ if (currentLine.contains('"' + territory.getName() + '"'))
+ {
+ isMultiLine = true;
+ continue SEARCH;
+ }
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+
writer.close();
reader.close();
spawnFile.delete();
diff --git a/L2J_Mobius_Classic_2.9_SecretOfEmpire/dist/game/config/AdminCommands.xml b/L2J_Mobius_Classic_2.9_SecretOfEmpire/dist/game/config/AdminCommands.xml
index 9b610a1b81..f15749aadb 100644
--- a/L2J_Mobius_Classic_2.9_SecretOfEmpire/dist/game/config/AdminCommands.xml
+++ b/L2J_Mobius_Classic_2.9_SecretOfEmpire/dist/game/config/AdminCommands.xml
@@ -95,6 +95,7 @@
+
diff --git a/L2J_Mobius_Classic_2.9_SecretOfEmpire/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java b/L2J_Mobius_Classic_2.9_SecretOfEmpire/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
index cd80804c69..0a91636ead 100644
--- a/L2J_Mobius_Classic_2.9_SecretOfEmpire/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
+++ b/L2J_Mobius_Classic_2.9_SecretOfEmpire/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
@@ -16,7 +16,11 @@
*/
package handlers.admincommandhandlers;
+import java.util.Collections;
+import java.util.List;
+
import org.l2jmobius.gameserver.data.SpawnTable;
+import org.l2jmobius.gameserver.handler.AdminCommandHandler;
import org.l2jmobius.gameserver.handler.IAdminCommandHandler;
import org.l2jmobius.gameserver.instancemanager.DBSpawnManager;
import org.l2jmobius.gameserver.model.Spawn;
@@ -24,23 +28,32 @@ import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
import org.l2jmobius.gameserver.util.BuilderUtil;
import org.l2jmobius.gameserver.util.Util;
/**
- * This class handles following admin commands: - delete = deletes target
+ * @author Mobius
*/
public class AdminDelete implements IAdminCommandHandler
{
private static final String[] ADMIN_COMMANDS =
{
- "admin_delete"
+ "admin_delete", // supports range parameter
+ "admin_delete_group" // for territory spawns
};
@Override
public boolean useAdminCommand(String command, Player activeChar)
{
- if (command.startsWith("admin_delete"))
+ if (command.contains("group"))
+ {
+ handleDeleteGroup(activeChar);
+ }
+ else if (command.startsWith("admin_delete"))
{
final String[] split = command.split(" ");
handleDelete(activeChar, (split.length > 1) && Util.isDigit(split[1]) ? Integer.parseInt(split[1]) : 0);
@@ -48,48 +61,125 @@ public class AdminDelete implements IAdminCommandHandler
return true;
}
- private void handleDelete(Player activeChar, int range)
+ private void handleDelete(Player player, int range)
{
if (range > 0)
{
- World.getInstance().forEachVisibleObjectInRange(activeChar, Npc.class, range, target ->
- {
- deleteNpc(activeChar, target);
- });
+ World.getInstance().forEachVisibleObjectInRange(player, Npc.class, range, target -> deleteNpc(player, target));
return;
}
- final WorldObject obj = activeChar.getTarget();
+ final WorldObject obj = player.getTarget();
if (obj instanceof Npc)
{
- deleteNpc(activeChar, (Npc) obj);
+ deleteNpc(player, (Npc) obj);
}
else
{
- BuilderUtil.sendSysMessage(activeChar, "Incorrect target.");
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
}
}
- private void deleteNpc(Player activeChar, Npc target)
+ private void handleDeleteGroup(Player player)
+ {
+ final WorldObject obj = player.getTarget();
+ if (obj instanceof Npc)
+ {
+ deleteGroup(player, (Npc) obj);
+ }
+ else
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ }
+
+ private void deleteNpc(Player player, Npc target)
{
- target.deleteMe();
-
final Spawn spawn = target.getSpawn();
if (spawn != null)
{
- spawn.stopRespawn();
-
- if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ if (territories.isEmpty())
{
- DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ }
+ }
+ if (territories.isEmpty())
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
else
{
- SpawnTable.getInstance().deleteSpawn(spawn, true);
+ AdminCommandHandler.getInstance().useAdminCommand(player, AdminDelete.ADMIN_COMMANDS[1], true);
+ }
+ }
+ }
+
+ private void deleteGroup(Player player, Npc target)
+ {
+ final Spawn spawn = target.getSpawn();
+ if (spawn != null)
+ {
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
+ {
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
+ }
+ }
+ if (territories.isEmpty())
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ else
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+
+ if (group != null)
+ {
+ for (NpcSpawnTemplate template : group.getSpawns())
+ {
+ template.despawn();
+ }
+ }
+ else if (simpleTerritory && (npcSpawnTemplate != null))
+ {
+ npcSpawnTemplate.despawn();
+ }
+
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " group from " + target.getObjectId() + ".");
}
}
-
- BuilderUtil.sendSysMessage(activeChar, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
@Override
diff --git a/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/data/SpawnTable.java b/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/data/SpawnTable.java
index 986e4f1195..869f325b27 100644
--- a/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/data/SpawnTable.java
+++ b/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/data/SpawnTable.java
@@ -22,6 +22,7 @@ import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -33,6 +34,9 @@ import org.l2jmobius.gameserver.data.xml.NpcData;
import org.l2jmobius.gameserver.model.Spawn;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
/**
* Spawn data retriever.
@@ -202,50 +206,104 @@ public class SpawnTable
{
final BufferedReader reader = new BufferedReader(new FileReader(spawnFile));
final BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
- final String spawnId = String.valueOf(spawn.getId());
- final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
- final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
- final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
boolean found = false; // in XML you can have more than one spawn with same coords
boolean isMultiLine = false; // in case spawn has more stats
boolean lastLineFound = false; // used to check for empty file
int lineCount = 0;
String currentLine;
- while ((currentLine = reader.readLine()) != null)
+
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
{
- if (!found)
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
{
- if (isMultiLine)
- {
- if (currentLine.contains(""))
- {
- found = true;
- }
- continue;
- }
- if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
- {
- if (!currentLine.contains("/>") && !currentLine.contains(""))
- {
- isMultiLine = true;
- }
- else
- {
- found = true;
- }
- continue;
- }
- }
- writer.write(currentLine + Config.EOL);
- if (currentLine.contains(""))
- {
- lastLineFound = true;
- }
- if (!lastLineFound)
- {
- lineCount++;
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
}
}
+
+ if (territories.isEmpty())
+ {
+ final String spawnId = String.valueOf(spawn.getId());
+ final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
+ final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
+ final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
+ while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains(""))
+ {
+ found = true;
+ }
+ continue;
+ }
+ if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
+ {
+ if (!currentLine.contains("/>") && !currentLine.contains(""))
+ {
+ isMultiLine = true;
+ }
+ else
+ {
+ found = true;
+ }
+ continue;
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+ else
+ {
+ SEARCH: while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains("") || (simpleTerritory && currentLine.contains("")))
+ {
+ found = true;
+ }
+ continue;
+ }
+ for (SpawnTerritory territory : territories)
+ {
+ if (currentLine.contains('"' + territory.getName() + '"'))
+ {
+ isMultiLine = true;
+ continue SEARCH;
+ }
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+
writer.close();
reader.close();
spawnFile.delete();
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/config/AdminCommands.xml b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/config/AdminCommands.xml
index 9b610a1b81..f15749aadb 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/config/AdminCommands.xml
+++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/config/AdminCommands.xml
@@ -95,6 +95,7 @@
+
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
index cd80804c69..0a91636ead 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
@@ -16,7 +16,11 @@
*/
package handlers.admincommandhandlers;
+import java.util.Collections;
+import java.util.List;
+
import org.l2jmobius.gameserver.data.SpawnTable;
+import org.l2jmobius.gameserver.handler.AdminCommandHandler;
import org.l2jmobius.gameserver.handler.IAdminCommandHandler;
import org.l2jmobius.gameserver.instancemanager.DBSpawnManager;
import org.l2jmobius.gameserver.model.Spawn;
@@ -24,23 +28,32 @@ import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
import org.l2jmobius.gameserver.util.BuilderUtil;
import org.l2jmobius.gameserver.util.Util;
/**
- * This class handles following admin commands: - delete = deletes target
+ * @author Mobius
*/
public class AdminDelete implements IAdminCommandHandler
{
private static final String[] ADMIN_COMMANDS =
{
- "admin_delete"
+ "admin_delete", // supports range parameter
+ "admin_delete_group" // for territory spawns
};
@Override
public boolean useAdminCommand(String command, Player activeChar)
{
- if (command.startsWith("admin_delete"))
+ if (command.contains("group"))
+ {
+ handleDeleteGroup(activeChar);
+ }
+ else if (command.startsWith("admin_delete"))
{
final String[] split = command.split(" ");
handleDelete(activeChar, (split.length > 1) && Util.isDigit(split[1]) ? Integer.parseInt(split[1]) : 0);
@@ -48,48 +61,125 @@ public class AdminDelete implements IAdminCommandHandler
return true;
}
- private void handleDelete(Player activeChar, int range)
+ private void handleDelete(Player player, int range)
{
if (range > 0)
{
- World.getInstance().forEachVisibleObjectInRange(activeChar, Npc.class, range, target ->
- {
- deleteNpc(activeChar, target);
- });
+ World.getInstance().forEachVisibleObjectInRange(player, Npc.class, range, target -> deleteNpc(player, target));
return;
}
- final WorldObject obj = activeChar.getTarget();
+ final WorldObject obj = player.getTarget();
if (obj instanceof Npc)
{
- deleteNpc(activeChar, (Npc) obj);
+ deleteNpc(player, (Npc) obj);
}
else
{
- BuilderUtil.sendSysMessage(activeChar, "Incorrect target.");
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
}
}
- private void deleteNpc(Player activeChar, Npc target)
+ private void handleDeleteGroup(Player player)
+ {
+ final WorldObject obj = player.getTarget();
+ if (obj instanceof Npc)
+ {
+ deleteGroup(player, (Npc) obj);
+ }
+ else
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ }
+
+ private void deleteNpc(Player player, Npc target)
{
- target.deleteMe();
-
final Spawn spawn = target.getSpawn();
if (spawn != null)
{
- spawn.stopRespawn();
-
- if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ if (territories.isEmpty())
{
- DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ }
+ }
+ if (territories.isEmpty())
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
else
{
- SpawnTable.getInstance().deleteSpawn(spawn, true);
+ AdminCommandHandler.getInstance().useAdminCommand(player, AdminDelete.ADMIN_COMMANDS[1], true);
+ }
+ }
+ }
+
+ private void deleteGroup(Player player, Npc target)
+ {
+ final Spawn spawn = target.getSpawn();
+ if (spawn != null)
+ {
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
+ {
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
+ }
+ }
+ if (territories.isEmpty())
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ else
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+
+ if (group != null)
+ {
+ for (NpcSpawnTemplate template : group.getSpawns())
+ {
+ template.despawn();
+ }
+ }
+ else if (simpleTerritory && (npcSpawnTemplate != null))
+ {
+ npcSpawnTemplate.despawn();
+ }
+
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " group from " + target.getObjectId() + ".");
}
}
-
- BuilderUtil.sendSysMessage(activeChar, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
@Override
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/data/SpawnTable.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/data/SpawnTable.java
index 986e4f1195..869f325b27 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/data/SpawnTable.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/data/SpawnTable.java
@@ -22,6 +22,7 @@ import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -33,6 +34,9 @@ import org.l2jmobius.gameserver.data.xml.NpcData;
import org.l2jmobius.gameserver.model.Spawn;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
/**
* Spawn data retriever.
@@ -202,50 +206,104 @@ public class SpawnTable
{
final BufferedReader reader = new BufferedReader(new FileReader(spawnFile));
final BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
- final String spawnId = String.valueOf(spawn.getId());
- final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
- final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
- final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
boolean found = false; // in XML you can have more than one spawn with same coords
boolean isMultiLine = false; // in case spawn has more stats
boolean lastLineFound = false; // used to check for empty file
int lineCount = 0;
String currentLine;
- while ((currentLine = reader.readLine()) != null)
+
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
{
- if (!found)
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
{
- if (isMultiLine)
- {
- if (currentLine.contains(""))
- {
- found = true;
- }
- continue;
- }
- if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
- {
- if (!currentLine.contains("/>") && !currentLine.contains(""))
- {
- isMultiLine = true;
- }
- else
- {
- found = true;
- }
- continue;
- }
- }
- writer.write(currentLine + Config.EOL);
- if (currentLine.contains(""))
- {
- lastLineFound = true;
- }
- if (!lastLineFound)
- {
- lineCount++;
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
}
}
+
+ if (territories.isEmpty())
+ {
+ final String spawnId = String.valueOf(spawn.getId());
+ final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
+ final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
+ final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
+ while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains(""))
+ {
+ found = true;
+ }
+ continue;
+ }
+ if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
+ {
+ if (!currentLine.contains("/>") && !currentLine.contains(""))
+ {
+ isMultiLine = true;
+ }
+ else
+ {
+ found = true;
+ }
+ continue;
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+ else
+ {
+ SEARCH: while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains("") || (simpleTerritory && currentLine.contains("")))
+ {
+ found = true;
+ }
+ continue;
+ }
+ for (SpawnTerritory territory : territories)
+ {
+ if (currentLine.contains('"' + territory.getName() + '"'))
+ {
+ isMultiLine = true;
+ continue SEARCH;
+ }
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+
writer.close();
reader.close();
spawnFile.delete();
diff --git a/L2J_Mobius_Classic_Interlude/dist/game/config/AdminCommands.xml b/L2J_Mobius_Classic_Interlude/dist/game/config/AdminCommands.xml
index 9b610a1b81..f15749aadb 100644
--- a/L2J_Mobius_Classic_Interlude/dist/game/config/AdminCommands.xml
+++ b/L2J_Mobius_Classic_Interlude/dist/game/config/AdminCommands.xml
@@ -95,6 +95,7 @@
+
diff --git a/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java b/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
index cd80804c69..0a91636ead 100644
--- a/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
+++ b/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
@@ -16,7 +16,11 @@
*/
package handlers.admincommandhandlers;
+import java.util.Collections;
+import java.util.List;
+
import org.l2jmobius.gameserver.data.SpawnTable;
+import org.l2jmobius.gameserver.handler.AdminCommandHandler;
import org.l2jmobius.gameserver.handler.IAdminCommandHandler;
import org.l2jmobius.gameserver.instancemanager.DBSpawnManager;
import org.l2jmobius.gameserver.model.Spawn;
@@ -24,23 +28,32 @@ import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
import org.l2jmobius.gameserver.util.BuilderUtil;
import org.l2jmobius.gameserver.util.Util;
/**
- * This class handles following admin commands: - delete = deletes target
+ * @author Mobius
*/
public class AdminDelete implements IAdminCommandHandler
{
private static final String[] ADMIN_COMMANDS =
{
- "admin_delete"
+ "admin_delete", // supports range parameter
+ "admin_delete_group" // for territory spawns
};
@Override
public boolean useAdminCommand(String command, Player activeChar)
{
- if (command.startsWith("admin_delete"))
+ if (command.contains("group"))
+ {
+ handleDeleteGroup(activeChar);
+ }
+ else if (command.startsWith("admin_delete"))
{
final String[] split = command.split(" ");
handleDelete(activeChar, (split.length > 1) && Util.isDigit(split[1]) ? Integer.parseInt(split[1]) : 0);
@@ -48,48 +61,125 @@ public class AdminDelete implements IAdminCommandHandler
return true;
}
- private void handleDelete(Player activeChar, int range)
+ private void handleDelete(Player player, int range)
{
if (range > 0)
{
- World.getInstance().forEachVisibleObjectInRange(activeChar, Npc.class, range, target ->
- {
- deleteNpc(activeChar, target);
- });
+ World.getInstance().forEachVisibleObjectInRange(player, Npc.class, range, target -> deleteNpc(player, target));
return;
}
- final WorldObject obj = activeChar.getTarget();
+ final WorldObject obj = player.getTarget();
if (obj instanceof Npc)
{
- deleteNpc(activeChar, (Npc) obj);
+ deleteNpc(player, (Npc) obj);
}
else
{
- BuilderUtil.sendSysMessage(activeChar, "Incorrect target.");
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
}
}
- private void deleteNpc(Player activeChar, Npc target)
+ private void handleDeleteGroup(Player player)
+ {
+ final WorldObject obj = player.getTarget();
+ if (obj instanceof Npc)
+ {
+ deleteGroup(player, (Npc) obj);
+ }
+ else
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ }
+
+ private void deleteNpc(Player player, Npc target)
{
- target.deleteMe();
-
final Spawn spawn = target.getSpawn();
if (spawn != null)
{
- spawn.stopRespawn();
-
- if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ if (territories.isEmpty())
{
- DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ }
+ }
+ if (territories.isEmpty())
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
else
{
- SpawnTable.getInstance().deleteSpawn(spawn, true);
+ AdminCommandHandler.getInstance().useAdminCommand(player, AdminDelete.ADMIN_COMMANDS[1], true);
+ }
+ }
+ }
+
+ private void deleteGroup(Player player, Npc target)
+ {
+ final Spawn spawn = target.getSpawn();
+ if (spawn != null)
+ {
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
+ {
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
+ }
+ }
+ if (territories.isEmpty())
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ else
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+
+ if (group != null)
+ {
+ for (NpcSpawnTemplate template : group.getSpawns())
+ {
+ template.despawn();
+ }
+ }
+ else if (simpleTerritory && (npcSpawnTemplate != null))
+ {
+ npcSpawnTemplate.despawn();
+ }
+
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " group from " + target.getObjectId() + ".");
}
}
-
- BuilderUtil.sendSysMessage(activeChar, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
@Override
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/data/SpawnTable.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/data/SpawnTable.java
index 986e4f1195..869f325b27 100644
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/data/SpawnTable.java
+++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/data/SpawnTable.java
@@ -22,6 +22,7 @@ import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -33,6 +34,9 @@ import org.l2jmobius.gameserver.data.xml.NpcData;
import org.l2jmobius.gameserver.model.Spawn;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
/**
* Spawn data retriever.
@@ -202,50 +206,104 @@ public class SpawnTable
{
final BufferedReader reader = new BufferedReader(new FileReader(spawnFile));
final BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
- final String spawnId = String.valueOf(spawn.getId());
- final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
- final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
- final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
boolean found = false; // in XML you can have more than one spawn with same coords
boolean isMultiLine = false; // in case spawn has more stats
boolean lastLineFound = false; // used to check for empty file
int lineCount = 0;
String currentLine;
- while ((currentLine = reader.readLine()) != null)
+
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
{
- if (!found)
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
{
- if (isMultiLine)
- {
- if (currentLine.contains(""))
- {
- found = true;
- }
- continue;
- }
- if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
- {
- if (!currentLine.contains("/>") && !currentLine.contains(""))
- {
- isMultiLine = true;
- }
- else
- {
- found = true;
- }
- continue;
- }
- }
- writer.write(currentLine + Config.EOL);
- if (currentLine.contains(""))
- {
- lastLineFound = true;
- }
- if (!lastLineFound)
- {
- lineCount++;
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
}
}
+
+ if (territories.isEmpty())
+ {
+ final String spawnId = String.valueOf(spawn.getId());
+ final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
+ final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
+ final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
+ while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains(""))
+ {
+ found = true;
+ }
+ continue;
+ }
+ if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
+ {
+ if (!currentLine.contains("/>") && !currentLine.contains(""))
+ {
+ isMultiLine = true;
+ }
+ else
+ {
+ found = true;
+ }
+ continue;
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+ else
+ {
+ SEARCH: while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains("") || (simpleTerritory && currentLine.contains("")))
+ {
+ found = true;
+ }
+ continue;
+ }
+ for (SpawnTerritory territory : territories)
+ {
+ if (currentLine.contains('"' + territory.getName() + '"'))
+ {
+ isMultiLine = true;
+ continue SEARCH;
+ }
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+
writer.close();
reader.close();
spawnFile.delete();
diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/config/AdminCommands.xml b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/config/AdminCommands.xml
index 9b610a1b81..f15749aadb 100644
--- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/config/AdminCommands.xml
+++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/config/AdminCommands.xml
@@ -95,6 +95,7 @@
+
diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
index cd80804c69..0a91636ead 100644
--- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
+++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
@@ -16,7 +16,11 @@
*/
package handlers.admincommandhandlers;
+import java.util.Collections;
+import java.util.List;
+
import org.l2jmobius.gameserver.data.SpawnTable;
+import org.l2jmobius.gameserver.handler.AdminCommandHandler;
import org.l2jmobius.gameserver.handler.IAdminCommandHandler;
import org.l2jmobius.gameserver.instancemanager.DBSpawnManager;
import org.l2jmobius.gameserver.model.Spawn;
@@ -24,23 +28,32 @@ import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
import org.l2jmobius.gameserver.util.BuilderUtil;
import org.l2jmobius.gameserver.util.Util;
/**
- * This class handles following admin commands: - delete = deletes target
+ * @author Mobius
*/
public class AdminDelete implements IAdminCommandHandler
{
private static final String[] ADMIN_COMMANDS =
{
- "admin_delete"
+ "admin_delete", // supports range parameter
+ "admin_delete_group" // for territory spawns
};
@Override
public boolean useAdminCommand(String command, Player activeChar)
{
- if (command.startsWith("admin_delete"))
+ if (command.contains("group"))
+ {
+ handleDeleteGroup(activeChar);
+ }
+ else if (command.startsWith("admin_delete"))
{
final String[] split = command.split(" ");
handleDelete(activeChar, (split.length > 1) && Util.isDigit(split[1]) ? Integer.parseInt(split[1]) : 0);
@@ -48,48 +61,125 @@ public class AdminDelete implements IAdminCommandHandler
return true;
}
- private void handleDelete(Player activeChar, int range)
+ private void handleDelete(Player player, int range)
{
if (range > 0)
{
- World.getInstance().forEachVisibleObjectInRange(activeChar, Npc.class, range, target ->
- {
- deleteNpc(activeChar, target);
- });
+ World.getInstance().forEachVisibleObjectInRange(player, Npc.class, range, target -> deleteNpc(player, target));
return;
}
- final WorldObject obj = activeChar.getTarget();
+ final WorldObject obj = player.getTarget();
if (obj instanceof Npc)
{
- deleteNpc(activeChar, (Npc) obj);
+ deleteNpc(player, (Npc) obj);
}
else
{
- BuilderUtil.sendSysMessage(activeChar, "Incorrect target.");
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
}
}
- private void deleteNpc(Player activeChar, Npc target)
+ private void handleDeleteGroup(Player player)
+ {
+ final WorldObject obj = player.getTarget();
+ if (obj instanceof Npc)
+ {
+ deleteGroup(player, (Npc) obj);
+ }
+ else
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ }
+
+ private void deleteNpc(Player player, Npc target)
{
- target.deleteMe();
-
final Spawn spawn = target.getSpawn();
if (spawn != null)
{
- spawn.stopRespawn();
-
- if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ if (territories.isEmpty())
{
- DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ }
+ }
+ if (territories.isEmpty())
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
else
{
- SpawnTable.getInstance().deleteSpawn(spawn, true);
+ AdminCommandHandler.getInstance().useAdminCommand(player, AdminDelete.ADMIN_COMMANDS[1], true);
+ }
+ }
+ }
+
+ private void deleteGroup(Player player, Npc target)
+ {
+ final Spawn spawn = target.getSpawn();
+ if (spawn != null)
+ {
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
+ {
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
+ }
+ }
+ if (territories.isEmpty())
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ else
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+
+ if (group != null)
+ {
+ for (NpcSpawnTemplate template : group.getSpawns())
+ {
+ template.despawn();
+ }
+ }
+ else if (simpleTerritory && (npcSpawnTemplate != null))
+ {
+ npcSpawnTemplate.despawn();
+ }
+
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " group from " + target.getObjectId() + ".");
}
}
-
- BuilderUtil.sendSysMessage(activeChar, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
@Override
diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/data/SpawnTable.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/data/SpawnTable.java
index 986e4f1195..869f325b27 100644
--- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/data/SpawnTable.java
+++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/data/SpawnTable.java
@@ -22,6 +22,7 @@ import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -33,6 +34,9 @@ import org.l2jmobius.gameserver.data.xml.NpcData;
import org.l2jmobius.gameserver.model.Spawn;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
/**
* Spawn data retriever.
@@ -202,50 +206,104 @@ public class SpawnTable
{
final BufferedReader reader = new BufferedReader(new FileReader(spawnFile));
final BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
- final String spawnId = String.valueOf(spawn.getId());
- final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
- final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
- final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
boolean found = false; // in XML you can have more than one spawn with same coords
boolean isMultiLine = false; // in case spawn has more stats
boolean lastLineFound = false; // used to check for empty file
int lineCount = 0;
String currentLine;
- while ((currentLine = reader.readLine()) != null)
+
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
{
- if (!found)
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
{
- if (isMultiLine)
- {
- if (currentLine.contains(""))
- {
- found = true;
- }
- continue;
- }
- if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
- {
- if (!currentLine.contains("/>") && !currentLine.contains(""))
- {
- isMultiLine = true;
- }
- else
- {
- found = true;
- }
- continue;
- }
- }
- writer.write(currentLine + Config.EOL);
- if (currentLine.contains(""))
- {
- lastLineFound = true;
- }
- if (!lastLineFound)
- {
- lineCount++;
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
}
}
+
+ if (territories.isEmpty())
+ {
+ final String spawnId = String.valueOf(spawn.getId());
+ final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
+ final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
+ final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
+ while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains(""))
+ {
+ found = true;
+ }
+ continue;
+ }
+ if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
+ {
+ if (!currentLine.contains("/>") && !currentLine.contains(""))
+ {
+ isMultiLine = true;
+ }
+ else
+ {
+ found = true;
+ }
+ continue;
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+ else
+ {
+ SEARCH: while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains("") || (simpleTerritory && currentLine.contains("")))
+ {
+ found = true;
+ }
+ continue;
+ }
+ for (SpawnTerritory territory : territories)
+ {
+ if (currentLine.contains('"' + territory.getName() + '"'))
+ {
+ isMultiLine = true;
+ continue SEARCH;
+ }
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+
writer.close();
reader.close();
spawnFile.delete();
diff --git a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/config/AdminCommands.xml b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/config/AdminCommands.xml
index 9b610a1b81..f15749aadb 100644
--- a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/config/AdminCommands.xml
+++ b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/config/AdminCommands.xml
@@ -95,6 +95,7 @@
+
diff --git a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
index cd80804c69..0a91636ead 100644
--- a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
+++ b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
@@ -16,7 +16,11 @@
*/
package handlers.admincommandhandlers;
+import java.util.Collections;
+import java.util.List;
+
import org.l2jmobius.gameserver.data.SpawnTable;
+import org.l2jmobius.gameserver.handler.AdminCommandHandler;
import org.l2jmobius.gameserver.handler.IAdminCommandHandler;
import org.l2jmobius.gameserver.instancemanager.DBSpawnManager;
import org.l2jmobius.gameserver.model.Spawn;
@@ -24,23 +28,32 @@ import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
import org.l2jmobius.gameserver.util.BuilderUtil;
import org.l2jmobius.gameserver.util.Util;
/**
- * This class handles following admin commands: - delete = deletes target
+ * @author Mobius
*/
public class AdminDelete implements IAdminCommandHandler
{
private static final String[] ADMIN_COMMANDS =
{
- "admin_delete"
+ "admin_delete", // supports range parameter
+ "admin_delete_group" // for territory spawns
};
@Override
public boolean useAdminCommand(String command, Player activeChar)
{
- if (command.startsWith("admin_delete"))
+ if (command.contains("group"))
+ {
+ handleDeleteGroup(activeChar);
+ }
+ else if (command.startsWith("admin_delete"))
{
final String[] split = command.split(" ");
handleDelete(activeChar, (split.length > 1) && Util.isDigit(split[1]) ? Integer.parseInt(split[1]) : 0);
@@ -48,48 +61,125 @@ public class AdminDelete implements IAdminCommandHandler
return true;
}
- private void handleDelete(Player activeChar, int range)
+ private void handleDelete(Player player, int range)
{
if (range > 0)
{
- World.getInstance().forEachVisibleObjectInRange(activeChar, Npc.class, range, target ->
- {
- deleteNpc(activeChar, target);
- });
+ World.getInstance().forEachVisibleObjectInRange(player, Npc.class, range, target -> deleteNpc(player, target));
return;
}
- final WorldObject obj = activeChar.getTarget();
+ final WorldObject obj = player.getTarget();
if (obj instanceof Npc)
{
- deleteNpc(activeChar, (Npc) obj);
+ deleteNpc(player, (Npc) obj);
}
else
{
- BuilderUtil.sendSysMessage(activeChar, "Incorrect target.");
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
}
}
- private void deleteNpc(Player activeChar, Npc target)
+ private void handleDeleteGroup(Player player)
+ {
+ final WorldObject obj = player.getTarget();
+ if (obj instanceof Npc)
+ {
+ deleteGroup(player, (Npc) obj);
+ }
+ else
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ }
+
+ private void deleteNpc(Player player, Npc target)
{
- target.deleteMe();
-
final Spawn spawn = target.getSpawn();
if (spawn != null)
{
- spawn.stopRespawn();
-
- if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ if (territories.isEmpty())
{
- DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ }
+ }
+ if (territories.isEmpty())
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
else
{
- SpawnTable.getInstance().deleteSpawn(spawn, true);
+ AdminCommandHandler.getInstance().useAdminCommand(player, AdminDelete.ADMIN_COMMANDS[1], true);
+ }
+ }
+ }
+
+ private void deleteGroup(Player player, Npc target)
+ {
+ final Spawn spawn = target.getSpawn();
+ if (spawn != null)
+ {
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
+ {
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
+ }
+ }
+ if (territories.isEmpty())
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ else
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+
+ if (group != null)
+ {
+ for (NpcSpawnTemplate template : group.getSpawns())
+ {
+ template.despawn();
+ }
+ }
+ else if (simpleTerritory && (npcSpawnTemplate != null))
+ {
+ npcSpawnTemplate.despawn();
+ }
+
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " group from " + target.getObjectId() + ".");
}
}
-
- BuilderUtil.sendSysMessage(activeChar, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
@Override
diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/data/SpawnTable.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/data/SpawnTable.java
index 986e4f1195..869f325b27 100644
--- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/data/SpawnTable.java
+++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/data/SpawnTable.java
@@ -22,6 +22,7 @@ import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -33,6 +34,9 @@ import org.l2jmobius.gameserver.data.xml.NpcData;
import org.l2jmobius.gameserver.model.Spawn;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
/**
* Spawn data retriever.
@@ -202,50 +206,104 @@ public class SpawnTable
{
final BufferedReader reader = new BufferedReader(new FileReader(spawnFile));
final BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
- final String spawnId = String.valueOf(spawn.getId());
- final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
- final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
- final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
boolean found = false; // in XML you can have more than one spawn with same coords
boolean isMultiLine = false; // in case spawn has more stats
boolean lastLineFound = false; // used to check for empty file
int lineCount = 0;
String currentLine;
- while ((currentLine = reader.readLine()) != null)
+
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
{
- if (!found)
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
{
- if (isMultiLine)
- {
- if (currentLine.contains(""))
- {
- found = true;
- }
- continue;
- }
- if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
- {
- if (!currentLine.contains("/>") && !currentLine.contains(""))
- {
- isMultiLine = true;
- }
- else
- {
- found = true;
- }
- continue;
- }
- }
- writer.write(currentLine + Config.EOL);
- if (currentLine.contains(""))
- {
- lastLineFound = true;
- }
- if (!lastLineFound)
- {
- lineCount++;
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
}
}
+
+ if (territories.isEmpty())
+ {
+ final String spawnId = String.valueOf(spawn.getId());
+ final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
+ final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
+ final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
+ while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains(""))
+ {
+ found = true;
+ }
+ continue;
+ }
+ if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
+ {
+ if (!currentLine.contains("/>") && !currentLine.contains(""))
+ {
+ isMultiLine = true;
+ }
+ else
+ {
+ found = true;
+ }
+ continue;
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+ else
+ {
+ SEARCH: while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains("") || (simpleTerritory && currentLine.contains("")))
+ {
+ found = true;
+ }
+ continue;
+ }
+ for (SpawnTerritory territory : territories)
+ {
+ if (currentLine.contains('"' + territory.getName() + '"'))
+ {
+ isMultiLine = true;
+ continue SEARCH;
+ }
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+
writer.close();
reader.close();
spawnFile.delete();
diff --git a/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/config/AdminCommands.xml b/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/config/AdminCommands.xml
index 9b610a1b81..f15749aadb 100644
--- a/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/config/AdminCommands.xml
+++ b/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/config/AdminCommands.xml
@@ -95,6 +95,7 @@
+
diff --git a/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java b/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
index cd80804c69..0a91636ead 100644
--- a/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
+++ b/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
@@ -16,7 +16,11 @@
*/
package handlers.admincommandhandlers;
+import java.util.Collections;
+import java.util.List;
+
import org.l2jmobius.gameserver.data.SpawnTable;
+import org.l2jmobius.gameserver.handler.AdminCommandHandler;
import org.l2jmobius.gameserver.handler.IAdminCommandHandler;
import org.l2jmobius.gameserver.instancemanager.DBSpawnManager;
import org.l2jmobius.gameserver.model.Spawn;
@@ -24,23 +28,32 @@ import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
import org.l2jmobius.gameserver.util.BuilderUtil;
import org.l2jmobius.gameserver.util.Util;
/**
- * This class handles following admin commands: - delete = deletes target
+ * @author Mobius
*/
public class AdminDelete implements IAdminCommandHandler
{
private static final String[] ADMIN_COMMANDS =
{
- "admin_delete"
+ "admin_delete", // supports range parameter
+ "admin_delete_group" // for territory spawns
};
@Override
public boolean useAdminCommand(String command, Player activeChar)
{
- if (command.startsWith("admin_delete"))
+ if (command.contains("group"))
+ {
+ handleDeleteGroup(activeChar);
+ }
+ else if (command.startsWith("admin_delete"))
{
final String[] split = command.split(" ");
handleDelete(activeChar, (split.length > 1) && Util.isDigit(split[1]) ? Integer.parseInt(split[1]) : 0);
@@ -48,48 +61,125 @@ public class AdminDelete implements IAdminCommandHandler
return true;
}
- private void handleDelete(Player activeChar, int range)
+ private void handleDelete(Player player, int range)
{
if (range > 0)
{
- World.getInstance().forEachVisibleObjectInRange(activeChar, Npc.class, range, target ->
- {
- deleteNpc(activeChar, target);
- });
+ World.getInstance().forEachVisibleObjectInRange(player, Npc.class, range, target -> deleteNpc(player, target));
return;
}
- final WorldObject obj = activeChar.getTarget();
+ final WorldObject obj = player.getTarget();
if (obj instanceof Npc)
{
- deleteNpc(activeChar, (Npc) obj);
+ deleteNpc(player, (Npc) obj);
}
else
{
- BuilderUtil.sendSysMessage(activeChar, "Incorrect target.");
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
}
}
- private void deleteNpc(Player activeChar, Npc target)
+ private void handleDeleteGroup(Player player)
+ {
+ final WorldObject obj = player.getTarget();
+ if (obj instanceof Npc)
+ {
+ deleteGroup(player, (Npc) obj);
+ }
+ else
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ }
+
+ private void deleteNpc(Player player, Npc target)
{
- target.deleteMe();
-
final Spawn spawn = target.getSpawn();
if (spawn != null)
{
- spawn.stopRespawn();
-
- if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ if (territories.isEmpty())
{
- DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ }
+ }
+ if (territories.isEmpty())
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
else
{
- SpawnTable.getInstance().deleteSpawn(spawn, true);
+ AdminCommandHandler.getInstance().useAdminCommand(player, AdminDelete.ADMIN_COMMANDS[1], true);
+ }
+ }
+ }
+
+ private void deleteGroup(Player player, Npc target)
+ {
+ final Spawn spawn = target.getSpawn();
+ if (spawn != null)
+ {
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
+ {
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
+ }
+ }
+ if (territories.isEmpty())
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ else
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+
+ if (group != null)
+ {
+ for (NpcSpawnTemplate template : group.getSpawns())
+ {
+ template.despawn();
+ }
+ }
+ else if (simpleTerritory && (npcSpawnTemplate != null))
+ {
+ npcSpawnTemplate.despawn();
+ }
+
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " group from " + target.getObjectId() + ".");
}
}
-
- BuilderUtil.sendSysMessage(activeChar, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
@Override
diff --git a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/data/SpawnTable.java b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/data/SpawnTable.java
index 986e4f1195..869f325b27 100644
--- a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/data/SpawnTable.java
+++ b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/data/SpawnTable.java
@@ -22,6 +22,7 @@ import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -33,6 +34,9 @@ import org.l2jmobius.gameserver.data.xml.NpcData;
import org.l2jmobius.gameserver.model.Spawn;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
/**
* Spawn data retriever.
@@ -202,50 +206,104 @@ public class SpawnTable
{
final BufferedReader reader = new BufferedReader(new FileReader(spawnFile));
final BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
- final String spawnId = String.valueOf(spawn.getId());
- final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
- final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
- final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
boolean found = false; // in XML you can have more than one spawn with same coords
boolean isMultiLine = false; // in case spawn has more stats
boolean lastLineFound = false; // used to check for empty file
int lineCount = 0;
String currentLine;
- while ((currentLine = reader.readLine()) != null)
+
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
{
- if (!found)
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
{
- if (isMultiLine)
- {
- if (currentLine.contains(""))
- {
- found = true;
- }
- continue;
- }
- if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
- {
- if (!currentLine.contains("/>") && !currentLine.contains(""))
- {
- isMultiLine = true;
- }
- else
- {
- found = true;
- }
- continue;
- }
- }
- writer.write(currentLine + Config.EOL);
- if (currentLine.contains(""))
- {
- lastLineFound = true;
- }
- if (!lastLineFound)
- {
- lineCount++;
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
}
}
+
+ if (territories.isEmpty())
+ {
+ final String spawnId = String.valueOf(spawn.getId());
+ final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
+ final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
+ final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
+ while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains(""))
+ {
+ found = true;
+ }
+ continue;
+ }
+ if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
+ {
+ if (!currentLine.contains("/>") && !currentLine.contains(""))
+ {
+ isMultiLine = true;
+ }
+ else
+ {
+ found = true;
+ }
+ continue;
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+ else
+ {
+ SEARCH: while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains("") || (simpleTerritory && currentLine.contains("")))
+ {
+ found = true;
+ }
+ continue;
+ }
+ for (SpawnTerritory territory : territories)
+ {
+ if (currentLine.contains('"' + territory.getName() + '"'))
+ {
+ isMultiLine = true;
+ continue SEARCH;
+ }
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+
writer.close();
reader.close();
spawnFile.delete();
diff --git a/L2J_Mobius_Essence_6.2_Vanguard/dist/game/config/AdminCommands.xml b/L2J_Mobius_Essence_6.2_Vanguard/dist/game/config/AdminCommands.xml
index 9b610a1b81..f15749aadb 100644
--- a/L2J_Mobius_Essence_6.2_Vanguard/dist/game/config/AdminCommands.xml
+++ b/L2J_Mobius_Essence_6.2_Vanguard/dist/game/config/AdminCommands.xml
@@ -95,6 +95,7 @@
+
diff --git a/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java b/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
index cd80804c69..0a91636ead 100644
--- a/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
+++ b/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/scripts/handlers/admincommandhandlers/AdminDelete.java
@@ -16,7 +16,11 @@
*/
package handlers.admincommandhandlers;
+import java.util.Collections;
+import java.util.List;
+
import org.l2jmobius.gameserver.data.SpawnTable;
+import org.l2jmobius.gameserver.handler.AdminCommandHandler;
import org.l2jmobius.gameserver.handler.IAdminCommandHandler;
import org.l2jmobius.gameserver.instancemanager.DBSpawnManager;
import org.l2jmobius.gameserver.model.Spawn;
@@ -24,23 +28,32 @@ import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
import org.l2jmobius.gameserver.util.BuilderUtil;
import org.l2jmobius.gameserver.util.Util;
/**
- * This class handles following admin commands: - delete = deletes target
+ * @author Mobius
*/
public class AdminDelete implements IAdminCommandHandler
{
private static final String[] ADMIN_COMMANDS =
{
- "admin_delete"
+ "admin_delete", // supports range parameter
+ "admin_delete_group" // for territory spawns
};
@Override
public boolean useAdminCommand(String command, Player activeChar)
{
- if (command.startsWith("admin_delete"))
+ if (command.contains("group"))
+ {
+ handleDeleteGroup(activeChar);
+ }
+ else if (command.startsWith("admin_delete"))
{
final String[] split = command.split(" ");
handleDelete(activeChar, (split.length > 1) && Util.isDigit(split[1]) ? Integer.parseInt(split[1]) : 0);
@@ -48,48 +61,125 @@ public class AdminDelete implements IAdminCommandHandler
return true;
}
- private void handleDelete(Player activeChar, int range)
+ private void handleDelete(Player player, int range)
{
if (range > 0)
{
- World.getInstance().forEachVisibleObjectInRange(activeChar, Npc.class, range, target ->
- {
- deleteNpc(activeChar, target);
- });
+ World.getInstance().forEachVisibleObjectInRange(player, Npc.class, range, target -> deleteNpc(player, target));
return;
}
- final WorldObject obj = activeChar.getTarget();
+ final WorldObject obj = player.getTarget();
if (obj instanceof Npc)
{
- deleteNpc(activeChar, (Npc) obj);
+ deleteNpc(player, (Npc) obj);
}
else
{
- BuilderUtil.sendSysMessage(activeChar, "Incorrect target.");
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
}
}
- private void deleteNpc(Player activeChar, Npc target)
+ private void handleDeleteGroup(Player player)
+ {
+ final WorldObject obj = player.getTarget();
+ if (obj instanceof Npc)
+ {
+ deleteGroup(player, (Npc) obj);
+ }
+ else
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ }
+
+ private void deleteNpc(Player player, Npc target)
{
- target.deleteMe();
-
final Spawn spawn = target.getSpawn();
if (spawn != null)
{
- spawn.stopRespawn();
-
- if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ if (territories.isEmpty())
{
- DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ }
+ }
+ if (territories.isEmpty())
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
else
{
- SpawnTable.getInstance().deleteSpawn(spawn, true);
+ AdminCommandHandler.getInstance().useAdminCommand(player, AdminDelete.ADMIN_COMMANDS[1], true);
+ }
+ }
+ }
+
+ private void deleteGroup(Player player, Npc target)
+ {
+ final Spawn spawn = target.getSpawn();
+ if (spawn != null)
+ {
+ final NpcSpawnTemplate npcSpawnTemplate = spawn.getNpcSpawnTemplate();
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
+ {
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
+ {
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
+ }
+ }
+ if (territories.isEmpty())
+ {
+ BuilderUtil.sendSysMessage(player, "Incorrect target.");
+ }
+ else
+ {
+ target.deleteMe();
+ spawn.stopRespawn();
+ if (DBSpawnManager.getInstance().isDefined(spawn.getId()))
+ {
+ DBSpawnManager.getInstance().deleteSpawn(spawn, true);
+ }
+ else
+ {
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+
+ if (group != null)
+ {
+ for (NpcSpawnTemplate template : group.getSpawns())
+ {
+ template.despawn();
+ }
+ }
+ else if (simpleTerritory && (npcSpawnTemplate != null))
+ {
+ npcSpawnTemplate.despawn();
+ }
+
+ BuilderUtil.sendSysMessage(player, "Deleted " + target.getName() + " group from " + target.getObjectId() + ".");
}
}
-
- BuilderUtil.sendSysMessage(activeChar, "Deleted " + target.getName() + " from " + target.getObjectId() + ".");
}
@Override
diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/data/SpawnTable.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/data/SpawnTable.java
index 986e4f1195..869f325b27 100644
--- a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/data/SpawnTable.java
+++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/data/SpawnTable.java
@@ -22,6 +22,7 @@ import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -33,6 +34,9 @@ import org.l2jmobius.gameserver.data.xml.NpcData;
import org.l2jmobius.gameserver.model.Spawn;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
+import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
+import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
+import org.l2jmobius.gameserver.model.zone.type.SpawnTerritory;
/**
* Spawn data retriever.
@@ -202,50 +206,104 @@ public class SpawnTable
{
final BufferedReader reader = new BufferedReader(new FileReader(spawnFile));
final BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
- final String spawnId = String.valueOf(spawn.getId());
- final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
- final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
- final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
boolean found = false; // in XML you can have more than one spawn with same coords
boolean isMultiLine = false; // in case spawn has more stats
boolean lastLineFound = false; // used to check for empty file
int lineCount = 0;
String currentLine;
- while ((currentLine = reader.readLine()) != null)
+
+ final SpawnGroup group = npcSpawnTemplate != null ? npcSpawnTemplate.getGroup() : null;
+ List territories = group != null ? group.getTerritories() : Collections.emptyList();
+ boolean simpleTerritory = false;
+ if (territories.isEmpty())
{
- if (!found)
+ final SpawnTemplate spawnTemplate = npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnTemplate() : null;
+ if (spawnTemplate != null)
{
- if (isMultiLine)
- {
- if (currentLine.contains(""))
- {
- found = true;
- }
- continue;
- }
- if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
- {
- if (!currentLine.contains("/>") && !currentLine.contains(""))
- {
- isMultiLine = true;
- }
- else
- {
- found = true;
- }
- continue;
- }
- }
- writer.write(currentLine + Config.EOL);
- if (currentLine.contains(""))
- {
- lastLineFound = true;
- }
- if (!lastLineFound)
- {
- lineCount++;
+ territories = spawnTemplate.getTerritories();
+ simpleTerritory = true;
}
}
+
+ if (territories.isEmpty())
+ {
+ final String spawnId = String.valueOf(spawn.getId());
+ final String spawnX = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getX() : spawn.getX());
+ final String spawnY = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getY() : spawn.getY());
+ final String spawnZ = String.valueOf(npcSpawnTemplate != null ? npcSpawnTemplate.getSpawnLocation().getZ() : spawn.getZ());
+
+ while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains(""))
+ {
+ found = true;
+ }
+ continue;
+ }
+ if (currentLine.contains(spawnId) && currentLine.contains(spawnX) && currentLine.contains(spawnY) && currentLine.contains(spawnZ))
+ {
+ if (!currentLine.contains("/>") && !currentLine.contains(""))
+ {
+ isMultiLine = true;
+ }
+ else
+ {
+ found = true;
+ }
+ continue;
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+ else
+ {
+ SEARCH: while ((currentLine = reader.readLine()) != null)
+ {
+ if (!found)
+ {
+ if (isMultiLine)
+ {
+ if (currentLine.contains("") || (simpleTerritory && currentLine.contains("")))
+ {
+ found = true;
+ }
+ continue;
+ }
+ for (SpawnTerritory territory : territories)
+ {
+ if (currentLine.contains('"' + territory.getName() + '"'))
+ {
+ isMultiLine = true;
+ continue SEARCH;
+ }
+ }
+ }
+ writer.write(currentLine + Config.EOL);
+ if (currentLine.contains(""))
+ {
+ lastLineFound = true;
+ }
+ if (!lastLineFound)
+ {
+ lineCount++;
+ }
+ }
+ }
+
writer.close();
reader.close();
spawnFile.delete();