using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using MessagePack; #nullable enable namespace GameCult.Aetheria.State.Verse { [MessagePackObject] public sealed class AetheriaRuntimePlayerSettingsCommit { [Key(0)] public string PlayerName { get; set; } = ""; [Key(1)] public bool TutorialPassed { get; set; } [Key(2)] public IReadOnlyList StoryFileHashes { get; set; } = Array.Empty(); [Key(3)] public string TemperatureUnit { get; set; } = "Celsius"; [Key(4)] public int SignificantDigits { get; set; } = 3; [Key(5)] public string NebulaQuality { get; set; } = "Normal"; [Key(6)] public bool ShowAsteroidsInMinimap { get; set; } [Key(7)] public IReadOnlyList BindingOverrides { get; set; } = Array.Empty(); [Key(8)] public IReadOnlyList ActionBarInputs { get; set; } = Array.Empty(); } [MessagePackObject] public sealed class AetheriaRuntimeStoryFileHashCommit { [Key(0)] public string StoryPath { get; set; } = ""; [Key(1)] public string Hash { get; set; } = ""; } [MessagePackObject] public sealed class AetheriaRuntimeInputBindingCommit { [Key(0)] public string ActionName { get; set; } = ""; [Key(1)] public int BindingIndex { get; set; } [Key(2)] public string BindingPath { get; set; } = ""; } [MessagePackObject] public sealed class AetheriaRuntimeLoadoutTemplateCommit { [Key(0)] public string Name { get; set; } = ""; [Key(1)] public string OwnerPlayerKey { get; set; } = ""; [Key(2)] public AetheriaRuntimeEntityLoadoutCommit RootEntity { get; set; } = new AetheriaRuntimeEntityLoadoutCommit(); } [MessagePackObject] public sealed class AetheriaRuntimeEntityLoadoutCommit { [Key(0)] public string Name { get; set; } = ""; [Key(1)] public string Kind { get; set; } = ""; [Key(3)] public AetheriaRuntimeLoadoutItemCommit Hull { get; set; } = new AetheriaRuntimeLoadoutItemCommit(); [Key(4)] public IReadOnlyList Equipment { get; set; } = Array.Empty(); [Key(5)] public IReadOnlyList CargoBays { get; set; } = Array.Empty(); [Key(6)] public IReadOnlyList DockingBays { get; set; } = Array.Empty(); [Key(7)] public IReadOnlyList CargoContents { get; set; } = Array.Empty(); [Key(8)] public IReadOnlyList DockingBayContents { get; set; } = Array.Empty(); [Key(9)] public IReadOnlyList DockingBayAssignments { get; set; } = Array.Empty(); [Key(10)] public IReadOnlyList> WeaponGroups { get; set; } = Array.Empty>(); [Key(11)] public IReadOnlyList Children { get; set; } = Array.Empty(); [Key(12)] public string FactionKey { get; set; } = ""; } [MessagePackObject] public sealed class AetheriaRuntimeLoadoutItemCommit { [Key(1)] public double Quality { get; set; } = 1.0; [Key(2)] public double Durability { get; set; } = 1.0; [Key(3)] public int Quantity { get; set; } = 1; [Key(4)] public bool Enabled { get; set; } = true; [Key(5)] public string ItemKey { get; set; } = ""; [Key(6)] public bool OverrideShutdown { get; set; } [Key(7)] public double Temperature { get; set; } } [MessagePackObject] public sealed class AetheriaRuntimeLoadoutItemSlotCommit { [Key(0)] public int X { get; set; } [Key(1)] public int Y { get; set; } [Key(2)] public AetheriaRuntimeLoadoutItemCommit Item { get; set; } = new AetheriaRuntimeLoadoutItemCommit(); } [MessagePackObject] public sealed class AetheriaRuntimeCargoBayLoadoutCommit { [Key(0)] public IReadOnlyList Items { get; set; } = Array.Empty(); } [MessagePackObject] public sealed class AetheriaRuntimeRunCheckpointCommit { [Key(0)] public string RunId { get; set; } = "local"; [Key(1)] public bool IsTutorial { get; set; } [Key(2)] public int EntranceZoneIndex { get; set; } = -1; [Key(3)] public int ExitZoneIndex { get; set; } = -1; [Key(4)] public int CurrentZoneIndex { get; set; } = -1; [Key(5)] public IReadOnlyList DiscoveredZoneIndices { get; set; } = Array.Empty(); [Key(6)] public IReadOnlyList Zones { get; set; } = Array.Empty(); [Key(8)] public IReadOnlyList FactionRelationships { get; set; } = Array.Empty(); [Key(9)] public uint GenerationSeed { get; set; } [Key(10)] public string CurrentEntityKey { get; set; } = ""; [Key(11)] public int Credits { get; set; } public AetheriaRuntimeLoadoutTemplateCommit CreateLoadoutTemplate(string entityKey) { return TryParseEntityKey(entityKey, out var zoneIndex, out var entityIndex) ? CreateLoadoutTemplate(zoneIndex, entityIndex) : new AetheriaRuntimeLoadoutTemplateCommit(); } public AetheriaRuntimeLoadoutTemplateCommit CreateLoadoutTemplate(int zoneIndex, int entityIndex) { var zone = (Zones ?? Array.Empty()) .FirstOrDefault(candidate => candidate != null && candidate.ZoneIndex == zoneIndex); var entities = zone?.Entities ?? Array.Empty(); var entity = entities.FirstOrDefault(candidate => candidate != null && candidate.EntityIndex == entityIndex); if (entity == null) return new AetheriaRuntimeLoadoutTemplateCommit(); return new AetheriaRuntimeLoadoutTemplateCommit { Name = entity.Name ?? "", OwnerPlayerKey = "global:aetheria.player_settings.v1", RootEntity = CreateEntityLoadout(entity, entities) }; } public string AppendLoadoutTemplateToZone( int zoneIndex, string parentEntityKey, AetheriaRuntimeLoadoutTemplateCommit template) { if (template?.RootEntity == null) return ""; var zones = (Zones ?? Array.Empty()).ToArray(); var zone = zones.FirstOrDefault(candidate => candidate != null && candidate.ZoneIndex == zoneIndex); if (zone == null) return ""; var entities = (zone.Entities ?? Array.Empty()).ToList(); var parentIndex = TryParseEntityKey(parentEntityKey, out var parentZoneIndex, out var parsedParentIndex) && parentZoneIndex == zoneIndex ? parsedParentIndex : -1; var rootIndex = AppendEntity(entities, template.RootEntity, template.Name); if (parentIndex >= 0 && parentIndex < entities.Count) { var children = (entities[parentIndex].ChildEntityIndices ?? Array.Empty()).ToList(); if (!children.Contains(rootIndex)) children.Add(rootIndex); entities[parentIndex].ChildEntityIndices = children.ToArray(); } zone.Entities = entities.ToArray(); Zones = zones; return EntityRecordKey(zoneIndex, rootIndex); } public string EntityRecordKey(int zoneIndex, int entityIndex) { return EntityRecordKey(RunId, zoneIndex, entityIndex); } public static string EntityRecordKey(string runId, int zoneIndex, int entityIndex) { return $"global:aetheria.run_state.{(string.IsNullOrWhiteSpace(runId) ? "local" : runId)}.zone.{zoneIndex}.entity.{entityIndex}.v1"; } public static bool TryParseEntityKey(string entityKey, out int zoneIndex, out int entityIndex) { zoneIndex = -1; entityIndex = -1; if (string.IsNullOrWhiteSpace(entityKey)) return false; var parts = entityKey.Split('.'); for (var i = 0; i < parts.Length - 1; i++) { if (string.Equals(parts[i], "zone", StringComparison.Ordinal) && int.TryParse(parts[i + 1], NumberStyles.Integer, CultureInfo.InvariantCulture, out zoneIndex)) { continue; } if (string.Equals(parts[i], "entity", StringComparison.Ordinal) && int.TryParse(parts[i + 1], NumberStyles.Integer, CultureInfo.InvariantCulture, out entityIndex)) { continue; } } return zoneIndex >= 0 && entityIndex >= 0; } private static AetheriaRuntimeEntityLoadoutCommit CreateEntityLoadout( AetheriaRuntimeEntitySnapshotCommit entity, IReadOnlyList zoneEntities) { var childIndices = (entity.ChildEntityIndices ?? Array.Empty()) .Where(index => index >= 0) .ToArray(); var children = childIndices .Select(index => zoneEntities.FirstOrDefault(candidate => candidate != null && candidate.EntityIndex == index)) .Where(child => child != null) .Select(child => CreateEntityLoadout(child!, zoneEntities)) .ToArray(); var childIndexByEntityIndex = childIndices .Select((entityIndex, childIndex) => new { entityIndex, childIndex }) .ToDictionary(pair => pair.entityIndex, pair => pair.childIndex); return new AetheriaRuntimeEntityLoadoutCommit { Name = entity.Name ?? "", Kind = string.IsNullOrWhiteSpace(entity.Kind) ? "ship" : entity.Kind, FactionKey = entity.FactionKey ?? "", Hull = new AetheriaRuntimeLoadoutItemCommit { ItemKey = entity.HullItemKey ?? "", Quality = 1.0, Durability = 1.0, Quantity = 1, Enabled = true }, Equipment = CloneSlots(entity.Equipment), CargoBays = CloneSlots(entity.CargoBays), DockingBays = CloneSlots(entity.DockingBays), CargoContents = CloneCargo(entity.CargoContents), DockingBayContents = CloneCargo(entity.DockingBayContents), DockingBayAssignments = (entity.DockingBayAssignments ?? Array.Empty()) .Select(index => childIndexByEntityIndex.TryGetValue(index, out var childIndex) ? childIndex : -1) .ToArray(), WeaponGroups = (entity.WeaponGroups ?? Array.Empty>()) .Select(group => (IReadOnlyList)(group ?? Array.Empty()).ToArray()) .ToArray(), Children = children }; } private static int AppendEntity( List entities, AetheriaRuntimeEntityLoadoutCommit loadout, string templateName) { var entityIndex = entities.Count; var entity = new AetheriaRuntimeEntitySnapshotCommit { EntityIndex = entityIndex, Name = string.IsNullOrWhiteSpace(loadout.Name) ? templateName ?? "" : loadout.Name, Kind = string.IsNullOrWhiteSpace(loadout.Kind) ? "ship" : loadout.Kind, DirectionX = 0, DirectionY = 1, IsActive = true, HullItemKey = loadout.Hull?.ItemKey ?? "", FactionKey = loadout.FactionKey ?? "", Equipment = CloneSlots(loadout.Equipment), CargoBays = CloneSlots(loadout.CargoBays), DockingBays = CloneSlots(loadout.DockingBays), CargoContents = CloneCargo(loadout.CargoContents), DockingBayContents = CloneCargo(loadout.DockingBayContents), DockingBayAssignments = (loadout.DockingBayAssignments ?? Array.Empty()).ToArray(), WeaponGroups = (loadout.WeaponGroups ?? Array.Empty>()) .Select(group => (IReadOnlyList)(group ?? Array.Empty()).ToArray()) .ToArray(), TargetEntityIndex = -1, ShutdownPerformance = 0.25 }; entities.Add(entity); var childIndices = new List(); foreach (var child in loadout.Children ?? Array.Empty()) { if (child == null) continue; childIndices.Add(AppendEntity(entities, child, "")); } entity.ChildEntityIndices = childIndices.ToArray(); return entityIndex; } private static AetheriaRuntimeLoadoutItemSlotCommit[] CloneSlots( IReadOnlyList? slots) { return (slots ?? Array.Empty()) .Where(slot => slot != null) .Select(CloneSlot) .ToArray(); } private static AetheriaRuntimeCargoBayLoadoutCommit[] CloneCargo( IReadOnlyList? cargo) { return (cargo ?? Array.Empty()) .Select(bay => new AetheriaRuntimeCargoBayLoadoutCommit { Items = CloneSlots(bay?.Items) }) .ToArray(); } private static AetheriaRuntimeLoadoutItemSlotCommit CloneSlot(AetheriaRuntimeLoadoutItemSlotCommit slot) { return new AetheriaRuntimeLoadoutItemSlotCommit { X = slot.X, Y = slot.Y, Item = CloneItem(slot.Item) }; } private static AetheriaRuntimeLoadoutItemCommit CloneItem(AetheriaRuntimeLoadoutItemCommit? item) { return new AetheriaRuntimeLoadoutItemCommit { ItemKey = item?.ItemKey ?? "", Quality = item?.Quality ?? 1.0, Durability = item?.Durability ?? 1.0, Quantity = item?.Quantity ?? 1, Enabled = item?.Enabled ?? true, OverrideShutdown = item?.OverrideShutdown ?? false, Temperature = item?.Temperature ?? 0 }; } } [MessagePackObject] public sealed class AetheriaRuntimeFactionRelationshipCommit { [Key(1)] public string Relationship { get; set; } = ""; [Key(2)] public double Standing { get; set; } [Key(3)] public string FactionKey { get; set; } = ""; } [MessagePackObject] public sealed class AetheriaRuntimeZoneSnapshotCommit { [Key(0)] public int ZoneIndex { get; set; } = -1; [Key(1)] public string Name { get; set; } = ""; [Key(2)] public double PositionX { get; set; } [Key(3)] public double PositionY { get; set; } [Key(4)] public IReadOnlyList AdjacentZoneIndices { get; set; } = Array.Empty(); [Key(5)] public IReadOnlyList FactionIndices { get; set; } = Array.Empty(); [Key(6)] public int OwnerFactionIndex { get; set; } = -1; [Key(7)] public IReadOnlyList Entities { get; set; } = Array.Empty(); [Key(8)] public IReadOnlyList Orbits { get; set; } = Array.Empty(); [Key(9)] public IReadOnlyList Bodies { get; set; } = Array.Empty(); [Key(10)] public IReadOnlyList DroppedPickups { get; set; } = Array.Empty(); [Key(11)] public double GravityTerrainRadius { get; set; } [Key(12)] public double GravityTerrainDepth { get; set; } [Key(13)] public double GravityTerrainDepthExponent { get; set; } = 1.0; [Key(14)] public double GravityTerrainBoundaryFog { get; set; } [Key(15)] public double GravityTerrainWaveFrequency { get; set; } = 1.0; [Key(16)] public double SimulationTimeSeconds { get; set; } [Key(17)] public IReadOnlyList Projectiles { get; set; } = Array.Empty(); } [MessagePackObject] public sealed class AetheriaRuntimeProjectileCommit { [Key(0)] public string ProjectileId { get; set; } = ""; [Key(1)] public int SourceEntityIndex { get; set; } = -1; [Key(2)] public int TargetEntityIndex { get; set; } = -1; [Key(3)] public string FactionKey { get; set; } = ""; [Key(4)] public double PositionX { get; set; } [Key(5)] public double PositionY { get; set; } [Key(6)] public double PositionZ { get; set; } [Key(7)] public double DirectionX { get; set; } [Key(8)] public double DirectionY { get; set; } [Key(9)] public double VelocityX { get; set; } [Key(10)] public double VelocityY { get; set; } [Key(11)] public double Damage { get; set; } [Key(12)] public double Radius { get; set; } [Key(13)] public double AgeSeconds { get; set; } [Key(14)] public double LifetimeSeconds { get; set; } [Key(15)] public bool Guided { get; set; } [Key(16)] public bool Active { get; set; } = true; [Key(17)] public string WeaponKind { get; set; } = ""; } [MessagePackObject] public sealed class AetheriaRuntimeDroppedPickupCommit { [Key(0)] public int PickupIndex { get; set; } = -1; [Key(1)] public double PositionX { get; set; } [Key(2)] public double PositionY { get; set; } [Key(3)] public double PositionZ { get; set; } [Key(4)] public double VelocityX { get; set; } [Key(5)] public double VelocityY { get; set; } [Key(6)] public double VelocityZ { get; set; } [Key(7)] public AetheriaRuntimeLoadoutItemCommit Item { get; set; } = new AetheriaRuntimeLoadoutItemCommit(); } [MessagePackObject] public sealed class AetheriaRuntimeOrbitSnapshotCommit { [Key(2)] public double Distance { get; set; } [Key(3)] public double Phase { get; set; } [Key(4)] public double FixedPositionX { get; set; } [Key(5)] public double FixedPositionY { get; set; } [Key(6)] public string OrbitKey { get; set; } = ""; [Key(7)] public string ParentOrbitKey { get; set; } = ""; } [MessagePackObject] public sealed class AetheriaRuntimeBodySnapshotCommit { [Key(1)] public string Kind { get; set; } = ""; [Key(2)] public string Name { get; set; } = ""; [Key(4)] public double Mass { get; set; } [Key(5)] public IReadOnlyList Resources { get; set; } = Array.Empty(); [Key(6)] public double BodyRadiusMultiplier { get; set; } = 1.0; [Key(7)] public double GravityRadiusMultiplier { get; set; } = 1.0; [Key(8)] public double GravityDepthMultiplier { get; set; } = 1.0; [Key(9)] public double GravityDepthExponent { get; set; } = 16.0; [Key(10)] public IReadOnlyList Asteroids { get; set; } = Array.Empty(); [Key(11)] public AetheriaRuntimeGasGiantVisualCommit GasGiantVisual { get; set; } = new AetheriaRuntimeGasGiantVisualCommit(); [Key(12)] public AetheriaRuntimeSunVisualCommit SunVisual { get; set; } = new AetheriaRuntimeSunVisualCommit(); [Key(13)] public string BodyKey { get; set; } = ""; [Key(14)] public string OrbitKey { get; set; } = ""; [Key(15)] public double GravityInfluenceCenterX { get; set; } = double.NaN; [Key(16)] public double GravityInfluenceCenterZ { get; set; } = double.NaN; [Key(17)] public double GravityInfluenceRadius { get; set; } [Key(18)] public double GravityWellDepth { get; set; } [Key(19)] public double GravityWaveRadius { get; set; } [Key(20)] public double GravityWaveDepth { get; set; } [Key(21)] public double GravityWaveSpeed { get; set; } [Key(22)] public double IconSize { get; set; } } [MessagePackObject] public sealed class AetheriaRuntimeBodyResourceCommit { [Key(1)] public double Amount { get; set; } [Key(2)] public string ItemKey { get; set; } = ""; } [MessagePackObject] public sealed class AetheriaRuntimeAsteroidCommit { [Key(0)] public double Distance { get; set; } [Key(1)] public double Phase { get; set; } [Key(2)] public double Size { get; set; } [Key(3)] public double RotationSpeed { get; set; } [Key(4)] public double Damage { get; set; } [Key(5)] public double RespawnTimer { get; set; } [Key(6)] public IReadOnlyList MiningAccumulators { get; set; } = Array.Empty(); } [MessagePackObject] public sealed class AetheriaRuntimeAsteroidMiningAccumulatorCommit { [Key(0)] public int MinerEntityIndex { get; set; } = -1; [Key(1)] public double Amount { get; set; } } [MessagePackObject] public sealed class AetheriaRuntimeGasGiantVisualCommit { [Key(0)] public double FirstOffsetDomainRotationSpeed { get; set; } = 1.0; [Key(1)] public double FirstOffsetRotationSpeed { get; set; } = 1.0; [Key(2)] public double SecondOffsetDomainRotationSpeed { get; set; } = 1.0; [Key(3)] public double SecondOffsetRotationSpeed { get; set; } = 1.0; [Key(4)] public double AlbedoRotationSpeed { get; set; } = 1.0; [Key(5)] public double WaveRadiusMultiplier { get; set; } = 1.0; [Key(6)] public double WaveDepthMultiplier { get; set; } = 1.0; [Key(7)] public double WaveDepthExponent { get; set; } = 8.0; [Key(8)] public double WaveSpeedMultiplier { get; set; } = 8.0; [Key(9)] public IReadOnlyList MaterialOverrides { get; set; } = Array.Empty(); [Key(10)] public IReadOnlyList Colors { get; set; } = Array.Empty(); } [MessagePackObject] public sealed class AetheriaRuntimeSunVisualCommit { [Key(0)] public double LightColorX { get; set; } [Key(1)] public double LightColorY { get; set; } [Key(2)] public double LightColorZ { get; set; } [Key(3)] public double FogTintColorX { get; set; } [Key(4)] public double FogTintColorY { get; set; } [Key(5)] public double FogTintColorZ { get; set; } [Key(6)] public double LightRadiusMultiplier { get; set; } = 1.0; } [MessagePackObject] public sealed class AetheriaRuntimeColorCommit { [Key(0)] public double X { get; set; } [Key(1)] public double Y { get; set; } [Key(2)] public double Z { get; set; } [Key(3)] public double W { get; set; } } [MessagePackObject] public sealed class AetheriaRuntimeEntitySnapshotCommit { [Key(0)] public int EntityIndex { get; set; } = -1; [Key(1)] public string Name { get; set; } = ""; [Key(2)] public string Kind { get; set; } = ""; [Key(3)] public double PositionX { get; set; } [Key(4)] public double PositionY { get; set; } [Key(5)] public double PositionZ { get; set; } [Key(6)] public double DirectionX { get; set; } [Key(7)] public double DirectionY { get; set; } [Key(10)] public IReadOnlyList Equipment { get; set; } = Array.Empty(); [Key(11)] public IReadOnlyList CargoBays { get; set; } = Array.Empty(); [Key(12)] public IReadOnlyList DockingBays { get; set; } = Array.Empty(); [Key(13)] public IReadOnlyList ChildEntityIndices { get; set; } = Array.Empty(); [Key(14)] public IReadOnlyList> WeaponGroups { get; set; } = Array.Empty>(); [Key(15)] public IReadOnlyList StatGrids { get; set; } = Array.Empty(); [Key(16)] public double VelocityX { get; set; } [Key(17)] public double VelocityY { get; set; } [Key(18)] public int TargetEntityIndex { get; set; } = -1; [Key(19)] public bool IsActive { get; set; } [Key(20)] public bool HeatsinksEnabled { get; set; } [Key(21)] public bool OverrideShutdown { get; set; } [Key(22)] public double TractorPower { get; set; } [Key(23)] public double Heatstroke { get; set; } [Key(24)] public double Hypothermia { get; set; } [Key(25)] public IReadOnlyList ActiveConsumables { get; set; } = Array.Empty(); [Key(26)] public IReadOnlyList BehaviorProgress { get; set; } = Array.Empty(); [Key(27)] public IReadOnlyList WeaponStates { get; set; } = Array.Empty(); [Key(28)] public IReadOnlyList BehaviorStates { get; set; } = Array.Empty(); [Key(29)] public IReadOnlyList CargoContents { get; set; } = Array.Empty(); [Key(30)] public IReadOnlyList DockingBayContents { get; set; } = Array.Empty(); [Key(31)] public IReadOnlyList DockingBayAssignments { get; set; } = Array.Empty(); [Key(32)] public double Visibility { get; set; } [Key(33)] public int VisibilitySourceCount { get; set; } [Key(34)] public IReadOnlyList Contacts { get; set; } = Array.Empty(); [Key(35)] public string HullItemKey { get; set; } = ""; [Key(36)] public string FactionKey { get; set; } = ""; [Key(37)] public double ShutdownPerformance { get; set; } } [MessagePackObject] public sealed class AetheriaRuntimeEntityContactCommit { [Key(0)] public int TargetEntityIndex { get; set; } = -1; [Key(1)] public double InfoGathered { get; set; } [Key(2)] public bool Hostile { get; set; } [Key(3)] public bool Visible { get; set; } } [MessagePackObject] public sealed class AetheriaRuntimeEntityStatGridCommit { [Key(0)] public string Name { get; set; } = ""; [Key(1)] public int Width { get; set; } [Key(2)] public int Height { get; set; } [Key(3)] public IReadOnlyList Values { get; set; } = Array.Empty(); } [MessagePackObject] public sealed class AetheriaRuntimeActiveConsumableCommit { [Key(1)] public double Quality { get; set; } = 1.0; [Key(2)] public double RemainingDuration { get; set; } [Key(3)] public double Duration { get; set; } [Key(4)] public string ItemKey { get; set; } = ""; } [MessagePackObject] public sealed class AetheriaRuntimeBehaviorProgressCommit { [Key(0)] public string OwnerKind { get; set; } = ""; [Key(1)] public int OwnerIndex { get; set; } = -1; [Key(2)] public int BehaviorIndex { get; set; } = -1; [Key(3)] public string BehaviorKind { get; set; } = ""; [Key(4)] public double Progress { get; set; } } [MessagePackObject] public sealed class AetheriaRuntimeWeaponStateCommit { [Key(0)] public string OwnerKind { get; set; } = ""; [Key(1)] public int OwnerIndex { get; set; } = -1; [Key(2)] public int BehaviorIndex { get; set; } = -1; [Key(3)] public string BehaviorKind { get; set; } = ""; [Key(4)] public bool Firing { get; set; } [Key(5)] public int Ammo { get; set; } [Key(6)] public int BurstRemaining { get; set; } [Key(7)] public double BurstTimer { get; set; } [Key(8)] public double BurstInterval { get; set; } [Key(9)] public double CooldownProgress { get; set; } [Key(10)] public bool CoolingDown { get; set; } [Key(11)] public bool Charging { get; set; } [Key(12)] public bool Charged { get; set; } [Key(13)] public double Charge { get; set; } [Key(14)] public bool Reloading { get; set; } [Key(15)] public double ReloadProgress { get; set; } [Key(16)] public double AmmoIntervalProgress { get; set; } [Key(17)] public double LockProgress { get; set; } [Key(18)] public int LockTargetEntityIndex { get; set; } = -1; } [MessagePackObject] public sealed class AetheriaRuntimeBehaviorStateCommit { [Key(0)] public string OwnerKind { get; set; } = ""; [Key(1)] public int OwnerIndex { get; set; } = -1; [Key(2)] public int BehaviorIndex { get; set; } = -1; [Key(3)] public string BehaviorKind { get; set; } = ""; [Key(4)] public bool Pinging { get; set; } [Key(5)] public double PingCooldown { get; set; } [Key(6)] public double PingLerp { get; set; } [Key(7)] public double PingRadius { get; set; } [Key(8)] public int PingedEntityCount { get; set; } [Key(9)] public double RadiatorTemperature { get; set; } [Key(10)] public double Emissivity { get; set; } [Key(11)] public double PumpedHeat { get; set; } [Key(12)] public double WasteHeat { get; set; } [Key(13)] public double EnergyUsage { get; set; } [Key(14)] public double ReactorDraw { get; set; } [Key(15)] public double ReactorLoadRatio { get; set; } [Key(16)] public double CapacitorCharge { get; set; } [Key(17)] public double CapacitorCapacity { get; set; } [Key(18)] public double CapacitorEfficiency { get; set; } [Key(19)] public double AetherDriveAxisX { get; set; } [Key(20)] public double AetherDriveAxisY { get; set; } [Key(21)] public double AetherDriveAxisZ { get; set; } [Key(22)] public double AetherDriveThrustX { get; set; } [Key(23)] public double AetherDriveThrustY { get; set; } [Key(24)] public double AetherDriveThrustZ { get; set; } [Key(25)] public double AetherDriveRpmX { get; set; } [Key(26)] public double AetherDriveRpmY { get; set; } [Key(27)] public double AetherDriveRpmZ { get; set; } [Key(28)] public double AetherDriveMaximumRpm { get; set; } [Key(29)] public double AetherDriveThrustDirectionX { get; set; } [Key(30)] public double AetherDriveThrustDirectionY { get; set; } [Key(32)] public int ResourceScannerAsteroidIndex { get; set; } = -1; [Key(33)] public double ResourceScannerScanTime { get; set; } [Key(34)] public double ResourceScannerRange { get; set; } [Key(35)] public double ResourceScannerMinimumDensity { get; set; } [Key(36)] public double ResourceScannerScanDuration { get; set; } [Key(38)] public int MiningToolAsteroidIndex { get; set; } = -1; [Key(39)] public double MiningToolRange { get; set; } [Key(40)] public double ThrusterAxis { get; set; } [Key(41)] public double ThrusterThrust { get; set; } [Key(42)] public double ThrusterTorque { get; set; } [Key(43)] public double ShieldEfficiency { get; set; } [Key(44)] public double ShieldEnergyUsage { get; set; } [Key(45)] public double VelocityLimit { get; set; } [Key(46)] public double ThermotoggleTargetTemperature { get; set; } [Key(47)] public bool SwitchActivated { get; set; } [Key(48)] public bool TriggerPulled { get; set; } [Key(49)] public bool StatModifierApplied { get; set; } [Key(50)] public bool StatModifierExecuted { get; set; } [Key(51)] public int StatModifierTargetStatCount { get; set; } [Key(52)] public int TurretControllerWeaponCount { get; set; } [Key(53)] public double TurretControllerShotSpeed { get; set; } [Key(54)] public bool TurretControllerPredictShots { get; set; } [Key(55)] public string ResourceScannerTargetBodyKey { get; set; } = ""; [Key(56)] public string MiningToolAsteroidBeltKey { get; set; } = ""; } }