From 4f6be998537da7a2debbbd0a64d36eb02225c8ae Mon Sep 17 00:00:00 2001 From: rhailrake <49613070+rhailrake@users.noreply.github.com> Date: Fri, 28 Apr 2023 06:07:50 +0600 Subject: [PATCH] [feat]MeatyOre panel --- Content.Client/Store/Ui/StoreMenu.xaml.cs | 2 +- .../MenuBar/GameTopMenuBarUIController.cs | 5 + .../MenuBar/Widgets/GameTopMenuBar.xaml | 10 + .../White/MeatyOre/MeatyOreUIController.cs | 65 + .../Systems/AdminVerbSystem.Antags.cs | 2 +- .../Conditions/BuyerBlockForAntagCondition.cs | 24 + .../Conditions/BuyerBlockForMindProtected.cs | 21 + .../Conditions/DonationTierLockCondition.cs | 24 + .../Store/Systems/StoreSystem.Ui.cs | 10 +- .../White/MeatyOre/MeatyOreStoreSystem.cs | 197 +++ .../Interaction/SharedInteractionSystem.cs | 7 + Content.Shared/Store/ListingPrototype.cs | 3 +- Content.Shared/Verbs/VerbCategory.cs | 3 + .../White/MeatyOre/SharedMeatyOre.cs | 23 + .../White/Sponsors/MsgSponsorInfo.cs | 3 + Content.Shared/White/WhiteCVars.cs | 18 + .../MeatyOrePanel/meatyore_catalog.yml | 1553 +++++++++++++++++ Resources/Prototypes/Store/currency.yml | 9 +- .../Store/meatyore_store_caterogires.yml | 51 + .../Store/meatyore_store_presset.yml | 35 + .../Textures/Interface/meatyore-shop-icon.png | Bin 0 -> 2206 bytes 21 files changed, 2058 insertions(+), 7 deletions(-) create mode 100644 Content.Client/White/MeatyOre/MeatyOreUIController.cs create mode 100644 Content.Server/Store/Conditions/BuyerBlockForAntagCondition.cs create mode 100644 Content.Server/Store/Conditions/BuyerBlockForMindProtected.cs create mode 100644 Content.Server/Store/Conditions/DonationTierLockCondition.cs create mode 100644 Content.Server/White/MeatyOre/MeatyOreStoreSystem.cs create mode 100644 Content.Shared/White/MeatyOre/SharedMeatyOre.cs create mode 100644 Resources/Prototypes/Catalog/MeatyOrePanel/meatyore_catalog.yml create mode 100644 Resources/Prototypes/Store/meatyore_store_caterogires.yml create mode 100644 Resources/Prototypes/Store/meatyore_store_presset.yml create mode 100644 Resources/Textures/Interface/meatyore-shop-icon.png diff --git a/Content.Client/Store/Ui/StoreMenu.xaml.cs b/Content.Client/Store/Ui/StoreMenu.xaml.cs index d938dbfe54..835e2c93eb 100644 --- a/Content.Client/Store/Ui/StoreMenu.xaml.cs +++ b/Content.Client/Store/Ui/StoreMenu.xaml.cs @@ -71,7 +71,7 @@ public sealed partial class StoreMenu : DefaultWindow disabled = false; } - WithdrawButton.Disabled = disabled; + WithdrawButton.Visible = !disabled; } public void UpdateListing(List listings) diff --git a/Content.Client/UserInterface/Systems/MenuBar/GameTopMenuBarUIController.cs b/Content.Client/UserInterface/Systems/MenuBar/GameTopMenuBarUIController.cs index 07c0ab6b77..426499f545 100644 --- a/Content.Client/UserInterface/Systems/MenuBar/GameTopMenuBarUIController.cs +++ b/Content.Client/UserInterface/Systems/MenuBar/GameTopMenuBarUIController.cs @@ -9,6 +9,7 @@ using Content.Client.UserInterface.Systems.Gameplay; using Content.Client.UserInterface.Systems.Guidebook; using Content.Client.UserInterface.Systems.MenuBar.Widgets; using Content.Client.UserInterface.Systems.Sandbox; +using Content.Client.White.MeatyOre; using Robust.Client.UserInterface.Controllers; namespace Content.Client.UserInterface.Systems.MenuBar; @@ -24,6 +25,8 @@ public sealed class GameTopMenuBarUIController : UIController [Dependency] private readonly SandboxUIController _sandbox = default!; [Dependency] private readonly GuidebookUIController _guidebook = default!; [Dependency] private readonly EmotionsUIController _emotions = default!; + [Dependency] private readonly MeatyOreUIController _meatyOreUIController = default!; + private GameTopMenuBar? GameTopMenuBar => UIManager.GetActiveUIWidgetOrNull(); @@ -47,6 +50,7 @@ public sealed class GameTopMenuBarUIController : UIController _action.UnloadButton(); _sandbox.UnloadButton(); _emotions.UnloadButton(); + _meatyOreUIController.UnloadButton(); } public void LoadButtons() @@ -60,5 +64,6 @@ public sealed class GameTopMenuBarUIController : UIController _action.LoadButton(); _sandbox.LoadButton(); _emotions.LoadButton(); + _meatyOreUIController.LoadButton(); } } diff --git a/Content.Client/UserInterface/Systems/MenuBar/Widgets/GameTopMenuBar.xaml b/Content.Client/UserInterface/Systems/MenuBar/Widgets/GameTopMenuBar.xaml index 814b92805d..38c8b07986 100644 --- a/Content.Client/UserInterface/Systems/MenuBar/Widgets/GameTopMenuBar.xaml +++ b/Content.Client/UserInterface/Systems/MenuBar/Widgets/GameTopMenuBar.xaml @@ -93,6 +93,16 @@ HorizontalExpand="True" AppendStyleClass="{x:Static style:StyleBase.ButtonSquare}" /> + UIManager.GetActiveUIWidgetOrNull()?.MeatyOreButton; + public void LoadButton() + { + MeatyOreButton!.OnPressed += MeatyOreButtonPressed; + _buttonLoaded = true; + } + + public void UnloadButton() + { + MeatyOreButton!.OnPressed -= MeatyOreButtonPressed; + _buttonLoaded = false; + } + + private void MeatyOreButtonPressed(BaseButton.ButtonEventArgs obj) + { + _entityNetworkManager.SendSystemNetworkMessage(new MeatyOreShopRequestEvent()); + } + + public override void FrameUpdate(FrameEventArgs args) + { + base.FrameUpdate(args); + + if(!_buttonLoaded) return; + var shouldBeVisible = CheckButtonVisibility(); + MeatyOreButton!.Visible = shouldBeVisible; + } + + + private bool CheckButtonVisibility() + { + if(!_sponsorsManager.TryGetInfo(out var sponsor)) return false; + if(sponsor?.Tier == null || sponsor?.MeatyOreCoin == 0) return false; + + var controlledEntity = _playerManager!.LocalPlayer!.ControlledEntity; + if(controlledEntity == null) return false; + + if (!_entityManager.HasComponent(controlledEntity)) return false; + + return true; + } +} diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs b/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs index 3009610455..5a436d390a 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs @@ -31,7 +31,7 @@ public sealed partial class AdminVerbSystem var player = actor.PlayerSession; - if (!_adminManager.HasAdminFlag(player, AdminFlags.MeatyOre) && !_adminManager.HasAdminFlag(player, AdminFlags.Fun)) + if (!_adminManager.HasAdminFlag(player, AdminFlags.Fun)) return; if (!TryComp(args.Target, out var targetMindComp)) diff --git a/Content.Server/Store/Conditions/BuyerBlockForAntagCondition.cs b/Content.Server/Store/Conditions/BuyerBlockForAntagCondition.cs new file mode 100644 index 0000000000..204fbb3b87 --- /dev/null +++ b/Content.Server/Store/Conditions/BuyerBlockForAntagCondition.cs @@ -0,0 +1,24 @@ +using Content.Server.Mind.Components; +using Content.Server.Traitor; +using Content.Shared.Store; + +namespace Content.Server.Store.Conditions; + +public sealed class BuyerBlockForAntagCondition : ListingCondition +{ + public override bool Condition(ListingConditionArgs args) + { + var ent = args.EntityManager; + + if (!ent.TryGetComponent(args.Buyer, out var mind) || mind.Mind == null) + return false; + + foreach (var role in mind.Mind.AllRoles) + { + if (role is TraitorRole traitorRole) + return false; + } + + return true; + } +} diff --git a/Content.Server/Store/Conditions/BuyerBlockForMindProtected.cs b/Content.Server/Store/Conditions/BuyerBlockForMindProtected.cs new file mode 100644 index 0000000000..b364cf56dc --- /dev/null +++ b/Content.Server/Store/Conditions/BuyerBlockForMindProtected.cs @@ -0,0 +1,21 @@ +using Content.Server.Mind.Components; +using Content.Shared.Store; + +namespace Content.Server.Store.Conditions; + +public sealed class BuyerBlockForMindProtected : ListingCondition +{ + public override bool Condition(ListingConditionArgs args) + { + var buyer = args.Buyer; + var ent = args.EntityManager; + + if (!ent.TryGetComponent(buyer, out var mind) || mind.Mind == null) + return false; + + if (mind.Mind.CurrentJob?.CanBeAntag != true) + return false; + + return true; + } +} diff --git a/Content.Server/Store/Conditions/DonationTierLockCondition.cs b/Content.Server/Store/Conditions/DonationTierLockCondition.cs new file mode 100644 index 0000000000..828eb74973 --- /dev/null +++ b/Content.Server/Store/Conditions/DonationTierLockCondition.cs @@ -0,0 +1,24 @@ +using Content.Server.White.Sponsors; +using Content.Shared.Store; +using Robust.Server.GameObjects; + +namespace Content.Server.Store.Conditions; + +public sealed class DonationTierLockCondition : ListingCondition +{ + [DataField("tier", required: true)] + public int Tier; + public override bool Condition(ListingConditionArgs args) + { + var entityManager = args.EntityManager; + var sponsorsManager = IoCManager.Resolve(); + + if(!entityManager.TryGetComponent(args.Buyer, out var actor)) return false; + + if(!sponsorsManager.TryGetInfo(actor.PlayerSession.UserId, out var sponsorInfo)) return false; + + if (sponsorInfo.Tier < Tier) return false; + + return true; + } +} diff --git a/Content.Server/Store/Systems/StoreSystem.Ui.cs b/Content.Server/Store/Systems/StoreSystem.Ui.cs index 32c9a05043..68e5273fa3 100644 --- a/Content.Server/Store/Systems/StoreSystem.Ui.cs +++ b/Content.Server/Store/Systems/StoreSystem.Ui.cs @@ -173,7 +173,7 @@ public sealed partial class StoreSystem //broadcast event if (listing.ProductEvent != null) { - RaiseLocalEvent(listing.ProductEvent); + RaiseLocalEvent(buyer, listing.ProductEvent); } //log dat shit. @@ -226,4 +226,12 @@ public sealed partial class StoreSystem component.Balance[msg.Currency] -= msg.Amount; UpdateUserInterface(buyer, uid, component); } + + public void CloseUi(EntityUid user, StoreComponent component) + { + if (!TryComp(user, out var actor)) + return; + + _ui.TryClose(component.Owner, StoreUiKey.Key, actor.PlayerSession); + } } diff --git a/Content.Server/White/MeatyOre/MeatyOreStoreSystem.cs b/Content.Server/White/MeatyOre/MeatyOreStoreSystem.cs new file mode 100644 index 0000000000..e04227cb94 --- /dev/null +++ b/Content.Server/White/MeatyOre/MeatyOreStoreSystem.cs @@ -0,0 +1,197 @@ +using System.Linq; +using Content.Server.Actions; +using Content.Server.Administration.Managers; +using Content.Server.Chat.Managers; +using Content.Server.GameTicking.Rules; +using Content.Server.Mind.Components; +using Content.Server.Store.Components; +using Content.Server.Store.Systems; +using Content.Server.White.Sponsors; +using Content.Shared.Actions.ActionTypes; +using Content.Shared.Administration; +using Content.Shared.CCVar; +using Content.Shared.FixedPoint; +using Content.Shared.GameTicking; +using Content.Shared.Humanoid; +using Content.Shared.Mobs; +using Content.Shared.Mobs.Components; +using Content.Shared.Nuke; +using Content.Shared.Verbs; +using Content.Shared.White; +using Content.Shared.White.MeatyOre; +using Content.Shared.White.Sponsors; +using Robust.Server.GameObjects; +using Robust.Server.GameStates; +using Robust.Server.Player; +using Robust.Shared.Configuration; +using Robust.Shared.Enums; +using Robust.Shared.Map; +using Robust.Shared.Network; +using Robust.Shared.Players; +using Robust.Shared.Random; +using Robust.Shared.Utility; + +namespace Content.Server.White; + +public sealed class MeatyOreStoreSystem : EntitySystem +{ + [Dependency] private readonly IPlayerManager _playerManager = default!; + [Dependency] private readonly StoreSystem _storeSystem = default!; + [Dependency] private readonly IAdminManager _adminManager = default!; + [Dependency] private readonly IEntityManager _entityManager = default!; + [Dependency] private readonly TraitorRuleSystem _traitorRuleSystem = default!; + [Dependency] private readonly IConfigurationManager _configurationManager = default!; + [Dependency] private readonly IChatManager _chatManager = default!; + [Dependency] private readonly SponsorsManager _sponsorsManager = default!; + [Dependency] private readonly IRobustRandom _robustRandom = default!; + [Dependency] private readonly PVSOverrideSystem _pvsOverrideSystem = default!; + + + private static readonly string StorePresetPrototype = "StorePresetMeatyOre"; + private static readonly string MeatyOreCurrensyPrototype = "MeatyOreCoin"; + private static bool MeatyOrePanelEnabled; + + + private readonly Dictionary _meatyOreStores = new(); + public override void Initialize() + { + base.Initialize(); + + _configurationManager.OnValueChanged(WhiteCVars.MeatyOrePanelEnabled, OnPanelEnableChanged, true); + + SubscribeLocalEvent(OnPostRoundCleanup); + SubscribeNetworkEvent(OnShopRequested); + SubscribeLocalEvent(OnAntagPurchase); + SubscribeLocalEvent>(MeatyOreVerbs); + + } + + private void MeatyOreVerbs(GetVerbsEvent ev) + { + if(ev.User == ev.Target) return; + if(!EntityManager.TryGetComponent(ev.User, out var actorComponent)) return; + if(!_sponsorsManager.TryGetInfo(actorComponent.PlayerSession.UserId, out _)) return; + if(!HasComp(ev.Target)) return; + if(!TryComp(ev.Target, out var state) || state?.CurrentState != MobState.Alive) return; + if(!TryGetStore(actorComponent.PlayerSession, out var store)) return; + + if(!TryComp(ev.Target, out var targetMind) || !targetMind.HasMind) return; + if (targetMind!.Mind!.AllRoles.Any(x => x.Antagonist)) return; + + if(targetMind.Mind.CurrentJob?.CanBeAntag != true) return; + if(targetMind.Mind.Session == null) return; + + if (!store.Balance.TryGetValue("MeatyOreCoin", out var currency)) return; + + if(currency - 10 < 0) return; + + var verb = new Verb() + { + Text = $"Выдать роль.", + ConfirmationPopup = true, + Message = $"Цена - {MeatyOreCurrensyPrototype}:10", + Act = () => + { + _storeSystem.TryAddCurrency(new Dictionary {{MeatyOreCurrensyPrototype, -10}}, store.Owner, store); + _traitorRuleSystem.MakeTraitor(targetMind.Mind.Session); + }, + Category = VerbCategory.MeatyOre + }; + + ev.Verbs.Add(verb); + + } + + private void OnPanelEnableChanged(bool newValue) + { + if (newValue != true) + { + foreach (var meatyOreStoreData in _meatyOreStores) + { + var session = _playerManager.GetSessionByUserId(meatyOreStoreData.Key); + if(session == null) continue; + var playerEntity = session.AttachedEntity; + if(!playerEntity.HasValue) continue; + + _storeSystem.CloseUi(playerEntity.Value, meatyOreStoreData.Value); + } + } + MeatyOrePanelEnabled = newValue; + } + + + private void OnAntagPurchase(EntityUid uid, MindComponent component, MeatyTraitorRequestActionEvent args) + { + if(component.Mind == null) return; + if(component.Mind.Session == null) return; + + _traitorRuleSystem.MakeTraitor(component.Mind?.Session!); + } + + private void OnShopRequested(MeatyOreShopRequestEvent msg, EntitySessionEventArgs args) + { + + var playerSession = args.SenderSession as IPlayerSession; + + if (!MeatyOrePanelEnabled) + { + _chatManager.DispatchServerMessage(playerSession!, "Мясная панель отключена на данном сервере! Приятной игры!"); + return; + } + + var playerEntity = args.SenderSession.AttachedEntity; + + if(!playerEntity.HasValue) return; + if(!HasComp(playerEntity.Value)) return; + if(!TryGetStore(playerSession!, out var storeComponent)) return; + + _pvsOverrideSystem.AddSessionOverride(storeComponent.Owner, playerSession!); + _storeSystem.ToggleUi(playerEntity.Value, storeComponent.Owner, storeComponent); + } + + private bool TryGetStore(IPlayerSession session, out StoreComponent store) + { + store = null!; + + if (!_sponsorsManager.TryGetInfo(session.UserId, out var sponsorInfo)) + { + return false; + } + + if (_meatyOreStores.TryGetValue(session.UserId, out store!)) return true; + if (sponsorInfo.MeatyOreCoin == 0) return false; + + store = CreateStore(session.UserId, sponsorInfo.MeatyOreCoin); + return true; + } + + private void OnPostRoundCleanup(RoundRestartCleanupEvent ev) + { + foreach (var store in _meatyOreStores.Values) + { + Del(store.Owner); + } + + _meatyOreStores.Clear(); + } + + private StoreComponent CreateStore(NetUserId userId, int balance) + { + var session = _playerManager.GetSessionByUserId(userId); + var shopEntity = _entityManager.SpawnEntity("StoreMeatyOreEntity", MapCoordinates.Nullspace); + var storeComponent = Comp(shopEntity); + + _storeSystem.InitializeFromPreset("StorePresetMeatyOre", shopEntity, storeComponent); + storeComponent.Balance.Clear(); + + _storeSystem.TryAddCurrency(new Dictionary() { { MeatyOreCurrensyPrototype, balance } }, storeComponent.Owner, storeComponent); + _meatyOreStores[userId] = storeComponent; + _pvsOverrideSystem.AddSessionOverride(shopEntity, session); + + return storeComponent; + } + + + + +} diff --git a/Content.Shared/Interaction/SharedInteractionSystem.cs b/Content.Shared/Interaction/SharedInteractionSystem.cs index 75063c5550..7b2e790822 100644 --- a/Content.Shared/Interaction/SharedInteractionSystem.cs +++ b/Content.Shared/Interaction/SharedInteractionSystem.cs @@ -23,6 +23,8 @@ using Content.Shared.Tag; using Content.Shared.Timing; using Content.Shared.Verbs; using Content.Shared.Wall; +using Content.Shared.Weapons.Ranged.Components; +using Content.Shared.White.MeatyOre; using JetBrains.Annotations; using Robust.Shared.Containers; using Robust.Shared.Input; @@ -125,6 +127,11 @@ namespace Content.Shared.Interaction return; } + if (CompOrNull(ev.Target) != null) + { + return; + } + if (!InRangeUnobstructed(user, ev.Target)) { ev.Cancel(); diff --git a/Content.Shared/Store/ListingPrototype.cs b/Content.Shared/Store/ListingPrototype.cs index d80c5cf6c8..8ba0745b0a 100644 --- a/Content.Shared/Store/ListingPrototype.cs +++ b/Content.Shared/Store/ListingPrototype.cs @@ -104,8 +104,7 @@ public partial class ListingData : IEquatable, ICloneable Name != listing.Name || Description != listing.Description || ProductEntity != listing.ProductEntity || - ProductAction != listing.ProductAction || - ProductEvent != listing.ProductEvent) + ProductAction != listing.ProductAction) return false; if (Icon != null && !Icon.Equals(listing.Icon)) diff --git a/Content.Shared/Verbs/VerbCategory.cs b/Content.Shared/Verbs/VerbCategory.cs index d22041396f..269f5f7804 100644 --- a/Content.Shared/Verbs/VerbCategory.cs +++ b/Content.Shared/Verbs/VerbCategory.cs @@ -38,6 +38,9 @@ namespace Content.Shared.Verbs public static readonly VerbCategory Admin = new("verb-categories-admin", "/Textures/Interface/character.svg.192dpi.png"); + public static readonly VerbCategory MeatyOre = + new("MeatyOre", null); + public static readonly VerbCategory Antag = new("verb-categories-antag", "/Textures/Interface/VerbIcons/antag-e_sword-temp.192dpi.png", iconsOnly: true) { Columns = 5 }; diff --git a/Content.Shared/White/MeatyOre/SharedMeatyOre.cs b/Content.Shared/White/MeatyOre/SharedMeatyOre.cs new file mode 100644 index 0000000000..1265290a91 --- /dev/null +++ b/Content.Shared/White/MeatyOre/SharedMeatyOre.cs @@ -0,0 +1,23 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Serialization; +using Component = Robust.Shared.GameObjects.Component; + +namespace Content.Shared.White.MeatyOre; + + [Serializable, NetSerializable] + public sealed class MeatyOreShopRequestEvent : EntityEventArgs {} + +[Serializable, NetSerializable] +public sealed class MeatyTraitorRequestActionEvent +{ + public override bool Equals(object? obj) + { + return true; + } +} + +[NetworkedComponent, RegisterComponent] +public sealed class IgnorBUIInteractionRangeComponent : Component +{ + +} diff --git a/Content.Shared/White/Sponsors/MsgSponsorInfo.cs b/Content.Shared/White/Sponsors/MsgSponsorInfo.cs index b543ea068a..f197b3ecc8 100644 --- a/Content.Shared/White/Sponsors/MsgSponsorInfo.cs +++ b/Content.Shared/White/Sponsors/MsgSponsorInfo.cs @@ -24,6 +24,9 @@ public sealed class SponsorInfo [JsonPropertyName("extraSlots")] public int ExtraSlots { get; set; } + + [JsonPropertyName("MeatyOreCoin")] + public int MeatyOreCoin { get; set; } } /// diff --git a/Content.Shared/White/WhiteCVars.cs b/Content.Shared/White/WhiteCVars.cs index ef98b9078b..d1bb94e197 100644 --- a/Content.Shared/White/WhiteCVars.cs +++ b/Content.Shared/White/WhiteCVars.cs @@ -122,4 +122,22 @@ public sealed class WhiteCVars public static readonly CVarDef EmergencyShuttleCallEnabled = CVarDef.Create("shuttle.emergency_shuttle_call", true, CVar.SERVER | CVar.REPLICATED | CVar.ARCHIVE); + + + /* + * Xenophobia + */ + + public static readonly CVarDef FanaticXenophobiaEnabled = + CVarDef.Create("white.fanatic_xenophobia", true, CVar.SERVERONLY | CVar.ARCHIVE); + + /* + * MeatyOre + */ + + public static readonly CVarDef MeatyOrePanelEnabled = + CVarDef.Create("white.meatyore_panel_enabled", true, CVar.REPLICATED | CVar.SERVER | CVar.ARCHIVE); + + public static readonly CVarDef MeatyOreDefaultBalance = + CVarDef.Create("white.meatyore_default_balance", 15, CVar.SERVER | CVar.ARCHIVE); } diff --git a/Resources/Prototypes/Catalog/MeatyOrePanel/meatyore_catalog.yml b/Resources/Prototypes/Catalog/MeatyOrePanel/meatyore_catalog.yml new file mode 100644 index 0000000000..a355dff897 --- /dev/null +++ b/Resources/Prototypes/Catalog/MeatyOrePanel/meatyore_catalog.yml @@ -0,0 +1,1553 @@ +#hats + +- type: listing + id: MeatyClothingHeadHatBeaverHat + productEntity: ClothingHeadHatBeaverHat + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreHats + +- type: listing + id: MeatyClothingHeadHatBeret + productEntity: ClothingHeadHatBeret + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreHats + +- type: listing + id: MeatyClothingHeadHatBowlerHat + productEntity: ClothingHeadHatBowlerHat + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreHats + +- type: listing + id: MeatyClothingHeadHatCardborg + productEntity: ClothingHeadHatCardborg + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreHats + +- type: listing + id: MeatyClothingHeadHatCentcom + productEntity: ClothingHeadHatCentcom + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreHats + +- type: listing + id: MeatyClothingHeadHatChef + productEntity: ClothingHeadHatChef + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreHats + +- type: listing + id: MeatyClothingHeadHatFedoraBrown + productEntity: ClothingHeadHatFedoraBrown + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreHats + +- type: listing + id: MeatyClothingHeadHatFedoraGrey + productEntity: ClothingHeadHatFedoraGrey + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreHats + +- type: listing + id: MeatyClothingHeadHatFez + productEntity: ClothingHeadHatFez + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreHats + +- type: listing + id: MeatyClothingHeadHatOutlawHat + productEntity: ClothingHeadHatOutlawHat + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreHats + +- type: listing + id: MeatyClothingHeadHatWitch1 + productEntity: ClothingHeadHatWitch1 + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreHats + +- type: listing + id: MeatyClothingHeadHatRedwizard + productEntity: ClothingHeadHatRedwizard + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreHats + +- type: listing + id: MeatyClothingHeadHatSantahat + productEntity: ClothingHeadHatSantahat + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreHats + +- type: listing + id: MeatyClothingHeadHatSombrero + productEntity: ClothingHeadHatSombrero + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreHats + +- type: listing + id: MeatyClothingHeadHatTophat + productEntity: ClothingHeadHatTophat + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreHats + +- type: listing + id: MeatyClothingHeadHatUshanka + productEntity: ClothingHeadHatUshanka + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreHats + +- type: listing + id: MeatyClothingHeadHatWitch + productEntity: ClothingHeadHatWitch + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreHats + +- type: listing + id: MeatyClothingHeadHatWizardFake + productEntity: ClothingHeadHatWizardFake + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreHats + +- type: listing + id: MeatyClothingHeadHatTrucker + productEntity: ClothingHeadHatTrucker + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreHats + +- type: listing + id: MeatyClothingHeadPaperSack + productEntity: ClothingHeadPaperSack + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreHats + +- type: listing + id: MeatyClothingHeadPaperSackSmile + productEntity: ClothingHeadPaperSackSmile + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreHats + +- type: listing + id: MeatyClothingHeadFishCap + productEntity: ClothingHeadFishCap + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreHats + +- type: listing + id: MeatyClothingHeadRastaHat + productEntity: ClothingHeadRastaHat + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreHats + +- type: listing + id: MeatyClothingHeadSafari + productEntity: ClothingHeadSafari + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreHats + +- type: listing + id: MeatyClothingHeadHatJester + productEntity: ClothingHeadHatJester + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreHats + +#masks + +- type: listing + id: MeatyClothingMaskClown + productEntity: ClothingMaskClown + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreMasks + +- type: listing + id: MeatyClothingMaskJoy + productEntity: ClothingMaskJoy + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreMasks + +- type: listing + id: MeatyClothingMaskMime + productEntity: ClothingMaskMime + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreMasks + +- type: listing + id: MeatyClothingMaskSterile + productEntity: ClothingMaskSterile + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreMasks + +- type: listing + id: MeatyClothingMaskPlague + productEntity: ClothingMaskPlague + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreMasks + +#boots +- type: listing + id: MeatyClothingShoesBootsWork + productEntity: ClothingShoesBootsWork + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreBoots + +- type: listing + id: MeatyClothingShoesBootsJack + productEntity: ClothingShoesBootsJack + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreBoots + +- type: listing + id: MeatyClothingShoesBootsSalvage + productEntity: ClothingShoesBootsSalvage + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreBoots + +- type: listing + id: MeatyClothingShoesBootsPerformer + productEntity: ClothingShoesBootsPerformer + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreBoots + +- type: listing + id: MeatyClothingShoesBootsCombat + productEntity: ClothingShoesBootsCombat + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreBoots + +- type: listing + id: MeatyClothingShoesBootsLaceup + productEntity: ClothingShoesBootsLaceup + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreBoots + +- type: listing + id: MeatyClothingShoesColorBlack + productEntity: ClothingShoesColorBlack + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreBoots + +- type: listing + id: MeatyClothingShoesColorBlue + productEntity: ClothingShoesColorBlue + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreBoots + +- type: listing + id: MeatyClothingShoesColorBrown + productEntity: ClothingShoesColorBrown + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreBoots + +- type: listing + id: MeatyClothingShoesColorGreen + productEntity: ClothingShoesColorGreen + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreBoots + +- type: listing + id: MeatyClothingShoesColorOrange + productEntity: ClothingShoesColorOrange + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreBoots + +- type: listing + id: MeatyClothingShoesColorPurple + productEntity: ClothingShoesColorPurple + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreBoots + +- type: listing + id: MeatyClothingShoesColorRed + productEntity: ClothingShoesColorRed + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreBoots + +- type: listing + id: MeatyClothingShoesColorWhite + productEntity: ClothingShoesColorWhite + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreBoots + +- type: listing + id: MeatyClothingShoesColorYellow + productEntity: ClothingShoesColorYellow + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreBoots + +- type: listing + id: MeatyClothingShoesFlippers + productEntity: ClothingShoesFlippers + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreBoots + +- type: listing + id: MeatyClothingShoesSlippers + productEntity: ClothingShoesSlippers + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreBoots + +- type: listing + id: MeatyClothingShoeSlippersDuck + productEntity: ClothingShoeSlippersDuck + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreBoots + +- type: listing + id: MeatyClothingShoesTourist + productEntity: ClothingShoesTourist + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreBoots + +- type: listing + id: MeatyClothingShoesBling + productEntity: ClothingShoesBling + cost: + MeatyOreCoin: 5 + categories: + - MeatyOreBoots + +- type: listing + id: MeatyClothingShoesCult + productEntity: ClothingShoesCult + cost: + MeatyOreCoin: 2 + categories: + - MeatyOreBoots + +- type: listing + id: MeatyClothingShoesGaloshes + productEntity: ClothingShoesGaloshes + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreBoots + +- type: listing + id: MeatyClothingShoesSwat + productEntity: ClothingShoesSwat + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreBoots + +- type: listing + id: MeatyClothingShoesWizard + productEntity: ClothingShoesWizard + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreBoots + +- type: listing + id: MeatyClothingShoesJester + productEntity: ClothingShoesJester + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreBoots + + +#glasses + +- type: listing + id: MeatyClothingEyesGlassesBeer + productEntity: ClothingEyesGlassesBeer + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreGlasses + +- type: listing + id: MeatyClothingEyesGlasses + productEntity: ClothingEyesGlasses + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreGlasses + +- type: listing + id: MeatyClothingEyesEyepatch + productEntity: ClothingEyesEyepatch + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreGlasses + +- type: listing + id: MeatyClothingEyesBlindfold + productEntity: ClothingEyesBlindfold + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreGlasses + +#personal +- type: listing + id: MeatyClothingNeckLGBTPin + productEntity: ClothingNeckLGBTPin + cost: + MeatyOreCoin: 1 + categories: + - MeatyOrePersonal + +- type: listing + id: MeatyClothingNeckAromanticPin + productEntity: ClothingNeckAromanticPin + cost: + MeatyOreCoin: 1 + categories: + - MeatyOrePersonal + +- type: listing + id: MeatyClothingNeckAsexualPin + productEntity: ClothingNeckAsexualPin + cost: + MeatyOreCoin: 1 + categories: + - MeatyOrePersonal + +- type: listing + id: MeatyClothingNeckBisexualPin + productEntity: ClothingNeckBisexualPin + cost: + MeatyOreCoin: 1 + categories: + - MeatyOrePersonal + +- type: listing + id: MeatyClothingNeckIntersexPin + productEntity: ClothingNeckIntersexPin + cost: + MeatyOreCoin: 1 + categories: + - MeatyOrePersonal + +- type: listing + id: MeatyClothingNeckLesbianPin + productEntity: ClothingNeckLesbianPin + cost: + MeatyOreCoin: 1 + categories: + - MeatyOrePersonal + +- type: listing + id: MeatyClothingNeckNonBinaryPin + productEntity: ClothingNeckNonBinaryPin + cost: + MeatyOreCoin: 1 + categories: + - MeatyOrePersonal + +- type: listing + id: MeatyClothingNeckPansexualPin + productEntity: ClothingNeckPansexualPin + cost: + MeatyOreCoin: 1 + categories: + - MeatyOrePersonal + +- type: listing + id: MeatyClothingNeckTransPin + productEntity: ClothingNeckTransPin + cost: + MeatyOreCoin: 1 + categories: + - MeatyOrePersonal + +- type: listing + id: MeatyClothingNeckCloakHerald + productEntity: ClothingNeckCloakHerald + cost: + MeatyOreCoin: 1 + categories: + - MeatyOrePersonal + +- type: listing + id: MeatyClothingNeckCloakNanotrasen + productEntity: ClothingNeckCloakNanotrasen + cost: + MeatyOreCoin: 1 + categories: + - MeatyOrePersonal + +- type: listing + id: MeatyClothingNeckCloakTrans + productEntity: ClothingNeckCloakTrans + cost: + MeatyOreCoin: 1 + categories: + - MeatyOrePersonal + +#suits + +#uniforms + +- type: listing + id: MeatyUniformShortsRed + productEntity: UniformShortsRed + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyOreClothingUniformJumpskirtJanimaid + productEntity: ClothingUniformJumpskirtJanimaid + cost: + MeatyOreCoin: 2 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyUniformShortsRedWithTop + productEntity: UniformShortsRedWithTop + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyClothingUniformJumpsuitAncient + productEntity: ClothingUniformJumpsuitAncient + cost: + MeatyOreCoin: 2 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyClothingUniformJumpsuitCentcomOfficial + productEntity: ClothingUniformJumpsuitCentcomOfficial + cost: + MeatyOreCoin: 5 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyClothingUniformJumpsuitClown + productEntity: ClothingUniformJumpsuitClown + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyClothingUniformJumpsuitJester + productEntity: ClothingUniformJumpsuitJester + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyClothingUniformJumpsuitDetective + productEntity: ClothingUniformJumpsuitDetective + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyClothingUniformJumpsuitDetectiveGrey + productEntity: ClothingUniformJumpsuitDetectiveGrey + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyClothingUniformJumpsuitMime + productEntity: ClothingUniformJumpsuitMime + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyClothingUniformJumpsuitPrisoner + productEntity: ClothingUniformJumpsuitPrisoner + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyClothingUniformJumpsuitColorGrey + productEntity: ClothingUniformJumpsuitColorGrey + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyClothingUniformJumpsuitColorBlack + productEntity: ClothingUniformJumpsuitColorBlack + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyClothingUniformJumpsuitColorBlue + productEntity: ClothingUniformJumpsuitColorBlue + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyClothingUniformJumpsuitColorGreen + productEntity: ClothingUniformJumpsuitColorGreen + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyClothingUniformJumpsuitColorOrange + productEntity: ClothingUniformJumpsuitColorOrange + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyClothingUniformJumpsuitColorPink + productEntity: ClothingUniformJumpsuitColorPink + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyClothingUniformJumpsuitColorRed + productEntity: ClothingUniformJumpsuitColorRed + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyClothingUniformJumpsuitColorWhite + productEntity: ClothingUniformJumpsuitColorWhite + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyClothingUniformJumpsuitColorYellow + productEntity: ClothingUniformJumpsuitColorYellow + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyClothingUniformJumpsuitColorDarkBlue + productEntity: ClothingUniformJumpsuitColorDarkBlue + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyClothingUniformJumpsuitColorTeal + productEntity: ClothingUniformJumpsuitColorTeal + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyClothingUniformJumpsuitColorPurple + productEntity: ClothingUniformJumpsuitColorPurple + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyClothingUniformJumpsuitColorDarkGreen + productEntity: ClothingUniformJumpsuitColorDarkGreen + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyClothingUniformJumpsuitColorLightBrown + productEntity: ClothingUniformJumpsuitColorLightBrown + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyClothingUniformJumpsuitColorBrown + productEntity: ClothingUniformJumpsuitColorBrown + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyClothingUniformJumpsuitColorMaroon + productEntity: ClothingUniformJumpsuitColorMaroon + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyClothingUniformColorRainbow + productEntity: ClothingUniformColorRainbow + cost: + MeatyOreCoin: 5 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyClothingUniformOveralls + productEntity: ClothingUniformOveralls + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyClothingUniformJumpsuitPyjamaSyndicateBlack + productEntity: ClothingUniformJumpsuitPyjamaSyndicateBlack + cost: + MeatyOreCoin: 5 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyClothingUniformJumpsuitPyjamaSyndicatePink + productEntity: ClothingUniformJumpsuitPyjamaSyndicatePink + cost: + MeatyOreCoin: 5 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyClothingUniformJumpsuitPyjamaSyndicateRed + productEntity: ClothingUniformJumpsuitPyjamaSyndicateRed + cost: + MeatyOreCoin: 5 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyClothingUniformJumpsuitNanotrasen + productEntity: ClothingUniformJumpsuitNanotrasen + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyClothingUniformJumpsuitCentcomFormal + productEntity: ClothingUniformJumpsuitCentcomFormal + cost: + MeatyOreCoin: 5 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyClothingUniformJumpsuitSafari + productEntity: ClothingUniformJumpsuitSafari + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyClothingUniformJumpsuitMonasticRobeDark + productEntity: ClothingUniformJumpsuitMonasticRobeDark + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreUniforms + +- type: listing + id: MeatyClothingUniformJumpsuitMonasticRobeLight + productEntity: ClothingUniformJumpsuitMonasticRobeLight + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreUniforms + +#gloves +- type: listing + id: MeatyClothingHandsGlovesIhscombat + productEntity: ClothingHandsGlovesIhscombat + cost: + MeatyOreCoin: 2 + categories: + - MeatyOreGloves + +- type: listing + id: MeatyClothingHandsGlovesLatex + productEntity: ClothingHandsGlovesLatex + cost: + MeatyOreCoin: 2 + categories: + - MeatyOreGloves + +- type: listing + id: MeatyClothingHandsGlovesLeather + productEntity: ClothingHandsGlovesLeather + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreGloves + +- type: listing + id: MeatyClothingHandsGlovesPowerglove + productEntity: ClothingHandsGlovesPowerglove + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreGloves + +- type: listing + id: MeatyClothingHandsGlovesRobohands + productEntity: ClothingHandsGlovesRobohands + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreGloves + +- type: listing + id: MeatyClothingHandsGlovesFingerless + productEntity: ClothingHandsGlovesFingerless + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreGloves + +- type: listing + id: MeatyClothingHandsGlovesColorPurple + productEntity: ClothingHandsGlovesColorPurple + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreGloves + +- type: listing + id: MeatyClothingHandsGlovesColorRed + productEntity: ClothingHandsGlovesColorRed + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreGloves + +- type: listing + id: MeatyClothingHandsGlovesColorBlack + productEntity: ClothingHandsGlovesColorBlack + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreGloves + +- type: listing + id: MeatyClothingHandsGlovesColorBlue + productEntity: ClothingHandsGlovesColorBlue + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreGloves + +- type: listing + id: MeatyClothingHandsGlovesColorBrown + productEntity: ClothingHandsGlovesColorBrown + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreGloves + +- type: listing + id: MeatyClothingHandsGlovesColorGray + productEntity: ClothingHandsGlovesColorGray + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreGloves + +- type: listing + id: MeatyClothingHandsGlovesColorGreen + productEntity: ClothingHandsGlovesColorGreen + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreGloves + +- type: listing + id: MeatyClothingHandsGlovesColorLightBrown + productEntity: ClothingHandsGlovesColorLightBrown + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreGloves + +- type: listing + id: MeatyClothingHandsGlovesColorOrange + productEntity: ClothingHandsGlovesColorOrange + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreGloves + +- type: listing + id: MeatyClothingHandsGlovesColorWhite + productEntity: ClothingHandsGlovesColorWhite + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreGloves + +- type: listing + id: MeatyClothingHandsGlovesColorYellow + productEntity: ClothingHandsGlovesColorWhite + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreGloves + +#cloacks +- type: listing + id: MeatyClothingOuterCoatBomber + productEntity: ClothingOuterCoatBomber + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreCloaks + +- type: listing + id: MeatyClothingOuterCoatGentle + productEntity: ClothingOuterCoatGentle + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreCloaks + +- type: listing + id: MeatyClothingOuterCoatInspector + productEntity: ClothingOuterCoatInspector + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreCloaks + +- type: listing + id: MeatyClothingOuterCoatJensen + productEntity: ClothingOuterCoatJensen + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreCloaks + +- type: listing + id: MeatyClothingOuterCoatLab + productEntity: ClothingOuterCoatLab + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreCloaks + +- type: listing + id: MeatyClothingOuterCoatPirate + productEntity: ClothingOuterCoatPirate + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreCloaks + +- type: listing + id: MeatyClothingOuterHoodieBlack + productEntity: ClothingOuterHoodieBlack + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreCloaks + +- type: listing + id: MeatyClothingOuterHoodieGrey + productEntity: ClothingOuterHoodieGrey + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreCloaks + +- type: listing + id: MeatyClothingOuterCardborg + productEntity: ClothingOuterCardborg + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreCloaks + +- type: listing + id: MeatyClothingOuterHoodieChaplain + productEntity: ClothingOuterHoodieChaplain + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreCloaks + +- type: listing + id: MeatyClothingOuterPonchoClassic + productEntity: ClothingOuterPonchoClassic + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreCloaks + +- type: listing + id: MeatyClothingOuterPoncho + productEntity: ClothingOuterPoncho + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreCloaks + +- type: listing + id: MeatyClothingOuterSanta + productEntity: ClothingOuterSanta + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreCloaks + +- type: listing + id: MeatyClothingOuterStraightjacket + productEntity: ClothingOuterStraightjacket + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreCloaks + +- type: listing + id: MeatyClothingOuterWizardViolet + productEntity: ClothingOuterWizardViolet + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreCloaks + +- type: listing + id: MeatyClothingOuterWizard + productEntity: ClothingOuterWizard + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreCloaks + +- type: listing + id: MeatyClothingOuterWizardRed + productEntity: ClothingOuterWizardRed + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreCloaks + +- type: listing + id: MeatyClothingOuterSkub + productEntity: ClothingOuterSkub + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreCloaks + +- type: listing + id: MeatyClothingOuterPlagueSuit + productEntity: ClothingOuterPlagueSuit + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreCloaks + +- type: listing + id: MeatyClothingOuterNunRobe + productEntity: ClothingOuterNunRobe + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreCloaks + +- type: listing + id: MeatyClothingOuterGhostSheet + productEntity: ClothingOuterGhostSheet + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreCloaks + +#toys +- type: listing + id: MeatyPlushieBee + productEntity: PlushieBee + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreToys + +- type: listing + id: MeatyPlushieRGBee + productEntity: PlushieRGBee + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreToys + +- type: listing + id: MeatyPlushieNuke + productEntity: PlushieNuke + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreToys + +- type: listing + id: MeatyPlushieRouny + productEntity: PlushieRouny + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreToys + +- type: listing + id: MeatyPlushieLamp + productEntity: PlushieLamp + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreToys + +- type: listing + id: MeatyPlushieLizard + productEntity: PlushieLizard + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreToys + +- type: listing + id: MeatyPlushieSpaceLizard + productEntity: PlushieSpaceLizard + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreToys + +- type: listing + id: MeatyPlushieSharkPink + productEntity: PlushieSharkPink + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreToys + +- type: listing + id: MeatyPlushieSharkBlue + productEntity: PlushieSharkBlue + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreToys + +- type: listing + id: MeatyPlushieRatvar + productEntity: PlushieRatvar + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreToys + +- type: listing + id: MeatyPlushieNar + productEntity: PlushieNar + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreToys + +- type: listing + id: MeatyPlushieCarp + productEntity: PlushieCarp + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreToys + +- type: listing + id: MeatyPlushieSlime + productEntity: PlushieSlime + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreToys + +- type: listing + id: MeatyPlushieSnake + productEntity: PlushieSnake + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreToys + +- type: listing + id: MeatyToyMouse + productEntity: ToyMouse + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreToys + +- type: listing + id: MeatyToyRubberDuck + productEntity: ToyRubberDuck + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreToys + +- type: listing + id: MeatyPlushieVox + productEntity: PlushieVox + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreToys + +- type: listing + id: MeatyToyAi + productEntity: ToyAi + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreToys + +- type: listing + id: MeatyToyNuke + productEntity: ToyNuke + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreToys + +- type: listing + id: MeatyToyAssistant + productEntity: ToyAssistant + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreToys + +- type: listing + id: MeatyToyGriffin + productEntity: ToyGriffin + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreToys + +- type: listing + id: MeatyToyHonk + productEntity: ToyHonk + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreToys + +- type: listing + id: MeatyToyIan + productEntity: ToyIan + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreToys + +- type: listing + id: MeatyToyMarauder + productEntity: ToyMarauder + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreToys + +- type: listing + id: MeatyToyMauler + productEntity: ToyMauler + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreToys + +- type: listing + id: MeatyToyGygax + productEntity: ToyGygax + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreToys + +- type: listing + id: MeatyToyOwlman + productEntity: ToyOwlman + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreToys + +- type: listing + id: MeatyToyDeathRipley + productEntity: ToyDeathRipley + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreToys + +- type: listing + id: MeatyToyRipley + productEntity: ToyRipley + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreToys + +- type: listing + id: MeatyBasketball + productEntity: Basketball + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreToys + +- type: listing + id: MeatyFoamBlade + productEntity: FoamBlade + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreToys + +- type: listing + id: MeatyFootball + productEntity: Football + cost: + MeatyOreCoin: 1 + categories: + - MeatyOreToys + +- type: listing + id: MeatyBalloonSyn + productEntity: BalloonSyn + cost: + MeatyOreCoin: 2 + categories: + - MeatyOreToys + +- type: listing + id: MeatyBalloonCorgi + productEntity: BalloonCorgi + cost: + MeatyOreCoin: 2 + categories: + - MeatyOreToys + +- type: listing + id: MeatySingularityToy + productEntity: SingularityToy + cost: + MeatyOreCoin: 20 + categories: + - MeatyOreToys + +- type: listing + id: MeatyPonderingOrb + productEntity: PonderingOrb + cost: + MeatyOreCoin: 2 + categories: + - MeatyOreToys + +- type: listing + id: MeatyToySword + productEntity: ToySword + cost: + MeatyOreCoin: 2 + categories: + - MeatyOreToys + +- type: listing + id: MeatyToyAmongPequeno + productEntity: ToyAmongPequeno + cost: + MeatyOreCoin: 2 + categories: + - MeatyOreToys + +# ANTAG + +- type: listing + id: MeatyBecomeTraitor + name: Антажка + description: Выдать себе антажку + productEvent: !type:MeatyTraitorRequestActionEvent + cost: + MeatyOreCoin: 10 + categories: + - MeatyOreAntag + conditions: + - !type:BuyerBlockForAntagCondition + - !type:BuyerBlockForMindProtected + + +# Special + +- type: listing + id: MeatyClothingHeadHatCatEars + productEntity: ClothingHeadHatCatEars + cost: + MeatyOreCoin: 5 + categories: + - MeatyOreSpecial + +#Dj +- type: listing + id: DjJukebox + productEntity: Jukebox + cost: + MeatyOreCoin: 0 + categories: + - DjJukeboxCategory + conditions: + - !type:ListingLimitedStockCondition + stock: 1 + - !type:DonationTierLockCondition + tier: 5 + +- type: listing + id: DjTapeRecorder + productEntity: TapeRecorder + cost: + MeatyOreCoin: 0 + categories: + - DjJukeboxCategory + conditions: + - !type:ListingLimitedStockCondition + stock: 1 + - !type:DonationTierLockCondition + tier: 5 + +- type: listing + id: DjTape + productEntity: TapeEmpty + cost: + MeatyOreCoin: 0 + categories: + - DjJukeboxCategory + conditions: + - !type:ListingLimitedStockCondition + stock: 3 + - !type:DonationTierLockCondition + tier: 5 diff --git a/Resources/Prototypes/Store/currency.yml b/Resources/Prototypes/Store/currency.yml index 91039a75e6..707e9899d9 100644 --- a/Resources/Prototypes/Store/currency.yml +++ b/Resources/Prototypes/Store/currency.yml @@ -1,7 +1,7 @@ - type: currency id: Telecrystal displayName: store-currency-display-telecrystal - cash: + cash: 1: Telecrystal1 canWithdraw: true @@ -10,7 +10,12 @@ displayName: store-currency-display-stolen-essence canWithdraw: false +- type: currency + id: MeatyOreCoin + displayName: Meaty Ore Coin + canWithdraw: false + #debug - type: currency id: DebugDollar - displayName: store-currency-display-debugdollar \ No newline at end of file + displayName: store-currency-display-debugdollar diff --git a/Resources/Prototypes/Store/meatyore_store_caterogires.yml b/Resources/Prototypes/Store/meatyore_store_caterogires.yml new file mode 100644 index 0000000000..b6144af19c --- /dev/null +++ b/Resources/Prototypes/Store/meatyore_store_caterogires.yml @@ -0,0 +1,51 @@ +- type: storeCategory + id: MeatyOreHats + name: meatyore-store-category-hats + +- type: storeCategory + id: MeatyOreMasks + name: meatyore-store-category-masks + +- type: storeCategory + id: MeatyOreBoots + name: meatyore-store-category-boots + +- type: storeCategory + id: MeatyOreGlasses + name: meatyore-store-category-glasses + +- type: storeCategory + id: MeatyOrePersonal + name: meatyore-store-category-personal + +- type: storeCategory + id: MeatyOreSuits + name: meatyore-store-category-suits + +- type: storeCategory + id: MeatyOreUniforms + name: meatyore-store-category-uniforms + +- type: storeCategory + id: MeatyOreGloves + name: meatyore-store-category-gloves + +- type: storeCategory + id: MeatyOreCloaks + name: meatyore-store-category-cloaks + +- type: storeCategory + id: MeatyOreToys + name: meatyore-store-category-toys + +- type: storeCategory + id: MeatyOreSpecial + name: meatyore-store-category-special + +- type: storeCategory + id: MeatyOreAntag + name: meatyore-store-category-antag + +- type: storeCategory + id: DjJukeboxCategory + name: dj-jukebox-store-category diff --git a/Resources/Prototypes/Store/meatyore_store_presset.yml b/Resources/Prototypes/Store/meatyore_store_presset.yml new file mode 100644 index 0000000000..9a9ce77ed8 --- /dev/null +++ b/Resources/Prototypes/Store/meatyore_store_presset.yml @@ -0,0 +1,35 @@ +- type: storePreset + id: StorePresetMeatyOre + storeName: MeatyOreStore + categories: + - MeatyOreHats + - MeatyOreMasks + - MeatyOreBoots + - MeatyOreGlasses + - MeatyOrePersonal + - MeatyOreSuits + - MeatyOreUniforms + - MeatyOreGloves + - MeatyOreCloaks + - MeatyOreToys + - MeatyOreSpecial + - MeatyOreAntag + - DjJukeboxCategory + currencyWhitelist: + - MeatyOreCoin + +- type: entity + id: StoreMeatyOreEntity + name: ThisIsDumb + noSpawn: true + components: + - type: Store + preset: StorePresetMeatyOre + balance: + MeatyOreCoin: 0 + - type: UserInterface + interfaces: + - key: enum.StoreUiKey.Key + type: StoreBoundUserInterface + range: -1 + - type: IgnorBUIInteractionRange diff --git a/Resources/Textures/Interface/meatyore-shop-icon.png b/Resources/Textures/Interface/meatyore-shop-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b406f4113fb24ea3adc112deef8f8cd626750651 GIT binary patch literal 2206 zcmV;P2x0e$P)QZ1edr01_GA=PXIro$4|iHz{S9T@;mtNMQ@Ue-a_s86u1u9qsM+3 zz=^=iz+co4tNSJ3c+*n=h5@bQk5*u`wLPX00geFL$UkoZhnWUjyG+$!Y)6VNt1}694m0eNW{LpNKgC-AJ#e+g zonFN_w*w{t%Tw5feNCPL4wg+%l1KZ}Jls|Cv|bLZOfc>rfo79OfD?c<2_EN1fW9VY z&}GQ&vbiy44r_toCQnGbW_`@SzqaeI$vMCfU|Gyu*4aIS$jczSyMNgAl{D8;MyhWEK_iRaWR{@6*c#c#B*qiF;pj+ z#)@C9_00FpntF7=-JZeNyJe(l%;@cU&%E!fWq850!|iN@WhZ7ia@mAUnTIVTu;z>H z6xQITG|Vo3$~1r{QB4<5n;ru2tmit+&PwTFp2yE_vUV~(1fY*+v(~8|RFn#ZHjl#G z?{KvNj`rM;OSF}Z@;q|)d;V@)U?#9C;_to$t^l?&1qFD(b6xa2K~E0%7hj0Mx@N?) zAP-T|Y5;ceeRQ&513o_QUop}>}oxRNQ}J2yqLW1USMngSwG zfgc?6dNEY^?w-1xSf3xbndA&L1qHaqF{cf{ZdnNaHAxx~*c!M=>New;VhV~R{-YcX z%T*zQ-**VTJ3!|34w;Xd0wZNCQM82=%DOl_V4$`{B#KW=fdP*4T(ADs2($&WQG6aa z(A~%ve*%ku(?aGYbF+J!C@!i-m@6fBtHMBCUPHZ^9yqV*4!Mt26MArEyGDczQslov zemON@UMG99X32|wfkB>ROR&EV+(CX>5HPPD#Py6~U>ZU8XipTa)ef#g{si(%d*Ixb z20vMHCM$}$A%p8C|3LD~n!vf)^J!uG9N-~`kjWu~>n49o;17q612uFc7{eK=e*3?2 z?cu;E=A{v0-7-}J6``ZWq2pXF9WnZE$>J&ZEZ=XW5%RG^$l#E{Rp^*i&*}o;)oLQV z3FJ0Az#R%K3BbmCPqURuop7yK^af|^D zUShS}(9Abt^)ke`cfju`$yeEkg~u~;YKY0u0IS8(RN@)oXASPu)|IsZR*R!$9geQh zb-qK_SGMv@S=S)XNtZ*Fbf|=*ZL6@%5;7IK4xs-0p=5x437G*}DM|I?N2G6}p^eJf z2DOx=2(vxbqPR_CusO<*ZB$%-T&dRi)d;f_LY8x-eY?N$^QRwHnL zXVB_xW#}qnoJ;MnYxT9tEe>4tt5)c{H9ZGq{yBLvUn;9RGq~tqOBtc+Mi02pq4Vt! zp|+P#)y26X0KIHst31{=H1S^Abfqi{6QyFUU20v=uW@nim7!&XuJZIrs8%YKIFFmM)GDC_CBA1#vPGCSP1@|DsU& zNp^T@)p9BH+2vy|6NBy6;*qhTYS%DX;0@JgPU212u7OclS8<4%GV_lOj--{Jgig)vjCs~CYOwYDyiS&(dt$mxc+`Bwt zm%x~YO=D{{kh@|$j7Dr(HZ-PX+4Nctrnko{LehT2OoIRnk7?Ss#71*#J*a*$%{XlO za-1nRz&SB(EA5HTed;y1=9qrbokcawba^||VnX7pwTsoN8R+o|S{J`iz}Cf2#ms4) zTC67&dHGG;mtZ$*N1L2O*ACaU$?6`FRjm@#dJ>YhuMdlnXV;Q*R)Q?tYL!Mz8QKI_ zY`ij~HZiMwLKX4+D?CxnN`qV9H9rnp!Y;j(NjRZv>d`Gr(uk82-Y}b8O_d~0t@a5s zQoO`xl_biKs=?TXNK7lq9goc6j+*=V8c2<4l6T5<=S%52VsipJD3uGIA{WtBx8uU@ zb4Hm4=rTJy!Mj;pVU4BIpL6r;X`AJxZB5-?`*rep;YXXEg7u|=7d_?NwP1tn((|#Stp{`^dFu5-=iTc)|6D=W z5zmWkkF^wSkCU)M>P;`ysD|h<(A7G#`|D{J0v|{t*i{lH?vQ_fBmcLs;`O)5TZNUB gl$4Z|l$ajF-#e9sloW(U`Tzg`07*qoM6N<$g2M