private static void ApplyEffect(Session Session, ClientMessage Message) { int EffectSpriteId = Message.PopWiredInt32(); if (EffectSpriteId < 0) { EffectSpriteId = 0; } RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null) { return; } RoomActor Actor = Instance.GetActorByReferenceId(Session.CharacterId); if (Actor == null || (EffectSpriteId != 0 && !Session.AvatarEffectCache.HasEffect(EffectSpriteId, true))) { return; } Actor.ApplyEffect(EffectSpriteId); Session.CurrentEffect = EffectSpriteId; }
public static void HandleData(Session Session, ClientMessage Message) { if (Session == null || Session.Stopped || Message == null) { return; } if (!mCallbacks.ContainsKey(Message.Id)) { string text = System.IO.File.ReadAllText(Environment.CurrentDirectory + "\\packet-log.txt"); Output.WriteLine("Unhandled packet: " + Message.Id + " (" + Constants.DefaultEncoding.GetString(Base64Encoding.EncodeUint32(Message.Id, 2)) + "), no suitable handler found.", OutputLevel.Warning); System.IO.StreamWriter file = new System.IO.StreamWriter(Environment.CurrentDirectory + "\\packet-log.txt"); file.WriteLine(text + "Unhandled packet: " + Message.Id + " (" + Constants.DefaultEncoding.GetString(Base64Encoding.EncodeUint32(Message.Id, 2)) + "), no suitable handler found.", OutputLevel.Notification + "\n\n"); file.Close(); return; } if (!Session.Authenticated && !mCallbacksWithoutAuthentication.Contains(Message.Id)) { return; } mCallbacks[Message.Id].Invoke(Session, Message); }
private static void SubmitAnswer(Session Session, ClientMessage Message) { RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null) { return; } RoomActor Actor = Instance.GetActorByReferenceId(Session.CharacterId); if (Actor == null) { return; } int AnswerId = Message.PopWiredInt32(); lock (mInfobusQuestions) { if (mInfobusQuestions.ContainsKey(Instance.RoomId)) { mInfobusQuestions[Instance.RoomId].SubmitAnswer(Actor.Id, AnswerId); } } }
private static void DeleteSticky(Session Session, ClientMessage Message) { RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null || !Instance.CheckUserRights(Session, true)) { return; } Item Item = Instance.GetItem(Message.PopWiredUInt32()); if (Item == null || Item.Definition.Behavior != ItemBehavior.StickyNote) { return; } if (Instance.TakeItem(Item.Id)) { Instance.RegenerateRelativeHeightmap(); using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { Item.RemovePermanently(MySqlClient); } } }
private static void AlertRoom(Session Session, ClientMessage Message) { if (!Session.HasRight("moderation_tool")) { return; } RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null) { Session.SendData(NotificationMessageComposer.Compose("Could not send room alert.")); return; } int Unknown1 = Message.PopWiredInt32(); int AlertMode = Message.PopWiredInt32(); string AlertMessage = Message.PopString(); bool IsCaution = AlertMode != 3; Instance.SendModerationAlert(AlertMessage, IsCaution); using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { ModerationLogs.LogModerationAction(MySqlClient, Session, "Sent room " + (IsCaution ? "caution" : "message"), "Room " + Instance.Info.Name + " (ID " + Instance.RoomId + "): '" + AlertMessage + "'"); } }
private static void BanUser(Session Session, ClientMessage Message) { if (!Session.HasRight("moderation_tool")) { return; } uint UserId = Message.PopWiredUInt32(); string MessageText = Message.PopString(); double Length = (Message.PopWiredInt32() * 3600); Session TargetSession = SessionManager.GetSessionByCharacterId(UserId); if (TargetSession == null || TargetSession.HasRight("moderation_tool")) { Session.SendData(NotificationMessageComposer.Compose("This user is not online or you do not have permission to ban them.\nPlease use housekeeping to ban users that are offline.")); return; } SessionManager.StopSession(TargetSession.Id); using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { ModerationBanManager.BanUser(MySqlClient, UserId, MessageText, Session.CharacterId, Length); ModerationLogs.LogModerationAction(MySqlClient, Session, "Banned user", "User '" + TargetSession.CharacterInfo.Username + "' (ID " + TargetSession.CharacterId + ") for " + Length + " hours: '" + MessageText + "'"); } }
private static void OnSessionLatencyTest(Session Session, ClientMessage Message) { // Sesion timer sends a number to the server and expects it right back. // Maybe something to do with latency testing... or a keepalive? // Seems like a waste of bandwith since we're using pinging Session.SendData(LatencyTestResponseComposer.Compose(Message.PopWiredInt32())); }
private static void OnClientDisconnectNotification(Session Session, ClientMessage Message) { RoomInstance Instance1 = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); RoomActor Actor = Instance1.GetActorByReferenceId(Session.CharacterInfo.Id); Instance1.BroadcastMessage(RoomChatComposer.Compose(Actor.Id, "-- Logging out in 10 seconds! -- [DISCONNECED]", 0, ChatType.Shout)); System.Threading.Thread.Sleep(10000); SessionManager.StopSession(Session.Id); }
private static void InitCrypto(Session Session, ClientMessage Message) { if (Session.Authenticated) { return; } Session.SendData(SessionParamsComposer.Compose()); }
private static void SsoLogin(Session Session, ClientMessage Message) { if (Session.Authenticated) { return; } string Ticket = UserInputFilter.FilterString(Message.PopString()); Session.TryAuthenticate(Ticket, Session.RemoteAddress.ToString()); }
private static void OnUserAgent(Session Session, ClientMessage Message) { string UserAgent = Message.PopString(); if (UserAgent.Length > 2000) { UserAgent = UserAgent.Substring(0, 2000); } Session.UserAgent = UserAgent; }
private static void TradeComplete(Session Session, ClientMessage Message) { RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null) { return; } Trade Trade = Instance.TradeManager.GetTradeForUser(Session.CharacterId); if (Trade == null) { return; } Session TargetSession = SessionManager.GetSessionByCharacterId(Trade.UserOne == Session.CharacterId ? Trade.UserTwo : Trade.UserOne); if (TargetSession == null || !Trade.AcceptTrade(Trade.UserOne == Session.CharacterId)) { return; } if (Trade.TradeStage == TradeStage.Finalized) { Session User1 = (TargetSession.CharacterId == Trade.UserOne ? TargetSession : Session); Session User2 = (TargetSession.CharacterId == Trade.UserTwo ? TargetSession : Session); Trade.DeliverItems(User1, User2); Session.SendData(TradeFinalizedComposer.Compose()); TargetSession.SendData(TradeFinalizedComposer.Compose()); Instance.TradeManager.StopTradeForUser(Session.CharacterId); Instance.TradeManager.StopTradeForUser(TargetSession.CharacterId); RoomActor Actor1 = Instance.GetActorByReferenceId(Session.CharacterId); RoomActor Actor2 = Instance.GetActorByReferenceId(TargetSession.CharacterId); if (Actor1 != null) { Actor1.RemoveStatus("trd"); Actor1.UpdateNeeded = true; } if (Actor2 != null) { Actor2.RemoveStatus("trd"); Actor2.UpdateNeeded = true; } } }
private static void ActivateEffect(Session Session, ClientMessage Message) { AvatarEffect Effect = Session.AvatarEffectCache.GetEffect(Message.PopWiredInt32(), false, true); // If we do not have an effect that needs activating OR if we already have an effect // of this sort which IS activated, stop. if (Effect == null || Session.AvatarEffectCache.HasEffect(Effect.SpriteId, true)) { return; } Effect.Activate(); Session.SendData(UserEffectActivatedComposer.Compose(Effect)); }
private static void GetIgnoredUsers(Session Session, ClientMessage Message) { ReadOnlyCollection<uint> IgnoredUsers = Session.IgnoreCache.List; List<string> Names = new List<string>(); foreach (uint IgnoredUser in IgnoredUsers) { string Name = CharacterResolverCache.GetNameFromUid(IgnoredUser); if (Name != "Unknown User" && !Names.Contains(Name)) { Names.Add(Name); } } Session.SendData(IgnoredUserListComposer.Compose(Names)); }
private static void OnClientConfig(Session Session, ClientMessage Message) { int Volume = Message.PopWiredInt32(); bool Something = Message.PopWiredBoolean(); if (Volume < 0) { Volume = 0; } if (Volume > 100) { Volume = 100; } Session.CharacterInfo.ConfigVolume = Volume; }
private static void GetMoodlightInfo(Session Session, ClientMessage Message) { RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null || !Instance.CheckUserRights(Session, true)) { return; } Item Item = Instance.MoodlightItem; if (Item == null) { return; } Session.SendData(MoodlightDataComposer.Compose(MoodlightData.GenerateFromFlags(Item.Flags))); }
private static void TradeAccept(Session Session, ClientMessage Message) { RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null) { return; } Trade Trade = Instance.TradeManager.GetTradeForUser(Session.CharacterId); if (Trade == null || !Trade.AcceptTrade(Trade.UserOne == Session.CharacterId)) { return; } ServerMessage TradeAcceptState = TradeAcceptStateComposer.Compose(Session.CharacterId, true); ServerMessage TradeFinalizing = (Trade.TradeStage == TradeStage.Finalizing ? TradeFinalizingComposer.Compose() : null); Session.SendData(TradeAcceptState); if (TradeFinalizing != null) { Session.SendData(TradeFinalizing); } Session TargetSession = SessionManager.GetSessionByCharacterId(Trade.UserOne == Session.CharacterId ? Trade.UserTwo : Trade.UserOne); if (TargetSession != null) { TargetSession.SendData(TradeAcceptState); if (TradeFinalizing != null) { TargetSession.SendData(TradeFinalizing); } } }
private static void SetWardrobe(Session Session, ClientMessage Message) { int SlotAmount = GetWardrobeSlotAmountForSession(Session); int SlotId = Message.PopWiredInt32(); string Figure = Message.PopString(); CharacterGender Gender = (Message.PopString() == "M" ? CharacterGender.Male : CharacterGender.Female); if (SlotId <= 0 || SlotId > SlotAmount) { return; } using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { Session.CharacterInfo.SetWardrobeSlot(MySqlClient, SlotId, Figure, Gender); } }
private static void SetMotto(Session Session, ClientMessage Message) { }
private static void SetFigure(Session Session, ClientMessage Message) { // todo: verify data(!!!!) string NewGender = Message.PopString().ToLower(); string NewFigure = UserInputFilter.FilterString(Message.PopString()); if (NewGender != "m" && NewGender != "f") { NewGender = "m"; } if (NewFigure.Length == 0 || (NewFigure == Session.CharacterInfo.Figure)) { return; } using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { Session.CharacterInfo.UpdateFigure(MySqlClient, NewGender, NewFigure); AchievementManager.ProgressUserAchievement(MySqlClient, Session, "ACH_AvatarLooks", 1); } QuestManager.ProgressUserQuest(Session, QuestType.PROFILE_CHANGE_LOOK); Session.SendInfoUpdate(); }
private static void SetBadgeOrder(Session Session, ClientMessage Message) { int i = 0; Dictionary<int, Badge> NewSettings = new Dictionary<int, Badge>(); while (Message.RemainingLength > 0) { if (i > 5) { continue; } int SlotId = Message.PopWiredInt32(); string BadgeCode = Message.PopString(); Badge BadgeRef = RightsManager.GetBadgeByCode(BadgeCode); if (BadgeRef == null || !Session.BadgeCache.ContainsCode(BadgeCode) || SlotId >= 6 || SlotId <= 0 || NewSettings.ContainsKey(SlotId)) { continue; } NewSettings.Add(SlotId, BadgeRef); i++; } using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { Session.BadgeCache.UpdateBadgeOrder(MySqlClient, NewSettings); } RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null) { return; } Instance.BroadcastMessage(RoomUserBadgesComposer.Compose(Session.CharacterId, Session.BadgeCache.EquippedBadges)); QuestManager.ProgressUserQuest(Session, QuestType.PROFILE_BADGE); }
private static void MarkTabRead(Session Session, ClientMessage Message) { Session.NewItemsCache.MarkTabRead(Message.PopWiredInt32()); }
private static void GetWardrobe(Session Session, ClientMessage Message) { int SlotAmount = GetWardrobeSlotAmountForSession(Session); if (SlotAmount == 0) { return; } Dictionary<int, WardrobeItem> ValidItems = new Dictionary<int, WardrobeItem>(); foreach (KeyValuePair<int, WardrobeItem> Item in Session.CharacterInfo.Wardrobe) { if (Item.Key > SlotAmount) { continue; } ValidItems.Add(Item.Key, Item.Value); } Session.SendData(UserWardrobeComposer.Compose(new Dictionary<int, WardrobeItem>(ValidItems))); }
private static void GetPetInventory(Session Session, ClientMessage Message) { Session.SendData(PetInventoryComposer.Compose(Session.PetInventoryCache.Pets)); }
private static void GetObjectInventory(Session Session, ClientMessage Message) { Session.SendData(InventoryComposer.Compose("S", Session.InventoryCache.GetFloorItems().Values.ToList())); Session.SendData(InventoryComposer.Compose("I", Session.InventoryCache.GetWallItems().Values.ToList())); }
private static void GetBadgeInventory(Session Session, ClientMessage Message) { Session.SendData(UserBadgeInventoryComposer.Compose(Session.BadgeCache.Badges, Session.BadgeCache.EquippedBadges)); }
private static ServerMessage TryGetResponseFromCache(uint GroupId, ClientMessage Request) { return (CacheEnabled ? mCacheController.TryGetResponse(GroupId, Request) : null); }
private static void GetBalance(Session Session, ClientMessage Message) { Session.SendData(CreditsBalanceComposer.Compose(Session.CharacterInfo.CreditsBalance)); Session.SendData(ActivityPointsBalanceComposer.Compose(Session.CharacterInfo.ActivityPointsBalance, 0)); }
private static void GetSubscriptionData(Session Session, ClientMessage Message) { Session.SendData(SubscriptionStatusComposer.Compose(Session.SubscriptionManager)); }
private static void GetUserInfo(Session Session, ClientMessage Message) { Session.SendData(UserObjectComposer.Compose(Session)); Session.SendData(AchievementScoreUpdateComposer.Compose(Session.CharacterInfo.Score)); }