public void GenerateArtifacts() { var runningMissionArtifactTargets = _player.MissionHandler.GetArtifactTargets().Where(t => t.MyTarget.ZoneId == _zone.Id).ToArray(); var typesAlreadyCreated = new int[0]; if (runningMissionArtifactTargets.Length > 0) { var artifactTypes = runningMissionArtifactTargets.Select(m => (int)m.GetArtifactType()).ArrayToString(); var cmd = $"select artifacttype from artifacts where zoneid = @zoneId and characterid = @characterId and artifacttype in ({artifactTypes})"; typesAlreadyCreated = Db.Query().CommandText(cmd) .SetParameter("@zoneId", _zone.Id) .SetParameter("@characterId", _player.Character.Id) .Execute() .Select(r => r.GetValue <int>(0)).ToArray(); } var artifactTypesToDelete = _nonPersistentIds.Value.Except(typesAlreadyCreated).ToArray(); if (!artifactTypesToDelete.IsNullOrEmpty()) { var cmd = $"delete from artifacts where zoneid = @zoneId and characterid = @characterId and artifacts.artifacttype in ({artifactTypesToDelete.ArrayToString()})"; var count = Db.Query().CommandText(cmd) .SetParameter("@zoneId", _zone.Id) .SetParameter("@characterId", _player.Character.Id) .ExecuteNonQuery(); Logger.Info($"[Artifact] Non active mission artifact deleted. zone:{_zone.Id} player:{_player.InfoString} count:{count}"); } foreach (var missionTargetFindArtifact in runningMissionArtifactTargets.Where(m => !typesAlreadyCreated.Contains((int)m.GetArtifactType()))) { var artifactType = missionTargetFindArtifact.GetArtifactType(); var position = missionTargetFindArtifact.GetPosition(); var range = missionTargetFindArtifact.GetRange(); var artifactTypeInfo = _repository.GetArtifactInfo(artifactType); if (artifactTypeInfo == null) { continue; } range = range - artifactTypeInfo.goalRange; var resultPosition = _zone.FindPassablePointInRadius(position, range); var artifact = new Artifact(artifactTypeInfo, resultPosition, _player.Character); _repository.InsertArtifact(artifact); Logger.Info($"[Artifact] Created for mission. zone:{_zone.Id} id:{missionTargetFindArtifact.MyZoneMissionInProgress.missionId} player:{_player.InfoString}"); } }