コード例 #1
0
        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;
            }
        }
コード例 #2
0
        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();
        }
コード例 #3
0
 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
     });
 }
コード例 #4
0
 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
     });
 }
コード例 #5
0
        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;
            }
        }