Пример #1
0
        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()));
        }
Пример #2
0
        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));
        }
Пример #6
0
        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 });
        }
Пример #7
0
        internal static void SetTickTimerField(this ArrangementOrder order, Timer timer)
        {
            var prop = order.GetType().GetField("tickTimer", BindingFlags.NonPublic | BindingFlags.Instance);

            prop.SetValue(order, timer);
        }