Ejemplo n.º 1
0
    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);
    }
Ejemplo n.º 2
0
 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
     });