public void SendMessageToRoom(ChatMessage message)
        {
            var senderClient = _clients[CurrentClient.ClientId];

            if (senderClient == null)
            {
                throw new ApplicationException("Can not send message before login.");
            }

            Task.Factory.StartNew(
                () =>
            {
                foreach (var chatClient in _clients.GetAllItems())
                {
                    try
                    {
                        chatClient.ClientProxy.OnMessageToRoom(senderClient.User.Name, message);
                    }
                    catch
                    {
                        // ignored
                    }
                }
            });
        }
Beispiel #2
0
 public List <MapMonster> GetListMonsterInRange(short mapX, short mapY, byte distance)
 {
     return(_monsters.GetAllItems().Where(s => s.Alive && GetDistance(
                                              new MapCell()
     {
         X = mapX, Y = mapY
     }, new MapCell()
     {
         X = s.MapX, Y = s.MapY
     }) <= distance + 1).ToList());
 }
Beispiel #3
0
        protected void TaskInvoker(object o)
        {
            while (true)
            {
                Thread.Sleep(1);

                Action <InformerClient> action;

                lock (TaskPoolLock)
                {
                    if (TaskPool.Count < 1)
                    {
                        continue;
                    }

                    action = TaskPool.Dequeue();
                }

                foreach (var client in Authed.GetAllItems())
                {
                    try
                    {
                        action(client);
                    }
                    catch (Exception ex)
                    {
                        Log.ErrorException("InformerService:", ex);
                    }
                }
            }
            // ReSharper disable FunctionNeverReturns
        }
Beispiel #4
0
        private void ClientDisconnected(object sender, EventArgs e)
        {
            var client = sender as IScsServiceClient;

            if (client == null)
            {
                return;
            }
            if (!Clients.GetAllItems().Exists(oo => oo.IndexInAdminList == client.ClientId))
            {
                return;
            }
            var index = Clients[client.ClientId].IndexInAdminList;

            Task.Factory.StartNew(delegate
            {
                OnClientCrashed(Clients[index].UserName);
                Clients.Remove(index);
            });
        }
        /// <summary>
        /// Stops the server.
        /// </summary>
        public virtual void Stop()
        {
            if (_connectionListener != null)
            {
                _connectionListener.Stop();
            }

            foreach (var client in Clients.GetAllItems())
            {
                client.Disconnect();
            }
        }
Beispiel #6
0
        public void LoadPortals()
        {
            var partitioner = Partitioner.Create(DAOFactory.PortalDAO.LoadByMap(Map.MapId), EnumerablePartitionerOptions.None);
            ThreadSafeSortedList <int, Portal> _portalList = new ThreadSafeSortedList <int, Portal>();

            Parallel.ForEach(partitioner, portal =>
            {
                Portal portal2 = portal as Portal;
                portal2.SourceMapInstanceId   = MapInstanceId;
                _portalList[portal2.PortalId] = portal2;
            });
            _portals.AddRange(_portalList.GetAllItems());
        }
