using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; using Barotrauma.Items.Components; using Barotrauma.Networking; using Microsoft.Xna.Framework; namespace Barotrauma { partial class Item { public enum EventType { ComponentState = 0, InventoryState = 1, Treatment = 2, ChangeProperty = 3, Combine = 4, Status = 5, AssignCampaignInteraction = 6, ApplyStatusEffect = 7, Upgrade = 8, ItemStat = 9, DroppedStack = 10, SetHighlight = 11, MinValue = 0, MaxValue = 11 } public interface IEventData : NetEntityEvent.IData { public EventType EventType { get; } } public readonly struct ComponentStateEventData : IEventData { public EventType EventType => EventType.ComponentState; public readonly ItemComponent Component; public readonly ItemComponent.IEventData ComponentData; public ComponentStateEventData(ItemComponent component, ItemComponent.IEventData componentData) { Component = component; ComponentData = componentData; } } public readonly struct InventoryStateEventData : IEventData { public EventType EventType => EventType.InventoryState; public readonly ItemContainer Component; public readonly Range SlotRange; public InventoryStateEventData(ItemContainer component, Range slotRange) { Component = component; SlotRange = slotRange; } } public readonly struct ChangePropertyEventData : IEventData { public EventType EventType => EventType.ChangeProperty; public readonly SerializableProperty SerializableProperty; public readonly ISerializableEntity Entity; public ChangePropertyEventData(SerializableProperty serializableProperty, ISerializableEntity entity) { if (serializableProperty.GetAttribute() == null) { DebugConsole.ThrowError($"Attempted to create {nameof(ChangePropertyEventData)} for the non-editable property {serializableProperty.Name}."); } SerializableProperty = serializableProperty; Entity = entity; } } public readonly struct SetItemStatEventData : IEventData { public EventType EventType => EventType.ItemStat; public readonly Dictionary Stats; public SetItemStatEventData(Dictionary stats) { Stats = stats; } } private readonly struct ItemStatusEventData : IEventData { public EventType EventType => EventType.Status; public readonly bool LoadingRound; public ItemStatusEventData(bool loadingRound) { LoadingRound = loadingRound; } } private readonly struct AssignCampaignInteractionEventData : IEventData { public EventType EventType => EventType.AssignCampaignInteraction; public readonly ImmutableArray TargetClients; public AssignCampaignInteractionEventData(IEnumerable targetClients) { TargetClients = (targetClients ?? Enumerable.Empty()).ToImmutableArray(); } } public readonly struct ApplyStatusEffectEventData : IEventData { public EventType EventType => EventType.ApplyStatusEffect; public readonly ActionType ActionType; public readonly ItemComponent TargetItemComponent; public readonly Character TargetCharacter; public readonly Limb TargetLimb; public readonly Entity UseTarget; public readonly Vector2? WorldPosition; public ApplyStatusEffectEventData( ActionType actionType, ItemComponent targetItemComponent = null, Character targetCharacter = null, Limb targetLimb = null, Entity useTarget = null, Vector2? worldPosition = null) { ActionType = actionType; TargetItemComponent = targetItemComponent; TargetCharacter = targetCharacter; TargetLimb = targetLimb; UseTarget = useTarget; WorldPosition = worldPosition; } } private readonly struct UpgradeEventData : IEventData { public EventType EventType => EventType.Upgrade; public readonly Upgrade Upgrade; public UpgradeEventData(Upgrade upgrade) { Upgrade = upgrade; } } } }