public Ship(ShipModelType s, LocatorService ls) { _model = s; StatBonuses = new ShipBonusHandler(); Debuffs = new DebuffHandler(); switch (ShipStats.ShieldType) { case ShieldTypes.QuickRegen: Shields = new QuickRegenShieldHandler(ShipStats, StatBonuses, Debuffs); break; case ShieldTypes.SlowRegen: Shields = new SlowRegenShieldHandler(ShipStats, StatBonuses, Debuffs); break; case ShieldTypes.NoRegen: Shields = new NoRegenShieldHandler(ShipStats, StatBonuses, Debuffs); break; } RecalculateModuleBonuses(); Cargo = new CargoHandler_ReadOnlyVM <CargoHandlerModel>(s.Cargo); _playerLocator = ls.PlayerLocator; _areaLocator = ls.AreaLocator; _teamLocator = ls.TeamLocator; }
public Ship(ShipStats stats, LocatorService ls) { _model = new ShipModelType(); PosX = 0; PosY = 0; Rotation = 0; VelY = 0; VelX = 0; _weapons = new List <Weapon>(); _model.MissileLauncherSlot = 0; _weapons.Add(new MissileLauncher(ProjectileTypes.AmbassadorMissile)); TimeOfLastCollision = 0; TimeOfLastDamage = 0; DoCombatUpdates = false; HealthUpdatePeriod = 500; _model.PlayerID = null; _simulatingPlayerID = null; IsNPC = false; _playerLocator = ls.PlayerLocator; _areaLocator = ls.AreaLocator; _teamLocator = ls.TeamLocator; _model.Modules = new List <Module>(); StatBonuses = new ShipBonusHandler(); Debuffs = new DebuffHandler(); switch (stats.ShieldType) { case ShieldTypes.QuickRegen: Shields = new QuickRegenShieldHandler(stats, StatBonuses, Debuffs); break; case ShieldTypes.SlowRegen: Shields = new SlowRegenShieldHandler(stats, StatBonuses, Debuffs); break; case ShieldTypes.NoRegen: Shields = new NoRegenShieldHandler(stats, StatBonuses, Debuffs); break; } ShipStats = stats; _model.Cargo = new CargoHandlerModel(); Cargo = new CargoHandler_ReadOnlyVM <CargoHandlerModel>(_model.Cargo); SetHealthAndShields(stats); }
async Task <TradeResult> _executeTrade(ShipShipTrade t) { if (t.IsProcessed || !t.Pending) { return(TradeResult.TradeAlreadyProcessed); } t.Pending = false; CargoHandler_ReadOnlyVM <CargoHandlerModel> cargoA = t.ShipA.GetCargo(); CargoHandler_ReadOnlyVM <CargoHandlerModel> cargoB = t.ShipB.GetCargo(); float holdsAfterTrade_A = cargoA.FilledHolds - t.CargoOffered_A.FilledHolds + t.CargoOffered_B.FilledHolds; float holdsAfterTrade_B = cargoB.FilledHolds - t.CargoOffered_B.FilledHolds + t.CargoOffered_A.FilledHolds; if (holdsAfterTrade_A > cargoA.TotalHolds) { t.IsProcessed = true; return(TradeResult.ShipANotEnoughCargoSpace); } if (holdsAfterTrade_B > cargoB.TotalHolds) { t.IsProcessed = true; return(TradeResult.ShipBNotEnoughCargoSpace); } CargoTransactionSequence ts = new CargoTransactionSequence(); foreach (var v in t.CargoOffered_A.StatefulCargo) { ts.Add(new TransactionRemoveStatefulCargo(t.ShipA, StatefulCargoTypes.Null, v.Value.Id, true)); ts.Add(new TransactionAddStatefulCargo(t.ShipB, null, true)); } foreach (var v in t.CargoOffered_B.StatefulCargo) { ts.Add(new TransactionRemoveStatefulCargo(t.ShipB, StatefulCargoTypes.Null, v.Value.Id, true)); ts.Add(new TransactionAddStatefulCargo(t.ShipA, null, true)); } foreach (var v in t.CargoOffered_A.StatelessCargo) { ts.Add(new TransactionRemoveStatelessCargo(t.ShipA, v.Key, v.Value.Quantity)); ts.Add(new TransactionAddStatelessCargo(t.ShipB, v.Key, v.Value.Quantity, true)); } foreach (var v in t.CargoOffered_B.StatelessCargo) { ts.Add(new TransactionRemoveStatelessCargo(t.ShipB, v.Key, v.Value.Quantity)); ts.Add(new TransactionAddStatelessCargo(t.ShipA, v.Key, v.Value.Quantity, true)); } _cargoSynchronizer.RequestAtomicTransactionSequence(ts); var res = await ts.ResultTask; if (res == CargoResult.Success) { t.IsProcessed = true; //Record the trade in the DB, fire and forget t.DateTime = DateTime.Now; _databaseManager.SaveAsync(t); _databaseManager.SaveAsync((ISerializable)t.ShipA); _databaseManager.SaveAsync((ISerializable)t.ShipB); return(TradeResult.Success); } else { return(TradeResult.FailedReasonUnknown);//TODO: Implement translator } }