Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
efebf22
Speaker Toy Api
MS-crew Jan 2, 2026
959fe93
.
MS-crew Jan 3, 2026
0c798d4
chore: trigger CI
MS-crew Jan 3, 2026
f02fd3b
added missing doc
MS-crew Jan 3, 2026
b93a350
Change default stream parameter to false in PlayWav
MS-crew Jan 3, 2026
63fc8bf
Improve XML documentation for Channel property
MS-crew Jan 3, 2026
a2d006e
Update WavStreamSource.cs
MS-crew Jan 3, 2026
67b3348
Update Speaker.cs
MS-crew Jan 3, 2026
21c91cc
Update Speaker.cs
MS-crew Jan 3, 2026
052e46d
Update performance
MS-crew Jan 3, 2026
51298ee
Update Speaker.cs
MS-crew Jan 4, 2026
3f7ce95
Implemented audio seeking, event system, and precision timing
MS-crew Jan 5, 2026
9285154
Update Speaker.cs
MS-crew Jan 5, 2026
072aba8
Update WavUtility.cs
MS-crew Jan 6, 2026
6b97e0f
Update Speaker.cs
MS-crew Jan 6, 2026
49df481
Update Speaker.cs
MS-crew Jan 6, 2026
ccca1ab
Update Speaker.cs
MS-crew Jan 6, 2026
85193d9
Update Speaker.cs
MS-crew Jan 6, 2026
89fe70d
Added OnPlaybackLooped event
MS-crew Jan 7, 2026
ae9992f
Update Speaker.cs
MS-crew Jan 11, 2026
889ca19
Update to c# lang version 14
MS-crew Jan 12, 2026
895fba8
Update Speaker.cs
MS-crew Jan 12, 2026
18b30bc
Merge branch 'dev' into SpeakerToyReborn
MS-crew Jan 12, 2026
3abd0b1
Enum 4 byte to 1 byte
MS-crew Jan 12, 2026
88497de
-Replaced 'File.ReadAllBytes' with 'ArrayPool<byte>.Shared'
MS-crew Jan 12, 2026
ae2103f
Refactor
MS-crew Jan 12, 2026
9457f02
Merge remote-tracking branch 'upstream/dev' into SpeakerToyReborn
MS-crew Jan 14, 2026
1bc0db9
Initialize Channel property with ReliableOrdered2
MS-crew Jan 15, 2026
d6cf318
Refactor Speaker class properties
MS-crew Jan 15, 2026
d17ca36
Update Speaker.cs
MS-crew Jan 15, 2026
2b1200c
Update Speaker.cs
MS-crew Jan 15, 2026
a69a69f
Merge branch 'SpeakerToyReborn' of https://github.com/MS-crew/EXILEDP…
MS-crew Jan 16, 2026
974b3f1
ağhhh
MS-crew Jan 16, 2026
e8348b0
Merge branch 'dev' into SpeakerToyReborn
MS-crew Jan 16, 2026
e284fdd
renamed method
MS-crew Jan 16, 2026
bb82462
Merge branch 'SpeakerToyReborn' of https://github.com/MS-crew/EXILEDP…
MS-crew Jan 16, 2026
83494fa
Added Target Player Play Mode
MS-crew Jan 17, 2026
4f05e69
C# 14
louis1706 Jan 17, 2026
0fcb87e
i miss that part :3
louis1706 Jan 17, 2026
f67434d
Oups
louis1706 Jan 18, 2026
4b6b240
Merge branch 'dev' into MORE-MORE-C#14
louis1706 Feb 16, 2026
305ffae
Merge branch 'dev' into MORE-MORE-C#14
louis1706 Feb 16, 2026
ce441cc
fix: EffectType.Blinded -> EffectType.Blindness
louis1706 Feb 16, 2026
614dfd5
Merge branch 'dev' into MORE-MORE-C#14
louis1706 Feb 16, 2026
449bc27
Apply suggestions from code review
louis1706 Feb 19, 2026
15533ed
Merge branch 'dev' into MORE-MORE-C#14
louis1706 Feb 19, 2026
e717eca
Revert "Apply suggestions from code review"
louis1706 Feb 19, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 3 additions & 6 deletions EXILED/Exiled.API/Extensions/MirrorExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,6 @@ public static class MirrorExtensions
private static readonly ReadOnlyDictionary<Type, MethodInfo> ReadOnlyWriterExtensionsValue = new(WriterExtensionsValue);
private static readonly ReadOnlyDictionary<string, ulong> ReadOnlySyncVarDirtyBitsValue = new(SyncVarDirtyBitsValue);
private static readonly ReadOnlyDictionary<string, string> ReadOnlyRpcFullNamesValue = new(RpcFullNamesValue);
private static MethodInfo setDirtyBitsMethodInfoValue;
private static MethodInfo sendSpawnMessageMethodInfoValue;
private static string[] adminToyBaseSyncVarsValue;

