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();