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
+ }
+ ]
+}