/// <summary>
/// Gets <see cref="MethodInfo"/> corresponding to <see cref="Type"/>.
Expand Down Expand Up @@ -153,17 +150,17 @@ public static ReadOnlyDictionary<string, string> RpcFullNames
/// <summary>
/// Gets a <see cref="NetworkBehaviour.SetSyncVarDirtyBit(ulong)"/>'s <see cref="MethodInfo"/>.
/// </summary>
public static MethodInfo SetDirtyBitsMethodInfo => setDirtyBitsMethodInfoValue ??= typeof(NetworkBehaviour).GetMethod(nameof(NetworkBehaviour.SetSyncVarDirtyBit));
public static MethodInfo SetDirtyBitsMethodInfo => field ??= typeof(NetworkBehaviour).GetMethod(nameof(NetworkBehaviour.SetSyncVarDirtyBit));

/// <summary>
/// Gets a NetworkServer.SendSpawnMessage's <see cref="MethodInfo"/>.
/// </summary>
public static MethodInfo SendSpawnMessageMethodInfo => sendSpawnMessageMethodInfoValue ??= typeof(NetworkServer).GetMethod("SendSpawnMessage", BindingFlags.NonPublic | BindingFlags.Static);
public static MethodInfo SendSpawnMessageMethodInfo => field ??= typeof(NetworkServer).GetMethod("SendSpawnMessage", BindingFlags.NonPublic | BindingFlags.Static);

/// <summary>
/// Gets all <see cref="AdminToyBase"/> sync var names.
/// </summary>
public static string[] AdminToyBaseSyncVars => adminToyBaseSyncVarsValue ??= typeof(AdminToyBase).GetProperties().Where(property => property.Name.Contains("Network")).Select(property => property.Name).ToArray();
public static string[] AdminToyBaseSyncVars => field ??= typeof(AdminToyBase).GetProperties().Where(property => property.Name.Contains("Network")).Select(property => property.Name).ToArray();

/// <summary>
/// Plays a beep sound that only the target <paramref name="player"/> can hear.
Expand Down
4 changes: 1 addition & 3 deletions EXILED/Exiled.API/Features/Camera.cs
Original file line number Diff line number Diff line change
Expand Up @@ -157,8 +157,6 @@ public class Camera : IWrapper<Scp079Camera>, IWorldSpace
["SZ CAMERA TOY"] = CameraType.SzCameraToy,
};

private Room room;

/// <summary>
/// Initializes a new instance of the <see cref="Camera"/> class.
/// </summary>
Expand Down Expand Up @@ -220,7 +218,7 @@ internal Camera(Scp079Camera camera079)
/// <summary>
/// Gets the camera's <see cref="Room"/>.
/// </summary>
public Room Room => room ??= Room.Get(Base.Room);
public Room Room => field ??= Room.Get(Base.Room);

/// <summary>
/// Gets the camera's <see cref="ZoneType"/>.
Expand Down
18 changes: 8 additions & 10 deletions EXILED/Exiled.API/Features/Core/EActor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,6 @@ public abstract class EActor : EObject, IEntity, IWorldSpace

private readonly HashSet<EActor> componentsInChildren = HashSetPool<EActor>.Pool.Get();
private CoroutineHandle serverTick;
private bool canEverTick;
private float fixedTickRate;

/// <summary>
/// Initializes a new instance of the <see cref="EActor"/> class.
Expand All @@ -42,10 +40,10 @@ protected EActor()
{
IsEditable = true;
CanEverTick = true;
fixedTickRate = DefaultFixedTickRate;
FixedTickRate = DefaultFixedTickRate;
PostInitialize();
Timing.CallDelayed(fixedTickRate, () => OnBeginPlay());
Timing.CallDelayed(fixedTickRate * 2, () => serverTick = Timing.RunCoroutine(ServerTick()));
Timing.CallDelayed(FixedTickRate, OnBeginPlay);
Timing.CallDelayed(FixedTickRate * 2, () => serverTick = Timing.RunCoroutine(ServerTick()));
}

