public override void Tick(double timer) { base.Tick(timer); if (this.IsMarkedForDeletion || this.Position == null || ReadyInSec > 0 || GameManager.Instance.Game == null) { return; } var timePassedSinceLastTickSec = GameManager.Instance.Game.GameCurrentTime.Subtract(_timeLastTick).TotalSeconds; if (timePassedSinceLastTickSec < 10) { return; } _timeLastTick = DateTime.FromBinary(GameManager.Instance.Game.GameCurrentTime.ToBinary()); var enemyUnits = OwnerPlayer.GetEnemyUnitsInAreaByUnitType(GameConstants.UnitType.SurfaceShip, this.Position.Coordinate, GameConstants.MAX_MINE_DETECTION_RANGE_M); foreach (var unit in enemyUnits) { if (unit.SupportsRole(GameConstants.Role.MineCountermeasures)) { var msgToMineOwner = new GameStateInfo(GameConstants.GameStateInfoType.MineDestroyedByEnemy, this.Id); OwnerPlayer.Send(msgToMineOwner); var msgToMineDestroyer = new GameStateInfo(GameConstants.GameStateInfoType.MineDestroyedByUs, unit.Id); unit.OwnerPlayer.Send(msgToMineDestroyer); //var msg = OwnerPlayer.CreateNewMessage( // string.Format("A {0} has been destroyed by enemy mine countermeasures.", ToShortString())); //msg.Position = this.Position.Clone(); //var msg2 = unit.OwnerPlayer.CreateNewMessage( // string.Format("An enemy {0} has been destroyed by mine countermeasures from {1}.", // UnitClass.UnitClassShortName, unit.ToShortString())); //msg2.Position = unit.Position.Clone(); this.IsMarkedForDeletion = true; return; } double distanceM = MapHelper.CalculateDistanceM(this.Position.Coordinate, unit.Position.Coordinate); if (distanceM <= GameConstants.MAX_MINE_IMPACT_RANGE_M) { GameManager.Instance.Log.LogDebug( string.Format("Mine->Tick() reports IMPACT between mine {0} and unit {1}", ToShortString(), unit.ToShortString())); unit.InflictDamageFromProjectileHit(this); this.IsMarkedForDeletion = true; return; } } }
public bool LandOnBase() { GameManager.Instance.Log.LogDebug( string.Format("AircraftUnit->LandOnBase: Unit {0}.", ToString())); SetDirty(GameConstants.DirtyStatus.UnitChanged); if (LaunchedFromUnit == null || LaunchedFromUnit.Position == null || LaunchedFromUnit.IsMarkedForDeletion || LaunchedFromUnit.HitPoints <= 0) { if (!_hasSentCarrierLostMessage) { _hasSentCarrierLostMessage = true; SetHomeToNewCarrier(); } return(false); } double distanceM = MapHelper.CalculateDistanceM(this.Position.Coordinate, LaunchedFromUnit.Position.Coordinate); if (distanceM > GameConstants.DISTANCE_TO_TARGET_IS_HIT_M * 3.0) { GameManager.Instance.Log.LogDebug( string.Format("LandOnBase: {0} is {1:F}m away from {2}, reattempting ReturnToBase.", Id, distanceM, LaunchedFromUnit)); this.IsOrderedToReturnToBase = false; return(ReturnToBase()); } if (LaunchedFromUnit.AircraftHangar == null) { OwnerPlayer.Send(new GameStateInfo(GameConstants.GameStateInfoType.AircraftLandingFailed, this.Id, LaunchedFromUnit.Id)); GameManager.Instance.Log.LogError( string.Format("Unit{0} cannot land on unit {1} since it has no AircraftHangar", ToShortString(), LaunchedFromUnit.ToShortString())); SetHomeToNewCarrier(); return(false); } if (LaunchedFromUnit.AircraftHangar.ReadyInSec > GameConstants.DEFAULT_TIME_BETWEEN_TAKEOFFS_SEC * 2) //it is damaged { TimeSpan time = TimeSpan.FromSeconds(LaunchedFromUnit.AircraftHangar.ReadyInSec); OwnerPlayer.Send(new GameStateInfo(GameConstants.GameStateInfoType.AircraftLandingFailed, this.Id, LaunchedFromUnit.Id)); SetHomeToNewCarrier(); return(false); } double CrashChancePercent = 0; int EffectiveLandingSeaState = LaunchedFromUnit.GetEffectiveSeaState(); if (EffectiveLandingSeaState > GameConstants.AIRCRAFT_LANDING_MAX_SEA_STATE) { OwnerPlayer.Send(new GameStateInfo(GameConstants.GameStateInfoType.AircraftLandingFailed, this.Id, LaunchedFromUnit.Id)); GameManager.Instance.Log.LogDebug(string.Format( "LandOnBase: Unit {0} could not land due to rough weather. Max sea state is {1}," + "effective sea state is {2}", ToShortString(), GameConstants.AIRCRAFT_LANDING_MAX_SEA_STATE, EffectiveLandingSeaState)); return(false); } else if (GetEffectiveSeaState() == GameConstants.AIRCRAFT_LANDING_MAX_SEA_STATE) { CrashChancePercent = 25.0; } if (CrashChancePercent > 0 && GameManager.Instance.ThrowDice(CrashChancePercent)) { IsMarkedForDeletion = true; OwnerPlayer.Send(new GameStateInfo(GameConstants.GameStateInfoType.AircraftCrashedOnLandingRoughWeather, this.Id, LaunchedFromUnit.Id)); GameManager.Instance.Log.LogDebug(string.Format( "LandOnBase: {0} CRASHED due to rough weather. Effective sea state is {1}", ToShortString(), EffectiveLandingSeaState)); return(false); } if (LaunchedFromUnit.UnitClass.CarriedRunwayStyle < this.UnitClass.RequiredRunwayStyle) { OwnerPlayer.Send(new GameStateInfo(GameConstants.GameStateInfoType.AircraftLandingFailed, this.Id, LaunchedFromUnit.Id)); GameManager.Instance.Log.LogError(string.Format( "LandOnBase: {0} cannot land on {1}: Requires {2}.", ToShortString(), LaunchedFromUnit.ToShortString(), this.UnitClass.RequiredRunwayStyle)); SetHomeToNewCarrier(); return(false); } if (OwnerPlayer != null && OwnerPlayer.TcpPlayerIndex > 0) { //GameManager.Instance.Log.LogDebug("LandOnBase: Sending GameStateInfo object"); OwnerPlayer.Send(new GameStateInfo() { Id = this.Id, InfoType = GameConstants.GameStateInfoType.AircraftIsLanded, SecondaryId = LaunchedFromUnit.Id, UnitClassId = this.UnitClass.Id, BearingDeg = (double)this.Position.BearingDeg, }); } _hasSentCarrierLostMessage = false; CarriedByUnit = LaunchedFromUnit; _hasCheckedForNearestCarrier = false; _hasSentActiveDetectionMessage = false; MovementOrder = null; Orders.Clear(); IsOrderedToReturnToBase = false; TargetDetectedUnit = null; Position = null; LaunchedFromUnit.AircraftHangar.Aircraft.Add(this); try { UnitClassWeaponLoads load = UnitClass.WeaponLoads.Single <UnitClassWeaponLoads>(l => l.Name == this.CurrentWeaponLoadName); if (load != null) { ReadyInSec = load.TimeToReloadHour * 60 * 60; } else { ReadyInSec = LaunchedFromUnit.AircraftHangar.GetStatusChangeTimeSec( GameConstants.AircraftDockingStatus.TankingAndRefitting, GameConstants.AircraftDockingStatus.ReadyForTakeoff); } } catch (Exception) { //default reload time ReadyInSec = LaunchedFromUnit.AircraftHangar.GetStatusChangeTimeSec( GameConstants.AircraftDockingStatus.TankingAndRefitting, GameConstants.AircraftDockingStatus.ReadyForTakeoff); } MissionType = GameConstants.MissionType.Patrol; MissionTargetType = GameConstants.MissionTargetType.Undefined; AssignedHighLevelOrder = null; LaunchedFromUnit.SetDirty(GameConstants.DirtyStatus.UnitChanged); var wpnLoad = GameManager.Instance.GameData.GetWeaponLoadByName(UnitClass.Id, CurrentWeaponLoadName); if (wpnLoad != null) { bool isEnoughAmmoToReload = CanChangeToWeaponLoad(wpnLoad, false); if (!isEnoughAmmoToReload) { SetWeaponLoad(string.Empty); //default } foreach (var weapon in Weapons) { weapon.ReadyInSec = 0; weapon.IsOperational = true; weapon.AmmunitionRemaining = weapon.MaxAmmunition; } } foreach (var sensor in Sensors) { sensor.ReadyInSec = 0; sensor.IsOperational = true; sensor.IsDamaged = false; if (sensor.SensorClass.MaxSpeedDeployedKph > 0 || sensor.SensorClass.MaxHeightDeployedM > 0) { sensor.IsOperational = false; //if sensor has height/speed restrictions, set non-operational } //sensor.IsActive = false; if (sensor.SensorClass.IsPassiveActiveSensor) { sensor.IsActive = false; } } FuelDistanceCoveredSinceRefuelM = 0; if (_refuelingFromAircraft != null) { _refuelingFromAircraft.RemoveFromFuelQueue(this); } SetDirty(GameConstants.DirtyStatus.UnitChanged); return(true); }