Модули для оружия (#222)

This commit is contained in:
CaypenNow
2024-03-30 01:33:08 +05:00
committed by GitHub
37 changed files with 698 additions and 3 deletions

View File

@@ -231,7 +231,7 @@ public sealed partial class GunComponent : Component
// WD START
public EntityUid? Target;
[DataField("forceThrowingAngle")]
[ViewVariables(VVAccess.ReadWrite)]
public bool ForceThrowingAngle;

View File

@@ -1,3 +1,4 @@
using Content.Shared._White.WeaponModules;
using Content.Shared.Actions;
using Content.Shared.Examine;
using Content.Shared.Hands;
@@ -21,6 +22,20 @@ public abstract partial class SharedGunSystem
args.PushMarkup(Loc.GetString("gun-fire-rate-examine", ("color", FireRateExamineColor),
("fireRate", $"{component.FireRateModified:0.0}")));
if (TryComp<WeaponModulesComponent>(uid, out var weaponModulesComponent))
{
if (weaponModulesComponent.Modules.Count == 0)
{
args.PushMarkup(Loc.GetString("gun-modules", ("modules", "Пусто")));
return;
}
foreach (var module in weaponModulesComponent.Modules)
{
args.PushMarkup(Loc.GetString("gun-modules", ("modules", Name(module))));
}
}
if (!TryComp<TwoModeEnergyAmmoProviderComponent>(uid, out var comp))
return;

View File

@@ -1,5 +1,6 @@
using System.Diagnostics.CodeAnalysis;
using System.Numerics;
using Content.Shared._White.WeaponModules;
using Content.Shared.ActionBlocker;
using Content.Shared.Actions;
using Content.Shared.Administration.Logs;
@@ -476,6 +477,9 @@ public abstract partial class SharedGunSystem : EntitySystem
protected void MuzzleFlash(EntityUid gun, AmmoComponent component, EntityUid? user = null)
{
bool cancelled = TryComp<WeaponModulesComponent>(gun, out var weaponModulesComponent) && weaponModulesComponent.WeaponFireEffect; // WD EDIT
if(cancelled) return; // WD EDIT END
var attemptEv = new GunMuzzleFlashAttemptEvent();
RaiseLocalEvent(gun, ref attemptEv);
if (attemptEv.Cancelled)
@@ -534,9 +538,38 @@ public abstract partial class SharedGunSystem : EntitySystem
Dirty(gun);
}
// WD EDIT
public void SetProjectileSpeed(EntityUid weapon, float projectileSpeed)
{
if(!TryComp<GunComponent>(weapon, out var gunComponent))
return;
gunComponent.ProjectileSpeed = projectileSpeed;
RefreshModifiers(weapon);
}
public void SetFireRate(EntityUid weapon, float fireRate)
{
if(!TryComp<GunComponent>(weapon, out var gunComponent))
return;
gunComponent.FireRate = fireRate;
RefreshModifiers(weapon);
}
public void SetSound(EntityUid weapon, SoundSpecifier sound)
{
if(!TryComp<GunComponent>(weapon, out var gunComponent))
return;
gunComponent.SoundGunshot = sound;
RefreshModifiers(weapon);
}
// WD EDIT END
protected abstract void CreateEffect(EntityUid uid, MuzzleFlashEvent message, EntityUid? user = null);
/// <summary>
/// Used for animated effects on the client.
/// </summary>

View File

@@ -0,0 +1,12 @@
namespace Content.Shared._White.WeaponModules;
/// <summary>
/// This is used for...
/// </summary>
[RegisterComponent]
public sealed partial class AcceleratorModuleComponent : BaseModuleComponent
{
public float OldFireRate;
public float FireRateAdd = 2.4F;
}

View File

@@ -0,0 +1,11 @@
using Robust.Shared.GameStates;
namespace Content.Shared._White.WeaponModules;
[RegisterComponent, NetworkedComponent]
public partial class BaseModuleComponent : Component
{
[ViewVariables(VVAccess.ReadWrite), DataField("value")]
public string AppearanceValue;
}

View File

@@ -0,0 +1,9 @@
namespace Content.Shared._White.WeaponModules;
/// <summary>
/// This is used for...
/// </summary>
[RegisterComponent]
public sealed partial class FlameHiderModuleComponent : BaseModuleComponent
{
}

View File

@@ -0,0 +1,12 @@
namespace Content.Shared._White.WeaponModules;
/// <summary>
/// This is used for...
/// </summary>
[RegisterComponent]
public sealed partial class LaserModuleComponent : BaseModuleComponent
{
public float OldProjectileSpeed;
public float ProjectileSpeedAdd = 15F;
}

View File

@@ -0,0 +1,12 @@
namespace Content.Shared._White.WeaponModules;
/// <summary>
/// LightModuleComponent
/// </summary>
[RegisterComponent]
public sealed partial class LightModuleComponent : BaseModuleComponent
{
public bool Enabled;
public float Radius = 4F;
}

View File

@@ -0,0 +1,14 @@
using Robust.Shared.Audio;
namespace Content.Shared._White.WeaponModules;
/// <summary>
/// This is used for...
/// </summary>
[RegisterComponent]
public sealed partial class SilencerModuleComponent : BaseModuleComponent
{
public SoundSpecifier? OldSoundGunshot;
public SoundSpecifier NewSoundGunshot = new SoundPathSpecifier("/Audio/White/Weapons/Modules/silence.ogg");
}

View File

@@ -0,0 +1,29 @@
using Robust.Shared.GameStates;
using Robust.Shared.Serialization;
namespace Content.Shared._White.WeaponModules;
/// <summary>
/// Base Module Component
/// </summary>
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public partial class WeaponModulesComponent : Component
{
[ViewVariables(VVAccess.ReadWrite), DataField]
public List<EntityUid> Modules = new();
[ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
public bool WeaponFireEffect;
}
[Serializable, NetSerializable]
public enum ModuleVisualState : byte
{
Module
}
[Serializable, NetSerializable]
public enum Modules : byte
{
Light
}