public static EntityPack Pack(Entity entity) { EntityPack pack; if (entity is OrbitalEntity orbital) { pack = new OrbitalEntityPack { Orbit = orbital.OrbitData, SecurityLevel = orbital.SecurityLevel, SecurityRadius = orbital.SecurityRadius } } ; else if (entity is Ship ship) { pack = new ShipPack { Position = ship.Position, Direction = ship.Direction, IsPlayerShip = ship.IsPlayerShip } } ; else { throw new ArgumentException("Attempted to pack an instance of abstract class Entity!"); } pack.Settings = entity.Settings; // Filter item behavior collections by those with any persistent behaviors // For each item create an object containing the item position and a list of persistent behaviors // Then turn that into a dictionary mapping from item position to an array of every behaviors persistent data pack.PersistedBehaviors = entity.Equipment .Where(item => item.Behaviors.Any(b => b is IPersistentBehavior)) .Select(item => new { equippable = item, behaviors = item.Behaviors .Where(b => b is IPersistentBehavior) .Cast <IPersistentBehavior>() }) .ToDictionary(x => x.equippable.Position, x => x.behaviors.Select(b => b.Store()).ToArray()); pack.Hull = entity.Hull; pack.Name = entity.Name; pack.Faction = entity.Faction?.ID ?? Guid.Empty; pack.Equipment = entity.Equipment.Select(e => (e.Position, e.EquippableItem)).ToArray(); pack.CargoBays = entity.CargoBays.Select(e => (e.Position, e.EquippableItem)).ToArray(); pack.DockingBays = entity.DockingBays.Select(e => (e.Position, e.EquippableItem)).ToArray(); pack.DockingBayAssignments = entity.DockingBays.Select(x => entity.Children.IndexOf(x.DockedShip)).ToArray(); pack.CargoContents = entity.CargoBays.Select(b => b.Cargo.Select(i => (i.Value, i.Key)).ToArray()).ToArray(); pack.DockingBayContents = entity.DockingBays.Select(b => b.Cargo.Select(i => (i.Value, i.Key)).ToArray()).ToArray(); pack.Armor = entity.Armor; pack.Temperature = entity.Temperature; pack.Conductivity = entity.HullConductivity; pack.Children = entity.Children.Select(Pack).ToArray(); pack.WeaponGroups = entity.WeaponGroups.Select(wg => wg.items.Select(item => entity.Equipment.IndexOf(item)).ToArray()).ToArray(); return(pack); }
public static Entity Unpack(ItemManager itemManager, Zone zone, EntityPack pack, bool instantiate = false) { pack.Settings ??= MessagePackSerializer.Deserialize <EntitySettings>( MessagePackSerializer.Serialize(itemManager.GameplaySettings.DefaultEntitySettings)); return(pack switch { ShipPack shipPack => Unpack(itemManager, zone, shipPack, instantiate), OrbitalEntityPack orbitalEntityPack => Unpack(itemManager, zone, orbitalEntityPack, instantiate), _ => null });