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); }
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(); }