diff --git a/serverdata/map/cities.sdb b/serverdata/map/cities.sdb new file mode 100644 index 000000000..002d0a64e --- /dev/null +++ b/serverdata/map/cities.sdb @@ -0,0 +1,45 @@ +city terrain x z radius +TEXT PRIMARY KEY TEXT NOT NULL INTEGER NOT NULL INTEGER NOT NULL INTEGER NOT NULL +@corellia_region_names:coronet corellia -178 -4504 581 +@corellia_region_names:tyrena corellia -5282 -2526 622 +@dantooine_region_names:dantari_village_1 dantooine -3843 -5713 70 +@dantooine_region_names:dantari_village_2 dantooine -7202 -859 90 +@dantooine_region_names:dantari_village_3 dantooine 5550 -654 65 +@dantooine_region_names:imperial_outpost dantooine -4224 -2400 350 +@dantooine_region_names:dantooine_mining_outpost dantooine -622 2488 400 +@dantooine_region_names:dantooine_pirate_outpost dantooine 1588 -6390 400 +@dathomir_region_names:dathomir_trade_outpost dathomir 599 3071 400 +@dathomir_region_names:dathomir_survey_outpost dathomir -85 -1600 400 +@endor_region_names:ewok_village_tree_1 endor 84 39 80 +@endor_region_names:ewok_village_tree_2 endor 4545 -2395 128 +@endor_region_names:ewok_lake_village_1 endor 1435 -3190 150 +@endor_region_names:ewok_lake_village_2 endor -573 -5040 175 +@endor_region_names:dulok_village_1 endor 6068 -2475 100 +@endor_region_names:dulok_village_2 endor -1211 2952 128 +@endor_region_names:endor_smuggler_outpost endor -898 1587 400 +@endor_region_names:endor_neutral_outpost endor 3222 -3467 400 +@kashyyyk_region_names:kachirho kashyyyk -530 -90 225 +@lok_region_names:lok_nyms_stronghold lok 436 5120 429 +@lok_region_names:lok_imperial_outpost lok -1920 -3084 201 +@naboo_region_names:kaadara circle 5168 6704 320 +@naboo_region_names:keren naboo 336 2140 2512 +@naboo_region_names:moenia naboo 4800 -4784 336 +@naboo_region_names:theed naboo -6160 3920 -4480 +@rori_region_names:narmle rori -5200 -2288 392 +@rori_region_names:restuss rori 5318 5680 700 +@rori_region_names:sdungeon_rebel_outpost rori 3677 -6447 150 +@talus_region_names:dearic talus 425 -3000 400 +@talus_region_names:nashal talus 4360 5251 350 +@talus_region_names:talus_imperial_outpost talus -2178 2300 240 +@tatooine_region_names:bestine tatooine -1218 -3688 336 +@tatooine_region_names:fort_tusken tatooine -3900 6260 250 +@tatooine_region_names:jabbas_palace tatooine -5983 -6267 500 +@tatooine_region_names:mos_eisley tatooine 3460 -4768 456 +@tatooine_region_names:mos_entha tatooine 1488 3256 424 +@tatooine_region_names:mos_espa tatooine -2940 2190 533 +@tatooine_region_names:mos_teike tatooine 3832 2360 264 +@tatooine_region_names:wayfar tatooine -5174 -6582 230 +@tatooine_region_names:anchorhead tatooine 102 -5360 125 +@yavin4_region_names:yavin4_labor_outpost yavin4 -6925 -5707 200 +@yavin4_region_names:yavin4_mining_outpost yavin4 -307 4861 200 +@yavin4_region_names:yavin4_imperial_fort yavin4 4030 -6215 200 diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index 50686764d..233323596 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -92,6 +92,7 @@ public class CreatureObject extends TangibleObject { private long ownerId = 0; private int battleFatigue = 0; private long statesBitmask = 0; + private String currentCity = ""; private HologramColour hologramColour = HologramColour.DEFAULT; private SWGList baseAttributes = new SWGList(BaselineType.CREO, 1, 2); @@ -256,6 +257,10 @@ public class CreatureObject extends TangibleObject { return difficulty; } + public String getCurrentCity() { + return currentCity; + } + public PlayerObject getPlayerObject() { return (PlayerObject) (hasSlot("ghost") ? getSlottedObject("ghost") : null); } @@ -417,6 +422,10 @@ public class CreatureObject extends TangibleObject { sendDelta(6, 26, difficulty.getDifficulty()); } + public void setCurrentCity(String currentCity) { + this.currentCity = currentCity; + } + public String getMoodAnimation() { return moodAnimation; } diff --git a/src/services/map/CityService.java b/src/services/map/CityService.java new file mode 100644 index 000000000..8eee5543b --- /dev/null +++ b/src/services/map/CityService.java @@ -0,0 +1,114 @@ +package services.map; + +import java.io.FileNotFoundException; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Locale; + +import intents.PlayerEventIntent; +import intents.network.GalacticPacketIntent; +import network.packets.swg.zone.object_controller.DataTransform; +import resources.Location; +import resources.control.Intent; +import resources.control.Service; +import resources.objects.creature.CreatureObject; +import resources.player.Player; +import resources.player.PlayerEvent; +import resources.server_info.Log; +import resources.server_info.RelationalServerData; + +public class CityService extends Service { + + private static final String GET_ALL_CITIES_FROM_TERRAIN = "SELECT * FROM cities WHERE terrain = ?"; + + private final RelationalServerData spawnDatabase; + private final PreparedStatement getAllCitiesStatement; + + public CityService() { + spawnDatabase = new RelationalServerData("serverdata/map/cities.db"); + try { + spawnDatabase.linkTableWithSdb("cities", "serverdata/map/cities.sdb"); + } catch (FileNotFoundException e) { + e.printStackTrace(); + throw new main.ProjectSWG.CoreException("Unable to load sdb files for StaticService"); + } + getAllCitiesStatement = spawnDatabase.prepareStatement(GET_ALL_CITIES_FROM_TERRAIN); + } + + @Override + public boolean initialize() { + registerForIntent(GalacticPacketIntent.TYPE); + registerForIntent(PlayerEventIntent.TYPE); + return super.initialize(); + } + + @Override + public void onIntentReceived(Intent i) { + if (i instanceof GalacticPacketIntent) { + GalacticPacketIntent gpi = (GalacticPacketIntent) i; + if (gpi.getPacket() instanceof DataTransform) { + Player player = gpi.getPlayerManager().getPlayerFromNetworkId(gpi.getNetworkId()); + if (player == null) { + Log.e("CityService", "Player is null in GalacticPacketIntent:DataTransform!"); + return; + } + CreatureObject creature = player.getCreatureObject(); + if (creature == null) { + Log.e("CityService", "Creature is null in GalacticPacketIntent:DataTransform!"); + return; + } + DataTransform transform = (DataTransform) gpi.getPacket(); + Location loc = transform.getLocation(); + performLocationUpdate(creature, loc); + } + } else if (i instanceof PlayerEventIntent) { + Player player = ((PlayerEventIntent) i).getPlayer(); + CreatureObject creature = player.getCreatureObject(); + if (((PlayerEventIntent) i).getEvent() == PlayerEvent.PE_ZONE_IN) { + performLocationUpdate(creature, creature.getLocation()); + } + } + } + + private void performLocationUpdate(CreatureObject object, Location loc) { + String terrain = loc.getTerrain().getName().toLowerCase(Locale.US); + int locX = (int) (loc.getX() + 0.5); + int locZ = (int) (loc.getZ() + 0.5); + synchronized (spawnDatabase) { + ResultSet set = null; + try { + getAllCitiesStatement.setString(1, terrain); + set = getAllCitiesStatement.executeQuery(); + while (set.next()) { + int x = set.getInt("x"); + int z = set.getInt("z"); + int radius = set.getInt("radius"); + if (distance(locX, locZ, x, z) <= radius) { + object.setCurrentCity(set.getString("city")); + return; + } + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + try { + if (set != null) + set.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + object.setCurrentCity(""); + } + + private double distance(int x1, int z1, int x2, int z2) { + return Math.sqrt(square(x1-x2) + square(z1-z2)); + } + + private int square(int x) { + return x * x; + } + +} diff --git a/src/services/map/MapService.java b/src/services/map/MapManager.java similarity index 97% rename from src/services/map/MapService.java rename to src/services/map/MapManager.java index 6c6683de0..8b0243e27 100644 --- a/src/services/map/MapService.java +++ b/src/services/map/MapManager.java @@ -36,7 +36,7 @@ import resources.client_info.ClientFactory; import resources.client_info.ServerFactory; import resources.client_info.visitors.DatatableData; import resources.control.Intent; -import resources.control.Service; +import resources.control.Manager; import resources.objects.SWGObject; import resources.player.Player; @@ -47,7 +47,8 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; -public class MapService extends Service { +public class MapManager extends Manager { + private final Map mapCategories; private final Map mappingTemplates; @@ -60,9 +61,11 @@ public class MapService extends Service { private final AtomicInteger staticMapVersion = new AtomicInteger(1); private final AtomicInteger dynamicMapVersion = new AtomicInteger(1); private final AtomicInteger persistMapVersion = new AtomicInteger(1); + + private final CityService cityService; - - public MapService() { + public MapManager() { + cityService = new CityService(); mapCategories = new HashMap<>(); mappingTemplates = new HashMap<>(); @@ -73,6 +76,8 @@ public class MapService extends Service { // for objects loaded from the databases, snapshots, buildouts. loadMapCategories(); loadMappingTemplates(); + + addChildService(cityService); } @Override diff --git a/src/services/objects/ObjectManager.java b/src/services/objects/ObjectManager.java index 9da299655..8c81d2cd5 100644 --- a/src/services/objects/ObjectManager.java +++ b/src/services/objects/ObjectManager.java @@ -63,13 +63,13 @@ import resources.server_info.Config; import resources.server_info.Log; import resources.server_info.ObjectDatabase; import resources.server_info.ObjectDatabase.Traverser; -import services.map.MapService; +import services.map.MapManager; import services.player.PlayerManager; import services.spawn.StaticService; public class ObjectManager extends Manager { - private final MapService mapService; + private final MapManager mapService; private final StaticService staticService; private final RadialService radialService; @@ -79,7 +79,7 @@ public class ObjectManager extends Manager { private long maxObjectId; public ObjectManager() { - mapService = new MapService(); + mapService = new MapManager(); staticService = new StaticService(this); radialService = new RadialService(); database = new CachedObjectDatabase("odb/objects.db"); @@ -190,7 +190,7 @@ public class ObjectManager extends Manager { if (obj.getObjectId() >= maxObjectId) { maxObjectId = obj.getObjectId() + 1; } - mapService.addMapLocation(obj, MapService.MapType.STATIC); + mapService.addMapLocation(obj, MapManager.MapType.STATIC); } private void loadSnapshot(SWGObject obj) { @@ -200,7 +200,7 @@ public class ObjectManager extends Manager { if (obj.getObjectId() >= maxObjectId) { maxObjectId = obj.getObjectId() + 1; } - mapService.addMapLocation(obj, MapService.MapType.STATIC); + mapService.addMapLocation(obj, MapManager.MapType.STATIC); } private void loadObject(SWGObject obj) {