diff --git a/src/intents/object/ObjectTeleportIntent.java b/src/intents/object/ObjectTeleportIntent.java index da2078d3..bc593cfa 100644 --- a/src/intents/object/ObjectTeleportIntent.java +++ b/src/intents/object/ObjectTeleportIntent.java @@ -32,17 +32,27 @@ import resources.control.Intent; import resources.objects.SWGObject; public class ObjectTeleportIntent extends Intent { + public static final String TYPE = "ObjectTeleportIntent"; private SWGObject object; + private SWGObject parent; private Location newLocation; public ObjectTeleportIntent(SWGObject object, Location newLocation) { super(TYPE); this.object = object; + this.parent = null; this.newLocation = newLocation; } - + + public ObjectTeleportIntent(SWGObject object, SWGObject parent, Location newLocation) { + super(TYPE); + this.object = object; + this.parent = parent; + this.newLocation = newLocation; + } + public SWGObject getObject() { return object; } @@ -50,6 +60,14 @@ public class ObjectTeleportIntent extends Intent { public void setObject(SWGObject object) { this.object = object; } + + public SWGObject getParent() { + return parent; + } + + public void setParent(SWGObject parent) { + this.parent = parent; + } public Location getNewLocation() { return newLocation; diff --git a/src/resources/commands/callbacks/GotoCmdCallback.java b/src/resources/commands/callbacks/GotoCmdCallback.java new file mode 100644 index 00000000..489e7275 --- /dev/null +++ b/src/resources/commands/callbacks/GotoCmdCallback.java @@ -0,0 +1,79 @@ +package resources.commands.callbacks; + +import intents.chat.ChatBroadcastIntent; +import intents.object.ObjectTeleportIntent; + +import java.sql.ResultSet; +import java.sql.SQLException; + +import resources.Location; +import resources.Terrain; +import resources.commands.ICmdCallback; +import resources.objects.SWGObject; +import resources.objects.building.BuildingObject; +import resources.objects.cell.CellObject; +import resources.player.Player; +import resources.server_info.Log; +import resources.server_info.RelationalServerData; +import resources.server_info.RelationalServerFactory; +import services.galaxy.GalacticManager; +import services.objects.ObjectManager; + +public class GotoCmdCallback implements ICmdCallback { + + @Override + public void execute(GalacticManager galacticManager, Player player, SWGObject target, String args) { + SWGObject teleportee = player.getCreatureObject(); + if (teleportee == null) + return; + String [] parts = args.split(" "); + if (parts.length == 0 || parts[0].trim().isEmpty()) + return; + String loc = parts[0].trim(); + String err = teleportToGotoLocation(galacticManager.getObjectManager(), teleportee, loc); + new ChatBroadcastIntent(player, err).broadcast(); + } + + private String teleportToGotoLocation(ObjectManager objManager, SWGObject obj, String loc) { + final String whereClause = "(player_spawns.id = ?) AND (player_spawns.building_id = '' OR buildings.building_id = player_spawns.building_id)"; + try (RelationalServerData data = RelationalServerFactory.getServerData("player/player_spawns.db", "building/buildings", "player_spawns")) { + try (ResultSet set = data.selectFromTable("player_spawns, buildings", new String[]{"player_spawns.*", "buildings.object_id"}, whereClause, loc)) { + if (!set.next()) + return "No such location found: " + loc; + return teleportToGoto(objManager, obj, loc, set); + } catch (SQLException e) { + e.printStackTrace(); + return "Exception thrown. Failed to teleport: ["+e.getErrorCode()+"] " + e.getMessage(); + } + } + } + + private String teleportToGoto(ObjectManager objManager, SWGObject obj, String loc, ResultSet set) throws SQLException { + String building = set.getString("building_id"); + Terrain t = Terrain.getTerrainFromName(set.getString("terrain")); + Location l = new Location(set.getDouble("x"), set.getDouble("y"), set.getDouble("z"), t); + if (building.isEmpty()) + new ObjectTeleportIntent(obj, l).broadcast(); + else + return teleportToGotoBuilding(objManager, obj, set.getLong("object_id"), set.getString("cell"), l); + return "Sucessfully teleported "+obj.getName()+" to " + loc; + } + + private String teleportToGotoBuilding(ObjectManager objManager, SWGObject obj, long buildingId, String cellName, Location l) { + SWGObject parent = objManager.getObjectById(buildingId); + if (parent == null || !(parent instanceof BuildingObject)) { + String err = String.format("Invalid parent! Either null or not a building: %s BUID: %d", parent, buildingId); + Log.e("CharacterCreationService", err); + return err; + } + CellObject cell = ((BuildingObject) parent).getCellByName(cellName); + if (cell == null) { + String err = String.format("Invalid cell! Cell does not exist: %s B-Template: %s BUID: %d", cellName, parent.getTemplate(), buildingId); + Log.e("CharacterCreationService", err); + return err; + } + new ObjectTeleportIntent(obj, cell, l).broadcast(); + return "Successfully teleported "+obj.getName()+" to "+buildingId+"/"+cellName; + } + +} diff --git a/src/resources/commands/callbacks/QaToolCmdCallback.java b/src/resources/commands/callbacks/QaToolCmdCallback.java index 7a25b630..7729d916 100644 --- a/src/resources/commands/callbacks/QaToolCmdCallback.java +++ b/src/resources/commands/callbacks/QaToolCmdCallback.java @@ -35,9 +35,13 @@ import resources.Location; import resources.Terrain; import resources.commands.ICmdCallback; import resources.objects.SWGObject; +import resources.objects.building.BuildingObject; +import resources.objects.cell.CellObject; import resources.objects.creature.CreatureObject; import resources.player.Player; import resources.server_info.Log; +import resources.server_info.RelationalServerData; +import resources.server_info.RelationalServerFactory; import resources.sui.ISuiCallback; import resources.sui.SuiButtons; import resources.sui.SuiEvent; @@ -47,8 +51,9 @@ import resources.sui.SuiMessageBox; import services.galaxy.GalacticManager; import services.objects.ObjectManager; import services.player.PlayerManager; -import services.player.TerrainZoneInsertion; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.Map; import network.packets.soe.Disconnect.DisconnectReason; @@ -151,27 +156,27 @@ public class QaToolCmdCallback implements ICmdCallback { private void recoverPlayer(ObjectManager objManager, PlayerManager playerManager, Player player, String args) { String name = args; String [] nameParts = name.split(" "); - Terrain t = Terrain.TATOOINE; + String loc = ""; if (nameParts.length >= 2) { - if (nameParts.length > 3) { - sendSystemMessage(player, "Invalid arguments! Expected [opt]"); - return; - } - Terrain possible = null; - if (nameParts.length == 3) { - possible = getTerrain(nameParts[2]); - if (possible != null) - name = nameParts[0] + " " + nameParts[1]; - } - if (nameParts.length == 2 || possible == null) { - possible = getTerrain(nameParts[1]); - if (possible != null) + switch (nameParts.length) { + case 2: name = nameParts[0]; + loc = nameParts[1]; + break; + case 3: + name = nameParts[0] + " " + nameParts[1]; + loc = nameParts[2]; + break; + default: + sendSystemMessage(player, "Invalid arguments! Expected [opt]"); + break; } - if (possible != null) - t = possible; } name = name.trim(); + recoverPlayer(objManager, playerManager, player, name, loc); + } + + private void recoverPlayer(ObjectManager objManager, PlayerManager playerManager, Player player, String name, String loc) { long id = playerManager.getCharacterIdByName(name); if (id == 0) { sendSystemMessage(player, "Could not find player by name: '" + name + "'"); @@ -184,19 +189,51 @@ public class QaToolCmdCallback implements ICmdCallback { sendSystemMessage(player, "Internal Error. Recoveree is null! ID: " + id); return; } - Location l = TerrainZoneInsertion.getInsertionForTerrain(t); - new ObjectTeleportIntent(recoveree, l).broadcast(); + sendSystemMessage(player, teleportToRecoveryLocation(objManager, recoveree, loc)); } - private Terrain getTerrain(String str) { - for (Terrain t : Terrain.values()) { - if (t.getName().equalsIgnoreCase(str)) { - return t; + private String teleportToRecoveryLocation(ObjectManager objManager, SWGObject obj, String loc) { + final String whereClause = "(player_spawns.id = ?) AND (player_spawns.building_id = '' OR buildings.building_id = player_spawns.building_id)"; + try (RelationalServerData data = RelationalServerFactory.getServerData("player/player_spawns.db", "building/buildings", "player_spawns")) { + try (ResultSet set = data.selectFromTable("player_spawns, buildings", new String[]{"player_spawns.*", "buildings.object_id"}, whereClause, loc)) { + if (!set.next()) + return "No such location found: " + loc; + return teleportToRecovery(objManager, obj, loc, set); + } catch (SQLException e) { + e.printStackTrace(); + return "Exception thrown. Failed to teleport: ["+e.getErrorCode()+"] " + e.getMessage(); } } - return null; } - + + private String teleportToRecovery(ObjectManager objManager, SWGObject obj, String loc, ResultSet set) throws SQLException { + String building = set.getString("building_id"); + Terrain t = Terrain.getTerrainFromName(set.getString("terrain")); + Location l = new Location(set.getDouble("x"), set.getDouble("y"), set.getDouble("z"), t); + if (building.isEmpty()) + new ObjectTeleportIntent(obj, l).broadcast(); + else + return teleportToRecoveryBuilding(objManager, obj, set.getLong("object_id"), set.getString("cell"), l); + return "Sucessfully teleported "+obj.getName()+" to " + loc; + } + + private String teleportToRecoveryBuilding(ObjectManager objManager, SWGObject obj, long buildingId, String cellName, Location l) { + SWGObject parent = objManager.getObjectById(buildingId); + if (parent == null || !(parent instanceof BuildingObject)) { + String err = String.format("Invalid parent! Either null or not a building: %s BUID: %d", parent, buildingId); + Log.e("CharacterCreationService", err); + return err; + } + CellObject cell = ((BuildingObject) parent).getCellByName(cellName); + if (cell == null) { + String err = String.format("Invalid cell! Cell does not exist: %s B-Template: %s BUID: %d", cellName, parent.getTemplate(), buildingId); + Log.e("CharacterCreationService", err); + return err; + } + new ObjectTeleportIntent(obj, cell, l).broadcast(); + return "Successfully teleported "+obj.getName()+" to "+buildingId+"/"+cellName+" "+l; + } + private void displayHelp(Player player) { String prompt = "The following are acceptable arguments that can be used as shortcuts to the various QA tools:\n" + "item