diff --git a/src/resources/buildout/BuildoutArea.java b/src/resources/buildout/BuildoutArea.java index f150fb0af..5712a2fe4 100644 --- a/src/resources/buildout/BuildoutArea.java +++ b/src/resources/buildout/BuildoutArea.java @@ -138,21 +138,33 @@ public class BuildoutArea implements Comparable { } public Location adjustLocation(Location l) { - if (!isAdjustCoordinates()) - return l; - Location ret = new Location(l); - ret.translatePosition(-translationX, 0, -translationZ); + Location ret = new Location(); + adjustLocation(l, ret); return ret; } + public void adjustLocation(Location l, Location adjusted) { + if (!isAdjustCoordinates()) { + adjusted.mergeWith(l); + return; + } + adjusted.translatePosition(-translationX, 0, -translationZ); + } + public Location readjustLocation(Location l) { - if (!isAdjustCoordinates()) - return l; - Location ret = new Location(l); - ret.translatePosition(translationX, 0, translationZ); + Location ret = new Location(); + readjustLocation(l, ret); return ret; } + public void readjustLocation(Location l, Location adjusted) { + if (!isAdjustCoordinates()) { + adjusted.mergeWith(l); + return; + } + adjusted.translatePosition(translationX, 0, translationZ); + } + public String toString() { return String.format("%s/%s: (%.1f,%.1f)/(%.1f,%.1f) %b(%.1f,%.1f)", name, terrain.getName(), x1, z1, x2, z2, adjustCoordinates, translationX, translationZ); } diff --git a/src/resources/objects/SWGObject.java b/src/resources/objects/SWGObject.java index e2f569bc9..bc8bb879c 100644 --- a/src/resources/objects/SWGObject.java +++ b/src/resources/objects/SWGObject.java @@ -71,6 +71,7 @@ public abstract class SWGObject extends BaselineObject implements Comparable containedObjects= new HashSet<>(); private final HashMap slots = new HashMap<>(); // HashMap used for null value support private final transient Map attributes = new LinkedHashMap<>(); @@ -179,6 +180,9 @@ public abstract class SWGObject extends BaselineObject implements Comparable newObservers = getObserversAndParent(); @@ -302,11 +306,17 @@ public abstract class SWGObject extends BaselineObject implements Comparable attributes.put(stream.getAscii(), stream.getAscii())); + stream.getList((i) -> SWGObjectFactory.create(stream).moveToContainer(this)); + } + + private void readVersion2(NetBufferStream stream) { + buildoutLocation.read(stream); + location.mergeWith(buildoutLocation); if (stream.getBoolean()) parent = SWGObjectFactory.create(stream); permissions = ContainerPermissionsType.valueOf(stream.getAscii()); diff --git a/src/resources/objects/awareness/AwarenessHandler.java b/src/resources/objects/awareness/AwarenessHandler.java index 4e3c835f4..021666855 100644 --- a/src/resources/objects/awareness/AwarenessHandler.java +++ b/src/resources/objects/awareness/AwarenessHandler.java @@ -31,7 +31,6 @@ import java.util.HashMap; import java.util.Map; import resources.Location; import resources.Terrain; -import resources.buildout.BuildoutArea; import resources.objects.SWGObject; import resources.objects.awareness.TerrainMap.TerrainMapCallback; import resources.server_info.Log; @@ -69,19 +68,17 @@ public class AwarenessHandler { } public void moveObject(SWGObject obj, Location requestedLocation) { - if (obj.getParent() != null) - obj.moveToContainer(null); - // Adjust to server coordinates - BuildoutArea area = obj.getBuildoutArea(); - if (area != null) - requestedLocation = area.adjustLocation(requestedLocation); // Remove from previous awareness if (obj.getTerrain() != requestedLocation.getTerrain()) { TerrainMap oldTerrainMap = getTerrainMap(obj.getTerrain()); if (oldTerrainMap != null) oldTerrainMap.removeWithoutUpdate(obj); } - // Add to new awareness + // Update location + obj.setLocation(requestedLocation); + if (obj.getParent() != null) + obj.moveToContainer(null); + // Update awareness TerrainMap map = getTerrainMap(requestedLocation.getTerrain()); if (map != null) { map.moveWithinMap(obj, requestedLocation); @@ -91,8 +88,6 @@ public class AwarenessHandler { } public void moveObject(SWGObject obj, SWGObject parent, Location requestedLocation) { - if (obj.getParent() != parent) - obj.moveToContainer(parent); // Remove from previous awareness TerrainMap oldMap = getTerrainMap(requestedLocation.getTerrain()); if (oldMap != null) @@ -101,6 +96,8 @@ public class AwarenessHandler { obj.setLocation(requestedLocation); // Update awareness obj.resetAwareness(); + if (obj.getParent() != parent) + obj.moveToContainer(parent); } public void disappearObject(SWGObject obj, boolean disappearObjects, boolean disappearCustom) { diff --git a/src/resources/objects/awareness/DataTransformHandler.java b/src/resources/objects/awareness/DataTransformHandler.java index d5f994eca..d7c7a7314 100644 --- a/src/resources/objects/awareness/DataTransformHandler.java +++ b/src/resources/objects/awareness/DataTransformHandler.java @@ -28,39 +28,26 @@ package resources.objects.awareness; import resources.Location; -import resources.buildout.BuildoutArea; import resources.objects.SWGObject; -import resources.objects.creature.CreatureObject; import network.packets.swg.zone.UpdateTransformMessage; import network.packets.swg.zone.UpdateTransformWithParentMessage; public class DataTransformHandler { - private final SpeedCheckHandler speedCheckHandler; - private boolean speedCheckEnabled; - public DataTransformHandler() { - speedCheckHandler = new SpeedCheckHandler(); - speedCheckEnabled = true; + } public void setSpeedCheck(boolean enabled) { - this.speedCheckEnabled = enabled; + } public boolean handleMove(SWGObject obj, Location requestedLocation, double speed, int update) { - if (speedCheckEnabled && obj instanceof CreatureObject && ((CreatureObject) obj).isLoggedInPlayer()) - speedCheckHandler.moveObjectSpeedChecks((CreatureObject) obj, requestedLocation); - BuildoutArea area = obj.getBuildoutArea(); - if (area != null) - requestedLocation = area.adjustLocation(requestedLocation); obj.sendObservers(createTransform(obj, requestedLocation, speed, update)); return true; } public boolean handleMove(SWGObject obj, SWGObject parent, Location requestedLocation, double speed, int update) { - if (speedCheckEnabled && obj instanceof CreatureObject && ((CreatureObject) obj).isLoggedInPlayer()) - speedCheckHandler.moveObjectSpeedChecks((CreatureObject) obj, parent, requestedLocation); obj.sendObservers(createTransform(obj, parent.getObjectId(), requestedLocation, speed, update)); return true; } diff --git a/src/services/objects/ObjectAwareness.java b/src/services/objects/ObjectAwareness.java index 2c6141d08..1fca3c6aa 100644 --- a/src/services/objects/ObjectAwareness.java +++ b/src/services/objects/ObjectAwareness.java @@ -40,6 +40,11 @@ import intents.server.ConfigChangedIntent; import main.ProjectSWG; import network.packets.Packet; import network.packets.swg.zone.CmdSceneReady; +import network.packets.swg.zone.HeartBeat; +import network.packets.swg.zone.ParametersMessage; +import network.packets.swg.zone.chat.ChatOnConnectAvatar; +import network.packets.swg.zone.chat.VoiceChatStatus; +import network.packets.swg.zone.insertion.ChatServerStatus; import network.packets.swg.zone.insertion.CmdStartScene; import network.packets.swg.zone.object_controller.DataTransform; import network.packets.swg.zone.object_controller.DataTransformWithParent; @@ -55,6 +60,8 @@ import resources.objects.awareness.DataTransformHandler; import resources.objects.awareness.TerrainMap.TerrainMapCallback; import resources.objects.creature.CreatureObject; import resources.player.Player; +import resources.player.PlayerEvent; +import resources.player.PlayerState; import resources.server_info.Log; public class ObjectAwareness extends Service implements TerrainMapCallback { @@ -75,6 +82,7 @@ public class ObjectAwareness extends Service implements TerrainMapCallback { registerForIntent(MoveObjectIntent.TYPE); registerForIntent(ConfigChangedIntent.TYPE); registerForIntent(ContainerTransferIntent.TYPE); + registerForIntent(RequestZoneInIntent.TYPE); } @Override @@ -118,6 +126,10 @@ public class ObjectAwareness extends Service implements TerrainMapCallback { if (i instanceof ContainerTransferIntent) processContainerTransferIntent((ContainerTransferIntent) i); break; + case RequestZoneInIntent.TYPE: + if (i instanceof RequestZoneInIntent) + handleZoneIn(((RequestZoneInIntent) i).getCreature(), ((RequestZoneInIntent) i).getPlayer(), ((RequestZoneInIntent) i).isFirstZone()); + break; default: break; } @@ -157,12 +169,6 @@ public class ObjectAwareness extends Service implements TerrainMapCallback { case PE_DESTROYED: creature.setOwner(null); break; - case PE_ZONE_IN_CLIENT: - startScene(creature); - break; - case PE_ZONE_IN_SERVER: - p.sendPacket(new CmdSceneReady()); - break; default: break; } @@ -172,6 +178,8 @@ public class ObjectAwareness extends Service implements TerrainMapCallback { SWGObject object = oci.getObject(); if (object.getParent() == null) moveObject(object, object.getLocation()); + else + moveObject(object, object.getParent(), object.getLocation()); } private void handleDestroyObjectIntent(DestroyObjectIntent doi) { @@ -181,13 +189,14 @@ public class ObjectAwareness extends Service implements TerrainMapCallback { } private void processObjectTeleportIntent(ObjectTeleportIntent oti) { - SWGObject object = oti.getObject(); - Player owner = object.getOwner(); - object.setLocation(oti.getNewLocation()); - if (oti.getParent() != object.getParent()) - object.moveToContainer(oti.getParent()); - if (object instanceof CreatureObject && ((CreatureObject) object).isLoggedInPlayer()) - new RequestZoneInIntent(owner, (CreatureObject) object, false).broadcast(); + SWGObject obj = oti.getObject(); + Player owner = obj.getOwner(); + if (oti.getParent() != null) + moveObject(obj, oti.getParent(), oti.getNewLocation()); + else + moveObject(obj, oti.getNewLocation()); + if (obj instanceof CreatureObject && ((CreatureObject) obj).isLoggedInPlayer()) + handleZoneIn((CreatureObject) obj, owner, false); } private void processGalacticPacketIntent(GalacticPacketIntent i) { @@ -209,6 +218,8 @@ public class ObjectAwareness extends Service implements TerrainMapCallback { requestedLocation.setTerrain(obj.getTerrain()); moveObjectWithTransform(obj, parent, requestedLocation, trans.getSpeed(), trans.getUpdateCounter()); } + } else if (packet instanceof CmdSceneReady) { + handleCmdSceneReady(i.getPlayerManager().getPlayerFromNetworkId(i.getNetworkId()), (CmdSceneReady) packet); } } @@ -226,9 +237,33 @@ public class ObjectAwareness extends Service implements TerrainMapCallback { private void processContainerTransferIntent(ContainerTransferIntent i) { if (i.getContainer() == null) - awarenessHandler.moveObject(i.getObject(), i.getObject().getLocation()); + moveObject(i.getObject(), i.getObject().getLocation()); else - awarenessHandler.moveObject(i.getObject(), i.getContainer(), i.getObject().getLocation()); + moveObject(i.getObject(), i.getContainer(), i.getObject().getLocation()); + } + + private void handleZoneIn(CreatureObject creature, Player player, boolean firstZone) { + creature.setOwner(player); + player.setPlayerState(PlayerState.ZONING_IN); + Log.i(this, "Zoning in %s with character %s", player.getUsername(), player.getCharacterName()); + if (firstZone) + startFirstZone(creature, player); + startZone(creature, player); + } + + private void startFirstZone(CreatureObject creature, Player player) { + player.sendPacket(new HeartBeat()); + player.sendPacket(new ChatServerStatus(true)); + player.sendPacket(new VoiceChatStatus()); + player.sendPacket(new ParametersMessage()); + player.sendPacket(new ChatOnConnectAvatar()); + new PlayerEventIntent(player, PlayerEvent.PE_FIRST_ZONE).broadcast(); + } + + private void startZone(CreatureObject creature, Player player) { + creature.clearCustomAware(false); + startScene(creature); + new PlayerEventIntent(player, PlayerEvent.PE_ZONE_IN_CLIENT).broadcast(); } private void startScene(CreatureObject creature) { @@ -248,6 +283,13 @@ public class ObjectAwareness extends Service implements TerrainMapCallback { } } + private void handleCmdSceneReady(Player player, CmdSceneReady p) { + player.setPlayerState(PlayerState.ZONED_IN); + Log.i("ZoneService", "%s with character %s zoned in from %s:%d", player.getUsername(), player.getCharacterName(), p.getAddress(), p.getPort()); + new PlayerEventIntent(player, PlayerEvent.PE_ZONE_IN_SERVER).broadcast(); + player.sendPacket(new CmdSceneReady()); + } + private void recursiveCreateObject(SWGObject obj, Player owner) { SWGObject parent = obj.getParent(); if (parent != null) @@ -257,33 +299,25 @@ public class ObjectAwareness extends Service implements TerrainMapCallback { } private void moveObject(SWGObject obj, Location requestedLocation) { - if (requestedLocation == null) - awarenessHandler.disappearObject(obj, true, true); - else - awarenessHandler.moveObject(obj, requestedLocation); + awarenessHandler.moveObject(obj, requestedLocation); } private void moveObject(SWGObject obj, SWGObject parent, Location requestedLocation) { - if (requestedLocation == null) - awarenessHandler.disappearObject(obj, true, true); - else - awarenessHandler.moveObject(obj, parent, requestedLocation); + awarenessHandler.moveObject(obj, parent, requestedLocation); } private void moveObjectWithTransform(SWGObject obj, Location requestedLocation, double speed, int update) { - if (!dataTransformHandler.handleMove(obj, requestedLocation, speed, update)) - return; + moveObject(obj, requestedLocation); + dataTransformHandler.handleMove(obj, requestedLocation, speed, update); if (obj instanceof CreatureObject && ((CreatureObject) obj).isLoggedInPlayer()) new PlayerTransformedIntent((CreatureObject) obj, obj.getParent(), null, obj.getLocation(), requestedLocation).broadcast(); - moveObject(obj, requestedLocation); } private void moveObjectWithTransform(SWGObject obj, SWGObject parent, Location requestedLocation, double speed, int update) { - if (!dataTransformHandler.handleMove(obj, parent, requestedLocation, speed, update)) - return; + moveObject(obj, parent, requestedLocation); + dataTransformHandler.handleMove(obj, parent, requestedLocation, speed, update); if (obj instanceof CreatureObject && ((CreatureObject) obj).isLoggedInPlayer()) new PlayerTransformedIntent((CreatureObject) obj, obj.getParent(), parent, obj.getLocation(), requestedLocation).broadcast(); - moveObject(obj, parent, requestedLocation); } private void disappearObject(SWGObject obj, boolean disappearObjects, boolean disappearCustom) { diff --git a/src/services/player/ZoneManager.java b/src/services/player/ZoneManager.java index e0f931234..bcee52f20 100644 --- a/src/services/player/ZoneManager.java +++ b/src/services/player/ZoneManager.java @@ -29,7 +29,6 @@ package services.player; import intents.GalacticIntent; import intents.PlayerEventIntent; -import intents.RequestZoneInIntent; import intents.chat.ChatBroadcastIntent; import intents.network.GalacticPacketIntent; import network.packets.Packet; @@ -37,17 +36,13 @@ import network.packets.swg.login.AccountFeatureBits; import network.packets.swg.login.ClientIdMsg; import network.packets.swg.login.ClientPermissionsMessage; import network.packets.swg.login.ConnectionServerLagResponse; -import network.packets.swg.zone.CmdSceneReady; import network.packets.swg.zone.HeartBeat; import network.packets.swg.zone.LagRequest; -import network.packets.swg.zone.ParametersMessage; import network.packets.swg.zone.SetWaypointColor; import network.packets.swg.zone.ShowBackpack; import network.packets.swg.zone.ShowHelmet; -import network.packets.swg.zone.chat.ChatOnConnectAvatar; import network.packets.swg.zone.chat.ChatSystemMessage; -import network.packets.swg.zone.chat.VoiceChatStatus; -import network.packets.swg.zone.insertion.ChatServerStatus; + import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.lib.Constants; @@ -58,14 +53,12 @@ import resources.config.ConfigFile; import resources.control.Intent; import resources.control.Manager; import resources.objects.creature.CreatureMood; -import resources.objects.creature.CreatureObject; import resources.objects.player.PlayerObject; import resources.objects.waypoint.WaypointObject; import resources.objects.waypoint.WaypointObject.WaypointColor; import resources.player.Player; import resources.player.PlayerEvent; import resources.player.PlayerFlags; -import resources.player.PlayerState; import resources.player.Player.PlayerServer; import resources.server_info.Log; @@ -84,7 +77,7 @@ public class ZoneManager extends Manager { addChildService(characterCreationService); - registerForIntent(RequestZoneInIntent.TYPE); + registerForIntent(PlayerEventIntent.TYPE); registerForIntent(GalacticPacketIntent.TYPE); } @@ -96,21 +89,34 @@ public class ZoneManager extends Manager { @Override public void onIntentReceived(Intent i) { - if (i instanceof RequestZoneInIntent) { - RequestZoneInIntent zii = (RequestZoneInIntent) i; - zoneInPlayer(zii.getPlayer(), zii.getCreature(), zii.isFirstZone()); + if (i instanceof PlayerEventIntent) { + handlePlayerEventIntent(((PlayerEventIntent) i).getPlayer(), ((PlayerEventIntent) i).getEvent()); } else if (i instanceof GalacticPacketIntent) { GalacticPacketIntent gpi = (GalacticPacketIntent) i; handlePacket(gpi, gpi.getPlayerManager().getPlayerFromNetworkId(gpi.getNetworkId()), gpi.getNetworkId(), gpi.getPacket()); } } - public void handlePacket(GalacticIntent intent, Player player, long networkId, Packet p) { + private void handlePlayerEventIntent(Player player, PlayerEvent event) { + switch (event) { + case PE_FIRST_ZONE: + player.getPlayerObject().setStartPlayTime((int) System.currentTimeMillis()); + sendCommitHistory(player); + sendMessageOfTheDay(player); + break; + case PE_ZONE_IN_CLIENT: + player.getCreatureObject().setMoodId(CreatureMood.NONE.getMood()); + player.getPlayerObject().clearFlagBitmask(PlayerFlags.LD); + break; + default: + break; + } + } + + private void handlePacket(GalacticIntent intent, Player player, long networkId, Packet p) { characterCreationService.handlePacket(intent, player, networkId, p); if (p instanceof ClientIdMsg) handleClientIdMsg(player, (ClientIdMsg) p); - if (p instanceof CmdSceneReady) - handleCmdSceneReady(player, (CmdSceneReady) p); if (p instanceof SetWaypointColor) handleSetWaypointColor(player, (SetWaypointColor) p); if(p instanceof ShowBackpack) @@ -129,23 +135,6 @@ public class ZoneManager extends Manager { player.sendPacket(new ConnectionServerLagResponse()); } - private void zoneInPlayer(Player player, CreatureObject creature, boolean firstZone) { - PlayerObject playerObj = creature.getPlayerObject(); - player.setPlayerState(PlayerState.ZONING_IN); - creature.setOwner(player); - initPlayerBeforeZoneIn(player, creature, playerObj); - Log.i("ObjectManager", "Zoning in %s with character %s", player.getUsername(), player.getCharacterName()); - - if (firstZone) { - sendZonePackets(player, creature); - playerObj.setStartPlayTime((int) System.currentTimeMillis()); - sendCommitHistory(player); - sendMessageOfTheDay(player); - new PlayerEventIntent(player, PlayerEvent.PE_FIRST_ZONE).broadcast(); - } - new PlayerEventIntent(player, PlayerEvent.PE_ZONE_IN_CLIENT).broadcast(); - } - private void loadCommitHistory() { File repoDir = new File("./" + Constants.DOT_GIT); int commitCount = 3; @@ -185,20 +174,6 @@ public class ZoneManager extends Manager { new ChatBroadcastIntent(player, message).broadcast(); // Send it } - private void sendZonePackets(Player player, CreatureObject creature) { - player.sendPacket(new HeartBeat()); - player.sendPacket(new ChatServerStatus(true)); - player.sendPacket(new VoiceChatStatus()); - player.sendPacket(new ParametersMessage()); - player.sendPacket(new ChatOnConnectAvatar()); - } - - private void initPlayerBeforeZoneIn(Player player, CreatureObject creatureObj, PlayerObject playerObj) { - creatureObj.setMoodId(CreatureMood.NONE.getMood()); - playerObj.clearFlagBitmask(PlayerFlags.LD); // Ziggy: Clear the LD flag in case it wasn't already. - creatureObj.clearCustomAware(false); - } - private void handleShowBackpack(Player player, ShowBackpack p) { player.getPlayerObject().setShowBackpack(p.showingBackpack()); } @@ -228,12 +203,6 @@ public class ZoneManager extends Manager { ghost.updateWaypoint(waypoint); } - private void handleCmdSceneReady(Player player, CmdSceneReady p) { - new PlayerEventIntent(player, PlayerEvent.PE_ZONE_IN_SERVER).broadcast(); - player.setPlayerState(PlayerState.ZONED_IN); - Log.i("ZoneService", "%s with character %s zoned in from %s:%d", player.getUsername(), player.getCharacterName(), p.getAddress(), p.getPort()); - } - private void handleClientIdMsg(Player player, ClientIdMsg clientId) { Log.i("ZoneService", "%s connected to the zone server from %s:%d", player.getUsername(), clientId.getAddress(), clientId.getPort()); player.setPlayerServer(PlayerServer.ZONE);