From 4b79f1e2e0d7bd66d61ddde8a25cd2e5b20f4ef9 Mon Sep 17 00:00:00 2001 From: CaYpeN1 Date: Fri, 22 Mar 2024 16:27:51 +0500 Subject: [PATCH] change components, remake system --- .../WeaponsModules/WeaponModulesVisuals.cs | 5 +- .../Components/AcceleratorModuleComponent.cs | 5 +- .../Components/FlameHiderModuleComponent.cs | 3 +- .../Components/LaserModuleComponent.cs | 4 +- .../Components/LightModuleComponent.cs | 2 +- .../Components/SilencerModuleComponent.cs | 9 +- .../Components/WeaponModulesComponent.cs | 11 - .../WeaponModules/WeaponModulesSystem.cs | 267 +++++++++++------- .../Weapons/Ranged/Components/GunComponent.cs | 8 +- .../Weapons/Ranged/Systems/SharedGunSystem.cs | 12 +- .../SharedWeaponModulesSystem.cs | 17 ++ .../WeaponModules/WeaponModulesComponent.cs | 29 ++ .../WeaponModulesVisualsComponent.cs | 23 -- .../Objects/Weapons/Guns/Modules/modules.yml | 5 + 14 files changed, 239 insertions(+), 161 deletions(-) delete mode 100644 Content.Server/_White/WeaponModules/Components/WeaponModulesComponent.cs create mode 100644 Content.Shared/_White/WeaponModules/SharedWeaponModulesSystem.cs create mode 100644 Content.Shared/_White/WeaponModules/WeaponModulesComponent.cs delete mode 100644 Content.Shared/_White/WeaponModules/WeaponModulesVisualsComponent.cs diff --git a/Content.Client/_White/WeaponsModules/WeaponModulesVisuals.cs b/Content.Client/_White/WeaponsModules/WeaponModulesVisuals.cs index 5601d15aca..85eb8112af 100644 --- a/Content.Client/_White/WeaponsModules/WeaponModulesVisuals.cs +++ b/Content.Client/_White/WeaponsModules/WeaponModulesVisuals.cs @@ -1,16 +1,17 @@ using Content.Client.Weapons.Ranged.Components; +using Content.Shared._White.WeaponModules; using Content.Shared.Rounding; using Content.Shared.Weapons.Ranged.Systems; using Robust.Client.GameObjects; namespace Content.Client._White.WeaponsModules; -public sealed partial class WeaponModulesVisuals : VisualizerSystem +public sealed partial class WeaponModulesVisuals : VisualizerSystem { [Dependency] private readonly PointLightSystem _lightSystem = default!; - protected override void OnAppearanceChange(EntityUid uid, WeaponModulesVisualsComponent component, ref AppearanceChangeEvent args) + protected override void OnAppearanceChange(EntityUid uid, WeaponModulesComponent component, ref AppearanceChangeEvent args) { base.OnAppearanceChange(uid, component, ref args); diff --git a/Content.Server/_White/WeaponModules/Components/AcceleratorModuleComponent.cs b/Content.Server/_White/WeaponModules/Components/AcceleratorModuleComponent.cs index 2ba3bc4c7e..e95cf6e22e 100644 --- a/Content.Server/_White/WeaponModules/Components/AcceleratorModuleComponent.cs +++ b/Content.Server/_White/WeaponModules/Components/AcceleratorModuleComponent.cs @@ -4,7 +4,8 @@ /// This is used for... /// [RegisterComponent] -public sealed partial class AcceleratorModuleComponent : Component +public sealed partial class AcceleratorModuleComponent : Shared._White.WeaponModules.WeaponModulesComponent { - + [ViewVariables(VVAccess.ReadWrite), DataField] + public float OldFireRate; } diff --git a/Content.Server/_White/WeaponModules/Components/FlameHiderModuleComponent.cs b/Content.Server/_White/WeaponModules/Components/FlameHiderModuleComponent.cs index d504b700c3..1900a94946 100644 --- a/Content.Server/_White/WeaponModules/Components/FlameHiderModuleComponent.cs +++ b/Content.Server/_White/WeaponModules/Components/FlameHiderModuleComponent.cs @@ -4,7 +4,6 @@ /// This is used for... /// [RegisterComponent] -public sealed partial class FlameHiderModuleComponent : Component +public sealed partial class FlameHiderModuleComponent : Shared._White.WeaponModules.WeaponModulesComponent { - } diff --git a/Content.Server/_White/WeaponModules/Components/LaserModuleComponent.cs b/Content.Server/_White/WeaponModules/Components/LaserModuleComponent.cs index 5ab6004543..e4b7951872 100644 --- a/Content.Server/_White/WeaponModules/Components/LaserModuleComponent.cs +++ b/Content.Server/_White/WeaponModules/Components/LaserModuleComponent.cs @@ -4,7 +4,7 @@ /// This is used for... /// [RegisterComponent] -public sealed partial class LaserModuleComponent : Component +public sealed partial class LaserModuleComponent : Shared._White.WeaponModules.WeaponModulesComponent { - + } diff --git a/Content.Server/_White/WeaponModules/Components/LightModuleComponent.cs b/Content.Server/_White/WeaponModules/Components/LightModuleComponent.cs index 43081881ab..8af16ff5f2 100644 --- a/Content.Server/_White/WeaponModules/Components/LightModuleComponent.cs +++ b/Content.Server/_White/WeaponModules/Components/LightModuleComponent.cs @@ -4,7 +4,7 @@ /// LightModuleComponent /// [RegisterComponent] -public sealed partial class LightModuleComponent : WeaponModulesComponent +public sealed partial class LightModuleComponent : Shared._White.WeaponModules.WeaponModulesComponent { [ViewVariables(VVAccess.ReadWrite)] public bool Enabled; diff --git a/Content.Server/_White/WeaponModules/Components/SilencerModuleComponent.cs b/Content.Server/_White/WeaponModules/Components/SilencerModuleComponent.cs index 1c1f9c6a8d..8d0d2bbcd8 100644 --- a/Content.Server/_White/WeaponModules/Components/SilencerModuleComponent.cs +++ b/Content.Server/_White/WeaponModules/Components/SilencerModuleComponent.cs @@ -1,10 +1,13 @@ -namespace Content.Server._White.WeaponModules; +using Robust.Shared.Audio; + +namespace Content.Server._White.WeaponModules; /// /// This is used for... /// [RegisterComponent] -public sealed partial class SilencerModuleComponent : Component +public sealed partial class SilencerModuleComponent : Shared._White.WeaponModules.WeaponModulesComponent { - + [ViewVariables(VVAccess.ReadWrite), DataField] + public SoundSpecifier? OldSoundGunshot; } diff --git a/Content.Server/_White/WeaponModules/Components/WeaponModulesComponent.cs b/Content.Server/_White/WeaponModules/Components/WeaponModulesComponent.cs deleted file mode 100644 index 53cc288e5f..0000000000 --- a/Content.Server/_White/WeaponModules/Components/WeaponModulesComponent.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace Content.Server._White.WeaponModules; - -/// -/// Base Module Component -/// -[RegisterComponent] -public partial class WeaponModulesComponent : Component -{ - [ViewVariables(VVAccess.ReadWrite), DataField] - public List Modules = new(); -} diff --git a/Content.Server/_White/WeaponModules/WeaponModulesSystem.cs b/Content.Server/_White/WeaponModules/WeaponModulesSystem.cs index 70bd9a8de5..f9d6b14740 100644 --- a/Content.Server/_White/WeaponModules/WeaponModulesSystem.cs +++ b/Content.Server/_White/WeaponModules/WeaponModulesSystem.cs @@ -1,10 +1,13 @@ using System.Linq; -using Content.Client._White.WeaponsModules; +using Content.Shared._White.Chemistry; +using Content.Shared._White.WeaponModules; using Content.Shared.Weapons.Ranged.Components; +using Content.Shared.Weapons.Ranged.Events; using Content.Shared.Weapons.Ranged.Systems; using Robust.Server.GameObjects; using Robust.Shared.Audio; using Robust.Shared.Containers; +using Robust.Shared.Prototypes; namespace Content.Server._White.WeaponModules; @@ -15,130 +18,200 @@ public sealed class WeaponModulesSystem : EntitySystem [Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!; [Dependency] private readonly SharedGunSystem _gunSystem = default!; - SoundSpecifier? oldSoundGunshot; - private float oldFireRate; - public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnInsert); - SubscribeLocalEvent(OnEject); + SubscribeLocalEvent(LightModuleOnInsert); + SubscribeLocalEvent(LightModuleOnEject); + + SubscribeLocalEvent(LaserModuleOnInsert); + SubscribeLocalEvent(LaserModuleOnEject); + + SubscribeLocalEvent(FlameHiderModuleOnInsert); + SubscribeLocalEvent(FlameHiderModuleOnEject); + + SubscribeLocalEvent(SilencerModuleOnInsert); + SubscribeLocalEvent(SilencerModuleOnEject); + + SubscribeLocalEvent(AcceleratorModuleOnInsert); + SubscribeLocalEvent(AcceleratorModuleOnEject); } - private void OnInsert(EntityUid uid, WeaponModulesComponent comp, EntInsertedIntoContainerMessage args) + #region InsertModules + private void LightModuleOnInsert(EntityUid module, LightModuleComponent component, EntGotInsertedIntoContainerMessage args) { if (ModulesSlot != args.Container.ID) return; - EntityUid module = args.Entity; + if(!component.Modules.Contains(module)) + component.Modules.Add(module); + EntityUid weapon = args.Container.Owner; - if (TryComp(weapon, out var gunComp)) - { - oldSoundGunshot = gunComp.SoundGunshot; - oldFireRate = gunComp.FireRate; - } + if(!TryComp(weapon, out var appearanceComponent)) return; - InsertModules(module, comp); - ModuleEffect(module, weapon); + _appearanceSystem.SetData(weapon, ModuleVisualState.Module, "light", appearanceComponent); + + _lightSystem.EnsureLight(weapon); + + _lightSystem.TryGetLight(weapon, out var light); + _appearanceSystem.SetData(weapon, Modules.Light, "none", appearanceComponent); + + _lightSystem.SetRadius(weapon, 4F, light); + _lightSystem.SetEnabled(weapon, true, light); } - private void OnEject(EntityUid uid, WeaponModulesComponent comp, EntRemovedFromContainerMessage args) + private void LaserModuleOnInsert(EntityUid module, LaserModuleComponent component, EntGotInsertedIntoContainerMessage args) { if (ModulesSlot != args.Container.ID) return; - EntityUid module = args.Entity; + if(!component.Modules.Contains(module)) + component.Modules.Add(module); + EntityUid weapon = args.Container.Owner; - RemoveModules(module, comp); - RemoveModuleEffect(module, weapon); - } - - private void InsertModules(EntityUid module, WeaponModulesComponent comp) - { - if(!comp.Modules.Contains(module)) - comp.Modules.Add(module); - } - - private void ModuleEffect(EntityUid module, EntityUid weapon) - { if(!TryComp(weapon, out var appearanceComponent)) return; - switch (module) - { - case "LightModule": - _appearanceSystem.SetData(weapon, ModuleVisualState.Module, "light", appearanceComponent); - _lightSystem.EnsureLight(weapon); - - _lightSystem.TryGetLight(weapon, out var light); - _appearanceSystem.SetData(weapon, Modules.Light, "none", appearanceComponent); - - _lightSystem.SetRadius(weapon, 4F, light); - _lightSystem.SetEnabled(weapon, true, light); - break; - - case "LaserModule": - _appearanceSystem.SetData(weapon, ModuleVisualState.Module, "laser", appearanceComponent); - _gunSystem.setProjectileSpeed(weapon, 35.5F); - break; - - case "FlameHiderModule": - _appearanceSystem.SetData(weapon, ModuleVisualState.Module, "flamehider", appearanceComponent); - _gunSystem.setUseEffect(weapon, true); - break; - - case "SilencerModule": - _appearanceSystem.SetData(weapon, ModuleVisualState.Module, "silencer", appearanceComponent); - _gunSystem.setUseEffect(weapon, true); - _gunSystem.setSound(weapon, new SoundPathSpecifier("/Audio/White/Weapons/Modules/silence.ogg")); - break; - - case "AcceleratorModule": - _appearanceSystem.SetData(weapon, ModuleVisualState.Module, "accelerator", appearanceComponent); - _gunSystem.setFireRate(weapon, 7.5F); - break; - } + _appearanceSystem.SetData(weapon, ModuleVisualState.Module, "laser", appearanceComponent); + _gunSystem.setProjectileSpeed(weapon, 35.5F); } - private void RemoveModules(EntityUid module, WeaponModulesComponent comp) + private void FlameHiderModuleOnInsert(EntityUid module, FlameHiderModuleComponent component, EntGotInsertedIntoContainerMessage args) { - if(comp.Modules.Contains(module)) - comp.Modules.Remove(module); - } + if (ModulesSlot != args.Container.ID) + return; + + if(!component.Modules.Contains(module)) + component.Modules.Add(module); + + EntityUid weapon = args.Container.Owner; - private void RemoveModuleEffect(EntityUid module, EntityUid weapon) - { if(!TryComp(weapon, out var appearanceComponent)) return; - switch (module) - { - case "LightModule": - _appearanceSystem.SetData(weapon, ModuleVisualState.Module, "none", appearanceComponent); - _lightSystem.TryGetLight(weapon, out var light); - _lightSystem.SetEnabled(weapon, false, light); - break; - case "LaserModule": - _appearanceSystem.SetData(weapon, ModuleVisualState.Module, "none", appearanceComponent); - _gunSystem.setProjectileSpeed(weapon, 25F); - break; - - case "FlameHiderModule": - _appearanceSystem.SetData(weapon, ModuleVisualState.Module, "none", appearanceComponent); - _gunSystem.setUseEffect(weapon, false); - break; - - case "SilencerModule": - _appearanceSystem.SetData(weapon, ModuleVisualState.Module, "none", appearanceComponent); - _gunSystem.setUseEffect(weapon, false); - _gunSystem.setSound(weapon, oldSoundGunshot!); - break; - - case "AcceleratorModule": - _appearanceSystem.SetData(weapon, ModuleVisualState.Module, "none", appearanceComponent); - _gunSystem.setFireRate(weapon, oldFireRate); - break; - } + _appearanceSystem.SetData(weapon, ModuleVisualState.Module, "flamehider", appearanceComponent); + component.UseEffect = true; + Dirty(module, component); } + + private void SilencerModuleOnInsert(EntityUid module, SilencerModuleComponent component, EntGotInsertedIntoContainerMessage args) + { + if (ModulesSlot != args.Container.ID) + return; + + if(!component.Modules.Contains(module)) + component.Modules.Add(module); + + EntityUid weapon = args.Container.Owner; + + if(!TryComp(weapon, out var appearanceComponent)) return; + if (!TryComp(weapon, out var gunComp)) return; + + component.OldSoundGunshot = gunComp.SoundGunshot; + + _appearanceSystem.SetData(weapon, ModuleVisualState.Module, "silencer", appearanceComponent); + component.UseEffect = true; + _gunSystem.setSound(weapon, new SoundPathSpecifier("/Audio/White/Weapons/Modules/silence.ogg")); + + Dirty(module, component); + } + + private void AcceleratorModuleOnInsert(EntityUid module, AcceleratorModuleComponent component, EntGotInsertedIntoContainerMessage args) + { + if (ModulesSlot != args.Container.ID) + return; + + if(!component.Modules.Contains(module)) + component.Modules.Add(module); + + EntityUid weapon = args.Container.Owner; + + if(!TryComp(weapon, out var appearanceComponent)) return; + + _appearanceSystem.SetData(weapon, ModuleVisualState.Module, "accelerator", appearanceComponent); + _gunSystem.setFireRate(weapon, 7.5F); + } + #endregion + + #region EjectModules + private void LightModuleOnEject(EntityUid module, LightModuleComponent component, EntGotRemovedFromContainerMessage args) + { + if (ModulesSlot != args.Container.ID) + return; + + if(component.Modules.Contains(module)) + component.Modules.Remove(module); + + EntityUid weapon = args.Container.Owner; + if(!TryComp(weapon, out var appearanceComponent)) return; + + _appearanceSystem.SetData(weapon, ModuleVisualState.Module, "none", appearanceComponent); + _lightSystem.TryGetLight(weapon, out var light); + _lightSystem.SetEnabled(weapon, false, light); + } + + private void LaserModuleOnEject(EntityUid module, LaserModuleComponent component, EntGotRemovedFromContainerMessage args) + { + if (ModulesSlot != args.Container.ID) + return; + + if(component.Modules.Contains(module)) + component.Modules.Remove(module); + + EntityUid weapon = args.Container.Owner; + if(!TryComp(weapon, out var appearanceComponent)) return; + + _appearanceSystem.SetData(weapon, ModuleVisualState.Module, "none", appearanceComponent); + _gunSystem.setProjectileSpeed(weapon, 25F); + } + + private void FlameHiderModuleOnEject(EntityUid module, FlameHiderModuleComponent component, EntGotRemovedFromContainerMessage args) + { + if (ModulesSlot != args.Container.ID) + return; + + if(component.Modules.Contains(module)) + component.Modules.Remove(module); + + EntityUid weapon = args.Container.Owner; + if(!TryComp(weapon, out var appearanceComponent)) return; + + _appearanceSystem.SetData(weapon, ModuleVisualState.Module, "none", appearanceComponent); + component.UseEffect = false; + Dirty(module, component); + } + + private void SilencerModuleOnEject(EntityUid module, SilencerModuleComponent component, EntGotRemovedFromContainerMessage args) + { + if (ModulesSlot != args.Container.ID) + return; + + if(component.Modules.Contains(module)) + component.Modules.Remove(module); + + EntityUid weapon = args.Container.Owner; + if(!TryComp(weapon, out var appearanceComponent)) return; + + _appearanceSystem.SetData(weapon, ModuleVisualState.Module, "none", appearanceComponent); + component.UseEffect = false; + _gunSystem.setSound(weapon, component.OldSoundGunshot!); + Dirty(module, component); + } + + private void AcceleratorModuleOnEject(EntityUid module, AcceleratorModuleComponent component, EntGotRemovedFromContainerMessage args) + { + if (ModulesSlot != args.Container.ID) + return; + + if(component.Modules.Contains(module)) + component.Modules.Remove(module); + + EntityUid weapon = args.Container.Owner; + if(!TryComp(weapon, out var appearanceComponent)) return; + + _appearanceSystem.SetData(weapon, ModuleVisualState.Module, "none", appearanceComponent); + _gunSystem.setFireRate(weapon, component.OldFireRate); + } + #endregion } diff --git a/Content.Shared/Weapons/Ranged/Components/GunComponent.cs b/Content.Shared/Weapons/Ranged/Components/GunComponent.cs index 712c10c3fd..569b10d75e 100644 --- a/Content.Shared/Weapons/Ranged/Components/GunComponent.cs +++ b/Content.Shared/Weapons/Ranged/Components/GunComponent.cs @@ -179,12 +179,6 @@ public sealed partial class GunComponent : Component [DataField] public bool ResetOnHandSelected = true; - /// - /// For flamehider module | WD EDIT - /// - [DataField, AutoNetworkedField] - public bool canUseEffect; - /// /// The base value for how fast the projectile moves. /// @@ -237,7 +231,7 @@ public sealed partial class GunComponent : Component // WD START public EntityUid? Target; - + [DataField("forceThrowingAngle")] [ViewVariables(VVAccess.ReadWrite)] public bool ForceThrowingAngle; diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs index 995f6908b4..e7c73b328f 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs @@ -476,9 +476,7 @@ public abstract partial class SharedGunSystem : EntitySystem protected void MuzzleFlash(EntityUid gun, AmmoComponent component, EntityUid? user = null) { - TryComp(gun, out var gunComponent); // WD EDIT - - var attemptEv = new GunMuzzleFlashAttemptEvent(gunComponent!.canUseEffect); // WD EDIT + var attemptEv = new GunMuzzleFlashAttemptEvent(); RaiseLocalEvent(gun, ref attemptEv); if (attemptEv.Cancelled) return; @@ -560,14 +558,6 @@ public abstract partial class SharedGunSystem : EntitySystem RefreshModifiers(weapon); } - - public void setUseEffect(EntityUid weapon, bool state) - { - TryComp(weapon, out var gunComponent); - gunComponent!.canUseEffect = state; - - RefreshModifiers(weapon); - } // WD EDIT END protected abstract void CreateEffect(EntityUid uid, MuzzleFlashEvent message, EntityUid? user = null); /// diff --git a/Content.Shared/_White/WeaponModules/SharedWeaponModulesSystem.cs b/Content.Shared/_White/WeaponModules/SharedWeaponModulesSystem.cs new file mode 100644 index 0000000000..50fb307916 --- /dev/null +++ b/Content.Shared/_White/WeaponModules/SharedWeaponModulesSystem.cs @@ -0,0 +1,17 @@ +using Content.Shared.Weapons.Ranged.Events; + +namespace Content.Shared._White.WeaponModules; + +public abstract class SharedWeaponModulesSystem : EntitySystem +{ + + public override void Initialize() + { + SubscribeLocalEvent(OnMuzzleFlashEvent); + } + + private void OnMuzzleFlashEvent(EntityUid weapon, WeaponModulesComponent component, ref GunMuzzleFlashAttemptEvent args) + { + args.Cancelled = component.UseEffect; + } +} diff --git a/Content.Shared/_White/WeaponModules/WeaponModulesComponent.cs b/Content.Shared/_White/WeaponModules/WeaponModulesComponent.cs new file mode 100644 index 0000000000..1a9c9bcf85 --- /dev/null +++ b/Content.Shared/_White/WeaponModules/WeaponModulesComponent.cs @@ -0,0 +1,29 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Serialization; + +namespace Content.Shared._White.WeaponModules; + +/// +/// Base Module Component +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public partial class WeaponModulesComponent : Component +{ + [ViewVariables(VVAccess.ReadWrite), DataField] + public List Modules = new(); + + [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField] + public bool UseEffect; +} + +[Serializable, NetSerializable] +public enum ModuleVisualState : byte +{ + Module +} + +[Serializable, NetSerializable] +public enum Modules : byte +{ + Light +} diff --git a/Content.Shared/_White/WeaponModules/WeaponModulesVisualsComponent.cs b/Content.Shared/_White/WeaponModules/WeaponModulesVisualsComponent.cs deleted file mode 100644 index 4da7ef3418..0000000000 --- a/Content.Shared/_White/WeaponModules/WeaponModulesVisualsComponent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Robust.Shared.GameStates; -using Robust.Shared.Serialization; - -namespace Content.Client._White.WeaponsModules; - -/// -[RegisterComponent] -public sealed partial class WeaponModulesVisualsComponent : Component -{ - [DataField] public string? state; -} - -[Serializable, NetSerializable] -public enum ModuleVisualState : byte -{ - Module -} - -[Serializable, NetSerializable] -public enum Modules : byte -{ - Light -} diff --git a/Resources/Prototypes/White/Entities/Objects/Weapons/Guns/Modules/modules.yml b/Resources/Prototypes/White/Entities/Objects/Weapons/Guns/Modules/modules.yml index 8986aff935..7592dc5192 100644 --- a/Resources/Prototypes/White/Entities/Objects/Weapons/Guns/Modules/modules.yml +++ b/Resources/Prototypes/White/Entities/Objects/Weapons/Guns/Modules/modules.yml @@ -28,6 +28,7 @@ parent: BaseModule components: - type: Item + - type: LightModule - type: Sprite state: light - type: Appearance @@ -39,6 +40,7 @@ parent: BaseModule components: - type: Item + - type: LaserModule - type: Sprite state: laser - type: Appearance @@ -50,6 +52,7 @@ parent: BaseModule components: - type: Item + - type: FlameHiderModule - type: Sprite state: flamehider - type: Appearance @@ -61,6 +64,7 @@ parent: BaseModule components: - type: Item + - type: SilencerModule - type: Sprite state: silencer - type: Appearance @@ -72,6 +76,7 @@ parent: BaseModule components: - type: Item + - type: AcceleratorModule - type: Sprite state: accelerator - type: Appearance \ No newline at end of file