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