コード例 #1
0
        public Map(ItemFactory itemFactory, OtbmFile otbmFile)
        {
            this.tiles = new Dictionary <Position, Tile>(otbmFile.Areas.Sum(area => area.Tiles.Count));

            foreach (var otbmArea in otbmFile.Areas)
            {
                foreach (var otbmTile in otbmArea.Tiles)
                {
                    Tile tile = new Tile(otbmArea.Position.Offset(otbmTile.OffsetX, otbmTile.OffsetY, 0));

                    tiles.Add(tile.Position, tile);

                    if (otbmTile.OpenTibiaItemId > 0)
                    {
                        Item ground = itemFactory.Create(otbmTile.OpenTibiaItemId);

                        tile.AddContent(ground);
                    }

                    if (otbmTile.Items != null)
                    {
                        void AddItems(IContainer rootContainer, List <OtbmItem> items)
                        {
                            foreach (var otbmItem in items)
                            {
                                Item item = itemFactory.Create(otbmItem.OpenTibiaId);

                                if (item is Container)
                                {
                                    Container container = (Container)item;

                                    if (otbmItem.Items != null)
                                    {
                                        AddItems(container, otbmItem.Items);
                                    }
                                }
                                else if (item is StackableItem)
                                {
                                    StackableItem stackable = (StackableItem)item;

                                    stackable.Count = otbmItem.Count;
                                }
                                else if (item is TeleportItem)
                                {
                                    TeleportItem teleport = (TeleportItem)item;

                                    teleport.Position = otbmItem.TeleportPosition;
                                }

                                rootContainer.AddContent(item);
                            }
                        }

                        AddItems(tile, otbmTile.Items);
                    }
                }
            }
        }
コード例 #2
0
        public void Start()
        {
            dispatcher = new Dispatcher();

            scheduler = new Scheduler(dispatcher);

            listeners = new List <Listener>();

            listeners.Add(new Listener(7171, socket => new LoginConnection(this, socket)));

            listeners.Add(new Listener(7172, socket => new GameConnection(this, socket)));

            Clock = new Clock(12, 0);

            Logger = new Logger();

            Channels = new ChannelCollection();

            RuleViolations = new RuleViolationCollection();

            PacketsFactory = new PacketsFactory();

            using (Logger.Measure("Loading items", true))
            {
                var otb = OtbFile.Load("data/items/items.otb");

                var dat = DatFile.Load("data/items/tibia.dat");

                var items = ItemsFile.Load("data/items/items.xml");

                ItemFactory = new ItemFactory(otb, dat, items);
            }

            using (Logger.Measure("Loading monsters", true))
            {
                var monsters = MonsterFile.Load("data/monsters");

                MonsterFactory = new MonsterFactory(monsters);
            }

            using (Logger.Measure("Loading npcs", true))
            {
                var npcs = NpcFile.Load("data/npcs");

                NpcFactory = new NpcFactory(npcs);
            }

            using (Logger.Measure("Loading map", true))
            {
                var otbm = OtbmFile.Load("data/map/pholium3.otbm");

                Map = new Map(ItemFactory, otbm);
            }

            Pathfinding = new Pathfinding(Map);

            Events = new EventsCollection();

            Scripts = new ScriptsCollection();

            using (Logger.Measure("Loading scripts", true))
            {
                Scripts.Start(this);
            }

            dispatcher.Start();

            scheduler.Start();

            foreach (var listener in listeners)
            {
                listener.Start();
            }

            Logger.WriteLine("Server online");
        }