From 5de835558101e8bd8549610e88bbf5d22eea3e9d Mon Sep 17 00:00:00 2001 From: Undercova PSWG Date: Mon, 24 Aug 2015 12:28:06 +0000 Subject: [PATCH 01/11] README.md edited online with Bitbucket --- README.md | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index ba67d106..a40c4c07 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,6 @@ ### **Branch** ### -**Quality Assurance:** Upload your Pull Requests here so it can be tested - -**Development:** This is the main working space +**Quality Assurance:** Upload your Pull Requests here so it can be tested. This is the main working space **Master:** Tested and approved commits will be moved to this branch (Test Center) @@ -77,5 +75,4 @@ In order to successfully build and run Holocore, you must: * quest * snapshot * string - * terrain - + * terrain \ No newline at end of file From dbee9a97f7d91634eb3da66136d87c1d3bfd2da7 Mon Sep 17 00:00:00 2001 From: Mads Boddum Date: Wed, 26 Aug 2015 19:49:49 +0200 Subject: [PATCH 02/11] Created a SpawnType enum which will allow for type-specific spawner-behaviour --- src/resources/spawn/SpawnType.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/resources/spawn/SpawnType.java diff --git a/src/resources/spawn/SpawnType.java b/src/resources/spawn/SpawnType.java new file mode 100644 index 00000000..c3409959 --- /dev/null +++ b/src/resources/spawn/SpawnType.java @@ -0,0 +1,17 @@ +package resources.spawn; + +public enum SpawnType { + + EGG("object/tangible/spawning/shared_spawn_egg.iff"); + + private String objectTemplate; + + SpawnType(String objectTemplate) { + this.objectTemplate = objectTemplate; + } + + public String getObjectTemplate() { + return objectTemplate; + } + +} From 46040e41226ababcca1a9dcf8fa11b16a5b0e593 Mon Sep 17 00:00:00 2001 From: Mads Boddum Date: Wed, 26 Aug 2015 19:50:19 +0200 Subject: [PATCH 03/11] Created a Spawner class --- src/resources/spawn/Spawner.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/resources/spawn/Spawner.java diff --git a/src/resources/spawn/Spawner.java b/src/resources/spawn/Spawner.java new file mode 100644 index 00000000..54e57cd7 --- /dev/null +++ b/src/resources/spawn/Spawner.java @@ -0,0 +1,16 @@ +package resources.spawn; + +import resources.objects.SWGObject; + +public final class Spawner { + + private SWGObject spawnerObject; + + public Spawner(SWGObject spawnerObject) { + this.spawnerObject = spawnerObject; + } + + public SWGObject getSpawnerObject() { + return spawnerObject; + } +} From 3ef7c0ccc3e43547be6c644678f98e9279a4139a Mon Sep 17 00:00:00 2001 From: Mads Boddum Date: Wed, 26 Aug 2015 19:52:31 +0200 Subject: [PATCH 04/11] Created a SpawnerService which is responsible for placing the different types of spawners in the world --- serverdata/spawn/static.sdf | 2 + src/services/spawn/SpawnerService.java | 85 ++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 serverdata/spawn/static.sdf create mode 100644 src/services/spawn/SpawnerService.java diff --git a/serverdata/spawn/static.sdf b/serverdata/spawn/static.sdf new file mode 100644 index 00000000..7f7b8bf9 --- /dev/null +++ b/serverdata/spawn/static.sdf @@ -0,0 +1,2 @@ +SpawnID TerrainName SpawnerType BuildingID Cell x y z oX oY oZ oW active +i s s i s f f f f f f f i diff --git a/src/services/spawn/SpawnerService.java b/src/services/spawn/SpawnerService.java new file mode 100644 index 00000000..0c00b442 --- /dev/null +++ b/src/services/spawn/SpawnerService.java @@ -0,0 +1,85 @@ +package services.spawn; + +import java.util.ArrayList; +import java.util.Collection; + +import intents.server.ConfigChangedIntent; +import resources.Location; +import resources.Terrain; +import resources.client_info.ServerFactory; +import resources.client_info.visitors.DatatableData; +import resources.config.ConfigFile; +import resources.control.Intent; +import resources.control.Service; +import resources.objects.building.BuildingObject; +import resources.objects.SWGObject; +import resources.spawn.SpawnType; +import resources.spawn.Spawner; +import services.objects.ObjectManager; + +public final class SpawnEggService extends Service { + + private final ObjectManager objectManager; + private final Collection spawners; + + public SpawnEggService(ObjectManager objectManager) { + this.objectManager = objectManager; + spawners = new ArrayList<>(); + } + + @Override + public boolean initialize() { + registerForIntent(ConfigChangedIntent.TYPE); + + return super.initialize(); + } + + @Override + public void onIntentReceived(Intent i) { + ConfigChangedIntent cgi = (ConfigChangedIntent) i; + String newValue, oldValue; + + if(cgi.getChangedConfig().equals(ConfigFile.FEATURES)) + if(cgi.getKey().equals("SPAWNERS-ENABLED")) { + newValue = cgi.getNewValue(); + oldValue = cgi.getOldValue(); + + if(!newValue.equals(oldValue)) { + if(Boolean.valueOf(newValue) && spawners.isEmpty()) { // If nothing's been spawned, create it. + loadEggs(); + } else { // If anything's been spawned, delete it. + for(Spawner spawner : spawners) + objectManager.destroyObject(spawner.getSpawnerObject()); + + spawners.clear(); + } + } + } + + } + + public void loadEggs() { + DatatableData eggs = ServerFactory.getDatatable("spawn/static.iff"); + + eggs.handleRows(rowIndex -> { + final Location loc; + final int buildingId; + final SWGObject egg; + final SpawnType spawnType; + final boolean spawnInCell; + + if((Integer) eggs.getCell(rowIndex, 12) == 1) { // We only spawn active eggs + buildingId = (int) eggs.getCell(rowIndex, 3); + loc = new Location((float) eggs.getCell(rowIndex, 5), (float) eggs.getCell(rowIndex, 6), (float) eggs.getCell(rowIndex, 7), Terrain.valueOf((String) eggs.getCell(rowIndex, 1))); + spawnType = SpawnType.valueOf((String) eggs.getCell(rowIndex, 2)); + spawnInCell = buildingId != -1; + egg = objectManager.createObject(spawnType.getObjectTemplate(), loc, !spawnInCell, false); + + if(spawnInCell) // If it wants to be inside a building, make it so! + ((BuildingObject) objectManager.getObjectById(buildingId)).getCellByName((String) eggs.getCell(rowIndex, 4)).addObject(egg); + + spawners.add(new Spawner(egg)); + } + }); + } +} From 5cb25bc4ce65b0f4e41fb0ecc1068ad65c45f8a0 Mon Sep 17 00:00:00 2001 From: Mads Boddum Date: Wed, 26 Aug 2015 19:53:30 +0200 Subject: [PATCH 05/11] Added SpawnerService to the ObjectManager --- src/services/objects/ObjectManager.java | 12 ++++++++++++ src/services/spawn/SpawnerService.java | 4 ++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/services/objects/ObjectManager.java b/src/services/objects/ObjectManager.java index 2d586f15..e59c9d83 100644 --- a/src/services/objects/ObjectManager.java +++ b/src/services/objects/ObjectManager.java @@ -73,12 +73,14 @@ import resources.server_info.ObjectDatabase; import resources.server_info.ObjectDatabase.Traverser; import services.map.MapManager; import services.player.PlayerManager; +import services.spawn.SpawnerService; import services.spawn.StaticService; public class ObjectManager extends Manager { private final MapManager mapService; private final StaticService staticService; + private final SpawnerService spawnEggService; private final RadialService radialService; private final ObjectDatabase database; @@ -89,6 +91,7 @@ public class ObjectManager extends Manager { public ObjectManager() { mapService = new MapManager(); staticService = new StaticService(this); + spawnEggService = new SpawnerService(this); radialService = new RadialService(); database = new CachedObjectDatabase("odb/objects.db"); objectAwareness = new ObjectAwareness(); @@ -98,6 +101,7 @@ public class ObjectManager extends Manager { addChildService(mapService); addChildService(staticService); addChildService(radialService); + addChildService(spawnEggService); } @Override @@ -110,11 +114,19 @@ public class ObjectManager extends Manager { registerForIntent(DeleteCharacterIntent.TYPE); objectAwareness.initialize(); loadClientObjects(); + loadSpawners(); maxObjectId = 1000000000; // Gets over all the buildouts/snapshots loadObjects(); return super.initialize(); } + private void loadSpawners() { + Config c = getConfig(ConfigFile.FEATURES); + if (c.getBoolean("SPAWNERS-ENABLED", true)) { + spawnEggService.loadEggs(); + } + } + private void loadObjects() { long startLoad = System.nanoTime(); Log.i("ObjectManager", "Loading objects from ObjectDatabase..."); diff --git a/src/services/spawn/SpawnerService.java b/src/services/spawn/SpawnerService.java index 0c00b442..290fdbcf 100644 --- a/src/services/spawn/SpawnerService.java +++ b/src/services/spawn/SpawnerService.java @@ -17,12 +17,12 @@ import resources.spawn.SpawnType; import resources.spawn.Spawner; import services.objects.ObjectManager; -public final class SpawnEggService extends Service { +public final class SpawnerService extends Service { private final ObjectManager objectManager; private final Collection spawners; - public SpawnEggService(ObjectManager objectManager) { + public SpawnerService(ObjectManager objectManager) { this.objectManager = objectManager; spawners = new ArrayList<>(); } From e158f30f3cca70d6c6297ac1b53b9efd976f3bed Mon Sep 17 00:00:00 2001 From: Mads Boddum Date: Wed, 26 Aug 2015 19:56:52 +0200 Subject: [PATCH 06/11] Renamed the spawnEggService field in ObjectManager to spawnerService --- src/services/objects/ObjectManager.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/services/objects/ObjectManager.java b/src/services/objects/ObjectManager.java index e59c9d83..2a921967 100644 --- a/src/services/objects/ObjectManager.java +++ b/src/services/objects/ObjectManager.java @@ -80,7 +80,7 @@ public class ObjectManager extends Manager { private final MapManager mapService; private final StaticService staticService; - private final SpawnerService spawnEggService; + private final SpawnerService spawnerService; private final RadialService radialService; private final ObjectDatabase database; @@ -91,7 +91,7 @@ public class ObjectManager extends Manager { public ObjectManager() { mapService = new MapManager(); staticService = new StaticService(this); - spawnEggService = new SpawnerService(this); + spawnerService = new SpawnerService(this); radialService = new RadialService(); database = new CachedObjectDatabase("odb/objects.db"); objectAwareness = new ObjectAwareness(); @@ -101,7 +101,7 @@ public class ObjectManager extends Manager { addChildService(mapService); addChildService(staticService); addChildService(radialService); - addChildService(spawnEggService); + addChildService(spawnerService); } @Override @@ -123,7 +123,7 @@ public class ObjectManager extends Manager { private void loadSpawners() { Config c = getConfig(ConfigFile.FEATURES); if (c.getBoolean("SPAWNERS-ENABLED", true)) { - spawnEggService.loadEggs(); + spawnerService.loadEggs(); } } From 65babac422344e2b0628f2c6d3cd12f6ef54702b Mon Sep 17 00:00:00 2001 From: Mads Boddum Date: Thu, 27 Aug 2015 01:19:59 +0200 Subject: [PATCH 07/11] Added missing license headers to spawner-related classes and enums --- src/resources/spawn/SpawnType.java | 27 ++++++++++++++++++++++++++ src/resources/spawn/Spawner.java | 27 ++++++++++++++++++++++++++ src/services/spawn/SpawnerService.java | 27 ++++++++++++++++++++++++++ 3 files changed, 81 insertions(+) diff --git a/src/resources/spawn/SpawnType.java b/src/resources/spawn/SpawnType.java index c3409959..fa8ea7ea 100644 --- a/src/resources/spawn/SpawnType.java +++ b/src/resources/spawn/SpawnType.java @@ -1,3 +1,30 @@ +/*********************************************************************************** +* Copyright (c) 2015 /// 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 resources.spawn; public enum SpawnType { diff --git a/src/resources/spawn/Spawner.java b/src/resources/spawn/Spawner.java index 54e57cd7..beccc8bf 100644 --- a/src/resources/spawn/Spawner.java +++ b/src/resources/spawn/Spawner.java @@ -1,3 +1,30 @@ +/*********************************************************************************** +* Copyright (c) 2015 /// 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 resources.spawn; import resources.objects.SWGObject; diff --git a/src/services/spawn/SpawnerService.java b/src/services/spawn/SpawnerService.java index 290fdbcf..af60d68b 100644 --- a/src/services/spawn/SpawnerService.java +++ b/src/services/spawn/SpawnerService.java @@ -1,3 +1,30 @@ +/*********************************************************************************** +* Copyright (c) 2015 /// 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 services.spawn; import java.util.ArrayList; From 5d2990386415dbd56499410143a0b1e9a711cec4 Mon Sep 17 00:00:00 2001 From: Mads Boddum Date: Thu, 27 Aug 2015 01:21:12 +0200 Subject: [PATCH 08/11] The loading of spawners now happens within initialization() of SpawnerService instead of in ObjectManager --- src/services/objects/ObjectManager.java | 8 -------- src/services/spawn/SpawnerService.java | 3 +++ 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/services/objects/ObjectManager.java b/src/services/objects/ObjectManager.java index 2a921967..e5b26942 100644 --- a/src/services/objects/ObjectManager.java +++ b/src/services/objects/ObjectManager.java @@ -114,19 +114,11 @@ public class ObjectManager extends Manager { registerForIntent(DeleteCharacterIntent.TYPE); objectAwareness.initialize(); loadClientObjects(); - loadSpawners(); maxObjectId = 1000000000; // Gets over all the buildouts/snapshots loadObjects(); return super.initialize(); } - private void loadSpawners() { - Config c = getConfig(ConfigFile.FEATURES); - if (c.getBoolean("SPAWNERS-ENABLED", true)) { - spawnerService.loadEggs(); - } - } - private void loadObjects() { long startLoad = System.nanoTime(); Log.i("ObjectManager", "Loading objects from ObjectDatabase..."); diff --git a/src/services/spawn/SpawnerService.java b/src/services/spawn/SpawnerService.java index af60d68b..524d03dd 100644 --- a/src/services/spawn/SpawnerService.java +++ b/src/services/spawn/SpawnerService.java @@ -58,6 +58,9 @@ public final class SpawnerService extends Service { public boolean initialize() { registerForIntent(ConfigChangedIntent.TYPE); + if (getConfig(ConfigFile.FEATURES).getBoolean("SPAWNERS-ENABLED", true)) + loadEggs(); + return super.initialize(); } From fd50f9bb9b149f2d1aab60152e63bf82b7e2e6f6 Mon Sep 17 00:00:00 2001 From: Mads Boddum Date: Thu, 27 Aug 2015 01:39:10 +0200 Subject: [PATCH 09/11] loadEggs in SpawnerService is now a private method --- src/services/spawn/SpawnerService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/spawn/SpawnerService.java b/src/services/spawn/SpawnerService.java index 524d03dd..0d64eebb 100644 --- a/src/services/spawn/SpawnerService.java +++ b/src/services/spawn/SpawnerService.java @@ -88,7 +88,7 @@ public final class SpawnerService extends Service { } - public void loadEggs() { + private void loadEggs() { DatatableData eggs = ServerFactory.getDatatable("spawn/static.iff"); eggs.handleRows(rowIndex -> { From aabc55f15b0dab3de251bab46d59097b730f9193 Mon Sep 17 00:00:00 2001 From: Mads Boddum Date: Thu, 27 Aug 2015 01:40:38 +0200 Subject: [PATCH 10/11] Reduced space usage in SpawnerService --- src/services/spawn/SpawnerService.java | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/services/spawn/SpawnerService.java b/src/services/spawn/SpawnerService.java index 0d64eebb..1fbdc491 100644 --- a/src/services/spawn/SpawnerService.java +++ b/src/services/spawn/SpawnerService.java @@ -92,18 +92,12 @@ public final class SpawnerService extends Service { DatatableData eggs = ServerFactory.getDatatable("spawn/static.iff"); eggs.handleRows(rowIndex -> { - final Location loc; - final int buildingId; - final SWGObject egg; - final SpawnType spawnType; - final boolean spawnInCell; - if((Integer) eggs.getCell(rowIndex, 12) == 1) { // We only spawn active eggs - buildingId = (int) eggs.getCell(rowIndex, 3); - loc = new Location((float) eggs.getCell(rowIndex, 5), (float) eggs.getCell(rowIndex, 6), (float) eggs.getCell(rowIndex, 7), Terrain.valueOf((String) eggs.getCell(rowIndex, 1))); - spawnType = SpawnType.valueOf((String) eggs.getCell(rowIndex, 2)); - spawnInCell = buildingId != -1; - egg = objectManager.createObject(spawnType.getObjectTemplate(), loc, !spawnInCell, false); + final int buildingId = (int) eggs.getCell(rowIndex, 3); + final Location loc = new Location((float) eggs.getCell(rowIndex, 5), (float) eggs.getCell(rowIndex, 6), (float) eggs.getCell(rowIndex, 7), Terrain.valueOf((String) eggs.getCell(rowIndex, 1))); + final SpawnType spawnType = SpawnType.valueOf((String) eggs.getCell(rowIndex, 2)); + final boolean spawnInCell = buildingId != -1; + final SWGObject egg = objectManager.createObject(spawnType.getObjectTemplate(), loc, !spawnInCell, false); if(spawnInCell) // If it wants to be inside a building, make it so! ((BuildingObject) objectManager.getObjectById(buildingId)).getCellByName((String) eggs.getCell(rowIndex, 4)).addObject(egg); From be455bdfc93d15dbbe1a958e9ca0ff2aa43c6f69 Mon Sep 17 00:00:00 2001 From: Mads Boddum Date: Thu, 27 Aug 2015 19:04:34 +0200 Subject: [PATCH 11/11] Spawners that are placed in the world should now have a building id of 0 instead of -1 --- src/services/spawn/SpawnerService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/spawn/SpawnerService.java b/src/services/spawn/SpawnerService.java index 1fbdc491..ff89f6bb 100644 --- a/src/services/spawn/SpawnerService.java +++ b/src/services/spawn/SpawnerService.java @@ -96,7 +96,7 @@ public final class SpawnerService extends Service { final int buildingId = (int) eggs.getCell(rowIndex, 3); final Location loc = new Location((float) eggs.getCell(rowIndex, 5), (float) eggs.getCell(rowIndex, 6), (float) eggs.getCell(rowIndex, 7), Terrain.valueOf((String) eggs.getCell(rowIndex, 1))); final SpawnType spawnType = SpawnType.valueOf((String) eggs.getCell(rowIndex, 2)); - final boolean spawnInCell = buildingId != -1; + final boolean spawnInCell = buildingId != 0; final SWGObject egg = objectManager.createObject(spawnType.getObjectTemplate(), loc, !spawnInCell, false); if(spawnInCell) // If it wants to be inside a building, make it so!