Beispiel #7
0
        public void Initialize()
        {
            // parse rates
            XPRate      = int.Parse(System.Configuration.ConfigurationManager.AppSettings["RateXp"]);
            DropRate    = int.Parse(System.Configuration.ConfigurationManager.AppSettings["RateDrop"]);
            GoldRate    = int.Parse(System.Configuration.ConfigurationManager.AppSettings["RateGold"]);
            FairyXpRate = int.Parse(System.Configuration.ConfigurationManager.AppSettings["RateFairyXp"]);

            // load explicite type of ItemDTO
            foreach (ItemDTO itemDTO in DAOFactory.ItemDAO.LoadAll())
            {
                Item ItemGO = null;

                switch (itemDTO.ItemType)
                {
                case ItemType.Ammo:
                    ItemGO = new NoFunctionItem(itemDTO);
                    break;

                case ItemType.Armor:
                    ItemGO = new WearableItem(itemDTO);
                    break;

                case ItemType.Box:
                    ItemGO = new BoxItem(itemDTO);
                    break;

                case ItemType.Event:
                    ItemGO = new MagicalItem(itemDTO);
                    break;

                case ItemType.Fashion:
                    ItemGO = new WearableItem(itemDTO);
                    break;

                case ItemType.Food:
                    ItemGO = new FoodItem(itemDTO);
                    break;

                case ItemType.Jewelery:
                    ItemGO = new WearableItem(itemDTO);
                    break;

                case ItemType.Magical:
                    ItemGO = new MagicalItem(itemDTO);
                    break;

                case ItemType.Main:
                    ItemGO = new NoFunctionItem(itemDTO);
                    break;

                case ItemType.Map:
                    ItemGO = new NoFunctionItem(itemDTO);
                    break;

                case ItemType.Part:
                    ItemGO = new NoFunctionItem(itemDTO);
                    break;

                case ItemType.Potion:
                    ItemGO = new PotionItem(itemDTO);
                    break;

                case ItemType.Production:
                    ItemGO = new ProduceItem(itemDTO);
                    break;

                case ItemType.Quest1:
                    ItemGO = new NoFunctionItem(itemDTO);
                    break;

                case ItemType.Quest2:
                    ItemGO = new NoFunctionItem(itemDTO);
                    break;

                case ItemType.Sell:
                    ItemGO = new NoFunctionItem(itemDTO);
                    break;

                case ItemType.Shell:
                    ItemGO = new MagicalItem(itemDTO);
                    break;

                case ItemType.Snack:
                    ItemGO = new SnackItem(itemDTO);
                    break;

                case ItemType.Special:
                    ItemGO = new SpecialItem(itemDTO);
                    break;

                case ItemType.Specialist:
                    ItemGO = new WearableItem(itemDTO);
                    break;

                case ItemType.Teacher:
                    ItemGO = new TeacherItem(itemDTO);
                    break;

                case ItemType.Upgrade:
                    ItemGO = new UpgradeItem(itemDTO);
                    break;

                case ItemType.Weapon:
                    ItemGO = new WearableItem(itemDTO);
                    break;

                default:
                    ItemGO = new NoFunctionItem(itemDTO);
                    break;
                }
                _items.Add(ItemGO);
            }
            Logger.Log.Info(String.Format(Language.Instance.GetMessageFromKey("ITEMS_LOADED"), _items.Count()));

            // intialize monsterdrops
            _monsterDrops = new ThreadSafeSortedList <short, List <DropDTO> >();
            foreach (var monsterDropGrouping in DAOFactory.DropDAO.LoadAll().GroupBy(d => d.MonsterVNum))
            {
                if (monsterDropGrouping.Key.HasValue)
                {
                    _monsterDrops[monsterDropGrouping.Key.Value] = monsterDropGrouping.OrderBy(d => d.DropChance).ToList();
                }
                else
                {
                    _generalDrops = monsterDropGrouping.ToList();
                }
            }
            Logger.Log.Info(String.Format(Language.Instance.GetMessageFromKey("DROPS_LOADED"), _monsterDrops.GetAllItems().Sum(i => i.Count())));

            // initialiize monsterskills
            _monsterSkills = new ThreadSafeSortedList <short, List <NpcMonsterSkill> >();
            foreach (var monsterSkillGrouping in DAOFactory.NpcMonsterSkillDAO.LoadAll().GroupBy(n => n.NpcMonsterVNum))
            {
                _monsterSkills[monsterSkillGrouping.Key] = monsterSkillGrouping.Select(n => n as NpcMonsterSkill).ToList();
            }
            Logger.Log.Info(String.Format(Language.Instance.GetMessageFromKey("MONSTERSKILLS_LOADED"), _monsterSkills.GetAllItems().Sum(i => i.Count())));

            // initialize npcmonsters
            foreach (NpcMonsterDTO npcmonsterDTO in DAOFactory.NpcMonsterDAO.LoadAll())
            {
                _npcs.Add(npcmonsterDTO as NpcMonster);
            }
            Logger.Log.Info(String.Format(Language.Instance.GetMessageFromKey("NPCMONSTERS_LOADED"), _npcs.Count()));

            // intialize receipes
            _recipes = new ThreadSafeSortedList <int, List <Recipe> >();
            foreach (var recipeGrouping in DAOFactory.RecipeDAO.LoadAll().GroupBy(r => r.MapNpcId))
            {
                _recipes[recipeGrouping.Key] = recipeGrouping.Select(r => r as Recipe).ToList();
            }
            Logger.Log.Info(String.Format(Language.Instance.GetMessageFromKey("RECIPES_LOADED"), _recipes.GetAllItems().Sum(i => i.Count())));

            // initialize shopitems
            _shopItems = new ThreadSafeSortedList <int, List <ShopItemDTO> >();
            foreach (var shopItemGrouping in DAOFactory.ShopItemDAO.LoadAll().GroupBy(s => s.ShopId))
            {
                _shopItems[shopItemGrouping.Key] = shopItemGrouping.ToList();
            }
            Logger.Log.Info(String.Format(Language.Instance.GetMessageFromKey("SHOPITEMS_LOADED"), _shopItems.GetAllItems().Sum(i => i.Count())));

            // initialize shopskills
            _shopSkills = new ThreadSafeSortedList <int, List <ShopSkillDTO> >();
            foreach (var shopSkillGrouping in DAOFactory.ShopSkillDAO.LoadAll().GroupBy(s => s.ShopId))
            {
                _shopSkills[shopSkillGrouping.Key] = shopSkillGrouping.ToList();
            }
            Logger.Log.Info(String.Format(Language.Instance.GetMessageFromKey("SHOPSKILLS_LOADED"), _shopSkills.GetAllItems().Sum(i => i.Count())));

            // initialize shops
            _shops = new ThreadSafeSortedList <int, Shop>();
            foreach (var shopGrouping in DAOFactory.ShopDAO.LoadAll())
            {
                _shops[shopGrouping.MapNpcId] = shopGrouping as Shop;
            }
            Logger.Log.Info(String.Format(Language.Instance.GetMessageFromKey("SHOPS_LOADED"), _shops.GetAllItems().Count()));

            // initialize teleporters
            _teleporters = new ThreadSafeSortedList <int, List <TeleporterDTO> >();
            foreach (var teleporterGrouping in DAOFactory.TeleporterDAO.LoadAll().GroupBy(t => t.MapNpcId))
            {
                _teleporters[teleporterGrouping.Key] = teleporterGrouping.Select(t => t).ToList();
            }
            Logger.Log.Info(String.Format(Language.Instance.GetMessageFromKey("TELEPORTERS_LOADED"), _teleporters.GetAllItems().Sum(i => i.Count())));

            // initialize skills
            foreach (SkillDTO skillDTO in DAOFactory.SkillDAO.LoadAll())
            {
                Skill skill = skillDTO as Skill;
                skill.Combos.AddRange(DAOFactory.ComboDAO.LoadBySkillVnum(skill.SkillVNum).ToList());
                _skills.Add(skill);
            }
            Logger.Log.Info(String.Format(Language.Instance.GetMessageFromKey("SKILLS_LOADED"), _skills.Count()));

            // intialize mapnpcs
            _mapNpcs = new ThreadSafeSortedList <short, List <MapNpc> >();
            foreach (var mapNpcGrouping in DAOFactory.MapNpcDAO.LoadAll().GroupBy(t => t.MapId))
            {
                _mapNpcs[mapNpcGrouping.Key] = mapNpcGrouping.Select(t => t as MapNpc).ToList();
            }
            Logger.Log.Info(String.Format(Language.Instance.GetMessageFromKey("MAPNPCS_LOADED"), _mapNpcs.GetAllItems().Sum(i => i.Count())));

            try
            {
                int i            = 0;
                int monstercount = 0;

                foreach (MapDTO map in DAOFactory.MapDAO.LoadAll())
                {
                    Guid guid   = Guid.NewGuid();
                    Map  newMap = new Map(map.MapId, guid, map.Data);
                    newMap.Music       = map.Music;
                    newMap.ShopAllowed = map.ShopAllowed;

                    // register for broadcast
                    _maps.TryAdd(guid, newMap);
                    newMap.SetMapMapMonsterReference();
                    newMap.SetMapMapNpcReference();
                    i++;

                    newMap.LoadMonsters();
                    foreach (MapMonster mapMonster in newMap.Monsters)
                    {
                        mapMonster.Map = newMap;
                        newMap.AddMonster(mapMonster);
                    }
                    monstercount += newMap.Monsters.Count();
                }
                if (i != 0)
                {
                    Logger.Log.Info(String.Format(Language.Instance.GetMessageFromKey("MAPS_LOADED"), i));
                }
                else
                {
                    Logger.Log.Error(Language.Instance.GetMessageFromKey("NO_MAP"));
                }
                Logger.Log.Info(String.Format(Language.Instance.GetMessageFromKey("MAPMONSTERS_LOADED"), monstercount));
            }
            catch (Exception ex)
            {
                Logger.Log.Error("General Error", ex);
            }
        }
Beispiel #8
0
 public List <MapMonster> GetListMonsterInRange(short mapX, short mapY, byte distance)
 {
     return(_monsters.GetAllItems().Where(s => s.IsAlive && s.IsInRange(mapX, mapY, distance)).ToList());
 }