From f968e0dfc733fed128da8f967e8c76fb09f81ac2 Mon Sep 17 00:00:00 2001 From: Obique PSWG Date: Wed, 6 Jan 2016 21:49:29 -0600 Subject: [PATCH] Changed Holocore to be limited to a single galaxy --- src/intents/GalacticIntent.java | 11 -- src/intents/PlayerEventIntent.java | 9 -- src/intents/RequestZoneInIntent.java | 14 +-- src/main/ProjectSWG.java | 10 -- .../packets/swg/login/LoginClusterStatus.java | 1 - src/resources/Galaxy.java | 79 +++++++++----- src/resources/objects/SWGObject.java | 3 +- src/resources/player/Player.java | 10 -- src/services/CoreManager.java | 100 ++++++++---------- src/services/EngineManager.java | 5 +- src/services/chat/ChatMailService.java | 10 +- src/services/chat/ChatManager.java | 5 +- src/services/chat/ChatRoomService.java | 16 +-- src/services/galaxy/ConnectionService.java | 38 +------ src/services/galaxy/GalacticManager.java | 26 +---- src/services/network/NetworkManager.java | 3 +- src/services/objects/ObjectAwareness.java | 10 +- src/services/objects/ObjectManager.java | 7 +- .../player/CharacterCreationService.java | 3 +- src/services/player/LoginService.java | 91 +++------------- src/services/player/ZoneManager.java | 8 +- 21 files changed, 155 insertions(+), 304 deletions(-) diff --git a/src/intents/GalacticIntent.java b/src/intents/GalacticIntent.java index 280b6044..ca62db58 100644 --- a/src/intents/GalacticIntent.java +++ b/src/intents/GalacticIntent.java @@ -27,7 +27,6 @@ ***********************************************************************************/ package intents; -import resources.Galaxy; import resources.control.Intent; import services.galaxy.GalacticManager; import services.objects.ObjectManager; @@ -36,7 +35,6 @@ import services.player.PlayerManager; public abstract class GalacticIntent extends Intent { private GalacticManager galacticManager; - private Galaxy galaxy; protected GalacticIntent(String type) { super(type); @@ -45,17 +43,12 @@ public abstract class GalacticIntent extends Intent { protected GalacticIntent(GalacticIntent i) { super(i.getType()); setGalacticManager(i.getGalacticManager()); - setGalaxy(i.getGalaxy()); } public void setGalacticManager(GalacticManager galacticManager) { this.galacticManager = galacticManager; } - public void setGalaxy(Galaxy galaxy) { - this.galaxy = galaxy; - } - public ObjectManager getObjectManager() { return galacticManager.getObjectManager(); } @@ -68,8 +61,4 @@ public abstract class GalacticIntent extends Intent { return galacticManager; } - public Galaxy getGalaxy() { - return galaxy; - } - } diff --git a/src/intents/PlayerEventIntent.java b/src/intents/PlayerEventIntent.java index 03f0bfd7..246c58eb 100644 --- a/src/intents/PlayerEventIntent.java +++ b/src/intents/PlayerEventIntent.java @@ -37,7 +37,6 @@ public class PlayerEventIntent extends Intent { private Player player; private PlayerEvent event; - private String galaxy; public PlayerEventIntent(Player p, PlayerEvent event) { super(TYPE); @@ -45,11 +44,6 @@ public class PlayerEventIntent extends Intent { setEvent(event); } - public PlayerEventIntent(Player p, String galaxy, PlayerEvent event) { - this(p, event); - this.galaxy = galaxy; - } - public void setPlayer(Player p) { this.player = p; } @@ -66,7 +60,4 @@ public class PlayerEventIntent extends Intent { return event; } - public String getGalaxy() { - return galaxy; - } } diff --git a/src/intents/RequestZoneInIntent.java b/src/intents/RequestZoneInIntent.java index e9324415..c1822e26 100644 --- a/src/intents/RequestZoneInIntent.java +++ b/src/intents/RequestZoneInIntent.java @@ -37,13 +37,13 @@ public class RequestZoneInIntent extends Intent { private Player player; private CreatureObject creature; - private String galaxy; + private boolean firstZone; - public RequestZoneInIntent(Player player, CreatureObject creature, String galaxy) { + public RequestZoneInIntent(Player player, CreatureObject creature, boolean firstZone) { super(TYPE); setPlayer(player); setCreature(creature); - setGalaxy(galaxy); + setFirstZone(firstZone); } public void setPlayer(Player player) { @@ -54,8 +54,8 @@ public class RequestZoneInIntent extends Intent { this.creature = creature; } - public void setGalaxy(String galaxy) { - this.galaxy = galaxy; + public void setFirstZone(boolean firstZone) { + this.firstZone = firstZone; } public Player getPlayer() { @@ -66,8 +66,8 @@ public class RequestZoneInIntent extends Intent { return creature; } - public String getGalaxy() { - return galaxy; + public boolean isFirstZone() { + return firstZone; } } diff --git a/src/main/ProjectSWG.java b/src/main/ProjectSWG.java index 8e67afd4..3d2a71e6 100644 --- a/src/main/ProjectSWG.java +++ b/src/main/ProjectSWG.java @@ -69,16 +69,6 @@ public class ProjectSWG { return (long) server.manager.getCoreTime(); } - /** - * Returns the server's galaxy ID. This may be - * deprecated in the future if multiple servers are run - * at once. - * @return the server's galaxy ID - */ - public static final int getGalaxyId() { - return CoreManager.getGalaxyId(); - } - /** * Returns the server's galactic time. This is the official time sent to * the client and should be used for any official client-time purposes. diff --git a/src/network/packets/swg/login/LoginClusterStatus.java b/src/network/packets/swg/login/LoginClusterStatus.java index 228adc8f..fd69d7f5 100644 --- a/src/network/packets/swg/login/LoginClusterStatus.java +++ b/src/network/packets/swg/login/LoginClusterStatus.java @@ -56,7 +56,6 @@ public class LoginClusterStatus extends SWGPacket { g.setZonePort(getShort(data)); g.setPingPort(getShort(data)); g.setPopulation(getInt(data)); - g.setPopulationStatus(getInt(data)); g.setMaxCharacters(getInt(data)); g.setTimeZone(getInt(data)); g.setStatus(getInt(data)); diff --git a/src/resources/Galaxy.java b/src/resources/Galaxy.java index c39d87ab..983b3227 100644 --- a/src/resources/Galaxy.java +++ b/src/resources/Galaxy.java @@ -30,13 +30,20 @@ package resources; public class Galaxy { + // Population status values. Values are in percent. + private static final double VERY_LIGHT = 10; + private static final double LIGHT = 20; + private static final double MEDIUM = 30; + private static final double HEAVY = 40; + private static final double VERY_HEAVY = 50; + private static final double EXTREMELY_HEAVY = 100; + private int id = 0; private String name = ""; private String address = ""; private int zonePort = 44463; private int pingPort = 44462; private int population = 0; - private int popStatus = 0; private GalaxyStatus status = GalaxyStatus.DOWN; private int timeZone = 0; private int maxCharacters = 0; @@ -48,37 +55,53 @@ public class Galaxy { } - public int getId() { return id; } - public String getName() { return name; } - public String getAddress() { return address; } - public int getZonePort() { return zonePort; } - public int getPingPort() { return pingPort; } - public int getPopulation() { return population; } - public int getPopulationStatus() { return popStatus; } - public GalaxyStatus getStatus() { return status; } - public int getTimeZone() { return timeZone; } - public int getMaxCharacters() { return maxCharacters; } - public int getOnlinePlayerLimit() { return onlinePlayerLimit; } - public int getOnlineFreeTrialLimit() { return onlineFreeTrialLimit; } - public boolean isRecommended() { return recommended; } + public synchronized int getId() { return id; } + public synchronized String getName() { return name; } + public synchronized String getAddress() { return address; } + public synchronized int getZonePort() { return zonePort; } + public synchronized int getPingPort() { return pingPort; } + public synchronized int getPopulation() { return population; } + public synchronized GalaxyStatus getStatus() { return status; } + public synchronized int getTimeZone() { return timeZone; } + public synchronized int getMaxCharacters() { return maxCharacters; } + public synchronized int getOnlinePlayerLimit() { return onlinePlayerLimit; } + public synchronized int getOnlineFreeTrialLimit() { return onlineFreeTrialLimit; } + public synchronized boolean isRecommended() { return recommended; } - public void setId(int id) { this.id = id; } - public void setName(String name) { this.name = name; } - public void setAddress(String addr) { this.address = addr; } - public void setZonePort(int port) { this.zonePort = port; } - public void setPingPort(int port) { this.pingPort = port; } - public void setPopulation(int population) { this.population = population; } - public void setPopulationStatus(int status) { this.popStatus = status; } - public void setStatus(GalaxyStatus status) { this.status = status; } - public void setTimeZone(int timeZone) { this.timeZone = timeZone; } - public void setMaxCharacters(int max) { this.maxCharacters = max; } - public void setOnlinePlayerLimit(int max) { this.onlinePlayerLimit = max; } - public void setOnlineFreeTrialLimit(int max) { this.onlineFreeTrialLimit = max; } - public void setRecommended(boolean r) { this.recommended = r; } + public synchronized int getPopulationStatus() { + if (population < VERY_LIGHT) + return 0; + else if(population < LIGHT) + return 1; + else if(population < MEDIUM) + return 2; + else if(population < HEAVY) + return 3; + else if(population < VERY_HEAVY) + return 4; + else if(population < EXTREMELY_HEAVY) + return 5; + return 6; + } + + public synchronized void setId(int id) { this.id = id; } + public synchronized void setName(String name) { this.name = name; } + public synchronized void setAddress(String addr) { this.address = addr; } + public synchronized void setZonePort(int port) { this.zonePort = port; } + public synchronized void setPingPort(int port) { this.pingPort = port; } + public synchronized void setPopulation(int population) { this.population = population; } + public synchronized void setStatus(GalaxyStatus status) { this.status = status; } + public synchronized void setTimeZone(int timeZone) { this.timeZone = timeZone; } + public synchronized void setMaxCharacters(int max) { this.maxCharacters = max; } + public synchronized void setOnlinePlayerLimit(int max) { this.onlinePlayerLimit = max; } + public synchronized void setOnlineFreeTrialLimit(int max) { this.onlineFreeTrialLimit = max; } + public synchronized void setRecommended(boolean r) { this.recommended = r; } + public synchronized void incrementPopulationCount() { population++; } + public synchronized void decrementPopulationCount() { population--; } public String toString() { return String.format("Galaxy[ID=%d Name=%s Address=%s Zone=%d Ping=%d Pop=%d PopStat=%d Status=%s Time=%d Max=%d Rec=%b]", - id, name, address, zonePort, pingPort, population, popStatus, status, timeZone, maxCharacters, recommended); + id, name, address, zonePort, pingPort, population, getPopulationStatus(), status, timeZone, maxCharacters, recommended); } public void setStatus(int status) { diff --git a/src/resources/objects/SWGObject.java b/src/resources/objects/SWGObject.java index 0788d5ea..a3cacc4e 100644 --- a/src/resources/objects/SWGObject.java +++ b/src/resources/objects/SWGObject.java @@ -52,6 +52,7 @@ import resources.objects.creature.CreatureObject; import resources.player.Player; import resources.player.PlayerState; import resources.server_info.Log; +import services.CoreManager; import utilities.Encoder.StringType; import java.io.IOException; @@ -956,7 +957,7 @@ public abstract class SWGObject implements Serializable, Comparable { } public void createBaseline6(Player target, BaselineBuilder bb) { - bb.addInt(target.getGalaxyId()); // 0 + bb.addInt(CoreManager.getGalaxyId()); // 0 bb.addObject(detailStringId); // 1 bb.incrementOperandCount(2); diff --git a/src/resources/player/Player.java b/src/resources/player/Player.java index a646c21e..ee7f924f 100644 --- a/src/resources/player/Player.java +++ b/src/resources/player/Player.java @@ -34,7 +34,6 @@ import resources.control.Service; import resources.objects.SWGObject; import resources.objects.creature.CreatureObject; import resources.objects.player.PlayerObject; -import services.CoreManager; import services.player.PlayerManager; public class Player implements Serializable, Comparable { @@ -52,7 +51,6 @@ public class Player implements Serializable, Comparable { private int connectionId = 0; private AccessLevel accessLevel = AccessLevel.PLAYER; - private int galaxyId = CoreManager.getGalaxyId(); private String galaxyName = ""; private CreatureObject creatureObject= null; private long lastInboundMessage = 0; @@ -102,10 +100,6 @@ public class Player implements Serializable, Comparable { this.accessLevel = accessLevel; } - public void setGalaxyId(int galaxyId) { - this.galaxyId = galaxyId; - } - public void setGalaxyName(String galaxyName) { this.galaxyName = galaxyName; } @@ -152,10 +146,6 @@ public class Player implements Serializable, Comparable { return accessLevel; } - public int getGalaxyId() { - return galaxyId; - } - public String getGalaxyName() { return galaxyName; } diff --git a/src/services/CoreManager.java b/src/services/CoreManager.java index 96641fe0..12a2a164 100644 --- a/src/services/CoreManager.java +++ b/src/services/CoreManager.java @@ -27,9 +27,6 @@ ***********************************************************************************/ package services; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -53,31 +50,31 @@ import utilities.ThreadUtilities; public class CoreManager extends Manager { - private static final int galaxyId = 1; + private static final Galaxy GALAXY = new Galaxy(); + private static final int GALAXY_ID = 1; private final ScheduledExecutorService shutdownService; private OnlineInterfaceService onlineInterfaceService; private EngineManager engineManager; private GalacticManager galacticManager; - private Galaxy galaxy; private long startTime; private boolean shutdownRequested; public CoreManager() { - Log.setLogLevel(LogLevel.valueOf(getConfig(ConfigFile.PRIMARY).getString("LOG-LEVEL", LogLevel.DEBUG.name()))); + Config c = getConfig(ConfigFile.PRIMARY); + Log.setLogLevel(LogLevel.valueOf(c.getString("LOG-LEVEL", LogLevel.DEBUG.name()))); + setupGalaxy(c); shutdownService = Executors.newSingleThreadScheduledExecutor(ThreadUtilities.newThreadFactory("core-shutdown-service")); shutdownRequested = false; - galaxy = getGalaxy(); - if (galaxy != null) { - onlineInterfaceService = new OnlineInterfaceService(); - engineManager = new EngineManager(galaxy); - galacticManager = new GalacticManager(galaxy); - - addChildService(onlineInterfaceService); - addChildService(engineManager); - addChildService(galacticManager); - } + onlineInterfaceService = new OnlineInterfaceService(); + engineManager = new EngineManager(); + galacticManager = new GalacticManager(); + + addChildService(onlineInterfaceService); + addChildService(engineManager); + addChildService(galacticManager); + registerForIntent(InboundPacketIntent.TYPE); registerForIntent(OutboundPacketIntent.TYPE); registerForIntent(ServerManagementIntent.TYPE); @@ -98,12 +95,19 @@ public class CoreManager extends Manager { @Override public boolean initialize() { startTime = System.nanoTime(); - return galaxy != null && super.initialize(); + GALAXY.setStatus(GalaxyStatus.LOADING); + return super.initialize(); + } + + @Override + public boolean start() { + GALAXY.setStatus(GalaxyStatus.UP); + return super.start(); } @Override public boolean stop() { - galaxy.setStatus(GalaxyStatus.LOCKED); + GALAXY.setStatus(GalaxyStatus.LOCKED); return super.stop(); } @@ -146,7 +150,7 @@ public class CoreManager extends Manager { } public GalaxyStatus getGalaxyStatus() { - return galaxy.getStatus(); + return GALAXY.getStatus(); } /** @@ -157,47 +161,27 @@ public class CoreManager extends Manager { return (System.nanoTime()-startTime)/1E6; } - private Galaxy getGalaxy() { - PreparedStatement getGalaxy = getLocalDatabase().prepareStatement("SELECT * FROM galaxies WHERE id = ?"); - Config c = getConfig(ConfigFile.PRIMARY); - ResultSet set = null; - try { - getGalaxy.setInt(1, galaxyId); - set = getGalaxy.executeQuery(); - if (!set.next()) { - System.err.println("CoreManager: No such galaxy exists with ID " + galaxyId + "!"); - return null; - } - Galaxy g = new Galaxy(); - g.setId(set.getInt("id")); - g.setName(set.getString("name")); - g.setAddress(set.getString("address")); - g.setPopulation(set.getInt("population")); - g.setTimeZone(set.getInt("timezone")); - g.setZonePort(set.getInt("zone_port")); - g.setPingPort(set.getInt("ping_port")); - g.setStatus(set.getInt("status")); - g.setMaxCharacters(c.getInt("GALAXY-MAX-CHARACTERS", 2)); - g.setOnlinePlayerLimit(c.getInt("GALAXY-MAX-ONLINE", 3000)); - g.setOnlineFreeTrialLimit(c.getInt("GALAXY-MAX-ONLINE", 3000)); - g.setRecommended(true); - return g; - } catch (SQLException e) { - e.printStackTrace(); - } finally { - if (set != null) { - try { - set.close(); - } catch (SQLException e) { - e.printStackTrace(); - } - } - } - return null; + public static Galaxy getGalaxy() { + return GALAXY; } - public static final int getGalaxyId() { - return galaxyId; + public static int getGalaxyId() { + return GALAXY_ID; + } + + private static void setupGalaxy(Config c) { + GALAXY.setId(GALAXY_ID); + GALAXY.setName(c.getString("GALAXY-NAME", "Holocore")); + GALAXY.setAddress(""); + GALAXY.setPopulation(0); + GALAXY.setTimeZone(c.getInt("GALAXY-TIMEZONE", -6)); + GALAXY.setZonePort(0); + GALAXY.setPingPort(0); + GALAXY.setStatus(GalaxyStatus.DOWN); + GALAXY.setMaxCharacters(c.getInt("GALAXY-MAX-CHARACTERS", 2)); + GALAXY.setOnlinePlayerLimit(c.getInt("GALAXY-MAX-ONLINE", 3000)); + GALAXY.setOnlineFreeTrialLimit(c.getInt("GALAXY-MAX-ONLINE", 3000)); + GALAXY.setRecommended(true); } } diff --git a/src/services/EngineManager.java b/src/services/EngineManager.java index 7a084d0c..4dbcdeff 100644 --- a/src/services/EngineManager.java +++ b/src/services/EngineManager.java @@ -30,7 +30,6 @@ package services; import java.io.File; import java.io.IOException; -import resources.Galaxy; import resources.client_info.ServerFactory; import resources.config.ConfigFile; import resources.control.Manager; @@ -43,8 +42,8 @@ public class EngineManager extends Manager { private ShutdownService shutdownService; private NetworkManager networkManager; - public EngineManager(Galaxy galaxy) { - networkManager = new NetworkManager(galaxy); + public EngineManager() { + networkManager = new NetworkManager(); shutdownService = new ShutdownService(); addChildService(networkManager); diff --git a/src/services/chat/ChatMailService.java b/src/services/chat/ChatMailService.java index 51d7ee18..215bc4b5 100644 --- a/src/services/chat/ChatMailService.java +++ b/src/services/chat/ChatMailService.java @@ -29,6 +29,7 @@ import resources.server_info.CachedObjectDatabase; import resources.server_info.ObjectDatabase; import resources.server_info.RelationalServerData; import resources.server_info.RelationalServerFactory; +import services.CoreManager; import services.chat.ChatManager.ChatRange; import services.chat.ChatManager.ChatType; import services.player.PlayerManager; @@ -92,7 +93,7 @@ public class ChatMailService extends Service { switch (intent.getEvent()) { case PE_FIRST_ZONE: - sendPersistentMessageHeaders(player, intent.getGalaxy()); + sendPersistentMessageHeaders(player); break; default: break; @@ -107,7 +108,7 @@ public class ChatMailService extends Service { if (!(p instanceof SWGPacket)) return; SWGPacket swg = (SWGPacket) p; - String galaxyName = intent.getGalaxy().getName(); + String galaxyName = CoreManager.getGalaxy().getName(); switch (swg.getPacketType()) { /* Mails */ case CHAT_PERSISTENT_MESSAGE_TO_SERVER: @@ -147,7 +148,7 @@ public class ChatMailService extends Service { if (result != ChatResult.SUCCESS) return; - Mail mail = new Mail(sender.getCharacterName().split(" ")[0].toLowerCase(), request.getSubject(), request.getMessage(), recId); + Mail mail = new Mail(sender.getCharacterName().split(" ")[0].toLowerCase(Locale.US), request.getSubject(), request.getMessage(), recId); mail.setId(maxMailId++); mail.setTimestamp((int) (new Date().getTime() / 1000)); mail.setOutOfBandPackage(request.getOutOfBandPackage()); @@ -193,7 +194,7 @@ public class ChatMailService extends Service { sendPersistentMessage(player, mail, MailFlagType.FULL_MESSAGE, galaxy); } - private void sendPersistentMessageHeaders(Player player, String galaxy) { + private void sendPersistentMessageHeaders(Player player) { if (player == null || player.getCreatureObject() == null) return; @@ -205,6 +206,7 @@ public class ChatMailService extends Service { playersMail.add(element); }); + String galaxy = CoreManager.getGalaxy().getName(); for (Mail mail : playersMail) sendPersistentMessage(player, mail, MailFlagType.HEADER_ONLY, galaxy); } diff --git a/src/services/chat/ChatManager.java b/src/services/chat/ChatManager.java index f4e0ccc9..89f7cf9d 100644 --- a/src/services/chat/ChatManager.java +++ b/src/services/chat/ChatManager.java @@ -41,7 +41,6 @@ import network.packets.swg.SWGPacket; import network.packets.swg.zone.chat.*; import network.packets.swg.zone.chat.ChatSystemMessage.SystemChatType; import network.packets.swg.zone.object_controller.SpatialChat; -import resources.Galaxy; import resources.Terrain; import resources.chat.ChatAvatar; import resources.chat.ChatResult; @@ -69,8 +68,8 @@ public class ChatManager extends Manager { private final RelationalServerData chatLogs; private final PreparedStatement insertChatLog; - public ChatManager(Galaxy g) { - roomService = new ChatRoomService(g); + public ChatManager() { + roomService = new ChatRoomService(); mailService = new ChatMailService(); chatLogs = RelationalServerFactory.getServerDatabase("chat/chat_log.db"); insertChatLog = chatLogs.prepareStatement("INSERT INTO chat_log VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); diff --git a/src/services/chat/ChatRoomService.java b/src/services/chat/ChatRoomService.java index 15528847..71d9ed9d 100644 --- a/src/services/chat/ChatRoomService.java +++ b/src/services/chat/ChatRoomService.java @@ -62,7 +62,6 @@ import network.packets.swg.zone.chat.ChatSendToRoom; import network.packets.swg.zone.chat.ChatUnbanAvatarFromRoom; import network.packets.swg.zone.chat.ChatUninviteFromRoom; import network.packets.swg.zone.insertion.ChatRoomList; -import resources.Galaxy; import resources.Terrain; import resources.chat.ChatAvatar; import resources.chat.ChatResult; @@ -78,6 +77,7 @@ import resources.server_info.CachedObjectDatabase; import resources.server_info.ObjectDatabase; import resources.server_info.RelationalServerData; import resources.server_info.RelationalServerFactory; +import services.CoreManager; import services.chat.ChatManager.ChatRange; import services.chat.ChatManager.ChatType; import services.player.PlayerManager; @@ -100,11 +100,9 @@ public class ChatRoomService extends Service { private final Map roomMap; private final RelationalServerData chatLogs; private final PreparedStatement insertChatLog; - private final Galaxy galaxy; private int maxChatRoomId; - public ChatRoomService(Galaxy g) { - galaxy = g; + public ChatRoomService() { database = new CachedObjectDatabase<>("odb/chat_rooms.db"); roomMap = new ConcurrentHashMap<>(); messages = new ConcurrentHashMap<>(); @@ -126,7 +124,7 @@ public class ChatRoomService extends Service { roomMap.put(room.getId(), room); }); - createSystemChannels(galaxy.getName()); + createSystemChannels(CoreManager.getGalaxy().getName()); return super.initialize(); } @@ -134,10 +132,12 @@ public class ChatRoomService extends Service { public void onIntentReceived(Intent i) { switch(i.getType()) { case ChatRoomUpdateIntent.TYPE: - processChatRoomUpdateIntent((ChatRoomUpdateIntent) i); + if (i instanceof ChatRoomUpdateIntent) + processChatRoomUpdateIntent((ChatRoomUpdateIntent) i); break; case GalacticPacketIntent.TYPE: - processPacket((GalacticPacketIntent) i); + if (i instanceof GalacticPacketIntent) + processPacket((GalacticPacketIntent) i); break; case PlayerEventIntent.TYPE: if (i instanceof PlayerEventIntent) @@ -707,7 +707,7 @@ public class ChatRoomService extends Service { return getRoom(path); // All paths should have parents, lets validate to make sure they exist first. Create them if they don't. - int lastIndex = path.lastIndexOf("."); + int lastIndex = path.lastIndexOf('.'); if (lastIndex != -1) { String parentPath = path.substring(0, lastIndex); if (getRoom(parentPath) == null) { diff --git a/src/services/galaxy/ConnectionService.java b/src/services/galaxy/ConnectionService.java index f184ee97..14a879d7 100644 --- a/src/services/galaxy/ConnectionService.java +++ b/src/services/galaxy/ConnectionService.java @@ -33,8 +33,6 @@ import intents.network.ForceDisconnectIntent; import intents.network.GalacticPacketIntent; import intents.player.ZonePlayerSwapIntent; -import java.sql.PreparedStatement; -import java.sql.SQLException; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; @@ -43,7 +41,6 @@ import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; -import main.ProjectSWG; import network.packets.swg.zone.HeartBeat; import resources.control.Intent; import resources.control.Service; @@ -55,23 +52,19 @@ import resources.player.PlayerEvent; import resources.player.PlayerFlags; import resources.player.PlayerState; import resources.server_info.Log; +import services.CoreManager; import utilities.DebugUtilities; import utilities.ThreadUtilities; public class ConnectionService extends Service { private static final double DISAPPEAR_THRESHOLD = TimeUnit.MINUTES.toMillis(3); // Time after the LD - private static final String INCREMENT_POPULATION_SQL = "UPDATE galaxies SET population = population + 1 WHERE id = ?"; - private static final String DECREMENT_POPULATION_SQL = "UPDATE galaxies SET population = population - 1 WHERE id = ?"; private final ScheduledExecutorService updateService; private final Runnable disappearRunnable; private final Set disappearPlayers; private final Set zonedInPlayers; - private PreparedStatement incrementPopulation; - private PreparedStatement decrementPopulation; - public ConnectionService() { updateService = Executors.newSingleThreadScheduledExecutor(ThreadUtilities.newThreadFactory("conn-update-service")); zonedInPlayers = new LinkedHashSet(); @@ -98,13 +91,6 @@ public class ConnectionService extends Service { registerForIntent(ZonePlayerSwapIntent.TYPE); } - @Override - public boolean initialize() { - incrementPopulation = getLocalDatabase().prepareStatement(INCREMENT_POPULATION_SQL); - decrementPopulation = getLocalDatabase().prepareStatement(DECREMENT_POPULATION_SQL); - return super.initialize(); - } - @Override public boolean start() { return super.start(); @@ -138,15 +124,7 @@ public class ConnectionService extends Service { switch (pei.getEvent()) { case PE_FIRST_ZONE: { Player p = pei.getPlayer(); - try { - synchronized (incrementPopulation) { - incrementPopulation.setInt(1, ProjectSWG.getGalaxyId()); - incrementPopulation.executeUpdate(); - } - } catch (SQLException e) { - Log.e("ConnectionService", "SQLException occured when trying to increase population value."); - e.printStackTrace(); - } + CoreManager.getGalaxy().incrementPopulationCount(); removeFromLists(p); synchronized (zonedInPlayers) { zonedInPlayers.add(p); @@ -157,15 +135,7 @@ public class ConnectionService extends Service { clearPlayerFlag(pei.getPlayer(), pei.getEvent(), PlayerFlags.LD); break; case PE_LOGGED_OUT: - try { - synchronized (decrementPopulation) { - decrementPopulation.setInt(1, ProjectSWG.getGalaxyId()); - decrementPopulation.executeUpdate(); - } - } catch (SQLException e) { - Log.e("ConnectionService", "SQLException occured when trying to decrease population value."); - e.printStackTrace(); - } + CoreManager.getGalaxy().decrementPopulationCount(); setPlayerFlag(pei.getPlayer(), pei.getEvent(), PlayerFlags.LD); logOut(pei.getPlayer(), true); break; @@ -196,7 +166,7 @@ public class ConnectionService extends Service { removeFromLists(before); updatePlayTime(before); Log.i("ConnectionService", "Logged out %s with character %s", before.getUsername(), before.getCharacterName()); - new PlayerEventIntent(before, before.getGalaxyName(), PlayerEvent.PE_LOGGED_OUT).broadcast(); + new PlayerEventIntent(before, PlayerEvent.PE_LOGGED_OUT).broadcast(); Log.i("ConnectionService", "Disconnected %s with character %s and reason: %s", before.getUsername(), before.getCharacterName(), DisconnectReason.NEW_CONNECTION_ATTEMPT); new CloseConnectionIntent(before.getNetworkId(), DisconnectReason.NEW_CONNECTION_ATTEMPT).broadcast(); before.setPlayerState(PlayerState.DISCONNECTED); diff --git a/src/services/galaxy/GalacticManager.java b/src/services/galaxy/GalacticManager.java index 1826a8c3..4558a64e 100644 --- a/src/services/galaxy/GalacticManager.java +++ b/src/services/galaxy/GalacticManager.java @@ -27,18 +27,12 @@ ***********************************************************************************/ package services.galaxy; -import java.sql.PreparedStatement; -import java.sql.SQLException; - import intents.GalacticIntent; import intents.network.GalacticPacketIntent; import intents.network.InboundPacketIntent; -import resources.Galaxy; import resources.control.Intent; import resources.control.Manager; -import resources.server_info.DataManager; -import resources.server_info.Log; -import resources.server_info.RelationalDatabase; +import services.CoreManager; import services.chat.ChatManager; import services.objects.ObjectManager; import services.player.PlayerManager; @@ -46,7 +40,6 @@ import services.player.PlayerManager; public class GalacticManager extends Manager { private final Object prevPacketIntentMutex = new Object(); - private final static String resetPopulationSQL = "UPDATE galaxies SET population = 0 WHERE id = ?"; private ObjectManager objectManager; private PlayerManager playerManager; @@ -54,14 +47,12 @@ public class GalacticManager extends Manager { private ChatManager chatManager; private final TravelService travelService; private Intent prevPacketIntent; - private Galaxy galaxy; - public GalacticManager(Galaxy g) { - this.galaxy = g; + public GalacticManager() { objectManager = new ObjectManager(); playerManager = new PlayerManager(); gameManager = new GameManager(); - chatManager = new ChatManager(g); + chatManager = new ChatManager(); travelService = new TravelService(objectManager); prevPacketIntent = null; @@ -122,17 +113,10 @@ public class GalacticManager extends Manager { private void prepareGalacticIntent(GalacticIntent i) { i.setGalacticManager(this); - i.setGalaxy(galaxy); } + private void resetPopulationCount() { - RelationalDatabase db = DataManager.getInstance().getLocalDatabase(); - try(PreparedStatement resetPopulation = db.prepareStatement(GalacticManager.resetPopulationSQL)) { - resetPopulation.setInt(1, galaxy.getId()); - resetPopulation.executeUpdate(); - } catch (SQLException e) { - Log.e("ProjectSWG", "SQLException occured when trying to reset population value."); - e.printStackTrace(); - } + CoreManager.getGalaxy().setPopulation(0); } } diff --git a/src/services/network/NetworkManager.java b/src/services/network/NetworkManager.java index 9378a3ca..0a5100b8 100644 --- a/src/services/network/NetworkManager.java +++ b/src/services/network/NetworkManager.java @@ -27,14 +27,13 @@ ***********************************************************************************/ package services.network; -import resources.Galaxy; import resources.control.Manager; public class NetworkManager extends Manager { private final NetworkClientManager netClientManager; - public NetworkManager(Galaxy galaxy) { + public NetworkManager() { netClientManager = new NetworkClientManager(); addChildService(netClientManager); diff --git a/src/services/objects/ObjectAwareness.java b/src/services/objects/ObjectAwareness.java index 634633b9..f1565e0d 100644 --- a/src/services/objects/ObjectAwareness.java +++ b/src/services/objects/ObjectAwareness.java @@ -28,6 +28,7 @@ package services.objects; import intents.PlayerEventIntent; +import intents.RequestZoneInIntent; import intents.network.GalacticPacketIntent; import intents.object.ObjectCreateIntent; import intents.object.ObjectCreatedIntent; @@ -119,10 +120,7 @@ public class ObjectAwareness extends Service { creature.setOwner(null); p.setCreatureObject(null); break; - case PE_FIRST_ZONE: - break; case PE_ZONE_IN: - creature.clearAware(); startScene(creature, creature.getLocation()); update(creature); break; @@ -150,14 +148,12 @@ public class ObjectAwareness extends Service { Location old = object.getLocation(); object.setLocation(oti.getNewLocation()); if (oti.getParent() != null) { - if (creature) - startScene((CreatureObject) object, oti.getNewLocation()); move(object, oti.getParent(), oti.getNewLocation()); } else { - if (creature) - startScene((CreatureObject) object, oti.getNewLocation()); moveFromOld(object, old); } + if (creature) + new RequestZoneInIntent(owner, (CreatureObject) object, true).broadcast(); new PlayerEventIntent(object.getOwner(), PlayerEvent.PE_ZONE_IN).broadcast(); } diff --git a/src/services/objects/ObjectManager.java b/src/services/objects/ObjectManager.java index 8cad296f..a93b0042 100644 --- a/src/services/objects/ObjectManager.java +++ b/src/services/objects/ObjectManager.java @@ -230,9 +230,8 @@ public class ObjectManager extends Manager { Packet packet = gpi.getPacket(); if (packet instanceof SelectCharacter) { PlayerManager pm = gpi.getPlayerManager(); - String galaxy = gpi.getGalaxy().getName(); long characterId = ((SelectCharacter) packet).getCharacterId(); - zoneInCharacter(pm, galaxy, gpi.getNetworkId(), characterId); + zoneInCharacter(pm, gpi.getNetworkId(), characterId); } } @@ -342,7 +341,7 @@ public class ObjectManager extends Manager { } } - private void zoneInCharacter(PlayerManager playerManager, String galaxy, long netId, long characterId) { + private void zoneInCharacter(PlayerManager playerManager, long netId, long characterId) { Player player = playerManager.getPlayerFromNetworkId(netId); if (player == null) { Log.e("ObjectManager", "Unable to zone in null player '%d'", netId); @@ -367,7 +366,7 @@ public class ObjectManager extends Manager { sendClientFatal(player, "Failed to zone", "There has been an internal server error: Null Ghost.\nPlease delete your character and create a new one", 10, TimeUnit.SECONDS); return; } - new RequestZoneInIntent(player, (CreatureObject) creatureObj, galaxy).broadcast(); + new RequestZoneInIntent(player, (CreatureObject) creatureObj, true).broadcast(); } private void sendClientFatal(Player player, String title, String message, long timeToRead, TimeUnit time) { diff --git a/src/services/player/CharacterCreationService.java b/src/services/player/CharacterCreationService.java index 70bf9cdf..7b8c1bef 100644 --- a/src/services/player/CharacterCreationService.java +++ b/src/services/player/CharacterCreationService.java @@ -75,7 +75,7 @@ import utilities.namegen.SWGNameGenerator; public class CharacterCreationService extends Service { - private static final String CREATE_CHARACTER_SQL = "INSERT INTO characters (id, name, race, userId, galaxyId) VALUES (?, ?, ?, ?, ?)"; + private static final String CREATE_CHARACTER_SQL = "INSERT INTO characters (id, name, race, userId) VALUES (?, ?, ?, ?)"; private static final String GET_CHARACTER_SQL = "SELECT * FROM characters WHERE name == ?"; private static final String GET_LIKE_CHARACTER_SQL = "SELECT name FROM characters WHERE name ilike ?"; // NOTE: ilike is not SQL standard. It is an extension for postgres only. private static final String GET_CHARACTER_COUNT_SQL = "SELECT count(*) FROM characters WHERE userId = ?"; @@ -254,7 +254,6 @@ public class CharacterCreationService extends Service { createCharacter.setString(2, name); createCharacter.setString(3, player.getCreatureObject().getRace().getFilename()); createCharacter.setInt(4, player.getUserId()); - createCharacter.setInt(5, player.getGalaxyId()); return createCharacter.executeUpdate() == 1; } catch (SQLException e) { e.printStackTrace(); diff --git a/src/services/player/LoginService.java b/src/services/player/LoginService.java index d7b70d5c..ed3bd885 100644 --- a/src/services/player/LoginService.java +++ b/src/services/player/LoginService.java @@ -38,7 +38,6 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; -import java.util.Locale; import java.util.Random; import main.ProjectSWG; @@ -59,7 +58,6 @@ import network.packets.swg.login.OfflineServersMessage; import network.packets.swg.login.StationIdHasJediSlot; import resources.Galaxy; import resources.Race; -import resources.Galaxy.GalaxyStatus; import resources.common.BCrypt; import resources.config.ConfigFile; import resources.control.Intent; @@ -72,22 +70,15 @@ import resources.player.PlayerState; import resources.server_info.Config; import resources.server_info.Log; import resources.server_info.RelationalDatabase; +import services.CoreManager; public class LoginService extends Service { private static final String REQUIRED_VERSION = "20111130-15:46"; - // Population status values. Values are in percent. - private static final double VERYLIGHT = 10; - private static final double LIGHT = 20; - private static final double MEDIUM = 30; - private static final double HEAVY = 40; - private static final double VERYHEAVY = 50; - private static final double EXTREMELYHEAVY = 100; - private Random random; private PreparedStatement getUser; - private PreparedStatement getGalaxies; + private PreparedStatement getCharacter; private PreparedStatement getCharacters; private PreparedStatement deleteCharacter; private boolean autoLogin; @@ -103,10 +94,10 @@ public class LoginService extends Service { public boolean initialize() { RelationalDatabase local = getLocalDatabase(); getUser = local.prepareStatement("SELECT * FROM users WHERE LOWER(username) = LOWER(?)"); - getGalaxies = local.prepareStatement("SELECT * FROM galaxies"); - getCharacters = local.prepareStatement("SELECT * FROM characters WHERE userid = ? AND galaxyid = ?"); + getCharacter = local.prepareStatement("SELECT * FROM characters WHERE LOWER(name) = LOWER(?)"); + getCharacters = local.prepareStatement("SELECT * FROM characters WHERE userid = ?"); deleteCharacter = local.prepareStatement("DELETE FROM characters WHERE id = ?"); - autoLogin = (getConfig(ConfigFile.NETWORK).getInt("AUTO-LOGIN", 0) == 1 ? true : false); + autoLogin = getConfig(ConfigFile.NETWORK).getInt("AUTO-LOGIN", 0) == 1; return super.initialize(); } @@ -299,62 +290,29 @@ public class LoginService extends Service { } public ResultSet getCharacter(String character) throws SQLException { - PreparedStatement statement = getLocalDatabase().prepareStatement("SELECT * FROM characters WHERE lower(name) = ?"); - statement.setString(1, character.toLowerCase(Locale.ENGLISH)); - return statement.executeQuery(); + synchronized (getCharacter) { + getCharacter.setString(1, character); + return getCharacter.executeQuery(); + } } private List getGalaxies(Player p) throws SQLException { - Config c = getConfig(ConfigFile.PRIMARY); - ResultSet set = getGalaxies.executeQuery(); - List galaxies = new ArrayList(); - int maxPopulation = c.getInt("GALAXY-MAX-ONLINE", 3000); - double consumed; - int population; - - try { - while (set.next()) { - Galaxy g = new Galaxy(); - population = set.getInt("population"); - consumed = ((double) population / maxPopulation) * 100; - - g.setId(set.getInt("id")); - g.setName(set.getString("name")); - g.setAddress(set.getString("address")); - g.setPopulation(population); - g.setTimeZone(set.getInt("timezone") * 3600); - g.setZonePort(set.getInt("zone_port")); - g.setPingPort(set.getInt("ping_port")); - g.setStatus(set.getInt("status")); - g.setMaxCharacters(c.getInt("GALAXY-MAX-CHARACTERS", 2)); - g.setOnlinePlayerLimit(maxPopulation); - g.setOnlineFreeTrialLimit(maxPopulation); - g.setRecommended(true); - g.setPopulationStatus(populationStatus(consumed)); - // If locked, restricted, or full - if (p.getAccessLevel().getValue() >= AccessLevel.CSR.getValue() && g.getStatus() != GalaxyStatus.UP) - g.setStatus(GalaxyStatus.UP); - galaxies.add(g); - } - set.close(); - return galaxies; - } finally { - set.close(); - } + List galaxies = new ArrayList<>(); + galaxies.add(CoreManager.getGalaxy()); + return galaxies; } private SWGCharacter [] getCharacters(int userId) throws SQLException { getCharacters.setInt(1, userId); - getCharacters.setInt(2, ProjectSWG.getGalaxyId()); ResultSet set = getCharacters.executeQuery(); - List characters = new ArrayList(); + List characters = new ArrayList<>(); try { while (set.next()) { SWGCharacter c = new SWGCharacter(); c.setId(set.getInt("id")); c.setName(set.getString("name")); + c.setGalaxyId(CoreManager.getGalaxyId()); c.setRaceCrc(Race.getRaceByFile(set.getString("race")).getCrc()); - c.setGalaxyId(set.getInt("galaxyid")); c.setType(1); // 1 = Normal (2 = Jedi, 3 = Spectral) characters.add(c); } @@ -376,25 +334,4 @@ public class LoginService extends Service { } } - private int populationStatus(final double consumed) { - final int popStatus; - - if(consumed < VERYLIGHT) - popStatus = 0; - else if(consumed < LIGHT) - popStatus = 1; - else if(consumed < MEDIUM) - popStatus = 2; - else if(consumed < HEAVY) - popStatus = 3; - else if(consumed < VERYHEAVY) - popStatus = 4; - else if(consumed < EXTREMELYHEAVY) - popStatus = 5; - else - popStatus = 6; - - return popStatus; - } - } diff --git a/src/services/player/ZoneManager.java b/src/services/player/ZoneManager.java index 35c1c74d..4374be41 100644 --- a/src/services/player/ZoneManager.java +++ b/src/services/player/ZoneManager.java @@ -99,7 +99,7 @@ public class ZoneManager extends Manager { public void onIntentReceived(Intent i) { if (i instanceof RequestZoneInIntent) { RequestZoneInIntent zii = (RequestZoneInIntent) i; - zoneInPlayer(zii.getPlayer(), zii.getCreature(), zii.getGalaxy()); + zoneInPlayer(zii.getPlayer(), zii.getCreature()); } else if (i instanceof GalacticPacketIntent) { GalacticPacketIntent gpi = (GalacticPacketIntent) i; handlePacket(gpi, gpi.getPlayerManager().getPlayerFromNetworkId(gpi.getNetworkId()), gpi.getNetworkId(), gpi.getPacket()); @@ -126,7 +126,7 @@ public class ZoneManager extends Manager { return characterCreationService.characterExistsForName(name); } - private void zoneInPlayer(Player player, CreatureObject creature, String galaxy) { + private void zoneInPlayer(Player player, CreatureObject creature) { PlayerObject playerObj = creature.getPlayerObject(); player.setPlayerState(PlayerState.ZONING_IN); player.setCreatureObject(creature); @@ -136,8 +136,8 @@ public class ZoneManager extends Manager { initPlayerBeforeZoneIn(player, creature, playerObj); System.out.printf("[%s] %s is zoning in%n", player.getUsername(), player.getCharacterName()); Log.i("ObjectManager", "Zoning in %s with character %s", player.getUsername(), player.getCharacterName()); - new PlayerEventIntent(player, galaxy, PlayerEvent.PE_FIRST_ZONE).broadcast(); - new PlayerEventIntent(player, galaxy, PlayerEvent.PE_ZONE_IN).broadcast(); + new PlayerEventIntent(player, PlayerEvent.PE_FIRST_ZONE).broadcast(); + new PlayerEventIntent(player, PlayerEvent.PE_ZONE_IN).broadcast(); sendCommitHistory(player); sendMessageOfTheDay(player); }