diff --git a/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/ServerData.kt b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/ServerData.kt index 61a9f09be..b1d9550d4 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/ServerData.kt +++ b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/ServerData.kt @@ -105,6 +105,7 @@ object ServerData { val destroyMissions by SoftDataLoaderDelegate(::DestroyMissionLoader) val dynamicLairs by SoftDataLoaderDelegate(::DynamicLairLoader) val rawResources by SoftDataLoaderDelegate(::RawResourceLoader) + val staticCities by SoftDataLoaderDelegate(::StaticCityLoader) private class WeakDataLoaderDelegate(loaderCreator: () -> T): DataLoaderDelegate(::WeakReference, loaderCreator) private class SoftDataLoaderDelegate(loaderCreator: () -> T): DataLoaderDelegate(::SoftReference, loaderCreator) diff --git a/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/StaticCityLoader.kt b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/StaticCityLoader.kt new file mode 100644 index 000000000..02d19ee63 --- /dev/null +++ b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/StaticCityLoader.kt @@ -0,0 +1,65 @@ +/*********************************************************************************** + * Copyright (c) 2023 /// Project SWG /// www.projectswg.com * + * * + * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on * + * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. * + * Our goal is to create an emulator which will provide a server for players to * + * continue playing a game similar to the one they used to play. We are basing * + * it on the final publish of the game prior to end-game events. * + * * + * This file is part of Holocore. * + * * + * --------------------------------------------------------------------------------* + * * + * Holocore is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Affero General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * * + * Holocore is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Affero General Public License for more details. * + * * + * You should have received a copy of the GNU Affero General Public License * + * along with Holocore. If not, see . * + ***********************************************************************************/ +package com.projectswg.holocore.resources.support.data.server_info.loader + +import com.projectswg.common.data.location.Terrain +import com.projectswg.holocore.resources.support.data.server_info.SdbLoader +import com.projectswg.holocore.resources.support.objects.swg.SWGObject +import java.io.File + +class StaticCityLoader : DataLoader() { + private val cities = mutableMapOf>() + + fun getCities(terrain: Terrain): Collection { + return cities.getOrElse(terrain) { emptyList() } + } + + override fun load() { + SdbLoader.load(File("serverdata/map/cities.sdb")).use { set -> + while (set.next()) { + val t = Terrain.getTerrainFromName(set.getText("terrain")) + val list: MutableList = cities.computeIfAbsent(t) { mutableListOf() } + list.add(City(set.getText("city"), set.getInt("x").toInt(), set.getInt("z").toInt(), set.getInt("radius").toInt())) + } + } + } + + class City(val name: String, private val x: Int, private val z: Int, private val radius: Int) { + + fun isWithinRange(obj: SWGObject): Boolean { + return square(obj.x.toInt() - x) + square(obj.z.toInt() - z) <= square(radius) + } + + override fun toString(): String { + return String.format("City[%s, (%d, %d), radius=%d]", name, x, z, radius) + } + + private fun square(x: Int): Int { + return x * x + } + } +} \ No newline at end of file diff --git a/src/main/java/com/projectswg/holocore/services/gameplay/structures/housing/CityService.java b/src/main/java/com/projectswg/holocore/services/gameplay/structures/housing/CityService.java index f1c9e21eb..ed17d16e9 100644 --- a/src/main/java/com/projectswg/holocore/services/gameplay/structures/housing/CityService.java +++ b/src/main/java/com/projectswg/holocore/services/gameplay/structures/housing/CityService.java @@ -1,5 +1,5 @@ /*********************************************************************************** - * Copyright (c) 2018 /// Project SWG /// www.projectswg.com * + * Copyright (c) 2023 /// Project SWG /// www.projectswg.com * * * * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on * * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. * @@ -26,14 +26,13 @@ ***********************************************************************************/ package com.projectswg.holocore.services.gameplay.structures.housing; -import com.projectswg.common.data.location.Terrain; import com.projectswg.common.network.packets.SWGPacket; import com.projectswg.common.network.packets.swg.zone.object_controller.DataTransform; import com.projectswg.holocore.intents.support.global.network.InboundPacketIntent; import com.projectswg.holocore.intents.support.global.zone.PlayerEventIntent; import com.projectswg.holocore.intents.support.objects.swg.ObjectCreatedIntent; -import com.projectswg.holocore.resources.support.data.server_info.SdbLoader; -import com.projectswg.holocore.resources.support.data.server_info.SdbLoader.SdbResultSet; +import com.projectswg.holocore.resources.support.data.server_info.loader.ServerData; +import com.projectswg.holocore.resources.support.data.server_info.loader.StaticCityLoader.City; import com.projectswg.holocore.resources.support.global.player.Player; import com.projectswg.holocore.resources.support.global.player.PlayerEvent; import com.projectswg.holocore.resources.support.objects.swg.SWGObject; @@ -41,29 +40,11 @@ import com.projectswg.holocore.resources.support.objects.swg.creature.CreatureOb import com.projectswg.holocore.resources.support.objects.swg.tangible.TangibleObject; import me.joshlarson.jlcommon.control.IntentHandler; import me.joshlarson.jlcommon.control.Service; -import me.joshlarson.jlcommon.log.Log; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.EnumMap; -import java.util.List; -import java.util.Map; +import java.util.Collection; public class CityService extends Service { - - private final Map> cities; - - public CityService() { - cities = new EnumMap<>(Terrain.class); - } - - @Override - public boolean initialize() { - loadCities(); - return true; - } - + @IntentHandler private void handleInboundPacketIntent(InboundPacketIntent gpi) { SWGPacket p = gpi.getPacket(); @@ -71,7 +52,7 @@ public class CityService extends Service { performLocationUpdate(gpi.getPlayer().getCreatureObject()); } } - + @IntentHandler private void handlePlayerEventIntent(PlayerEventIntent i) { Player player = i.getPlayer(); @@ -80,36 +61,21 @@ public class CityService extends Service { performLocationUpdate(creature); } } - + @IntentHandler private void handleObjectCreatedIntent(ObjectCreatedIntent i) { SWGObject object = i.getObject(); - + if (!(object instanceof TangibleObject)) { return; } - + performLocationUpdate((TangibleObject) object); } - - private void loadCities() { - cities.clear(); - try (SdbResultSet set = SdbLoader.load(new File("serverdata/map/cities.sdb"))) { - while (set.next()) { - Terrain t = Terrain.getTerrainFromName(set.getText("terrain")); - List list = cities.computeIfAbsent(t, k -> new ArrayList<>()); - list.add(new City(set.getText("city"), (int) set.getInt("x"), (int) set.getInt("z"), (int) set.getInt("radius"))); - } - } catch (IOException e) { - Log.e(e); - } - } - + private void performLocationUpdate(TangibleObject object) { - List list = cities.get(object.getTerrain()); - if (list == null) - return; // No cities on that planet - for (City city : list) { + Collection cities = ServerData.INSTANCE.getStaticCities().getCities(object.getTerrain()); + for (City city : cities) { if (city.isWithinRange(object)) { object.setCurrentCity(city.getName()); return; @@ -117,38 +83,5 @@ public class CityService extends Service { } object.setCurrentCity(""); } - - private static class City { - - private String name; - private int x; - private int z; - private int radius; - - public City(String name, int x, int z, int radius) { - this.name = name; - this.x = x; - this.z = z; - this.radius = radius; - } - - public String getName() { - return name; - } - - public boolean isWithinRange(SWGObject obj) { - return square((int) obj.getX() - x) + square((int) obj.getZ() - z) <= square(radius); - } - - @Override - public String toString() { - return String.format("City[%s, (%d, %d), radius=%d]", name, x, z, radius); - } - - private int square(int x) { - return x * x; - } - - } - + }