Arachnid 2: Episode 2 (#19984)

* Shield

* minor sprite changes and buffs

* structure buff

* Crafting stuff

* tweaks

* 88-88

* Better web pocket sprites.

* yeah it's fine now.
This commit is contained in:
PixelTK
2023-11-08 20:18:52 +00:00
committed by GitHub
parent b360391795
commit 52af546267
25 changed files with 375 additions and 30 deletions

View File

@@ -1,9 +1,11 @@
using System.Linq; using System.Linq;
using Content.Client.UserInterface.Systems.MenuBar.Widgets; using Content.Client.UserInterface.Systems.MenuBar.Widgets;
using Content.Shared.Construction.Prototypes; using Content.Shared.Construction.Prototypes;
using Content.Shared.Tag;
using Robust.Client.GameObjects; using Robust.Client.GameObjects;
using Robust.Client.Graphics; using Robust.Client.Graphics;
using Robust.Client.Placement; using Robust.Client.Placement;
using Robust.Client.Player;
using Robust.Client.UserInterface; using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.Controls;
using Robust.Client.Utility; using Robust.Client.Utility;
@@ -25,6 +27,7 @@ namespace Content.Client.Construction.UI
[Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly IPlacementManager _placementManager = default!; [Dependency] private readonly IPlacementManager _placementManager = default!;
[Dependency] private readonly IUserInterfaceManager _uiManager = default!; [Dependency] private readonly IUserInterfaceManager _uiManager = default!;
[Dependency] private readonly IPlayerManager _playerManager = default!;
private readonly IConstructionMenuView _constructionView; private readonly IConstructionMenuView _constructionView;
@@ -152,6 +155,11 @@ namespace Content.Client.Construction.UI
if (recipe.Hide) if (recipe.Hide)
continue; continue;
if (_playerManager.LocalSession == null
|| _playerManager.LocalEntity == null
|| (recipe.EntityWhitelist != null && !recipe.EntityWhitelist.IsValid(_playerManager.LocalEntity.Value)))
continue;
if (!string.IsNullOrEmpty(search)) if (!string.IsNullOrEmpty(search))
{ {
if (!recipe.Name.ToLowerInvariant().Contains(search.Trim().ToLowerInvariant())) if (!recipe.Name.ToLowerInvariant().Contains(search.Trim().ToLowerInvariant()))

View File

@@ -15,6 +15,7 @@ using Content.Shared.Hands.EntitySystems;
using Content.Shared.Interaction; using Content.Shared.Interaction;
using Content.Shared.Inventory; using Content.Shared.Inventory;
using Content.Shared.Storage; using Content.Shared.Storage;
using Content.Shared.Tag;
using Robust.Shared.Containers; using Robust.Shared.Containers;
using Robust.Shared.Player; using Robust.Shared.Player;
using Robust.Shared.Timing; using Robust.Shared.Timing;
@@ -29,6 +30,8 @@ namespace Content.Server.Construction
[Dependency] private readonly ActionBlockerSystem _actionBlocker = default!; [Dependency] private readonly ActionBlockerSystem _actionBlocker = default!;
[Dependency] private readonly SharedHandsSystem _handsSystem = default!; [Dependency] private readonly SharedHandsSystem _handsSystem = default!;
[Dependency] private readonly EntityLookupSystem _lookupSystem = default!; [Dependency] private readonly EntityLookupSystem _lookupSystem = default!;
[Dependency] private readonly StorageSystem _storageSystem = default!;
[Dependency] private readonly TagSystem _tagSystem = default!;
// --- WARNING! LEGACY CODE AHEAD! --- // --- WARNING! LEGACY CODE AHEAD! ---
// This entire file contains the legacy code for initial construction. // This entire file contains the legacy code for initial construction.
@@ -330,6 +333,12 @@ namespace Content.Server.Construction
return false; 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 startNode = constructionGraph.Nodes[constructionPrototype.StartNode];
var targetNode = constructionGraph.Nodes[constructionPrototype.TargetNode]; var targetNode = constructionGraph.Nodes[constructionPrototype.TargetNode];
var pathFind = constructionGraph.Path(startNode.Name, targetNode.Name); 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! // LEGACY CODE. See warning at the top of the file!
private async void HandleStartStructureConstruction(TryStartStructureConstructionMessage ev, EntitySessionEventArgs args) private async void HandleStartStructureConstruction(TryStartStructureConstructionMessage ev, EntitySessionEventArgs args)
{ {
if (!_prototypeManager.TryIndex(ev.PrototypeName, out ConstructionPrototype? constructionPrototype)) if (!_prototypeManager.TryIndex(ev.PrototypeName, out ConstructionPrototype? constructionPrototype))
{ {
_sawmill.Error($"Tried to start construction of invalid recipe '{ev.PrototypeName}'!"); _sawmill.Error($"Tried to start construction of invalid recipe '{ev.PrototypeName}'!");
@@ -404,6 +412,12 @@ namespace Content.Server.Construction
return; return;
} }
if (constructionPrototype.EntityWhitelist != null && !constructionPrototype.EntityWhitelist.IsValid(user))
{
_popup.PopupEntity(Loc.GetString("construction-system-cannot-start"), user, user);
return;
}
if (_container.IsEntityInContainer(user)) if (_container.IsEntityInContainer(user))
{ {
_popup.PopupEntity(Loc.GetString("construction-system-inside-container"), user, user); _popup.PopupEntity(Loc.GetString("construction-system-inside-container"), user, user);

View File

@@ -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;
/// <summary>
/// A check to see if the entity itself can be crafted.
/// </summary>
[DataDefinition]
public sealed partial class EntityWhitelistCondition : IConstructionCondition
{
/// <summary>
/// What is told to the player attempting to construct the recipe using this condition. This will be localised.
/// </summary>
[DataField("conditionString")]
public string ConditionString = "construction-step-condition-entity-whitelist";
/// <summary>
/// The icon shown to the player beside the condition string.
/// </summary>
[DataField("conditionIcon")]
public SpriteSpecifier? ConditionIcon = null;
/// <summary>
/// The whitelist that allows only certain entities to use this.
/// </summary>
[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
};
}
}

View File

@@ -1,4 +1,5 @@
using Content.Shared.Construction.Conditions; using Content.Shared.Construction.Conditions;
using Content.Shared.Whitelist;
using Robust.Shared.Prototypes; using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
using Robust.Shared.Utility; using Robust.Shared.Utility;
@@ -20,7 +21,7 @@ public sealed partial class ConstructionPrototype : IPrototype
/// Friendly name displayed in the construction GUI. /// Friendly name displayed in the construction GUI.
/// </summary> /// </summary>
[DataField("name")] [DataField("name")]
public string Name= string.Empty; public string Name = string.Empty;
/// <summary> /// <summary>
/// "Useful" description displayed in the construction GUI. /// "Useful" description displayed in the construction GUI.
@@ -31,7 +32,7 @@ public sealed partial class ConstructionPrototype : IPrototype
/// <summary> /// <summary>
/// The <see cref="ConstructionGraphPrototype"/> this construction will be using. /// The <see cref="ConstructionGraphPrototype"/> this construction will be using.
/// </summary> /// </summary>
[DataField("graph", customTypeSerializer:typeof(PrototypeIdSerializer<ConstructionGraphPrototype>), required: true)] [DataField("graph", customTypeSerializer: typeof(PrototypeIdSerializer<ConstructionGraphPrototype>), required: true)]
public string Graph = string.Empty; public string Graph = string.Empty;
/// <summary> /// <summary>
@@ -64,6 +65,13 @@ public sealed partial class ConstructionPrototype : IPrototype
[DataField("canBuildInImpassable")] [DataField("canBuildInImpassable")]
public bool CanBuildInImpassable { get; private set; } public bool CanBuildInImpassable { get; private set; }
/// <summary>
/// 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.
/// </summary>
[DataField("entityWhitelist")]
public EntityWhitelist? EntityWhitelist = null;
[DataField("category")] public string Category { get; private set; } = ""; [DataField("category")] public string Category { get; private set; } = "";
[DataField("objectType")] public ConstructionType Type { get; private set; } = ConstructionType.Structure; [DataField("objectType")] public ConstructionType Type { get; private set; } = ConstructionType.Structure;
@@ -84,11 +92,11 @@ public sealed partial class ConstructionPrototype : IPrototype
/// <summary> /// <summary>
/// Construction to replace this construction with when the current one is 'flipped' /// Construction to replace this construction with when the current one is 'flipped'
/// </summary> /// </summary>
[DataField("mirror", customTypeSerializer:typeof(PrototypeIdSerializer<ConstructionPrototype>))] [DataField("mirror", customTypeSerializer: typeof(PrototypeIdSerializer<ConstructionPrototype>))]
public string? Mirror; public string? Mirror;
public IReadOnlyList<IConstructionCondition> Conditions => _conditions; public IReadOnlyList<IConstructionCondition> Conditions => _conditions;
public IReadOnlyList<SpriteSpecifier> Layers => _layers ?? new List<SpriteSpecifier>{Icon}; public IReadOnlyList<SpriteSpecifier> Layers => _layers ?? new List<SpriteSpecifier> { Icon };
} }
public enum ConstructionType public enum ConstructionType

View File

@@ -1 +0,0 @@
construction-step-condition-crafter-whitelist = You need to meet certain requirements.

View File

@@ -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-construct-no-materials = You don't have the materials to build that!
construction-system-already-building = You are already building that! construction-system-already-building = You are already building that!
construction-system-inside-container = You can't build while you're there! construction-system-inside-container = You can't build while you're there!
construction-system-cannot-start = You cannot craft this!

View File

@@ -95,9 +95,9 @@
id: Web # Very flammable, can be easily hacked and slashed, but shooting or hitting it is another story. id: Web # Very flammable, can be easily hacked and slashed, but shooting or hitting it is another story.
coefficients: coefficients:
Blunt: 0.7 Blunt: 0.7
Slash: 2.0 Slash: 1.4
Piercing: 0.7 Piercing: 0.7
Heat: 3.0 Heat: 2.0
- type: damageModifierSet - type: damageModifierSet
id: Slime id: Slime

View File

@@ -11,13 +11,30 @@
- type: HumanoidAppearance - type: HumanoidAppearance
species: Arachnid species: Arachnid
- type: Hunger - type: Hunger
baseDecayRate: 0.0125 # Spiders have slow metabolisms all things considered, so I decided to just make their hunger drain slower.
starvationDamage: starvationDamage:
types: types:
Cold: 0.5 Cold: 0.5
Bloodloss: 0.5 Bloodloss: 0.5
- type: Thirst - 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) # Damage (Self)
- type: Bloodstream - type: Bloodstream
bloodReagent: CopperBlood bloodReagent: CopperBlood
@@ -27,20 +44,8 @@
soundHit: soundHit:
collection: AlienClaw collection: AlienClaw
damage: damage:
types: # Realisically this is more like 5 slash types:
Slash: 4 Slash: 5
# 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
# Visual & Audio # Visual & Audio
- type: DamageVisuals - type: DamageVisuals
damageOverlayGroups: damageOverlayGroups:
@@ -93,7 +98,7 @@
- map: [ "neck" ] - map: [ "neck" ]
- map: [ "back" ] - map: [ "back" ]
- map: [ "enum.HumanoidVisualLayers.FacialHair" ] - 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.HeadSide" ]
- map: [ "enum.HumanoidVisualLayers.HeadTop" ] - map: [ "enum.HumanoidVisualLayers.HeadTop" ]
- map: [ "mask" ] - map: [ "mask" ]
@@ -109,11 +114,6 @@
sprite: "Effects/creampie.rsi" sprite: "Effects/creampie.rsi"
state: "creampie_arachnid" state: "creampie_arachnid"
visible: false visible: false
- type: Tag
tags:
- CanPilot
- FootstepSound
- DoorBumpOpener
- type: entity - type: entity
parent: BaseSpeciesDummy parent: BaseSpeciesDummy

View File

@@ -222,6 +222,59 @@
min: 1 min: 1
max: 2 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) #Magic/Cult Shields (give these to wizard for now)
- type: entity - type: entity

View File

@@ -966,6 +966,9 @@
MaterialWebSilk: MaterialWebSilk:
min: 1 min: 1
max: 1 max: 1
- !type:PlaySoundBehavior
sound:
path: /Audio/Effects/woodhit.ogg
- type: IconSmooth - type: IconSmooth
key: walls key: walls
base: wall base: wall

View File

@@ -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

View File

@@ -13,6 +13,9 @@
placementMode: SnapgridCenter placementMode: SnapgridCenter
canRotate: false canRotate: false
canBuildInImpassable: false canBuildInImpassable: false
entityWhitelist:
tags:
- SpiderCraft
conditions: conditions:
- !type:TileNotBlocked - !type:TileNotBlocked
@@ -31,6 +34,9 @@
placementMode: SnapgridCenter placementMode: SnapgridCenter
canRotate: false canRotate: false
canBuildInImpassable: false canBuildInImpassable: false
entityWhitelist:
tags:
- SpiderCraft
conditions: conditions:
- !type:TileNotBlocked - !type:TileNotBlocked
@@ -49,6 +55,9 @@
placementMode: SnapgridCenter placementMode: SnapgridCenter
canRotate: false canRotate: false
canBuildInImpassable: false canBuildInImpassable: false
entityWhitelist:
tags:
- SpiderCraft
conditions: conditions:
- !type:TileNotBlocked - !type:TileNotBlocked
@@ -66,6 +75,9 @@
objectType: Structure objectType: Structure
placementMode: SnapgridCenter placementMode: SnapgridCenter
canBuildInImpassable: false canBuildInImpassable: false
entityWhitelist:
tags:
- SpiderCraft
- type: construction - type: construction
name: web crate name: web crate
@@ -82,6 +94,9 @@
placementMode: SnapgridCenter placementMode: SnapgridCenter
canRotate: false canRotate: false
canBuildInImpassable: false canBuildInImpassable: false
entityWhitelist:
tags:
- SpiderCraft
- type: construction - type: construction
name: web door name: web door
@@ -97,5 +112,8 @@
objectType: Structure objectType: Structure
placementMode: SnapgridCenter placementMode: SnapgridCenter
canBuildInImpassable: false canBuildInImpassable: false
entityWhitelist:
tags:
- SpiderCraft
conditions: conditions:
- !type:TileNotBlocked - !type:TileNotBlocked

View File

@@ -36,6 +36,12 @@
amount: 4 amount: 4
doAfter: 6 doAfter: 6
- to: shield
steps:
- material: WebSilk
amount: 12
doAfter: 6
# Deconstruction # Deconstruction
- node: tile - node: tile
entity: FloorTileItemWeb entity: FloorTileItemWeb
@@ -51,3 +57,6 @@
- node: cloth - node: cloth
entity: MaterialCloth1 entity: MaterialCloth1
- node: shield
entity: WebShield

View File

@@ -6,6 +6,9 @@
targetNode: tile targetNode: tile
category: construction-category-tiles category: construction-category-tiles
description: "Nice and smooth." description: "Nice and smooth."
entityWhitelist:
tags:
- SpiderCraft
icon: icon:
sprite: Objects/Tiles/web.rsi sprite: Objects/Tiles/web.rsi
state: icon state: icon
@@ -19,6 +22,9 @@
targetNode: coat targetNode: coat
category: construction-category-clothing category: construction-category-clothing
description: "Surprisingly warm and durable." description: "Surprisingly warm and durable."
entityWhitelist:
tags:
- SpiderCraft
icon: icon:
sprite: Clothing/OuterClothing/WinterCoats/coatweb.rsi sprite: Clothing/OuterClothing/WinterCoats/coatweb.rsi
state: icon state: icon
@@ -32,6 +38,9 @@
targetNode: jumpsuit targetNode: jumpsuit
category: construction-category-clothing category: construction-category-clothing
description: "At least it's something." description: "At least it's something."
entityWhitelist:
tags:
- SpiderCraft
icon: icon:
sprite: Clothing/Uniforms/Jumpsuit/web.rsi sprite: Clothing/Uniforms/Jumpsuit/web.rsi
state: icon state: icon
@@ -45,6 +54,9 @@
targetNode: jumpskirt targetNode: jumpskirt
category: construction-category-clothing category: construction-category-clothing
description: "At least it's something." description: "At least it's something."
entityWhitelist:
tags:
- SpiderCraft
icon: icon:
sprite: Clothing/Uniforms/Jumpskirt/web.rsi sprite: Clothing/Uniforms/Jumpskirt/web.rsi
state: icon state: icon
@@ -58,7 +70,26 @@
targetNode: cloth targetNode: cloth
category: construction-category-materials category: construction-category-materials
description: "Feels just like cloth, strangely enough." description: "Feels just like cloth, strangely enough."
entityWhitelist:
tags:
- SpiderCraft
icon: icon:
sprite: Objects/Materials/materials.rsi sprite: Objects/Materials/materials.rsi
state: cloth_3 state: cloth_3
objectType: Item 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

View File

@@ -972,6 +972,9 @@
- type: Tag - type: Tag
id: SpeedLoaderRifle id: SpeedLoaderRifle
- type: Tag
id: SpiderCraft
- type: Tag - type: Tag
id: SpreaderIgnore id: SpreaderIgnore

Binary file not shown.

After

Width:  |  Height:  |  Size: 908 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 668 B

After

Width:  |  Height:  |  Size: 790 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 523 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 233 B

After

Width:  |  Height:  |  Size: 231 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 B

After

Width:  |  Height:  |  Size: 151 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 391 B

After

Width:  |  Height:  |  Size: 423 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 816 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 845 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 409 B

View File

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