public static void Prefix(ref WorldFrame __result, ref Mission __instance, BattleSideEnum side, FormationClass formationClass, bool isReinforcement, int customAgentCount = -1, float offsetAwayFrom = 0f, bool isSpawningWithHorses = true) { int _usedSpawnPathIndex = (int)ReflectUtils.ReflectField("_usedSpawnPathIndex", __instance); //int _spawnPoints = (int)ReflectUtils.ReflectField("_spawnPoints", __instance); int _agentCount = (int)ReflectUtils.ReflectField("_agentCount", __instance); Path _usedSpawnPath = (Path)ReflectUtils.ReflectField("_usedSpawnPath", __instance); float _randomMiddlePointAddition = (float)ReflectUtils.ReflectField("_randomMiddlePointAddition", __instance); MatrixFrame[] _spawnPoints = (MatrixFrame[])ReflectUtils.ReflectField("_spawnPoints", __instance); int num; if (customAgentCount != -1) { num = customAgentCount; } else { num = _agentCount; } if (_usedSpawnPathIndex < 0) { int num2 = 0; int num3; do { num3 = ((num2 <= 20) ? (MBRandom.RandomInt(3) + 1) : ((num2 - 20) % 3 + 1)); _usedSpawnPath = __instance.Scene.GetPathWithName("spawn_path_0" + num3); num2++; }while (_usedSpawnPath == null && num2 < 24); _usedSpawnPathIndex = num3; _randomMiddlePointAddition = -0.13f + MBRandom.RandomFloat * 0.26f; } else { _usedSpawnPath = __instance.Scene.GetPathWithName("spawn_path_0" + _usedSpawnPathIndex); } if (_usedSpawnPath != null) { _usedSpawnPath.GetPoints(_spawnPoints); float totalLength = _usedSpawnPath.GetTotalLength(); float num4 = 800f / totalLength; float num5 = 0.5f + _randomMiddlePointAddition; float num6 = -1f; if (num > 0) { num6 = 0.04f + 0.08f * (float)Math.Pow((double)(num + (isReinforcement ? 25 : 0)), 0.40000000596046448); num6 *= num4; } num6 = MBMath.ClampFloat(num6, 0.15f, 1f); float num7 = 0f; if (formationClass >= FormationClass.Ranged) { Formation formation = ((side == BattleSideEnum.Attacker) ? __instance.Teams.Attacker : __instance.Teams.Defender).GetFormation(FormationClass.Infantry); num7 += formation.Depth; } if (formationClass >= FormationClass.Cavalry) { Formation formation = ((side == BattleSideEnum.Attacker) ? __instance.Teams.Attacker : __instance.Teams.Defender).GetFormation(FormationClass.Ranged); num7 += formation.Depth; } if (!isSpawningWithHorses && formationClass >= FormationClass.HorseArcher) { Formation formation = ((side == BattleSideEnum.Attacker) ? __instance.Teams.Attacker : __instance.Teams.Defender).GetFormation(FormationClass.Cavalry); num7 += formation.Depth; } float num8 = Math.Max(0f, num5 - 0.44f * num6); float num9 = Math.Min(1f, num5 + 0.44f * num6); MatrixFrame frameForDistance = _usedSpawnPath.GetFrameForDistance(totalLength * num8 - offsetAwayFrom - num7); MatrixFrame frameForDistance2 = _usedSpawnPath.GetFrameForDistance(totalLength * num9 + offsetAwayFrom + num7); MatrixFrame matrixFrame = (side == BattleSideEnum.Attacker) ? frameForDistance2 : frameForDistance; Vec2 v = ((side == BattleSideEnum.Defender) ? frameForDistance2 : frameForDistance).origin.AsVec2 - matrixFrame.origin.AsVec2; v.Normalize(); Mat3 identity = Mat3.Identity; identity.RotateAboutUp(v.RotationInRadians); WorldPosition worldPosition = new WorldPosition(__instance.Scene, UIntPtr.Zero, matrixFrame.origin, false); if (formationClass == FormationClass.NumberOfRegularFormations) { worldPosition.SetVec2(worldPosition.AsVec2 - v * 12f); } if (isSpawningWithHorses && (formationClass == FormationClass.Cavalry || formationClass == FormationClass.HorseArcher)) { WorldPosition worldPosition2 = worldPosition; float num10 = ((side == BattleSideEnum.Attacker) ? __instance.Teams.Attacker : __instance.Teams.Defender).GetFormation(FormationClass.Cavalry).Width * 0.5f; float num11 = Math.Max(((side == BattleSideEnum.Attacker) ? __instance.Teams.Attacker : __instance.Teams.Defender).GetFormation(FormationClass.Infantry).Width, ((side == BattleSideEnum.Attacker) ? __instance.Teams.Attacker : __instance.Teams.Defender).GetFormation(FormationClass.Ranged).Width) * 0.5f; worldPosition2.SetVec2(worldPosition.AsVec2 + ((formationClass == FormationClass.Cavalry) ? v.LeftVec() : v.RightVec()) * (num10 + num11)); if (worldPosition2.GetNavMesh() != UIntPtr.Zero) { worldPosition.SetVec2(worldPosition2.AsVec2); } } __result = new WorldFrame(identity, worldPosition); } if (__instance.IsFieldBattle) { GameEntity gameEntity = __instance.Scene.FindEntityWithTag("defender_" + ((formationClass != FormationClass.NumberOfRegularFormations) ? formationClass.GetName().ToLower() : "infantry")); GameEntity gameEntity2 = __instance.Scene.FindEntityWithTag("attacker_" + ((formationClass != FormationClass.NumberOfRegularFormations) ? formationClass.GetName().ToLower() : "infantry")); if (gameEntity != null && gameEntity2 != null) { Vec3 globalPosition = gameEntity.GlobalPosition; Vec3 v2 = gameEntity2.GlobalPosition - globalPosition; Vec3 arg_4E7_0 = globalPosition; float num12 = v2.Normalize(); float num13 = 1000f / num12; float num14 = 0.08f + 0.08f * (float)Math.Pow((double)(num + (isReinforcement ? 25 : 0)), 0.30000001192092896); num14 *= num13; float num15 = Math.Max(0f, 0.5f - 0.5f * num14); float num16 = Math.Min(1f, 0.5f + 0.5f * num14); Vec3 vec = arg_4E7_0 + v2 * (num12 * num15); Vec3 vec2 = arg_4E7_0 + v2 * (num12 * num16); Vec3 vec3 = (side == BattleSideEnum.Attacker) ? vec2 : vec; Vec3 vec4 = ((side == BattleSideEnum.Defender) ? vec2 : vec) - vec3; vec4.Normalize(); Mat3 identity2 = Mat3.Identity; identity2.RotateAboutUp(vec4.AsVec2.RotationInRadians); WorldPosition origin = new WorldPosition(__instance.Scene, UIntPtr.Zero, vec3, false); __result = new WorldFrame(identity2, origin); } Vec2 v3 = Vec2.Invalid; ICollection <Vec2> value = __instance.Boundaries.First <KeyValuePair <string, ICollection <Vec2> > >().Value; if (value.Count > 0) { v3 = value.Aggregate((a, b) => a + b); v3 *= 1f / (float)value.Count; } WorldPosition origin2 = new WorldPosition(__instance.Scene, UIntPtr.Zero, v3.ToVec3(0f), false); __result = new WorldFrame(Mat3.Identity, origin2); } else { SiegeMissionController expr_609 = __instance.GetMissionBehaviour <SiegeMissionController>(); if (expr_609 != null) { bool arg_614_0 = expr_609.IsSallyOut; } string text = side.ToString().ToLower() + "_" + ((formationClass != FormationClass.NumberOfRegularFormations) ? formationClass.GetName().ToLower() : "infantry"); if (isReinforcement) { text += "_reinforcement"; } GameEntity gameEntity3 = __instance.Scene.FindEntityWithTag(text); if (gameEntity3 != null) { MatrixFrame globalFrame = gameEntity3.GetGlobalFrame(); globalFrame.rotation.OrthonormalizeAccordingToForwardAndKeepUpAsZAxis(); WorldPosition origin3 = new WorldPosition(__instance.Scene, UIntPtr.Zero, globalFrame.origin, false); __result = new WorldFrame(globalFrame.rotation, origin3); } Vec2 v4 = Vec2.Invalid; ICollection <Vec2> value2 = __instance.Boundaries.First <KeyValuePair <string, ICollection <Vec2> > >().Value; if (value2.Count > 0) { v4 = value2.Aggregate((a, b) => a + b); v4 *= 1f / (float)value2.Count; } WorldPosition origin4 = new WorldPosition(__instance.Scene, UIntPtr.Zero, v4.ToVec3(0f), false); __result = new WorldFrame(Mat3.Identity, origin4); } }
private void ReadFormationSpawnEntitiesFromScene(bool isFieldBattle) { this._formationSceneEntries = new FormationSceneEntry[2, 11]; Scene scene = Mission.Current.Scene; if (isFieldBattle) { for (int index1 = 0; index1 < 2; ++index1) { string str = index1 == 1 ? "attacker_" : "defender_"; for (int index2 = 0; index2 < 11; ++index2) { FormationClass formationClass1 = (FormationClass)index2; GameEntity defaultEntity1 = scene.FindEntityWithTag(str + formationClass1.GetName().ToLower()); if ((NativeObject)defaultEntity1 == (NativeObject)null) { FormationClass formationClass2 = formationClass1.FallbackClass(); int index3 = (int)formationClass2; GameEntity defaultEntity2 = this._formationSceneEntries[index1, index3].DefaultEntity; defaultEntity1 = (NativeObject)defaultEntity2 != (NativeObject)null ? defaultEntity2 : scene.FindEntityWithTag(str + formationClass2.GetName().ToLower()); } this._formationSceneEntries[index1, index2] = new FormationSceneEntry(defaultEntity1, (GameEntity)null); } } } else { for (int index1 = 0; index1 < 2; ++index1) { string str = ((BattleSideEnum)index1).ToString().ToLower() + "_"; for (int index2 = 0; index2 < 11; ++index2) { FormationClass formationClass1 = (FormationClass)index2; FormationClass formationClass2 = formationClass1.FallbackClass(); int index3 = (int)formationClass2; string tag1 = str + formationClass1.GetName().ToLower(); GameEntity defaultEntity1 = scene.FindEntityWithTag(tag1); if ((NativeObject)defaultEntity1 == (NativeObject)null) { GameEntity defaultEntity2 = this._formationSceneEntries[index1, index3].DefaultEntity; if ((NativeObject)defaultEntity2 != (NativeObject)null) { defaultEntity1 = defaultEntity2; } else { string tag2 = str + formationClass2.GetName().ToLower(); defaultEntity1 = scene.FindEntityWithTag(tag2); } } string tag3 = str + formationClass1.GetName().ToLower() + "_reinforcement"; GameEntity reinforcementEntity1 = scene.FindEntityWithTag(tag3); if ((NativeObject)reinforcementEntity1 == (NativeObject)null) { GameEntity reinforcementEntity2 = this._formationSceneEntries[index1, index3].ReinforcementEntity; if ((NativeObject)reinforcementEntity2 != (NativeObject)null) { reinforcementEntity1 = reinforcementEntity2; } else { string tag2 = str + formationClass2.GetName().ToLower() + "_reinforcement"; reinforcementEntity1 = scene.FindEntityWithTag(tag2); } } this._formationSceneEntries[index1, index2] = new FormationSceneEntry(defaultEntity1, reinforcementEntity1); } } } }