From fb6f53338c76b05f1877e9775a18d1c5a9c7b24e Mon Sep 17 00:00:00 2001 From: Obique PSWG Date: Sun, 9 Aug 2015 02:12:17 -0500 Subject: [PATCH] Added additional radial logic for easier iff->script lookup and added basic implementation for radial options --- scripts/radial/terminal/bank.js | 6 + scripts/radial/terminal/bazaar.js | 4 + scripts/radial/terminal/ticket_collector.js | 4 + scripts/radial/terminal/travel.js | 4 + serverdata/radial/radials.sdb | 4 + .../object_controller/ObjectMenuResponse.java | 2 +- src/resources/radial/Radials.java | 22 ++++ src/services/galaxy/GameManager.java | 6 +- .../galaxy/terminals/BankingService.java | 58 --------- .../galaxy/terminals/TerminalManager.java | 15 --- .../galaxy/terminals/TerminalService.java | 113 ++++++++++++++++++ src/utilities/Scripts.java | 7 ++ 12 files changed, 168 insertions(+), 77 deletions(-) create mode 100644 scripts/radial/terminal/bank.js create mode 100644 scripts/radial/terminal/bazaar.js create mode 100644 scripts/radial/terminal/ticket_collector.js create mode 100644 scripts/radial/terminal/travel.js create mode 100644 src/resources/radial/Radials.java delete mode 100644 src/services/galaxy/terminals/BankingService.java delete mode 100644 src/services/galaxy/terminals/TerminalManager.java create mode 100644 src/services/galaxy/terminals/TerminalService.java diff --git a/scripts/radial/terminal/bank.js b/scripts/radial/terminal/bank.js new file mode 100644 index 000000000..7e6b2dc23 --- /dev/null +++ b/scripts/radial/terminal/bank.js @@ -0,0 +1,6 @@ +var getOptions = function(options) { + options.add(new RadialOption(0, RadialItem.ITEM_USE)); + options.add(new RadialOption(0, RadialItem.EXAMINE)); + options.add(new RadialOption(1, RadialItem.BANK_TRANSFER)); + options.add(new RadialOption(1, RadialItem.BANK_ITEMS)); +}; \ No newline at end of file diff --git a/scripts/radial/terminal/bazaar.js b/scripts/radial/terminal/bazaar.js new file mode 100644 index 000000000..a0850b458 --- /dev/null +++ b/scripts/radial/terminal/bazaar.js @@ -0,0 +1,4 @@ +var getOptions = function(options) { + options.add(new RadialOption(0, RadialItem.ITEM_USE)); + options.add(new RadialOption(0, RadialItem.EXAMINE)); +}; \ No newline at end of file diff --git a/scripts/radial/terminal/ticket_collector.js b/scripts/radial/terminal/ticket_collector.js new file mode 100644 index 000000000..a0850b458 --- /dev/null +++ b/scripts/radial/terminal/ticket_collector.js @@ -0,0 +1,4 @@ +var getOptions = function(options) { + options.add(new RadialOption(0, RadialItem.ITEM_USE)); + options.add(new RadialOption(0, RadialItem.EXAMINE)); +}; \ No newline at end of file diff --git a/scripts/radial/terminal/travel.js b/scripts/radial/terminal/travel.js new file mode 100644 index 000000000..a0850b458 --- /dev/null +++ b/scripts/radial/terminal/travel.js @@ -0,0 +1,4 @@ +var getOptions = function(options) { + options.add(new RadialOption(0, RadialItem.ITEM_USE)); + options.add(new RadialOption(0, RadialItem.EXAMINE)); +}; \ No newline at end of file diff --git a/serverdata/radial/radials.sdb b/serverdata/radial/radials.sdb index 743938c20..b1622a5d1 100644 --- a/serverdata/radial/radials.sdb +++ b/serverdata/radial/radials.sdb @@ -1,2 +1,6 @@ iff script TEXT PRIMARY KEY NOT NULL TEXT NOT NULL +object/tangible/terminal/shared_terminal_bank.iff terminal/bank +object/tangible/terminal/shared_terminal_bazaar.iff terminal/bazaar +object/tangible/terminal/shared_terminal_travel.iff terminal/travel +object/tangible/travel/ticket_collector/shared_ticket_collector.iff terminal/ticket_collector \ No newline at end of file diff --git a/src/network/packets/swg/zone/object_controller/ObjectMenuResponse.java b/src/network/packets/swg/zone/object_controller/ObjectMenuResponse.java index 27fb6f8c8..03807fd16 100644 --- a/src/network/packets/swg/zone/object_controller/ObjectMenuResponse.java +++ b/src/network/packets/swg/zone/object_controller/ObjectMenuResponse.java @@ -85,7 +85,7 @@ public class ObjectMenuResponse extends ObjectController { int optionsDataSize = 0; for (RadialOption o : options) { optionsDataSize += 9; - if (o.getText() != null || !o.getText().isEmpty()) + if (o.getText() != null && !o.getText().isEmpty()) optionsDataSize += o.getText().length()*2; else optionsDataSize += 4; diff --git a/src/resources/radial/Radials.java b/src/resources/radial/Radials.java new file mode 100644 index 000000000..50827d2a6 --- /dev/null +++ b/src/resources/radial/Radials.java @@ -0,0 +1,22 @@ +package resources.radial; + +import java.util.ArrayList; +import java.util.List; + +import utilities.Scripts; + +public class Radials { + + private static final String SCRIPT_PREFIX = "radial/"; + + public static List getRadialOptions(String script, Object ... args) { + List options = new ArrayList<>(); + Scripts.invoke(SCRIPT_PREFIX + script, "getOptions", options, args); + return options; + } + + public static void handleSelection(String script, Object ... args) { + + } + +} diff --git a/src/services/galaxy/GameManager.java b/src/services/galaxy/GameManager.java index 13dad5340..d208f42a7 100644 --- a/src/services/galaxy/GameManager.java +++ b/src/services/galaxy/GameManager.java @@ -29,7 +29,7 @@ package services.galaxy; import resources.control.Manager; import services.commands.CommandService; -import services.galaxy.terminals.TerminalManager; +import services.galaxy.terminals.TerminalService; import services.sui.SuiService; public class GameManager extends Manager { @@ -38,14 +38,14 @@ public class GameManager extends Manager { private final ConnectionService connectionService; private final SuiService suiService; private final WeatherService weatherService; - private final TerminalManager terminalManager; + private final TerminalService terminalManager; public GameManager() { commandService = new CommandService(); connectionService = new ConnectionService(); suiService = new SuiService(); weatherService = new WeatherService(); - terminalManager = new TerminalManager(); + terminalManager = new TerminalService(); addChildService(commandService); addChildService(connectionService); diff --git a/src/services/galaxy/terminals/BankingService.java b/src/services/galaxy/terminals/BankingService.java deleted file mode 100644 index 06de0a54f..000000000 --- a/src/services/galaxy/terminals/BankingService.java +++ /dev/null @@ -1,58 +0,0 @@ -package services.galaxy.terminals; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import intents.radial.RadialRegisterIntent; -import intents.radial.RadialRequestIntent; -import intents.radial.RadialResponseIntent; -import resources.control.Intent; -import resources.control.Service; -import resources.radial.RadialItem; -import resources.radial.RadialOption; -import resources.server_info.Log; - -public class BankingService extends Service { - - private static final Set TEMPLATES = new HashSet<>(Arrays.asList("object/tangible/terminal/shared_terminal_bank.iff")); - - public BankingService() { - - } - - @Override - public boolean initialize() { - registerForIntent(RadialRequestIntent.TYPE); - return super.initialize(); - } - - @Override - public boolean start() { - new RadialRegisterIntent(TEMPLATES, true).broadcast(); - return super.start(); - } - - @Override - public boolean stop() { - new RadialRegisterIntent(TEMPLATES, false).broadcast(); - return super.stop(); - } - - @Override - public void onIntentReceived(Intent i) { - if (i instanceof RadialRequestIntent) { - RadialRequestIntent rri = (RadialRequestIntent) i; - List options = new ArrayList<>(); - options.add(new RadialOption(0, RadialItem.ITEM_USE)); - options.add(new RadialOption(0, RadialItem.EXAMINE)); - options.add(new RadialOption(1, RadialItem.BANK_TRANSFER)); - options.add(new RadialOption(1, RadialItem.BANK_ITEMS)); - Log.d("BankingService", "Received Radial Request! Player: " + rri.getPlayer() + " Template: " + rri.getTarget().getTemplate()); - new RadialResponseIntent(rri.getPlayer(), rri.getTarget(), options, rri.getRequest().getCounter()).broadcast(); - } - } - -} diff --git a/src/services/galaxy/terminals/TerminalManager.java b/src/services/galaxy/terminals/TerminalManager.java deleted file mode 100644 index 2937da114..000000000 --- a/src/services/galaxy/terminals/TerminalManager.java +++ /dev/null @@ -1,15 +0,0 @@ -package services.galaxy.terminals; - -import resources.control.Manager; - -public class TerminalManager extends Manager { - - private final BankingService bankingService; - - public TerminalManager() { - bankingService = new BankingService(); - - addChildService(bankingService); - } - -} diff --git a/src/services/galaxy/terminals/TerminalService.java b/src/services/galaxy/terminals/TerminalService.java new file mode 100644 index 000000000..b0ef6709b --- /dev/null +++ b/src/services/galaxy/terminals/TerminalService.java @@ -0,0 +1,113 @@ +package services.galaxy.terminals; + +import intents.radial.RadialRegisterIntent; +import intents.radial.RadialRequestIntent; +import intents.radial.RadialResponseIntent; + +import java.io.FileNotFoundException; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import resources.control.Intent; +import resources.control.Service; +import resources.radial.RadialOption; +import resources.radial.Radials; +import resources.server_info.Log; +import resources.server_info.RelationalServerData; + +public class TerminalService extends Service { + + private static final String GET_ALL_TEMPLATES_SQL = "SELECT iff FROM iff_to_script"; + private static final String GET_SCRIPT_FOR_IFF_SQL = "SELECT script FROM iff_to_script WHERE iff = ?"; + + private final Set templates; + private final RelationalServerData iffDatabase; + private final PreparedStatement getAllTemplatesStatement; + private final PreparedStatement getScriptForIffStatement; + + public TerminalService() { + templates = new HashSet<>(); + iffDatabase = new RelationalServerData("serverdata/radial/radials.db"); + try { + iffDatabase.linkTableWithSdb("iff_to_script", "serverdata/radial/radials.sdb"); + } catch (FileNotFoundException e) { + e.printStackTrace(); + throw new main.ProjectSWG.CoreException("Unable to load sdb files for StaticService"); + } + getAllTemplatesStatement = iffDatabase.prepareStatement(GET_ALL_TEMPLATES_SQL); + getScriptForIffStatement = iffDatabase.prepareStatement(GET_SCRIPT_FOR_IFF_SQL); + } + + @Override + public boolean initialize() { + registerForIntent(RadialRequestIntent.TYPE); + synchronized (getAllTemplatesStatement) { + // Cool and fancy Java thing to auto-cleanup resources + try (ResultSet set = getAllTemplatesStatement.executeQuery()) { + templates.clear(); + while (set.next()) { + templates.add(set.getString("iff")); + } + } catch (SQLException e) { + e.printStackTrace(); + } + } + return super.initialize(); + } + + @Override + public boolean start() { + new RadialRegisterIntent(templates, true).broadcast(); + return super.start(); + } + + @Override + public boolean stop() { + new RadialRegisterIntent(templates, false).broadcast(); + return super.stop(); + } + + @Override + public void onIntentReceived(Intent i) { + if (i instanceof RadialRequestIntent) { + RadialRequestIntent rri = (RadialRequestIntent) i; + String script = lookupScript(rri.getTarget().getTemplate()); + if (script == null) + return; + List options = Radials.getRadialOptions(script); + if (options == null) { + Log.e("TerminalService", "Radial script '%s' had an error in executing.", script); + return; + } + new RadialResponseIntent(rri.getPlayer(), rri.getTarget(), options, rri.getRequest().getCounter()).broadcast(); + } + } + + private String lookupScript(String iff) { + synchronized (getScriptForIffStatement) { + ResultSet set = null; + try { + getScriptForIffStatement.setString(1, iff); + set = getScriptForIffStatement.executeQuery(); + if (set.next()) + return set.getString("script"); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (set != null) { + try { + set.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + } + return null; + } + +} diff --git a/src/utilities/Scripts.java b/src/utilities/Scripts.java index ff8859506..88b0b4f21 100644 --- a/src/utilities/Scripts.java +++ b/src/utilities/Scripts.java @@ -33,6 +33,7 @@ import java.io.FileReader; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; +import javax.script.ScriptException; public class Scripts { @@ -43,6 +44,12 @@ public class Scripts { static { ENGINE.put("intentFactory", new IntentFactory()); + try { + ENGINE.eval("var RadialOption = Java.type('resources.radial.RadialOption')"); + ENGINE.eval("var RadialItem = Java.type('resources.radial.RadialItem')"); + } catch (ScriptException e) { + e.printStackTrace(); + } } // Prevents instantiation.