From a7990bc06aa91602a28d074d326b0f8c5d2f3019 Mon Sep 17 00:00:00 2001 From: Spatison <137375981+Spatison@users.noreply.github.com> Date: Thu, 26 Sep 2024 04:56:42 +0300 Subject: [PATCH] =?UTF-8?q?[Port]=20Small=20Energy=20Crossbow=20/=20=D0=9C?= =?UTF-8?q?=D0=B0=D0=BB=D0=B5=D0=BD=D1=8C=D0=BA=D0=B8=D0=B9=20=D0=AD=D0=BD?= =?UTF-8?q?=D0=B5=D1=80=D0=B3=D0=B5=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA?= =?UTF-8?q?=D0=B8=D0=B9=20=D0=90=D1=80=D0=B1=D0=B0=D0=BB=D0=B5=D1=82=20(#6?= =?UTF-8?q?0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add: ebow * RU Loc * Update BlurOnCollideComponent.cs * test --- .../Components/BlurryVisionComponent.cs | 4 +- .../Collision/Blur/BlurOnCollideComponent.cs | 8 ++++ .../Collision/Blur/BlurOnCollideSystem.cs | 37 ++++++++++++++++++ .../Knockdown/KnockdownOnCollideComponent.cs | 10 +++++ .../Knockdown/KnockdownOnCollideSystem.cs | 33 ++++++++++++++++ .../en-US/_white/store/uplink-catalog.ftl | 5 ++- .../objects/weapons/guns/battery/ebow.ftl | 2 + .../ru-RU/_white/store/uplink-catalog.ftl | 5 ++- .../_White/Catalog/uplink_catalog.yml | 17 ++++++++ .../Weapons/Guns/Battery/mini_ebow.yml | 36 +++++++++++++++++ .../Weapons/Guns/Projectiles/bolts..yml | 31 +++++++++++++++ Resources/Prototypes/status_effects.yml | 7 +++- .../Guns/Battery/mini-ebow.rsi/bolt.png | Bin 0 -> 4819 bytes .../Guns/Battery/mini-ebow.rsi/empty.png | Bin 0 -> 548 bytes .../Guns/Battery/mini-ebow.rsi/icon.png | Bin 0 -> 616 bytes .../Battery/mini-ebow.rsi/inhand-left.png | Bin 0 -> 352 bytes .../Battery/mini-ebow.rsi/inhand-right.png | Bin 0 -> 356 bytes .../Guns/Battery/mini-ebow.rsi/meta.json | 28 +++++++++++++ .../Guns/Projectiles/ebolt.rsi/bullet.png | Bin 0 -> 182 bytes .../Guns/Projectiles/ebolt.rsi/meta.json | 14 +++++++ 20 files changed, 232 insertions(+), 5 deletions(-) create mode 100644 Content.Shared/_White/Collision/Blur/BlurOnCollideComponent.cs create mode 100644 Content.Shared/_White/Collision/Blur/BlurOnCollideSystem.cs create mode 100644 Content.Shared/_White/Collision/Knockdown/KnockdownOnCollideComponent.cs create mode 100644 Content.Shared/_White/Collision/Knockdown/KnockdownOnCollideSystem.cs create mode 100644 Resources/Locale/ru-RU/_white/prototypes/entities/objects/weapons/guns/battery/ebow.ftl create mode 100644 Resources/Prototypes/_White/Entities/Objects/Weapons/Guns/Battery/mini_ebow.yml create mode 100644 Resources/Prototypes/_White/Entities/Objects/Weapons/Guns/Projectiles/bolts..yml create mode 100644 Resources/Textures/_White/Objects/Weapons/Guns/Battery/mini-ebow.rsi/bolt.png create mode 100644 Resources/Textures/_White/Objects/Weapons/Guns/Battery/mini-ebow.rsi/empty.png create mode 100644 Resources/Textures/_White/Objects/Weapons/Guns/Battery/mini-ebow.rsi/icon.png create mode 100644 Resources/Textures/_White/Objects/Weapons/Guns/Battery/mini-ebow.rsi/inhand-left.png create mode 100644 Resources/Textures/_White/Objects/Weapons/Guns/Battery/mini-ebow.rsi/inhand-right.png create mode 100644 Resources/Textures/_White/Objects/Weapons/Guns/Battery/mini-ebow.rsi/meta.json create mode 100644 Resources/Textures/_White/Objects/Weapons/Guns/Projectiles/ebolt.rsi/bullet.png create mode 100644 Resources/Textures/_White/Objects/Weapons/Guns/Projectiles/ebolt.rsi/meta.json diff --git a/Content.Shared/Eye/Blinding/Components/BlurryVisionComponent.cs b/Content.Shared/Eye/Blinding/Components/BlurryVisionComponent.cs index faff4b9e52..bebc9ac697 100644 --- a/Content.Shared/Eye/Blinding/Components/BlurryVisionComponent.cs +++ b/Content.Shared/Eye/Blinding/Components/BlurryVisionComponent.cs @@ -15,13 +15,13 @@ public sealed partial class BlurryVisionComponent : Component /// Amount of "blurring". Also modifies examine ranges. /// [ViewVariables(VVAccess.ReadWrite), DataField("magnitude"), AutoNetworkedField] - public float Magnitude; + public float Magnitude = 4f; // WD EDIT /// /// Exponent that controls the magnitude of the effect. /// [ViewVariables(VVAccess.ReadWrite), DataField("correctionPower"), AutoNetworkedField] - public float CorrectionPower; + public float CorrectionPower = 2f; // WD EDIT public const float MaxMagnitude = 6; public const float DefaultCorrectionPower = 2f; diff --git a/Content.Shared/_White/Collision/Blur/BlurOnCollideComponent.cs b/Content.Shared/_White/Collision/Blur/BlurOnCollideComponent.cs new file mode 100644 index 0000000000..95685e3051 --- /dev/null +++ b/Content.Shared/_White/Collision/Blur/BlurOnCollideComponent.cs @@ -0,0 +1,8 @@ +namespace Content.Shared._White.Collision.Blur; + +[RegisterComponent] +public sealed partial class BlurOnCollideComponent : Component +{ + [DataField] + public float BlurTime = 10f; +} diff --git a/Content.Shared/_White/Collision/Blur/BlurOnCollideSystem.cs b/Content.Shared/_White/Collision/Blur/BlurOnCollideSystem.cs new file mode 100644 index 0000000000..257dc5bd74 --- /dev/null +++ b/Content.Shared/_White/Collision/Blur/BlurOnCollideSystem.cs @@ -0,0 +1,37 @@ +using Content.Shared.Eye.Blinding.Components; +using Content.Shared.Projectiles; +using Content.Shared.StatusEffect; +using Content.Shared.Throwing; + +namespace Content.Shared._White.Collision.Blur; + +public sealed class BlurOnCollideSystem : EntitySystem +{ + [Dependency] private readonly StatusEffectsSystem _statusEffects = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnProjectileHit); + SubscribeLocalEvent(OnEntityHit); + } + + private void OnEntityHit(Entity ent, ref ThrowDoHitEvent args) + { + ApplyEffects(args.Target, ent.Comp); + } + + private void OnProjectileHit(Entity ent, ref ProjectileHitEvent args) + { + ApplyEffects(args.Target, ent.Comp); + } + + private void ApplyEffects(EntityUid target, BlurOnCollideComponent component) + { + _statusEffects.TryAddStatusEffect(target, + "BlurryVision", + TimeSpan.FromSeconds(component.BlurTime), + true); + } +} diff --git a/Content.Shared/_White/Collision/Knockdown/KnockdownOnCollideComponent.cs b/Content.Shared/_White/Collision/Knockdown/KnockdownOnCollideComponent.cs new file mode 100644 index 0000000000..20ed5f8dce --- /dev/null +++ b/Content.Shared/_White/Collision/Knockdown/KnockdownOnCollideComponent.cs @@ -0,0 +1,10 @@ +using Content.Shared._White.Standing; + +namespace Content.Shared._White.Collision.Knockdown; + +[RegisterComponent] +public sealed partial class KnockdownOnCollideComponent : Component +{ + [DataField] + public DropHeldItemsBehavior Behavior = DropHeldItemsBehavior.NoDrop; +} diff --git a/Content.Shared/_White/Collision/Knockdown/KnockdownOnCollideSystem.cs b/Content.Shared/_White/Collision/Knockdown/KnockdownOnCollideSystem.cs new file mode 100644 index 0000000000..dafce97c2e --- /dev/null +++ b/Content.Shared/_White/Collision/Knockdown/KnockdownOnCollideSystem.cs @@ -0,0 +1,33 @@ +using Content.Shared._White.Standing; +using Content.Shared.Projectiles; +using Content.Shared.Throwing; + +namespace Content.Shared._White.Collision.Knockdown; + +public sealed class KnockdownOnCollideSystem : EntitySystem +{ + [Dependency] private readonly SharedLayingDownSystem _layingDown = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnProjectileHit); + SubscribeLocalEvent(OnEntityHit); + } + + private void OnEntityHit(Entity ent, ref ThrowDoHitEvent args) + { + ApplyEffects(args.Target, ent.Comp); + } + + private void OnProjectileHit(Entity ent, ref ProjectileHitEvent args) + { + ApplyEffects(args.Target, ent.Comp); + } + + private void ApplyEffects(EntityUid target, KnockdownOnCollideComponent component) + { + _layingDown.TryLieDown(target, null, null, component.Behavior); + } +} diff --git a/Resources/Locale/en-US/_white/store/uplink-catalog.ftl b/Resources/Locale/en-US/_white/store/uplink-catalog.ftl index 44ce8ca0fa..b4edcee7dd 100644 --- a/Resources/Locale/en-US/_white/store/uplink-catalog.ftl +++ b/Resources/Locale/en-US/_white/store/uplink-catalog.ftl @@ -2,4 +2,7 @@ uplink-emp-flashlight-desc = A rechargeable device disguised as a flashlight designed to disrupt electronic systems. Useful for disrupting communications, security's energy weapons, and APCs when you're in a tight spot. uplink-betrayal-knife-name = Betrayal dagger -uplink-betrayal-knife-desc = The betrayal dagger allows the user to teleport a short distance, and also causes significant damage when stabbed in the back. \ No newline at end of file +uplink-betrayal-knife-desc = The betrayal dagger allows the user to teleport a short distance, and also causes significant damage when stabbed in the back. + +uplink-ebow-name = Small energy crossbow +uplink-ebow-desc = A fairly quiet weapon that automatically reloads and stuns. It goes well with other types of weapons. \ No newline at end of file diff --git a/Resources/Locale/ru-RU/_white/prototypes/entities/objects/weapons/guns/battery/ebow.ftl b/Resources/Locale/ru-RU/_white/prototypes/entities/objects/weapons/guns/battery/ebow.ftl new file mode 100644 index 0000000000..a8c7d268f7 --- /dev/null +++ b/Resources/Locale/ru-RU/_white/prototypes/entities/objects/weapons/guns/battery/ebow.ftl @@ -0,0 +1,2 @@ +ent-EnergyCrossbowMini = Mаленький энергетический арбалет + .desc = Стреляет энергетическими болтами, которые отравляют и оглушают цель. \ No newline at end of file diff --git a/Resources/Locale/ru-RU/_white/store/uplink-catalog.ftl b/Resources/Locale/ru-RU/_white/store/uplink-catalog.ftl index 5953a18549..025ac86b8e 100644 --- a/Resources/Locale/ru-RU/_white/store/uplink-catalog.ftl +++ b/Resources/Locale/ru-RU/_white/store/uplink-catalog.ftl @@ -2,4 +2,7 @@ uplink-emp-flashlight-desc = Замаскированное под фонарик устройство. При ударе выпускает ЭМИ, поражающий электрические устройства. uplink-betrayal-knife-name = Предательский кинжал -uplink-betrayal-knife-desc = Предательский кинжал позволяет пользователю телепортироваться на короткое расстояние, а также наносит значительные повреждения при ударе в спину. \ No newline at end of file +uplink-betrayal-knife-desc = Предательский кинжал позволяет пользователю телепортироваться на короткое расстояние, а также наносит значительные повреждения при ударе в спину. + +uplink-ebow-name = Маленький энергетический арбалет +uplink-ebow-desc = Довольно тихое оружие, которое автоматически перезаряжается и оглушает. Хорошо сочетается с другими видами оружия. \ No newline at end of file diff --git a/Resources/Prototypes/_White/Catalog/uplink_catalog.yml b/Resources/Prototypes/_White/Catalog/uplink_catalog.yml index 4c1e4b0a60..43f9330c03 100644 --- a/Resources/Prototypes/_White/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/_White/Catalog/uplink_catalog.yml @@ -24,3 +24,20 @@ tags: - NukeOpsUplink saleLimit: 1 + +- type: listing + id: UplinkMiniEbow + name: uplink-ebow-name + description: uplink-ebow-desc + icon: { sprite: /Textures/_White/Objects/Weapons/Guns/Battery/mini-ebow.rsi, state: icon } + productEntity: EnergyCrossbowMini + cost: + Telecrystal: 10 + categories: + - UplinkWeapons + conditions: + - !type:StoreWhitelistCondition + blacklist: + tags: + - NukeOpsUplink + saleLimit: 1 \ No newline at end of file diff --git a/Resources/Prototypes/_White/Entities/Objects/Weapons/Guns/Battery/mini_ebow.yml b/Resources/Prototypes/_White/Entities/Objects/Weapons/Guns/Battery/mini_ebow.yml new file mode 100644 index 0000000000..e6309f652b --- /dev/null +++ b/Resources/Prototypes/_White/Entities/Objects/Weapons/Guns/Battery/mini_ebow.yml @@ -0,0 +1,36 @@ +- type: entity + name: small energy crossbow + description: Shoots energy bolts that poison and stun the target. + parent: BaseItem + id: EnergyCrossbowMini + components: + - type: Sprite + sprite: _White/Objects/Weapons/Guns/Battery/mini-ebow.rsi + state: icon + - type: Item + size: Small + sprite: _White/Objects/Weapons/Guns/Battery/mini-ebow.rsi + - type: Clothing + slots: + - Belt + - type: Gun + resetOnHandSelected: false + fireRate: 0.4 + soundGunshot: + path: /Audio/Weapons/click.ogg + - type: RechargeBasicEntityAmmo + rechargeCooldown: 1.5 + rechargeSound: + path: /Audio/Weapons/Guns/MagIn/revolver_magin.ogg + - type: BasicEntityAmmoProvider + proto: BoltEnergyCrossbow + capacity: 1 + count: 1 + - type: AmmoCounter + - type: GenericVisualizer + visuals: + enum.AmmoVisuals.HasAmmo: + base: + True: { state: icon } + False: { state: empty } + - type: Appearance diff --git a/Resources/Prototypes/_White/Entities/Objects/Weapons/Guns/Projectiles/bolts..yml b/Resources/Prototypes/_White/Entities/Objects/Weapons/Guns/Projectiles/bolts..yml new file mode 100644 index 0000000000..4bf6ad8722 --- /dev/null +++ b/Resources/Prototypes/_White/Entities/Objects/Weapons/Guns/Projectiles/bolts..yml @@ -0,0 +1,31 @@ +- type: entity + name: energy crossbow bolt + parent: BaseBullet + id: BoltEnergyCrossbow + noSpawn: true + components: + - type: Sprite + sprite: _White/Objects/Weapons/Guns/Projectiles/ebolt.rsi + state: bullet + - type: Ammo + muzzleFlash: null + - type: Projectile + impactEffect: null + damage: + types: + Poison: 15 + - type: Reflective + reflective: + - Energy + - type: Fixtures + fixtures: + projectile: + shape: + !type:PhysShapeAabb + bounds: "-0.1,-0.2,0.1,0.2" + hard: false + mask: + - Opaque + - type: KnockdownOnCollide + behavior: AlwaysDrop + - type: BlurOnCollide \ No newline at end of file diff --git a/Resources/Prototypes/status_effects.yml b/Resources/Prototypes/status_effects.yml index 37da86f6a8..0c29d79d5c 100644 --- a/Resources/Prototypes/status_effects.yml +++ b/Resources/Prototypes/status_effects.yml @@ -60,8 +60,13 @@ - type: statusEffect id: StaminaModifier -# WD EDIT +# WD EDIT START - type: statusEffect id: RecentlyBlocked alwaysAllowed: true alert: RecentlyBlocked + +- type: statusEffect + id: BlurryVision + alwaysAllowed: true +# WD EDIT END diff --git a/Resources/Textures/_White/Objects/Weapons/Guns/Battery/mini-ebow.rsi/bolt.png b/Resources/Textures/_White/Objects/Weapons/Guns/Battery/mini-ebow.rsi/bolt.png new file mode 100644 index 0000000000000000000000000000000000000000..70451918e4ff871d1c89cc764d505d1302965103 GIT binary patch literal 4819 zcmeHKX;c&05^g{RcR&~s8EhjeTPNu(kVGO|05cfb6&w^holb~kBWWPuHiLTHK~xkR z7&j0Y6czO;qBst2C{F>`QE>r5+yKwviQ+QvCZOVZ^T%`E{3GXdy8BkuS5;rtt>mr= zofR~4nEfyaf<_8w2*SY~He41%z_%_ftqX$86lsysWH^=rYqV;qTtUEOs)m3Gy<7@G z`a3VT&D+}SJYwa8m;lWyT3j% zt4GH!F0k9Zy(q8YXSddzik(dtQnT}~S*29bs!nviuXAkwe*F|*mnVCQ65j96Z#R{N zgbDZBFGV^(+EwMMV%J1Hqd_8gNhksdncN{EF zOSqBHc}>UCA8>26YMtn0uFbj(#dw;#6t`U&XC}WDH6qpKwENHg^WQ#QN<_1^mAq=% zY3|x>e@Zp_>Jdtu|KpmPr}L{6qYDm{C~hsw<@Q81UwD1KD3bH*${#Io`}0vV5AA&oog(d2D_6YSlI2i&0(0xy^Sy0J*pwkj#GU-*k4o9uXl;pX9932LBq7n(@_I{)EoEHB{vttCPpb9BA&6bE z^Hn>i=i8vz6(zRkH~s__Pjq#z$7%xy1@R!;oGaE9=}?JwRhC15^=;09l2>E)@V8{w zJJe-Vk8p~#rquctL$lYf{eagWTD5jQk+qwl=bfv#}zPO3M(yYkZZXw`gw<(O%EG~EAK3MTZd8vD9@e)5A$ouwHmmow{v z+Ww+O29*-SM$KC6voFNEImW7X$=0gfyylaa^gBXaf3OI7Sy0_N)6B$`T`PUl4%^S$ z9@0^lmu;2LDBb1O&6T(W(=6Xn#=M+T&N7`of8Y5UhSUAp^w@bjCJI}NZ}!-o>RPdI zf=-Z!-svpd{pN7_{2ir^8k>$wJGM^PW$-_#t9xbVva>I^@6COicYD1z%UKFRCd=ji z{-HvD|4;i4?6$lmS^OE*J`U&NBGyrCS0!5}UJT85U%i&R?rO8kuh@2O61}2p_;!|) z3pFD>;mn!LbH6QLcerd+Svvg2q^a$3K^tZAN1Dr#)vq2NpU~0HZ@+KiclZ*kRAyR7 z-mNXzB&MEreO*NvWMbt6U#w-cI=PH|@G2=2itA|dy8PF@9k>q?J;Gx3*~7JTWz)!} zT+!W!Cqo9IK6am>b6YC3k9u^}0gp>=QZJq7C}(oV^Qq zEyKB)QCEJSd-R8SPgN9OUu7~;BdNdt*RuFx$ZfU~>?-xCj zwJwi;`zZ@IVaIQr=ly2F`}UizvqWjaM^2V$iFuh}J5$ESvmKtiyPY_9s!!**;|?RnG_Hr-=qeU}$xLQfYBx*51 z)hjh%OhS;Cw_bzc2?Pm?37K5Qr*u@FroeIupE8FnqKh>CM7(@PnwE%2n-z(tCE#2M z#e4cNFFg+cCz9SF2zHCMH%Vk$egT$l*`%DK#R|XLyyaj|IR7O^<14D3wlADrx;K zbYws>0Ofl>tfu zpgg1~lf%Ts2r0qs*wvph_M-g{CtgN{eq#XG z^{#>O0;U!1^SJ8c%s}Hm`01;~Kj;BK4><{ zztJ`9%Ylbbfqy|M;5f5k%ZAC|C^SSI93(IvilDdtmCL}>P|b`O9R!U!Yq(6Z-A0WE zi{_+I6ky&u*mMjRrP;4kf+eO<;2RlT{jzSNEd*N%&Qw~m{H(_cC;9o9Sz6St|DgVN pAoRQJEyMBf{)hvGMe9r;mB&oSL8h;^>@YJp6b8%^l=&@4|1T?GCd&W- literal 0 HcmV?d00001 diff --git a/Resources/Textures/_White/Objects/Weapons/Guns/Battery/mini-ebow.rsi/empty.png b/Resources/Textures/_White/Objects/Weapons/Guns/Battery/mini-ebow.rsi/empty.png new file mode 100644 index 0000000000000000000000000000000000000000..799e188ec829ff1cc8c42a40c84db10b1d4140c9 GIT binary patch literal 548 zcmV+<0^9wGP)pD>RJ;3LgAJG<6nt)zoZs6YM2(*_ma?_uJW-%{Bb9MF0^%V1QgM z=VY^4=yto(#Q{(}lgU7-RKm~^fe7Ua>h(I5%Vi;mKmcpmhTcOD)E8A4B9sc4jsZ84 zA_NiI6ig-)zR#}W9IQO_dJwLMjN~HqR=@gR5Bv~=8)oQ*K^aV(zQqb#k4)#6=gI%BS3v&@_y#l@4G8=Y;Rmt&qtS@QWZgg2oqWqiR79K$Kn+iiwp=bf zbMP4!5%&dHEEcSbarWJIWnF`+tHR>G0P%R7RRG8FSW^WN=K|0%bj5#iHsX$`I2XW6 m)NMh;eE}|E5kLeG0sI19#PxaD%#;-X0000u!vbcyT66;f~0 zEMBQpSQ)z5@_xV<6J0RCIcLxnARdpS+ipLLJv}}G?*R3aic~s{e!p+`{fsZRm2>my zxG$q4z<4}{s;X$UTKkD^&r9Atdi*h^u~qe(|5g(w7T z?$p@7!$Na^OlP;T>gE*^OZvNw*J>D=iykq15)@YOwU}`>55ocm>4qBu5Bh-?*Lu1* zhIkxLPLN<-+~C$QvGXR2$3_Wb!=!Kpfs_MGK?f2<6dGb(H|=8XC<^yGkk~F6%-Ero zWPD)Zfdh?_9!AC%4}u;rEsd06v)bc!P(vc{zzxP@hvM8AigjZcuNgJ1WI1>&%*{Z3 ug|fwsQyghxY&#UL88K}Qk03aYBPE1U9cXy16iYh57&d(3@00001bW%=J06^y0W&i*HZF*E#bVOxyV{&P5 zbZKvH004NLQ&wYE63;>`28-Uml z;EwzF3g1HHjpvgO;}XjMAoZU7GpHBuKvNyp+=Ue<3p6JGeuGS+0fR?N@^0} z)S;{dBN3Y?o2n(@rk>3hjUy)*D~B3KqU?xLe0u{o(+F}%Q49|N0000VS)*8>L*aJDiC9$+Z{$e{I+ zVb5zHhJL2cf9x6j7(M>nn+sINSQ6wH%;50sMjDXg>FMGaqA@W!VS!?Ti+F-kEH~Q$ zgJ#KC2UkYl14kHq58MROBEGD%S4quk*e$(^p?w$IEQcz#Sqs{an^LB{Ts5VjwtH literal 0 HcmV?d00001 diff --git a/Resources/Textures/_White/Objects/Weapons/Guns/Projectiles/ebolt.rsi/meta.json b/Resources/Textures/_White/Objects/Weapons/Guns/Projectiles/ebolt.rsi/meta.json new file mode 100644 index 0000000000..8436af22e0 --- /dev/null +++ b/Resources/Textures/_White/Objects/Weapons/Guns/Projectiles/ebolt.rsi/meta.json @@ -0,0 +1,14 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "See copyright for above folder (Weapons/Guns/Projectiles)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "bullet" + } + ] +}