public static void SetHomeRealm(Player player, int realmId)
        {
            if (realmId < 1 || realmId > 0x7FFF)
            {
                log.Error($"SetHomeRealm must have a value between 1 and {0x7FFF}!" + Environment.NewLine + Environment.StackTrace);
                return;
            }
            var realm = RealmManager.GetRealm((ushort)realmId);

            if (realm == null)
            {
                log.Error($"SetHomeRealm from object references a missing realm with id {realmId}!" + Environment.NewLine + Environment.StackTrace);
                return;
            }
            log.Info($"Setting HomeRealm for character {player.Name} to {realm.Realm.Id}.");
            player.SetProperty(PropertyInt.HomeRealm, realm.Realm.Id);
            player.SetProperty(PropertyBool.RecallsDisabled, false);
            var loc = realm.DefaultStartingLocation(player);

            player.SetPosition(PositionType.Sanctuary, new ACE.Entity.Position(loc));
            WorldManager.ThreadSafeTeleport(player, loc, false, new Entity.Actions.ActionEventDelegate(() =>
            {
                //if (realm.StandardRules.GetProperty(RealmPropertyBool.IsDuelingRealm))
                //{
                DuelRealmHelpers.SetupNewCharacter(player);
                //}
            }));
            player.GrantXP((long)player.GetXPToNextLevel(10), XpType.Emote, ShareType.None);
        }
Esempio n. 2
0
        public static void HandleRecallDuels(Session session, params string[] parameters)
        {
            if (RealmManager.DuelRealm == null)
            {
                return;
            }
            var player = session.Player;

            if (!player.ValidatePlayerRealmPosition(DuelRealmHelpers.GetDuelingAreaDrop()))
            {
                return;
            }

            if (player.PKTimerActive)
            {
                session.Network.EnqueueSend(new GameEventWeenieError(session, WeenieError.YouHaveBeenInPKBattleTooRecently));
                return;
            }

            if (player.RecallsDisabled)
            {
                session.Network.EnqueueSend(new GameEventWeenieError(session, WeenieError.ExitTrainingAcademyToUseCommand));
                return;
            }

            if (player.TooBusyToRecall)
            {
                session.Network.EnqueueSend(new GameEventWeenieError(session, WeenieError.YoureTooBusy));
                return;
            }

            if (player.CombatMode != CombatMode.NonCombat)
            {
                // this should be handled by a different thing, probably a function that forces player into peacemode
                var updateCombatMode = new GameMessagePrivateUpdatePropertyInt(player, PropertyInt.CombatMode, (int)CombatMode.NonCombat);
                player.SetCombatMode(CombatMode.NonCombat);
                session.Network.EnqueueSend(updateCombatMode);
            }

            player.EnqueueBroadcast(new GameMessageSystemChat($"{player.Name} is recalling to the duel staging area.", ChatMessageType.Recall), Player.LocalBroadcastRange, ChatMessageType.Recall);

            player.SendMotionAsCommands(MotionCommand.MarketplaceRecall, MotionStance.NonCombat);

            var startPos = new Position(player.Location);

            // TODO: (OptimShi): Actual animation length is longer than in retail. 18.4s
            // float mpAnimationLength = MotionTable.GetAnimationLength((uint)MotionTableId, MotionCommand.MarketplaceRecall);
            // mpChain.AddDelaySeconds(mpAnimationLength);
            ActionChain mpChain = new ActionChain();

            mpChain.AddDelaySeconds(5);

            // Then do teleport
            player.IsBusy = true;
            mpChain.AddAction(player, () =>
            {
                player.IsBusy = false;
                var endPos    = new Position(player.Location);
                if (startPos.SquaredDistanceTo(endPos) > Player.RecallMoveThresholdSq)
                {
                    session.Network.EnqueueSend(new GameEventWeenieError(session, WeenieError.YouHaveMovedTooFar));
                    return;
                }

                player.Teleport(DuelRealmHelpers.GetDuelingAreaDrop());
            });

            // Set the chain to run
            mpChain.EnqueueChain();
        }