public Task TeleportSubCommandHandler(CommandContext context, string command, string[] parameters) { string name = parameters.Length == 0 ? context.Session.Player.Name : string.Join(" ", parameters); Residence residence = ResidenceManager.GetResidence(name).GetAwaiter().GetResult(); if (residence == null) { if (parameters.Length == 0) { residence = ResidenceManager.CreateResidence(context.Session.Player); } else { context.SendMessageAsync("A residence for that character doesn't exist!"); return(Task.CompletedTask); } } ResidenceEntrance entrance = ResidenceManager.GetResidenceEntrance(residence); context.Session.Player.TeleportTo(entrance.Entry, entrance.Position, 0u, residence.Id); return(Task.CompletedTask); }
public static void HandleCharacterSelect(WorldSession session, ClientCharacterSelect characterSelect) { Character character = session.Characters.SingleOrDefault(c => c.Id == characterSelect.CharacterId); if (character == null) { session.EnqueueMessageEncrypted(new ServerCharacterSelectFail { Result = CharacterSelectResult.Failed }); return; } session.Player = new Player(session, character); WorldEntry entry = GameTableManager.World.GetEntry(character.WorldId); if (entry == null) { throw new ArgumentOutOfRangeException(); } switch (entry.Type) { // housing map case 5: { // characters logging in to a housing map are returned to their own residence session.EnqueueEvent(new TaskGenericEvent <Residence>(ResidenceManager.GetResidence(session.Player.Name), residence => { if (residence == null) { residence = ResidenceManager.CreateResidence(session.Player); } ResidenceEntrance entrance = ResidenceManager.GetResidenceEntrance(residence); var mapInfo = new MapInfo(entrance.Entry, 0u, residence.Id); MapManager.AddToMap(session.Player, mapInfo, entrance.Position); })); break; } default: { var mapInfo = new MapInfo(entry); var vector3 = new Vector3(character.LocationX, character.LocationY, character.LocationZ); MapManager.AddToMap(session.Player, mapInfo, vector3); break; } } }
public static void HandleHousingVisit(WorldSession session, ClientHousingVisit housingVisit) { if (!(session.Player.Map is ResidenceMap)) { throw new InvalidPacketValueException(); } Task <Residence> residenceTask; if (housingVisit.TargetResidenceName != "") { residenceTask = ResidenceManager.GetResidence(housingVisit.TargetResidenceName); } else if (housingVisit.TargetResidence.ResidenceId != 0ul) { residenceTask = ResidenceManager.GetResidence(housingVisit.TargetResidence.ResidenceId); } else { throw new NotImplementedException(); } session.EnqueueEvent(new TaskGenericEvent <Residence>(residenceTask, residence => { if (residence == null) { // TODO: show error return; } switch (residence.PrivacyLevel) { case ResidencePrivacyLevel.Private: { // TODO: show error return; } // TODO: check if player is either a neighbour or roommate case ResidencePrivacyLevel.NeighborsOnly: break; case ResidencePrivacyLevel.RoommatesOnly: break; } // teleport player to correct residence instance ResidenceEntrance entrance = ResidenceManager.GetResidenceEntrance(residence); session.Player.TeleportTo(entrance.Entry, entrance.Position, 0u, residence.Id); })); }