/// <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); }
/// <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); } }
/// <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); } }
/// <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); } } }