Proto-kinetic crusher (#16277)
Co-authored-by: AJCM-git <60196617+AJCM-git@users.noreply.github.com>
This commit is contained in:
@@ -86,6 +86,6 @@ public sealed class ProjectileAnomalySystem : EntitySystem
|
||||
|
||||
comp.Damage *= severity;
|
||||
|
||||
_gunSystem.ShootProjectile(ent, direction, Vector2.Zero, uid, component.MaxProjectileSpeed * severity);
|
||||
_gunSystem.ShootProjectile(ent, direction, Vector2.Zero, uid, uid, component.MaxProjectileSpeed * severity);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,5 +6,9 @@ namespace Content.Server.Gatherable.Components;
|
||||
[RegisterComponent]
|
||||
public sealed class GatheringProjectileComponent : Component
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// How many more times we can gather.
|
||||
/// </summary>
|
||||
[ViewVariables(VVAccess.ReadWrite), DataField("amount")]
|
||||
public int Amount = 1;
|
||||
}
|
||||
|
||||
@@ -17,12 +17,16 @@ public sealed partial class GatherableSystem
|
||||
{
|
||||
if (!args.OtherFixture.Hard ||
|
||||
args.OurFixture.ID != SharedProjectileSystem.ProjectileFixture ||
|
||||
component.Amount <= 0 ||
|
||||
!TryComp<GatherableComponent>(args.OtherEntity, out var gatherable))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Gather(args.OtherEntity, uid, gatherable);
|
||||
QueueDel(uid);
|
||||
component.Amount--;
|
||||
|
||||
if (component.Amount <= 0)
|
||||
QueueDel(uid);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
using Content.Server.Actions;
|
||||
using Content.Server.Popups;
|
||||
using Content.Server.PowerCell;
|
||||
using Content.Shared.Actions;
|
||||
using Content.Shared.Actions.ActionTypes;
|
||||
using Content.Shared.Examine;
|
||||
using Content.Shared.Interaction;
|
||||
using Content.Shared.Light;
|
||||
@@ -11,10 +8,7 @@ using Content.Shared.Toggleable;
|
||||
using Content.Shared.Verbs;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Server.GameObjects;
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.Containers;
|
||||
using Robust.Shared.GameStates;
|
||||
using Robust.Shared.Player;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Utility;
|
||||
|
||||
@@ -37,7 +31,6 @@ namespace Content.Server.Light.EntitySystems
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<HandheldLightComponent, ComponentRemove>(OnRemove);
|
||||
SubscribeLocalEvent<HandheldLightComponent, ComponentGetState>(OnGetState);
|
||||
|
||||
SubscribeLocalEvent<HandheldLightComponent, ExaminedEvent>(OnExamine);
|
||||
@@ -45,41 +38,7 @@ namespace Content.Server.Light.EntitySystems
|
||||
|
||||
SubscribeLocalEvent<HandheldLightComponent, ActivateInWorldEvent>(OnActivate);
|
||||
|
||||
SubscribeLocalEvent<HandheldLightComponent, GetItemActionsEvent>(OnGetActions);
|
||||
SubscribeLocalEvent<HandheldLightComponent, ToggleActionEvent>(OnToggleAction);
|
||||
|
||||
SubscribeLocalEvent<HandheldLightComponent, EntInsertedIntoContainerMessage>(OnEntInserted);
|
||||
SubscribeLocalEvent<HandheldLightComponent, EntRemovedFromContainerMessage>(OnEntRemoved);
|
||||
}
|
||||
|
||||
private void OnEntInserted(
|
||||
EntityUid uid,
|
||||
HandheldLightComponent component,
|
||||
EntInsertedIntoContainerMessage args)
|
||||
{
|
||||
// Not guaranteed to be the correct container for our slot, I don't care.
|
||||
UpdateLevel(uid, component);
|
||||
}
|
||||
|
||||
private void OnEntRemoved(
|
||||
EntityUid uid,
|
||||
HandheldLightComponent component,
|
||||
EntRemovedFromContainerMessage args)
|
||||
{
|
||||
// Ditto above
|
||||
UpdateLevel(uid, component);
|
||||
}
|
||||
|
||||
private void OnGetActions(EntityUid uid, HandheldLightComponent component, GetItemActionsEvent args)
|
||||
{
|
||||
if (component.ToggleAction == null
|
||||
&& _proto.TryIndex(component.ToggleActionId, out InstantActionPrototype? act))
|
||||
{
|
||||
component.ToggleAction = new(act);
|
||||
}
|
||||
|
||||
if (component.ToggleAction != null)
|
||||
args.Actions.Add(component.ToggleAction);
|
||||
}
|
||||
|
||||
private void OnToggleAction(EntityUid uid, HandheldLightComponent component, ToggleActionEvent args)
|
||||
@@ -114,11 +73,6 @@ namespace Content.Server.Light.EntitySystems
|
||||
return (byte?) ContentHelpers.RoundToNearestLevels(battery.CurrentCharge / battery.MaxCharge * 255, 255, HandheldLightComponent.StatusLevels);
|
||||
}
|
||||
|
||||
private void OnRemove(EntityUid uid, HandheldLightComponent component, ComponentRemove args)
|
||||
{
|
||||
_activeLights.Remove(component);
|
||||
}
|
||||
|
||||
private void OnActivate(EntityUid uid, HandheldLightComponent component, ActivateInWorldEvent args)
|
||||
{
|
||||
if (args.Handled)
|
||||
@@ -144,36 +98,6 @@ namespace Content.Server.Light.EntitySystems
|
||||
: Loc.GetString("handheld-light-component-on-examine-is-off-message"));
|
||||
}
|
||||
|
||||
public override void Shutdown()
|
||||
{
|
||||
base.Shutdown();
|
||||
_activeLights.Clear();
|
||||
}
|
||||
|
||||
public override void Update(float frameTime)
|
||||
{
|
||||
var toRemove = new RemQueue<HandheldLightComponent>();
|
||||
|
||||
foreach (var handheld in _activeLights)
|
||||
{
|
||||
var uid = handheld.Owner;
|
||||
|
||||
if (handheld.Deleted)
|
||||
{
|
||||
toRemove.Add(handheld);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (Paused(uid)) continue;
|
||||
TryUpdate(uid, handheld, frameTime);
|
||||
}
|
||||
|
||||
foreach (var light in toRemove)
|
||||
{
|
||||
_activeLights.Remove(light);
|
||||
}
|
||||
}
|
||||
|
||||
private void AddToggleLightVerb(EntityUid uid, HandheldLightComponent component, GetVerbsEvent<ActivationVerb> args)
|
||||
{
|
||||
if (!args.CanAccess || !args.CanInteract)
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using Content.Server.PowerCell;
|
||||
using Content.Shared.Interaction.Events;
|
||||
using Content.Shared.Pinpointer;
|
||||
using Content.Shared.PowerCell;
|
||||
using Robust.Server.GameObjects;
|
||||
using Robust.Shared.Timing;
|
||||
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
|
||||
|
||||
namespace Content.Server.PowerCell;
|
||||
|
||||
/// <summary>
|
||||
/// Indicates that the entity's ActivatableUI requires power or else it closes.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(PowerCellSystem))]
|
||||
public sealed class PowerCellDrawComponent : Component
|
||||
{
|
||||
[ViewVariables(VVAccess.ReadWrite), DataField("enabled")]
|
||||
public bool Enabled;
|
||||
|
||||
/// <summary>
|
||||
/// How much the entity draws while the UI is open.
|
||||
/// Set to 0 if you just wish to check for power upon opening the UI.
|
||||
/// </summary>
|
||||
[ViewVariables(VVAccess.ReadWrite), DataField("drawRate")]
|
||||
public float DrawRate = 1f;
|
||||
|
||||
/// <summary>
|
||||
/// How much power is used whenever the entity is "used".
|
||||
/// This is used to ensure the UI won't open again without a minimum use power.
|
||||
/// </summary>
|
||||
[ViewVariables(VVAccess.ReadWrite), DataField("useRate")]
|
||||
public float UseRate;
|
||||
|
||||
/// <summary>
|
||||
/// When the next automatic power draw will occur
|
||||
/// </summary>
|
||||
[DataField("nextUpdate", customTypeSerializer: typeof(TimeOffsetSerializer))]
|
||||
public TimeSpan NextUpdateTime;
|
||||
}
|
||||
91
Content.Server/PowerCell/PowerCellSystem.Draw.cs
Normal file
91
Content.Server/PowerCell/PowerCellSystem.Draw.cs
Normal file
@@ -0,0 +1,91 @@
|
||||
using Content.Server.Power.Components;
|
||||
using Content.Shared.PowerCell;
|
||||
using Content.Shared.PowerCell.Components;
|
||||
|
||||
namespace Content.Server.PowerCell;
|
||||
|
||||
public sealed partial class PowerCellSystem
|
||||
{
|
||||
/*
|
||||
* Handles PowerCellDraw
|
||||
*/
|
||||
|
||||
private static readonly TimeSpan Delay = TimeSpan.FromSeconds(1);
|
||||
|
||||
public override void Update(float frameTime)
|
||||
{
|
||||
base.Update(frameTime);
|
||||
var query = EntityQueryEnumerator<PowerCellDrawComponent, PowerCellSlotComponent>();
|
||||
|
||||
while (query.MoveNext(out var uid, out var comp, out var slot))
|
||||
{
|
||||
if (!comp.Drawing)
|
||||
continue;
|
||||
|
||||
if (_timing.CurTime < comp.NextUpdateTime)
|
||||
continue;
|
||||
|
||||
comp.NextUpdateTime += Delay;
|
||||
|
||||
if (!TryGetBatteryFromSlot(uid, out var batteryEnt, out var battery, slot))
|
||||
continue;
|
||||
|
||||
if (_battery.TryUseCharge(batteryEnt.Value, comp.DrawRate, battery))
|
||||
continue;
|
||||
|
||||
comp.Drawing = false;
|
||||
var ev = new PowerCellSlotEmptyEvent();
|
||||
RaiseLocalEvent(uid, ref ev);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnUnpaused(EntityUid uid, PowerCellDrawComponent component, ref EntityUnpausedEvent args)
|
||||
{
|
||||
component.NextUpdateTime += args.PausedTime;
|
||||
}
|
||||
|
||||
private void OnDrawChargeChanged(EntityUid uid, PowerCellDrawComponent component, ref ChargeChangedEvent args)
|
||||
{
|
||||
// Update the bools for client prediction.
|
||||
bool canDraw;
|
||||
bool canUse;
|
||||
|
||||
if (component.UseRate > 0f)
|
||||
{
|
||||
canUse = args.Charge > component.UseRate;
|
||||
}
|
||||
else
|
||||
{
|
||||
canUse = true;
|
||||
}
|
||||
|
||||
if (component.DrawRate > 0f)
|
||||
{
|
||||
canDraw = args.Charge > 0f;
|
||||
}
|
||||
else
|
||||
{
|
||||
canDraw = true;
|
||||
}
|
||||
|
||||
if (canUse != component.CanUse || canDraw != component.CanDraw)
|
||||
{
|
||||
component.CanDraw = canDraw;
|
||||
component.CanUse = canUse;
|
||||
Dirty(component);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnDrawCellChanged(EntityUid uid, PowerCellDrawComponent component, PowerCellChangedEvent args)
|
||||
{
|
||||
var canDraw = !args.Ejected && HasCharge(uid, float.MinValue);
|
||||
var canUse = !args.Ejected && HasActivatableCharge(uid, component);
|
||||
|
||||
if (canUse != component.CanUse || canDraw != component.CanDraw)
|
||||
{
|
||||
component.CanDraw = canDraw;
|
||||
component.CanUse = canUse;
|
||||
Dirty(component);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -19,7 +19,10 @@ using Robust.Shared.Timing;
|
||||
|
||||
namespace Content.Server.PowerCell;
|
||||
|
||||
public sealed class PowerCellSystem : SharedPowerCellSystem
|
||||
/// <summary>
|
||||
/// Handles Power cells
|
||||
/// </summary>
|
||||
public sealed partial class PowerCellSystem : SharedPowerCellSystem
|
||||
{
|
||||
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
|
||||
[Dependency] private readonly IGameTiming _timing = default!;
|
||||
@@ -39,43 +42,19 @@ public sealed class PowerCellSystem : SharedPowerCellSystem
|
||||
SubscribeLocalEvent<PowerCellComponent, ChargeChangedEvent>(OnChargeChanged);
|
||||
SubscribeLocalEvent<PowerCellComponent, SolutionChangedEvent>(OnSolutionChange);
|
||||
SubscribeLocalEvent<PowerCellComponent, RejuvenateEvent>(OnRejuvenate);
|
||||
|
||||
SubscribeLocalEvent<PowerCellComponent, ExaminedEvent>(OnCellExamined);
|
||||
SubscribeLocalEvent<PowerCellSlotComponent, ExaminedEvent>(OnCellSlotExamined);
|
||||
|
||||
SubscribeLocalEvent<PowerCellDrawComponent, EntityUnpausedEvent>(OnUnpaused);
|
||||
SubscribeLocalEvent<PowerCellDrawComponent, ChargeChangedEvent>(OnDrawChargeChanged);
|
||||
SubscribeLocalEvent<PowerCellDrawComponent, PowerCellChangedEvent>(OnDrawCellChanged);
|
||||
|
||||
// funny
|
||||
SubscribeLocalEvent<PowerCellSlotComponent, ExaminedEvent>(OnCellSlotExamined);
|
||||
SubscribeLocalEvent<PowerCellSlotComponent, BeingMicrowavedEvent>(OnSlotMicrowaved);
|
||||
|
||||
SubscribeLocalEvent<BatteryComponent, BeingMicrowavedEvent>(OnMicrowaved);
|
||||
}
|
||||
|
||||
public override void Update(float frameTime)
|
||||
{
|
||||
base.Update(frameTime);
|
||||
var query = EntityQueryEnumerator<PowerCellDrawComponent, PowerCellSlotComponent>();
|
||||
|
||||
while (query.MoveNext(out var uid, out var comp, out var slot))
|
||||
{
|
||||
if (!comp.Enabled)
|
||||
continue;
|
||||
|
||||
if (_timing.CurTime < comp.NextUpdateTime)
|
||||
continue;
|
||||
comp.NextUpdateTime += TimeSpan.FromSeconds(1);
|
||||
|
||||
if (!TryGetBatteryFromSlot(uid, out var batteryEnt, out var battery, slot))
|
||||
continue;
|
||||
|
||||
if (_battery.TryUseCharge(batteryEnt.Value, comp.DrawRate, battery))
|
||||
continue;
|
||||
|
||||
comp.Enabled = false;
|
||||
var ev = new PowerCellSlotEmptyEvent();
|
||||
RaiseLocalEvent(uid, ref ev);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnRejuvenate(EntityUid uid, PowerCellComponent component, RejuvenateEvent args)
|
||||
{
|
||||
component.IsRigged = false;
|
||||
@@ -83,13 +62,13 @@ public sealed class PowerCellSystem : SharedPowerCellSystem
|
||||
|
||||
private void OnSlotMicrowaved(EntityUid uid, PowerCellSlotComponent component, BeingMicrowavedEvent args)
|
||||
{
|
||||
if (_itemSlotsSystem.TryGetSlot(uid, component.CellSlotId, out ItemSlot? slot))
|
||||
{
|
||||
if (slot.Item == null)
|
||||
return;
|
||||
if (!_itemSlotsSystem.TryGetSlot(uid, component.CellSlotId, out var slot))
|
||||
return;
|
||||
|
||||
RaiseLocalEvent(slot.Item.Value, args);
|
||||
}
|
||||
if (slot.Item == null)
|
||||
return;
|
||||
|
||||
RaiseLocalEvent(slot.Item.Value, args);
|
||||
}
|
||||
|
||||
private void OnMicrowaved(EntityUid uid, BatteryComponent component, BeingMicrowavedEvent args)
|
||||
@@ -111,17 +90,14 @@ public sealed class PowerCellSystem : SharedPowerCellSystem
|
||||
return;
|
||||
}
|
||||
|
||||
if (!TryComp(uid, out AppearanceComponent? appearance))
|
||||
return;
|
||||
|
||||
var frac = args.Charge / args.MaxCharge;
|
||||
var level = (byte) ContentHelpers.RoundToNearestLevels(frac, 1, PowerCellComponent.PowerCellVisualsLevels);
|
||||
_sharedAppearanceSystem.SetData(uid, PowerCellVisuals.ChargeLevel, level, appearance);
|
||||
_sharedAppearanceSystem.SetData(uid, PowerCellVisuals.ChargeLevel, level);
|
||||
|
||||
// If this power cell is inside a cell-slot, inform that entity that the power has changed (for updating visuals n such).
|
||||
if (_containerSystem.TryGetContainingContainer(uid, out var container)
|
||||
&& TryComp(container.Owner, out PowerCellSlotComponent? slot)
|
||||
&& _itemSlotsSystem.TryGetSlot(container.Owner, slot.CellSlotId, out ItemSlot? itemSlot))
|
||||
&& _itemSlotsSystem.TryGetSlot(container.Owner, slot.CellSlotId, out var itemSlot))
|
||||
{
|
||||
if (itemSlot.Item == uid)
|
||||
RaiseLocalEvent(container.Owner, new PowerCellChangedEvent(false));
|
||||
@@ -136,11 +112,6 @@ public sealed class PowerCellSystem : SharedPowerCellSystem
|
||||
RaiseLocalEvent(uid, ref ev);
|
||||
}
|
||||
|
||||
private void OnUnpaused(EntityUid uid, PowerCellDrawComponent component, ref EntityUnpausedEvent args)
|
||||
{
|
||||
component.NextUpdateTime += args.PausedTime;
|
||||
}
|
||||
|
||||
private void Explode(EntityUid uid, BatteryComponent? battery = null, EntityUid? cause = null)
|
||||
{
|
||||
if (!Resolve(uid, ref battery))
|
||||
@@ -190,10 +161,10 @@ public sealed class PowerCellSystem : SharedPowerCellSystem
|
||||
|
||||
public void SetPowerCellDrawEnabled(EntityUid uid, bool enabled, PowerCellDrawComponent? component = null)
|
||||
{
|
||||
if (!Resolve(uid, ref component, false))
|
||||
if (!Resolve(uid, ref component, false) || enabled == component.Drawing)
|
||||
return;
|
||||
|
||||
component.Enabled = enabled;
|
||||
component.Drawing = enabled;
|
||||
component.NextUpdateTime = _timing.CurTime;
|
||||
}
|
||||
|
||||
|
||||
@@ -26,12 +26,6 @@ public sealed class ProjectileSystem : SharedProjectileSystem
|
||||
{
|
||||
base.Initialize();
|
||||
SubscribeLocalEvent<ProjectileComponent, StartCollideEvent>(OnStartCollide);
|
||||
SubscribeLocalEvent<ProjectileComponent, ComponentGetState>(OnGetState);
|
||||
}
|
||||
|
||||
private void OnGetState(EntityUid uid, ProjectileComponent component, ref ComponentGetState args)
|
||||
{
|
||||
args.State = new ProjectileComponentState(component.Shooter, component.IgnoreShooter);
|
||||
}
|
||||
|
||||
private void OnStartCollide(EntityUid uid, ProjectileComponent component, ref StartCollideEvent args)
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using Content.Server.PowerCell;
|
||||
using Content.Shared.PowerCell;
|
||||
using Content.Shared.UserInterface;
|
||||
|
||||
namespace Content.Server.UserInterface;
|
||||
|
||||
8
Content.Server/Weapons/DamageMarkerSystem.cs
Normal file
8
Content.Server/Weapons/DamageMarkerSystem.cs
Normal file
@@ -0,0 +1,8 @@
|
||||
using Content.Shared.Weapons.Marker;
|
||||
|
||||
namespace Content.Server.Weapons;
|
||||
|
||||
public sealed class DamageMarkerSystem : SharedDamageMarkerSystem
|
||||
{
|
||||
|
||||
}
|
||||
@@ -118,7 +118,7 @@ public sealed partial class GunSystem : SharedGunSystem
|
||||
// pneumatic cannon doesn't shoot bullets it just throws them, ignore ammo handling
|
||||
if (throwItems && ent != null)
|
||||
{
|
||||
ShootOrThrow(ent.Value, mapDirection, gunVelocity, gun, user);
|
||||
ShootOrThrow(ent.Value, mapDirection, gunVelocity, gun, gunUid, user);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -136,14 +136,14 @@ public sealed partial class GunSystem : SharedGunSystem
|
||||
for (var i = 0; i < cartridge.Count; i++)
|
||||
{
|
||||
var uid = Spawn(cartridge.Prototype, fromEnt);
|
||||
ShootOrThrow(uid, angles[i].ToVec(), gunVelocity, gun, user);
|
||||
ShootOrThrow(uid, angles[i].ToVec(), gunVelocity, gun, gunUid, user);
|
||||
shotProjectiles.Add(uid);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var uid = Spawn(cartridge.Prototype, fromEnt);
|
||||
ShootOrThrow(uid, mapDirection, gunVelocity, gun, user);
|
||||
ShootOrThrow(uid, mapDirection, gunVelocity, gun, gunUid, user);
|
||||
shotProjectiles.Add(uid);
|
||||
}
|
||||
|
||||
@@ -175,7 +175,7 @@ public sealed partial class GunSystem : SharedGunSystem
|
||||
shotProjectiles.Add(ent!.Value);
|
||||
MuzzleFlash(gunUid, newAmmo, user);
|
||||
Audio.PlayPredicted(gun.SoundGunshot, gunUid, user);
|
||||
ShootOrThrow(ent.Value, mapDirection, gunVelocity, gun, user);
|
||||
ShootOrThrow(ent.Value, mapDirection, gunVelocity, gun, gunUid, user);
|
||||
break;
|
||||
case HitscanPrototype hitscan:
|
||||
|
||||
@@ -265,7 +265,7 @@ public sealed partial class GunSystem : SharedGunSystem
|
||||
});
|
||||
}
|
||||
|
||||
private void ShootOrThrow(EntityUid uid, Vector2 mapDirection, Vector2 gunVelocity, GunComponent gun, EntityUid? user)
|
||||
private void ShootOrThrow(EntityUid uid, Vector2 mapDirection, Vector2 gunVelocity, GunComponent gun, EntityUid gunUid, EntityUid? user)
|
||||
{
|
||||
// Do a throw
|
||||
if (!HasComp<ProjectileComponent>(uid))
|
||||
@@ -276,10 +276,10 @@ public sealed partial class GunSystem : SharedGunSystem
|
||||
return;
|
||||
}
|
||||
|
||||
ShootProjectile(uid, mapDirection, gunVelocity, user, gun.ProjectileSpeed);
|
||||
ShootProjectile(uid, mapDirection, gunVelocity, gunUid, user, gun.ProjectileSpeed);
|
||||
}
|
||||
|
||||
public void ShootProjectile(EntityUid uid, Vector2 direction, Vector2 gunVelocity, EntityUid? user = null, float speed = 20f)
|
||||
public void ShootProjectile(EntityUid uid, Vector2 direction, Vector2 gunVelocity, EntityUid gunUid, EntityUid? user = null, float speed = 20f)
|
||||
{
|
||||
var physics = EnsureComp<PhysicsComponent>(uid);
|
||||
Physics.SetBodyStatus(physics, BodyStatus.InAir);
|
||||
@@ -293,6 +293,7 @@ public sealed partial class GunSystem : SharedGunSystem
|
||||
{
|
||||
var projectile = EnsureComp<ProjectileComponent>(uid);
|
||||
Projectiles.SetShooter(projectile, user.Value);
|
||||
projectile.Weapon = gunUid;
|
||||
}
|
||||
|
||||
TransformSystem.SetWorldRotation(uid, direction.ToWorldAngle());
|
||||
|
||||
Reference in New Issue
Block a user