diff --git a/src/resources/objects/buildouts/BuildoutLoader.java b/src/resources/objects/buildouts/BuildoutLoader.java index a071a5346..ecf3c4d58 100644 --- a/src/resources/objects/buildouts/BuildoutLoader.java +++ b/src/resources/objects/buildouts/BuildoutLoader.java @@ -27,9 +27,11 @@ ***********************************************************************************/ package resources.objects.buildouts; +import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Locale; +import java.util.Map; import resources.Terrain; import resources.client_info.ClientFactory; @@ -39,27 +41,43 @@ import resources.objects.SWGObject; import resources.server_info.Log; public class BuildoutLoader { + private static final CrcStringTableData crcTable = (CrcStringTableData) ClientFactory.getInfoFromFile("misc/object_template_crc_string_table.iff"); - public static List loadAllBuildouts() { - List objects = new LinkedList(); - for (Terrain t : getTerrainsToLoad()) - objects.addAll(loadBuildoutsForTerrain(t)); - return objects; + private Map objectTable; + private List objects; + + public BuildoutLoader() { + objectTable = new HashMap<>(); + objects = new LinkedList<>(); } - public static List loadBuildoutsForTerrain(Terrain terrain) { + public void loadAllBuildouts() { + for (Terrain t : getTerrainsToLoad()) + loadBuildoutsForTerrain(t); + } + + public void loadBuildoutsForTerrain(Terrain terrain) { DatatableData table = (DatatableData) ClientFactory.getInfoFromFile("datatables/buildout/buildout_scenes.iff"); for (int row = 0; row < table.getRowCount(); row++) { if (table.getCell(row, 0).equals(terrain.name().toLowerCase(Locale.ENGLISH))) { TerrainBuildoutLoader loader = new TerrainBuildoutLoader(crcTable, terrain); loader.load(row); - return loader.getObjects(); + objects.addAll(loader.getObjects()); + objectTable.putAll(loader.getObjectTable()); + return; } } System.err.println("Could not find buildouts for terrain: " + terrain); Log.e("BuildoutLoader", "Could not find buildouts for terrain: %s", terrain); - return new LinkedList<>(); + } + + public Map getObjectTable() { + return objectTable; + } + + public List getObjects() { + return objects; } private static List getTerrainsToLoad() { diff --git a/src/resources/objects/buildouts/SnapshotLoader.java b/src/resources/objects/buildouts/SnapshotLoader.java index 7d43e2127..dbae3458e 100644 --- a/src/resources/objects/buildouts/SnapshotLoader.java +++ b/src/resources/objects/buildouts/SnapshotLoader.java @@ -1,8 +1,10 @@ package resources.objects.buildouts; import java.util.EnumSet; +import java.util.HashMap; import java.util.LinkedList; import java.util.List; +import java.util.Map; import java.util.Set; import resources.Terrain; @@ -17,19 +19,33 @@ public class SnapshotLoader { Terrain.TATOOINE, Terrain.YAVIN4 ); - public static List loadAllSnapshots() { - List objects = new LinkedList<>(); + private Map objectTable; + private List objects; + + public SnapshotLoader() { + objectTable = new HashMap<>(); + objects = new LinkedList<>(); + } + + public void loadAllSnapshots() { for (Terrain t : TERRAINS) { - List terrain = loadSnapshotsForTerrain(t); - objects.addAll(terrain); + loadSnapshotsForTerrain(t); } + } + + public void loadSnapshotsForTerrain(Terrain t) { + TerrainSnapshotLoader loader = new TerrainSnapshotLoader(t); + loader.load(); + objects.addAll(loader.getObjects()); + objectTable.putAll(loader.getObjectTable()); + } + + public Map getObjectTable() { + return objectTable; + } + + public List getObjects() { return objects; } - public static List loadSnapshotsForTerrain(Terrain t) { - TerrainSnapshotLoader loader = new TerrainSnapshotLoader(t); - loader.load(); - return loader.getObjects(); - } - } diff --git a/src/resources/objects/buildouts/TerrainBuildoutLoader.java b/src/resources/objects/buildouts/TerrainBuildoutLoader.java index 168d8f5ba..662e5789b 100644 --- a/src/resources/objects/buildouts/TerrainBuildoutLoader.java +++ b/src/resources/objects/buildouts/TerrainBuildoutLoader.java @@ -64,6 +64,10 @@ class TerrainBuildoutLoader { loadAreas(sceneNumber); } + public Map getObjectTable() { + return objectTable; + } + public List getObjects() { return objects; } diff --git a/src/resources/objects/buildouts/TerrainSnapshotLoader.java b/src/resources/objects/buildouts/TerrainSnapshotLoader.java index 96cb8be99..9f4c3b281 100644 --- a/src/resources/objects/buildouts/TerrainSnapshotLoader.java +++ b/src/resources/objects/buildouts/TerrainSnapshotLoader.java @@ -29,6 +29,10 @@ public class TerrainSnapshotLoader { this.objectTable = new Hashtable(12*1024); this.objects = new LinkedList<>(); } + + public Map getObjectTable() { + return objectTable; + } public List getObjects() { return objects; diff --git a/src/services/objects/ObjectManager.java b/src/services/objects/ObjectManager.java index a8890dadf..48964bea0 100644 --- a/src/services/objects/ObjectManager.java +++ b/src/services/objects/ObjectManager.java @@ -120,20 +120,24 @@ public class ObjectManager extends Manager { long startLoad = System.nanoTime(); System.out.println("ObjectManager: Loading buildouts..."); Log.i("ObjectManager", "Loading buildouts..."); - List buildouts = null; String terrain = c.getString("LOAD-BUILDOUTS-FOR", ""); + BuildoutLoader loader = new BuildoutLoader(); if (Terrain.doesTerrainExistForName(terrain)) - buildouts = BuildoutLoader.loadBuildoutsForTerrain(Terrain.getTerrainFromName(terrain)); + loader.loadBuildoutsForTerrain(Terrain.getTerrainFromName(terrain)); else { if (!terrain.isEmpty()) { System.err.println("ObjectManager: Unknown terrain '" + terrain + "'"); Log.e("ObjectManager", "Unknown terrain: %s", terrain); } - buildouts = BuildoutLoader.loadAllBuildouts(); + loader.loadAllBuildouts(); } + List buildouts = loader.getObjects(); for (SWGObject obj : buildouts) { loadBuildout(obj); } + for (SWGObject obj : loader.getObjectTable().values()) { + objectMap.put(obj.getObjectId(), obj); + } double loadTime = (System.nanoTime() - startLoad) / 1E6; System.out.printf("ObjectManager: Finished loading %d buildouts. Time: %fms%n", buildouts.size(), loadTime); Log.i("ObjectManager", "Finished loading buildouts. Time: %fms", loadTime); @@ -149,20 +153,24 @@ public class ObjectManager extends Manager { long startLoad = System.nanoTime(); System.out.println("ObjectManager: Loading snapshots..."); Log.i("ObjectManager", "Loading snapshots..."); - List snapshots = null; String terrain = c.getString("LOAD-SNAPSHOTS-FOR", ""); + SnapshotLoader loader = new SnapshotLoader(); if (Terrain.doesTerrainExistForName(terrain)) - snapshots = SnapshotLoader.loadSnapshotsForTerrain(Terrain.getTerrainFromName(terrain)); + loader.loadSnapshotsForTerrain(Terrain.getTerrainFromName(terrain)); else { if (!terrain.isEmpty()) { System.err.println("ObjectManager: Unknown terrain '" + terrain + "'"); Log.e("ObjectManager", "Unknown terrain: %s", terrain); } - snapshots = SnapshotLoader.loadAllSnapshots(); + loader.loadAllSnapshots(); } + List snapshots = loader.getObjects(); for (SWGObject obj : snapshots) { loadSnapshot(obj); } + for (SWGObject obj : loader.getObjectTable().values()) { + objectMap.put(obj.getObjectId(), obj); + } double loadTime = (System.nanoTime() - startLoad) / 1E6; System.out.printf("ObjectManager: Finished loading %d snapshots. Time: %fms%n", snapshots.size(), loadTime); Log.i("ObjectManager", "Finished loading snapshots. Time: %fms", loadTime); @@ -176,8 +184,6 @@ public class ObjectManager extends Manager { if (obj instanceof TangibleObject || obj instanceof CellObject) { objectAwareness.add(obj); } - objectMap.put(obj.getObjectId(), obj); - addChildrenObjects(obj); mapService.addMapLocation(obj, MapService.MapType.STATIC); } @@ -185,8 +191,6 @@ public class ObjectManager extends Manager { if (obj instanceof TangibleObject || obj instanceof CellObject) { objectAwareness.add(obj); } - objectMap.put(obj.getObjectId(), obj); - addChildrenObjects(obj); mapService.addMapLocation(obj, MapService.MapType.STATIC); }