diff --git a/Content.Client/Construction/UI/ConstructionMenuPresenter.cs b/Content.Client/Construction/UI/ConstructionMenuPresenter.cs index cdc9044a40..28cf3ba16c 100644 --- a/Content.Client/Construction/UI/ConstructionMenuPresenter.cs +++ b/Content.Client/Construction/UI/ConstructionMenuPresenter.cs @@ -1,9 +1,11 @@ using System.Linq; using Content.Client.UserInterface.Systems.MenuBar.Widgets; using Content.Shared.Construction.Prototypes; +using Content.Shared.Tag; using Robust.Client.GameObjects; using Robust.Client.Graphics; using Robust.Client.Placement; +using Robust.Client.Player; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; using Robust.Client.Utility; @@ -25,6 +27,7 @@ namespace Content.Client.Construction.UI [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IPlacementManager _placementManager = default!; [Dependency] private readonly IUserInterfaceManager _uiManager = default!; + [Dependency] private readonly IPlayerManager _playerManager = default!; private readonly IConstructionMenuView _constructionView; @@ -152,6 +155,11 @@ namespace Content.Client.Construction.UI if (recipe.Hide) continue; + if (_playerManager.LocalSession == null + || _playerManager.LocalEntity == null + || (recipe.EntityWhitelist != null && !recipe.EntityWhitelist.IsValid(_playerManager.LocalEntity.Value))) + continue; + if (!string.IsNullOrEmpty(search)) { if (!recipe.Name.ToLowerInvariant().Contains(search.Trim().ToLowerInvariant())) diff --git a/Content.Server/Construction/ConstructionSystem.Initial.cs b/Content.Server/Construction/ConstructionSystem.Initial.cs index 21978f2d0c..f312308798 100644 --- a/Content.Server/Construction/ConstructionSystem.Initial.cs +++ b/Content.Server/Construction/ConstructionSystem.Initial.cs @@ -15,6 +15,7 @@ using Content.Shared.Hands.EntitySystems; using Content.Shared.Interaction; using Content.Shared.Inventory; using Content.Shared.Storage; +using Content.Shared.Tag; using Robust.Shared.Containers; using Robust.Shared.Player; using Robust.Shared.Timing; @@ -29,6 +30,8 @@ namespace Content.Server.Construction [Dependency] private readonly ActionBlockerSystem _actionBlocker = default!; [Dependency] private readonly SharedHandsSystem _handsSystem = default!; [Dependency] private readonly EntityLookupSystem _lookupSystem = default!; + [Dependency] private readonly StorageSystem _storageSystem = default!; + [Dependency] private readonly TagSystem _tagSystem = default!; // --- WARNING! LEGACY CODE AHEAD! --- // This entire file contains the legacy code for initial construction. @@ -330,6 +333,12 @@ namespace Content.Server.Construction return false; } + if (constructionPrototype.EntityWhitelist != null && !constructionPrototype.EntityWhitelist.IsValid(user)) + { + _popup.PopupEntity(Loc.GetString("construction-system-cannot-start"), user, user); + return false; + } + var startNode = constructionGraph.Nodes[constructionPrototype.StartNode]; var targetNode = constructionGraph.Nodes[constructionPrototype.TargetNode]; var pathFind = constructionGraph.Path(startNode.Name, targetNode.Name); @@ -383,7 +392,6 @@ namespace Content.Server.Construction // LEGACY CODE. See warning at the top of the file! private async void HandleStartStructureConstruction(TryStartStructureConstructionMessage ev, EntitySessionEventArgs args) { - if (!_prototypeManager.TryIndex(ev.PrototypeName, out ConstructionPrototype? constructionPrototype)) { _sawmill.Error($"Tried to start construction of invalid recipe '{ev.PrototypeName}'!"); @@ -404,6 +412,12 @@ namespace Content.Server.Construction return; } + if (constructionPrototype.EntityWhitelist != null && !constructionPrototype.EntityWhitelist.IsValid(user)) + { + _popup.PopupEntity(Loc.GetString("construction-system-cannot-start"), user, user); + return; + } + if (_container.IsEntityInContainer(user)) { _popup.PopupEntity(Loc.GetString("construction-system-inside-container"), user, user); diff --git a/Content.Shared/Construction/Conditions/EntityWhitelistCondition.cs b/Content.Shared/Construction/Conditions/EntityWhitelistCondition.cs new file mode 100644 index 0000000000..22d86b54fb --- /dev/null +++ b/Content.Shared/Construction/Conditions/EntityWhitelistCondition.cs @@ -0,0 +1,45 @@ +using Content.Shared.Construction.EntitySystems; +using Content.Shared.Whitelist; +using Robust.Shared.Map; +using Robust.Shared.Utility; + +namespace Content.Shared.Construction.Conditions; + +/// +/// A check to see if the entity itself can be crafted. +/// +[DataDefinition] +public sealed partial class EntityWhitelistCondition : IConstructionCondition +{ + /// + /// What is told to the player attempting to construct the recipe using this condition. This will be localised. + /// + [DataField("conditionString")] + public string ConditionString = "construction-step-condition-entity-whitelist"; + + /// + /// The icon shown to the player beside the condition string. + /// + [DataField("conditionIcon")] + public SpriteSpecifier? ConditionIcon = null; + + /// + /// The whitelist that allows only certain entities to use this. + /// + [DataField("whitelist", required: true)] + public EntityWhitelist Whitelist = new(); + + public bool Condition(EntityUid user, EntityCoordinates location, Direction direction) + { + return Whitelist.IsValid(user); + } + + public ConstructionGuideEntry GenerateGuideEntry() + { + return new ConstructionGuideEntry + { + Localization = ConditionString, + Icon = ConditionIcon + }; + } +} diff --git a/Content.Shared/Construction/Prototypes/ConstructionPrototype.cs b/Content.Shared/Construction/Prototypes/ConstructionPrototype.cs index bd6dc096ad..e9863f8364 100644 --- a/Content.Shared/Construction/Prototypes/ConstructionPrototype.cs +++ b/Content.Shared/Construction/Prototypes/ConstructionPrototype.cs @@ -1,4 +1,5 @@ using Content.Shared.Construction.Conditions; +using Content.Shared.Whitelist; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; using Robust.Shared.Utility; @@ -20,7 +21,7 @@ public sealed partial class ConstructionPrototype : IPrototype /// Friendly name displayed in the construction GUI. /// [DataField("name")] - public string Name= string.Empty; + public string Name = string.Empty; /// /// "Useful" description displayed in the construction GUI. @@ -31,7 +32,7 @@ public sealed partial class ConstructionPrototype : IPrototype /// /// The this construction will be using. /// - [DataField("graph", customTypeSerializer:typeof(PrototypeIdSerializer), required: true)] + [DataField("graph", customTypeSerializer: typeof(PrototypeIdSerializer), required: true)] public string Graph = string.Empty; /// @@ -64,6 +65,13 @@ public sealed partial class ConstructionPrototype : IPrototype [DataField("canBuildInImpassable")] public bool CanBuildInImpassable { get; private set; } + /// + /// If not null, then this is used to check if the entity trying to construct this is whitelisted. + /// If they're not whitelisted, hide the item. + /// + [DataField("entityWhitelist")] + public EntityWhitelist? EntityWhitelist = null; + [DataField("category")] public string Category { get; private set; } = ""; [DataField("objectType")] public ConstructionType Type { get; private set; } = ConstructionType.Structure; @@ -84,11 +92,11 @@ public sealed partial class ConstructionPrototype : IPrototype /// /// Construction to replace this construction with when the current one is 'flipped' /// - [DataField("mirror", customTypeSerializer:typeof(PrototypeIdSerializer))] + [DataField("mirror", customTypeSerializer: typeof(PrototypeIdSerializer))] public string? Mirror; public IReadOnlyList Conditions => _conditions; - public IReadOnlyList Layers => _layers ?? new List{Icon}; + public IReadOnlyList Layers => _layers ?? new List { Icon }; } public enum ConstructionType diff --git a/Resources/Locale/en-US/construction/conditions/crafter-whitelist.ftl b/Resources/Locale/en-US/construction/conditions/crafter-whitelist.ftl deleted file mode 100644 index 646d89ca5e..0000000000 --- a/Resources/Locale/en-US/construction/conditions/crafter-whitelist.ftl +++ /dev/null @@ -1 +0,0 @@ -construction-step-condition-crafter-whitelist = You need to meet certain requirements. diff --git a/Resources/Locale/en-US/construction/construction-system.ftl b/Resources/Locale/en-US/construction/construction-system.ftl index 6ba8ae7813..81be8c4ab2 100644 --- a/Resources/Locale/en-US/construction/construction-system.ftl +++ b/Resources/Locale/en-US/construction/construction-system.ftl @@ -4,3 +4,4 @@ construction-system-construct-cannot-start-another-construction = You can't star construction-system-construct-no-materials = You don't have the materials to build that! construction-system-already-building = You are already building that! construction-system-inside-container = You can't build while you're there! +construction-system-cannot-start = You cannot craft this! diff --git a/Resources/Prototypes/Damage/modifier_sets.yml b/Resources/Prototypes/Damage/modifier_sets.yml index 8ab45c8b63..d651373ede 100644 --- a/Resources/Prototypes/Damage/modifier_sets.yml +++ b/Resources/Prototypes/Damage/modifier_sets.yml @@ -95,9 +95,9 @@ id: Web # Very flammable, can be easily hacked and slashed, but shooting or hitting it is another story. coefficients: Blunt: 0.7 - Slash: 2.0 + Slash: 1.4 Piercing: 0.7 - Heat: 3.0 + Heat: 2.0 - type: damageModifierSet id: Slime diff --git a/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml b/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml index a996a73127..244631509c 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml @@ -11,13 +11,30 @@ - type: HumanoidAppearance species: Arachnid - type: Hunger - baseDecayRate: 0.0125 # Spiders have slow metabolisms all things considered, so I decided to just make their hunger drain slower. starvationDamage: types: Cold: 0.5 Bloodloss: 0.5 - type: Thirst - baseDecayRate: 0.0125 # Read comment in hunger + - type: Sericulture + action: ActionSericulture + productionLength: 2 + entityProduced: MaterialWebSilk1 + hungerCost: 4 # Should total to 25 total silk on full hunger + - type: Tag + tags: + - CanPilot + - FootstepSound + - DoorBumpOpener + - SpiderCraft + - type: Perishable + - type: Butcherable + butcheringType: Spike + spawned: + - id: FoodMeatSpider + amount: 5 + - type: Inventory + templateId: arachnid # Damage (Self) - type: Bloodstream bloodReagent: CopperBlood @@ -27,20 +44,8 @@ soundHit: collection: AlienClaw damage: - types: # Realisically this is more like 5 slash - Slash: 4 - # Fun - - type: Sericulture - action: ActionSericulture - productionLength: 3 - entityProduced: MaterialWebSilk1 - hungerCost: 9 # Should total to 12 total silk on full hunger - - type: Perishable - - type: Butcherable - butcheringType: Spike - spawned: - - id: FoodMeatSpider - amount: 5 + types: + Slash: 5 # Visual & Audio - type: DamageVisuals damageOverlayGroups: @@ -93,7 +98,7 @@ - map: [ "neck" ] - map: [ "back" ] - map: [ "enum.HumanoidVisualLayers.FacialHair" ] - - map: [ "enum.HumanoidVisualLayers.Hair" ] + - map: [ "enum.HumanoidVisualLayers.Hair" ] # Do these need to be here? (arachnid hair arachnid hair) - map: [ "enum.HumanoidVisualLayers.HeadSide" ] - map: [ "enum.HumanoidVisualLayers.HeadTop" ] - map: [ "mask" ] @@ -109,11 +114,6 @@ sprite: "Effects/creampie.rsi" state: "creampie_arachnid" visible: false - - type: Tag - tags: - - CanPilot - - FootstepSound - - DoorBumpOpener - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Entities/Objects/Shields/shields.yml b/Resources/Prototypes/Entities/Objects/Shields/shields.yml index c3e3ea44ea..4596085f34 100644 --- a/Resources/Prototypes/Entities/Objects/Shields/shields.yml +++ b/Resources/Prototypes/Entities/Objects/Shields/shields.yml @@ -222,6 +222,59 @@ min: 1 max: 2 +- type: entity + name: web shield + parent: BaseShield + id: WebShield + description: A stringy shield. It's weak, and doesn't seem to do well against heat. + components: + - type: Sprite + sprite: Objects/Weapons/Melee/web-shield.rsi + state: icon + - type: Item + sprite: Objects/Weapons/Melee/web-shield.rsi + heldPrefix: icon + - type: Blocking + passiveBlockModifier: + coefficients: + Blunt: 0.95 + Slash: 0.95 + Piercing: 0.95 + activeBlockModifier: + coefficients: + Blunt: 0.85 + Slash: 0.85 + Piercing: 0.85 + flatReductions: + Blunt: 0.5 + Slash: 0.5 + Piercing: 0.5 + - type: Construction + graph: WebObjects + node: shield + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 40 + behaviors: + - !type:DoActsBehavior + acts: [ "Destruction" ] + - trigger: + !type:DamageTrigger + damage: 20 + behaviors: + - !type:DoActsBehavior + acts: [ "Destruction" ] + - !type:SpawnEntitiesBehavior + spawn: + MaterialWebSilk: + min: 1 + max: 1 + - !type:PlaySoundBehavior + sound: + path: /Audio/Effects/woodhit.ogg + #Magic/Cult Shields (give these to wizard for now) - type: entity diff --git a/Resources/Prototypes/Entities/Structures/Walls/walls.yml b/Resources/Prototypes/Entities/Structures/Walls/walls.yml index a78565b1d5..9059fd06d7 100644 --- a/Resources/Prototypes/Entities/Structures/Walls/walls.yml +++ b/Resources/Prototypes/Entities/Structures/Walls/walls.yml @@ -966,6 +966,9 @@ MaterialWebSilk: min: 1 max: 1 + - !type:PlaySoundBehavior + sound: + path: /Audio/Effects/woodhit.ogg - type: IconSmooth key: walls base: wall diff --git a/Resources/Prototypes/InventoryTemplates/arachnid_inventory_template.yml b/Resources/Prototypes/InventoryTemplates/arachnid_inventory_template.yml new file mode 100644 index 0000000000..0ebbdb916e --- /dev/null +++ b/Resources/Prototypes/InventoryTemplates/arachnid_inventory_template.yml @@ -0,0 +1,134 @@ +- type: inventoryTemplate + id: arachnid + slots: + - name: shoes + slotTexture: shoes + slotFlags: FEET + stripTime: 3 + uiWindowPos: 1,3 + strippingWindowPos: 1,3 + displayName: Shoes + - name: jumpsuit + slotTexture: uniform + slotFlags: INNERCLOTHING + stripTime: 6 + uiWindowPos: 0,2 + strippingWindowPos: 0,2 + displayName: Jumpsuit + - name: gloves + slotTexture: gloves + slotFlags: GLOVES + uiWindowPos: 2,2 + strippingWindowPos: 2,2 + displayName: Gloves + - name: neck + slotTexture: neck + slotFlags: NECK + uiWindowPos: 0,1 + strippingWindowPos: 0,1 + displayName: Neck + - name: mask + slotTexture: mask + slotFlags: MASK + uiWindowPos: 1,1 + strippingWindowPos: 1,1 + displayName: Mask + - name: eyes + slotTexture: glasses + slotFlags: EYES + stripTime: 3 + uiWindowPos: 0,0 + strippingWindowPos: 0,0 + displayName: Eyes + - name: ears + slotTexture: ears + slotFlags: EARS + stripTime: 3 + uiWindowPos: 2,0 + strippingWindowPos: 2,0 + displayName: Ears + - name: head + slotTexture: head + slotFlags: HEAD + uiWindowPos: 1,0 + strippingWindowPos: 1,0 + displayName: Head + - name: suitstorage + slotTexture: suit_storage + slotFlags: SUITSTORAGE + stripTime: 3 + uiWindowPos: 2,0 + strippingWindowPos: 2,5 + dependsOn: outerClothing + displayName: Suit Storage + - name: id + slotTexture: id + slotFlags: IDCARD + slotGroup: SecondHotbar + stripTime: 6 + uiWindowPos: 2,1 + strippingWindowPos: 2,4 + dependsOn: jumpsuit + displayName: ID + - name: belt + slotTexture: belt + slotFlags: BELT + slotGroup: SecondHotbar + stripTime: 6 + uiWindowPos: 3,1 + strippingWindowPos: 1,5 + displayName: Belt + - name: back + slotTexture: back + slotFlags: BACK + slotGroup: SecondHotbar + stripTime: 6 + uiWindowPos: 3,0 + strippingWindowPos: 0,5 + displayName: Back + + - name: pocket4 + slotTexture: web + slotFlags: POCKET + slotGroup: MainHotbar + stripTime: 3 + uiWindowPos: 2,4 + strippingWindowPos: 1,5 + displayName: Pocket 4 + - name: pocket3 + slotTexture: web + slotFlags: POCKET + slotGroup: MainHotbar + stripTime: 3 + uiWindowPos: 0,4 + strippingWindowPos: 0,5 + displayName: Pocket 3 + + - name: outerClothing + slotTexture: suit + slotFlags: OUTERCLOTHING + slotGroup: SecondHotbar + stripTime: 6 + uiWindowPos: 1,2 + strippingWindowPos: 1,2 + displayName: Suit + - name: pocket1 + slotTexture: pocket + slotFlags: POCKET + slotGroup: MainHotbar + stripTime: 3 + uiWindowPos: 0,3 + strippingWindowPos: 0,4 + dependsOn: jumpsuit + displayName: Pocket 1 + stripHidden: true + - name: pocket2 + slotTexture: pocket + slotFlags: POCKET + slotGroup: MainHotbar + stripTime: 3 + uiWindowPos: 2,3 + strippingWindowPos: 1,4 + dependsOn: jumpsuit + displayName: Pocket 2 + stripHidden: true diff --git a/Resources/Prototypes/Recipes/Construction/web.yml b/Resources/Prototypes/Recipes/Construction/web.yml index 2d61ac1515..9a0d832d01 100644 --- a/Resources/Prototypes/Recipes/Construction/web.yml +++ b/Resources/Prototypes/Recipes/Construction/web.yml @@ -13,6 +13,9 @@ placementMode: SnapgridCenter canRotate: false canBuildInImpassable: false + entityWhitelist: + tags: + - SpiderCraft conditions: - !type:TileNotBlocked @@ -31,6 +34,9 @@ placementMode: SnapgridCenter canRotate: false canBuildInImpassable: false + entityWhitelist: + tags: + - SpiderCraft conditions: - !type:TileNotBlocked @@ -49,6 +55,9 @@ placementMode: SnapgridCenter canRotate: false canBuildInImpassable: false + entityWhitelist: + tags: + - SpiderCraft conditions: - !type:TileNotBlocked @@ -66,6 +75,9 @@ objectType: Structure placementMode: SnapgridCenter canBuildInImpassable: false + entityWhitelist: + tags: + - SpiderCraft - type: construction name: web crate @@ -82,6 +94,9 @@ placementMode: SnapgridCenter canRotate: false canBuildInImpassable: false + entityWhitelist: + tags: + - SpiderCraft - type: construction name: web door @@ -97,5 +112,8 @@ objectType: Structure placementMode: SnapgridCenter canBuildInImpassable: false + entityWhitelist: + tags: + - SpiderCraft conditions: - !type:TileNotBlocked diff --git a/Resources/Prototypes/Recipes/Crafting/Graphs/web.yml b/Resources/Prototypes/Recipes/Crafting/Graphs/web.yml index 2bde191cdb..718af8be27 100644 --- a/Resources/Prototypes/Recipes/Crafting/Graphs/web.yml +++ b/Resources/Prototypes/Recipes/Crafting/Graphs/web.yml @@ -36,6 +36,12 @@ amount: 4 doAfter: 6 + - to: shield + steps: + - material: WebSilk + amount: 12 + doAfter: 6 + # Deconstruction - node: tile entity: FloorTileItemWeb @@ -51,3 +57,6 @@ - node: cloth entity: MaterialCloth1 + + - node: shield + entity: WebShield diff --git a/Resources/Prototypes/Recipes/Crafting/web.yml b/Resources/Prototypes/Recipes/Crafting/web.yml index 0cd8b22c0a..fe25b2f224 100644 --- a/Resources/Prototypes/Recipes/Crafting/web.yml +++ b/Resources/Prototypes/Recipes/Crafting/web.yml @@ -6,6 +6,9 @@ targetNode: tile category: construction-category-tiles description: "Nice and smooth." + entityWhitelist: + tags: + - SpiderCraft icon: sprite: Objects/Tiles/web.rsi state: icon @@ -19,6 +22,9 @@ targetNode: coat category: construction-category-clothing description: "Surprisingly warm and durable." + entityWhitelist: + tags: + - SpiderCraft icon: sprite: Clothing/OuterClothing/WinterCoats/coatweb.rsi state: icon @@ -32,6 +38,9 @@ targetNode: jumpsuit category: construction-category-clothing description: "At least it's something." + entityWhitelist: + tags: + - SpiderCraft icon: sprite: Clothing/Uniforms/Jumpsuit/web.rsi state: icon @@ -45,6 +54,9 @@ targetNode: jumpskirt category: construction-category-clothing description: "At least it's something." + entityWhitelist: + tags: + - SpiderCraft icon: sprite: Clothing/Uniforms/Jumpskirt/web.rsi state: icon @@ -58,7 +70,26 @@ targetNode: cloth category: construction-category-materials description: "Feels just like cloth, strangely enough." + entityWhitelist: + tags: + - SpiderCraft icon: sprite: Objects/Materials/materials.rsi state: cloth_3 objectType: Item + +- type: construction + name: web shield + id: WebShield + graph: WebObjects + startNode: start + targetNode: shield + category: construction-category-clothing + description: "It's thick enough to handle a few blows, but probably not heat." + entityWhitelist: + tags: + - SpiderCraft + icon: + sprite: Objects/Weapons/Melee/web-shield.rsi + state: icon + objectType: Item diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index 6d72187985..33e2e376fe 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -972,6 +972,9 @@ - type: Tag id: SpeedLoaderRifle +- type: Tag + id: SpiderCraft + - type: Tag id: SpreaderIgnore diff --git a/Resources/Textures/Interface/Classic/Slots/web.png b/Resources/Textures/Interface/Classic/Slots/web.png new file mode 100644 index 0000000000..4c37ac4247 Binary files /dev/null and b/Resources/Textures/Interface/Classic/Slots/web.png differ diff --git a/Resources/Textures/Interface/Default/Slots/web.png b/Resources/Textures/Interface/Default/Slots/web.png index d85d84e28c..f67ae575c7 100644 Binary files a/Resources/Textures/Interface/Default/Slots/web.png and b/Resources/Textures/Interface/Default/Slots/web.png differ diff --git a/Resources/Textures/Interface/Modernized/Slots/web.png b/Resources/Textures/Interface/Modernized/Slots/web.png new file mode 100644 index 0000000000..0e9a67f8be Binary files /dev/null and b/Resources/Textures/Interface/Modernized/Slots/web.png differ diff --git a/Resources/Textures/Mobs/Customization/Arachnid/chelicerae.rsi/downwards.png b/Resources/Textures/Mobs/Customization/Arachnid/chelicerae.rsi/downwards.png index f68272ec0e..f072ef05e9 100644 Binary files a/Resources/Textures/Mobs/Customization/Arachnid/chelicerae.rsi/downwards.png and b/Resources/Textures/Mobs/Customization/Arachnid/chelicerae.rsi/downwards.png differ diff --git a/Resources/Textures/Mobs/Species/Arachnid/parts.rsi/eyes.png b/Resources/Textures/Mobs/Species/Arachnid/parts.rsi/eyes.png index 3b205738f2..a662054108 100644 Binary files a/Resources/Textures/Mobs/Species/Arachnid/parts.rsi/eyes.png and b/Resources/Textures/Mobs/Species/Arachnid/parts.rsi/eyes.png differ diff --git a/Resources/Textures/Objects/Materials/silk.rsi/icon.png b/Resources/Textures/Objects/Materials/silk.rsi/icon.png index 648f370a54..003f17ab44 100644 Binary files a/Resources/Textures/Objects/Materials/silk.rsi/icon.png and b/Resources/Textures/Objects/Materials/silk.rsi/icon.png differ diff --git a/Resources/Textures/Objects/Weapons/Melee/web-shield.rsi/icon-inhand-left.png b/Resources/Textures/Objects/Weapons/Melee/web-shield.rsi/icon-inhand-left.png new file mode 100644 index 0000000000..9b1341bc3e Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Melee/web-shield.rsi/icon-inhand-left.png differ diff --git a/Resources/Textures/Objects/Weapons/Melee/web-shield.rsi/icon-inhand-right.png b/Resources/Textures/Objects/Weapons/Melee/web-shield.rsi/icon-inhand-right.png new file mode 100644 index 0000000000..f0efd77d14 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Melee/web-shield.rsi/icon-inhand-right.png differ diff --git a/Resources/Textures/Objects/Weapons/Melee/web-shield.rsi/icon.png b/Resources/Textures/Objects/Weapons/Melee/web-shield.rsi/icon.png new file mode 100644 index 0000000000..29830d3ac8 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Melee/web-shield.rsi/icon.png differ diff --git a/Resources/Textures/Objects/Weapons/Melee/web-shield.rsi/meta.json b/Resources/Textures/Objects/Weapons/Melee/web-shield.rsi/meta.json new file mode 100644 index 0000000000..5d8774872d --- /dev/null +++ b/Resources/Textures/Objects/Weapons/Melee/web-shield.rsi/meta.json @@ -0,0 +1,19 @@ +{ + "version": 1, + "size": {"x": 32, "y": 32}, + "license": "CC-BY-SA-3.0", + "copyright": "Made by PixelTheKermit (github) for SS14", + "states": [ + { + "name": "icon" + }, + { + "name": "icon-inhand-left", + "directions": 4 + }, + { + "name": "icon-inhand-right", + "directions": 4 + } + ] +}