mirror of
https://github.com/DeltaV-Station/Delta-v.git
synced 2026-10-01 08:37:26 +00:00
* Reapply "Nubody Merge" (#5807) This reverts commitd62f7cef10. * Revert "Nubody Merge (#5670)" This reverts commitb465cfb3fd. * Revert "IPC fibers (#4968)" This reverts commitc2b42211f0. * Revert "IPC Polymorph fix (#4545)" This reverts commitfa03d8c655. * Revert "fix IPC not having humanoid emotes (#4445)" This reverts commit216fdf999f. * Revert "ipc heat/cold (#4306)" This reverts commitfafd5cf816. * Revert "ipc cables (#4283)" This reverts commit54958039a1. * Revert "feat: ipcs now have dynamic power draw based off movement speed (#3917)" This reverts commit71e8b7e64b. * Revert "fix ipcs not being able to disarm (#3374)" This reverts commit764c4dcf54. * Revert "make steel heal caustic for ipcs (#3206)" This reverts commit450ac82550. * Revert "add missing ipc survival boxes (#3065)" This reverts commit888c9cdb00. * Revert "make borgs use ipc repairing (#3064)" This reverts commitf77a49dd0b. * Revert "Update hud.yml to add ipcs to diagnostic hud (#3019)" This reverts commit7220643531. * Revert "Tweak IPCs (#2979)" This reverts commit98b47476de. * Revert "fix nukies ipc test fail (#2957)" This reverts commit4a1acbf863. * Revert "fix ipc nukies not getting comms (#2884)" This reverts commit8a2254770e. * Revert "fix ipc encryption key mispredict (#2879)" This reverts commitf08726efc1. * Revert "Merge pull request #2800 from Spielern/port-ipc" This reverts commit822fa4312c, reversing changes made tofe4c23c702. * Remove and Fix rest of IPC Hangons causing crashes * Integration test Errors * Expand migration file with removed IPC stuff * IPC Leg was found and migrated to naught * Revert "Merge pull request #2542 from deltanedas/shitmed-ops" This reverts commit83a8002922, reversing changes made tobaa89b0052. * Revert "Set up surgical augments infrastructure & add tool panel augments (#3059)" This reverts commita40f0be6fd. * Revert "Psionic Prosthetics (#4689)" This reverts commit2679bb238a. * Revert "Add surgical cleanliness and sanitation (#2847)" This reverts commit64565ba4f7. * Remove unremoved mentions * Revert "Add autoclave to easily sanitize large amounts of items and faster (#2933)" This reverts commitd0da90fa2e. * Shit Med Removed * Remove _ShitMed Folders and fix Errors in Console * Add OrganAnimalBrain into the mirgraiton file * Heads no Input Mover * Monke * Full migration file I guess * oops * shiv state fix * Restore accidental deleted recipe * Forgot one flt mention * Fix more issues * Comment out Damage Visual for motorkind for now * Motorkind... * Commenting stuff out for now * thought there'd be more of this to gut --------- Co-authored-by: Janet Blackquill <uhhadd@gmail.com>
180 lines
6.1 KiB
C#
180 lines
6.1 KiB
C#
using Content.Shared.Damage;
|
|
using Content.Shared.FixedPoint;
|
|
using Robust.Shared.Audio;
|
|
using Robust.Shared.GameStates;
|
|
using Robust.Shared.Prototypes;
|
|
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
|
|
|
|
namespace Content.Shared.Weapons.Melee;
|
|
|
|
/// <summary>
|
|
/// When given to a mob lets them do unarmed attacks, or when given to an item lets someone wield it to do attacks.
|
|
/// </summary>
|
|
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(fieldDeltas: true), AutoGenerateComponentPause]
|
|
public sealed partial class MeleeWeaponComponent : Component
|
|
{
|
|
// TODO: This is becoming bloated as shit.
|
|
// This should just be its own component for alt attacks.
|
|
/// <summary>
|
|
/// Does this entity do a disarm on alt attack.
|
|
/// </summary>
|
|
[DataField, AutoNetworkedField]
|
|
public bool AltDisarm = true;
|
|
|
|
/// <summary>
|
|
/// Should the melee weapon's damage stats be examinable.
|
|
/// </summary>
|
|
[DataField, AutoNetworkedField]
|
|
public bool Hidden;
|
|
|
|
/// <summary>
|
|
/// Next time this component is allowed to light attack. Heavy attacks are wound up and never have a cooldown.
|
|
/// </summary>
|
|
[DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoNetworkedField]
|
|
[AutoPausedField]
|
|
public TimeSpan NextAttack;
|
|
|
|
/// <summary>
|
|
/// Starts attack cooldown when equipped if true.
|
|
/// </summary>
|
|
[DataField, AutoNetworkedField]
|
|
public bool ResetOnHandSelected = true;
|
|
|
|
/*
|
|
* Melee combat works based around 2 types of attacks:
|
|
* 1. Click attacks with left-click. This attacks whatever is under your mnouse
|
|
* 2. Wide attacks with right-click + left-click. This attacks whatever is in the direction of your mouse.
|
|
*/
|
|
|
|
/// <summary>
|
|
/// How many times we can attack per second.
|
|
/// </summary>
|
|
[DataField, AutoNetworkedField]
|
|
public float AttackRate = 1f;
|
|
|
|
/// <summary>
|
|
/// Are we currently holding down the mouse for an attack.
|
|
/// Used so we can't just hold the mouse button and attack constantly.
|
|
/// </summary>
|
|
[AutoNetworkedField]
|
|
public bool Attacking = false;
|
|
|
|
/// <summary>
|
|
/// If true, attacks will be repeated automatically without requiring the mouse button to be lifted.
|
|
/// </summary>
|
|
[DataField, AutoNetworkedField]
|
|
public bool AutoAttack;
|
|
|
|
/// <summary>
|
|
/// If true, attacks will bypass armor resistances.
|
|
/// </summary>
|
|
[DataField, AutoNetworkedField]
|
|
public bool ResistanceBypass = false;
|
|
|
|
/// <summary>
|
|
/// Base damage for this weapon. Can be modified via heavy damage or other means.
|
|
/// </summary>
|
|
[DataField(required: true), AutoNetworkedField]
|
|
public DamageSpecifier Damage = default!;
|
|
|
|
[DataField, AutoNetworkedField]
|
|
public FixedPoint2 BluntStaminaDamageFactor = FixedPoint2.New(0.5f);
|
|
|
|
/// <summary>
|
|
/// Multiplies damage by this amount for single-target attacks.
|
|
/// </summary>
|
|
[DataField, AutoNetworkedField]
|
|
public FixedPoint2 ClickDamageModifier = FixedPoint2.New(1);
|
|
|
|
// TODO: Temporarily 1.5 until interactionoutline is adjusted to use melee, then probably drop to 1.2
|
|
/// <summary>
|
|
/// Nearest edge range to hit an entity.
|
|
/// </summary>
|
|
[DataField, AutoNetworkedField]
|
|
public float Range = 1.5f;
|
|
|
|
/// <summary>
|
|
/// Total width of the angle for wide attacks.
|
|
/// </summary>
|
|
[DataField, AutoNetworkedField]
|
|
public Angle Angle = Angle.FromDegrees(60);
|
|
|
|
[DataField, AutoNetworkedField]
|
|
public EntProtoId Animation = "WeaponArcThrust";
|
|
|
|
[DataField, AutoNetworkedField]
|
|
public EntProtoId WideAnimation = "WeaponArcSlash";
|
|
|
|
/// <summary>
|
|
/// Rotation of the animation.
|
|
/// 0 degrees means the top faces the attacker.
|
|
/// </summary>
|
|
[DataField, AutoNetworkedField]
|
|
public Angle WideAnimationRotation = Angle.Zero;
|
|
|
|
/// <summary>
|
|
/// Attack animation direction.
|
|
/// </summary>
|
|
[DataField, AutoNetworkedField]
|
|
public bool SwingLeft;
|
|
|
|
/// <summary>
|
|
/// Change <see cref="SwingLeft"/> after every attack. Allows each attack to take turns being either left or right.
|
|
/// Thats looks cool visually
|
|
/// </summary>
|
|
[DataField, AutoNetworkedField]
|
|
public bool SwingBeverage = true;
|
|
|
|
/// <summary>
|
|
/// How far away from the player the animation should be played.
|
|
/// We don't connect it with attack range, because different weapons have different sprites,
|
|
/// and this value should be adjusted manually for every weapon ideally
|
|
/// </summary>
|
|
[DataField]
|
|
public float AnimationOffset = 1f;
|
|
|
|
// Sounds
|
|
|
|
/// <summary>
|
|
/// This gets played whenever a melee attack is done. This is predicted by the client.
|
|
/// </summary>
|
|
[ViewVariables(VVAccess.ReadWrite)]
|
|
[DataField("soundSwing"), AutoNetworkedField]
|
|
public SoundSpecifier SwingSound { get; set; } = new SoundPathSpecifier("/Audio/Weapons/punchmiss.ogg")
|
|
{
|
|
Params = AudioParams.Default.WithVolume(-3f).WithVariation(0.025f),
|
|
};
|
|
|
|
// We do not predict the below sounds in case the client thinks but the server disagrees. If this were the case
|
|
// then a player may doubt if the target actually took damage or not.
|
|
// If overwatch and apex do this then we probably should too.
|
|
|
|
[ViewVariables(VVAccess.ReadWrite)]
|
|
[DataField("soundHit"), AutoNetworkedField]
|
|
public SoundSpecifier? HitSound;
|
|
|
|
/// <summary>
|
|
/// Plays if no damage is done to the target entity.
|
|
/// </summary>
|
|
[ViewVariables(VVAccess.ReadWrite)]
|
|
[DataField("soundNoDamage"), AutoNetworkedField]
|
|
public SoundSpecifier NoDamageSound { get; set; } = new SoundCollectionSpecifier("WeakHit");
|
|
|
|
/// <summary>
|
|
/// If true, the weapon must be equipped for it to be used.
|
|
/// E.g boxing gloves must be equipped to your gloves,
|
|
/// not just held in your hand to be used.
|
|
/// </summary>
|
|
[DataField, AutoNetworkedField]
|
|
public bool MustBeEquippedToUse = false;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Event raised on entity in GetWeapon function to allow systems to manually
|
|
/// specify what the weapon should be.
|
|
/// </summary>
|
|
public sealed class GetMeleeWeaponEvent : HandledEntityEventArgs
|
|
{
|
|
public EntityUid? Weapon;
|
|
}
|