diff --git a/src/services/objects/ClientBuildoutService.java b/src/services/objects/ClientBuildoutService.java index e51a0b512..f89882d1f 100644 --- a/src/services/objects/ClientBuildoutService.java +++ b/src/services/objects/ClientBuildoutService.java @@ -36,9 +36,7 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; -import java.util.Collection; import java.util.HashMap; -import java.util.HashSet; import java.util.Hashtable; import java.util.List; import java.util.Locale; @@ -97,8 +95,8 @@ public class ClientBuildoutService extends Service { } } - public Collection loadClientObjects() { - Collection objects; + public Map loadClientObjects() { + Map objects; long startLoad = System.nanoTime(); Log.i(this, "Loading client objects..."); try { @@ -106,9 +104,9 @@ public class ClientBuildoutService extends Service { if (getConfig(ConfigFile.PRIMARY).getBoolean("LOAD-OBJECTS", true)) objects = loadObjects(); else - objects = new HashSet<>(); + objects = new HashMap<>(); } catch (SQLException e) { - objects = new HashSet<>(); + objects = new HashMap<>(); Log.e(this, e); } double loadTime = (System.nanoTime() - startLoad) / 1E6; @@ -116,67 +114,70 @@ public class ClientBuildoutService extends Service { return objects; } - public Collection loadClientObjectsByArea(int areaId) { + public Map loadClientObjectsByArea(int areaId) { try { if (areasById.isEmpty()) loadAreas(new ArrayList<>()); return loadObjects(areaId); } catch (SQLException e) { Log.e(this, e); - return new ArrayList<>(); + return new HashMap<>(); } } - private Collection loadObjects() throws SQLException { + private Map loadObjects() throws SQLException { Map objects = new HashMap<>(112660); try (CrcDatabase strings = new CrcDatabase()) { strings.loadStrings(); try (BuildoutLoader loader = new BuildoutLoader(areasById, objects, strings, new File("serverdata/buildout/objects.sdb"))) { + SWGObject obj; while (loader.loadNextEntry()) { if (!loader.isValidNextEntry()) continue; - SWGObject obj = loader.createObject(); - objects.put(obj.getObjectId(), obj); + obj = loader.createObject(); + new ObjectCreatedIntent(obj).broadcast(); } } } - List ret = new ArrayList<>(objects.values()); - ret.addAll(getAdditionalObjects(objects)); - return ret; + objects.putAll(getAdditionalObjects(objects)); + return objects; } - private Collection loadObjects(int areaId) throws SQLException { + private Map loadObjects(int areaId) throws SQLException { Map objects = new HashMap<>(112660); try (CrcDatabase strings = new CrcDatabase()) { strings.loadStrings(); try (BuildoutLoader loader = new BuildoutLoader(areasById, objects, strings, new File("serverdata/buildout/objects.sdb"))) { + SWGObject obj; while (loader.loadNextEntry()) { if (!loader.isAreaId(areaId)) continue; - SWGObject obj = loader.createObject(); - objects.put(obj.getObjectId(), obj); + obj = loader.createObject(); + new ObjectCreatedIntent(obj).broadcast(); } } } - return new ArrayList<>(objects.values()); + return objects; } - private Collection getAdditionalObjects(Map buildouts) throws SQLException { + private Map getAdditionalObjects(Map buildouts) throws SQLException { Map objects = new Hashtable<>(); try (CrcDatabase strings = new CrcDatabase()) { try (RelationalServerData data = RelationalServerFactory.getServerData("buildout/additional_buildouts.db", "additional_buildouts")) { try (ResultSet set = data.executeQuery(GET_ADDITIONAL_OBJECTS_SQL)) { set.setFetchSize(4*1024); + SWGObject obj; while (set.next()) { - createAdditionalObject(objects, buildouts, set); + obj = createAdditionalObject(objects, buildouts, set); + new ObjectCreatedIntent(obj).broadcast(); } } } } - return new ArrayList<>(objects.values()); + return objects; } - private void createAdditionalObject(Map objects, Map buildouts, ResultSet set) throws SQLException { + private SWGObject createAdditionalObject(Map objects, Map buildouts, ResultSet set) throws SQLException { try { SWGObject obj = ObjectCreator.createObjectFromTemplate(set.getString("template")); Location l = new Location(); @@ -190,8 +191,10 @@ public class ClientBuildoutService extends Service { obj.setPrefLoadRange(set.getFloat("radius")); checkParent(buildouts, obj, set.getString("building_name"), set.getInt("cell_id")); objects.put(obj.getObjectId(), obj); + return obj; } catch (NullPointerException e) { Log.e(this, "File: %s", set.getString("template")); + return null; } } @@ -371,6 +374,7 @@ public class ClientBuildoutService extends Service { setObjectLocation(obj); setCellNumber(obj); setContainer(obj); + objects.put(obj.getObjectId(), obj); return obj; } diff --git a/src/services/objects/ObjectManager.java b/src/services/objects/ObjectManager.java index 4b7fd3d45..9ce9939f4 100644 --- a/src/services/objects/ObjectManager.java +++ b/src/services/objects/ObjectManager.java @@ -27,7 +27,6 @@ ***********************************************************************************/ package services.objects; -import java.util.Collection; import java.util.Hashtable; import java.util.Map; import java.util.concurrent.Executors; @@ -102,13 +101,11 @@ public class ObjectManager extends Manager { @Override public boolean initialize() { - Collection buildouts = clientBuildoutService.loadClientObjects(); + synchronized (objectMap) { + objectMap.putAll(clientBuildoutService.loadClientObjects()); + } if (!loadObjects()) return false; - for (SWGObject obj : buildouts) { - putObject(obj); - new ObjectCreatedIntent(obj).broadcast(); - } synchronized (database) { database.traverse((obj) -> loadObject(obj)); } diff --git a/src/utilities/buildouts/BuildingListGenerator.java b/src/utilities/buildouts/BuildingListGenerator.java index 8892e2ad1..df08b5369 100644 --- a/src/utilities/buildouts/BuildingListGenerator.java +++ b/src/utilities/buildouts/BuildingListGenerator.java @@ -44,7 +44,7 @@ public class BuildingListGenerator { public static void main(String [] args) throws IOException { ClientBuildoutService buildouts = new ClientBuildoutService(); - Collection objects = buildouts.loadClientObjects(); + Collection objects = buildouts.loadClientObjects().values(); System.out.println("Organizing data..."); List buildings = new ArrayList<>(); SdbGenerator gen = new SdbGenerator(new File("buildings.sdb")); diff --git a/test/resources/objects/awareness/TestAwarenessHandler.java b/test/resources/objects/awareness/TestAwarenessHandler.java index bd4cbce81..603c78a84 100644 --- a/test/resources/objects/awareness/TestAwarenessHandler.java +++ b/test/resources/objects/awareness/TestAwarenessHandler.java @@ -60,10 +60,10 @@ public class TestAwarenessHandler { public static void initTatooine() { ClientBuildoutService buildoutService = new ClientBuildoutService(); double loadDistance = 1024*1.414*2; // 1024 * sqrt(2) - for (SWGObject obj : buildoutService.loadClientObjectsByArea(843)) { // mos eisley's area id + for (SWGObject obj : buildoutService.loadClientObjectsByArea(843).values()) { // mos eisley's area id initObject(obj, loadDistance); } - for (SWGObject obj : buildoutService.loadClientObjectsByArea(-59)) { // general tatooine's area id + for (SWGObject obj : buildoutService.loadClientObjectsByArea(-59).values()) { // general tatooine's area id initObject(obj, loadDistance); } CREATURE2.setLocation(CREATURE2_LOCATION); diff --git a/test/resources/objects/awareness/TestTerrainMap.java b/test/resources/objects/awareness/TestTerrainMap.java index f38dabeba..4a17f4090 100644 --- a/test/resources/objects/awareness/TestTerrainMap.java +++ b/test/resources/objects/awareness/TestTerrainMap.java @@ -111,7 +111,7 @@ public class TestTerrainMap { @Test public void testTatooine() { ClientBuildoutService buildoutService = new ClientBuildoutService(); - Collection allObjects = buildoutService.loadClientObjectsByArea(843); // mos eisley's area id + Collection allObjects = buildoutService.loadClientObjectsByArea(843).values(); // mos eisley's area id List tatObjects = allObjects.stream().filter((obj) -> { return obj.getTerrain() == Terrain.TATOOINE && obj.getParent() == null; }).collect(Collectors.toList());