diff --git a/Source/ACE.Server/Managers/WorldManager.cs b/Source/ACE.Server/Managers/WorldManager.cs index 8740acb140..dbb6e1fb69 100644 --- a/Source/ACE.Server/Managers/WorldManager.cs +++ b/Source/ACE.Server/Managers/WorldManager.cs @@ -100,16 +100,10 @@ public static void PlayerEnterWorld(Session session, Character character) return; } - var start = DateTime.UtcNow; - DatabaseManager.Shard.GetPossessedBiotasInParallel(character.Id, biotas => - { - log.Debug($"GetPossessedBiotasInParallel for {character.Name} took {(DateTime.UtcNow - start).TotalMilliseconds:N0} ms"); - - ActionQueue.EnqueueAction(new ActionEventDelegate(() => DoPlayerEnterWorld(session, character, offlinePlayer.Biota, biotas))); - }); + ActionQueue.EnqueueAction(new ActionEventDelegate(() => DoPlayerEnterWorld(session, character, offlinePlayer.Biota))); } - private static void DoPlayerEnterWorld(Session session, Character character, Biota playerBiota, PossessedBiotas possessedBiotas) + private static void DoPlayerEnterWorld(Session session, Character character, Biota playerBiota) { Player player; @@ -150,11 +144,11 @@ private static void DoPlayerEnterWorld(Session session, Character character, Bio } if (playerBiota.WeenieType == WeenieType.Admin) - player = new Admin(playerBiota, possessedBiotas.Inventory, possessedBiotas.WieldedItems, character, session); + player = new Admin(playerBiota, character, session); else if (playerBiota.WeenieType == WeenieType.Sentinel) - player = new Sentinel(playerBiota, possessedBiotas.Inventory, possessedBiotas.WieldedItems, character, session); + player = new Sentinel(playerBiota, character, session); else - player = new Player(playerBiota, possessedBiotas.Inventory, possessedBiotas.WieldedItems, character, session); + player = new Player(playerBiota, character, session); session.SetPlayer(player); @@ -217,7 +211,13 @@ private static void DoPlayerEnterWorld(Session session, Character character, Bio if (olthoiPlayerReturnedToLifestone) session.Player.Location = new Position(session.Player.Sanctuary); - session.Player.PlayerEnterWorld(); + var start = DateTime.UtcNow; + DatabaseManager.Shard.GetPossessedBiotasInParallel(character.Id, biotas => + { + log.Debug($"GetPossessedBiotasInParallel for {character.Name} took {(DateTime.UtcNow - start).TotalMilliseconds:N0} ms"); + player.SetBiotas(biotas.Inventory, biotas.WieldedItems); + session.Player.PlayerEnterWorld(); + }); var success = LandblockManager.AddObject(session.Player, true); if (!success) @@ -274,7 +274,9 @@ private static void DoPlayerEnterWorld(Session session, Character character, Bio if (olthoiPlayerReturnedToLifestone) session.Network.EnqueueSend(new GameMessageSystemChat("You have returned to the Olthoi Queen to serve the hive.", ChatMessageType.Broadcast)); else if (playerLoggedInOnNoLogLandblock) // see http://acpedia.org/wiki/Mount_Elyrii_Hive - session.Network.EnqueueSend(new GameMessageSystemChat("The currents of portal space cannot return you from whence you came. Your previous location forbids login.", ChatMessageType.Broadcast)); + session.Network.EnqueueSend(new GameMessageSystemChat("The currents of portal space cannot return you from whence you came. Your previous location forbids login.", ChatMessageType.Broadcast)); + + } private static string AppendLines(params string[] lines) diff --git a/Source/ACE.Server/WorldObjects/Admin.cs b/Source/ACE.Server/WorldObjects/Admin.cs index e9e1aeac9a..f63ef21b68 100644 --- a/Source/ACE.Server/WorldObjects/Admin.cs +++ b/Source/ACE.Server/WorldObjects/Admin.cs @@ -27,6 +27,11 @@ public Admin(Biota biota, IEnumerable inventory SetEphemeralValues(); } + public Admin(Biota biota, Character character, Session session) : base(biota, character, session) + { + SetEphemeralValues(); + } + private void SetEphemeralValues() { //BaseDescriptionFlags |= ObjectDescriptionFlag.Admin; diff --git a/Source/ACE.Server/WorldObjects/Player.cs b/Source/ACE.Server/WorldObjects/Player.cs index efc7ae3237..ef1bad4e43 100644 --- a/Source/ACE.Server/WorldObjects/Player.cs +++ b/Source/ACE.Server/WorldObjects/Player.cs @@ -125,6 +125,19 @@ public Player(Biota biota, IEnumerable inventor UpdateCoinValue(false); } + public Player(Biota biota, Character character, Session session) : base(biota) + { + Character = character; + Session = session; + + Account = DatabaseManager.Authentication.GetAccountById(Character.AccountId); + + SetEphemeralValues(); + + UpdateCoinValue(false); + } + + public override void InitPhysicsObj() { base.InitPhysicsObj(); @@ -1201,5 +1214,11 @@ public void HandleActionEnterPkLite() }); actionChain.EnqueueChain(); } + + public void SetBiotas(IEnumerable inventory, IEnumerable wieldedItems) + { + SortBiotasIntoInventory(inventory); + AddBiotasToEquippedObjects(wieldedItems); + } } } diff --git a/Source/ACE.Server/WorldObjects/Player_Location.cs b/Source/ACE.Server/WorldObjects/Player_Location.cs index 0f5544cfef..ae0e9c0a4f 100644 --- a/Source/ACE.Server/WorldObjects/Player_Location.cs +++ b/Source/ACE.Server/WorldObjects/Player_Location.cs @@ -715,7 +715,7 @@ public void DoTeleportPhysicsStateChanges() public void OnTeleportComplete() { - if (CurrentLandblock != null && !CurrentLandblock.CreateWorldObjectsCompleted) + if ((CurrentLandblock != null && !CurrentLandblock.CreateWorldObjectsCompleted) || !this.EquippedObjectsLoaded) { // If the critical landblock resources haven't been loaded yet, we keep the player in the pink bubble state // We'll check periodically to see when it's safe to let them materialize in diff --git a/Source/ACE.Server/WorldObjects/Sentinel.cs b/Source/ACE.Server/WorldObjects/Sentinel.cs index e98faebf59..adae859381 100644 --- a/Source/ACE.Server/WorldObjects/Sentinel.cs +++ b/Source/ACE.Server/WorldObjects/Sentinel.cs @@ -39,6 +39,17 @@ public Sentinel(Biota biota, IEnumerable invent SetEphemeralValues(); } + public Sentinel(Biota biota, Character character, Session session) : base(biota, character, session) + { + if (!Character.IsPlussed) + { + Character.IsPlussed = true; + CharacterChangesDetected = true; + } + + SetEphemeralValues(); + } + private void SetEphemeralValues() { ObjectDescriptionFlags |= ObjectDescriptionFlag.Admin;