public void SendMessage(Character sender, MessageType messageType, string message, string targetName = "") { switch (messageType) { case MessageType.Normal: var players = sender.Map.Cells[sender.CellId].GetPlayers(sender.PosX, sender.PosZ, 50, Fraction.NotSelected, true); foreach (var player in players) { SendNormal((Character)player, sender.Id, message); } _taskQueue.Enqueue(ActionType.LOG_SAVE_CHAT_MESSAGE, sender.Client.UserID, sender.Id, sender.Name, MessageType.Normal.ToString(), message); break; case MessageType.Whisper: var target = _gameWorld.Players.Values.FirstOrDefault(p => p.Name == targetName); if (target != null && target.Id != sender.Id && target.Country == sender.Country) { SendWhisper(sender, sender.Name, message); SendWhisper(target, sender.Name, message); _taskQueue.Enqueue(ActionType.LOG_SAVE_CHAT_MESSAGE, sender.Client.UserID, sender.Id, sender.Name, MessageType.Whisper.ToString(), message, target.Id, target.Name); } break; case MessageType.Party: if (sender.Party != null) { foreach (var player in sender.Party.Members.ToList()) { SendParty(player, sender.Id, message); } _taskQueue.Enqueue(ActionType.LOG_SAVE_CHAT_MESSAGE, sender.Client.UserID, sender.Id, sender.Name, MessageType.Party.ToString(), message); } break; case MessageType.Map: var mapPlayers = sender.Map.Cells[sender.CellId].GetPlayers(sender.PosX, sender.PosZ, 0, sender.Country, true); foreach (var player in mapPlayers) { SendMap((Character)player, sender.Name, message); } _taskQueue.Enqueue(ActionType.LOG_SAVE_CHAT_MESSAGE, sender.Client.UserID, sender.Id, sender.Name, MessageType.Map.ToString(), message); break; case MessageType.World: if (sender.Level > 10) { var worldPlayers = _gameWorld.Players.Values.Where(p => p.Country == sender.Country); foreach (var player in worldPlayers) { SendWorld(player, sender.Name, message); } _taskQueue.Enqueue(ActionType.LOG_SAVE_CHAT_MESSAGE, sender.Client.UserID, sender.Id, sender.Name, MessageType.World.ToString(), message); } break; default: _logger.LogError("Not implemented message type."); break; } }
public override void Dispose() { if (Party != null) { SetParty(null); } _castTimer.Elapsed -= CastTimer_Elapsed; _summonVehicleTimer.Elapsed -= SummonVehicleTimer_Elapsed; OnMaxHPChanged -= Character_OnMaxHPChanged; OnMaxMPChanged -= Character_OnMaxMPChanged; OnMaxSPChanged -= Character_OnMaxSPChanged; OnDead -= Character_OnDead; Bless.Instance.OnDarkBlessChanged -= OnDarkBlessChanged; Bless.Instance.OnLightBlessChanged -= OnLightBlessChanged; // Notify friends, that player is offline. foreach (var friend in Friends.Values) { _gameWorld.Players.TryGetValue(friend.Id, out var friendPlayer); if (friendPlayer != null) { friendPlayer.FriendOffline(this); } } // Notify guild members, that player is offline. NotifyGuildMembersOffline(); // Save current buffs to database. _taskQueue.Enqueue(ActionType.REMOVE_BUFF_ALL, Id); foreach (var buff in ActiveBuffs) { _taskQueue.Enqueue(ActionType.SAVE_BUFF, Id, buff.SkillId, buff.SkillLevel, buff.ResetTime); } // Save current quests state to database. foreach (var quest in Quests.Where(q => q.SaveUpdateToDatabase)) { _taskQueue.Enqueue(ActionType.QUEST_UPDATE, Id, quest.Id, quest.RemainingTime, quest.CountMob1, quest.CountMob2, quest.Count3, quest.IsFinished, quest.IsSuccessful); quest.QuestTimeElapsed -= Quest_QuestTimeElapsed; } // Save current HP, MP, SP to database. _taskQueue.Enqueue(ActionType.SAVE_CHARACTER_HP_MP_SP, Id, CurrentHP, CurrentMP, CurrentSP); Map = null; ClearConnection(); base.Dispose(); }
public static void EnqueueIds <T>(this IBackgroundTaskQueue <VmEntityStateMessage> queue, string senderId, IEnumerable <T> entityIds, string entityType, EntityOperation operation) { queue.Enqueue(new VmEntityStateMessage { SenderId = senderId, EntityIds = entityIds.Cast <object>(), EntityType = entityType, Operation = operation }); }
public static void EnqueueId <T>(this IBackgroundTaskQueue <VmEntityStateMessage> queue, string senderId, T entityId, string entityType, EntityOperation operation, RequireClass <T> ignore = null) where T : class { queue.Enqueue(new VmEntityStateMessage { SenderId = senderId, EntityIds = new object[] { entityId }, EntityType = entityType, Operation = operation }); }
private void OnCreated(object sender, FileSystemEventArgs e) { Interlocked.Increment(ref _requestsNumber); if (Thread.VolatileRead(ref _requestsNumber) >= _maxRequestsNumber) { _fileSystemWatcher.EnableRaisingEvents = false; } _taskQueue.Enqueue(async token => await SendFileAsync(e.FullPath, e.Name)); Interlocked.Decrement(ref _requestsNumber); if (Thread.VolatileRead(ref _requestsNumber) < _maxRequestsNumber && !_fileSystemWatcher.EnableRaisingEvents) { _fileSystemWatcher.EnableRaisingEvents = true; } }