예제 #1
0
        /// <summary>
        /// Load regions from the RGN file.
        /// </summary>
        private void LoadRgn(string mapPath, MapInstance map)
        {
            var    regions = new List <IMapRegion>();
            string rgn     = Path.Combine(mapPath, $"{map.Name}.rgn");

            using (var rgnFile = new RgnFile(rgn))
            {
                IEnumerable <IMapRespawnRegion> respawnersRgn = rgnFile.GetElements <RgnRespawn7>()
                                                                .Select(x => MapRespawnRegion.FromRgnElement(x));

                regions.AddRange(respawnersRgn);

                foreach (RgnRegion3 region in rgnFile.GetElements <RgnRegion3>())
                {
                    switch (region.Index)
                    {
                    case RegionInfo.RI_REVIVAL:
                        int revivalMapId     = map.MapInformation.RevivalMapId == 0 ? map.Id : map.MapInformation.RevivalMapId;
                        var newRevivalRegion = MapRevivalRegion.FromRgnElement(region, revivalMapId);
                        regions.Add(newRevivalRegion);
                        break;

                    case RegionInfo.RI_TRIGGER:
                        regions.Add(MapTriggerRegion.FromRgnElement(region));
                        break;

                        // TODO: load collector regions
                    }
                }
            }

            map.SetRegions(regions);
        }
예제 #2
0
        /// <inheritdoc />
        public void LoadRgn()
        {
            string rgn = Path.Combine(this._mapPath, this.Name + ".rgn");

            using (var rgnFile = new RgnFile(rgn))
            {
                IEnumerable <IMapRespawnRegion> respawnersRgn = rgnFile.GetElements <RgnRespawn7>()
                                                                .Select(x => MapRespawnRegion.FromRgnElement(x));

                // TODO: load wrapzones
                // TODO: load collector regions

                this._regions.AddRange(respawnersRgn);
            }
        }
예제 #3
0
        /// <inheritdoc />
        public void Execute(IPlayerEntity player, object[] parameters)
        {
            if (parameters.Length <= 0 || parameters.Length > 2)
            {
                throw new ArgumentException($"Create monster command must have 1 or 2 parameters.", nameof(parameters));
            }

            if (!int.TryParse((string)parameters[0], out int monsterId))
            {
                throw new ArgumentException($"Cannot convert the first parameter in int.", nameof(parameters));
            }

            int quantityToSpawn = 1;

            if (parameters.Length == 2)
            {
                if (!int.TryParse((string)parameters[1], out quantityToSpawn))
                {
                    throw new ArgumentException($"Cannot convert the second parameter in int.", nameof(parameters));
                }
            }
            _logger.LogTrace($"{player.Object.Name} want to spawn {quantityToSpawn} mmonster");

            const int    sizeOfSpawnArea = 13;
            const int    respawnTime     = 65535;
            IMapInstance currentMap      = player.Object.CurrentMap;
            IMapLayer    currentMapLayer = currentMap.GetMapLayer(player.Object.LayerId);
            Vector3      currentPosition = player.Object.Position.Clone();
            var          respawnRegion   = new MapRespawnRegion((int)currentPosition.X - sizeOfSpawnArea / 2, (int)currentPosition.Z - sizeOfSpawnArea / 2, sizeOfSpawnArea, sizeOfSpawnArea, respawnTime, WorldObjectType.Mover, monsterId, quantityToSpawn);

            for (int i = 0; i < quantityToSpawn; i++)
            {
                IMonsterEntity monsterToCreate = _monsterFactory.CreateMonster(currentMap, currentMapLayer, monsterId, respawnRegion, true);
                monsterToCreate.Object.Position = player.Object.Position.Clone();
                currentMapLayer.AddEntity(monsterToCreate);
            }
        }
예제 #4
0
        /// <summary>
        /// Load regions from the RGN file.
        /// </summary>
        private void LoadRgn()
        {
            string rgn = Path.Combine(this._mapPath, $"{this.Name}.rgn");

            using (var rgnFile = new RgnFile(rgn))
            {
                IEnumerable <IMapRespawnRegion> respawnersRgn = rgnFile.GetElements <RgnRespawn7>()
                                                                .Select(x => MapRespawnRegion.FromRgnElement(x));

                this._regions.AddRange(respawnersRgn);

                foreach (RgnRegion3 region in rgnFile.GetElements <RgnRegion3>())
                {
                    switch (region.Index)
                    {
                    case RegionInfo.RI_REVIVAL:
                        int revivalMapId     = this._worldInformations.RevivalMapId == 0 ? this.Id : this._worldInformations.RevivalMapId;
                        var newRevivalRegion = MapRevivalRegion.FromRgnElement(region, revivalMapId);
                        this._regions.Add(newRevivalRegion);
                        break;

                    case RegionInfo.RI_TRIGGER:
                        this._regions.Add(MapTriggerRegion.FromRgnElement(region));
                        break;

                        // TODO: load collector regions
                    }
                }

                if (!this._regions.Any(x => x is IMapRevivalRegion))
                {
                    // Loads the default revival region if no revival region is loaded.
                    this.DefaultRevivalRegion = new MapRevivalRegion(0, 0, 0, 0,
                                                                     this._worldInformations.RevivalMapId, this._worldInformations.RevivalKey, null, false, false);
                }
            }
        }