public void Test2() { var system = new SolarSystemDto { Id = 1, Name = "SystemName" }; var shipItem = new ItemDto { Id = 1, Name = "VictimShip" }; Save(system); Save(shipItem); var kill = new ParsedKillResult { Header = new ParsedKillHeader { AllianceName = "VictimAlliance", CorporationName = "VictimCorp", DamageTaken = 100, FactionName = "FactionName", ShipName = shipItem.Name, SystemName = system.Name, SystemSecurity = 9000, Timestamp = DateTime.Now, VictimName = "VictimPilot" } }; var ks = Resolve <IKillService>(); ks.CreateKill(kill); kill.Header.AllianceName = "SecondAlliance"; kill.Header.VictimName = "VictimPilot"; ks.CreateKill(kill); }
public TextKillMailParser() { Result = new ParsedKillResult(); }
public void CreateKill(ParsedKillResult kill) { if (kill.HasParseErrors) { var errors = string.Join("\r\n", kill.ParseErrors); throw new KillMailException(errors); } if (!kill.Header.Timestamp.HasValue) { throw new KillMailException("Missing kill date information"); } var killDate = kill.Header.Timestamp.Value; var victimSystem = _repository.QueryFor <ISolarSystemByNameQuery>(q => q.Name = kill.Header.SystemName).Execute(); if (victimSystem == null) { throw new KillMailException("Missing victim's system {0}", kill.Header.SystemName); } var itemNames = kill.GetUsedItemNames(); var involvedItems = _repository.QueryFor <IItemsWithNamesQuery>(n => n.Names = itemNames).Execute(); var involvedItemDic = involvedItems.ToDictionary(x => x.Name, x => x); var victimAlliance = GetAlliance(kill.Header.AllianceName); var victimCorp = _entitiesService.GetCorporation(kill.Header.CorporationName, victimAlliance.Sequence); var victimPilot = _entitiesService.GetPilot(kill.Header.VictimName, victimAlliance.Sequence, victimCorp.Sequence); var victimShip = involvedItemDic[kill.Header.ShipName]; var victimKillPoints = victimShip.Points; var victimIskLoss = victimShip.GetPrice(); var involvedKillsPoints = 0; var maxKillPoints = Convert.ToDouble(Math.Round(victimKillPoints * 1.2m)); var involvedParty = new List <KillPartyParameter>(); foreach (var party in kill.InvolvedParties) { var partyAlliance = GetAlliance(party.AllianceName); var partyCorp = _entitiesService.GetCorporation(party.CorporationName, partyAlliance.Sequence); var partyPilot = _entitiesService.GetPilot(party.PilotName, partyAlliance.Sequence, partyCorp.Sequence, party.SecurityStatus); var partyShip = involvedItemDic[party.ShipName]; var partyWeapon = involvedItemDic[party.WeaponName]; var partyParam = new KillPartyParameter( party.DamageDone, party.SecurityStatus, party.FinalBlow, partyAlliance.Sequence, partyCorp.Sequence, partyPilot.Sequence, partyShip.Id, partyWeapon.Id); involvedKillsPoints += partyShip.Points; involvedParty.Add(partyParam); } var destroyedItems = new List <KillItemParameter>(); foreach (var item in kill.DestroyedItems) { if (item.Name.Contains("Blueprint")) // Ignore blueprints { continue; } var destroyedItem = involvedItemDic[item.Name]; victimIskLoss += destroyedItem.GetPrice() * item.Quantity; var location = 0; //TODO: Get location destroyedItems.Add(new KillItemParameter(destroyedItem.Id, item.Quantity, location)); } var droppedItems = new List <KillItemParameter>(); foreach (var item in kill.DroppedItems) { if (item.Name.Contains("Blueprint")) // Ignore blueprints { continue; } var droppedItem = involvedItemDic[item.Name]; victimIskLoss += droppedItem.GetPrice() * item.Quantity; var location = 0; //TODO: Get location droppedItems.Add(new KillItemParameter(droppedItem.Id, item.Quantity, location)); } // Calculate kill points if (victimKillPoints == 0) { victimKillPoints = 1; } var killGankfactor = victimKillPoints / (victimKillPoints + involvedKillsPoints); if (killGankfactor == 0) { killGankfactor = 1; } var killPoints = Math.Ceiling(victimKillPoints * (killGankfactor / 0.75)); if (killPoints > maxKillPoints) { killPoints = maxKillPoints; } killPoints = Math.Round(killPoints, 0); var killId = SystemIdGenerator.Next(); var killSequence = _repository.GetNextSequenceFor <KillDto>(); var createKillCommand = new CreateKill(killId, killSequence, killDate, kill.Header.DamageTaken, Convert.ToInt32(killPoints), victimIskLoss, victimShip.Id, victimSystem.Id, victimAlliance.Sequence, victimCorp.Sequence, victimPilot.Sequence, involvedParty, destroyedItems, droppedItems ); _bus.Send(createKillCommand); }