PortalScriptManager.java
Upload User: gwt600
Upload Date: 2021-06-03
Package Size: 704k
Code Size: 2k
Category:

Games

Development Platform:

Java

  1. package net.sf.odinms.scripting.portal;
  2. import java.io.File;
  3. import java.io.FileReader;
  4. import java.io.IOException;
  5. import java.util.HashMap;
  6. import java.util.Map;
  7. import javax.script.Compilable;
  8. import javax.script.CompiledScript;
  9. import javax.script.Invocable;
  10. import javax.script.ScriptEngine;
  11. import javax.script.ScriptEngineFactory;
  12. import javax.script.ScriptEngineManager;
  13. import javax.script.ScriptException;
  14. import net.sf.odinms.client.MapleClient;
  15. import net.sf.odinms.server.MaplePortal;
  16. import org.slf4j.Logger;
  17. import org.slf4j.LoggerFactory;
  18. public class PortalScriptManager {
  19. private static final Logger log = LoggerFactory.getLogger(PortalScriptManager.class);
  20. private static PortalScriptManager instance = new PortalScriptManager();
  21. private Map<String, PortalScript> scripts = new HashMap<String, PortalScript>();
  22. private ScriptEngineFactory sef;
  23. private PortalScriptManager() {
  24. ScriptEngineManager sem = new ScriptEngineManager();
  25. sef = sem.getEngineByName("javascript").getFactory();
  26. }
  27. public static PortalScriptManager getInstance() {
  28. return instance;
  29. }
  30. private PortalScript getPortalScript(String scriptName) {
  31. if (scripts.containsKey(scriptName)) {
  32. return scripts.get(scriptName);
  33. }
  34. File scriptFile = new File("scripts/portal/" + scriptName + ".js");
  35. if (!scriptFile.exists()) {
  36. scripts.put(scriptName, null);
  37. return null;
  38. }
  39. FileReader fr = null;
  40. ScriptEngine portal = sef.getScriptEngine();
  41. try {
  42. fr = new FileReader(scriptFile);
  43. CompiledScript compiled = ((Compilable) portal).compile(fr);
  44. compiled.eval();
  45. } catch (ScriptException e) {
  46. log.error("THROW", e);
  47. } catch (IOException e) {
  48. log.error("THROW", e);
  49. } finally {
  50. if (fr != null) {
  51. try {
  52. fr.close();
  53. } catch (IOException e) {
  54. log.error("ERROR CLOSING", e);
  55. }
  56. }
  57. }
  58. PortalScript script = ((Invocable) portal).getInterface(PortalScript.class);
  59. scripts.put(scriptName, script);
  60. return script;
  61. }
  62. // rhino is thread safe so this should be fine without synchronisation
  63. public boolean executePortalScript(MaplePortal portal, MapleClient c) {
  64. PortalScript script = getPortalScript(portal.getScriptName());
  65. if (script != null) {
  66. return script.enter(new PortalPlayerInteraction(c, portal));
  67. } else {
  68. return false;
  69. }
  70. }
  71. public void clearScripts() {
  72. scripts.clear();
  73. }
  74. }