From d65601f024d8aec28851d3a9dea23f0af440295a Mon Sep 17 00:00:00 2001 From: keronshb <54602815+keronshb@users.noreply.github.com> Date: Mon, 4 Jul 2022 02:31:12 -0400 Subject: [PATCH] Blocking and Shields (#8584) * Blocking * Fixes Bodytype bug * Blocking Damage Modifier * Storing bodytype * Consolidates Stop Blocking code * Consolidates more methods * Some cleanup, hitbox fix * Shield Textures * Passive blocking modifier check * Localization, popups, and more cleanup * Small cleanup * Relay event * Fixes a shutdown bug, adds specific containers and sets * Popups and sounds * Fixes typo * Removes whitespace, adds comment * Some requested changes * Remove Shared * Audio fix * More changes * More requested changes * Properly remove on shutdown * Adds riot shields to seclathes * SecTech Riot shield * Constant variable * Relay transfer to user blocking system * More destruction behavior * Adds a shape field * Riot shield cleanup * More requested changes. * Prevents blocking attempt where a user cannot be anchored * Listen for anchor change * Unused using cleanup * More shields. * Buckler * Construction * Linter fix --- Content.Shared/Blocking/BlockingSystem.cs | 194 +++++++++++++++++ Content.Shared/Blocking/BlockingUserSystem.cs | 60 ++++++ .../Blocking/Components/BlockingComponent.cs | 64 ++++++ .../Components/BlockingUserComponent.cs | 31 +++ Resources/Audio/Weapons/block_metal1.ogg | Bin 0 -> 10612 bytes Resources/Audio/Weapons/licenses.txt | 4 +- .../Locale/en-US/actions/actions/blocking.ftl | 10 + Resources/Prototypes/Actions/types.yml | 8 + .../Catalog/Research/technologies.yml | 1 + .../VendingMachines/Inventories/sec.yml | 3 + Resources/Prototypes/Damage/containers.yml | 9 + Resources/Prototypes/Damage/modifier_sets.yml | 135 ++++++++++++ .../Entities/Objects/Shields/shields.yml | 194 +++++++++++++++++ .../Entities/Structures/Machines/lathe.yml | 1 + .../Graphs/weapons/makeshift_shield.yml | 17 ++ .../Graphs/weapons/wooden_buckler.yml | 24 +++ .../Recipes/Construction/weapons.yml | 21 ++ .../Prototypes/Recipes/Lathes/security.yml | 11 + .../Melee/shields.rsi/buckler-icon.png | Bin 0 -> 786 bytes .../Melee/shields.rsi/buckler-inhand-left.png | Bin 0 -> 844 bytes .../shields.rsi/buckler-inhand-right.png | Bin 0 -> 890 bytes .../Melee/shields.rsi/eshield-icon.png | Bin 0 -> 171 bytes .../Melee/shields.rsi/eshield-inhand-left.png | Bin 0 -> 339 bytes .../shields.rsi/eshield-inhand-right-on.png | Bin 0 -> 834 bytes .../shields.rsi/eshield-inhand-right.png | Bin 0 -> 351 bytes .../Weapons/Melee/shields.rsi/eshield-on.png | Bin 0 -> 462 bytes .../shields.rsi/eshield1-inhand-left-on.png | Bin 0 -> 833 bytes .../Melee/shields.rsi/makeshift-icon.png | Bin 0 -> 488 bytes .../Weapons/Melee/shields.rsi/meta.json | 195 ++++++++++++++++++ .../Weapons/Melee/shields.rsi/metal-icon.png | Bin 0 -> 205 bytes .../Melee/shields.rsi/metal-inhand-left.png | Bin 0 -> 606 bytes .../Melee/shields.rsi/metal-inhand-right.png | Bin 0 -> 628 bytes .../Weapons/Melee/shields.rsi/mirror-icon.png | Bin 0 -> 1104 bytes .../Melee/shields.rsi/mirror-inhand-left.png | Bin 0 -> 2435 bytes .../Melee/shields.rsi/mirror-inhand-right.png | Bin 0 -> 2543 bytes .../Melee/shields.rsi/ratvarian-icon.png | Bin 0 -> 502 bytes .../shields.rsi/ratvarian-inhand-left.png | Bin 0 -> 914 bytes .../shields.rsi/ratvarian-inhand-right.png | Bin 0 -> 885 bytes .../Weapons/Melee/shields.rsi/riot-icon.png | Bin 0 -> 383 bytes .../Melee/shields.rsi/riot-inhand-left.png | Bin 0 -> 847 bytes .../Melee/shields.rsi/riot-inhand-right.png | Bin 0 -> 863 bytes .../Melee/shields.rsi/riot_bullet-icon.png | Bin 0 -> 496 bytes .../shields.rsi/riot_bullet-inhand-left.png | Bin 0 -> 1003 bytes .../shields.rsi/riot_bullet-inhand-right.png | Bin 0 -> 1035 bytes .../Melee/shields.rsi/riot_laser-icon.png | Bin 0 -> 540 bytes .../shields.rsi/riot_laser-inhand-left.png | Bin 0 -> 1121 bytes .../shields.rsi/riot_laser-inhand-right.png | Bin 0 -> 1141 bytes .../Melee/shields.rsi/teleriot-icon.png | Bin 0 -> 352 bytes .../shields.rsi/teleriot-inhand-left-on.png | Bin 0 -> 751 bytes .../shields.rsi/teleriot-inhand-left.png | Bin 0 -> 658 bytes .../shields.rsi/teleriot-inhand-right-on.png | Bin 0 -> 784 bytes .../shields.rsi/teleriot-inhand-right.png | Bin 0 -> 667 bytes .../Weapons/Melee/shields.rsi/teleriot-on.png | Bin 0 -> 396 bytes 53 files changed, 981 insertions(+), 1 deletion(-) create mode 100644 Content.Shared/Blocking/BlockingSystem.cs create mode 100644 Content.Shared/Blocking/BlockingUserSystem.cs create mode 100644 Content.Shared/Blocking/Components/BlockingComponent.cs create mode 100644 Content.Shared/Blocking/Components/BlockingUserComponent.cs create mode 100644 Resources/Audio/Weapons/block_metal1.ogg create mode 100644 Resources/Locale/en-US/actions/actions/blocking.ftl create mode 100644 Resources/Prototypes/Entities/Objects/Shields/shields.yml create mode 100644 Resources/Prototypes/Recipes/Construction/Graphs/weapons/makeshift_shield.yml create mode 100644 Resources/Prototypes/Recipes/Construction/Graphs/weapons/wooden_buckler.yml create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/buckler-icon.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/buckler-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/buckler-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/eshield-icon.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/eshield-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/eshield-inhand-right-on.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/eshield-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/eshield-on.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/eshield1-inhand-left-on.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/makeshift-icon.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/meta.json create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/metal-icon.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/metal-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/metal-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/mirror-icon.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/mirror-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/mirror-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/ratvarian-icon.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/ratvarian-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/ratvarian-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/riot-icon.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/riot-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/riot-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/riot_bullet-icon.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/riot_bullet-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/riot_bullet-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/riot_laser-icon.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/riot_laser-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/riot_laser-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/teleriot-icon.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/teleriot-inhand-left-on.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/teleriot-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/teleriot-inhand-right-on.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/teleriot-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/shields.rsi/teleriot-on.png diff --git a/Content.Shared/Blocking/BlockingSystem.cs b/Content.Shared/Blocking/BlockingSystem.cs new file mode 100644 index 0000000000..813fbdf306 --- /dev/null +++ b/Content.Shared/Blocking/BlockingSystem.cs @@ -0,0 +1,194 @@ +using Content.Shared.Actions; +using Content.Shared.Actions.ActionTypes; +using Content.Shared.Hands; +using Content.Shared.Hands.EntitySystems; +using Content.Shared.Physics; +using Content.Shared.Popups; +using Content.Shared.Toggleable; +using Robust.Shared.Physics; +using Robust.Shared.Physics.Dynamics; +using Robust.Shared.Player; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Blocking; + +public sealed class BlockingSystem : EntitySystem +{ + [Dependency] private readonly SharedActionsSystem _actionsSystem = default!; + [Dependency] private readonly IPrototypeManager _proto = default!; + [Dependency] private readonly SharedTransformSystem _transformSystem = default!; + [Dependency] private readonly FixtureSystem _fixtureSystem = default!; + [Dependency] private readonly SharedHandsSystem _handsSystem = default!; + [Dependency] private readonly SharedPopupSystem _popupSystem = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnEquip); + SubscribeLocalEvent(OnUnequip); + + SubscribeLocalEvent(OnGetActions); + SubscribeLocalEvent(OnToggleAction); + + SubscribeLocalEvent(OnShutdown); + } + + private void OnEquip(EntityUid uid, BlockingComponent component, GotEquippedHandEvent args) + { + component.User = args.User; + + //To make sure that this bodytype doesn't get set as anything but the original + if (TryComp(args.User, out var physicsComponent) && physicsComponent.BodyType != BodyType.Static + && !TryComp(args.User, out var blockingUserComponent)) + { + var userComp = EnsureComp(args.User); + userComp.BlockingItem = uid; + userComp.OriginalBodyType = physicsComponent.BodyType; + } + } + + private void OnUnequip(EntityUid uid, BlockingComponent component, GotUnequippedHandEvent args) + { + BlockingShutdownHelper(uid, component, args.User); + } + + private void OnGetActions(EntityUid uid, BlockingComponent component, GetItemActionsEvent args) + { + if (component.BlockingToggleAction == null + && _proto.TryIndex(component.BlockingToggleActionId, out InstantActionPrototype? act)) + { + component.BlockingToggleAction = new(act); + } + + if (component.BlockingToggleAction != null) + args.Actions.Add(component.BlockingToggleAction); + } + + private void OnToggleAction(EntityUid uid, BlockingComponent component, ToggleActionEvent args) + { + if(args.Handled) + return; + + if (component.IsBlocking) + StopBlocking(uid, component, args.Performer); + else + StartBlocking(uid, component, args.Performer); + + args.Handled = true; + } + + private void OnShutdown(EntityUid uid, BlockingComponent component, ComponentShutdown args) + { + //In theory the user should not be null when this fires off + if (component.User != null) + { + _actionsSystem.RemoveProvidedActions(component.User.Value, uid); + BlockingShutdownHelper(uid, component, component.User.Value); + } + } + + /// + /// Called where you want the user to start blocking + /// Creates a new hard fixture to bodyblock + /// Also makes the user static to prevent prediction issues + /// + /// The entity with the blocking component + /// The + /// The entity who's using the item to block + /// + public bool StartBlocking(EntityUid item, BlockingComponent component, EntityUid user) + { + if (component.IsBlocking) return false; + + var xform = Transform(user); + + var shieldName = Name(item); + + var msgUser = Loc.GetString("action-popup-blocking-user", ("shield", shieldName)); + var msgOther = Loc.GetString("action-popup-blocking-other", ("blockerName", Name(user)), ("shield", shieldName)); + + if (component.BlockingToggleAction != null) + { + _transformSystem.AnchorEntity(xform); + if (!xform.Anchored) + { + var msgError = Loc.GetString("action-popup-blocking-user-cant-block"); + _popupSystem.PopupEntity(msgError, user, Filter.Entities(user)); + return false; + } + _actionsSystem.SetToggled(component.BlockingToggleAction, true); + _popupSystem.PopupEntity(msgUser, user, Filter.Entities(user)); + _popupSystem.PopupEntity(msgOther, user, Filter.Pvs(user).RemoveWhereAttachedEntity(e => e == user)); + } + + if (TryComp(user, out var physicsComponent)) + { + var fixture = new Fixture(physicsComponent, component.Shape) + { + ID = BlockingComponent.BlockFixtureID, + Hard = true, + CollisionLayer = (int) CollisionGroup.WallLayer + }; + + _fixtureSystem.TryCreateFixture(physicsComponent, fixture); + } + + component.IsBlocking = true; + + return true; + } + + /// + /// Called where you want the user to stop blocking. + /// + /// The entity with the blocking component + /// The + /// The entity who's using the item to block + /// + public bool StopBlocking(EntityUid item, BlockingComponent component, EntityUid user) + { + if (!component.IsBlocking) return false; + + var xform = Transform(user); + + var shieldName = Name(item); + + var msgUser = Loc.GetString("action-popup-blocking-disabling-user", ("shield", shieldName)); + var msgOther = Loc.GetString("action-popup-blocking-disabling-other", ("blockerName", Name(user)), ("shield", shieldName)); + + //If the component blocking toggle isn't null, grab the users SharedBlockingUserComponent and PhysicsComponent + //then toggle the action to false, unanchor the user, remove the hard fixture + //and set the users bodytype back to their original type + if (component.BlockingToggleAction != null && TryComp(user, out var blockingUserComponent) + && TryComp(user, out var physicsComponent)) + { + _transformSystem.Unanchor(xform); + _actionsSystem.SetToggled(component.BlockingToggleAction, false); + _fixtureSystem.DestroyFixture(physicsComponent, BlockingComponent.BlockFixtureID); + physicsComponent.BodyType = blockingUserComponent.OriginalBodyType; + _popupSystem.PopupEntity(msgUser, user, Filter.Entities(user)); + _popupSystem.PopupEntity(msgOther, user, Filter.Pvs(user).RemoveWhereAttachedEntity(e => e == user)); + } + + component.IsBlocking = false; + + return true; + } + + /// + /// Called where you want someone to stop blocking and to remove the from them + /// + /// The item the component is attached to + /// The + /// The person holding the blocking item + private void BlockingShutdownHelper(EntityUid uid, BlockingComponent component, EntityUid user) + { + if (component.IsBlocking) + StopBlocking(uid, component, user); + + RemComp(user); + component.User = null; + } + +} diff --git a/Content.Shared/Blocking/BlockingUserSystem.cs b/Content.Shared/Blocking/BlockingUserSystem.cs new file mode 100644 index 0000000000..a14d42c293 --- /dev/null +++ b/Content.Shared/Blocking/BlockingUserSystem.cs @@ -0,0 +1,60 @@ +using Content.Shared.Audio; +using Content.Shared.Damage; +using Content.Shared.Damage.Prototypes; +using Content.Shared.Hands.EntitySystems; +using Robust.Shared.Audio; +using Robust.Shared.Player; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Blocking; + +public sealed class BlockingUserSystem : EntitySystem +{ + [Dependency] private readonly SharedHandsSystem _handsSystem = default!; + [Dependency] private readonly IPrototypeManager _proto = default!; + [Dependency] private readonly BlockingSystem _blockingSystem = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnDamageChanged); + SubscribeLocalEvent(OnUserDamageModified); + + SubscribeLocalEvent(OnAnchorChanged); + } + + private void OnAnchorChanged(EntityUid uid, BlockingUserComponent component, ref AnchorStateChangedEvent args) + { + if (!args.Anchored) + return; + + if (TryComp(component.BlockingItem, out var blockComp) && blockComp.IsBlocking) + { + _blockingSystem.StopBlocking(component.BlockingItem.Value, blockComp, uid); + } + } + + private void OnDamageChanged(EntityUid uid, BlockingUserComponent component, DamageChangedEvent args) + { + if (component.BlockingItem != null) + { + RaiseLocalEvent(component.BlockingItem.Value, args); + } + } + + private void OnUserDamageModified(EntityUid uid, BlockingUserComponent component, DamageModifyEvent args) + { + if (TryComp(component.BlockingItem, out var blockingComponent)) + { + if (_proto.TryIndex(blockingComponent.PassiveBlockDamageModifer, out DamageModifierSetPrototype? passiveblockModifier) && !blockingComponent.IsBlocking) + args.Damage = DamageSpecifier.ApplyModifierSet(args.Damage, passiveblockModifier); + + if (_proto.TryIndex(blockingComponent.ActiveBlockDamageModifier, out DamageModifierSetPrototype? activeBlockModifier) && blockingComponent.IsBlocking) + { + args.Damage = DamageSpecifier.ApplyModifierSet(args.Damage, activeBlockModifier); + SoundSystem.Play(blockingComponent.BlockSound.GetSound(), Filter.Pvs(component.Owner, entityManager: EntityManager), component.Owner, AudioHelpers.WithVariation(0.2f)); + } + } + } +} diff --git a/Content.Shared/Blocking/Components/BlockingComponent.cs b/Content.Shared/Blocking/Components/BlockingComponent.cs new file mode 100644 index 0000000000..abdd032a3c --- /dev/null +++ b/Content.Shared/Blocking/Components/BlockingComponent.cs @@ -0,0 +1,64 @@ +using Content.Shared.Actions.ActionTypes; +using Content.Shared.Sound; +using Robust.Shared.Physics.Collision.Shapes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + +namespace Content.Shared.Blocking; + +/// +/// This component goes on an item that you want to use to block +/// +[RegisterComponent] +public sealed class BlockingComponent : Component +{ + /// + /// The entity that's blocking + /// + [ViewVariables] + public EntityUid? User; + + /// + /// Is it currently blocking? + /// + [ViewVariables] + public bool IsBlocking; + + /// + /// The ID for the fixture that's dynamically created when blocking + /// + public const string BlockFixtureID = "blocking-active"; + + /// + /// The shape of the blocking fixture that will be dynamically spawned + /// + [ViewVariables(VVAccess.ReadWrite)] + [DataField("shape")] + public IPhysShape Shape = new PhysShapeCircle {Radius = 0.5F}; + + /// + /// The damage modifer to use while passively blocking + /// + [ViewVariables(VVAccess.ReadWrite)] + [DataField("passiveBlockModifier")] + public string PassiveBlockDamageModifer = "Metallic"; + + /// + /// The damage modifier to use while actively blocking. + /// + [ViewVariables(VVAccess.ReadWrite)] + [DataField("activeBlockModifier")] + public string ActiveBlockDamageModifier = "Metallic"; + + [DataField("blockingToggleActionId", customTypeSerializer:typeof(PrototypeIdSerializer))] + public string BlockingToggleActionId = "ToggleBlock"; + + [DataField("blockingToggleAction")] + public InstantAction? BlockingToggleAction; + + /// + /// The sound to be played when you get hit while actively blocking + /// + [ViewVariables] + [DataField("blockSound")] + public SoundSpecifier BlockSound = new SoundPathSpecifier("/Audio/Weapons/block_metal1.ogg"); +} diff --git a/Content.Shared/Blocking/Components/BlockingUserComponent.cs b/Content.Shared/Blocking/Components/BlockingUserComponent.cs new file mode 100644 index 0000000000..6292d7b9c3 --- /dev/null +++ b/Content.Shared/Blocking/Components/BlockingUserComponent.cs @@ -0,0 +1,31 @@ +using Content.Shared.Damage; +using Robust.Shared.Physics; + +namespace Content.Shared.Blocking; + +/// +/// This component gets dynamically added to an Entity via the +/// +[RegisterComponent] +public sealed class BlockingUserComponent : Component +{ + /// + /// The entity that's being used to block + /// + [ViewVariables] + [DataField("blockingItem")] + public EntityUid? BlockingItem; + + [ViewVariables] + [DataField("modifiers")] + public DamageModifierSet Modifiers = default!; + + /// + /// Stores the entities original bodytype + /// Used so that it can be put back to what it was after anchoring + /// + [ViewVariables] + [DataField("originalBodyType")] + public BodyType OriginalBodyType; + +} diff --git a/Resources/Audio/Weapons/block_metal1.ogg b/Resources/Audio/Weapons/block_metal1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..c0f98249cd3bd9124e11ba976e88d847da1cebff GIT binary patch literal 10612 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 UQOLa&m^~OgUHx3vIVCg!0Ac-cr~m)} literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Melee/shields.rsi/buckler-inhand-right.png b/Resources/Textures/Objects/Weapons/Melee/shields.rsi/buckler-inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..14a8b2560a3c650fd02085ee7fbf78817db05fec GIT binary patch literal 890 zcmV-=1BLvFP)b8fZ#|2utf=n!y5mb-?kHP zCLa6D+Eq26T!>Ir)dvqiagN@;!D3H6RnZxVXvt*K5WA%T)bX~qHk{}^f<~of^|}6x ziJFPIjbL#Wxuu^7^&LZV>kfKkFu~LS-uZLA3Y3;Ca=AJE+Ei7{ZJZvy?|XFXqSn1M zg9Y@MwlOt;XC9bi_p|ehP=ZbDb6@i!rVxNzxpQeyyL@kaH8GSlN}i%u15SmJ&1SXo zVQesfvQM24;9u4Q9eXR<1TDne!2UhED(5G*8d}jzl z7l!cUZj>3aoL?~&a|36uKd4B^r!QY|_+S@)EEm|lp0tYgRab$AdOz~|HIYal^w-VI zx9_H6ZiH8H`|ehK9x!5Q0DXxID20!#wD@?k5_2Ps4fX6gn{U?tE*X|_g8|fFaNwl2 zp!8s0?gM+qJI}Eaa|5*YN3UFCaXlP4&z9_IeMYO>{u?h|zc;iut$^{=Gd8{l^ofp4 z;F*6rHG}C6YcV%Ko1U8^S2dc)s7ebfMby{%F!B5)*1Zv;%+hK=VtgaSO1`^mO))n> zanb6;Cuo|d)~Zy?Ie>p@BVul0BQaK81yqmh{r{IO``_Stkp@6;qyZ2dX#fOA8UVqO z20(D60T3K%00c)G0KxHu0rY;dzx@|R$I`aHovPV@=$U>ko$)*V>g@Q@L%>+tcHNo{ zpup0pX*h|KM{u?bfz3E06}_dGEK?5+TUj=IPM*H?g(XN9HTAt;V$+cF1i#t$W4z5DEl zZp{Xi0`tU%(iBfbPPZPM z;uumf=j|m&t^*1@tbwflbD5vqn#R#oB3>WJHF@f~XM&ebJ!J%{1cEyL7pHg6W9!*5 zQ?z{ke-o!$4oBiUzIZfrXcdYIyng5X=Lc_&`+k-a%wW~)nB~4H3W+Sb_v0pr@9FC2 Jvd$@?2>`C}HlY9j literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Melee/shields.rsi/eshield-inhand-left.png b/Resources/Textures/Objects/Weapons/Melee/shields.rsi/eshield-inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..46294e54323a4589f3557a6f9da6f83beb54acb9 GIT binary patch literal 339 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|O(g zr;B4q#hkY@PxCe#h_I*!buC~ywLp(+f!?VFEV~p6MO4mxlybi{m;2c#yX4O`4>~Oc z8?d1Z3eO57?WK-PI~KzI!^Hl)@##%--fwEsFHAk*@1XgqW>t6X@!BumVuy+TeM3{-wg>mkYgMl+Jab_n0y*S16w37H-rn_xKjg_ep#Uz4wuL(R(-)lj zySZU=Luu^HWh-}0h}&5&_QAJe3e&gR=jVhMoQeI)Ij8l@48~P=t~zhH&JgnSoM{Kb c6W^HPeteJb{8^Sg6&Okkp00i_>zopr0OC4_*8l(j literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Melee/shields.rsi/eshield-inhand-right-on.png b/Resources/Textures/Objects/Weapons/Melee/shields.rsi/eshield-inhand-right-on.png new file mode 100644 index 0000000000000000000000000000000000000000..bdea4cdae8d330eab17dcbdcefb60f447cf1c1e1 GIT binary patch literal 834 zcmV-I1HJr-P)fLXW$X&&+2mPVLZ=HXL$9$oQEEP!#;){j=oUhwo$Y`IHEhW}ndbWAKP7e)eTRUhog6ZfUhT zc_MVcGu|xUTwOo>7Zv&0Cjb`4$C;Il_{hOe-)p?&I$wTV?CK)44|cf77XdEt*U(QC z`I!hnvnL&SD5QgLHk;6Dwc`J}2zpx|U_Tj(qsY%nH$r68WZXy4zXn`^N&-;O*CF`- zA+riF-L&b%W1iBUgQx#rPkZUFwY`lg_7ps$%unMgK(i)I9J&ZxM-QIraT}aK^`&BH zpsx{Luz0M~3P8sqKXm~{u<&o52#g*)gYC%99q<6UK<`d|M^*jQSApl4B70cr+$=(m zl+hb_n8fyvzyow&tN7VB1hDXhNrXIxhf(hM^(ECtTzWkg#1jOQ+KnK{mfMm8?C@KM+AVt5dk1@L;wgJ5dZ>51c1O10U&U!1u(spae=FTtOVd!>8?d^*^hMw(04@b zyPGpy^&@it1da$`Yare|(%nzsWFn-AkH$as(}wzy46rrO-9FQCa&?&OHl6yg7NECd z#2vg-1&2fJ{a6dY`vqJ=_Nkv&ueWQrZ7o20vxE!MpXlpECP7;Rbam(!)z!0rvKy(T zwss@~AaJY&7{rsH%YLi`pz%3~7a}hEvCe=&ZIgA?kIVrOIKc~W35adcWl^S?QGMo&SLJ#)nr5-nrk$(N^-3!4FQv2Rl^Bmsro9({Z z>z9YNGU;ql`NK2sZ<(#kbOz~P;%)i|l@IhR%lUCy@4wI<`GfnVtlV!aU>eGR)wUI) zcedruTBiAAep1Rc^-z|Ghs!eGd?@&MVvXq`R-M-4g)Y}i%U12ENVz8Vkm(-lWYKxg zCEdB)({cl!ibiy~i}am|T71jhU{k@`hrGGXNS^q@BxkxOzVqvz=@!5cWAJqKb6Mw< G&;$T`HiR+& literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Melee/shields.rsi/eshield-on.png b/Resources/Textures/Objects/Weapons/Melee/shields.rsi/eshield-on.png new file mode 100644 index 0000000000000000000000000000000000000000..9ea7f2796b3e2e9c1b887b0e470eec8188143eca GIT binary patch literal 462 zcmV;<0WtoGP)VQ!Pj5=UwI>0iue;F>hg?MHXS4xl4EC~^Qk%iZO^ z!^L(!;slGMIpQ5q|52bLtjTr&KFc+wxRF$S#pQ^v_{=8C0YF2*w61?1isf1&jFB)k z*WUbJj_iob8z&)LMu`Jp*$NgF=$2PiRWY=+wSoD_jzHE+kpu7nkmbmZAO}$70Fb4W zSWc7!&`Ui?@O}lyIVjj+mV@}$pCN)DNiQ!jDtyUy00_Wx0Vs8Y5*V^0U}}&p2dRVU z0VZH>20VZm2e1GQ`Gd<5Fo0}13;^|k%om`@0l?r30|w;^pke>8I|2dFEN22zl0f}N z6gdFuhzM+szy+X|3jy`n5;B|UTmW^%D&*+EVL1!bau;IEB`F(%q60(&9kLck{RZNH zP$`g)SwZFj)%cTQCRybG(2`&VDuJQdBpY?Wr~{}806p5=#7B#Gs{jB107*qoM6N<$ Eg1`m2cK`qY literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Melee/shields.rsi/eshield1-inhand-left-on.png b/Resources/Textures/Objects/Weapons/Melee/shields.rsi/eshield1-inhand-left-on.png new file mode 100644 index 0000000000000000000000000000000000000000..3c8a2b38091af0f66fa4e676485dff859891ccb7 GIT binary patch literal 833 zcmV-H1HSx;P)^2_)3_Icyp&ayl6-VvDhfn(U)x$nI9 z-M6!QyK@~9#|(hPF#{lR%m7FnGXN6D43H36db;%nn_g9)!&fghBy>Y`s)#lKgWSWW zH*;&z+voSUF7@j)3BFACptT~JJP~C;9^^??@&xT~VnUg&M)E|k0bHJLkaKtLjr2SE z{2^=Wnoy>zl{^t-00#L9o9|`G-=9DE_ubncH?r^Rnoy;yMQ8=|eaSD(O}pK^Ce+p4 zd2mhb=o7&Pa1x7a&$E`3zdbwgm^*zrzT9<9=fN7kqvp{KfrwPtAfjha$Q$L>JE3N_~y3Y>I zJA5TT?G74zC2oapViLy~>=|toO<>&QnLK&lxTU&e0!@fys5GHhfxB3)A2HaU80-ao z_rD24N|K+%-#?1gl_Gc )^(*moFg&kfdxll;1*Zqq+mMWU_(IPfY4@IDXr%-4_0 z-go3fb#tO}h`tPBuqznsAqM*kH!0Xt{9NR_C-E}{gXGr)b=`ioO!XmhAAmtDfdX2( zF7`+a62}aH#4!UPam)Zn95VnC#|(hPF#{lRR1AoHN;A%J#0}ub-r6QejiXWl^j@#V zd%!C(j?Dp(IA(x`XtqjZ@P1!qBBY6r&VL%G3vpNlXowD$$@HU-P8Fleal%kBV7M|w z4_=Xir$f{@DhBYn08L1r#(A>&GD=6qfa0PE4T`VgL$OIvLzIpV-J)v!7sz!xP`;F| z5mo_^I4TB=P)L|aS_3Ps{S@K+07MSAd{ z()w}mkj8I~NU&$o<3L@}eFrYW_doC79 zR)Kq<*=$~{GMCGF>+M!O08;%iol>b(@+`|@U#r!kpppjAQz^nqv)L?{<9Ixh>$+5_ zROs_?pop%c5!C_sG7N*prCMd%Xf)ISM59q!EfzfP^?E#qYPA~M*LIsCnkMr~ z`3$)GJ>~Ox>UO(4H%*f*vZ0CK2T=xP0H`Qiuy5HReIFNktZV=^B3V^M*6qH eAwURlbAWG3va2#);3Iti0000-Asfkn=_f5&1RM@j zFof!szcxJf)7T+*U)zP-VfPe#ly3xOU6X%c&@k(@X7%Dm<~6*E41$^0zR&s3sNl@N z$Rd!y6p?4c@t~&R&p+mAYy}KfECLVsEEvx0Rrob+6aNpOQy4s5{an^LB{Ts5UFAfg literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Melee/shields.rsi/metal-inhand-left.png b/Resources/Textures/Objects/Weapons/Melee/shields.rsi/metal-inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..dfc21c1e58d6cc65efd9ea093eeb850f00231582 GIT binary patch literal 606 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|S$Q zr;B4q#hkaZ9P1M%(GdKw7jd+y0!Pb!*a)x z{_|;@H_y0m*KN|<;sc-lzAb4Yi)krbW_O4ZC;UT$UF$h}r?uNgz5bc4Xd(Ay6SDt`P>F3@ZIe_CpmisXUs^7q?I zW7$ua@4owVk3_6tBd28J2?5o3Mxi%*KSjj;6MefzzSXp-^!$ai8UdBZI~Y@B%o}iz>TwuhzsA+ea ziB#ZalM<`B3A6smAVq-!*d0HTJbu^ON!_@e=;@QOmU%`%U*mqo2@**riQxyn{;uI& pvTj{X`@G2gW1rtLoaK`9nj$UQquae1!c61N(yzMa4da zojRA4#B(MKNWXd0*P_rlxkA0dS?u`%89|0Kf{X~NV724=>%r4shpi4}o4Dxvb|3q- zOfMYPhMnG}>n3<(`N4z*WxHcn)=9BG=o6_36bZjQ{q)nFu{}c1KL3nldh}{}F-O9O z%P+rV9lw~d#KUP#jMs*TA{*}J`5$~GR3LfXymhwc1eF)3S2o;ls@uOlCfDmOTQHZ@ z{%;Z%wd+h-f}Ax&YwGvP+wc9i`<48B`)jpQstTu#&YW5Pr2X_S0g3&4MIN7gANnkB z3PV#{L!V~Fl8H>KE?6+GnXKSwxqzovB%pN(>yHXC&!`4|mxk=*<(C?ye6>VLHg#%5AJDJ#|tdBh-JN7SjKnY6?fSyL7@*e`@9R|-Z7~( zPIErNA!zgHtyzVIjKcZijP17tngU!Se#)Z84Z|5vKL-(hXOnt{=bQnt3SU|{57+-Y zuif!N)?n%prw7&ri@pg|T=~-&@Z3|6{l_zYUvVk1`qhbFfys!$)78&qol`;+0C9f{ AY5)KL literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Melee/shields.rsi/mirror-icon.png b/Resources/Textures/Objects/Weapons/Melee/shields.rsi/mirror-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..22ff0de0716fd619e0af3382118a3e38bc22d882 GIT binary patch literal 1104 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 bRfIYP44D=CAwElaRRP{7a31x?2{-=(frYae literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Melee/shields.rsi/mirror-inhand-right.png b/Resources/Textures/Objects/Weapons/Melee/shields.rsi/mirror-inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..0ce6509226b16e4e493ce6789ed2b0ea0d376962 GIT binary patch literal 2543 zcmZ`*X*k;QnaaUiW=IWluj3BP%Uj1TBWLZ)iR}` zqKj&2d62R6AH>!LV+ckoX_?r!N-81Co6hrom=E)QIQQJ=oO|!{JLmVDdrpRrm%FCA zkvaeXnw}o6eo9UIA_z6*+Tj%TTB(q+9zk&cpvCzjkbDa*W2NoBr|ZFEmr52-Sf4d< z$C#=z{nYH#Ya?ORC_2Ux7UkAniE(PM~j;Bo{)K*N|fYKdXLlH^NR~YqI52xe8o$*|?9L<%Z+>2uX)t-N7 zlJ|COngg>GYVT(^Ii~%VKg?;Eym;iDZ#PjRorey`Ws;YIAKK6_T*%U<4vOs}Ce9b`NvU2LE{ zX0icC(X8Q?E==a?@WF^8tf^6i)$c)z*-!{gKeMb{zBz>;Et0p`y)zptJ- z+}+>Tr~U%8ip8AR{&5v;j|0y#4T@S7RWd@S^jB}r>};idzH!v))7My3^6F$=ADs5O zh8&y;4cX9BqiqUDf8f9xk|AOc05Oi6i;d;Yt=~FmXjp@eTYfTb$9i$3%!ii}5r@9y0y^J+~4+_eVJlHa1i&DY23;%c&UOo1tUQXYRt!m43g$DbCj8u!fQ{t(( z1kxz?Xx4SE#LQ`-nD|+qhXHRQDnr-~po{F+K*(eSG#}P`vaF$(2N7!hBJY8HjlAPa zJf8=uq-){y$_a_4v~d_B0sVwEmBB7bKX-g}lGCH-+MDf@ofaS+MD!qI_m_#oP-k*H z2N-zv&o%`!FRtD}PV}rUkA~|z-XiE|F_)XCyistJ^q4YWqAgf_7rr$T8oUPdgy+5u zPjQKHDQE8eaLk)%>u7xSQCOHMFqT}SpjIMHTeoGDHtBk}LF*S)6dIDrpNB64mNFF= z;-A-v1<217@$XMIk5WP=LN=BHN@h6Hy$iD>@n3I)KVC}Cyr!sa!C(TbIT;ffg2FH| z8QGG*nXRqmAwDr@h9?GKJWQ_56!Wvt+!*!QlPi9oQ{oGX5jSexTV#ug7Ogz~Z6-U| zP<1ef5^kTP^MP;%2yW%st4(k0%Ok#7J*!u-1Jbokw(TI0pxe+`u--==HS7X+f~Pi5 z=h(LG8mn8s`>gZ66b=tCR^EEF5my5pV9y)ovO5<;6LkN4_Lt@w<=(6w#^Nr$wr6?GiEO{wj&yWN%{e?j@Gr!$Y>!eR*1 z7UJSjQyblX0`H0{q7c)&C-UI|%rZE3~4`s+Dd27sqmDU*X8vzAoO zBP-|;%hBh*6+BYDeke#5;X+g9%T2Op4teK;61&eGY7u47gza{KUM|ImV24-rhV{(f zFqph1h|T@9`SG?Osbw-n3#{w1s$xuCd>+d2YpySu5Y$c|ksBBm-xEn|H*iZC*uJ|^ z9n(j4EYxPC$h!o>vi7gL3;p{K|9ATT_rd?e=>suGSo^P~4A$EMH@D+?^49rUv5S$d zFmNyJbpjGMkM%6pilL9$?FJo&P)8?bT|{P?K_t7s{d8ZYV>BLy4M zSFrXM5PjDKS-vK13pl^1AB+JM)_IUWq$ZwW{<47o5c|y0N{WN6+4ioGzA)^^C_^=r zJbRGb3%t7Q%(3tZnS3{5cU-ccL@Df`Y0C0x1x(7=}6w5l61g6G7=R&{010WD}$*${aYI1cYw6&LDj%g>Z{_aB># zdj>q@l6!y|+2nIAg;lrIcR5?q37fNu09w_HH0X@m)Cx%a@-$70IwA=$t6ZU8O%WN~ z1U5u9A(Lf-!1)i1MTZYI9fa}X{vV{64GkP!>G~%9By}RPynBv!`5VYI^u9ca1k38x zT`_EfIm@o2LSLpAsWu_ny$N*#*++E{P}%hz!1UJ9wvEI?lonk%>>e$H;YY39PD|dh z@Vz?{ODlFdAeiOZm;F9!(?-4Y#x61KYTBDJaPN0sTC!@sMSx2q8`{H9$d z3|LxlyDtWP>pI^e+n=2Zr^6Qgv(tUt5$z3967Zc4~;qibimG)4Um-_oEkJm ds4C~9ZUt(zH-DgjrkvaWz|+mkwc0r}<-eG_x{v?> literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Melee/shields.rsi/ratvarian-icon.png b/Resources/Textures/Objects/Weapons/Melee/shields.rsi/ratvarian-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4988d84e43f4ad4ce89d67238440dbd4782a2985 GIT binary patch literal 502 zcmV?ky`lxCxibR%zu=MEHPW_NI#`4hrqXUO~J{cnankcuk;M1TlT z3gG(eNa6e8?I-zn0Eo95hwHJZq7YsH5QPxM+vhbiG0P#iCO7~^r-P>Av(pZBYSLbP z`dv}4vu`g)oB-?{L-gtKOXk^9B+b`gzIRpEFt#H>0F1SwdY!r!A3kTvba0|~ivrl? z_yb}J5R-H%!5!##n;YVjbRnagV?BR+|0#Gz2&@%ZgmJ)5J8Y*oL?Dd97|%F|Jm5Dj zZP*F0-Fx&LwqxfIw;jM34xvmq-Lg>V9(aE-2Z4h2GvC??!0=%wdPiac$NsYg9HSNU zRR944r_i!eEwCZjR|E~crXY%A%-vlyv=uJmP5^{Js@FYNgy1o>#c>P)w3mwr)|$&k zblO?4o#I&IdIFpQwzGg7pe4MD89<-jdjZ%G!*Q16cY_J0ExNZqBSP3P#*xjy`Ti{z sejoUQkcwVN$_fVo2vHFr0#pw03okk`oe~WrJ^%m!07*qoM6N<$g7z%ZGynhq literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Melee/shields.rsi/ratvarian-inhand-left.png b/Resources/Textures/Objects/Weapons/Melee/shields.rsi/ratvarian-inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..0f6bb836f6383c659137bc5035e39782280dd231 GIT binary patch literal 914 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|T>* zr;B4q#hkaZHu_0B3bY*$>RMu0Bkc7L{l)IZB#~nOund@m^w&O!>ESZ};~tz3cB}_p@*3-1_wAey{(}RPhsY5K`w> z=$yT*|wwrIh78arM!ff}$@}=zi z{aWeL7EhxcS{7f-%{I>NQsq|I!Bn;_OkTC#MC$bNe*M#*=kNa~TC-f~LDa;;Y}PBu zJD&o(hEx$u-NLU*P{>|26f3*lE^{ZRyhwEt|~n^=p@D|EA+- zlq4vIe{ys z=B=xbWvc4=WV<)J!Gmjax6yS~1MO={FJc(23SzHo1g?qom3U!zuC~%#WBC=|x;UNf ziF&cZELR(j9sN5?zvRI$iIU03lLea2RPmS{jgpUprjdeHoWQ_IZ7=g>@{e7=HNj&t4Gb-yph7zVRM&iSgy@!U?S}-5E+4 zH%xu|nsdXUFUlGvj9-omeEh%?k@!n+iiYR|sBoaxf#YDs1q-~%yREiteX z$Aw%CGdET+tugq^!F5+P?JHOHWVG7w;^zjh`@op-W+z>AP6D z{cCGW-U%FViNEx)d7jDSvfG=)w-ptL)XYPgRsD8?ZM>Y_O8O7V#nJ$Bde! zoG-HzGOp}=%-H@rTK4h52h%T`zxsFmeLd&(87wy5CG+R7>m1wV{oKy~(HYL|>5mN= z+n6ODOWk+QN%YG~WUyU*G4}U%@8|!L-Y7qN_^slzLELwSo`;GKlVvWSX5GB~?xCfd z3*|pN4-e+3*i@H0_rax|=TGvl(I{KtSt0XZhRLR_`>xMqPO-M-3Ms2Ds@zODu`uUS zWF^Do1BQo8r|_~>^iS|F=vHQm_pluRoF7ToaMXVM$Vj#>#}pN5q42V%ad+?o}~ z;_;0~=hU(C(=%RIZ$07hm1oT)-|*xv&h=uFo%0wMzd7;2N_ff(NrRKu_WwE7aG7~Y z6`RkdNK)qi9-IgfGnoA2t|FRu2vVCS$Y{lU^FYgB;r0kz+%312|clXFxe zrnygipwk>=%dB^E+ zn;Qjc

fiFF4)Tnm(7q^Bd2RX|d;6G>cRG4+y8+KfF7lmEQ!Ij~F~%{an^LB{Ts5 D8O)I$ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Melee/shields.rsi/riot-icon.png b/Resources/Textures/Objects/Weapons/Melee/shields.rsi/riot-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..29b2087910cbbb5b62baa261772c246cea7a161f GIT binary patch literal 383 zcmV-_0f7FAP)VQ!Pj5=WGIl$1~<3B$6^9Oe@(#!!M%N6yk zmdmIc-9#3**H=^l(MwmYWd>6JNpS?pA%Jc_P?|UZWbnz8CmC2-Sux~3efk8JBgJx(9RLaeb8~a7A;8DS z2Mz&{LueKPzd3~%Hf`F3kp@5jWbw6Y*BDrYq)9Q7^la#u-rj&N1}lgTUc7(j@aicT z@>F#IwZW(ZNOr*WV_O?UrIk>`kV`_EIsjD5fojAzPw%5T>J+LPnmK?R3#je@YJ*V+ dj5=V{0RUsPcAKXUCJ+Ds002ovPDHLkV1m?up0NM` literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Melee/shields.rsi/riot-inhand-left.png b/Resources/Textures/Objects/Weapons/Melee/shields.rsi/riot-inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..f4d5743d0d51957ab0210f30beb78bb06f7af9fa GIT binary patch literal 847 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|PUo zr;B4q#hkaZ9W#U-McU@i2>3S1xtYCp`qTsm$BW($8m_7j96tyMI96Y4t`OGm5@cz; z)GZ?D!m_rjtIJVQK(I-`LobNGb1Qc?|4voQC!5$O&e&d>P(Dj*_wTqH2A>^grm6ic ze}4b^-I;r)vuO00F^ITJGjuKHWjK0~t>MuGiGq}WS3bl)j?bPdJ7relmu?OETt%HPlVXGiAD-&?i0_zF++oG)dwzU$53$9iOfOGC|~Pc#0mm5ZF5{OLr< z9p)Ws{Vrw-FTX6@eNpe^-`B={x691ycD?6Z{j=ty*3JLFEtI4$yev7e(uVP{LCxQ= z+|8vj?7#jduq{YC71iou#CZp(d-6$#g#iqwH!ZmS`scArFHKT5N3IB4{ccH9#=G-R zAN;#3y(U~tZ$5whc^%726Za$fOa;^1cW=)-{_X4b+5f%=WE43FF;4ki?02^C$UnIQy=Z}- z!R%1Dg>iw!ErtM@BIZ4nwd-tcpBj4b3RM36oZh|vV`m^8o)LdZ*)K0j{^We$b!>-$TgR2#s zvl>>29++Zrjm>1X?}Gy-zUIQc$GM__5^{_dl`O`GV>sR#Y-KlkBG|B%sUj&t`T%QI zGRuRFP1od3Opto8R`fv+!|i)#BpyOU?AbPkIb2~AdCtegetnwUZtjH}wz9{4u>vJ4 z2i=a!zqZEeN4&31P1ya1J zjFUNr%zO|gnc1Cr^XD;{&HU3KI8p!*94P<@juZd{M+yLf6Dh#Kh2y=r8$Xl^Q@{~% z@y5j(Dgbt-?LYiv_uQeHw|?P(repbd{rQf5(c?)363gY4S2w)%-)isYASTwx3 z*jE2k1|GS4>BLR12*YBX$Tc7+LL8w2B%C%h8`WH}esjig%Vy)NdkxQ^2xqP=x$8n) ztf2zfwhd0Aoes@_WHRYy019Dqo&gBX<$M1%QU-LDS;*(}18V?+6E{s0re{^)5%0H;Y}9J* ze4>c_89Z|SPA*tSHbSM3b?e=;m4S91*?a7CE-u!I+y{)p#0h{KAlw6x_rtEAI02A< z-320%0#wVdb34^NzB=ztkXM2`*dO+n*y}?Dz$YhsB5c}qUwzf^UjrOcHQo%=jr=$~ z>?WQWHSURA14cm#0D>b00Kt(0fZ#|0Kyai0AUIM05F9B02oALX-g9|Y{~@p(gGvD6 zBRG31`wKs3=L^7s>$jKJuw>y&pw56lJ^~%K0T#XlxdzbOOne07-{L-tz<|xq<~b}` z_!6iDAU*=CqyS4^++T7_7QO^30f>(PkIT_FU>F9lK+`n$lp4nxw=aP@190*Po*J`) z^v%MTK%D{TBf!AWH^2()8#4gM8n-WjN&v5qfMo{M>su#OIM%p*3DiG>=p!J$f$aP~ zV8PYpRd*xA!j~ZT0U$V10NM`FN3d(=DEY{ACs-}N9edwY0uUd;)3pb{5^w)pJq{z= p;Ui!VQ!P3{3~5WEB3#B{yeAKO;>Y0J2<$_a|O? zQXD~&17Mb`8>lnL%NQ^`d~yLU2j^e7Ns=Q-4uL11*%?fDI2pvm#Tnjx;Dn3A_#k;w z0MQPB`Q9@;gW>hl6FAkSrX(_KUpa&5P#Ai-;NH#s47@y?c;#v8fM4IgGrR@jqpvrh zh@%Xfy?uWk};9?1?+Qg_5#5`yG!UZ8;kK*cJkc%40GK7+HZ0#-F3-){iQ z15*S8%_<{URs8DZOR$A70OG^sNvV)XasVt8Kvgb!FvIvD%W2jgKyd^fc~Zh26=N0q-0000YtfAEdWELk3$vDOy~36hcS>dU*}O8d-)T2D{B9OVORqRn zW4!x!+PCb+^PDUVaGWTdQ1dA7;F>(Uj~@iw_qaWZIH<%>y3Kq~`1X5#&(A*c^}nm> zbKW*h^x#H@MVmi1S|sgd{xL63`})+=*_xSxE_)*CMe2*KGx*Cx{_3lwaU~1$-*8EY zWPBN;t=D?%f^hGn@AJ2PDh*s#wOfL>t|;qT^!A1sYo)iVP5Alo*p|C*KN{N9&)N{f zsuZ_G{mH2Zoc{Y*??~AkR5~#Iig$~1Zt3f{53W7n6l47N_T8iKkJ~3juG+Ou|MaAr zH`rc0XX;};Q5Jjr_}+7_tIK}JeiVEX=XuonQmsIKSy6>ZSD_9=X<0!=!SPkGMV31| zOx&J4ie1_H{Y`D&!)Hf7NX+>7#QB1+4EKipJ57UT#del``grf!kzm8$Ey;|#Ht7pw z@<#IMO}^{Kca2lpMe%SP!@oB|{ zlxD8YPSZpKUT&$hO}Fv8A*A^3v6krZcsG`r3N?NT4A}8y&IPvW4{jJ~Z#=Q$*6GR4 zEGsPB-&pzg1SCxiOiWeGiqSBeqn@@QDurXOZ`$Xc1noSYnzqr z+G3LWmqYRy-XCEvRu(P1Q94iJVAe#%FJ_WcLF|WJu5H}8b&1C-gZRU`dm>m@2`M_gcG~#b#<1zC zlC!MvHVM%sC3+&(KsQF{8ns-m-XvFY?7>N4#l1^im+o%1-j=Rwly@;?<^rx7{R8#? WJlR*IFZ%+@&J3QeelF{r5}E*l?8ry} literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Melee/shields.rsi/riot_bullet-inhand-right.png b/Resources/Textures/Objects/Weapons/Melee/shields.rsi/riot_bullet-inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..468f4ea0894882f8d9dbfd112f0c661fe64819fc GIT binary patch literal 1035 zcmV+m1oZofP)3W?{xkF5+b@EUV+26RF#;gu7y%G+JO$_XUb7nSj@vKZi0H@E_+(cSiS{mho}Vq(mCLhP?L-($-7ftq{6u3c3Vw?Z zInQ{788Ba{$El_U?2E_o{YOK2KPywcZuAY@vKu!#GF0M4@S{Qi*83N)3?TpIh37$6 z`}^?dK?*wF3fBkk)bS#;*)>IBygTwOAQAx!Md5FS0({IqMXad-UQoU6@FI926yW#D z3cgvN>HK8He!i?bdFpkKo@clOSZcX|x2w(L)lR&9hK*%uyAmkVU5ORzF2suUogd8IPLXHvvoNEU`O{0UlhO_{@n}l2%^p_MA!aF}y z{w*&hfYVJv@QxByxZElV9V*fpz}zGR?Xygc{j-KSU1eX1NP zQUZ{hgtnWGk`kID>+4X={&?$pN}TZ~w@K-9TUl|w};Sdp7#c?QZ^o=J5ifDY$ARSp&D-ePVNf_IdtB60Lc#ko~F zRHOx{<|YXOl@66{3&6WcSQZ355K`?>kVQ!P3{3|pMx_16C3k&Y=R8-y^_URVQ{gYi2_bOhOHpg@>`K|w|ug-;G3+5yP%4zjp%(M(hY zCoeIyo9i(!TzUjoPfRF~6at{&pYCPJPzkhbF{}6jbotnmml8noncEl`{@=Svl$j(s zAgizl?DMs}vY$kS`7q>HzhS)-dh(JANZr)jbm}{R7JwuN@a|p1@X9-#A$aRdzQsSp zG2~-^zf=LqgVfQ)0iD1ER?7g)YHz(2j%CgznAb z442g{8K(93fyEy@c}kL5Bs<`&O^D?nOOa`iI9UEtAMG44;VlD0Ezpf9@Md6o7o4rH)7speO*z zv(X|7K*cJkcx7!!XLu0c3XTGhrJyVaO9!ARV4afA@SlPBYMJB^02Rj_8+J1=CN{$J zJD9eQV(6G(50)pk7$(^PuuuTE2M#Vni|b`@%W2jgKz0N^c~Zs}4`pdYAA$&J^pY=8(332I)cPdEwtWa`F32v`;v(CeyWVvi zXLe_H?h%)n-^=dI8P3l6&%Jlp!U*c?XyusOm6sBUgc>BYW|4i$;W zmrtHt2oV5pwy35qYuwDu>*cGt-kS>Fxhhly%L4G5y;i>qZtrV?u1{l`7(ea-<09~U zo+=4SBsU~tOPLrRdxjpTKDV6{CW6p0;F1@hYDeXoW2<1%oM7|W&D8~z{S*uDd@;E8 zf?x>lHq--zzGtq_)(VvQu<+#Uzf5fEYP;~_5z8$Ao9n}4jnF9rjGlAp%#pv zp8!aOXAI>lt1o56^L%?Qo@@moEDO+a`3igTkMVO=0S z&`q*2VeiZ&OxHESz`Z_pKJs(cbUqXztT=X6ZUqX22oOKg1Td2>9*b6f;&~Pi^;!B2 zia7uxM1cM%K$rZK2PV=_d>U3-ge(Hi5c^93++Z9W2b2>aN`wf2eVokzHTpT8=hI=M zY*g`x5CL$`|70QE1@NhN)UA#O*aa}|Hqixm3uqX9p5jfPVj+ZB5&);QIDK{93_#?> zQPu^pXnf`IaR9r3>wW-Ikb61H^TlxVJA8n>5l{pk4}*Awv;dsGcE5fLMXk3o?|b%n z=nQl}y}{x}roqa5vG*TAl0~4#vH<+4vGx0h5mjFw$rNvNKR}reTR#>Jkf&8B126+&J!)j zEi$69;ylrU%pyZUzRr_ukXdA?u;M(?g3KaA!RkBTyz@j4VvCGeaF1bA?g*(ZEtKvK n(YZIRMP{QYsKpQkwin<(f}ksEOfAJE00000NkvXXu0mjfcO(8- literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Melee/shields.rsi/riot_laser-inhand-right.png b/Resources/Textures/Objects/Weapons/Melee/shields.rsi/riot_laser-inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..f29fe962d9e4a7daf2cd4272003a417dc81a0094 GIT binary patch literal 1141 zcmV-*1d98KP)RCt{2T1{vZK@@(WO^8B*5YrywPg@E(h*i9l9>jxq(Tkc2 zMF^$`8!aem4^pA12-+T6i)ghKsahxnTlHcuq97hh5Jb0lC`eO(0yZ{K5|q#q;=V~X z-Rw@bO?OtN?0%R1nc3Z$Z{B!uLY`C}*w^X*p%v*ZZK*52tUFXaPCU+N-hvH2?dDo1jzd?1;Vkv9dfE5kgpg zb`l^vI|Dr8W5*fWmpd-@3S)WrMYiG(8=i2ZOQ3GuZMU^b`-aJ?Ca_>nLKUJbfO($%U5g3I&u zSdR60hbyqZRg4FrjH?1Nve`in6#+eBfa?Nrs!RNVpl3d$EMFAwlc_Kt2zdhrK#T#> zHMZC56Jvm|K&@ZW1#*FIio}H7GgC0_Z-Rl_edPY!&lvCuyBPK5K;PE_m4MX2W`LPo z=dsiBBi<+FLLcx5oCeFOPbHu~0njCm^1x(n#HS%|5h4kgA@+-;I$+}#4+oVoxmh-Png6s5&$wg5~M zFUcxaR6Pwem4wR;B#4wLC>4-I7WU~jT@40KajFDFNQE3?tb|i zY^~P|^F28pI0@auS4laqX|Nnp=e63aB0#bNvLEnnRN?ERg_lJ+-4s#I_p7y+Y5@`n zr9Kknct?mf(q-=mt@aSlD7W3#VhBtQivTb=ECRsfum}K?!y*7o4vPRVIV=Le&`p3+O(NfvWCf-2gXM2|T?EM0BnU}C!up@FQmw*Lp~5T%;Qs<66(o{c zh4pW_brYaclSBlfATa`iu>?R~t-@NNqRRqkYLd-P$MITV3lwYoO)ovibJhwKT?Ek7 zB)>9CabS$h7H52CMehAX@evW+tQ0C%9-!x8nwms(fhu5(ip6x*w{()62bbsFEEOuc z2%xG-mVr3}sUK+nVg!s*sOTaV$?UR#SoYrrYGPZUw}QnKNVsg00000NkvXX Hu0mjf%ANOJ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Melee/shields.rsi/teleriot-icon.png b/Resources/Textures/Objects/Weapons/Melee/shields.rsi/teleriot-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a3a42435dd9957d89474b7fc209d40cde3d6054d GIT binary patch literal 352 zcmV-m0iXVfP);0Qa|I7smM#1Mj0fEvLRWkZnkBNC zFaW|_MNycls-JI|a&=v2X`1q}PzeJt3{HS0Nx~31`?VW}VSB$JRvgEY yVHgDl!mwXn6AiBgs2kKMpvfWt0SG{Vp99`VMr=(Wt;}Np0000&uTrVdcs!-Bm)m?!!Y{R*+<#L&(( z7eOxT`-h*Ua^=EQ8{^Ti`TFv-6{2^1dft4vzuwO4AGVGHJ_YiC+w-3J>e=@JQztZ9 zQy};dyg(KCJND9@q1pYm0hj|0Y0>H8S4=)iPisfE&$2RStEZ;8)Otz865J z0Q%UfeGF#OCozhgWB^4@GJql{89Z<^e!&ZI#|+T8_ifJ~EX5t4Ryfg2#x+Z3>_oI1j6xrT_qVa#W_ZNs*Auvjjc@oV2#;Nf7b6tuh6)KZYRn(C hoMZq+PBMTZ=L`E)(C3&})QSKA002ovPDHLkV1jP3Pv8Im literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Melee/shields.rsi/teleriot-inhand-left.png b/Resources/Textures/Objects/Weapons/Melee/shields.rsi/teleriot-inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..e2e170d529e52cdf3c1906b3440954eabf806dea GIT binary patch literal 658 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|S$b zr;B4q#hkY@_j@S^iX5{y3|`_nS*gY0jCIaLziks)w_i@n*(y-OasPnVja0#HH@q;rih%aQLbyl9)A=6cRjj)=OvpsGe!1QCC23(dDn0; zW6QN1v(2|x+rNJIy#2axh}QYvr=AslJl=jgsN)>VQugWRC!bR{6K#V9jxfX184TFM zZ3*-JRcm!ibK8cZy8xwEx<&^;OXk; Jvd$@?2>>Vp9;yHU literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Melee/shields.rsi/teleriot-inhand-right-on.png b/Resources/Textures/Objects/Weapons/Melee/shields.rsi/teleriot-inhand-right-on.png new file mode 100644 index 0000000000000000000000000000000000000000..0174ec54bc5ef28e7f259a0520664947dc89a2a5 GIT binary patch literal 784 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|V0` zPZ!6KiaBp*DdyaE5NZ4G#qFWq>Jps5>~=`KH&oemsvFz14Ou~s))sLFdk$?|5M+9z z@!+CKnmR$19*%6hK03LKj5qhbh%4!RQyhCg`uwinOJ3;pz58_Uef4=e`~40NTo?r` z0vTBRL>L-{SsfmTa9w!+efpJiX`9y`m#NR2mzBSc!6f7T;pO+Y+pjOHU=sd&`;xlg zjcKdCML9e0?g>7-SIXwf{q>=rqiW+02A?>l^-YY+AwAyII%`t(SIe-!v9*7AZJvGl zlCosh#fQ_^yRW*dyLo#6Ls-yi%QL@u2zXfFS37%es$#*~-N`RRFR1YR=HAGa za74&7`D^W34Jn4!X1^D$-)%sBsiXEGP70(&LvhRrHn zxkmB|f@j{Rew!A@nz5m8A-m;+YoAv$9R6m#lgmW)=gcWLb9|ew?5o}WfBWUPf#q|S zp4@(N{p{R|Gsm0H*Von9SD&nX+J5!kC4mck_B$j$S+bmnyT`xc->Vtj0t!-v#z%f~ z^=~l^XSij0@m;6-liv)%CugSLPMo|aB{tLg40DF&Oz-82=fXE#mtwNBj&cc|{aD!$ z9uX+fBkhC%}&1vQrhrYD78{u@j&XA)0c%k6e6ds*KLS&YgY(L{dtQi zXUau)fde%U4}QIz5w5tQs!B(ONy$R+fQ9xW?E_!$=oKB<)w6DsvC0IU)7Qlg=q&bD zgzBH(^lX~eY3tow9{Y?Bq}#@^vJ^~WS-I56s^!F`CwoI8??rNW>@z=5d|W_a!8C^1 zsU;jrp)=R*WimVUVo`aM(Cu7xMTNfxE=B)-c<_J|6UYz$88Y^qoW(!s$~s^YXYh3O Kb6Mw<&;$Sg&RiV; literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Melee/shields.rsi/teleriot-inhand-right.png b/Resources/Textures/Objects/Weapons/Melee/shields.rsi/teleriot-inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..9d56b04c188527311d1786be6c0070d0198644a8 GIT binary patch literal 667 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|S$< zr;B4q#hkY@_hv~uinR87YztWI)+)dh>C1Ih@6IfTSvyQ-l)gTe|IoZ3wZo82T(fCb zi^xHNOFK7Q6kaiv*NJ1HTd%;OoM#;Ul09jH%Ko@cAD;gXz4re5;%N!V<{$6^QuVKHDUBP_gM=j9Z2ev;wzdrr+$}ffQA6zt%-|_a%JKKAI{(XFR zef#GU3mLb+tQ*ceFMe|L^<2isA9sYTzizCS!?*ozwxRm@8M!rg(r1h3zw;{i;pTSp zXm91*AElZ+4_7c?4>VB*h?L0N2lZ1=JKtSCp<%hvufL_wle!t(CT;MW`8)pR5#@sE zDksI54k@kOJN>3v)%rtBcZ_yPO13DZMDE+bu)RmFYeMQzkYJU@jq(+nY7!aqByB~? zt~gJ5%FX%U_Kh0GH`2R`E329W3<`_qPl*nh?|7);$IPUHXCDL@D_&Wjh)P!0K6s&f j!GyoBgCtO+bKn#XGsR1bniKf5?>?cebt4fLnOM(acTZ#*d zM+S#VsI4fzK;*JwO#>4$aME)GN3gTK&$o*1drD@VEq9=-1mJ7f7fn) literal 0 HcmV?d00001