static void PostfixCalculateCurrentOrder(Formation ___formation, ref MovementOrder ____currentOrder, ref Boolean ___IsCurrentOrderChanged) { if (___formation != null) { FormationQuerySystem mainEnemyformation = ___formation?.QuerySystem.ClosestSignificantlyLargeEnemyFormation; if (mainEnemyformation != null) { WorldPosition medianPositionNew = ___formation.QuerySystem.MedianPosition; medianPositionNew.SetVec2(___formation.QuerySystem.AveragePosition); Formation rangedFormation = null; foreach (Formation formation in ___formation.Team.Formations) { if (formation.QuerySystem.IsRangedFormation) { rangedFormation = formation; } } if (rangedFormation != null) { if (___formation.QuerySystem.MedianPosition.AsVec2.Distance(mainEnemyformation.MedianPosition.AsVec2) < (rangedFormation.QuerySystem.MissileRange + 50f)) { ____currentOrder = MovementOrder.MovementOrderMove(medianPositionOld); ___IsCurrentOrderChanged = true; } else { medianPositionOld = medianPositionNew; } } } } }
protected override float GetAiWeight() { FormationQuerySystem querySystem = attackingFormation.QuerySystem; if (querySystem.ClosestEnemyFormation == null || querySystem.ClosestEnemyFormation.ClosestEnemyFormation == querySystem) { return(0f); } Vec2 vec = (querySystem.ClosestEnemyFormation.MedianPosition.AsVec2 - querySystem.AveragePosition).Normalized(); Vec2 v = (querySystem.ClosestEnemyFormation.ClosestEnemyFormation.MedianPosition.AsVec2 - querySystem.ClosestEnemyFormation.MedianPosition.AsVec2).Normalized(); if (vec.DotProduct(v) > -0.5f) { return(0f); } return(1.2f); }
static bool PrefixGetAiWeight(ref Formation ___formation, ref float __result) { if (___formation != null) { FormationQuerySystem querySystem = ___formation.QuerySystem; if (___formation.AI.ActiveBehavior == null) { __result = 0f; return(false); } PropertyInfo property = typeof(BehaviorComponent).GetProperty("BehaviorCoherence", BindingFlags.NonPublic | BindingFlags.Instance); property.DeclaringType.GetProperty("BehaviorCoherence"); float behaviorCoherence = (float)property.GetValue(___formation.AI.ActiveBehavior, BindingFlags.NonPublic | BindingFlags.GetProperty, null, null, null) * 2.75f; //__result = MBMath.Lerp(0.1f, 1.2f, MBMath.ClampFloat(behaviorCoherence * (querySystem.FormationIntegrityData.DeviationOfPositionsExcludeFarAgents + 1f) / (querySystem.IdealAverageDisplacement + 1f), 0f, 3f) / 3f); __result = MBMath.Lerp(0.1f, 1.2f, MBMath.ClampFloat(behaviorCoherence * (querySystem.FormationIntegrityData.DeviationOfPositionsExcludeFarAgents + 1f) / (querySystem.IdealAverageDisplacement + 1f), 0f, 3f) / 3f); return(false); } return(true); }
static void PostfixCalculateCurrentOrder(ref Formation ___formation, BehaviorMountedSkirmish __instance, ref bool ____engaging, ref MovementOrder ____currentOrder) { WorldPosition position = ___formation.QuerySystem.MedianPosition; if (___formation.QuerySystem.ClosestSignificantlyLargeEnemyFormation == null) { position.SetVec2(___formation.QuerySystem.AveragePosition); } else { bool num = (___formation.QuerySystem.AverageAllyPosition - ___formation.Team.QuerySystem.AverageEnemyPosition).LengthSquared <= 3600f; bool engaging = ____engaging; engaging = (____engaging = (num || ((!____engaging) ? ((___formation.QuerySystem.AveragePosition - ___formation.QuerySystem.AverageAllyPosition).LengthSquared <= 3600f) : (!(___formation.QuerySystem.UnderRangedAttackRatio > ___formation.QuerySystem.MakingRangedAttackRatio) && ((!___formation.QuerySystem.FastestSignificantlyLargeEnemyFormation.IsCavalryFormation && !___formation.QuerySystem.FastestSignificantlyLargeEnemyFormation.IsRangedCavalryFormation) || (___formation.QuerySystem.AveragePosition - ___formation.QuerySystem.FastestSignificantlyLargeEnemyFormation.MedianPosition.AsVec2).LengthSquared / (___formation.QuerySystem.FastestSignificantlyLargeEnemyFormation.MovementSpeed * ___formation.QuerySystem.FastestSignificantlyLargeEnemyFormation.MovementSpeed) >= 16f))))); if (!____engaging) { position = new WorldPosition(Mission.Current.Scene, new Vec3(___formation.QuerySystem.AverageAllyPosition, ___formation.Team.QuerySystem.MedianPosition.GetNavMeshZ() + 100f)); } else { Vec2 vec = (___formation.QuerySystem.AveragePosition - ___formation.QuerySystem.ClosestSignificantlyLargeEnemyFormation.AveragePosition).Normalized().LeftVec(); FormationQuerySystem closestSignificantlyLargeEnemyFormation = ___formation.QuerySystem.ClosestSignificantlyLargeEnemyFormation; float num2 = 50f + (___formation.QuerySystem.ClosestSignificantlyLargeEnemyFormation.Formation.Width + ___formation.Depth) * 0.5f; float num3 = 0f; Formation formation = ___formation.QuerySystem.ClosestSignificantlyLargeEnemyFormation.Formation; for (int i = 0; i < Mission.Current.Teams.Count; i++) { Team team = Mission.Current.Teams[i]; if (!team.IsEnemyOf(___formation.Team)) { continue; } for (int j = 0; j < team.FormationsIncludingSpecialAndEmpty.Count; j++) { Formation formation2 = team.FormationsIncludingSpecialAndEmpty[j]; if (formation2.CountOfUnits > 0 && formation2.QuerySystem != closestSignificantlyLargeEnemyFormation) { Vec2 v = formation2.QuerySystem.AveragePosition - closestSignificantlyLargeEnemyFormation.AveragePosition; float num4 = v.Normalize(); if (vec.DotProduct(v) > 0.8f && num4 < num2 && num4 > num3) { num3 = num4; formation = formation2; } } } } if (___formation.QuerySystem.RangedCavalryUnitRatio > 0.95f && ___formation.QuerySystem.ClosestSignificantlyLargeEnemyFormation.Formation == formation) { ____currentOrder = MovementOrder.MovementOrderCharge; return; } bool flag = formation.QuerySystem.IsCavalryFormation || formation.QuerySystem.IsRangedCavalryFormation; float num5 = flag ? 35f : 20f; num5 += (formation.Depth + ___formation.Width) * 0.25f; //num5 = Math.Min(num5, ___formation.QuerySystem.MissileRange - ___formation.Width * 0.5f); Ellipse ellipse = new Ellipse(formation.QuerySystem.MedianPosition.AsVec2, num5, formation.Width * 0.25f * (flag ? 1.5f : 1f), formation.Direction); position.SetVec2(ellipse.GetTargetPos(___formation.QuerySystem.AveragePosition, 20f)); } } ____currentOrder = MovementOrder.MovementOrderMove(position); }