internal static int GetUnitSpacingField(this ArrangementOrder order) { var prop = typeof(ArrangementOrder).GetField("_unitSpacing", BindingFlags.NonPublic | BindingFlags.Instance); object value = prop.GetValue(order); return(int.Parse(value.ToString())); }
internal static ArrangementOrderEnum GetOrderEnumField(this ArrangementOrder order) { var prop = typeof(ArrangementOrder).GetField("OrderEnum", BindingFlags.NonPublic | BindingFlags.Instance); object value = prop.GetValue(order); return((ArrangementOrderEnum)Enum.Parse(typeof(ArrangementOrderEnum), value.ToString())); }
public void Update() { if (this.Agent.Formation == null) { return; } this.Agent.SetFiringOrder((int)this.Agent.Formation.FiringOrder.GetNativeEnum()); this.Agent.EnforceShieldUsage = ArrangementOrder.GetShieldDirectionOfUnit(this.Agent.Formation, this.Agent, this.Agent.Formation.ArrangementOrder.OrderEnum); }
private static void Postfix(ArrangementOrder __instance, Formation formation) { if (__instance.OrderEnum != ArrangementOrder.ArrangementOrderEnum.ShieldWall) { return; } int num1 = (int)MessageBox.Show("Shieldbearers: " + formation.GetCountOfUnitsWithCondition((Func <Agent, bool>)(agent => agent.Equipment.HasShield())).ToString()); IFormationArrangement formationArrangement = Traverse.Create((object)formation).Property <IFormationArrangement>("arrangement").Value; int num2 = Traverse.Create((object)formationArrangement).Property <int>("FileCount").Value; int rankCount = formationArrangement.RankCount; MBList2D <IFormationUnit> mbList2D = Traverse.Create((object)formationArrangement).Field("_units2D").GetValue <MBList2D <IFormationUnit> >(); for (int index1 = 0; index1 < num2; ++index1) { ((Agent)mbList2D[index1, 0]).Equipment.HasShield(); } }
private static void OnApply(ref ArrangementOrder __instance, Formation formation) { var instanceOrderEnum = __instance.GetOrderEnumField(); var formationOrderEnum = formation.MovementOrder.GetOrderEnumField(); formation.SetPositioning(new WorldPosition?(), new Vec2?(), new int?(__instance.GetUnitSpacingField())); __instance.Rearrange(formation); if (instanceOrderEnum == ArrangementOrderEnum.Scatter) { __instance.TickOccasionally(formation); } foreach (Agent agent in formation.Units.Where(u => u.IsAIControlled)) { Agent.UsageDirection shieldDirectionOfUnit = __instance.GetShieldDirectionOfUnit(formation, agent); agent.EnforceShieldUsage(shieldDirectionOfUnit); } if (formationOrderEnum != MovementOrderEnum.Charge && formationOrderEnum != MovementOrderEnum.ChargeToTarget) { if (instanceOrderEnum != ArrangementOrderEnum.Circle && instanceOrderEnum != ArrangementOrderEnum.ShieldWall && instanceOrderEnum != ArrangementOrderEnum.Square && instanceOrderEnum != ArrangementOrderEnum.Column) { foreach (Agent unit in formation.Units) { MovementOrderMethods.SetDefaultMoveBehaviorValues(unit); } } else if (instanceOrderEnum != ArrangementOrderEnum.Column) { foreach (Agent unit in formation.Units) { MovementOrderMethods.SetDefensiveArrangementMoveBehaviorValues(unit); } } else { foreach (Agent unit in formation.Units) { MovementOrderMethods.SetFollowBehaviorValues(unit); } } } __instance.SetTickTimerField(new Timer(MBCommon.GetTime(MBCommon.TimeType.Mission), 0.5f, true)); }
internal static void TickOccasionally(this ArrangementOrder order, Formation formation) { MethodInfo rearrangeMethod = order.GetType().GetMethod("TickOccasionally", BindingFlags.NonPublic | BindingFlags.Instance); rearrangeMethod.Invoke(order, new object[] { formation }); }
internal static void SetTickTimerField(this ArrangementOrder order, Timer timer) { var prop = order.GetType().GetField("tickTimer", BindingFlags.NonPublic | BindingFlags.Instance); prop.SetValue(order, timer); }