/// <summary>
Expand Down Expand Up @@ -99,15 +97,15 @@ public virtual Vector3 Scale
/// </summary>
public virtual bool CanEverTick
{
get => canEverTick;
get;
set
{
if (!IsEditable)
return;

canEverTick = value;
field = value;

if (canEverTick)
if (field)
{
Timing.ResumeCoroutines(serverTick);
return;
Expand All @@ -122,13 +120,13 @@ public virtual bool CanEverTick
/// </summary>
public virtual float FixedTickRate
{
get => fixedTickRate;
get;
set
{
if (!IsEditable)
return;

fixedTickRate = value;
field = value;
}
}

Expand Down
11 changes: 5 additions & 6 deletions EXILED/Exiled.API/Features/Core/StateMachine/StateController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ namespace Exiled.API.Features.Core.StateMachine
public abstract class StateController : EActor
{
private readonly List<State> states = new();
private State currentState;

/// <summary>
/// Gets all handled states.
Expand All @@ -31,14 +30,14 @@ public abstract class StateController : EActor
/// </summary>
public State CurrentState
{
get => currentState;
get;
set
{
if (currentState.Id == value.Id)
if (field.Id == value.Id)
return;

(PreviousState = currentState).OnExit(this);
(currentState = value).OnEnter(this);
(PreviousState = field).OnExit(this);
(field = value).OnEnter(this);

OnStateChanged();
}
Expand Down Expand Up @@ -75,7 +74,7 @@ public virtual void StateUpdate(State state)
protected virtual void OnStateChanged()
{
EndStateMulticastDispatcher.InvokeAll(PreviousState);
BeginStateMulticastDispatcher.InvokeAll(currentState);
BeginStateMulticastDispatcher.InvokeAll(CurrentState);
}
}
}
17 changes: 7 additions & 10 deletions EXILED/Exiled.API/Features/DamageHandlers/DamageHandlerBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,6 @@ namespace Exiled.API.Features.DamageHandlers
/// </summary>
public abstract class DamageHandlerBase
{
private DamageType damageType;
private CassieAnnouncement cassieAnnouncement;

/// <summary>
/// Initializes a new instance of the <see cref="DamageHandlerBase"/> class.
/// </summary>
Expand Down Expand Up @@ -78,8 +75,8 @@ public enum Action : byte
/// </summary>
public virtual CassieAnnouncement CassieDeathAnnouncement
{
get => cassieAnnouncement ?? Base.CassieDeathAnnouncement;
protected set => cassieAnnouncement = value;
get => field ?? Base.CassieDeathAnnouncement;
protected set;
}

/// <summary>
Expand All @@ -94,19 +91,19 @@ public virtual DamageType Type
{
get
{
if (damageType != DamageType.Unknown)
return damageType;
if (field != DamageType.Unknown)
return field;

damageType = GetDamageType();
return damageType;
field = GetDamageType();
return field;
}

protected set
{
if (!Enum.IsDefined(typeof(DamageType), value))
throw new InvalidEnumArgumentException(nameof(value), (int)value, typeof(DamageType));

damageType = value;
field = value;
}
}

Expand Down
3 changes: 1 addition & 2 deletions EXILED/Exiled.API/Features/Generator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ public class Generator : IWrapper<Scp079Generator>, IWorldSpace, IStructureSync
/// A <see cref="List{T}"/> of <see cref="Generator"/> on the map.
/// </summary>
internal static readonly Dictionary<Scp079Generator, Generator> Scp079GeneratorToGenerator = new(new ComponentsEqualityComparer());
private Room room;

/// <summary>
/// Initializes a new instance of the <see cref="Generator"/> class.
Expand Down Expand Up @@ -63,7 +62,7 @@ internal Generator(Scp079Generator scp079Generator)
/// <summary>
/// Gets the generator's <see cref="Room"/>.
/// </summary>
public Room Room => room ??= Room.FindParentRoom(GameObject);
public Room Room => field ??= Room.FindParentRoom(GameObject);

/// <summary>
/// Gets or sets the generator' state.
Expand Down
8 changes: 3 additions & 5 deletions EXILED/Exiled.API/Features/Hazards/AmnesticCloudHazard.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@ namespace Exiled.API.Features.Hazards
/// </summary>
public class AmnesticCloudHazard : TemporaryHazard
{
private static Scp939AmnesticCloudInstance amnesticCloudPrefab;

/// <summary>
/// Initializes a new instance of the <see cref="AmnesticCloudHazard"/> class.
/// </summary>
Expand All @@ -36,10 +34,10 @@ public static Scp939AmnesticCloudInstance AmnesticCloudPrefab
{
get
{
if (amnesticCloudPrefab == null)
amnesticCloudPrefab = PrefabHelper.GetPrefab<Scp939AmnesticCloudInstance>(PrefabType.AmnesticCloudHazard);
if (field == null)
field = PrefabHelper.GetPrefab<Scp939AmnesticCloudInstance>(PrefabType.AmnesticCloudHazard);

return amnesticCloudPrefab;
return field;
}
}

Expand Down
8 changes: 3 additions & 5 deletions EXILED/Exiled.API/Features/Hazards/TantrumHazard.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,6 @@ namespace Exiled.API.Features.Hazards
/// </summary>
public class TantrumHazard : TemporaryHazard
{
private static TantrumEnvironmentalHazard tantrumPrefab;

/// <summary>
/// Initializes a new instance of the <see cref="TantrumHazard"/> class.
/// </summary>
Expand All @@ -37,10 +35,10 @@ public static TantrumEnvironmentalHazard TantrumPrefab
{
get
{
if (tantrumPrefab == null)
tantrumPrefab = PrefabHelper.GetPrefab<TantrumEnvironmentalHazard>(PrefabType.TantrumObj);
if (field == null)
field = PrefabHelper.GetPrefab<TantrumEnvironmentalHazard>(PrefabType.TantrumObj);

return tantrumPrefab;
return field;
}
}

Expand Down
8 changes: 2 additions & 6 deletions EXILED/Exiled.API/Features/Map.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,6 @@ public static class Map
/// </summary>
internal static List<PocketDimensionTeleport> TeleportsValue = new();

private static AmbientSoundPlayer ambientSoundPlayer;

private static SqueakSpawner squeakSpawner;

/// <summary>
/// Gets a value indicating whether decontamination has begun in the light containment zone.
/// </summary>
Expand Down Expand Up @@ -123,12 +119,12 @@ public static bool IsDecontaminationEnabled
/// <summary>
/// Gets the <see cref="global::AmbientSoundPlayer"/>.
/// </summary>
public static AmbientSoundPlayer AmbientSoundPlayer => ambientSoundPlayer ??= ReferenceHub._hostHub.GetComponent<AmbientSoundPlayer>();
public static AmbientSoundPlayer AmbientSoundPlayer => field ??= ReferenceHub._hostHub.GetComponent<AmbientSoundPlayer>();

/// <summary>
/// Gets the <see cref="global::SqueakSpawner"/>.
/// </summary>
public static SqueakSpawner SqueakSpawner => squeakSpawner ??= Object.FindFirstObjectByType<SqueakSpawner>();
public static SqueakSpawner SqueakSpawner => field ??= Object.FindFirstObjectByType<SqueakSpawner>();

/// <summary>
/// Sends a staff message to all players online with <see cref="PlayerPermissions.AdminChat"/> permission.
Expand Down
23 changes: 6 additions & 17 deletions EXILED/Exiled.API/Features/Pickups/BodyArmorPickup.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,6 @@ namespace Exiled.API.Features.Pickups
/// </summary>
public class BodyArmorPickup : Pickup, IWrapper<BaseBodyArmor>
{
private int helmetEfficacy;
private int vestEfficacy;

/// <summary>
/// Initializes a new instance of the <see cref="BodyArmorPickup"/> class.
/// </summary>
Expand Down Expand Up @@ -79,20 +76,12 @@ internal BodyArmorPickup(ItemType type)
/// <summary>
/// Gets or sets how strong the helmet on the armor is.
/// </summary>
public int HelmetEfficacy
{
get => helmetEfficacy;
set => helmetEfficacy = value;
}
public int HelmetEfficacy { get; set; }

/// <summary>
/// Gets or sets how strong the vest on the armor is.
/// </summary>
public int VestEfficacy
{
get => vestEfficacy;
set => vestEfficacy = value;
}
public int VestEfficacy { get; set; }

/// <summary>
/// Gets or sets how much faster stamina will drain when wearing this armor.
Expand Down Expand Up @@ -131,8 +120,8 @@ internal override void ReadItemInfo(Item item)
base.ReadItemInfo(item);
if (item is Armor armoritem)
{
helmetEfficacy = armoritem.HelmetEfficacy;
vestEfficacy = armoritem.VestEfficacy;
HelmetEfficacy = armoritem.HelmetEfficacy;
VestEfficacy = armoritem.VestEfficacy;
StaminaUseMultiplier = armoritem.StaminaUseMultiplier;
StaminaRegenMultiplier = armoritem.StaminaRegenMultiplier;
AmmoLimits = armoritem.AmmoLimits;
Expand All @@ -146,8 +135,8 @@ protected override void InitializeProperties(ItemBase itemBase)
base.InitializeProperties(itemBase);
if (itemBase is BodyArmor armoritem)
{
helmetEfficacy = armoritem.HelmetEfficacy;
vestEfficacy = armoritem.VestEfficacy;
HelmetEfficacy = armoritem.HelmetEfficacy;
VestEfficacy = armoritem.VestEfficacy;
StaminaUseMultiplier = armoritem._staminaUseMultiplier;
StaminaRegenMultiplier = armoritem.StaminaRegenMultiplier;
AmmoLimits = armoritem.AmmoLimits.Select(limit => (ArmorAmmoLimit)limit);
Expand Down
Loading
Loading