/// <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); } }
/// <inheritdoc /> public IPlayerEntity CreatePlayer(DbCharacter character) { int playerModelId = character.Gender == 0 ? 11 : 12; // TODO: remove these magic numbers if (!_gameResources.Movers.TryGetValue(playerModelId, out MoverData moverData)) { throw new ArgumentException($"Cannot find mover with id '{playerModelId}' in game resources.", nameof(playerModelId)); } var player = _playerFactory(_serviceProvider, null) as PlayerEntity; IMapInstance map = _mapManager.GetMap(character.MapId); if (map == null) { throw new InvalidOperationException($"Cannot find map with id '{character.MapId}'."); } IMapLayer mapLayer = map.GetMapLayer(character.MapLayerId) ?? map.DefaultMapLayer; player.Object = new ObjectComponent { ModelId = playerModelId, Type = WorldObjectType.Mover, MapId = character.MapId, CurrentMap = map, LayerId = mapLayer.Id, Position = new Vector3(character.PosX, character.PosY, character.PosZ), Angle = character.Angle, Size = ObjectComponent.DefaultObjectSize, Name = character.Name, Spawned = false, Level = character.Level, MovingFlags = ObjectState.OBJSTA_STAND }; player.VisualAppearance = new VisualAppearenceComponent { Gender = character.Gender, SkinSetId = character.SkinSetId, HairId = character.HairId, HairColor = character.HairColor, FaceId = character.FaceId, }; player.PlayerData = new PlayerDataComponent { Id = character.Id, Gender = character.Gender.ToString().ToEnum <GenderType>(), Slot = character.Slot, Gold = character.Gold, Authority = (AuthorityType)character.User.Authority, Experience = character.Experience, JobData = _gameResources.Jobs[(DefineJob.Job)character.JobId] }; player.Moves = new MovableComponent { Speed = _gameResources.Movers[player.Object.ModelId]?.Speed ?? 0.1f, LastMoveTime = Time.GetElapsedTime(), NextMoveTime = Time.GetElapsedTime() + 10 }; player.Data = moverData; player.Attributes[DefineAttributes.HP] = character.Hp; player.Attributes[DefineAttributes.MP] = character.Mp; player.Attributes[DefineAttributes.FP] = character.Fp; player.Attributes[DefineAttributes.STR] = character.Strength; player.Attributes[DefineAttributes.STA] = character.Stamina; player.Attributes[DefineAttributes.DEX] = character.Dexterity; player.Attributes[DefineAttributes.INT] = character.Intelligence; player.Statistics = new StatisticsComponent(character); player.Timers.NextHealTime = Time.TimeInSeconds() + RecoverySystem.NextIdleHealStand; player.Behavior = _behaviorManager.GetDefaultBehavior(BehaviorType.Player, player); player.Hand = _itemFactory.CreateItem(11, 0, ElementType.None, 0); var gameServices = _serviceProvider.GetRequiredService <IEnumerable <IGameSystemLifeCycle> >().OrderBy(x => x.Order); foreach (IGameSystemLifeCycle service in gameServices) { service.Initialize(player); } mapLayer.AddEntity(player); return(player); }