Make all reactor script invocations thread safe
Might be a bit overkill to force synchronization for every single method invocation when the only scheduling done in reactor scripts are: - 5511000 (summon Targa) - 5511001 (summon Scarlion)
This commit is contained in:
@@ -13,10 +13,14 @@ import javax.script.ScriptException;
|
|||||||
public class SynchronizedInvocable implements Invocable {
|
public class SynchronizedInvocable implements Invocable {
|
||||||
private final Invocable invocable;
|
private final Invocable invocable;
|
||||||
|
|
||||||
public SynchronizedInvocable(Invocable invocable) {
|
private SynchronizedInvocable(Invocable invocable) {
|
||||||
this.invocable = invocable;
|
this.invocable = invocable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Invocable of(Invocable invocable) {
|
||||||
|
return new SynchronizedInvocable(invocable);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized Object invokeMethod(Object thiz, String name, Object... args) throws ScriptException, NoSuchMethodException {
|
public synchronized Object invokeMethod(Object thiz, String name, Object... args) throws ScriptException, NoSuchMethodException {
|
||||||
return invocable.invokeMethod(thiz, name, args);
|
return invocable.invokeMethod(thiz, name, args);
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ package scripting.reactor;
|
|||||||
|
|
||||||
import client.MapleClient;
|
import client.MapleClient;
|
||||||
import scripting.AbstractScriptManager;
|
import scripting.AbstractScriptManager;
|
||||||
|
import scripting.SynchronizedInvocable;
|
||||||
import server.maps.MapleReactor;
|
import server.maps.MapleReactor;
|
||||||
import server.maps.ReactorDropEntry;
|
import server.maps.ReactorDropEntry;
|
||||||
import tools.DatabaseConnection;
|
import tools.DatabaseConnection;
|
||||||
@@ -53,14 +54,11 @@ public class ReactorScriptManager extends AbstractScriptManager {
|
|||||||
|
|
||||||
public void onHit(MapleClient c, MapleReactor reactor) {
|
public void onHit(MapleClient c, MapleReactor reactor) {
|
||||||
try {
|
try {
|
||||||
ScriptEngine engine = getInvocableScriptEngine("reactor/" + reactor.getId() + ".js", c);
|
Invocable iv = initializeInvocable(c, reactor);
|
||||||
if (engine == null) {
|
if (iv == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Invocable iv = (Invocable) engine;
|
|
||||||
ReactorActionManager rm = new ReactorActionManager(c, reactor, iv);
|
|
||||||
engine.put("rm", rm);
|
|
||||||
iv.invokeFunction("hit");
|
iv.invokeFunction("hit");
|
||||||
} catch (final NoSuchMethodException e) {} //do nothing, hit is OPTIONAL
|
} catch (final NoSuchMethodException e) {} //do nothing, hit is OPTIONAL
|
||||||
|
|
||||||
@@ -71,14 +69,11 @@ public class ReactorScriptManager extends AbstractScriptManager {
|
|||||||
|
|
||||||
public void act(MapleClient c, MapleReactor reactor) {
|
public void act(MapleClient c, MapleReactor reactor) {
|
||||||
try {
|
try {
|
||||||
ScriptEngine engine = getInvocableScriptEngine("reactor/" + reactor.getId() + ".js", c);
|
Invocable iv = initializeInvocable(c, reactor);
|
||||||
if (engine == null) {
|
if (iv == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Invocable iv = (Invocable) engine;
|
|
||||||
ReactorActionManager rm = new ReactorActionManager(c, reactor, iv);
|
|
||||||
engine.put("rm", rm);
|
|
||||||
iv.invokeFunction("act");
|
iv.invokeFunction("act");
|
||||||
} catch (final ScriptException | NoSuchMethodException | NullPointerException e) {
|
} catch (final ScriptException | NoSuchMethodException | NullPointerException e) {
|
||||||
FilePrinter.printError(FilePrinter.REACTOR + reactor.getId() + ".txt", e);
|
FilePrinter.printError(FilePrinter.REACTOR + reactor.getId() + ".txt", e);
|
||||||
@@ -120,14 +115,11 @@ public class ReactorScriptManager extends AbstractScriptManager {
|
|||||||
|
|
||||||
private void touching(MapleClient c, MapleReactor reactor, boolean touching) {
|
private void touching(MapleClient c, MapleReactor reactor, boolean touching) {
|
||||||
try {
|
try {
|
||||||
ScriptEngine engine = getInvocableScriptEngine("reactor/" + reactor.getId() + ".js", c);
|
Invocable iv = initializeInvocable(c, reactor);
|
||||||
if (engine == null) {
|
if (iv == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Invocable iv = (Invocable) engine;
|
|
||||||
ReactorActionManager rm = new ReactorActionManager(c, reactor, iv);
|
|
||||||
engine.put("rm", rm);
|
|
||||||
if (touching) {
|
if (touching) {
|
||||||
iv.invokeFunction("touch");
|
iv.invokeFunction("touch");
|
||||||
} else {
|
} else {
|
||||||
@@ -137,4 +129,17 @@ public class ReactorScriptManager extends AbstractScriptManager {
|
|||||||
FilePrinter.printError(FilePrinter.REACTOR + reactor.getId() + ".txt", ute);
|
FilePrinter.printError(FilePrinter.REACTOR + reactor.getId() + ".txt", ute);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Invocable initializeInvocable(MapleClient c, MapleReactor reactor) {
|
||||||
|
ScriptEngine engine = getInvocableScriptEngine("reactor/" + reactor.getId() + ".js", c);
|
||||||
|
if (engine == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
Invocable iv = SynchronizedInvocable.of((Invocable) engine);
|
||||||
|
ReactorActionManager rm = new ReactorActionManager(c, reactor, iv);
|
||||||
|
engine.put("rm", rm);
|
||||||
|
|
||||||
|
return iv;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user