diff --git a/L2J_Mobius_1.0_Ertheia/dist/game/config/Scripts.xml b/L2J_Mobius_1.0_Ertheia/dist/game/config/Scripts.xml new file mode 100644 index 0000000000..d6db8c84db --- /dev/null +++ b/L2J_Mobius_1.0_Ertheia/dist/game/config/Scripts.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/L2J_Mobius_1.0_Ertheia/dist/game/data/xsd/Scripts.xsd b/L2J_Mobius_1.0_Ertheia/dist/game/data/xsd/Scripts.xsd new file mode 100644 index 0000000000..a21ad51f62 --- /dev/null +++ b/L2J_Mobius_1.0_Ertheia/dist/game/data/xsd/Scripts.xsd @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/scripting/ScriptEngineManager.java b/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/scripting/ScriptEngineManager.java index 9b1ae28a9e..19a92adbf9 100644 --- a/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/scripting/ScriptEngineManager.java +++ b/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/scripting/ScriptEngineManager.java @@ -18,10 +18,16 @@ package com.l2jmobius.gameserver.scripting; import java.io.File; import java.io.FileInputStream; +import java.io.IOException; +import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; @@ -33,14 +39,17 @@ import java.util.ServiceLoader; import java.util.logging.Level; import java.util.logging.Logger; +import org.w3c.dom.Document; + import com.l2jmobius.Config; +import com.l2jmobius.commons.util.IGameXmlReader; import com.l2jmobius.gameserver.scripting.java.JavaScriptingEngine; /** * Caches script engines and provides functionality for executing and managing scripts. * @author KenM, HorridoJoho */ -public final class ScriptEngineManager +public final class ScriptEngineManager implements IGameXmlReader { private static final Logger LOGGER = Logger.getLogger(ScriptEngineManager.class.getName()); public static final Path SCRIPT_FOLDER = Paths.get(Config.DATAPACK_ROOT.getAbsolutePath(), "data", "scripts"); @@ -48,10 +57,10 @@ public final class ScriptEngineManager public static final Path EFFECT_MASTER_HANDLER_FILE = Paths.get(SCRIPT_FOLDER.toString(), "handlers", "EffectMasterHandler.java"); public static final Path SKILL_CONDITION_HANDLER_FILE = Paths.get(ScriptEngineManager.SCRIPT_FOLDER.toString(), "handlers", "SkillConditionMasterHandler.java"); public static final Path CONDITION_HANDLER_FILE = Paths.get(ScriptEngineManager.SCRIPT_FOLDER.toString(), "handlers", "ConditionMasterHandler.java"); - public static final Path ONE_DAY_REWARD_MASTER_HANDLER = Paths.get(SCRIPT_FOLDER.toString(), "handlers", "DailyMissionMasterHandler.java"); private final Map _extEngines = new HashMap<>(); private IExecutionContext _currentExecutionContext = null; + static final List _exclusions = new ArrayList<>(); protected ScriptEngineManager() { @@ -62,6 +71,79 @@ public final class ScriptEngineManager // Load external script engines ServiceLoader.load(IScriptingEngine.class).forEach(engine -> registerEngine(engine, props)); + + // Load Scripts.xml + load(); + } + + @Override + public void load() + { + _exclusions.clear(); + parseDatapackFile("config/Scripts.xml"); + LOGGER.info("Loaded " + _exclusions.size() + " files to exclude."); + } + + @Override + public void parseDocument(Document doc, File f) + { + try + { + final Map> excludePaths = new HashMap<>(); + forEach(doc, "list", listNode -> forEach(listNode, "exclude", excludeNode -> + { + final String excludeFile = parseString(excludeNode.getAttributes(), "file"); + excludePaths.putIfAbsent(excludeFile, new ArrayList<>()); + + forEach(excludeNode, "include", includeNode -> excludePaths.get(excludeFile).add(parseString(includeNode.getAttributes(), "file"))); + })); + + final int nameCount = SCRIPT_FOLDER.getNameCount(); + Files.walkFileTree(SCRIPT_FOLDER, new SimpleFileVisitor() + { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException + { + final String fileName = file.getFileName().toString(); + if (fileName.endsWith(".java")) + { + final Iterator relativePath = file.subpath(nameCount, file.getNameCount()).iterator(); + while (relativePath.hasNext()) + { + final String nextPart = relativePath.next().toString(); + if (excludePaths.containsKey(nextPart)) + { + boolean excludeScript = true; + + final List includePath = excludePaths.get(nextPart); + if (includePath != null) + { + while (relativePath.hasNext()) + { + if (includePath.contains(relativePath.next().toString())) + { + excludeScript = false; + break; + } + } + } + if (excludeScript) + { + _exclusions.add(fileName); + break; + } + } + } + } + + return super.visitFile(file, attrs); + } + }); + } + catch (final IOException e) + { + LOGGER.log(Level.WARNING, "Couldn't load script exclusions.", e); + } } private Properties loadProperties() @@ -172,11 +254,6 @@ public final class ScriptEngineManager executeScript(CONDITION_HANDLER_FILE); } - public void executeDailyMissionMasterHandler() throws Exception - { - executeScript(ONE_DAY_REWARD_MASTER_HANDLER); - } - public void executeScriptList() throws Exception { if (Config.ALT_DEV_NO_QUESTS) @@ -222,17 +299,9 @@ public final class ScriptEngineManager private void processFile(File file, Map> files) { - switch (file.getName()) + if (_exclusions.contains(file.getName())) { - case "package-info.java": - case "MasterHandler.java": - case "EffectMasterHandler.java": - case "SkillConditionMasterHandler.java": - case "ConditionMasterHandler.java": - case "DailyMissionMasterHandler.java": - { - return; - } + return; } Path sourceFile = file.toPath(); diff --git a/L2J_Mobius_2.5_Underground/dist/game/config/Scripts.xml b/L2J_Mobius_2.5_Underground/dist/game/config/Scripts.xml new file mode 100644 index 0000000000..284aa0a31f --- /dev/null +++ b/L2J_Mobius_2.5_Underground/dist/game/config/Scripts.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/L2J_Mobius_2.5_Underground/dist/game/data/xsd/Scripts.xsd b/L2J_Mobius_2.5_Underground/dist/game/data/xsd/Scripts.xsd new file mode 100644 index 0000000000..a21ad51f62 --- /dev/null +++ b/L2J_Mobius_2.5_Underground/dist/game/data/xsd/Scripts.xsd @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/scripting/ScriptEngineManager.java b/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/scripting/ScriptEngineManager.java index 9b1ae28a9e..c7dea9a7b8 100644 --- a/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/scripting/ScriptEngineManager.java +++ b/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/scripting/ScriptEngineManager.java @@ -18,10 +18,16 @@ package com.l2jmobius.gameserver.scripting; import java.io.File; import java.io.FileInputStream; +import java.io.IOException; +import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; @@ -33,14 +39,17 @@ import java.util.ServiceLoader; import java.util.logging.Level; import java.util.logging.Logger; +import org.w3c.dom.Document; + import com.l2jmobius.Config; +import com.l2jmobius.commons.util.IGameXmlReader; import com.l2jmobius.gameserver.scripting.java.JavaScriptingEngine; /** * Caches script engines and provides functionality for executing and managing scripts. * @author KenM, HorridoJoho */ -public final class ScriptEngineManager +public final class ScriptEngineManager implements IGameXmlReader { private static final Logger LOGGER = Logger.getLogger(ScriptEngineManager.class.getName()); public static final Path SCRIPT_FOLDER = Paths.get(Config.DATAPACK_ROOT.getAbsolutePath(), "data", "scripts"); @@ -52,6 +61,7 @@ public final class ScriptEngineManager private final Map _extEngines = new HashMap<>(); private IExecutionContext _currentExecutionContext = null; + static final List _exclusions = new ArrayList<>(); protected ScriptEngineManager() { @@ -62,6 +72,79 @@ public final class ScriptEngineManager // Load external script engines ServiceLoader.load(IScriptingEngine.class).forEach(engine -> registerEngine(engine, props)); + + // Load Scripts.xml + load(); + } + + @Override + public void load() + { + _exclusions.clear(); + parseDatapackFile("config/Scripts.xml"); + LOGGER.info("Loaded " + _exclusions.size() + " files to exclude."); + } + + @Override + public void parseDocument(Document doc, File f) + { + try + { + final Map> excludePaths = new HashMap<>(); + forEach(doc, "list", listNode -> forEach(listNode, "exclude", excludeNode -> + { + final String excludeFile = parseString(excludeNode.getAttributes(), "file"); + excludePaths.putIfAbsent(excludeFile, new ArrayList<>()); + + forEach(excludeNode, "include", includeNode -> excludePaths.get(excludeFile).add(parseString(includeNode.getAttributes(), "file"))); + })); + + final int nameCount = SCRIPT_FOLDER.getNameCount(); + Files.walkFileTree(SCRIPT_FOLDER, new SimpleFileVisitor() + { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException + { + final String fileName = file.getFileName().toString(); + if (fileName.endsWith(".java")) + { + final Iterator relativePath = file.subpath(nameCount, file.getNameCount()).iterator(); + while (relativePath.hasNext()) + { + final String nextPart = relativePath.next().toString(); + if (excludePaths.containsKey(nextPart)) + { + boolean excludeScript = true; + + final List includePath = excludePaths.get(nextPart); + if (includePath != null) + { + while (relativePath.hasNext()) + { + if (includePath.contains(relativePath.next().toString())) + { + excludeScript = false; + break; + } + } + } + if (excludeScript) + { + _exclusions.add(fileName); + break; + } + } + } + } + + return super.visitFile(file, attrs); + } + }); + } + catch (final IOException e) + { + LOGGER.log(Level.WARNING, "Couldn't load script exclusions.", e); + } } private Properties loadProperties() @@ -222,17 +305,9 @@ public final class ScriptEngineManager private void processFile(File file, Map> files) { - switch (file.getName()) + if (_exclusions.contains(file.getName())) { - case "package-info.java": - case "MasterHandler.java": - case "EffectMasterHandler.java": - case "SkillConditionMasterHandler.java": - case "ConditionMasterHandler.java": - case "DailyMissionMasterHandler.java": - { - return; - } + return; } Path sourceFile = file.toPath(); diff --git a/L2J_Mobius_3.0_Helios/dist/game/config/Scripts.xml b/L2J_Mobius_3.0_Helios/dist/game/config/Scripts.xml new file mode 100644 index 0000000000..284aa0a31f --- /dev/null +++ b/L2J_Mobius_3.0_Helios/dist/game/config/Scripts.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/xsd/Scripts.xsd b/L2J_Mobius_3.0_Helios/dist/game/data/xsd/Scripts.xsd new file mode 100644 index 0000000000..a21ad51f62 --- /dev/null +++ b/L2J_Mobius_3.0_Helios/dist/game/data/xsd/Scripts.xsd @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/scripting/ScriptEngineManager.java b/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/scripting/ScriptEngineManager.java index 9b1ae28a9e..c7dea9a7b8 100644 --- a/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/scripting/ScriptEngineManager.java +++ b/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/scripting/ScriptEngineManager.java @@ -18,10 +18,16 @@ package com.l2jmobius.gameserver.scripting; import java.io.File; import java.io.FileInputStream; +import java.io.IOException; +import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; @@ -33,14 +39,17 @@ import java.util.ServiceLoader; import java.util.logging.Level; import java.util.logging.Logger; +import org.w3c.dom.Document; + import com.l2jmobius.Config; +import com.l2jmobius.commons.util.IGameXmlReader; import com.l2jmobius.gameserver.scripting.java.JavaScriptingEngine; /** * Caches script engines and provides functionality for executing and managing scripts. * @author KenM, HorridoJoho */ -public final class ScriptEngineManager +public final class ScriptEngineManager implements IGameXmlReader { private static final Logger LOGGER = Logger.getLogger(ScriptEngineManager.class.getName()); public static final Path SCRIPT_FOLDER = Paths.get(Config.DATAPACK_ROOT.getAbsolutePath(), "data", "scripts"); @@ -52,6 +61,7 @@ public final class ScriptEngineManager private final Map _extEngines = new HashMap<>(); private IExecutionContext _currentExecutionContext = null; + static final List _exclusions = new ArrayList<>(); protected ScriptEngineManager() { @@ -62,6 +72,79 @@ public final class ScriptEngineManager // Load external script engines ServiceLoader.load(IScriptingEngine.class).forEach(engine -> registerEngine(engine, props)); + + // Load Scripts.xml + load(); + } + + @Override + public void load() + { + _exclusions.clear(); + parseDatapackFile("config/Scripts.xml"); + LOGGER.info("Loaded " + _exclusions.size() + " files to exclude."); + } + + @Override + public void parseDocument(Document doc, File f) + { + try + { + final Map> excludePaths = new HashMap<>(); + forEach(doc, "list", listNode -> forEach(listNode, "exclude", excludeNode -> + { + final String excludeFile = parseString(excludeNode.getAttributes(), "file"); + excludePaths.putIfAbsent(excludeFile, new ArrayList<>()); + + forEach(excludeNode, "include", includeNode -> excludePaths.get(excludeFile).add(parseString(includeNode.getAttributes(), "file"))); + })); + + final int nameCount = SCRIPT_FOLDER.getNameCount(); + Files.walkFileTree(SCRIPT_FOLDER, new SimpleFileVisitor() + { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException + { + final String fileName = file.getFileName().toString(); + if (fileName.endsWith(".java")) + { + final Iterator relativePath = file.subpath(nameCount, file.getNameCount()).iterator(); + while (relativePath.hasNext()) + { + final String nextPart = relativePath.next().toString(); + if (excludePaths.containsKey(nextPart)) + { + boolean excludeScript = true; + + final List includePath = excludePaths.get(nextPart); + if (includePath != null) + { + while (relativePath.hasNext()) + { + if (includePath.contains(relativePath.next().toString())) + { + excludeScript = false; + break; + } + } + } + if (excludeScript) + { + _exclusions.add(fileName); + break; + } + } + } + } + + return super.visitFile(file, attrs); + } + }); + } + catch (final IOException e) + { + LOGGER.log(Level.WARNING, "Couldn't load script exclusions.", e); + } } private Properties loadProperties() @@ -222,17 +305,9 @@ public final class ScriptEngineManager private void processFile(File file, Map> files) { - switch (file.getName()) + if (_exclusions.contains(file.getName())) { - case "package-info.java": - case "MasterHandler.java": - case "EffectMasterHandler.java": - case "SkillConditionMasterHandler.java": - case "ConditionMasterHandler.java": - case "DailyMissionMasterHandler.java": - { - return; - } + return; } Path sourceFile = file.toPath(); diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/config/Scripts.xml b/L2J_Mobius_4.0_GrandCrusade/dist/game/config/Scripts.xml new file mode 100644 index 0000000000..284aa0a31f --- /dev/null +++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/config/Scripts.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/xsd/Scripts.xsd b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/xsd/Scripts.xsd new file mode 100644 index 0000000000..a21ad51f62 --- /dev/null +++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/xsd/Scripts.xsd @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/scripting/ScriptEngineManager.java b/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/scripting/ScriptEngineManager.java index 9b1ae28a9e..c7dea9a7b8 100644 --- a/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/scripting/ScriptEngineManager.java +++ b/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/scripting/ScriptEngineManager.java @@ -18,10 +18,16 @@ package com.l2jmobius.gameserver.scripting; import java.io.File; import java.io.FileInputStream; +import java.io.IOException; +import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; @@ -33,14 +39,17 @@ import java.util.ServiceLoader; import java.util.logging.Level; import java.util.logging.Logger; +import org.w3c.dom.Document; + import com.l2jmobius.Config; +import com.l2jmobius.commons.util.IGameXmlReader; import com.l2jmobius.gameserver.scripting.java.JavaScriptingEngine; /** * Caches script engines and provides functionality for executing and managing scripts. * @author KenM, HorridoJoho */ -public final class ScriptEngineManager +public final class ScriptEngineManager implements IGameXmlReader { private static final Logger LOGGER = Logger.getLogger(ScriptEngineManager.class.getName()); public static final Path SCRIPT_FOLDER = Paths.get(Config.DATAPACK_ROOT.getAbsolutePath(), "data", "scripts"); @@ -52,6 +61,7 @@ public final class ScriptEngineManager private final Map _extEngines = new HashMap<>(); private IExecutionContext _currentExecutionContext = null; + static final List _exclusions = new ArrayList<>(); protected ScriptEngineManager() { @@ -62,6 +72,79 @@ public final class ScriptEngineManager // Load external script engines ServiceLoader.load(IScriptingEngine.class).forEach(engine -> registerEngine(engine, props)); + + // Load Scripts.xml + load(); + } + + @Override + public void load() + { + _exclusions.clear(); + parseDatapackFile("config/Scripts.xml"); + LOGGER.info("Loaded " + _exclusions.size() + " files to exclude."); + } + + @Override + public void parseDocument(Document doc, File f) + { + try + { + final Map> excludePaths = new HashMap<>(); + forEach(doc, "list", listNode -> forEach(listNode, "exclude", excludeNode -> + { + final String excludeFile = parseString(excludeNode.getAttributes(), "file"); + excludePaths.putIfAbsent(excludeFile, new ArrayList<>()); + + forEach(excludeNode, "include", includeNode -> excludePaths.get(excludeFile).add(parseString(includeNode.getAttributes(), "file"))); + })); + + final int nameCount = SCRIPT_FOLDER.getNameCount(); + Files.walkFileTree(SCRIPT_FOLDER, new SimpleFileVisitor() + { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException + { + final String fileName = file.getFileName().toString(); + if (fileName.endsWith(".java")) + { + final Iterator relativePath = file.subpath(nameCount, file.getNameCount()).iterator(); + while (relativePath.hasNext()) + { + final String nextPart = relativePath.next().toString(); + if (excludePaths.containsKey(nextPart)) + { + boolean excludeScript = true; + + final List includePath = excludePaths.get(nextPart); + if (includePath != null) + { + while (relativePath.hasNext()) + { + if (includePath.contains(relativePath.next().toString())) + { + excludeScript = false; + break; + } + } + } + if (excludeScript) + { + _exclusions.add(fileName); + break; + } + } + } + } + + return super.visitFile(file, attrs); + } + }); + } + catch (final IOException e) + { + LOGGER.log(Level.WARNING, "Couldn't load script exclusions.", e); + } } private Properties loadProperties() @@ -222,17 +305,9 @@ public final class ScriptEngineManager private void processFile(File file, Map> files) { - switch (file.getName()) + if (_exclusions.contains(file.getName())) { - case "package-info.java": - case "MasterHandler.java": - case "EffectMasterHandler.java": - case "SkillConditionMasterHandler.java": - case "ConditionMasterHandler.java": - case "DailyMissionMasterHandler.java": - { - return; - } + return; } Path sourceFile = file.toPath(); diff --git a/L2J_Mobius_CT_2.6_HighFive/dist/game/config/Scripts.xml b/L2J_Mobius_CT_2.6_HighFive/dist/game/config/Scripts.xml new file mode 100644 index 0000000000..0b06b04579 --- /dev/null +++ b/L2J_Mobius_CT_2.6_HighFive/dist/game/config/Scripts.xml @@ -0,0 +1,27 @@ + + + + + + + + + \ No newline at end of file diff --git a/L2J_Mobius_CT_2.6_HighFive/dist/game/data/xsd/Scripts.xsd b/L2J_Mobius_CT_2.6_HighFive/dist/game/data/xsd/Scripts.xsd new file mode 100644 index 0000000000..a21ad51f62 --- /dev/null +++ b/L2J_Mobius_CT_2.6_HighFive/dist/game/data/xsd/Scripts.xsd @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/L2J_Mobius_CT_2.6_HighFive/java/com/l2jmobius/gameserver/scripting/ScriptEngineManager.java b/L2J_Mobius_CT_2.6_HighFive/java/com/l2jmobius/gameserver/scripting/ScriptEngineManager.java index 9b1ae28a9e..8b20f9b45d 100644 --- a/L2J_Mobius_CT_2.6_HighFive/java/com/l2jmobius/gameserver/scripting/ScriptEngineManager.java +++ b/L2J_Mobius_CT_2.6_HighFive/java/com/l2jmobius/gameserver/scripting/ScriptEngineManager.java @@ -18,10 +18,16 @@ package com.l2jmobius.gameserver.scripting; import java.io.File; import java.io.FileInputStream; +import java.io.IOException; +import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; @@ -33,25 +39,26 @@ import java.util.ServiceLoader; import java.util.logging.Level; import java.util.logging.Logger; +import org.w3c.dom.Document; + import com.l2jmobius.Config; +import com.l2jmobius.commons.util.IGameXmlReader; import com.l2jmobius.gameserver.scripting.java.JavaScriptingEngine; /** * Caches script engines and provides functionality for executing and managing scripts. * @author KenM, HorridoJoho */ -public final class ScriptEngineManager +public final class ScriptEngineManager implements IGameXmlReader { private static final Logger LOGGER = Logger.getLogger(ScriptEngineManager.class.getName()); public static final Path SCRIPT_FOLDER = Paths.get(Config.DATAPACK_ROOT.getAbsolutePath(), "data", "scripts"); public static final Path MASTER_HANDLER_FILE = Paths.get(SCRIPT_FOLDER.toString(), "handlers", "MasterHandler.java"); public static final Path EFFECT_MASTER_HANDLER_FILE = Paths.get(SCRIPT_FOLDER.toString(), "handlers", "EffectMasterHandler.java"); - public static final Path SKILL_CONDITION_HANDLER_FILE = Paths.get(ScriptEngineManager.SCRIPT_FOLDER.toString(), "handlers", "SkillConditionMasterHandler.java"); - public static final Path CONDITION_HANDLER_FILE = Paths.get(ScriptEngineManager.SCRIPT_FOLDER.toString(), "handlers", "ConditionMasterHandler.java"); - public static final Path ONE_DAY_REWARD_MASTER_HANDLER = Paths.get(SCRIPT_FOLDER.toString(), "handlers", "DailyMissionMasterHandler.java"); private final Map _extEngines = new HashMap<>(); private IExecutionContext _currentExecutionContext = null; + static final List _exclusions = new ArrayList<>(); protected ScriptEngineManager() { @@ -62,6 +69,79 @@ public final class ScriptEngineManager // Load external script engines ServiceLoader.load(IScriptingEngine.class).forEach(engine -> registerEngine(engine, props)); + + // Load Scripts.xml + load(); + } + + @Override + public void load() + { + _exclusions.clear(); + parseDatapackFile("config/Scripts.xml"); + LOGGER.info("Loaded " + _exclusions.size() + " files to exclude."); + } + + @Override + public void parseDocument(Document doc, File f) + { + try + { + final Map> excludePaths = new HashMap<>(); + forEach(doc, "list", listNode -> forEach(listNode, "exclude", excludeNode -> + { + final String excludeFile = parseString(excludeNode.getAttributes(), "file"); + excludePaths.putIfAbsent(excludeFile, new ArrayList<>()); + + forEach(excludeNode, "include", includeNode -> excludePaths.get(excludeFile).add(parseString(includeNode.getAttributes(), "file"))); + })); + + final int nameCount = SCRIPT_FOLDER.getNameCount(); + Files.walkFileTree(SCRIPT_FOLDER, new SimpleFileVisitor() + { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException + { + final String fileName = file.getFileName().toString(); + if (fileName.endsWith(".java")) + { + final Iterator relativePath = file.subpath(nameCount, file.getNameCount()).iterator(); + while (relativePath.hasNext()) + { + final String nextPart = relativePath.next().toString(); + if (excludePaths.containsKey(nextPart)) + { + boolean excludeScript = true; + + final List includePath = excludePaths.get(nextPart); + if (includePath != null) + { + while (relativePath.hasNext()) + { + if (includePath.contains(relativePath.next().toString())) + { + excludeScript = false; + break; + } + } + } + if (excludeScript) + { + _exclusions.add(fileName); + break; + } + } + } + } + + return super.visitFile(file, attrs); + } + }); + } + catch (final IOException e) + { + LOGGER.log(Level.WARNING, "Couldn't load script exclusions.", e); + } } private Properties loadProperties() @@ -162,21 +242,6 @@ public final class ScriptEngineManager executeScript(EFFECT_MASTER_HANDLER_FILE); } - public void executeSkillConditionMasterHandler() throws Exception - { - executeScript(SKILL_CONDITION_HANDLER_FILE); - } - - public void executeConditionMasterHandler() throws Exception - { - executeScript(CONDITION_HANDLER_FILE); - } - - public void executeDailyMissionMasterHandler() throws Exception - { - executeScript(ONE_DAY_REWARD_MASTER_HANDLER); - } - public void executeScriptList() throws Exception { if (Config.ALT_DEV_NO_QUESTS) @@ -222,17 +287,9 @@ public final class ScriptEngineManager private void processFile(File file, Map> files) { - switch (file.getName()) + if (_exclusions.contains(file.getName())) { - case "package-info.java": - case "MasterHandler.java": - case "EffectMasterHandler.java": - case "SkillConditionMasterHandler.java": - case "ConditionMasterHandler.java": - case "DailyMissionMasterHandler.java": - { - return; - } + return; } Path sourceFile = file.toPath(); diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/config/Scripts.xml b/L2J_Mobius_Classic_2.0_Saviors/dist/game/config/Scripts.xml new file mode 100644 index 0000000000..284aa0a31f --- /dev/null +++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/config/Scripts.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/xsd/Scripts.xsd b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/xsd/Scripts.xsd new file mode 100644 index 0000000000..a21ad51f62 --- /dev/null +++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/xsd/Scripts.xsd @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/scripting/ScriptEngineManager.java b/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/scripting/ScriptEngineManager.java index 9b1ae28a9e..c7dea9a7b8 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/scripting/ScriptEngineManager.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/scripting/ScriptEngineManager.java @@ -18,10 +18,16 @@ package com.l2jmobius.gameserver.scripting; import java.io.File; import java.io.FileInputStream; +import java.io.IOException; +import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; @@ -33,14 +39,17 @@ import java.util.ServiceLoader; import java.util.logging.Level; import java.util.logging.Logger; +import org.w3c.dom.Document; + import com.l2jmobius.Config; +import com.l2jmobius.commons.util.IGameXmlReader; import com.l2jmobius.gameserver.scripting.java.JavaScriptingEngine; /** * Caches script engines and provides functionality for executing and managing scripts. * @author KenM, HorridoJoho */ -public final class ScriptEngineManager +public final class ScriptEngineManager implements IGameXmlReader { private static final Logger LOGGER = Logger.getLogger(ScriptEngineManager.class.getName()); public static final Path SCRIPT_FOLDER = Paths.get(Config.DATAPACK_ROOT.getAbsolutePath(), "data", "scripts"); @@ -52,6 +61,7 @@ public final class ScriptEngineManager private final Map _extEngines = new HashMap<>(); private IExecutionContext _currentExecutionContext = null; + static final List _exclusions = new ArrayList<>(); protected ScriptEngineManager() { @@ -62,6 +72,79 @@ public final class ScriptEngineManager // Load external script engines ServiceLoader.load(IScriptingEngine.class).forEach(engine -> registerEngine(engine, props)); + + // Load Scripts.xml + load(); + } + + @Override + public void load() + { + _exclusions.clear(); + parseDatapackFile("config/Scripts.xml"); + LOGGER.info("Loaded " + _exclusions.size() + " files to exclude."); + } + + @Override + public void parseDocument(Document doc, File f) + { + try + { + final Map> excludePaths = new HashMap<>(); + forEach(doc, "list", listNode -> forEach(listNode, "exclude", excludeNode -> + { + final String excludeFile = parseString(excludeNode.getAttributes(), "file"); + excludePaths.putIfAbsent(excludeFile, new ArrayList<>()); + + forEach(excludeNode, "include", includeNode -> excludePaths.get(excludeFile).add(parseString(includeNode.getAttributes(), "file"))); + })); + + final int nameCount = SCRIPT_FOLDER.getNameCount(); + Files.walkFileTree(SCRIPT_FOLDER, new SimpleFileVisitor() + { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException + { + final String fileName = file.getFileName().toString(); + if (fileName.endsWith(".java")) + { + final Iterator relativePath = file.subpath(nameCount, file.getNameCount()).iterator(); + while (relativePath.hasNext()) + { + final String nextPart = relativePath.next().toString(); + if (excludePaths.containsKey(nextPart)) + { + boolean excludeScript = true; + + final List includePath = excludePaths.get(nextPart); + if (includePath != null) + { + while (relativePath.hasNext()) + { + if (includePath.contains(relativePath.next().toString())) + { + excludeScript = false; + break; + } + } + } + if (excludeScript) + { + _exclusions.add(fileName); + break; + } + } + } + } + + return super.visitFile(file, attrs); + } + }); + } + catch (final IOException e) + { + LOGGER.log(Level.WARNING, "Couldn't load script exclusions.", e); + } } private Properties loadProperties() @@ -222,17 +305,9 @@ public final class ScriptEngineManager private void processFile(File file, Map> files) { - switch (file.getName()) + if (_exclusions.contains(file.getName())) { - case "package-info.java": - case "MasterHandler.java": - case "EffectMasterHandler.java": - case "SkillConditionMasterHandler.java": - case "ConditionMasterHandler.java": - case "DailyMissionMasterHandler.java": - { - return; - } + return; } Path sourceFile = file.toPath(); diff --git a/L2J_Mobius_Classic_2.0_Zaken/dist/game/config/Scripts.xml b/L2J_Mobius_Classic_2.0_Zaken/dist/game/config/Scripts.xml new file mode 100644 index 0000000000..284aa0a31f --- /dev/null +++ b/L2J_Mobius_Classic_2.0_Zaken/dist/game/config/Scripts.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/L2J_Mobius_Classic_2.0_Zaken/dist/game/data/xsd/Scripts.xsd b/L2J_Mobius_Classic_2.0_Zaken/dist/game/data/xsd/Scripts.xsd new file mode 100644 index 0000000000..a21ad51f62 --- /dev/null +++ b/L2J_Mobius_Classic_2.0_Zaken/dist/game/data/xsd/Scripts.xsd @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/L2J_Mobius_Classic_2.0_Zaken/java/com/l2jmobius/gameserver/scripting/ScriptEngineManager.java b/L2J_Mobius_Classic_2.0_Zaken/java/com/l2jmobius/gameserver/scripting/ScriptEngineManager.java index 9b1ae28a9e..c7dea9a7b8 100644 --- a/L2J_Mobius_Classic_2.0_Zaken/java/com/l2jmobius/gameserver/scripting/ScriptEngineManager.java +++ b/L2J_Mobius_Classic_2.0_Zaken/java/com/l2jmobius/gameserver/scripting/ScriptEngineManager.java @@ -18,10 +18,16 @@ package com.l2jmobius.gameserver.scripting; import java.io.File; import java.io.FileInputStream; +import java.io.IOException; +import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; @@ -33,14 +39,17 @@ import java.util.ServiceLoader; import java.util.logging.Level; import java.util.logging.Logger; +import org.w3c.dom.Document; + import com.l2jmobius.Config; +import com.l2jmobius.commons.util.IGameXmlReader; import com.l2jmobius.gameserver.scripting.java.JavaScriptingEngine; /** * Caches script engines and provides functionality for executing and managing scripts. * @author KenM, HorridoJoho */ -public final class ScriptEngineManager +public final class ScriptEngineManager implements IGameXmlReader { private static final Logger LOGGER = Logger.getLogger(ScriptEngineManager.class.getName()); public static final Path SCRIPT_FOLDER = Paths.get(Config.DATAPACK_ROOT.getAbsolutePath(), "data", "scripts"); @@ -52,6 +61,7 @@ public final class ScriptEngineManager private final Map _extEngines = new HashMap<>(); private IExecutionContext _currentExecutionContext = null; + static final List _exclusions = new ArrayList<>(); protected ScriptEngineManager() { @@ -62,6 +72,79 @@ public final class ScriptEngineManager // Load external script engines ServiceLoader.load(IScriptingEngine.class).forEach(engine -> registerEngine(engine, props)); + + // Load Scripts.xml + load(); + } + + @Override + public void load() + { + _exclusions.clear(); + parseDatapackFile("config/Scripts.xml"); + LOGGER.info("Loaded " + _exclusions.size() + " files to exclude."); + } + + @Override + public void parseDocument(Document doc, File f) + { + try + { + final Map> excludePaths = new HashMap<>(); + forEach(doc, "list", listNode -> forEach(listNode, "exclude", excludeNode -> + { + final String excludeFile = parseString(excludeNode.getAttributes(), "file"); + excludePaths.putIfAbsent(excludeFile, new ArrayList<>()); + + forEach(excludeNode, "include", includeNode -> excludePaths.get(excludeFile).add(parseString(includeNode.getAttributes(), "file"))); + })); + + final int nameCount = SCRIPT_FOLDER.getNameCount(); + Files.walkFileTree(SCRIPT_FOLDER, new SimpleFileVisitor() + { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException + { + final String fileName = file.getFileName().toString(); + if (fileName.endsWith(".java")) + { + final Iterator relativePath = file.subpath(nameCount, file.getNameCount()).iterator(); + while (relativePath.hasNext()) + { + final String nextPart = relativePath.next().toString(); + if (excludePaths.containsKey(nextPart)) + { + boolean excludeScript = true; + + final List includePath = excludePaths.get(nextPart); + if (includePath != null) + { + while (relativePath.hasNext()) + { + if (includePath.contains(relativePath.next().toString())) + { + excludeScript = false; + break; + } + } + } + if (excludeScript) + { + _exclusions.add(fileName); + break; + } + } + } + } + + return super.visitFile(file, attrs); + } + }); + } + catch (final IOException e) + { + LOGGER.log(Level.WARNING, "Couldn't load script exclusions.", e); + } } private Properties loadProperties() @@ -222,17 +305,9 @@ public final class ScriptEngineManager private void processFile(File file, Map> files) { - switch (file.getName()) + if (_exclusions.contains(file.getName())) { - case "package-info.java": - case "MasterHandler.java": - case "EffectMasterHandler.java": - case "SkillConditionMasterHandler.java": - case "ConditionMasterHandler.java": - case "DailyMissionMasterHandler.java": - { - return; - } + return; } Path sourceFile = file.toPath();