public override System PostMissionResult(MissionResult mresult, string companyName) { lock (_missionResultLock) { try { // TODO: Update connection data in a cleaner fashion string ip = Helper.MapRequestIP(); string hashedIP = String.Format("{0:X}", ip.GetHashCode()); DateTime reportTime = DateTime.UtcNow; // TODO: For now, use the IP as the playerId. In the future, GUID Helper.RecordPlayerActivity(mresult, ip, companyName, reportTime); int realDifficulty = 0; // Check to see if the post is suspicious if (Helper.LoadSettings().HardCodedDifficulty != 0) { realDifficulty = Helper.LoadSettings().HardCodedDifficulty; } else { realDifficulty = Math.Min(10, mresult.difficulty); } int realPlanets = Math.Min(Helper.LoadSettings().MaxPlanetSupport, mresult.planetSupport); int realRep = Math.Min(Helper.LoadSettings().MaxRep, mresult.awardedRep); if ((Helper.LoadSettings().HalfSkullPercentageForWin *realDifficulty) + realRep + realPlanets > 50) { logger.Info("Suspicious result reported. See console.log for details."); logger.Debug($"Suspicous result for IP:({ip})" + $" normalized difficulty:({realDifficulty}) planetSupport:({realPlanets}) reptuation:({realRep})" + $" for employer:({mresult.employer}) vs target:({mresult.target}) on system: ({mresult.systemName})" + $" with result:({mresult.result})" ); } HistoryResult hresult = new HistoryResult { date = reportTime }; logger.Info($"New Mission Result for ({companyName}) on ({mresult.systemName})"); logger.Debug($"New MissionResult - ({companyName}) fought for ({mresult.employer}) against ({mresult.target})" + $" on ({mresult.systemName}) and achieved ({mresult.result})"); StarMap builtMap = StarMapStateManager.Build(); System system = builtMap.FindSystemByName(mresult.systemName); FactionControl oldOwnerControl = system.FindHighestControl(); Faction oldOwner = Faction.INVALID_UNSET; if (oldOwnerControl != null) { oldOwner = oldOwnerControl.faction; } FactionControl employerControl = system.FindFactionControlByFaction(mresult.employer); FactionControl targetControl = system.FindFactionControlByFaction(mresult.target); logger.Debug($"Real rep - ({realRep}) and real planets ({realPlanets})"); if (mresult.result == BattleTech.MissionResult.Victory) { int gain = (Helper.LoadSettings().HalfSkullPercentageForWin *realDifficulty) + realRep + realPlanets; int realChange = 0; if (employerControl.percentage >= Helper.LoadSettings().LowerFortBorder&& employerControl.percentage <= Helper.LoadSettings().UpperFortBorder) { logger.Debug("Fort Rules"); realChange = Math.Min( Math.Abs(employerControl.percentage - Helper.LoadSettings().UpperFortBorder), Math.Max(1, (int)Math.Round(gain * Helper.LoadSettings().FortPercentage)) ); } else { realChange = Math.Min( Math.Abs(employerControl.percentage - Helper.LoadSettings().LowerFortBorder), Math.Max(1, gain) ); } hresult.winner = employerControl.faction; hresult.loser = targetControl.faction; hresult.pointsTraded = realChange; logger.Debug($"Victory for ({hresult.winner}) over ({hresult.loser})"); int fortLoss = 0; while (targetControl.percentage > Helper.LoadSettings().LowerFortBorder&& realChange > 0) { targetControl.percentage--; realChange--; fortLoss++; } if (fortLoss > 0) { logger.Debug($"Fortification of ({hresult.loser}) lost {fortLoss} points."); } if (realChange > 0) { targetControl.percentage -= realChange; if (targetControl.percentage < 0) { int leftover = Math.Abs(targetControl.percentage); logger.Debug($"{leftover} points could not be removed from ({hresult.loser}) because its below 0."); targetControl.percentage = 0; int totalEnemyControl = 0; foreach (FactionControl control in system.controlList) { if (control.faction != employerControl.faction) { totalEnemyControl += control.percentage; } } if (totalEnemyControl != 0) { realChange -= leftover; } else { logger.Debug($"No other Factions on Planet."); } } employerControl.percentage += realChange; logger.Debug($"{realChange} points were traded."); } } FactionControl afterBattleOwnerControl = system.FindHighestControl(); Faction newOwner = afterBattleOwnerControl.faction; if (oldOwner != newOwner) { hresult.planetSwitched = true; } else { hresult.planetSwitched = false; } hresult.system = mresult.systemName; Holder.resultHistory.Add(hresult); return(system); } catch (Exception e) { logger.Warn(e, "Failed to process mission result!"); return(null); } } }
public System PostMissionResult(MissionResult mresult, string companyName) { try { int realDifficulty = Math.Min(10, mresult.difficulty); string ip = Helper.GetIP(); int realPlanets = Math.Min(Helper.LoadSettings().MaxPlanetSupport, mresult.planetSupport); int realRep = Math.Min(Helper.LoadSettings().MaxRep, mresult.awardedRep); if ((Helper.LoadSettings().HalfSkullPercentageForWin *realDifficulty) + realRep + realPlanets > 50) { Logger.LogToFile("Weird Result - Difficulty: " + realDifficulty + " - planet: " + realPlanets + " - rep: " + realRep + " - employer: " + mresult.employer + " - target: " + mresult.target + " - systemName: " + mresult.systemName + " - mresult: " + mresult.result + " - IP: " + ip); } HistoryResult hresult = new HistoryResult(); hresult.date = DateTime.UtcNow; if (Helper.CheckUserInfo(ip, mresult.systemName, companyName)) { Logger.LogToFile("One ip trys to send Missions to fast. IP:" + ip); return(null); } Logger.LogLine("New Result Posted"); Console.WriteLine("employer: " + mresult.employer); Console.WriteLine("target: " + mresult.target); Console.WriteLine("systemName: " + mresult.systemName); Console.WriteLine("mresult: " + mresult.result); StarMap map = Helper.LoadCurrentMap(); System system = map.FindSystemByName(mresult.systemName); FactionControl oldOwnerControl = system.FindHighestControl(); Faction oldOwner = Faction.INVALID_UNSET; if (oldOwnerControl != null) { oldOwner = oldOwnerControl.faction; } FactionControl employerControl = system.FindFactionControlByFaction(mresult.employer); FactionControl targetControl = system.FindFactionControlByFaction(mresult.target); if (mresult.result == BattleTech.MissionResult.Victory) { Console.WriteLine("Victory Result"); int realChange = Math.Min(Math.Abs(employerControl.percentage - 100), Math.Max(1, (Helper.LoadSettings().HalfSkullPercentageForWin *realDifficulty) + realRep + realPlanets)); hresult.winner = employerControl.faction; hresult.loser = targetControl.faction; hresult.pointsTraded = realChange; employerControl.percentage += realChange; targetControl.percentage -= realChange; Console.WriteLine(realChange + " Points traded"); if (targetControl.percentage < 0) { int leftoverChange = Math.Abs(targetControl.percentage); Console.WriteLine(leftoverChange + " Leftover Points"); targetControl.percentage = 0; int debugcounter = leftoverChange; while (leftoverChange > 0 && debugcounter != 0) { foreach (FactionControl leftOverFaction in system.controlList) { if (leftOverFaction.faction != mresult.employer && leftOverFaction.faction != mresult.target && leftOverFaction.percentage > 0 && leftoverChange > 0) { leftOverFaction.percentage--; leftoverChange--; Console.WriteLine(leftOverFaction.faction.ToString() + " Points deducted"); } } debugcounter--; } } } else { Console.WriteLine("Loss Result"); int realChange = Math.Min(employerControl.percentage, Math.Max(1, (Helper.LoadSettings().HalfSkullPercentageForLoss *realDifficulty) + realRep / 2 + realPlanets / 2)); hresult.winner = targetControl.faction; hresult.loser = employerControl.faction; hresult.pointsTraded = realChange; employerControl.percentage -= realChange; targetControl.percentage += realChange; Console.WriteLine(realChange + " Points traded"); } Helper.SaveCurrentMap(map); FactionControl afterBattleOwnerControl = system.FindHighestControl(); Faction newOwner = afterBattleOwnerControl.faction; if (oldOwner != newOwner) { hresult.planetSwitched = true; } else { hresult.planetSwitched = false; } hresult.system = mresult.systemName; Holder.resultHistory.Add(hresult); return(system); } catch (Exception e) { Logger.LogError(e); return(null); } }