Skip to content

Commit

Permalink
v8.12.0-rc.1 (#52)
Browse files Browse the repository at this point in the history
* uwu (#5)

* AdminToy.List (#18)

* AdminToy.List

* Better AdminToy::Get()

* Update EXILED/Exiled.API/Features/Toys/AdminToy.cs

Co-authored-by: IRacle <79921583+IRacle1@users.noreply.github.com>

* TODO

* Fix Error

* Fix2

---------

Co-authored-by: IRacle <79921583+IRacle1@users.noreply.github.com>

* Fix `Jailbird::WearState` (#12)

* Jailbird

* Fix

* Exception

* Fix NW moment

* Porting EXILED9 RespawnedTeam event. by.VALERA771 (#27)

Exiled-Team/EXILED#2386

* Fix not returning null (#22)

* Fix not returning null

* Apply suggestions from code review

Co-authored-by: Jesus QC <69375249+Jesus-QC@users.noreply.github.com>

* Little modification

---------

Co-authored-by: Jesus QC <69375249+Jesus-QC@users.noreply.github.com>

* RecontainedEventArgs more feature (#20)

* RecontainedEventArgs more feature

* Fix Naming

* grammar

* Update RecontainedEventArgs.cs

---------

Co-authored-by: Misaka-ZeroTwo <45165615+Misaka-ZeroTwo@users.noreply.github.com>

* InteractingScp330.cs: Reduction of bloat code from original design. (#30)

* Should reduce bloat code that was required years ago.

* Should reduce bloat code that was required years ago.

* Added back per Yamato's request

---------

Co-authored-by: Yamato <66829532+louis1706@users.noreply.github.com>

* IScp330Event (#11)

Co-authored-by: Misaka-ZeroTwo <45165615+Misaka-ZeroTwo@users.noreply.github.com>

* PR than i made (#9)

* PR made by me

Thanks Ika for the Help on CustomAmmo/CategoryLimit

Co-Authored-By: Ika <36999341+IkaOverride@users.noreply.github.com>

* Build error

* Added support to SCPs for escaping-related events.

* spacing

* LocalReporting Exiled should be call before NWAPI

* Optimising / More documentation on SpawningItem

* ISpawnableScp

* Use of ComponentsEqualityComparer for Dictionary

---------

Co-authored-by: Ika <36999341+IkaOverride@users.noreply.github.com>

* [Events] Fix null reference (#15)

* fix situation when `ply == null`

* lol why

---------

Co-authored-by: IRacle <zornik2006@yandex.ru>

* Offline mode support (#19)

* Fix Offline-mode breaking everything

* Add `offline` authentication type and append `@offline` to UserIds during offline mode

* Add offline id support to Player.Get

* Comment transpilers

---------

Co-authored-by: Yamato <66829532+louis1706@users.noreply.github.com>

* Fix NW bugs (#32)

* Fix Armor Drop

from https://git.scpslgame.com/northwood-qa/scpsl-bug-reporting/-/issues/230

* add comments

* fix scp173 and adding bug report link to summary class

fix https://git.scpslgame.com/northwood-qa/scpsl-bug-reporting/-/issues/143

* Moved patches and fixed Scp173FirstKillPatch

* Add Slowness Fix

Avoid values more than 100 for effect slowness to fix https://git.scpslgame.com/northwood-qa/scpsl-bug-reporting/-/issues/378

* skill issue

* skill issue (again=

---------

Co-authored-by: Yamato <66829532+louis1706@users.noreply.github.com>

* Useless Event (939 Placed Amnestic Cloud) (#40)

* Fix custom role classes giving custom ammo when they are not suppose to (#24)

* Fix custom role classes giving custom ammmo when they are not suppose to

* change to using EnumUtils

* Moved Ammo additions into Inventory call delayed

* `Item::<T>Get()` and `Pickup::<T>Get()` (#17)

* `Item::::<T>Get()` and `Pickup::<T>Get()`

* Revert doc change

* Add `Hazard::Get<T>()`

* doc fix

* `Door::Get<T>()`

* AdminToy.Get<T>()

* More <T> implementation

* WeirdFix

* simplify Scp244Spawning patch and AddedComment & NO IL error

* Remove Log.info

* DroppingItem light modifiication

* Moving Item.Get inside the eventargs instead of transpiller

* FixNpcNoclip (#34)

* FixNpcNoclip

* oups

* .

* virtual / override

* Implements more patches for RemovingHandcuffs event and adding RemovedHandcuffs event (#3)

* Update labeler.yml

* RemovingHandcuffs event

* Update UncuffReason.cs

* New event

* docs

* Interacting scp330 compile fix (#43)

* My scp built with no issues.. no idea why.

* Fixes issue

* Harmony suppresses NON harmony errors.

---------

Co-authored-by: Yamato <66829532+louis1706@users.noreply.github.com>

* Trello is no more & more NW Fix & Fix IL Code on dev (#28)

* Trello Is Replaced by gitlab

* also this one

* Fix106RegenerationWithScp244

* Report To NW

* .

* Scp3114FriendlyFireFix

* Fix

* yamatotototo

* Fix

* Fix for building dev + TODO than i just seen

* Fix Undid patch

* fIX

* Fix Client Crash Issue

---------

Co-authored-by: IRacle <zornik2006@yandex.ru>

* Additions (#29)

* Add a bunch

* Fix

* Security

* Make changes

* remove unused usings

* Getting inventory

* oops

* Dev commit

* use exiled

---------

Co-authored-by: Yamato <66829532+louis1706@users.noreply.github.com>

* `[EXILED::API]` Pickup::Category (#46)

* Item Category on Pickup

* Fixed Build Error

* Fix (#50)

---------

Co-authored-by: Jesus QC <69375249+Jesus-QC@users.noreply.github.com>
Co-authored-by: VALERA771 <72030575+VALERA771@users.noreply.github.com>
Co-authored-by: Yamato <66829532+louis1706@users.noreply.github.com>
Co-authored-by: IRacle <79921583+IRacle1@users.noreply.github.com>
Co-authored-by: 永安404 <101850798+YongAn404@users.noreply.github.com>
Co-authored-by: X <24619207+Undid-Iridium@users.noreply.github.com>
Co-authored-by: Ika <36999341+IkaOverride@users.noreply.github.com>
Co-authored-by: IRacle <zornik2006@yandex.ru>
Co-authored-by: x3rt <x3rtdev@gmail.com>
Co-authored-by: sky <99112969+skyyt15@users.noreply.github.com>
Co-authored-by: TtroubleTT <121741230+TtroubleTT@users.noreply.github.com>
Co-authored-by: Nameless <85962933+Misfiy@users.noreply.github.com>
Co-authored-by: ZeroTwo <63092138+NotZer0Two@users.noreply.github.com>
  • Loading branch information
14 people authored Aug 11, 2024
1 parent 8b8eb96 commit 7de6428
Show file tree
Hide file tree
Showing 121 changed files with 2,351 additions and 407 deletions.
5 changes: 5 additions & 0 deletions EXILED/Exiled.API/Enums/AuthenticationType.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,5 +42,10 @@ public enum AuthenticationType
/// Indicates that the player has been authenticated as DedicatedServer.
/// </summary>
DedicatedServer,

/// <summary>
/// Indicates that the player has been authenticated during Offline mode.
/// </summary>
Offline,
}
}
37 changes: 37 additions & 0 deletions EXILED/Exiled.API/Enums/HazardType.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
// -----------------------------------------------------------------------
// <copyright file="HazardType.cs" company="Exiled Team">
// Copyright (c) Exiled Team. All rights reserved.
// Licensed under the CC BY-SA 3.0 license.
// </copyright>
// -----------------------------------------------------------------------

namespace Exiled.API.Enums
{
using Exiled.API.Features.Hazards;

/// <summary>
/// Unique identifier for a <see cref="Hazard"/>.
/// </summary>
public enum HazardType
{
/// <summary>
/// SCP-939 amnestic cloud.
/// </summary>
AmnesticCloud,

/// <summary>
/// Sinkhole spawned at start of round.
/// </summary>
Sinkhole,

/// <summary>
/// SCP-173 tantrum.
/// </summary>
Tantrum,

/// <summary>
/// Should never happen
/// </summary>
Unknown,
}
}
30 changes: 30 additions & 0 deletions EXILED/Exiled.API/Enums/UncuffReason.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
// -----------------------------------------------------------------------
// <copyright file="UncuffReason.cs" company="Exiled Team">
// Copyright (c) Exiled Team. All rights reserved.
// Licensed under the CC BY-SA 3.0 license.
// </copyright>
// -----------------------------------------------------------------------

namespace Exiled.API.Enums
{
/// <summary>
/// Reasons that player gets uncuffed.
/// </summary>
public enum UncuffReason
{
/// <summary>
/// Uncuffed by a player.
/// </summary>
Player,

/// <summary>
/// Uncuffed due to the distance between cuffer and target.
/// </summary>
OutOfRange,

/// <summary>
/// Uncuffed due to the cuffer no longer alive.
/// </summary>
CufferDied,
}
}
63 changes: 63 additions & 0 deletions EXILED/Exiled.API/Extensions/BitwiseExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
// -----------------------------------------------------------------------
// <copyright file="BitwiseExtensions.cs" company="Exiled Team">
// Copyright (c) Exiled Team. All rights reserved.
// Licensed under the CC BY-SA 3.0 license.
// </copyright>
// -----------------------------------------------------------------------

namespace Exiled.API.Extensions
{
using System;

/// <summary>
/// Extensions for bitwise operations.
/// </summary>
public static class BitwiseExtensions
{
/// <summary>
/// Adds the specified flags to the given enum value.
/// </summary>
/// <typeparam name="T">The type of the enum.</typeparam>
/// <param name="flags">The enum value to add flags to.</param>
/// <param name="newFlags">The flags to add.</param>
/// <returns>The enum value with the specified flags added.</returns>
public static T AddFlags<T>(this T flags, params T[] newFlags)
where T : Enum => flags.ModifyFlags(true, newFlags);

/// <summary>
/// Removes the specified flags from the given enum value.
/// </summary>
/// <typeparam name="T">The type of the enum.</typeparam>
/// <param name="flags">The enum value to remove flags from.</param>
/// <param name="oldFlags">The flags to remove.</param>
/// <returns>The enum value with the specified flags removed.</returns>
public static T RemoveFlags<T>(this T flags, params T[] oldFlags)
where T : Enum => flags.ModifyFlags(false, oldFlags);

/// <summary>
/// Sets the specified flag to the given value, default is true.
/// </summary>
/// <param name="flags">The flags enum to modify.</param>
/// <param name="value">The value to set the flag to.</param>
/// <param name="changeFlags">The flags to modify.</param>
/// <typeparam name="T">The type of the enum.</typeparam>
/// <returns>The flags enum with the flag set to the given value.</returns>
public static T ModifyFlags<T>(this T flags, bool value, params T[] changeFlags)
where T : Enum
{
long currentValue = Convert.ToInt64(flags);

foreach (T flag in changeFlags)
{
long flagValue = Convert.ToInt64(flag);

if (value)
currentValue |= flagValue;
else
currentValue &= ~flagValue;
}

return (T)Enum.ToObject(typeof(T), currentValue);
}
}
}
9 changes: 4 additions & 5 deletions EXILED/Exiled.API/Extensions/MirrorExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -435,12 +435,11 @@ public static void SendFakeTargetRpc(Player target, NetworkIdentity behaviorOwne
/// <example>
/// EffectOnlySCP207.
/// <code>
/// MirrorExtensions.SendCustomSync(player, player.ReferenceHub.networkIdentity, typeof(PlayerEffectsController), (writer) => {
/// writer.WriteUInt64(1ul); // DirtyObjectsBit
/// writer.WriteUInt32(1); // DirtyIndexCount
/// MirrorExtensions.SendFakeSyncObject(player, player.NetworkIdentity, typeof(PlayerEffectsController), (writer) => {
/// writer.WriteULong(1ul); // DirtyObjectsBit
/// writer.WriteUInt(1); // DirtyIndexCount
/// writer.WriteByte((byte)SyncList&lt;byte&gt;.Operation.OP_SET); // Operations
/// writer.WriteUInt32(17); // EditIndex
/// writer.WriteByte(1); // Value
/// writer.WriteUInt(17); // EditIndex
/// });
/// </code>
/// </example>
Expand Down
23 changes: 13 additions & 10 deletions EXILED/Exiled.API/Extensions/RoleExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -140,18 +140,22 @@ public static SpawnLocation GetRandomSpawnLocation(this RoleTypeId roleType)
return null;
}

/// <summary>
/// Gets the starting <see cref="InventoryRoleInfo"/> of a <see cref="RoleTypeId"/>.
/// </summary>
/// <param name="role">The <see cref="RoleTypeId"/>.</param>
/// <returns>The <see cref="InventoryRoleInfo"/> that the role receives on spawn. </returns>
public static InventoryRoleInfo GetInventory(this RoleTypeId role)
=> StartingInventories.DefinedInventories.TryGetValue(role, out InventoryRoleInfo info)
? info
: new(Array.Empty<ItemType>(), new());

/// <summary>
/// Gets the starting items of a <see cref="RoleTypeId"/>.
/// </summary>
/// <param name="roleType">The <see cref="RoleTypeId"/>.</param>
/// <returns>An <see cref="Array"/> of <see cref="ItemType"/> that the role receives on spawn. Will be empty for classes that do not spawn with items.</returns>
public static ItemType[] GetStartingInventory(this RoleTypeId roleType)
{
if (StartingInventories.DefinedInventories.TryGetValue(roleType, out InventoryRoleInfo info))
return info.Items;

return Array.Empty<ItemType>();
}
public static ItemType[] GetStartingInventory(this RoleTypeId roleType) => GetInventory(roleType).Items;

/// <summary>
/// Gets the starting ammo of a <see cref="RoleTypeId"/>.
Expand All @@ -160,10 +164,9 @@ public static ItemType[] GetStartingInventory(this RoleTypeId roleType)
/// <returns>An <see cref="Array"/> of <see cref="ItemType"/> that the role receives on spawn. Will be empty for classes that do not spawn with ammo.</returns>
public static Dictionary<AmmoType, ushort> GetStartingAmmo(this RoleTypeId roleType)
{
if (StartingInventories.DefinedInventories.TryGetValue(roleType, out InventoryRoleInfo info))
return info.Ammo.ToDictionary(kvp => kvp.Key.GetAmmoType(), kvp => kvp.Value);
InventoryRoleInfo info = roleType.GetInventory();

return new();
return info.Ammo.ToDictionary(kvp => kvp.Key.GetAmmoType(), kvp => kvp.Value);
}
}
}
6 changes: 5 additions & 1 deletion EXILED/Exiled.API/Extensions/StringExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,11 @@ public static string GetBefore(this string input, char symbol)
/// </summary>
/// <param name="userId">The user id.</param>
/// <returns>Returns the raw user id.</returns>
public static string GetRawUserId(this string userId) => userId.Substring(0, userId.LastIndexOf('@'));
public static string GetRawUserId(this string userId)
{
int index = userId.IndexOf('@');
return index == -1 ? userId : userId.Substring(0, index);
}

/// <summary>
/// Gets a SHA256 hash of a player's user id without the authentication.
Expand Down
2 changes: 1 addition & 1 deletion EXILED/Exiled.API/Features/Camera.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public class Camera : IWrapper<Scp079Camera>, IWorldSpace
/// <summary>
/// A <see cref="Dictionary{TKey,TValue}"/> containing all known <see cref="Scp079Camera"/>s and their corresponding <see cref="Camera"/>.
/// </summary>
internal static readonly Dictionary<Scp079Camera, Camera> Camera079ToCamera = new(250);
internal static readonly Dictionary<Scp079Camera, Camera> Camera079ToCamera = new(250, new ComponentsEqualityComparer());

private static readonly Dictionary<string, CameraType> NameToCameraType = new()
{
Expand Down
2 changes: 1 addition & 1 deletion EXILED/Exiled.API/Features/Doors/AirlockController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public class AirlockController
/// <summary>
/// A <see cref="Dictionary{TKey,TValue}"/> containing all known <see cref="BaseController"/>'s and their corresponding <see cref="AirlockController"/>.
/// </summary>
internal static readonly Dictionary<BaseController, AirlockController> BaseToExiledControllers = new();
internal static readonly Dictionary<BaseController, AirlockController> BaseToExiledControllers = new(new ComponentsEqualityComparer());

/// <summary>
/// Initializes a new instance of the <see cref="AirlockController"/> class.
Expand Down
59 changes: 44 additions & 15 deletions EXILED/Exiled.API/Features/Doors/Door.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@ namespace Exiled.API.Features.Doors
using Exiled.API.Enums;
using Exiled.API.Extensions;
using Exiled.API.Features.Core;
using Exiled.API.Features.Hazards;
using Exiled.API.Interfaces;
using global::Hazards;
using Interactables.Interobjects;
using Interactables.Interobjects.DoorUtils;
using MEC;
Expand All @@ -38,7 +40,7 @@ public class Door : TypeCastObject<Door>, IWrapper<DoorVariant>, IWorldSpace
/// <summary>
/// A <see cref="Dictionary{TKey,TValue}"/> containing all known <see cref="DoorVariant"/>'s and their corresponding <see cref="Door"/>.
/// </summary>
internal static readonly Dictionary<DoorVariant, Door> DoorVariantToDoor = new();
internal static readonly Dictionary<DoorVariant, Door> DoorVariantToDoor = new(new ComponentsEqualityComparer());

/// <summary>
/// Initializes a new instance of the <see cref="Door"/> class.
Expand Down Expand Up @@ -309,6 +311,31 @@ public static Door Get(DoorVariant doorVariant)
return DoorVariantToDoor[doorVariant];
}

/// <summary>
/// Gets the <see cref="Door"/> by <see cref="DoorVariant"/>.
/// </summary>
/// <param name="doorVariant">The <see cref="DoorVariant"/> to convert into an door.</param>
/// <typeparam name="T">The specified <see cref="Door"/> type.</typeparam>
/// <returns>The door wrapper for the given <see cref="DoorVariant"/>.</returns>
public static T Get<T>(DoorVariant doorVariant)
where T : Door => Get(doorVariant) as T;

/// <summary>
/// Gets a <see cref="Door"/> given the specified <see cref="DoorType"/>.
/// </summary>
/// <param name="doorType">The <see cref="DoorType"/> to search for.</param>
/// <returns>The <see cref="Door"/> with the given <see cref="DoorType"/> or <see langword="null"/> if not found.</returns>
public static Door Get(DoorType doorType) => List.FirstOrDefault(x => x.Type == doorType);

/// <summary>
/// Gets the <see cref="Door"/> by <see cref="DoorVariant"/>.
/// </summary>
/// <param name="doorType">The <see cref="DoorVariant"/> to convert into an door.</param>
/// <typeparam name="T">The specified <see cref="Door"/> type.</typeparam>
/// <returns>The door wrapper for the given <see cref="DoorVariant"/>.</returns>
public static T Get<T>(DoorType doorType)
where T : Door => Get(doorType) as T;

/// <summary>
/// Gets a <see cref="Door"/> given the specified name.
/// </summary>
Expand All @@ -320,27 +347,22 @@ public static Door Get(string name)
return nameExtension is null ? null : Get(nameExtension.TargetDoor);
}

/// <summary>
/// Gets the <see cref="Door"/> by <see cref="DoorVariant"/>.
/// </summary>
/// <param name="name">The name to search for.</param>
/// <typeparam name="T">The specified <see cref="Door"/> type.</typeparam>
/// <returns>The door wrapper for the given <see cref="DoorVariant"/>.</returns>
public static T Get<T>(string name)
where T : Door => Get(name) as T;

/// <summary>
/// Gets the door object associated with a specific <see cref="UnityEngine.GameObject"/>, or creates a new one if there isn't one.
/// </summary>
/// <param name="gameObject">The base-game <see cref="UnityEngine.GameObject"/>.</param>
/// <returns>The <see cref="Door"/> with the given name or <see langword="null"/> if not found.</returns>
public static Door Get(GameObject gameObject) => gameObject is null ? null : Get(gameObject.GetComponentInChildren<DoorVariant>());

/// <summary>
/// Gets a <see cref="IEnumerable{T}"/> of <see cref="Door"/> filtered based on a predicate.
/// </summary>
/// <param name="predicate">The condition to satify.</param>
/// <returns>A <see cref="IEnumerable{T}"/> of <see cref="Door"/> which contains elements that satify the condition.</returns>
public static IEnumerable<Door> Get(Func<Door, bool> predicate) => List.Where(predicate);

/// <summary>
/// Gets a <see cref="Door"/> given the specified <see cref="DoorType"/>.
/// </summary>
/// <param name="doorType">The <see cref="DoorType"/> to search for.</param>
/// <returns>The <see cref="Door"/> with the given <see cref="DoorType"/> or <see langword="null"/> if not found.</returns>
public static Door Get(DoorType doorType) => List.FirstOrDefault(x => x.Type == doorType);

/// <summary>
/// Returns the closest <see cref="Door"/> to the given <paramref name="position"/>.
/// </summary>
Expand All @@ -367,6 +389,13 @@ public static Door Random(ZoneType type = ZoneType.Unspecified, bool onlyUnbroke
return doors[UnityEngine.Random.Range(0, doors.Count)];
}

/// <summary>
/// Gets a <see cref="IEnumerable{T}"/> of <see cref="Door"/> filtered based on a predicate.
/// </summary>
/// <param name="predicate">The condition to satify.</param>
/// <returns>A <see cref="IEnumerable{T}"/> of <see cref="Door"/> which contains elements that satify the condition.</returns>
public static IEnumerable<Door> Get(Func<Door, bool> predicate) => List.Where(predicate);

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

/// <summary>
Expand Down
22 changes: 21 additions & 1 deletion EXILED/Exiled.API/Features/Hazards/AmnesticCloudHazard.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,20 @@
// Copyright (c) Exiled Team. All rights reserved.
// Licensed under the CC BY-SA 3.0 license.
// </copyright>
// -----------------------------------------------------------------------
// ------------------------------------------------------------------------

namespace Exiled.API.Features.Hazards
{
using Exiled.API.Enums;
using PlayerRoles.PlayableScps.Scp939;

/// <summary>
/// A wrapper for SCP-939's amnestic cloud.
/// </summary>
public class AmnesticCloudHazard : TemporaryHazard
{
private static Scp939AmnesticCloudInstance amnesticCloudPrefab;

/// <summary>
/// Initializes a new instance of the <see cref="AmnesticCloudHazard"/> class.
/// </summary>
Expand All @@ -26,9 +29,26 @@ public AmnesticCloudHazard(Scp939AmnesticCloudInstance hazard)
Owner = Player.Get(Ability.Owner);
}

/// <summary>
/// Gets the amnestic cloud prefab.
/// </summary>
public static Scp939AmnesticCloudInstance AmnesticCloudPrefab
{
get
{
if (amnesticCloudPrefab == null)
amnesticCloudPrefab = PrefabHelper.GetPrefab<Scp939AmnesticCloudInstance>(PrefabType.AmnesticCloudHazard);

return amnesticCloudPrefab;
}
}

/// <inheritdoc cref="Hazard.Base"/>
public new Scp939AmnesticCloudInstance Base { get; }

/// <inheritdoc />
public override HazardType Type => HazardType.AmnesticCloud;

/// <summary>
/// Gets the <see cref="Scp939AmnesticCloudAbility"/> for this instance.
/// </summary>
Expand Down
Loading

0 comments on commit 7de6428

Please sign in to comment.