From b43a6885c56b2833bd651a965f9fb8595f201bea Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Sun, 31 Jul 2016 21:48:17 -0400 Subject: [PATCH] Added functions to allow for an improved seamless zone change. Player can now pull actors from two zones when performing a seamless zone change to give a improved feel. --- FFXIVClassic Map Server/WorldManager.cs | 26 ++++++++++++++++++- FFXIVClassic Map Server/actors/Actor.cs | 3 ++- .../actors/chara/player/Player.cs | 12 ++++++--- 3 files changed, 36 insertions(+), 5 deletions(-) diff --git a/FFXIVClassic Map Server/WorldManager.cs b/FFXIVClassic Map Server/WorldManager.cs index dcc30dcf..5d2a4987 100644 --- a/FFXIVClassic Map Server/WorldManager.cs +++ b/FFXIVClassic Map Server/WorldManager.cs @@ -324,7 +324,7 @@ namespace FFXIVClassic_Map_Server z.SpawnAllActors(true); } - //Moves the actor to the new zone if exists. No packets are sent nor position changed. + //Moves the actor to the new zone if exists. No packets are sent nor position changed. Merged zone is removed. public void DoSeamlessZoneChange(Player player, uint destinationZoneId) { Area oldZone; @@ -344,6 +344,30 @@ namespace FFXIVClassic_Map_Server newZone.AddActorToZone(player); + player.zone = newZone; + player.zoneId = destinationZoneId; + + player.zone2 = null; + player.zoneId2 = 0; + + LuaEngine.OnZoneIn(player); + } + + //Adds a second zone to pull actors from. Used for an improved seamless zone change. + public void MergeZones(Player player, uint mergedZoneId) + { + //Add player to new zone and update + Zone mergedZone = GetZone(mergedZoneId); + + //This server does not contain that zoneId + if (mergedZone == null) + return; + + mergedZone.AddActorToZone(player); + + player.zone2 = mergedZone; + player.zoneId2 = mergedZone.actorId; + LuaEngine.OnZoneIn(player); } diff --git a/FFXIVClassic Map Server/actors/Actor.cs b/FFXIVClassic Map Server/actors/Actor.cs index 9214a075..d2cad928 100644 --- a/FFXIVClassic Map Server/actors/Actor.cs +++ b/FFXIVClassic Map Server/actors/Actor.cs @@ -25,8 +25,9 @@ namespace FFXIVClassic_Map_Server.Actors public ushort moveState, oldMoveState; public float[] moveSpeeds = new float[5]; - public uint zoneId; + public uint zoneId, zoneId2; public Area zone = null; + public Area zone2 = null; public bool isZoning = false; public bool spawnedFirstTime = false; diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs index 3f19e2f5..47d702e7 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Player.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs @@ -1245,9 +1245,15 @@ namespace FFXIVClassic_Map_Server.Actors public void SendInstanceUpdate() { - //Update Instance - playerSession.UpdateInstance(zone.GetActorsAroundActor(this, 50)); - + //Update Instance + + List aroundMe = new List(); + + aroundMe.AddRange(zone.GetActorsAroundActor(this, 50)); + if (zone2 != null) + aroundMe.AddRange(zone2.GetActorsAroundActor(this, 50)); + playerSession.UpdateInstance(aroundMe); + } }