From f20f0e2773b3d60131850e7fbb7f3a34c76896cc Mon Sep 17 00:00:00 2001 From: Pspritechologist <81725545+Pspritechologist@users.noreply.github.com> Date: Sun, 12 Mar 2023 15:34:59 -0400 Subject: [PATCH 1/8] Make a working SpawnEntitiesOnTrigger system, with optional firing of the entities. At the moment, the frag's explosion can cause the bullets to get "knocked off course," which crashes the game when you walk into them (might only be dev env), and the bees from the beenade behave very odd, moving as one entity due to limited AI. --- .../SpawnEntitiesOnTriggerComponent.cs | 20 ++++++ .../SpawnEntitiesOnTriggerSystem.cs | 70 +++++++++++++++++++ .../Weapons/Guns/Throwable/grenades.yml | 52 ++++++++++++++ 3 files changed, 142 insertions(+) create mode 100644 Content.Server/SimpleStation14/SpawnEntitiesOnTrigger/SpawnEntitiesOnTriggerComponent.cs create mode 100644 Content.Server/SimpleStation14/SpawnEntitiesOnTrigger/SpawnEntitiesOnTriggerSystem.cs create mode 100644 Resources/Prototypes/SimpleStation14/Entities/Objects/Weapons/Guns/Throwable/grenades.yml diff --git a/Content.Server/SimpleStation14/SpawnEntitiesOnTrigger/SpawnEntitiesOnTriggerComponent.cs b/Content.Server/SimpleStation14/SpawnEntitiesOnTrigger/SpawnEntitiesOnTriggerComponent.cs new file mode 100644 index 0000000000..fca3e73b10 --- /dev/null +++ b/Content.Server/SimpleStation14/SpawnEntitiesOnTrigger/SpawnEntitiesOnTriggerComponent.cs @@ -0,0 +1,20 @@ +namespace Content.Server.SimpleStation14.Grenades; + +[RegisterComponent] +public sealed class SpawnEntitiesOnTriggerComponent : Component +{ + [DataField("prototype")] + public string? Prototype = null; + + [DataField("count")] + public int Count = 1; + + [DataField("minCount")] + public int? MinCount = null; + + [DataField("velocity")] + public float? Velocity = null; + + [DataField("despawnTime")] + public float? DespawnTime = null; +} diff --git a/Content.Server/SimpleStation14/SpawnEntitiesOnTrigger/SpawnEntitiesOnTriggerSystem.cs b/Content.Server/SimpleStation14/SpawnEntitiesOnTrigger/SpawnEntitiesOnTriggerSystem.cs new file mode 100644 index 0000000000..cbc51a6058 --- /dev/null +++ b/Content.Server/SimpleStation14/SpawnEntitiesOnTrigger/SpawnEntitiesOnTriggerSystem.cs @@ -0,0 +1,70 @@ +using System.Collections.Generic; +using Content.Shared.Spawners.Components; +using Robust.Shared.GameObjects; +using Robust.Shared.IoC; +using Robust.Shared.Map; +using Robust.Shared.Prototypes; +using Content.Server.Explosion.EntitySystems; +using Content.Server.Damage.Components; +using Content.Shared.Damage; +using Robust.Shared.Random; +using Robust.Shared.Physics.Components; +using Robust.Shared.Physics; +using Robust.Shared.Physics.Systems; +using Content.Server.Weapons.Ranged.Systems; +using Content.Shared.Weapons.Ranged.Systems; + +namespace Content.Server.SimpleStation14.Grenades; + +public class SpawnEntitiesOnTriggerSystem : EntitySystem +{ + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly IEntityManager _entityManager = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly SharedPhysicsSystem _physicsSystem = default!; + [Dependency] private readonly GunSystem _gunSystem = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnTrigger); + } + + private void OnTrigger(EntityUid uid, SpawnEntitiesOnTriggerComponent component, TriggerEvent args) + { + if (component.Prototype == null) return; + + var prototype = _prototypeManager.Index(component.Prototype); + + var spawnCount = component.Count; + + if (component.MinCount != null) + { + spawnCount = _random.Next(component.MinCount.Value, component.Count); + } + + for (var i = 0; i < spawnCount; i++) + { + var spawnedEntity = _entityManager.SpawnEntity(prototype.ID, _entityManager.GetComponent(uid).Coordinates); + + if (component.Velocity != null) + { + var transfComp = _entityManager.GetComponent(spawnedEntity); + var physicsComp = _entityManager.GetComponent(spawnedEntity); + + transfComp.LocalRotation = Angle.FromDegrees(_random.Next(0, 360)); + + _gunSystem.ShootProjectile(spawnedEntity, transfComp.LocalRotation.ToWorldVec(), Vector2.Zero, speed: component.Velocity.Value * _random.NextFloat(0.8f, 1.2f)); + + // _physicsSystem.SetLinearVelocity(spawnedEntity, transfComp.LocalRotation.ToWorldVec() * component.Velocity.Value * _random.NextFloat(0.8f, 1.2f)); + } + + if (component.DespawnTime != null) + { + var despawnComp = _entityManager.EnsureComponent(spawnedEntity); + despawnComp.Lifetime = component.DespawnTime.Value; + } + } + } +} diff --git a/Resources/Prototypes/SimpleStation14/Entities/Objects/Weapons/Guns/Throwable/grenades.yml b/Resources/Prototypes/SimpleStation14/Entities/Objects/Weapons/Guns/Throwable/grenades.yml new file mode 100644 index 0000000000..5a0e44e7ae --- /dev/null +++ b/Resources/Prototypes/SimpleStation14/Entities/Objects/Weapons/Guns/Throwable/grenades.yml @@ -0,0 +1,52 @@ +- type: entity + name: fragmentation grenade + description: A grenade that explodes into a cloud of shrapnel. + parent: GrenadeBase + id: GrenadeFragThrown + components: + - type: Sprite + sprite: Objects/Weapons/Grenades/flashbang.rsi + - type: SpawnEntitiesOnTrigger + prototype: BaseBulletTrigger + count: 30 + minCount: 20 + velocity: 20 + despawnTime: 1.5 + - type: ExplodeOnTrigger + - type: Explosive + explosionType: Default + totalIntensity: 40 + intensitySlope: 45 + maxIntensity: 10 + canCreateVacuum: false + - type: DeleteOnTrigger + # - type: Appearance + # visuals: + # - type: TimerTriggerVisualizer + # countdown_sound: + # path: /Audio/Effects/countdown.ogg + - type: OnUseTimerTrigger + delay: 1.5 + +- type: entity + name: beenade + description: A grenade that explodes into a cloud of bees... Nightmarish. + parent: GrenadeBase + id: GrenadeBees + components: + - type: Sprite + sprite: Objects/Weapons/Grenades/flashbang.rsi + - type: SpawnEntitiesOnTrigger + prototype: MobAngryBee + count: 5 + minCount: 3 + despawnTime: 30 + # velocity: 2 + - type: DeleteOnTrigger + # - type: Appearance + # visuals: + # - type: TimerTriggerVisualizer + # countdown_sound: + # path: /Audio/Effects/countdown.ogg + - type: OnUseTimerTrigger + delay: 2 From a7488ae3a714b2a808d701745b5abaa96f471377 Mon Sep 17 00:00:00 2001 From: Pspritechologist <81725545+Pspritechologist@users.noreply.github.com> Date: Wed, 29 Mar 2023 17:38:54 -0400 Subject: [PATCH 2/8] Cleaned up code, fixed some bugs, added Beenade sprite --- .../SpawnEntitiesOnTriggerComponent.cs | 37 ++++++ .../SpawnEntitiesOnTriggerSystem.cs | 25 +++- .../Effects/Weapons/Grenades/beenade.ogg | Bin 0 -> 29244 bytes .../Objects/Weapons/Throwable/grenades.yml | 3 +- .../Weapons/Guns/Projectiles/shrapnel.yml | 41 +++++++ .../Weapons/Guns/Throwable/grenades.yml | 108 ++++++++++++++---- .../Grenades/beenade.rsi/equipped-BELT.png | Bin 0 -> 2351 bytes .../Weapons/Grenades/beenade.rsi/icon.png | Bin 0 -> 469 bytes .../Grenades/beenade.rsi/inhand-left.png | Bin 0 -> 2603 bytes .../Grenades/beenade.rsi/inhand-right.png | Bin 0 -> 2645 bytes .../Weapons/Grenades/beenade.rsi/meta.json | 30 +++++ .../Weapons/Grenades/beenade.rsi/primed.png | Bin 0 -> 5751 bytes .../frag_grenade.rsi/equipped-BELT.png | Bin 0 -> 1435 bytes .../Grenades/frag_grenade.rsi/icon.png | Bin 0 -> 1569 bytes .../Grenades/frag_grenade.rsi/inhand-left.png | Bin 0 -> 1239 bytes .../frag_grenade.rsi/inhand-right.png | Bin 0 -> 1668 bytes .../Grenades/frag_grenade.rsi/meta.json | 29 +++++ .../Grenades/frag_grenade.rsi/primed.png | Bin 0 -> 1564 bytes .../Projectiles/projectiles.rsi/meta.json | 5 +- .../Projectiles/projectiles.rsi/shrapnel.png | Bin 0 -> 433 bytes 20 files changed, 250 insertions(+), 28 deletions(-) create mode 100644 Resources/Audio/SimpleStation14/Effects/Weapons/Grenades/beenade.ogg create mode 100644 Resources/Prototypes/SimpleStation14/Entities/Objects/Weapons/Guns/Projectiles/shrapnel.yml create mode 100644 Resources/Textures/SimpleStation14/Objects/Weapons/Grenades/beenade.rsi/equipped-BELT.png create mode 100644 Resources/Textures/SimpleStation14/Objects/Weapons/Grenades/beenade.rsi/icon.png create mode 100644 Resources/Textures/SimpleStation14/Objects/Weapons/Grenades/beenade.rsi/inhand-left.png create mode 100644 Resources/Textures/SimpleStation14/Objects/Weapons/Grenades/beenade.rsi/inhand-right.png create mode 100644 Resources/Textures/SimpleStation14/Objects/Weapons/Grenades/beenade.rsi/meta.json create mode 100644 Resources/Textures/SimpleStation14/Objects/Weapons/Grenades/beenade.rsi/primed.png create mode 100644 Resources/Textures/SimpleStation14/Objects/Weapons/Grenades/frag_grenade.rsi/equipped-BELT.png create mode 100644 Resources/Textures/SimpleStation14/Objects/Weapons/Grenades/frag_grenade.rsi/icon.png create mode 100644 Resources/Textures/SimpleStation14/Objects/Weapons/Grenades/frag_grenade.rsi/inhand-left.png create mode 100644 Resources/Textures/SimpleStation14/Objects/Weapons/Grenades/frag_grenade.rsi/inhand-right.png create mode 100644 Resources/Textures/SimpleStation14/Objects/Weapons/Grenades/frag_grenade.rsi/meta.json create mode 100644 Resources/Textures/SimpleStation14/Objects/Weapons/Grenades/frag_grenade.rsi/primed.png create mode 100644 Resources/Textures/SimpleStation14/Objects/Weapons/Guns/Projectiles/projectiles.rsi/shrapnel.png diff --git a/Content.Server/SimpleStation14/SpawnEntitiesOnTrigger/SpawnEntitiesOnTriggerComponent.cs b/Content.Server/SimpleStation14/SpawnEntitiesOnTrigger/SpawnEntitiesOnTriggerComponent.cs index fca3e73b10..8d5d24f45a 100644 --- a/Content.Server/SimpleStation14/SpawnEntitiesOnTrigger/SpawnEntitiesOnTriggerComponent.cs +++ b/Content.Server/SimpleStation14/SpawnEntitiesOnTrigger/SpawnEntitiesOnTriggerComponent.cs @@ -1,20 +1,57 @@ namespace Content.Server.SimpleStation14.Grenades; [RegisterComponent] + +/// +/// Spawns entities when triggered. +/// This is used for grenades and other things that spawn entities on trigger. +/// public sealed class SpawnEntitiesOnTriggerComponent : Component { + /// + /// The prototype of the entity to spawn. + /// [DataField("prototype")] public string? Prototype = null; + /// + /// The amount of entities to spawn. + /// [DataField("count")] public int Count = 1; + /// + /// The minimum amount of entities to spawn. + /// If this is null, will always spawn full amount. + /// [DataField("minCount")] public int? MinCount = null; + /// + /// The velocity to either shoot or throw the spawned entities with. + /// If this is null, entities won't be thrown or shot. + /// [DataField("velocity")] public float? Velocity = null; + /// + /// The time in seconds before the spawned entities despawn. + /// If this is null, entities won't despawn. + /// [DataField("despawnTime")] public float? DespawnTime = null; + + /// + /// Whether or to shoot the spawned entities. + /// If this is false, entities with velocity will be thrown. + /// + [DataField("shoot")] + public bool Shoot = false; + + /// + /// The offset multiplier for the spawned entities in max tiles. + /// If this is 0, entities will spawn on top of the trigger. + /// + [DataField("offset")] + public float Offset = 0f; } diff --git a/Content.Server/SimpleStation14/SpawnEntitiesOnTrigger/SpawnEntitiesOnTriggerSystem.cs b/Content.Server/SimpleStation14/SpawnEntitiesOnTrigger/SpawnEntitiesOnTriggerSystem.cs index cbc51a6058..83cf44dee8 100644 --- a/Content.Server/SimpleStation14/SpawnEntitiesOnTrigger/SpawnEntitiesOnTriggerSystem.cs +++ b/Content.Server/SimpleStation14/SpawnEntitiesOnTrigger/SpawnEntitiesOnTriggerSystem.cs @@ -13,6 +13,7 @@ using Robust.Shared.Physics.Systems; using Content.Server.Weapons.Ranged.Systems; using Content.Shared.Weapons.Ranged.Systems; +using Content.Shared.Throwing; namespace Content.Server.SimpleStation14.Grenades; @@ -23,6 +24,7 @@ public class SpawnEntitiesOnTriggerSystem : EntitySystem [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly SharedPhysicsSystem _physicsSystem = default!; [Dependency] private readonly GunSystem _gunSystem = default!; + [Dependency] private readonly ThrowingSystem _throwingSystem = default!; public override void Initialize() { @@ -31,6 +33,11 @@ public override void Initialize() SubscribeLocalEvent(OnTrigger); } + /// + /// On trigger, works out if the entity has a variable count, decides how many to spawn, + /// then iterates through and spawns each one apply any offset, and any velocity, be it thrown or shot, + /// spinning them in a random direction. Finally, sets the entity to be deleted if a despawn time is set. + /// private void OnTrigger(EntityUid uid, SpawnEntitiesOnTriggerComponent component, TriggerEvent args) { if (component.Prototype == null) return; @@ -46,18 +53,26 @@ private void OnTrigger(EntityUid uid, SpawnEntitiesOnTriggerComponent component, for (var i = 0; i < spawnCount; i++) { - var spawnedEntity = _entityManager.SpawnEntity(prototype.ID, _entityManager.GetComponent(uid).Coordinates); + var spawnedEntity = _entityManager.SpawnEntity(prototype.ID, _entityManager.GetComponent(uid).Coordinates + + new EntityCoordinates(_entityManager.GetComponent(uid).ParentUid, _random.NextVector2(-1, 1) * component.Offset)); + + var transfComp = _entityManager.GetComponent(spawnedEntity); + transfComp.AttachToGridOrMap(); if (component.Velocity != null) { - var transfComp = _entityManager.GetComponent(spawnedEntity); var physicsComp = _entityManager.GetComponent(spawnedEntity); transfComp.LocalRotation = Angle.FromDegrees(_random.Next(0, 360)); - _gunSystem.ShootProjectile(spawnedEntity, transfComp.LocalRotation.ToWorldVec(), Vector2.Zero, speed: component.Velocity.Value * _random.NextFloat(0.8f, 1.2f)); - - // _physicsSystem.SetLinearVelocity(spawnedEntity, transfComp.LocalRotation.ToWorldVec() * component.Velocity.Value * _random.NextFloat(0.8f, 1.2f)); + if (component.Shoot) + { + _gunSystem.ShootProjectile(spawnedEntity, transfComp.LocalRotation.ToWorldVec(), Vector2.Zero, speed: component.Velocity.Value * _random.NextFloat(0.8f, 1.2f)); + } + else + { + _throwingSystem.TryThrow(spawnedEntity, transfComp.LocalRotation.ToWorldVec(), 1.0f, null, 5.0f, physicsComp, transfComp); + } } if (component.DespawnTime != null) diff --git a/Resources/Audio/SimpleStation14/Effects/Weapons/Grenades/beenade.ogg b/Resources/Audio/SimpleStation14/Effects/Weapons/Grenades/beenade.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ca49db47d4a1ee96137a3e000f6a410835842363 GIT binary patch literal 29244 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 Vg42JVJ&6DS002ovPDHLkV1o9uc}oBQ literal 0 HcmV?d00001 diff --git a/Resources/Textures/SimpleStation14/Objects/Weapons/Grenades/beenade.rsi/icon.png b/Resources/Textures/SimpleStation14/Objects/Weapons/Grenades/beenade.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0e3e8facc714652b21e38180c4be092f0548474f GIT binary patch literal 469 zcmV;`0V@89P)EI$vL3W@BJxWMOA#XJ}|>YHDh2YiMt8 zZ>fx8sf}Z)kYkvWg{hKbshDK0mTRD(prfOsq@<+(!#n@PJKV{o3|I9uA%s&6kJ^#)=|IBLt&1e77Kj_kq|I|SL)j$8$K>yZ2|JOkO z*g^l;N&neF|Jp(S+d&lg%_;x@00DGTPE!Ct=GbNc0004EOGiWihy@);00009a7bBm z000XU000XU0RWnu7ytkO2XskIMF-~t9TOD{0wu#90001>Nkl3`H4@ zj#2E2DE1Cm;$X!2{~r^U(l#D<-0gkIJBeYG{DLTOh*;qJZIeAlfjPtGVb@b0=pe+* z-FD~b*pXL((CGw{-@R|ox$-rMwohi{EW124_(C3=o6NH?71!_ zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=NIa^$)VhTpl0EJ3`2Tn=xj$_}#pe4yGrc8`5# zJSPvSR9bFPEm0tVAD5qY`(OW5_YXet^3|m*wX{+$KB=V^Iv4f2KmDBjmCpHm(&G`o zKiqfE2Z39WG2TCGdCY&i@1Fwhp>vhr399q)V0?Vg9xH_UBIvPDG>rlm>mjH;1jTSa z@DBm~HtQ;_%6k*WzQ^@uNxi?$PEn5Rr;yj*N$}pv+>9aY=;OsX#&9bT?HgU}TtvG^4Br27HI&yzl&^1Sk&-*>NQrSO;%Uz}W?n0P>fPHg~;v-@dA=>aiIsdMdcOJdAoXXTo-d-eN_(@#`PVY?t)gfK%qH*1v8!i3@f_Q+AOw5dTx_DU+0l0{zGs^e~0-#1#_~I`KLA=M2 z6@WUbhnT_u0iSbNC>c_W1#D`trFljCnHqB7w&Om<3?y?hI)=U z<(x~FTyx94#F9!brAV=&*du$R% zp{CJk(yT>At2XUV)E=<@bbJFf|3EDqq->%*QRA-2n+R{^BpYS`7F_ZmE(QSs9SpOp z`jmnpXP8}$@)vVJ$!wS{Z-{|l+CF6UZ`iqTBWlR~E!>=>54eRtMa~&?-$d?b+&)8X zS-qPFu{#URsaGWX`0Jta_vz@qdhmYqXXw@~zZ~6PPRPGl;oa!|ScR9-{jmx!qx)kO zUNmsOzx3$zpXMbhkjJU2*1O7DL)#X&HA^DYlgvQEU3J<7LRfnt7Gy8KMRbm^+K{rR z(o}RT?YUfg(0wu$aBZhytg-WGvgfj>l)`G|XuM|qOZOigYbvIr(`Xt5FRFQy4Iz)Z zLeavyM@XynmkxRj$gmbkC2Pbvb?q`&tGfN%W{q{0zWc~+G~Fv{AW^VqjQ
JW5|W(-r6Xg zb`fhIBjN*$E@kraOuX$dzM~v3?YT#yAxEmjiIId^BLPXsO-s<>waI~Ip*s31aWP;Y zl~8hhiSNm5t>^V#7aFt98bey#1Qf1Bhh20~7*(cT4ORnzDn|hvfHw60)pOQ(?KX$c z5$vgo%pp9(q~ztXgDrhg*s|YEV(8*2&wa!^IcTZga7AM8VQ2CussT_IPS2SdJpCy?LsWH<-&WXE`+YW=hM@Fmd@vc$`O5&`{ z62~rM3o9lNha{53F3&kO(ZCbyBRS(;B1s6ur70wcimnN*$)wJpOSL5Rn6@+c?&}1^ z2yRhda`%LPZMVn7dqvw$;i}Thf&hr^9G|E-AXRo&V|#5aoCV; zSMwM%{Voz#gNkEmx9O4}%HDQ0&WJ;Up5P+9_Q<5Zhp3b5lNOIR;d@jkCK#Zge$ods z0l+woVc={BMs_c}i|@CL4pXLSg7*qk2@2xQgbJl2SUst9)6%DQR14b=y6?_#6bBc# z6ez0~#P^kH=M+?M3b*3)@tNL2GyPP`S=Jbax?ijtkeK)Oay`oBPyT$2?rR5sZ)Csr z#S*_g-Ws?+R^deh_cv7ezo7qiLDmv!$0u2zP4RtCbf+nXLbH}~HOd@mLGjLs)KNp9*?t|mX`O{^MZZ9uHy)3kSJI9$TQ@Lh+WeGdX-UVg`$oOOc7EONZv zfa3=j!{Pqs2iD;rB~>DPc_0lrJRWrLUI#ly8TWsZut4FEf!1t7rVTU|Hu9qzB_a%s z5*Z2fmM;1rMe7~4ffbEIZ4Rp)iL_g`D-hq(2)iPkZEf#j+zoTss}h0s?@)XTB@Jwh z-`v@bJKguf`7Qz$P&k8hCki2I1f_SDI`AkN3s?KpI@!}8Y32G}^0?;>|9jlV=C)w_ z_bbY~{_Fk|)zQZP89~GqA?yAPA-Ugvt-e_y00006VoOIv0RI5g06@=sppO6m010qN zS#tmY3ljhU3ljkVnw%H_000McNliru=K~!RCNESe*IWPq0dPq~K~#9!?V3$W12Gte z-?T!ZD>og)3ltiWQr#8OY^8GrkKiplf;Z^}q|Q1Z9b9;s*F`Oepp%izPwo4_?1ub2 zNxn?-jWNccOGtKF{{SbB1W14cNPq-LfCNZ@1W14cNI){ys~Og-*>M;!#w2}mZ}-RC z;G)WpCHI!Ox9n^N+&|nQ%QEbCyUHW}p`ix}DXtARkLTDtO^{qd%&6M=6xX*?*!i?- z^vTkb#gYKX;F8P$21f?RuX04!C`Rol5U_DTd?%q#(>xv z@HzU7DKmNv1lLFms3qWHa#3S+Qt^K#*^Ll`1IELBdb}kL zsrX(902<8U|0KQiFpF(}VnAa#{NI+r{?C#A1i@3NQwSl15JHH5zz5Jzg=*uZqzM23 N002ovPDHLkV1hK^3Dp1q literal 0 HcmV?d00001 diff --git a/Resources/Textures/SimpleStation14/Objects/Weapons/Grenades/beenade.rsi/inhand-right.png b/Resources/Textures/SimpleStation14/Objects/Weapons/Grenades/beenade.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..999c50e9ea02c234ee091f8eb71fd8a0b01db19d GIT binary patch literal 2645 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 D74iY; literal 0 HcmV?d00001 diff --git a/Resources/Textures/SimpleStation14/Objects/Weapons/Grenades/beenade.rsi/meta.json b/Resources/Textures/SimpleStation14/Objects/Weapons/Grenades/beenade.rsi/meta.json new file mode 100644 index 0000000000..1de1effa9f --- /dev/null +++ b/Resources/Textures/SimpleStation14/Objects/Weapons/Grenades/beenade.rsi/meta.json @@ -0,0 +1,30 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Made by Pspritechologist", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "primed", + "delays": [[ 0.2, 0.2, 0.2, 0.2 ]] + }, + { + "name": "equipped-BELT", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/SimpleStation14/Objects/Weapons/Grenades/beenade.rsi/primed.png b/Resources/Textures/SimpleStation14/Objects/Weapons/Grenades/beenade.rsi/primed.png new file mode 100644 index 0000000000000000000000000000000000000000..44849da77e11f7265a3d7958bfcf4b4a81c5c528 GIT binary patch literal 5751 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/SimpleStation14/Objects/Weapons/Grenades/frag_grenade.rsi/icon.png b/Resources/Textures/SimpleStation14/Objects/Weapons/Grenades/frag_grenade.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c552d96eedd4f0ec44e47174e29f6a897a7b62d3 GIT binary patch literal 1569 zcmV++2HyFJP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-|cmLn$&{bvzjmc6*X> zr@wNhZ~-Miy6A$yVf^*y41eHZq8OrPOC_ZPPb{&pqhiPT_|EBwJKqmqP56G0hkFA< zBq-(lv~=~q$?2}(EF3lcpvc6+ASD!Yb$6(*Kx3(%L2j8~x|?^KWstGZz+^rIaWsZk*YU6Uepa+)-D z*{A_xgs2^$D=^Cn;9j{(ja5TUHCL;pdc*Q*v1v;!H*2MN z=Pn)bqo)1Q)asb; ztU;RdO$DuRqKh*S#vu|I&x?W;*%oJqQH;EpTbvyQ;ZKwSQWs~P7Gq#A4q}~j<1X;Y z=wj|a@fLD?;Elh^Tv*h-$=qk&Ua{8KG1N9==Pq1MJp{WCKWD@5Wf^|f@NW5A(f?6V z9W^3Qm|JPJ#MrSY*|E&0I%&hv(;K$J#6@d$#_pO03%%l4+B*Drw+z2NppFiER`=J` z?lY%_LMC>chFD8lHNo9aNxfiC*O;XqV`Q39Q|&1#|C^)2w|LsS1W!fV!e8*_)&xO7 zfCFcgmWddW&Jk`2zyNt_S@%pOe0?axv*3#*1jn3R>>^0QoNMQWoNQ^=LF2wNW z98QQMan)gmq-2}pg#T+r;UP`dQ&x>Q_R2*+uBg}@dtqW7@55+VdXHyMmE#W=>qZxdpzFpsnsS-7{1es|BCsWvQUCz9+v4Dzi&+5_IRF&(T7)=& z=^LP~KL8ftKHDN6SOF3{6uGPwXxb?isImu8N?v6vWf}O`ndlRM+RnhS=abF?V+>_q zSzYtJ66M;pBL*(iO}TyQZ#@l-F;unQruobRa``V%O0jPX_5v91gd@NR(5HO^vEqA@ TPvd}R00000NkvXXu0mjfeXicj literal 0 HcmV?d00001 diff --git a/Resources/Textures/SimpleStation14/Objects/Weapons/Grenades/frag_grenade.rsi/inhand-left.png b/Resources/Textures/SimpleStation14/Objects/Weapons/Grenades/frag_grenade.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..4ab86f4513dec701b8bf8f58e6da20ddb1588c70 GIT binary patch literal 1239 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 MoW1evqv6c|07K#dmH+?% literal 0 HcmV?d00001 diff --git a/Resources/Textures/SimpleStation14/Objects/Weapons/Grenades/frag_grenade.rsi/meta.json b/Resources/Textures/SimpleStation14/Objects/Weapons/Grenades/frag_grenade.rsi/meta.json new file mode 100644 index 0000000000..29ad3a5726 --- /dev/null +++ b/Resources/Textures/SimpleStation14/Objects/Weapons/Grenades/frag_grenade.rsi/meta.json @@ -0,0 +1,29 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Made by Pspritechologist", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "primed" + }, + { + "name": "equipped-BELT", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/SimpleStation14/Objects/Weapons/Grenades/frag_grenade.rsi/primed.png b/Resources/Textures/SimpleStation14/Objects/Weapons/Grenades/frag_grenade.rsi/primed.png new file mode 100644 index 0000000000000000000000000000000000000000..d7fbd7d571ae1a87cb384847d619f1c30243d52d GIT binary patch literal 1564 zcmV+%2IKjOP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-|ulH4c^{m&`(2$qCE97lXr?G5($d0=4%{_viGURTT`%tJ^HJVp3)K-N!!I2wW{VbG~|yvMDv%NPLp z45#~5;L%*J#!m-5uySwF=lbx>R^)4lJb|3<@>6{ved>_=Jp6v0MYJ8!3V$+sd zZq`ck&Rsh4M^8O>>!tgkflwN8=tv_E8)f)Js7(noPMvAyX|qhfvv$$?;eLTNx>)1Q z)Eb!YtU;Ue%>=D=Pq2J9)jIBNu15OMnGY!xvJhx zhG)fBmx^OunaVXwuTcnlW{4xUb5DkCZoN@Ju}Z^yIzAeC`j~NyR@iy^}V0t6?HZjCdgOmA&;GrF8RJ4CAm@sVh>@&9RnFPuIcj zNrvxrydZVekuVz488Sn3E*Ukf^#bn*`Jqjuk9w{}QKrsOHoQxMeI3!U3sSN14wS@g5Pi42><{924YJ`L;x)SFaRjg%pITr000SaNLh0L01FcU z01FcV0GgZ_00007bV*G`2j>F~03s45R22UJ009t5L_t(o!|j$aYQr!ThCdY}Aq-8r zBpupN$UO?ZMRJjBoqCdxE0jV{;iX6L4y$h&4W4*?TS#;Q03XW&D1i4? z1XQ3E%kbV}a;Qp&c&%bKp#Ye?b_=tUCS8(-VDi&#{ibIE_2`9wwTHx)dLkNuzld~VMB=q_Yj>>qiNs+Y z>WD$JppLsu{To}cc&)0^T{58Hc@Q*=&MmpkFbXO`n}q3~FbPNk&f^=2IApS2!R!$L O00005#< literal 0 HcmV?d00001 diff --git a/Resources/Textures/SimpleStation14/Objects/Weapons/Guns/Projectiles/projectiles.rsi/meta.json b/Resources/Textures/SimpleStation14/Objects/Weapons/Guns/Projectiles/projectiles.rsi/meta.json index 7f921b6e6b..fd4dc5e016 100644 --- a/Resources/Textures/SimpleStation14/Objects/Weapons/Guns/Projectiles/projectiles.rsi/meta.json +++ b/Resources/Textures/SimpleStation14/Objects/Weapons/Guns/Projectiles/projectiles.rsi/meta.json @@ -54,6 +54,9 @@ 0.11 ] ] + }, + { + "name": "shrapnel" } ] -} \ No newline at end of file +} diff --git a/Resources/Textures/SimpleStation14/Objects/Weapons/Guns/Projectiles/projectiles.rsi/shrapnel.png b/Resources/Textures/SimpleStation14/Objects/Weapons/Guns/Projectiles/projectiles.rsi/shrapnel.png new file mode 100644 index 0000000000000000000000000000000000000000..a3ae1339b112bcce4d0b83813ee0c34911244c0c GIT binary patch literal 433 zcmV;i0Z#sjP)$n81YAZs*H zsRU|(NCX4v!`23Y8aQ!-44H@ldiy6chKu4e> b(4oT{@P18Uy7f<900000NkvXXu0mjfTd%O; literal 0 HcmV?d00001 From 1d980d5a4e4c5874dea2ee8273e9c97262b856df Mon Sep 17 00:00:00 2001 From: Pspritechologist <81725545+Pspritechologist@users.noreply.github.com> Date: Wed, 29 Mar 2023 17:45:37 -0400 Subject: [PATCH 3/8] Fixed unwanted changes. --- .../Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml index 21d563ad68..a980fa956a 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml @@ -27,7 +27,8 @@ behaviors: - !type:TriggerBehavior - !type:DoActsBehavior - acts: ["Destruction"] - type: Appearance + acts: ["Destruction"] + - type: Appearance visuals: - type: TimerTriggerVisualizer From 88164058a2c2eecc1e5cdb15ed7a487d5b0be009 Mon Sep 17 00:00:00 2001 From: Pspritechologist <81725545+Pspritechologist@users.noreply.github.com> Date: Tue, 4 Apr 2023 10:38:22 -0400 Subject: [PATCH 4/8] Trying out async methods for performance, maybe keep? --- .../SpawnEntitiesOnTriggerSystem.cs | 68 ++++++++++++------- 1 file changed, 44 insertions(+), 24 deletions(-) diff --git a/Content.Server/SimpleStation14/SpawnEntitiesOnTrigger/SpawnEntitiesOnTriggerSystem.cs b/Content.Server/SimpleStation14/SpawnEntitiesOnTrigger/SpawnEntitiesOnTriggerSystem.cs index 83cf44dee8..a44c862483 100644 --- a/Content.Server/SimpleStation14/SpawnEntitiesOnTrigger/SpawnEntitiesOnTriggerSystem.cs +++ b/Content.Server/SimpleStation14/SpawnEntitiesOnTrigger/SpawnEntitiesOnTriggerSystem.cs @@ -1,26 +1,21 @@ -using System.Collections.Generic; using Content.Shared.Spawners.Components; -using Robust.Shared.GameObjects; -using Robust.Shared.IoC; using Robust.Shared.Map; using Robust.Shared.Prototypes; using Content.Server.Explosion.EntitySystems; -using Content.Server.Damage.Components; -using Content.Shared.Damage; using Robust.Shared.Random; using Robust.Shared.Physics.Components; -using Robust.Shared.Physics; using Robust.Shared.Physics.Systems; using Content.Server.Weapons.Ranged.Systems; -using Content.Shared.Weapons.Ranged.Systems; using Content.Shared.Throwing; +using System.Threading.Tasks; +using Robust.Shared.Utility; +using System.Collections.Generic; namespace Content.Server.SimpleStation14.Grenades; public class SpawnEntitiesOnTriggerSystem : EntitySystem { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly SharedPhysicsSystem _physicsSystem = default!; [Dependency] private readonly GunSystem _gunSystem = default!; @@ -38,11 +33,16 @@ public override void Initialize() /// then iterates through and spawns each one apply any offset, and any velocity, be it thrown or shot, /// spinning them in a random direction. Finally, sets the entity to be deleted if a despawn time is set. /// - private void OnTrigger(EntityUid uid, SpawnEntitiesOnTriggerComponent component, TriggerEvent args) + private async void OnTrigger(EntityUid uid, SpawnEntitiesOnTriggerComponent component, TriggerEvent args) { if (component.Prototype == null) return; - var prototype = _prototypeManager.Index(component.Prototype); + if (!_prototypeManager.TryIndex(component.Prototype, out var prototype)) + { + DebugTools.Assert($"Prototype {component.Prototype} does not exist"); + + return; + } var spawnCount = component.Count; @@ -51,35 +51,55 @@ private void OnTrigger(EntityUid uid, SpawnEntitiesOnTriggerComponent component, spawnCount = _random.Next(component.MinCount.Value, component.Count); } - for (var i = 0; i < spawnCount; i++) + var spawnedEntities = await SpawnEntities(spawnCount, prototype, component, uid, Transform(uid)); + + foreach (var spawnedEntity in spawnedEntities) + { + if (component.DespawnTime != null) + { + var despawnComp = EntityManager.EnsureComponent(spawnedEntity); + despawnComp.Lifetime = component.DespawnTime.Value; + } + } + } + + /// + /// Async method to spawn the entities to prevent lag spikes. + /// + private async Task> SpawnEntities(int spawnCount, EntityPrototype prototype, SpawnEntitiesOnTriggerComponent component, EntityUid uid, TransformComponent transfComp) + { + var spawnedEntities = new List(); + + for (var i = 0; i < spawnCount * 100000; i++) { - var spawnedEntity = _entityManager.SpawnEntity(prototype.ID, _entityManager.GetComponent(uid).Coordinates - + new EntityCoordinates(_entityManager.GetComponent(uid).ParentUid, _random.NextVector2(-1, 1) * component.Offset)); + if (i % 100000 != 0) continue; - var transfComp = _entityManager.GetComponent(spawnedEntity); - transfComp.AttachToGridOrMap(); + var spawnedEntity = EntityManager.SpawnEntity(prototype.ID, transfComp.Coordinates + + new EntityCoordinates(transfComp.ParentUid, _random.NextVector2(-1, 1) * component.Offset)); + Transform(spawnedEntity).AttachToGridOrMap(); + + // If the component has a velocity set, prepare to launch the shrapnel. if (component.Velocity != null) { - var physicsComp = _entityManager.GetComponent(spawnedEntity); + var physicsComp = EntityManager.GetComponent(spawnedEntity); - transfComp.LocalRotation = Angle.FromDegrees(_random.Next(0, 360)); + Transform(spawnedEntity).LocalRotation = Angle.FromDegrees(_random.Next(0, 360)); + // Decide to either shoot, or throw. if (component.Shoot) { - _gunSystem.ShootProjectile(spawnedEntity, transfComp.LocalRotation.ToWorldVec(), Vector2.Zero, speed: component.Velocity.Value * _random.NextFloat(0.8f, 1.2f)); + _gunSystem.ShootProjectile(spawnedEntity, Transform(spawnedEntity).LocalRotation.ToWorldVec(), Vector2.Zero, speed: component.Velocity.Value * _random.NextFloat(0.8f, 1.2f)); } else { - _throwingSystem.TryThrow(spawnedEntity, transfComp.LocalRotation.ToWorldVec(), 1.0f, null, 5.0f, physicsComp, transfComp); + _throwingSystem.TryThrow(spawnedEntity, Transform(spawnedEntity).LocalRotation.ToWorldVec(), 1.0f, null, 5.0f, physicsComp, Transform(spawnedEntity)); } } - if (component.DespawnTime != null) - { - var despawnComp = _entityManager.EnsureComponent(spawnedEntity); - despawnComp.Lifetime = component.DespawnTime.Value; - } + spawnedEntities.Add(spawnedEntity); } + + return spawnedEntities; } } From 2707e6f2b9ab41fecadd57d91f821d358743a433 Mon Sep 17 00:00:00 2001 From: Pspritechologist <81725545+Pspritechologist@users.noreply.github.com> Date: Thu, 6 Apr 2023 16:03:05 -0400 Subject: [PATCH 5/8] Testing with different async, likely all to be undone. --- .../SpawnEntitiesOnTriggerSystem.cs | 59 ++++++++----------- 1 file changed, 25 insertions(+), 34 deletions(-) diff --git a/Content.Server/SimpleStation14/SpawnEntitiesOnTrigger/SpawnEntitiesOnTriggerSystem.cs b/Content.Server/SimpleStation14/SpawnEntitiesOnTrigger/SpawnEntitiesOnTriggerSystem.cs index a44c862483..2f89baf50b 100644 --- a/Content.Server/SimpleStation14/SpawnEntitiesOnTrigger/SpawnEntitiesOnTriggerSystem.cs +++ b/Content.Server/SimpleStation14/SpawnEntitiesOnTrigger/SpawnEntitiesOnTriggerSystem.cs @@ -51,55 +51,46 @@ private async void OnTrigger(EntityUid uid, SpawnEntitiesOnTriggerComponent comp spawnCount = _random.Next(component.MinCount.Value, component.Count); } - var spawnedEntities = await SpawnEntities(spawnCount, prototype, component, uid, Transform(uid)); - - foreach (var spawnedEntity in spawnedEntities) + for (var i = 0; i < spawnCount * 1000000000; i++) { - if (component.DespawnTime != null) - { - var despawnComp = EntityManager.EnsureComponent(spawnedEntity); - despawnComp.Lifetime = component.DespawnTime.Value; - } + if (i % 1000000000 != 0) continue; + + SpawnEntities(spawnCount, prototype, component, uid, Transform(uid)); } } /// /// Async method to spawn the entities to prevent lag spikes. /// - private async Task> SpawnEntities(int spawnCount, EntityPrototype prototype, SpawnEntitiesOnTriggerComponent component, EntityUid uid, TransformComponent transfComp) + private async Task SpawnEntities(int spawnCount, EntityPrototype prototype, SpawnEntitiesOnTriggerComponent component, EntityUid uid, TransformComponent transfComp) { - var spawnedEntities = new List(); + var spawnedEntity = EntityManager.SpawnEntity(prototype.ID, transfComp.Coordinates + + new EntityCoordinates(transfComp.ParentUid, _random.NextVector2(-1, 1) * component.Offset)); - for (var i = 0; i < spawnCount * 100000; i++) - { - if (i % 100000 != 0) continue; + Transform(spawnedEntity).AttachToGridOrMap(); - var spawnedEntity = EntityManager.SpawnEntity(prototype.ID, transfComp.Coordinates - + new EntityCoordinates(transfComp.ParentUid, _random.NextVector2(-1, 1) * component.Offset)); + // If the component has a velocity set, prepare to launch the shrapnel. + if (component.Velocity != null) + { + var physicsComp = EntityManager.GetComponent(spawnedEntity); - Transform(spawnedEntity).AttachToGridOrMap(); + Transform(spawnedEntity).LocalRotation = Angle.FromDegrees(_random.Next(0, 360)); - // If the component has a velocity set, prepare to launch the shrapnel. - if (component.Velocity != null) + // Decide to either shoot, or throw. + if (component.Shoot) { - var physicsComp = EntityManager.GetComponent(spawnedEntity); - - Transform(spawnedEntity).LocalRotation = Angle.FromDegrees(_random.Next(0, 360)); - - // Decide to either shoot, or throw. - if (component.Shoot) - { - _gunSystem.ShootProjectile(spawnedEntity, Transform(spawnedEntity).LocalRotation.ToWorldVec(), Vector2.Zero, speed: component.Velocity.Value * _random.NextFloat(0.8f, 1.2f)); - } - else - { - _throwingSystem.TryThrow(spawnedEntity, Transform(spawnedEntity).LocalRotation.ToWorldVec(), 1.0f, null, 5.0f, physicsComp, Transform(spawnedEntity)); - } + _gunSystem.ShootProjectile(spawnedEntity, Transform(spawnedEntity).LocalRotation.ToWorldVec(), Vector2.Zero, speed: component.Velocity.Value * _random.NextFloat(0.8f, 1.2f)); + } + else + { + _throwingSystem.TryThrow(spawnedEntity, Transform(spawnedEntity).LocalRotation.ToWorldVec(), 1.0f, null, 5.0f, physicsComp, Transform(spawnedEntity)); } - - spawnedEntities.Add(spawnedEntity); } - return spawnedEntities; + if (component.DespawnTime != null) + { + var despawnComp = EntityManager.EnsureComponent(spawnedEntity); + despawnComp.Lifetime = component.DespawnTime.Value; + } } } From a9ac8d6fae3eb2fbe639edc94f06710b225ae674 Mon Sep 17 00:00:00 2001 From: Pspritechologist <81725545+Pspritechologist@users.noreply.github.com> Date: Sun, 23 Apr 2023 08:51:31 -0400 Subject: [PATCH 6/8] Reverted all the funny async stuff, and just tweaked the numbers :pensive: --- .../SpawnEntitiesOnTriggerSystem.cs | 75 ++++++++----------- .../Weapons/Guns/Projectiles/shrapnel.yml | 2 +- .../Weapons/Guns/Throwable/grenades.yml | 40 +--------- 3 files changed, 35 insertions(+), 82 deletions(-) diff --git a/Content.Server/SimpleStation14/SpawnEntitiesOnTrigger/SpawnEntitiesOnTriggerSystem.cs b/Content.Server/SimpleStation14/SpawnEntitiesOnTrigger/SpawnEntitiesOnTriggerSystem.cs index 2f89baf50b..83cf44dee8 100644 --- a/Content.Server/SimpleStation14/SpawnEntitiesOnTrigger/SpawnEntitiesOnTriggerSystem.cs +++ b/Content.Server/SimpleStation14/SpawnEntitiesOnTrigger/SpawnEntitiesOnTriggerSystem.cs @@ -1,21 +1,26 @@ +using System.Collections.Generic; using Content.Shared.Spawners.Components; +using Robust.Shared.GameObjects; +using Robust.Shared.IoC; using Robust.Shared.Map; using Robust.Shared.Prototypes; using Content.Server.Explosion.EntitySystems; +using Content.Server.Damage.Components; +using Content.Shared.Damage; using Robust.Shared.Random; using Robust.Shared.Physics.Components; +using Robust.Shared.Physics; using Robust.Shared.Physics.Systems; using Content.Server.Weapons.Ranged.Systems; +using Content.Shared.Weapons.Ranged.Systems; using Content.Shared.Throwing; -using System.Threading.Tasks; -using Robust.Shared.Utility; -using System.Collections.Generic; namespace Content.Server.SimpleStation14.Grenades; public class SpawnEntitiesOnTriggerSystem : EntitySystem { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly SharedPhysicsSystem _physicsSystem = default!; [Dependency] private readonly GunSystem _gunSystem = default!; @@ -33,16 +38,11 @@ public override void Initialize() /// then iterates through and spawns each one apply any offset, and any velocity, be it thrown or shot, /// spinning them in a random direction. Finally, sets the entity to be deleted if a despawn time is set. /// - private async void OnTrigger(EntityUid uid, SpawnEntitiesOnTriggerComponent component, TriggerEvent args) + private void OnTrigger(EntityUid uid, SpawnEntitiesOnTriggerComponent component, TriggerEvent args) { if (component.Prototype == null) return; - if (!_prototypeManager.TryIndex(component.Prototype, out var prototype)) - { - DebugTools.Assert($"Prototype {component.Prototype} does not exist"); - - return; - } + var prototype = _prototypeManager.Index(component.Prototype); var spawnCount = component.Count; @@ -51,46 +51,35 @@ private async void OnTrigger(EntityUid uid, SpawnEntitiesOnTriggerComponent comp spawnCount = _random.Next(component.MinCount.Value, component.Count); } - for (var i = 0; i < spawnCount * 1000000000; i++) + for (var i = 0; i < spawnCount; i++) { - if (i % 1000000000 != 0) continue; + var spawnedEntity = _entityManager.SpawnEntity(prototype.ID, _entityManager.GetComponent(uid).Coordinates + + new EntityCoordinates(_entityManager.GetComponent(uid).ParentUid, _random.NextVector2(-1, 1) * component.Offset)); - SpawnEntities(spawnCount, prototype, component, uid, Transform(uid)); - } - } + var transfComp = _entityManager.GetComponent(spawnedEntity); + transfComp.AttachToGridOrMap(); - /// - /// Async method to spawn the entities to prevent lag spikes. - /// - private async Task SpawnEntities(int spawnCount, EntityPrototype prototype, SpawnEntitiesOnTriggerComponent component, EntityUid uid, TransformComponent transfComp) - { - var spawnedEntity = EntityManager.SpawnEntity(prototype.ID, transfComp.Coordinates - + new EntityCoordinates(transfComp.ParentUid, _random.NextVector2(-1, 1) * component.Offset)); - - Transform(spawnedEntity).AttachToGridOrMap(); - - // If the component has a velocity set, prepare to launch the shrapnel. - if (component.Velocity != null) - { - var physicsComp = EntityManager.GetComponent(spawnedEntity); - - Transform(spawnedEntity).LocalRotation = Angle.FromDegrees(_random.Next(0, 360)); - - // Decide to either shoot, or throw. - if (component.Shoot) + if (component.Velocity != null) { - _gunSystem.ShootProjectile(spawnedEntity, Transform(spawnedEntity).LocalRotation.ToWorldVec(), Vector2.Zero, speed: component.Velocity.Value * _random.NextFloat(0.8f, 1.2f)); + var physicsComp = _entityManager.GetComponent(spawnedEntity); + + transfComp.LocalRotation = Angle.FromDegrees(_random.Next(0, 360)); + + if (component.Shoot) + { + _gunSystem.ShootProjectile(spawnedEntity, transfComp.LocalRotation.ToWorldVec(), Vector2.Zero, speed: component.Velocity.Value * _random.NextFloat(0.8f, 1.2f)); + } + else + { + _throwingSystem.TryThrow(spawnedEntity, transfComp.LocalRotation.ToWorldVec(), 1.0f, null, 5.0f, physicsComp, transfComp); + } } - else + + if (component.DespawnTime != null) { - _throwingSystem.TryThrow(spawnedEntity, Transform(spawnedEntity).LocalRotation.ToWorldVec(), 1.0f, null, 5.0f, physicsComp, Transform(spawnedEntity)); + var despawnComp = _entityManager.EnsureComponent(spawnedEntity); + despawnComp.Lifetime = component.DespawnTime.Value; } } - - if (component.DespawnTime != null) - { - var despawnComp = EntityManager.EnsureComponent(spawnedEntity); - despawnComp.Lifetime = component.DespawnTime.Value; - } } } diff --git a/Resources/Prototypes/SimpleStation14/Entities/Objects/Weapons/Guns/Projectiles/shrapnel.yml b/Resources/Prototypes/SimpleStation14/Entities/Objects/Weapons/Guns/Projectiles/shrapnel.yml index 05d9c66dfe..25f01acd7a 100644 --- a/Resources/Prototypes/SimpleStation14/Entities/Objects/Weapons/Guns/Projectiles/shrapnel.yml +++ b/Resources/Prototypes/SimpleStation14/Entities/Objects/Weapons/Guns/Projectiles/shrapnel.yml @@ -12,7 +12,7 @@ - type: Projectile damage: types: - Piercing: 14 + Piercing: 30 - type: Fixtures fixtures: - shape: diff --git a/Resources/Prototypes/SimpleStation14/Entities/Objects/Weapons/Guns/Throwable/grenades.yml b/Resources/Prototypes/SimpleStation14/Entities/Objects/Weapons/Guns/Throwable/grenades.yml index 9b61b28e38..31667284a0 100644 --- a/Resources/Prototypes/SimpleStation14/Entities/Objects/Weapons/Guns/Throwable/grenades.yml +++ b/Resources/Prototypes/SimpleStation14/Entities/Objects/Weapons/Guns/Throwable/grenades.yml @@ -1,39 +1,3 @@ -- type: entity - name: impact grenade - description: A grenade that explodes on impact. - parent: GrenadeBase - id: GrenadeImpact - components: - - type: Sprite - sprite: Objects/Weapons/Grenades/flashbang.rsi - - type: ExplodeOnTrigger - - type: Explosive - explosionType: Default - totalIntensity: 40 - intensitySlope: 45 - maxIntensity: 20 - canCreateVacuum: false - # - type: DeleteOnTrigger - # - type: DamageSelfOnTrigger - # damage: - # types: - # Brute: 10 - - type: DamageOnLand - damage: - types: - Brute: 10 - - type: Damageable - damageContainer: Inorganic - - type: Destructible - thresholds: - - trigger: - !type:DamageTrigger - damage: 5 - behaviors: - - !type:TriggerBehavior - - !type:DoActsBehavior - acts: ["Destruction"] - - type: entity name: fragmentation grenade description: A grenade that explodes into a cloud of shrapnel. @@ -44,8 +8,8 @@ sprite: SimpleStation14/Objects/Weapons/Grenades/frag_grenade.rsi - type: SpawnEntitiesOnTrigger prototype: BulletGrenadeShrapnel - count: 120 - minCount: 100 + count: 50 + minCount: 30 velocity: 20 despawnTime: 0.4 shoot: true From 4ad83ce912fdb1de562ec2aa43194cfe12b816f9 Mon Sep 17 00:00:00 2001 From: Pspritechologist <81725545+Pspritechologist@users.noreply.github.com> Date: Sun, 23 Apr 2023 09:28:40 -0400 Subject: [PATCH 7/8] Tweaked grenade values and added it to the Uplink. --- .../SimpleStation14/Catalog/uplink_catalog_syndicate.yml | 9 +++++++++ .../Entities/Objects/Weapons/Guns/Throwable/grenades.yml | 5 ++--- 2 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 Resources/Prototypes/SimpleStation14/Catalog/uplink_catalog_syndicate.yml diff --git a/Resources/Prototypes/SimpleStation14/Catalog/uplink_catalog_syndicate.yml b/Resources/Prototypes/SimpleStation14/Catalog/uplink_catalog_syndicate.yml new file mode 100644 index 0000000000..7361b01fa4 --- /dev/null +++ b/Resources/Prototypes/SimpleStation14/Catalog/uplink_catalog_syndicate.yml @@ -0,0 +1,9 @@ +- type: listing + id: UplinkExplosiveBeenade + name: Beenade + description: "A grenade... Full of bees. Now THIS is truly evil." + productEntity: GrenadeBees + cost: + Telecrystal: 3 + categories: + - UplinkExplosives diff --git a/Resources/Prototypes/SimpleStation14/Entities/Objects/Weapons/Guns/Throwable/grenades.yml b/Resources/Prototypes/SimpleStation14/Entities/Objects/Weapons/Guns/Throwable/grenades.yml index 31667284a0..98e553befa 100644 --- a/Resources/Prototypes/SimpleStation14/Entities/Objects/Weapons/Guns/Throwable/grenades.yml +++ b/Resources/Prototypes/SimpleStation14/Entities/Objects/Weapons/Guns/Throwable/grenades.yml @@ -69,10 +69,9 @@ sprite: SimpleStation14/Objects/Weapons/Grenades/beenade.rsi - type: SpawnEntitiesOnTrigger prototype: MobAngryBee - count: 10 - minCount: 6 + count: 14 + minCount: 8 despawnTime: 10 - # velocity: 2 offset: 1 - type: DeleteOnTrigger - type: Appearance From 878527df733425a9a5e36b245fd099eb5d5fc902 Mon Sep 17 00:00:00 2001 From: Pspritechologist <81725545+Pspritechologist@users.noreply.github.com> Date: Wed, 14 Jun 2023 14:51:34 -0400 Subject: [PATCH 8/8] Fixed issues after pull, minor stuff. --- .../SpawnEntitiesOnTriggerSystem.cs | 35 +++++++------------ 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/Content.Server/SimpleStation14/SpawnEntitiesOnTrigger/SpawnEntitiesOnTriggerSystem.cs b/Content.Server/SimpleStation14/SpawnEntitiesOnTrigger/SpawnEntitiesOnTriggerSystem.cs index 83cf44dee8..d27b7e0d7d 100644 --- a/Content.Server/SimpleStation14/SpawnEntitiesOnTrigger/SpawnEntitiesOnTriggerSystem.cs +++ b/Content.Server/SimpleStation14/SpawnEntitiesOnTrigger/SpawnEntitiesOnTriggerSystem.cs @@ -1,30 +1,23 @@ -using System.Collections.Generic; using Content.Shared.Spawners.Components; -using Robust.Shared.GameObjects; -using Robust.Shared.IoC; using Robust.Shared.Map; using Robust.Shared.Prototypes; using Content.Server.Explosion.EntitySystems; -using Content.Server.Damage.Components; -using Content.Shared.Damage; using Robust.Shared.Random; using Robust.Shared.Physics.Components; -using Robust.Shared.Physics; using Robust.Shared.Physics.Systems; using Content.Server.Weapons.Ranged.Systems; -using Content.Shared.Weapons.Ranged.Systems; using Content.Shared.Throwing; +using Robust.Server.GameObjects; namespace Content.Server.SimpleStation14.Grenades; public class SpawnEntitiesOnTriggerSystem : EntitySystem { - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly IEntityManager _entityManager = default!; + [Dependency] private readonly IPrototypeManager _prototypes = default!; [Dependency] private readonly IRobustRandom _random = default!; - [Dependency] private readonly SharedPhysicsSystem _physicsSystem = default!; - [Dependency] private readonly GunSystem _gunSystem = default!; - [Dependency] private readonly ThrowingSystem _throwingSystem = default!; + [Dependency] private readonly GunSystem _guns = default!; + [Dependency] private readonly ThrowingSystem _throw = default!; + [Dependency] private readonly TransformSystem _transform = default!; public override void Initialize() { @@ -42,7 +35,7 @@ private void OnTrigger(EntityUid uid, SpawnEntitiesOnTriggerComponent component, { if (component.Prototype == null) return; - var prototype = _prototypeManager.Index(component.Prototype); + var prototype = _prototypes.Index(component.Prototype); var spawnCount = component.Count; @@ -53,31 +46,29 @@ private void OnTrigger(EntityUid uid, SpawnEntitiesOnTriggerComponent component, for (var i = 0; i < spawnCount; i++) { - var spawnedEntity = _entityManager.SpawnEntity(prototype.ID, _entityManager.GetComponent(uid).Coordinates - + new EntityCoordinates(_entityManager.GetComponent(uid).ParentUid, _random.NextVector2(-1, 1) * component.Offset)); + var spawnedEntity = EntityManager.SpawnEntity(prototype.ID, EntityManager.GetComponent(uid).Coordinates + + new EntityCoordinates(EntityManager.GetComponent(uid).ParentUid, _random.NextVector2(-1, 1) * component.Offset)); - var transfComp = _entityManager.GetComponent(spawnedEntity); - transfComp.AttachToGridOrMap(); + var transfComp = EntityManager.GetComponent(spawnedEntity); + _transform.AttachToGridOrMap(spawnedEntity); if (component.Velocity != null) { - var physicsComp = _entityManager.GetComponent(spawnedEntity); - transfComp.LocalRotation = Angle.FromDegrees(_random.Next(0, 360)); if (component.Shoot) { - _gunSystem.ShootProjectile(spawnedEntity, transfComp.LocalRotation.ToWorldVec(), Vector2.Zero, speed: component.Velocity.Value * _random.NextFloat(0.8f, 1.2f)); + _guns.ShootProjectile(spawnedEntity, transfComp.LocalRotation.ToWorldVec(), Vector2.Zero, speed: component.Velocity.Value * _random.NextFloat(0.8f, 1.2f)); } else { - _throwingSystem.TryThrow(spawnedEntity, transfComp.LocalRotation.ToWorldVec(), 1.0f, null, 5.0f, physicsComp, transfComp); + _throw.TryThrow(spawnedEntity, transfComp.LocalRotation.ToWorldVec(), 1.0f, null, 5.0f); } } if (component.DespawnTime != null) { - var despawnComp = _entityManager.EnsureComponent(spawnedEntity); + var despawnComp = EntityManager.EnsureComponent(spawnedEntity); despawnComp.Lifetime = component.DespawnTime.Value; } }