public AttackEntityOrderDetachment(GameEntity targetEntity) { this._targetEntity = targetEntity; this._targetEntityDestructableComponent = this._targetEntity.GetFirstScriptOfType <DestructableComponent>(); this._surroundEntity = this._targetEntity.GetFirstScriptOfType <CastleGate>() == null; this._agents = new List <Agent>(); MatrixFrame globalFrame = this._targetEntity.GetGlobalFrame(); this._frame = new WorldFrame(globalFrame.rotation, new WorldPosition(Mission.Current.Scene, UIntPtr.Zero, globalFrame.origin, false)); this._frame.Rotation.Orthonormalize(); }
private void ArrangeDestructedMeshes() { float num1 = 0.0f; foreach (float hitPointPercentage in this._wallHitPointPercentages) { num1 += hitPointPercentage; } if (!((IEnumerable <float>) this._wallHitPointPercentages).IsEmpty <float>()) { num1 /= (float)this._wallHitPointPercentages.Length; } float num2 = MBMath.Lerp(0.0f, 0.7f, 1f - num1); IEnumerable <SynchedMissionObject> source1 = this.Mission.MissionObjects.OfType <SynchedMissionObject>(); IEnumerable <DestructableComponent> destructibleComponents = source1.OfType <DestructableComponent>(); foreach (StrategicArea strategicArea in this.Mission.ActiveMissionObjects.OfType <StrategicArea>().ToList <StrategicArea>()) { strategicArea.DetermineAssociatedDestructibleComponents(destructibleComponents); } foreach (SynchedMissionObject synchedMissionObject in source1) { if (this._hasAnySiegeTower && synchedMissionObject.GameEntity.HasTag("tower_merlon")) { synchedMissionObject.SetVisibleSynched(false, true); } else { DestructableComponent firstScriptOfType = synchedMissionObject.GameEntity.GetFirstScriptOfType <DestructableComponent>(); if (firstScriptOfType != null && firstScriptOfType.CanBeDestroyedInitially && ((double)num2 > 0.0 && (double)MBRandom.RandomFloat <= (double)num2)) { firstScriptOfType.PreDestroy(); } } } if ((double)num2 >= 0.100000001490116) { List <GameEntity> list = this.Mission.Scene.FindEntitiesWithTag("damage_decal").ToList <GameEntity>(); foreach (GameEntity gameEntity in list) { gameEntity.GetFirstScriptOfType <SynchedMissionObject>().SetVisibleSynched(false); } for (double num3 = Math.Floor((double)list.Count * (double)num2); num3 > 0.0; --num3) { GameEntity gameEntity = list[MBRandom.RandomInt(list.Count)]; list.Remove(gameEntity); gameEntity.GetFirstScriptOfType <SynchedMissionObject>().SetVisibleSynched(true); } } List <WallSegment> source2 = new List <WallSegment>(); List <WallSegment> list1 = this.Mission.ActiveMissionObjects.FindAllWithType <WallSegment>().Where <WallSegment>((Func <WallSegment, bool>)(ws => ws.DefenseSide != FormationAI.BehaviorSide.BehaviorSideNotSet && ws.GameEntity.GetChildren().Any <GameEntity>((Func <GameEntity, bool>)(ge => ge.HasTag("broken_child"))))).ToList <WallSegment>(); int val2 = 0; foreach (float hitPointPercentage in this._wallHitPointPercentages) { if ((double)Math.Abs(hitPointPercentage) < 9.99999974737875E-06) { ++val2; } } int num4 = Math.Min(list1.Count <WallSegment>(), val2); while (num4 > 0) { WallSegment randomElement = list1.GetRandomElement <WallSegment>(); randomElement.OnChooseUsedWallSegment(true); list1.Remove(randomElement); --num4; source2.Add(randomElement); } foreach (WallSegment wallSegment in list1) { wallSegment.OnChooseUsedWallSegment(false); } if ((double)num2 < 0.100000001490116) { return; } List <SiegeWeapon> siegeWeaponList = new List <SiegeWeapon>(); foreach (SiegeWeapon siegeWeapon in this.Mission.ActiveMissionObjects.FindAllWithType <SiegeWeapon>().Where <SiegeWeapon>((Func <SiegeWeapon, bool>)(sw => sw is IPrimarySiegeWeapon))) { SiegeWeapon primarySiegeWeapon = siegeWeapon; if (source2.Any <WallSegment>((Func <WallSegment, bool>)(b => b.DefenseSide == ((IPrimarySiegeWeapon)primarySiegeWeapon).WeaponSide))) { siegeWeaponList.Add(primarySiegeWeapon); } } siegeWeaponList.ForEach((Action <SiegeWeapon>)(siegeWeaponToRemove => siegeWeaponToRemove.SetDisabledSynched())); }