diff --git a/README.md b/README.md index fee7f4707..2a820266c 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ ### **Branch** ### -**Development:** Upload your Pull Requests here so it can be tested +**Quality Assurance:** Upload your Pull Requests here so it can be tested + +**Development:** This is the main working space **Master:** Tested and approved commits will be moved to this branch (Test Center) -**Release:** This is the live version of latest code run on Live Server (Tydirium) - -------------------------------------------------------------------------------- ![holocore.png](https://bitbucket.org/repo/norXdj/images/3473411954-holocore.png) diff --git a/cfg/features.cfg b/cfg/features.cfg new file mode 100644 index 000000000..32dc51f66 --- /dev/null +++ b/cfg/features.cfg @@ -0,0 +1 @@ +# 29/05/2015 00:41:40 CDT diff --git a/cfg/network.cfg b/cfg/network.cfg new file mode 100644 index 000000000..fc9837ce2 --- /dev/null +++ b/cfg/network.cfg @@ -0,0 +1,10 @@ +# 29/05/2015 00:41:40 CDT +AUTO-LOGIN=0 +LOGIN-PORT=44453 +LOGIN-SERVER-ID=1 +LOGIN-SERVER-NAME=LoginServer +LOGIN-VERSION-CHECKS=true +MAX-PACKET-SIZE=496 +SESSION-TOKEN-LENGTH=24 +ZONE-SERVER-ID=1 +ZONE-SERVER-NAME=Localhost diff --git a/nge.cfg b/cfg/nge.cfg similarity index 51% rename from nge.cfg rename to cfg/nge.cfg index f68edd20f..017c9ab1b 100644 --- a/nge.cfg +++ b/cfg/nge.cfg @@ -1,18 +1,11 @@ -#Fri May 22 01:51:04 CDT 2015 +# 29/05/2015 00:41:40 CDT CLEAN-CHARACTER-DATA=0 -LOAD-BUILDOUTS=false -LOCAL-USER=nge -LOGIN-SERVER-NAME=LoginServer -AUTO-LOGIN=0 -SESSION-TOKEN-LENGTH=24 -LOGIN-PORT=44453 -PACKET-DEBUG=false -MAX-PACKET-SIZE=496 -LOCAL-DB=nge -LOGIN-SERVER-ID=1 -WIPE-ODB-FILES=0 -LOCAL-PASS=nge +ENABLE-LOGGING=true GALAXY-MAX-CHARACTERS=2 GALAXY-MAX-ONLINE=3000 -ENABLE-LOGGING=true -LOGIN-VERSION-CHECKS=true +LOAD-BUILDOUTS=false +LOCAL-DB=nge +LOCAL-PASS=nge +LOCAL-USER=nge +PACKET-DEBUG=false +WIPE-ODB-FILES=0 diff --git a/src/resources/config/ConfigFile.java b/src/resources/config/ConfigFile.java index 31170c295..c2d066d9d 100644 --- a/src/resources/config/ConfigFile.java +++ b/src/resources/config/ConfigFile.java @@ -28,7 +28,12 @@ package resources.config; public enum ConfigFile { - PRIMARY ("nge.cfg"); + /** Meant for general purpose configuration or debugging */ + PRIMARY ("cfg/nge.cfg"), + /** Meant for networking-related configuration. Includes Login and Zone configuration */ + NETWORK ("cfg/network.cfg"), + /** Meant for specific in-game features that may be better disabled or tweaked */ + FEATURES("cfg/features.cfg"); private String filename; diff --git a/src/resources/control/ServerPublicInterface.java b/src/resources/control/ServerPublicInterface.java index 89e73041e..d27de8456 100644 --- a/src/resources/control/ServerPublicInterface.java +++ b/src/resources/control/ServerPublicInterface.java @@ -154,7 +154,7 @@ final class ServerPublicInterface { } private InetAddress getBindAddr() { - Config c = DataManager.getInstance().getConfig(ConfigFile.PRIMARY); + Config c = DataManager.getInstance().getConfig(ConfigFile.NETWORK); try { if (c.containsKey("BIND-ADDR")) return InetAddress.getByName(c.getString("BIND-ADDR", "127.0.0.1")); diff --git a/src/resources/objects/SWGObject.java b/src/resources/objects/SWGObject.java index 3e777058d..1a5052cbe 100644 --- a/src/resources/objects/SWGObject.java +++ b/src/resources/objects/SWGObject.java @@ -50,6 +50,7 @@ import resources.network.BaselineBuilder; import resources.network.DeltaBuilder; import resources.player.Player; import resources.player.PlayerState; +import resources.server_info.Log; import utilities.Encoder.StringType; public class SWGObject implements Serializable, Comparable { @@ -110,19 +111,17 @@ public class SWGObject implements Serializable, Comparable { int arrangementId = getArrangementId(object); if (arrangementId == -1) { containedObjects.put(object.getObjectId(), object); - object.parent = this; - object.containerPermissions.setOwner(objectId); - return true; - } - // Not a child object, so time to check the slots! + } else { + // Not a child object, so time to check the slots! - // Check to make sure this object is able to go into a slot in the parent - List requiredSlots = object.getArrangement().get(arrangementId - 4); - // Note that some objects don't have a descriptor, meaning it has no slots + // Check to make sure this object is able to go into a slot in the parent + List requiredSlots = object.getArrangement().get(arrangementId - 4); + // Note that some objects don't have a descriptor, meaning it has no slots - // Add object to the slot - for (String requiredSlot : requiredSlots) { - slots.put(requiredSlot, object); + // Add object to the slot + for (String requiredSlot : requiredSlots) { + slots.put(requiredSlot, object); + } } object.parent = this; @@ -139,13 +138,11 @@ public class SWGObject implements Serializable, Comparable { // This object is a container object, so remove it from the container if (object.getSlotArrangement() == -1) { containedObjects.remove(object.objectId); - object.parent = null; - return; - } - - for (String slot : (slotArrangement == -1 ? - object.getArrangement().get(0) : object.getArrangement().get(slotArrangement - 4))) { - slots.put(slot, null); + } else { + for (String slot : (slotArrangement == -1 ? + object.getArrangement().get(0) : object.getArrangement().get(slotArrangement - 4))) { + slots.put(slot, null); + } } object.parent = null; @@ -175,7 +172,7 @@ public class SWGObject implements Serializable, Comparable { // TODO Slot occupation check, old version was not working properly, always returning SLOT_OCCUPIED // Get a pre-parent-removal list of the observers so we can send create/destroy/update messages - List oldObservers = getObjectsAware(); + List oldObservers = getChildrenAwareness(); // Remove this object from the old parent if one exists if (parent != null) { @@ -185,7 +182,7 @@ public class SWGObject implements Serializable, Comparable { container.addObject(this); // Observer notification - sendUpdatedContainment(oldObservers, new ArrayList<>(container.getObjectsAware())); + sendUpdatedContainment(oldObservers, new ArrayList<>(container.getChildrenAwareness())); return ContainerResult.SUCCESS; } @@ -472,6 +469,7 @@ public class SWGObject implements Serializable, Comparable { } protected void createObject(Player target) { + Log.i("ContainerPermissions", "Sending baselines for %s with owner %s to %s", this, this.getOwner(), target); sendSceneCreateObject(target); createChildrenObjects(target); target.sendPacket(new SceneEndBaselines(getObjectId())); @@ -487,14 +485,14 @@ public class SWGObject implements Serializable, Comparable { awarenessOutOfRange(o); } } - + public List getObjectsAware() { synchronized (objectsAware) { - return Collections.unmodifiableList(getChildrenAwareness()); + return Collections.unmodifiableList(objectsAware); } } - private List getChildrenAwareness() { + public List getChildrenAwareness() { List awareness = new ArrayList<>(objectsAware); if (getParent() != null && !(awareness.contains(getParent()))) @@ -519,6 +517,8 @@ public class SWGObject implements Serializable, Comparable { if (p == null || p.getPlayerState() != PlayerState.ZONED_IN) continue; p.sendPacket(packets); + + //System.out.println("Sent " + packets + " for " + this + " to objAware " + obj); } List childrenAwareness = getChildrenAwareness(); @@ -526,19 +526,23 @@ public class SWGObject implements Serializable, Comparable { childrenAwareness.remove(this); // Remove self since only observers being notified for (SWGObject childObserver : childrenAwareness) { - if (childObserver == null) + if (childObserver == null || childObserver == this) continue; Player p = childObserver.getOwner(); - if (p == null || p.getPlayerState() != PlayerState.ZONED_IN) + if (p == null || getOwner() == p || p.getPlayerState() != PlayerState.ZONED_IN) continue; p.sendPacket(packets); + + //System.out.println("Sent " + packets + " of " + this + " to child " + childObserver); } SWGObject parent = getParent(); - if(parent != null) + if(parent != null) { parent.sendObservers(packets); + //System.out.println("Sent " + packets + " to observers of " + this); + } } } diff --git a/src/services/network/NetworkClientManager.java b/src/services/network/NetworkClientManager.java index 247e095c3..a35bc654b 100644 --- a/src/services/network/NetworkClientManager.java +++ b/src/services/network/NetworkClientManager.java @@ -122,7 +122,7 @@ public class NetworkClientManager extends Manager { outPacket.setCrcLength(2); outPacket.setEncryptionFlag((short) 1); outPacket.setXorLength((byte) 4); - outPacket.setUdpSize(getConfig(ConfigFile.PRIMARY).getInt("MAX-PACKET-SIZE", 496)); + outPacket.setUdpSize(getConfig(ConfigFile.NETWORK).getInt("MAX-PACKET-SIZE", 496)); sendPacket(client.getNetworkId(), outPacket); } diff --git a/src/services/network/NetworkListenerService.java b/src/services/network/NetworkListenerService.java index fb0ca7b14..7b28ad5f3 100644 --- a/src/services/network/NetworkListenerService.java +++ b/src/services/network/NetworkListenerService.java @@ -72,13 +72,13 @@ public class NetworkListenerService extends Service { @Override public boolean initialize() { - Config primary = getConfig(ConfigFile.PRIMARY); - int packetSize = primary.getInt("MAX-PACKET-SIZE", 496); - InetAddress loginBind = getBindAddr(primary, "LOGIN-BIND-ADDR", "BIND-ADDR"); - InetAddress zoneBind = getBindAddr(primary, "ZONE-BIND-ADDR", "BIND-ADDR"); - InetAddress pingBind = getBindAddr(primary, "PING-BIND-ADDR", "BIND-ADDR"); + Config network = getConfig(ConfigFile.NETWORK); + int packetSize = network.getInt("MAX-PACKET-SIZE", 496); + InetAddress loginBind = getBindAddr(network, "LOGIN-BIND-ADDR", "BIND-ADDR"); + InetAddress zoneBind = getBindAddr(network, "ZONE-BIND-ADDR", "BIND-ADDR"); + InetAddress pingBind = getBindAddr(network, "PING-BIND-ADDR", "BIND-ADDR"); boolean init = true; - init = login.initialize(loginBind, primary.getInt("LOGIN-PORT", 44453), packetSize) && init; + init = login.initialize(loginBind, network.getInt("LOGIN-PORT", 44453), packetSize) && init; init = zone.initialize(zoneBind, galaxy.getZonePort(), packetSize) && init; init = ping.initialize(pingBind, galaxy.getPingPort(), packetSize) && init; return super.initialize() && isOperational() && init; diff --git a/src/services/objects/ObjectManager.java b/src/services/objects/ObjectManager.java index 1f1398ee0..96489e820 100644 --- a/src/services/objects/ObjectManager.java +++ b/src/services/objects/ObjectManager.java @@ -253,10 +253,12 @@ public class ObjectManager extends Manager { if (parent instanceof CreatureObject) { ((CreatureObject) parent).removeEquipment(object); } - parent.removeObject(object); - } + object.sendObserversAndSelf(new SceneDestroyObject(objId)); - object.sendObservers(new SceneDestroyObject(objId)); + parent.removeObject(object); + } else { + object.sendObservers(new SceneDestroyObject(objId)); + } // Finally, remove from the awareness tree deleteObject(object.getObjectId()); diff --git a/src/services/player/LoginService.java b/src/services/player/LoginService.java index 0b0525c87..157183b36 100644 --- a/src/services/player/LoginService.java +++ b/src/services/player/LoginService.java @@ -96,7 +96,7 @@ public class LoginService extends Service { getGalaxies = local.prepareStatement("SELECT * FROM galaxies"); getCharacters = local.prepareStatement("SELECT * FROM characters WHERE userid = ?"); deleteCharacter = local.prepareStatement("DELETE FROM CHARACTERS WHERE id = ?"); - autoLogin = (getConfig(ConfigFile.PRIMARY).getInt("AUTO-LOGIN", 0) == 1 ? true : false); + autoLogin = (getConfig(ConfigFile.NETWORK).getInt("AUTO-LOGIN", 0) == 1 ? true : false); return super.initialize(); } @@ -113,14 +113,14 @@ public class LoginService extends Service { } private String getServerString() { - Config c = getConfig(ConfigFile.PRIMARY); + Config c = getConfig(ConfigFile.NETWORK); String name = c.getString("LOGIN-SERVER-NAME", "LoginServer"); int id = c.getInt("LOGIN-SERVER-ID", 1); return name + ":" + id; } private void sendServerInfo(Player player) { - Config c = getConfig(ConfigFile.PRIMARY); + Config c = getConfig(ConfigFile.NETWORK); String name = c.getString("LOGIN-SERVER-NAME", "LoginServer"); int id = c.getInt("LOGIN-SERVER-ID", 1); sendPacket(player.getNetworkId(), new ServerString(name + ":" + id)); @@ -141,7 +141,7 @@ public class LoginService extends Service { System.err.println("Player cannot login when " + player.getPlayerState()); return; } - final boolean doClientCheck = getConfig(ConfigFile.PRIMARY).getBoolean("LOGIN-VERSION-CHECKS", true); + final boolean doClientCheck = getConfig(ConfigFile.NETWORK).getBoolean("LOGIN-VERSION-CHECKS", true); if (doClientCheck) Log.d("LoginService", "Running login checks for %s", id.getUsername()); else @@ -185,7 +185,7 @@ public class LoginService extends Service { private void onSuccessfulLogin(ResultSet user, Player player, LoginClientId id) throws SQLException { player.setUsername(id.getUsername()); player.setUserId(user.getInt("id")); - int tokenLength = getConfig(ConfigFile.PRIMARY).getInt("SESSION-TOKEN-LENGTH", 24); + int tokenLength = getConfig(ConfigFile.NETWORK).getInt("SESSION-TOKEN-LENGTH", 24); byte [] sessionToken = new byte[tokenLength]; random.nextBytes(sessionToken); player.setSessionToken(sessionToken); diff --git a/src/services/player/PlayerManager.java b/src/services/player/PlayerManager.java index 503bd253c..0834cea3b 100644 --- a/src/services/player/PlayerManager.java +++ b/src/services/player/PlayerManager.java @@ -35,6 +35,7 @@ import java.util.Locale; import java.util.Map; import network.packets.Packet; +import network.packets.soe.SessionRequest; import network.packets.soe.Disconnect.DisconnectReason; import network.packets.swg.login.ClientIdMsg; import network.packets.swg.zone.insertion.SelectCharacter; @@ -238,7 +239,8 @@ public class PlayerManager extends Manager { loginService.handlePacket(gpi, player, packet); else if (type == ServerType.ZONE) zoneService.handlePacket(gpi, player, networkId, packet); - } + } else if (type == ServerType.ZONE && packet instanceof SessionRequest) + zoneService.handlePacket(gpi, player, networkId, packet); } private void onNotifyPlayersPacketIntent(NotifyPlayersPacketIntent nppi) { diff --git a/src/services/player/ZoneService.java b/src/services/player/ZoneService.java index 4707b28b3..e43b5032c 100644 --- a/src/services/player/ZoneService.java +++ b/src/services/player/ZoneService.java @@ -239,7 +239,7 @@ public class ZoneService extends Service { } private void sendServerInfo(Galaxy galaxy, long networkId) { - Config c = getConfig(ConfigFile.PRIMARY); + Config c = getConfig(ConfigFile.NETWORK); String name = c.getString("ZONE-SERVER-NAME", galaxy.getName()); int id = c.getInt("ZONE-SERVER-ID", galaxy.getId()); sendPacket(networkId, new ServerString(name + ":" + id));