diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
deleted file mode 100644
index e1409be..0000000
--- a/.github/FUNDING.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-# These are supported funding model platforms
-
-github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
-patreon: kingsscpplayground # Replace with a single Patreon username
-open_collective: # Replace with a single Open Collective username
-ko_fi: # Replace with a single Ko-fi username
-tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
-community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
-liberapay: # Replace with a single Liberapay username
-issuehunt: # Replace with a single IssueHunt username
-otechie: # Replace with a single Otechie username
-custom: ['https://paypal.me/Thomasjosif']# Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
diff --git a/.gitignore b/.gitignore
index 4e642c8..9ec7174 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,95 +1,355 @@
-/.idea/.idea.EXILED/.idea/.name
-/.idea/.idea.EXILED/.idea/vcs.xml
-/.idea/.idea.EXILED/.idea/contentModel.xml
-/EXILED_Main/.idea/.idea.ModuleLoader.dir/.idea/contentModel.xml
-/.idea/.idea.EXILED/.idea/discord.xml
-/EXILED_Main/.idea/.idea.ModuleLoader.dir/.idea/discord.xml
-/EXILED.sln.DotSettings.user
-/.idea/.idea.EXILED/.idea/indexLayout.xml
-/EXILED_Main/.idea/.idea.ModuleLoader.dir/.idea/indexLayout.xml
-/.idea/.idea.EXILED/.idea/modules.xml
-/EXILED_Main/.idea/.idea.ModuleLoader.dir/.idea/modules.xml
-/.idea/.idea.EXILED/riderModule.iml
-/EXILED_Main/.idea/.idea.ModuleLoader.dir/.idea/projectSettingsUpdater.xml
-/.idea/.idea.EXILED/.idea/projectSettingsUpdater.xml
-/EXILED_Main/.idea/.idea.ModuleLoader.dir/riderModule.iml
-/EXILED_Main/.idea/.idea.ModuleLoader.dir/.idea/workspace.xml
-/.idea/.idea.EXILED/.idea/.gitignore
-/bin/EXILED/0Harmony.dll
-/bin/EXILED/Assembly-CSharp-firstpass.dll
-/bin/EXILED/Assembly-CSharp_publicized.dll
-/bin/EXILED/BouncyCastle.Crypto.dll
-/bin/EXILED/DissonanceVoip.dll
-/bin/EXILED/EXILED.dll
-/EXILED_Main/obj/Debug/EXILED.dll
-/bin/EXILED/EXILED.pdb
-/EXILED_Main/obj/Debug/EXILED.pdb
-/EXILED_Events/obj/Debug/EXILED_Events.csproj.CopyComplete
-/EXILED_Events/obj/Debug/EXILED_Events.csproj.FileListAbsolute.txt
-/bin/EXILED/EXILED_Events.dll
-/EXILED_Events/obj/Debug/EXILED_Events.dll
-/bin/EXILED/EXILED_Events.pdb
-/EXILED_Events/obj/Debug/EXILED_Events.pdb
-/EXILED_Main/obj/Debug/EXILED_Main.csproj.CopyComplete
-/EXILED_Main/obj/Debug/EXILED_Main.csproj.FileListAbsolute.txt
-/bin/EXILED/Facepunch.Steamworks.Win64.dll
-/bin/EXILED/Mirror.Authenticators.dll
-/bin/EXILED/Mirror.Components.dll
-/bin/EXILED/Mirror.dll
-/bin/EXILED/Mono.Nat.dll
-/bin/EXILED/Newtonsoft.Json.dll
-/bin/EXILED/System.Diagnostics.StackTrace.dll
-/bin/EXILED/System.Globalization.Extensions.dll
-/bin/EXILED/Unity.TextMeshPro.dll
-/bin/EXILED/UnityEngine.AIModule.dll
-/bin/EXILED/UnityEngine.AndroidJNIModule.dll
-/bin/EXILED/UnityEngine.AnimationModule.dll
-/bin/EXILED/UnityEngine.AssetBundleModule.dll
-/bin/EXILED/UnityEngine.AudioModule.dll
-/bin/EXILED/UnityEngine.CoreModule.dll
-/bin/EXILED/UnityEngine.DirectorModule.dll
-/bin/EXILED/UnityEngine.dll
-/bin/EXILED/UnityEngine.GridModule.dll
-/bin/EXILED/UnityEngine.IMGUIModule.dll
-/bin/EXILED/UnityEngine.InputLegacyModule.dll
-/bin/EXILED/UnityEngine.InputModule.dll
-/bin/EXILED/UnityEngine.Networking.dll
-/bin/EXILED/UnityEngine.ParticleSystemModule.dll
-/bin/EXILED/UnityEngine.Physics2DModule.dll
-/bin/EXILED/UnityEngine.PhysicsModule.dll
-/bin/EXILED/UnityEngine.ScreenCaptureModule.dll
-/bin/EXILED/UnityEngine.SharedInternalsModule.dll
-/bin/EXILED/UnityEngine.SubsystemsModule.dll
-/bin/EXILED/UnityEngine.TerrainModule.dll
-/bin/EXILED/UnityEngine.TerrainPhysicsModule.dll
-/bin/EXILED/UnityEngine.TextCoreModule.dll
-/bin/EXILED/UnityEngine.TextRenderingModule.dll
-/bin/EXILED/UnityEngine.TilemapModule.dll
-/bin/EXILED/UnityEngine.UI.dll
-/bin/EXILED/UnityEngine.UIElementsModule.dll
-/bin/EXILED/UnityEngine.UIModule.dll
-/bin/EXILED/UnityEngine.UNETModule.dll
-/bin/EXILED/UnityEngine.UnityAnalyticsModule.dll
-/bin/EXILED/UnityEngine.UnityWebRequestAudioModule.dll
-/bin/EXILED/UnityEngine.UnityWebRequestModule.dll
-/bin/EXILED/UnityEngine.UnityWebRequestWWWModule.dll
-/bin/EXILED/UnityEngine.VFXModule.dll
-/bin/EXILED/UnityEngine.VideoModule.dll
-/bin/EXILED/UnityEngine.VRModule.dll
-/bin/EXILED/UnityEngine.XRModule.dll
-/bin/EXILED/zxing.unity.dll
+## Ignore Visual Studio temporary files, build results, and
+## files generated by popular Visual Studio add-ons.
+##
+## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
+# test
+
+# User-specific files
+*.rsuser
+*.suo
+*.user
+*.userosscache
+*.sln.docstates
+
+# User-specific files (MonoDevelop/Xamarin Studio)
+*.userprefs
+
+# Mono auto generated files
+mono_crash.*
+
+# Build results
+[Dd]ebug/
+[Dd]ebugPublic/
+[Rr]elease/
+[Rr]eleases/
+x64/
+x86/
+[Aa][Rr][Mm]/
+[Aa][Rr][Mm]64/
+bld/
+[Bb]in/
+[Oo]bj/
+[Ll]og/
+[Ll]ogs/
+
+# Visual Studio 2015/2017 cache/options directory
.vs/
-UltimateAFK/obj/
+# Uncomment if you have tasks that create the project's static files in wwwroot
+#wwwroot/
+
+# Visual Studio 2017 auto generated files
+Generated\ Files/
+
+# MSTest test Results
+[Tt]est[Rr]esult*/
+[Bb]uild[Ll]og.*
+
+# NUnit
+*.VisualState.xml
+TestResult.xml
+nunit-*.xml
+
+# Build Results of an ATL Project
+[Dd]ebugPS/
+[Rr]eleasePS/
+dlldata.c
+
+# Benchmark Results
+BenchmarkDotNet.Artifacts/
+
+# .NET Core
+project.lock.json
+project.fragment.lock.json
+artifacts/
+
+# StyleCop
+StyleCopReport.xml
+
+# Files built by Visual Studio
+*_i.c
+*_p.c
+*_h.h
+*.ilk
+*.meta
+*.obj
+*.iobj
+*.pch
+*.pdb
+*.ipdb
+*.pgc
+*.pgd
+*.rsp
+*.sbr
+*.tlb
+*.tli
+*.tlh
+*.tmp
+*.tmp_proj
+*_wpftmp.csproj
+*.log
+*.vspscc
+*.vssscc
+.builds
+*.pidb
+*.svclog
+*.scc
+
+# Chutzpah Test files
+_Chutzpah*
+
+# Visual C++ cache files
+ipch/
+*.aps
+*.ncb
+*.opendb
+*.opensdf
+*.sdf
+*.cachefile
+*.VC.db
+*.VC.VC.opendb
+
+# Visual Studio profiler
+*.psess
+*.vsp
+*.vspx
+*.sap
+
+# Visual Studio Trace Files
+*.e2e
+
+# TFS 2012 Local Workspace
+$tf/
+
+# Guidance Automation Toolkit
+*.gpState
+
+# ReSharper is a .NET coding add-in
+_ReSharper*/
+*.[Rr]e[Ss]harper
+*.DotSettings.user
+
+# JustCode is a .NET coding add-in
+.JustCode
+
+# TeamCity is a build add-in
+_TeamCity*
+
+# DotCover is a Code Coverage Tool
+*.dotCover
+
+# AxoCover is a Code Coverage Tool
+.axoCover/*
+!.axoCover/settings.json
+
+# Visual Studio code coverage results
+*.coverage
+*.coveragexml
+
+# NCrunch
+_NCrunch_*
+.*crunch*.local.xml
+nCrunchTemp_*
+
+# MightyMoose
+*.mm.*
+AutoTest.Net/
+
+# Web workbench (sass)
+.sass-cache/
+
+# Installshield output folder
+[Ee]xpress/
+
+# DocProject is a documentation generator add-in
+DocProject/buildhelp/
+DocProject/Help/*.HxT
+DocProject/Help/*.HxC
+DocProject/Help/*.hhc
+DocProject/Help/*.hhk
+DocProject/Help/*.hhp
+DocProject/Help/Html2
+DocProject/Help/html
+
+# Click-Once directory
+publish/
+
+# Publish Web Output
+*.[Pp]ublish.xml
+*.azurePubxml
+# Note: Comment the next line if you want to checkin your web deploy settings,
+# but database connection strings (with potential passwords) will be unencrypted
+*.pubxml
+*.publishproj
+
+# Microsoft Azure Web App publish settings. Comment the next line if you want to
+# checkin your Azure Web App publish settings, but sensitive information contained
+# in these scripts will be unencrypted
+PublishScripts/
+
+# NuGet Packages
+*.nupkg
+# NuGet Symbol Packages
+*.snupkg
+# The packages folder can be ignored because of Package Restore
+**/[Pp]ackages/*
+# except build/, which is used as an MSBuild target.
+!**/[Pp]ackages/build/
+# Uncomment if necessary however generally it will be regenerated when needed
+#!**/[Pp]ackages/repositories.config
+# NuGet v3's project.json files produces more ignorable files
+*.nuget.props
+*.nuget.targets
+
+# Microsoft Azure Build Output
+csx/
+*.build.csdef
+
+# Microsoft Azure Emulator
+ecf/
+rcf/
+
+# Windows Store app package directories and files
+AppPackages/
+BundleArtifacts/
+Package.StoreAssociation.xml
+_pkginfo.txt
+*.appx
+*.appxbundle
+*.appxupload
+
+# Visual Studio cache files
+# files ending in .cache can be ignored
+*.[Cc]ache
+# but keep track of directories ending in .cache
+!?*.[Cc]ache/
+
+# Others
+ClientBin/
+~$*
+*~
+*.dbmdl
+*.dbproj.schemaview
+*.jfm
+*.pfx
+*.publishsettings
+orleans.codegen.cs
+
+# Including strong name files can present a security risk
+# (https://github.com/github/gitignore/pull/2483#issue-259490424)
+#*.snk
+
+# Since there are multiple workflows, uncomment next line to ignore bower_components
+# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
+#bower_components/
+
+# RIA/Silverlight projects
+Generated_Code/
+
+# Backup & report files from converting an old project file
+# to a newer Visual Studio version. Backup files are not needed,
+# because we have git ;-)
+_UpgradeReport_Files/
+Backup*/
+UpgradeLog*.XML
+UpgradeLog*.htm
+ServiceFabricBackup/
+*.rptproj.bak
+
+# SQL Server files
+*.mdf
+*.ldf
+*.ndf
+
+# Business Intelligence projects
+*.rdl.data
+*.bim.layout
+*.bim_*.settings
+*.rptproj.rsuser
+*- [Bb]ackup.rdl
+*- [Bb]ackup ([0-9]).rdl
+*- [Bb]ackup ([0-9][0-9]).rdl
+
+# Microsoft Fakes
+FakesAssemblies/
+
+# GhostDoc plugin setting file
+*.GhostDoc.xml
+
+# Node.js Tools for Visual Studio
+.ntvs_analysis.dat
+node_modules/
+
+# Visual Studio 6 build log
+*.plg
+
+# Visual Studio 6 workspace options file
+*.opt
+
+# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
+*.vbw
+
+# Visual Studio LightSwitch build output
+**/*.HTMLClient/GeneratedArtifacts
+**/*.DesktopClient/GeneratedArtifacts
+**/*.DesktopClient/ModelManifest.xml
+**/*.Server/GeneratedArtifacts
+**/*.Server/ModelManifest.xml
+_Pvt_Extensions
+
+# Paket dependency manager
+.paket/paket.exe
+paket-files/
+
+# FAKE - F# Make
+.fake/
+
+# CodeRush personal settings
+.cr/personal
+
+# Python Tools for Visual Studio (PTVS)
+__pycache__/
+*.pyc
+
+# Cake - Uncomment if you are using it
+# tools/**
+# !tools/packages.config
+
+# Tabs Studio
+*.tss
+
+# Telerik's JustMock configuration file
+*.jmconfig
+
+# BizTalk build output
+*.btp.cs
+*.btm.cs
+*.odx.cs
+*.xsd.cs
+
+# OpenCover UI analysis results
+OpenCover/
+
+# Azure Stream Analytics local run output
+ASALocalRun/
+
+# MSBuild Binary and Structured Log
+*.binlog
-UltimateAFK/bin/Debug/
+# NVidia Nsight GPU debugger configuration file
+*.nvuser
-UltimateAFK/bin/Release/
-UltimateAFK/bin/*
+# MFractors (Xamarin productivity tool) working folder
+.mfractor/
-packages/EXILED.2.1.29/.signature.p7s
+# Local History for Visual Studio
+.localhistory/
-packages/EXILED.2.1.29/EXILED.2.1.29.nupkg
+# BeatPulse healthcheck temp database
+healthchecksdb
-packages/EXILED.2.1.15/.signature.p7s
+# Backup folder for Package Reference Convert tool in Visual Studio 2017
+MigrationBackup/
-packages/EXILED.2.1.29/images/Exiled_Icon.jpg
+# Ionide (cross platform F# VS Code tools) working folder
+.ionide/
+.idea/
diff --git a/Cerberus.props b/Cerberus.props
new file mode 100644
index 0000000..5a15760
--- /dev/null
+++ b/Cerberus.props
@@ -0,0 +1,48 @@
+
+
+
+
+
+ Cerberus Team
+
+
+
+ net48
+ 12
+ x64
+ false
+ $(MSBuildThisFileDirectory)\bin\$(Configuration)\
+
+
+
+
+ 7.0.6
+
+ false
+
+ 2.2.1
+ 9.1.4
+ 1.1.118
+ 7.0.6
+
+ Copyright © $(Authors) 2020 - $([System.DateTime]::Now.ToString("yyyy"))
+ Git
+ https://github.com/cerberusServers
+ https://github.com/cerberusServers
+
+
+ $(DefineConstants);PUBLIC_BETA
+
+
+
+ True
+ True
+ Portable
+
+
+
+
+ $(NoWarn);SA0001
+
+
+
diff --git a/README.md b/README.md
index 0413626..92ef77f 100644
--- a/README.md
+++ b/README.md
@@ -1,33 +1,33 @@
+![Github All Releases](https://img.shields.io/github/downloads/SrLicht/Ultimate-AFK/total.svg)
+
# Ultimate-AFK
-Handles AFK Checking in SCP:SL for King's Playground Servers.
+This plugin allows AFK players to be replaced by players who are in spectator, they can also be kicked from the server after a certain number of being detected as AFK (configurable).
# Features
-- Detects AFK Players via in-game movement, camera movement, and in-game interactions
+- Detects AFK Players via in-game movement, camera movement
- Moves players to spectator after a determined AFK Time and grace period
-- (Optional) Try to replace the player with a random spectator using code from [DCReplace](https://github.com/Cyanox62/DCReplace)
- (Optional) Kick players from the server after repeated AFK detections!
- Custom broadcasts to AFK Players to indicate to them if they are AFK.
-- Works with SCP-079 by checking camera angle, and experience interactions
-
-# Default config:
-```yaml
-uafk_enable: true
-# The time is the time in seconds of non-movement before the player is detected as AFK.
-uafk_time: 30
-# The grace period is the time in seconds that the player has after the AFK Time where a message is displayed via broadcast.
-uafk_grace_period: 15
-uafk_prefix: [uAFK]
-uafk_grace_period_message: You will be moved to spec in %timeleft% seconds if you do not move!
-uafk_fspec_message: You were detected as AFK and automatically moved to spectator!
-uafk_try_replace: true
-uafk_replace_message: You have replaced a player who was AFK
-# Fspec count before player is kicked. (Set to -1 to disable kicking)
-uafk_kick_count: 2
-# Maximum replace time, if the round time is past this value it will not replace the player (Set to -1 to disable)
-uafk_max_replace_time: -1
-```
+- Works with SCP-079
+
+# Permission
+If you give a group the `uafk.ignore` permission the player will be ignored to replace a player and will also never be detected as AFK. Useful for administrators
+
# Installation
+**This plugin only works in [NwPluginAPI](https://github.com/northwood-studios/NwPluginAPI)**
-**[EXILED](https://github.com/galaxy119/EXILED) must be installed for this to work.**
+**You need [NWAPIPermissionSystem](https://github.com/CedModV2/NWAPIPermissionSystem) for this plugin to work.**
-Place the "UltimateAFK.dll" file in your Plugins folder.
+You can install this plugin using the command ``p install SrLicht/Ultimate-AFK`` on the console or by downloading the .dll file and placing it in ``SCP Secret Laboratory/PluginAPI/plugins/global or your port``
+
+# For devs
+You can disable a player from being detected as afk or using the command by setting ``uafk_disable`` in his TemporaryData.
+```cs
+// Add the temporary data
+player.TemporaryData.StoredData.Add("uafk_disable", true);
+
+// Remove the temporary data
+player.TemporaryData.StoredData.Remove("uafk_disable");
+// It is also cleaned at the end of a round or when a player is disconnected.
+```
+You can also prevent it from being detected as afk by adding the value ``uafk_disable_check``.
diff --git a/UltimateAFK/AFKComponent.cs b/UltimateAFK/AFKComponent.cs
deleted file mode 100644
index ced8af9..0000000
--- a/UltimateAFK/AFKComponent.cs
+++ /dev/null
@@ -1,248 +0,0 @@
-using System;
-using System.Linq;
-using UnityEngine;
-using MEC;
-using Exiled.API.Features;
-using Exiled.Loader;
-using PlayableScps;
-using scp035.API;
-using System.Reflection;
-using Exiled.API.Enums;
-
-namespace UltimateAFK
-{
- public class AFKComponent : MonoBehaviour
- {
- public MainClass plugin;
-
- public bool disabled = false;
-
- Player ply;
-
- public Vector3 AFKLastPosition;
- public Vector3 AFKLastAngle;
-
- public int AFKTime = 0;
- public int AFKCount = 0;
- private float timer = 0.0f;
-
- // Do not change this delay. It will screw up the detection
- public float delay = 1.0f;
-
- private Player TryGet035() => Scp035Data.GetScp035();
- private void TrySpawn035(Player player) => Scp035Data.Spawn035(player);
-
- // Expose replacing player for plugin support
- public Player PlayerToReplace;
-
-
- void Awake()
- {
- ply = Player.Get(gameObject);
- }
-
- void Update()
- {
- timer += Time.deltaTime;
- if (timer > delay)
- {
- timer = 0f;
- if (!this.disabled)
- {
- try
- {
- AFKChecker();
- }
- catch (Exception e)
- {
- Log.Error(e);
- }
- }
- }
- }
-
- // Called every 1 second according to the player's Update function. This is way more efficient than the old way of doing a forloop for every player.
- // Also, since the gameObject for the player is deleted when they disconnect, we don't need to worry about cleaning any variables :)
- private void AFKChecker()
- {
- //Log.Info($"AFK Time: {this.AFKTime} AFK Count: {this.AFKCount}");
- if (this.ply.Team == Team.RIP || Player.List.Count() <= plugin.Config.MinPlayers || (plugin.Config.IgnoreTut && this.ply.Team == Team.TUT)) return;
-
- bool isScp079 = (this.ply.Role == RoleType.Scp079);
- bool scp096TryNotToCry = false;
-
- // When SCP096 is in the state "TryNotToCry" he cannot move or it will cancel,
- // therefore, we don't want to AFK check 096 while he's in this state.
- if (this.ply.Role == RoleType.Scp096)
- {
- PlayableScps.Scp096 scp096 = this.ply.ReferenceHub.scpsController.CurrentScp as PlayableScps.Scp096;
- scp096TryNotToCry = (scp096.PlayerState == Scp096PlayerState.TryNotToCry);
- }
-
- Vector3 CurrentPos = this.ply.Position;
- Vector3 CurrentAngle = (isScp079) ? this.ply.Camera.targetPosition.position : this.ply.Rotation;
-
- if (CurrentPos != this.AFKLastPosition || CurrentAngle != this.AFKLastAngle || scp096TryNotToCry)
- {
- this.AFKLastPosition = CurrentPos;
- this.AFKLastAngle = CurrentAngle;
- this.AFKTime = 0;
- PlayerToReplace = null;
- return;
- }
-
- // The player hasn't moved past this point.
- this.AFKTime++;
-
- // If the player hasn't reached the time yet don't continue.
- if (this.AFKTime < plugin.Config.AfkTime) return;
-
- // Check if we're still in the "grace" period
- int secondsuntilspec = (plugin.Config.AfkTime + plugin.Config.GraceTime) - this.AFKTime;
- if (secondsuntilspec > 0)
- {
- string warning = plugin.Config.MsgGrace;
- warning = warning.Replace("%timeleft%", secondsuntilspec.ToString());
-
- this.ply.ClearBroadcasts();
- this.ply.Broadcast(1, $"{plugin.Config.MsgPrefix} {warning}");
- return;
- }
-
- // The player is AFK and action will be taken.
- Log.Info($"{this.ply.Nickname} ({this.ply.UserId}) was detected as AFK!");
- this.AFKTime = 0;
-
- // Let's make sure they are still alive before doing any replacement.
- if (this.ply.Team == Team.RIP) return;
-
- if (plugin.Config.TryReplace && !IsPastReplaceTime())
- {
- Assembly easyEvents = Loader.Plugins.FirstOrDefault(pl => pl.Name == "EasyEvents")?.Assembly;
-
- var roleEasyEvents = easyEvents?.GetType("EasyEvents.Util")?.GetMethod("GetRole")?.Invoke(null, new object[] { this.ply });
-
- // SCP035 Support (Credit DCReplace)
- bool is035 = false;
- try
- {
- is035 = this.ply.Id == TryGet035()?.Id;
- }
- catch (Exception e)
- {
- Log.Debug($"SCP-035 is not installed, skipping method call: {e}");
- }
-
- // Credit: DCReplace :)
- // I mean at this point 90% of this has been rewritten lol...
- var inventory = this.ply.Inventory.items.Select(x => x.id).ToList();
-
- RoleType role = this.ply.Role;
- Vector3 pos = this.ply.Position;
- float health = this.ply.Health;
-
- // New strange ammo system because the old one was fucked.
- uint ammo1 = this.ply.Ammo[(int)AmmoType.Nato556];
- uint ammo2 = this.ply.Ammo[(int)AmmoType.Nato762];
- uint ammo3 = this.ply.Ammo[(int)AmmoType.Nato9];
-
- // Stuff for 079
- byte Level079 = 0;
- float Exp079 = 0f, AP079 = 0f;
- if (isScp079)
- {
- Level079 = this.ply.Level;
- Exp079 = this.ply.Experience;
- AP079 = this.ply.Energy;
- }
-
- PlayerToReplace = Player.List.FirstOrDefault(x => x.Role == RoleType.Spectator && x.UserId != string.Empty && !x.IsOverwatchEnabled && x != this.ply);
- if (PlayerToReplace != null)
- {
- // Make the player a spectator first so other plugins can do things on player changing role with uAFK.
- this.ply.Inventory.Clear(); // Clear their items to prevent dupes.
- this.ply.SetRole(RoleType.Spectator);
- this.ply.Broadcast(30, $"{plugin.Config.MsgPrefix} {plugin.Config.MsgFspec}");
-
- PlayerToReplace.SetRole(role);
-
- Timing.CallDelayed(0.3f, () =>
- {
- if (is035)
- {
- try
- {
- TrySpawn035(PlayerToReplace);
- }
- catch (Exception e)
- {
- Log.Debug($"SCP-035 is not installed, skipping method call: {e}");
- }
- }
- PlayerToReplace.Position = pos;
-
- PlayerToReplace.ClearInventory();
- PlayerToReplace.ResetInventory(inventory);
-
- PlayerToReplace.Health = health;
-
- PlayerToReplace.Ammo[(int)AmmoType.Nato556] = ammo1;
- PlayerToReplace.Ammo[(int)AmmoType.Nato762] = ammo2;
- PlayerToReplace.Ammo[(int)AmmoType.Nato9] = ammo3;
-
- if (isScp079)
- {
- PlayerToReplace.Level = Level079;
- PlayerToReplace.Experience = Exp079;
- PlayerToReplace.Energy = AP079;
- }
-
- PlayerToReplace.Broadcast(10, $"{plugin.Config.MsgPrefix} {plugin.Config.MsgReplace}");
- if (roleEasyEvents != null) easyEvents?.GetType("EasyEvents.CustomRoles")?.GetMethod("ChangeRole")?.Invoke(null, new object[] { PlayerToReplace, roleEasyEvents });
- PlayerToReplace = null;
- });
- }
- else
- {
- // Couldn't find a valid player to spawn, just ForceToSpec anyways.
- ForceToSpec(this.ply);
- }
- }
- else
- {
- // Replacing is disabled, just ForceToSpec
- ForceToSpec(this.ply);
- }
- // If it's -1 we won't be kicking at all.
- if (plugin.Config.NumBeforeKick != -1)
- {
- // Increment AFK Count
- this.AFKCount++;
- if (this.AFKCount >= plugin.Config.NumBeforeKick)
- {
- // Since this.AFKCount is greater than the config we're going to kick that player for being AFK too many times in one match.
- ServerConsole.Disconnect(this.gameObject, plugin.Config.MsgKick);
- }
- }
- }
-
- private void ForceToSpec(Player hub)
- {
- hub.SetRole(RoleType.Spectator);
- hub.Broadcast(30, $"{plugin.Config.MsgPrefix} {plugin.Config.MsgFspec}");
- }
-
- private bool IsPastReplaceTime()
- {
- if (plugin.Config.MaxReplaceTime != -1)
- {
- if (Round.ElapsedTime.TotalSeconds > plugin.Config.MaxReplaceTime)
- {
- Log.Info("Since we are past the allowed replace time, we will not look for replacement player.");
- return true;
- }
- }
- return false;
- }
- }
-}
diff --git a/UltimateAFK/API/Components/AfkCheckComponent.cs b/UltimateAFK/API/Components/AfkCheckComponent.cs
new file mode 100644
index 0000000..01930ce
--- /dev/null
+++ b/UltimateAFK/API/Components/AfkCheckComponent.cs
@@ -0,0 +1,509 @@
+using MEC;
+using NWAPIPermissionSystem;
+using PlayerRoles;
+using PlayerRoles.PlayableScps.Scp079;
+using PlayerRoles.PlayableScps.Scp096;
+using PlayerRoles.Spectating;
+using PluginAPI.Core;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using UltimateAFK.API.Structs;
+using UnityEngine;
+
+namespace UltimateAFK.API.Components
+{
+ ///
+ /// Player component who check if the player is not moving.
+ ///
+ public class AfkCheckComponent : MonoBehaviour
+ {
+ // Main fields
+
+ ///
+ /// Player who owns this component.
+ ///
+ private protected Player Owner = null!;
+
+ ///
+ /// Cached of the
+ ///
+ private protected string OwnerUserId = string.Empty;
+
+ ///
+ /// Plugin config instance.
+ ///
+ private Config PluginConfig => EntryPoint.Instance.Config;
+
+ ///
+ /// Checks if the owner have the 'uafk.ignore' permission.
+ ///
+ private bool IsIgnored = false;
+
+ ///
+ /// Check if the owner have the 'uafk_disable_check' temporary data.
+ ///
+ private bool IsTemporaryIgnored => Owner.TemporaryData.StoredData.ContainsKey("uafk_disable_check") || Owner.Role == RoleTypeId.Tutorial && PluginConfig.IgnoreTut;
+
+ ///
+ /// Checks if the current is ended.
+ ///
+ private bool IsRoundEnded => Round.Duration.TotalSeconds > 0 && !Round.IsRoundStarted;
+
+ ///
+ /// If is disable the player will not be replaced.
+ ///
+ private bool IsReplacedDisable = false;
+
+ private void Start()
+ {
+ if (!TryGetOwner(out Owner))
+ {
+ Log.Debug($"{GetType().Name}::{nameof(Start)}: Error on getting player or player is not ready | {Owner is null}", PluginConfig.DebugMode);
+ Disable();
+ return;
+ }
+
+ OwnerUserId = Owner.UserId;
+
+ IsIgnored = Owner.CheckPermission("uafk.ignore") || Owner.CheckPermission("uafk.detectiondisabled") || PluginConfig.UserIdIgnored.Contains(Owner.UserId);
+
+ IsReplacedDisable = PluginConfig.DisableReplacement;
+
+ // Starts the coroutine that checks if the player is moving, the coroutine is cancelled if the gameobject (the player) becomes null or the component is destroyed.
+ CoroutineHandle = Timing.RunCoroutine(AfkStatusChecker().CancelWith(gameObject).CancelWith(this));
+ Log.Debug($"Component {GetType().Name} fully loaded for {Owner.LogName}", PluginConfig.DebugMode, "UltimateAfk");
+ }
+
+ private void OnDestroy()
+ {
+ if (CoroutineHandle.IsRunning)
+ CoroutineHandle.IsRunning = false; // Using this is the same as using Timing.KillCoroutine(CoroutineHandle); | Inspect CoroutineHandle struc for more info.
+ }
+
+ ///
+ /// Destroy the component.
+ ///
+ public void Disable()
+ {
+ Destroy(this);
+ }
+
+ ///
+ /// Coroutine that continuously checks and updates the AFK status of players.
+ ///
+ private IEnumerator AfkStatusChecker()
+ {
+
+ while (true)
+ {
+ try
+ {
+ CheckAfk();
+ }
+ catch (Exception e)
+ {
+ Log.Error($"Error on {nameof(AfkCheckComponent)}::{nameof(AfkStatusChecker)}: {e.Message} || typeof {e.GetType()}");
+ }
+
+ yield return Timing.WaitForSeconds(1);
+ }
+ }
+
+ ///
+ /// Gets how many times this player has detected has AFK.
+ ///
+ ///
+ public int GetAfkTimes() => afkTimes;
+
+ ///
+ /// Sets how many times this player has detected has AFK.
+ ///
+ ///
+ public void SetAfkTimes(int times) => afkTimes = times;
+
+ // Main Method
+
+ ///
+ /// Checks the AFK status of the player and takes appropriate actions.
+ ///
+ private void CheckAfk()
+ {
+ if (!Round.IsRoundStarted || IsRoundEnded || Player.Count < PluginConfig.MinPlayers || IsIgnored || IsTemporaryIgnored)
+ return;
+
+ // Retrieve player information.
+ Vector3 worldPosition = Owner.Position;
+ Vector3 cameraPosition = Owner.Camera.position;
+ Quaternion cameraRotation = Owner.Camera.rotation;
+
+ Log.Debug($"{nameof(CheckAfk)}: Owner role is {Owner.Role}", PluginConfig.DebugMode);
+ switch (Owner.Role)
+ {
+ case RoleTypeId.Scp096:
+ {
+ Scp096Role ??= Owner.RoleBase as Scp096Role;
+ if (Scp096Role is null)
+ break;
+
+ if (Scp096Role.IsAbilityState(Scp096AbilityState.TryingNotToCry) || IsMoving(worldPosition, cameraPosition, cameraRotation))
+ {
+ // set afk time to 0 player is moving.
+ secondsNotMoving = 0;
+ }
+ else
+ {
+ Log.Debug($"Player {Owner.LogName} is not moving. Seconds not moving: {secondsNotMoving}", PluginConfig.DebugMode);
+ HandleAfkState();
+ }
+
+ break;
+ }
+ case RoleTypeId.Scp079:
+ {
+ Scp079Role ??= Owner.RoleBase as Scp079Role;
+
+ if (Scp079Role is null)
+ break;
+
+ cameraPosition = Scp079Role.CameraPosition;
+ cameraRotation = Scp079Role.CurrentCamera._cameraAnchor.transform.rotation;
+
+ if (IsMoving(worldPosition, cameraPosition, cameraRotation))
+ {
+ // Do nothing player is moving
+ secondsNotMoving = 0;
+ }
+ else
+ {
+ Log.Debug($"Player {Owner.LogName} is not moving. Seconds not moving: {secondsNotMoving}", PluginConfig.DebugMode);
+ HandleAfkState();
+ }
+
+ break;
+ }
+ case RoleTypeId.Overwatch:
+ case RoleTypeId.Filmmaker:
+ case RoleTypeId.None:
+ case RoleTypeId.Spectator:
+ {
+ // Do nothing player is not alive.
+ secondsNotMoving = 0;
+ break;
+ }
+ default:
+ {
+ // Player is human or a SCP with more simple mechanic arround camera/position
+ if (IsMoving(worldPosition, cameraPosition, cameraRotation))
+ {
+ // Do nothing player is moving
+ secondsNotMoving = 0;
+ }
+ else
+ {
+ Log.Debug($"Player {Owner.LogName} is not moving. Seconds not moving: {secondsNotMoving}", PluginConfig.DebugMode, "UltimateAfk");
+
+ HandleAfkState();
+ }
+ break;
+ }
+ }
+ }
+
+ ///
+ /// Replaces the specified player with a suitable replacement based on the specified role type.
+ ///
+ /// The player to be replaced.
+ /// The role type of the player to be replaced.
+ private void Replace(Player player, RoleTypeId roleType)
+ {
+ // Check if role is blacklisted
+ if (PluginConfig.RoleTypeBlacklist?.Contains(roleType) == true)
+ {
+ Log.Debug($"player {player.Nickname} ({player.UserId}) has a role that is blacklisted so he will not be searched for a replacement player", PluginConfig.DebugMode, "UltimateAfk");
+
+ player.ClearInventory();
+ player.SetRole(RoleTypeId.Spectator);
+
+ if (PluginConfig.AfkCount > -1)
+ {
+ if (++afkTimes >= PluginConfig.AfkCount)
+ {
+ player.SendConsoleMessage(PluginConfig.MsgKick, "white");
+ player.Kick(PluginConfig.MsgKick);
+ return;
+ }
+ }
+
+ player.SendBroadcast(PluginConfig.MsgFspec, 30, shouldClearPrevious: true);
+ player.SendConsoleMessage(PluginConfig.MsgFspec, "white");
+ return;
+ }
+
+ // Get a replacement player
+ Player? replacement = GetReplacement();
+
+ if (replacement == null)
+ {
+ if(IsReplacedDisable)
+ Log.Debug("AFK player replacement is disabled by the plugin configuration.", PluginConfig.DebugMode, "UltimateAfk");
+ else
+ Log.Debug("Unable to find replacement player, moving to spectator...", PluginConfig.DebugMode, "UltimateAfk");
+
+ player.ClearInventory();
+
+ if (player.IsSCP)
+ player.ReferenceHub.roleManager.ServerSetRole(RoleTypeId.Spectator, RoleChangeReason.RemoteAdmin, RoleSpawnFlags.None);
+ else
+ player.SetRole(RoleTypeId.Spectator);
+
+ if (PluginConfig.AfkCount > -1)
+ {
+ if (++afkTimes >= PluginConfig.AfkCount)
+ {
+ player.SendConsoleMessage(PluginConfig.MsgKick, "white");
+
+ player.Kick(PluginConfig.MsgKick);
+
+ return;
+ }
+ }
+
+ player.SendBroadcast(PluginConfig.MsgFspec, 30, shouldClearPrevious: true);
+ player.SendConsoleMessage(PluginConfig.MsgFspec, "white");
+
+ API.EventArgs.Events.OnDetectedAfkPlayer(new(player, false));
+ }
+ else
+ {
+ Log.Debug($"Replacement Player found: {replacement.LogName}", PluginConfig.DebugMode, "UltimateAfk");
+
+ SaveData(replacement.UserId, roleType is RoleTypeId.Scp079);
+
+ if (PluginConfig.AfkCount > -1)
+ {
+ if (++afkTimes >= PluginConfig.AfkCount)
+ {
+ player.ClearInventory();
+ player.SendConsoleMessage(PluginConfig.MsgKick, "white");
+ player.Kick(PluginConfig.MsgKick);
+ replacement.SetRole(roleType);
+ return;
+ }
+ }
+
+ Log.Debug($"Cleaning player {player.Nickname} inventory", PluginConfig.DebugMode, "UltimateAfk");
+ // Clear player inventory
+ player.ClearInventory();
+ //Send player a broadcast for being too long afk
+ player.SendBroadcast(PluginConfig.MsgFspec, 25, shouldClearPrevious: true);
+ player.SendConsoleMessage(PluginConfig.MsgFspec, "white");
+
+ // Sends replacement to the role that had the afk
+ Log.Debug($"Changing replacement player {replacement.LogName} role to {roleType}", PluginConfig.DebugMode, "UltimateAfk");
+ replacement.SetRole(roleType);
+ // Sends player to spectator
+ Log.Debug($"Changing player {player.Nickname} to spectator", PluginConfig.DebugMode, "UltimateAfk");
+
+ if (player.IsSCP)
+ player.ReferenceHub.roleManager.ServerSetRole(RoleTypeId.Spectator, RoleChangeReason.RemoteAdmin, RoleSpawnFlags.None);
+ else
+ player.SetRole(RoleTypeId.Spectator);
+
+ player.SendConsoleMessage(string.Format(PluginConfig.MsgReplaced, replacement.Nickname), "white");
+
+ API.EventArgs.Events.OnDetectedAfkPlayer(new(player, false));
+ }
+ }
+
+ ///
+ /// Saves data for the specified replacement player.
+ ///
+ /// The user ID of the replacement player.
+ /// Flag indicating whether the replacement player is SCP-079.
+ private void SaveData(string replacementUserId, bool isScp079 = false)
+ {
+ Log.Debug($"Saving data for {replacementUserId}", PluginConfig.DebugMode, "UltimateAfk");
+
+ AfkData data;
+
+ if (isScp079)
+ {
+ Log.Debug($"Saving data: Player is SCP-079", PluginConfig.DebugMode, "UltimateAfk");
+ if (Owner.RoleBase is Scp079Role scp079Role && scp079Role.SubroutineModule.TryGetSubroutine(out Scp079TierManager tierManager)
+ && scp079Role.SubroutineModule.TryGetSubroutine(out Scp079AuxManager energyManager))
+ {
+ data = new AfkData(Owner.Nickname, Owner.Position, Owner.Role, null, new(), Owner.Health, new(tierManager.TotalExp, energyManager.CurrentAux));
+ }
+ else
+ {
+ data = new AfkData(Owner.Nickname, Owner.Position, Owner.Role, null, new(), Owner.Health, null);
+ // Return early if SCP-079 data cannot be obtained
+ return;
+ }
+ }
+ else
+ {
+ data = new AfkData(Owner.Nickname, Owner.Position, Owner.Role, Owner.GetAmmo(), Owner.GetItemTypes(), Owner.Health, null);
+ }
+
+ Log.Debug($"Saving data: Saving in ReplacingPlayersData", PluginConfig.DebugMode, "UltimateAfk");
+ MainHandler.ReplacingPlayersData.Add(replacementUserId, data);
+ }
+
+ ///
+ /// Handles the AFK state for the player.
+ ///
+ private void HandleAfkState()
+ {
+ // Increment the time the player has not been moving
+ if (secondsNotMoving++ < PluginConfig.AfkTime)
+ return;
+
+ // Calculate remaining grace time
+ var graceTimeRemaining = PluginConfig.GraceTime - (secondsNotMoving - PluginConfig.AfkTime);
+
+ if (graceTimeRemaining > 0)
+ {
+ // The player is being considered AFK and is being warned that they have X time to move again or they will be kicked/replaced
+ Owner.SendBroadcast(string.Format(PluginConfig.MsgGrace, graceTimeRemaining), 2,
+ shouldClearPrevious: true);
+ }
+ else
+ {
+ // The player has exceeded the grace time and is now officially AFK
+ Log.Info($"{Owner.LogName} was detected as AFK");
+
+ secondsNotMoving = 0;
+ // Optionally invoke custom event or action when a player is detected as AFK
+ // API.AfkEvents.Instance.InvokePlayerAfkDetected(Owner, false);
+ Replace(Owner, Owner.Role);
+ }
+ }
+
+ ///
+ /// Gets the player to be used as a replacement, typically the longest-active spectator.
+ ///
+ /// The player to be used as a replacement, or null if no suitable replacement is found.
+ private Player? GetReplacement()
+ {
+ try
+ {
+
+ if (IsReplacedDisable)
+ return null;
+
+ Player? longestSpectator = null;
+ float maxActiveTime = 0f;
+
+ // Find the longest-active spectator among non-ignored players
+ foreach (var player in Player.GetPlayers().Where(p => !IgnorePlayer(p)))
+ {
+ if (player.Role == RoleTypeId.Spectator && player.RoleBase is SpectatorRole spectatorRole)
+ {
+ // Update the longest spectator if the current one has a longer active time
+ if (spectatorRole.ActiveTime > maxActiveTime)
+ {
+ maxActiveTime = spectatorRole.ActiveTime;
+ longestSpectator = player;
+ }
+ }
+ }
+
+ return longestSpectator;
+ }
+ catch (Exception e)
+ {
+ // Log and handle any exceptions that occur during the process
+ Log.Error($"Error in {nameof(GetReplacement)}: {e} || Type: {e.GetType()}");
+ return null;
+ }
+ }
+
+ ///
+ /// Determines whether the specified player should be ignored in the context of AFK checks.
+ ///
+ /// The player to check.
+ ///
+ /// true if the player should be ignored; otherwise, false.
+ ///
+ private bool IgnorePlayer(Player player)
+ {
+ // Check various conditions to determine if the player should be ignored
+ if (!player.IsReady || // Player is not ready
+ PluginConfig.UserIdIgnored.Contains(OwnerUserId) || // Player's user ID is in the ignored list
+ player.TemporaryData.StoredData.ContainsKey("uafk_disable") || // Player has AFK checking disabled
+ player.UserId == OwnerUserId || // Player is the same as the owner
+ player.IsAlive || // Player is alive
+ player.CheckPermission("uafk.ignore") || // Player has the uafk.ignore permission
+ player.IsServer || // Player is a server
+ player.UserId.Contains("@server") || // Player's user ID contains "@server"
+ player.UserId.Contains("@npc") || // Player's user ID contains "@npc"
+ MainHandler.ReplacingPlayersData.TryGetValue(player.UserId, out _)) // Player is being replaced
+ {
+ return true;
+ }
+
+ return false;
+ }
+
+
+ ///
+ /// Determines whether an object is moving based on its world position, camera position, and camera rotation.
+ ///
+ /// The world position of the object.
+ /// The position of the camera.
+ /// The rotation of the camera.
+ ///
+ /// true if the object is moving; otherwise, false.
+ ///
+ private bool IsMoving(Vector3 worldPosition, Vector3 cameraPosition, Quaternion cameraRotation)
+ {
+ // Check if any of the parameters have changed since the last check
+ bool hasChanged = worldPosition != _lastPosition ||
+ cameraPosition != _lastCameraPosition ||
+ cameraRotation != _lastCameraRotation;
+
+ // Update the last recorded values
+ if (hasChanged)
+ {
+ _lastPosition = worldPosition;
+ _lastCameraPosition = cameraPosition;
+ _lastCameraRotation = cameraRotation;
+ }
+
+ // Return true if there is a change, indicating movement
+ return hasChanged;
+ }
+
+
+ ///
+ /// Try get the Owner of this component, if fails the component is destroyed.
+ ///
+ ///
+ ///
+ protected bool TryGetOwner(out Player player)
+ {
+ player = Player.Get(gameObject);
+ return player != null && player.ReferenceHub.authManager.InstanceMode is CentralAuth.ClientInstanceMode.ReadyClient;
+ }
+ // fields //
+
+ // Seconds a player was not moving
+ private int secondsNotMoving;
+ // Position in the world
+ private Vector3 _lastPosition;
+ // Player camera position
+ private Vector3 _lastCameraPosition;
+ // Player camera rotation
+ private Quaternion _lastCameraRotation;
+ // Number of times that the player was detected as AFK
+ private int afkTimes = 0;
+ // Coroutine that handles afk checking.
+ private CoroutineHandle CoroutineHandle;
+ // Cached Scp079Role
+ private Scp079Role? Scp079Role = null;
+ // Cached Scp096Role
+ private Scp096Role? Scp096Role = null;
+ }
+}
diff --git a/UltimateAFK/API/EventArgs/DetectedAfkPlayerEventArgs.cs b/UltimateAFK/API/EventArgs/DetectedAfkPlayerEventArgs.cs
new file mode 100644
index 0000000..ab8491f
--- /dev/null
+++ b/UltimateAFK/API/EventArgs/DetectedAfkPlayerEventArgs.cs
@@ -0,0 +1,31 @@
+using PluginAPI.Core;
+
+namespace UltimateAFK.API.EventArgs
+{
+ ///
+ /// Represents the event arguments for detecting an AFK player.
+ ///
+ public sealed class DetectedAfkPlayerEventArgs
+ {
+ ///
+ /// Initializes a new instance of the .
+ ///
+ /// The AFK player that has been detected.
+ /// Indicates whether the detection is associated with a specific command.
+ public DetectedAfkPlayerEventArgs(Player player, bool isForCommand)
+ {
+ Player = player;
+ IsForCommand = isForCommand;
+ }
+
+ ///
+ /// Gets the player who is detected as AFK player.
+ ///
+ public Player Player { get; }
+
+ ///
+ /// Gets if the detection if for the command.
+ ///
+ public bool IsForCommand { get; }
+ }
+}
diff --git a/UltimateAFK/API/EventArgs/Events.cs b/UltimateAFK/API/EventArgs/Events.cs
new file mode 100644
index 0000000..f00d6c3
--- /dev/null
+++ b/UltimateAFK/API/EventArgs/Events.cs
@@ -0,0 +1,26 @@
+using System;
+
+namespace UltimateAFK.API.EventArgs
+{
+ ///
+ /// A static class that defines events related to detecting AFK players.
+ ///
+ public class Events
+ {
+#nullable disable
+
+ ///
+ /// Event triggered when an AFK player is detected.
+ ///
+ public static event Action DetectedAfkPlayer;
+
+ ///
+ /// Invokes the event.
+ ///
+ /// The event arguments containing information about the detected AFK player.
+ public static void OnDetectedAfkPlayer(DetectedAfkPlayerEventArgs ev) => DetectedAfkPlayer?.Invoke(ev);
+
+#nullable enable
+ }
+
+}
diff --git a/UltimateAFK/API/Extensions.cs b/UltimateAFK/API/Extensions.cs
new file mode 100644
index 0000000..2501191
--- /dev/null
+++ b/UltimateAFK/API/Extensions.cs
@@ -0,0 +1,396 @@
+using Interactables.Interobjects;
+using InventorySystem;
+using InventorySystem.Items;
+using InventorySystem.Items.Firearms;
+using InventorySystem.Items.Firearms.Attachments;
+using NWAPIPermissionSystem;
+using PlayerRoles;
+using PlayerRoles.PlayableScps.Scp079;
+using PlayerRoles.Spectating;
+using PluginAPI.Core;
+using PluginAPI.Core.Attributes;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using InventorySystem.Items.Firearms.Modules;
+using UltimateAFK.API.Components;
+using UltimateAFK.API.Structs;
+
+namespace UltimateAFK.API
+{
+ ///
+ /// A collection of extension methods.
+ ///
+ public static class Extensions
+ {
+ ///
+ /// Gets a list of all Elevators in the facility.
+ ///
+ public static List AllElevators = new(Map.Elevators);
+
+ ///
+ /// Determines whether the round has ended.
+ ///
+ ///
+ /// true if the round has ended; otherwise, false.
+ ///
+ public static bool IsRoundEnded()
+ {
+ return !Round.IsRoundStarted && Round.Duration.TotalSeconds > 0;
+ }
+
+ ///
+ /// Obtains a list of ItemType instances representing the items held by the player, excluding ammo.
+ ///
+ /// The player whose items are to be retrieved.
+ /// A list of ItemType instances representing the non-ammo items held by the player.
+ public static List GetItemTypes(this Player player)
+ {
+ // Retrieve the items from the player's inventory
+ var playerItem = player.ReferenceHub.inventory.UserInventory.Items.Values;
+
+ // Create a list to store the resulting ItemType
+ List result = new List();
+
+ foreach (var item in playerItem)
+ {
+ // Exclude items with the Ammo category
+ if (item.Category == ItemCategory.Ammo)
+ continue;
+ // Add the ItemType of the item to the result list
+ result.Add(item.ItemTypeId);
+ }
+
+ // Return the list of non-ammo ItemType
+ return result;
+ }
+
+ ///
+ /// Retrieves a dictionary representing the ammunition held by the player.
+ ///
+ /// The player whose ammunition is to be retrieved.
+ /// A dictionary where keys are ItemType instances and values are the corresponding ammunition amounts.
+ public static Dictionary GetAmmo(this Player player)
+ {
+ // Retrieve the ammunition from the player's inventory and create a copy using ToDictionary
+ Dictionary result = player.ReferenceHub.inventory.UserInventory.ReserveAmmo.ToDictionary(entry => entry.Key, entry => entry.Value);
+
+ return result;
+ }
+
+ ///
+ /// Replaces the player with another.
+ ///
+ /// The player to be replaced.
+ /// The role type of the player to be replaced.
+ /// If this is true will be counted for kick if reach the max afk times
+ public static void Replace(this Player player, RoleTypeId role, bool countForKicl = false)
+ {
+ if (!player.TryGetComponent(out var component))
+ return;
+
+ string ownerUserId = player.UserId;
+ int afkTimes = component.GetAfkTimes();
+
+ // Check if role is blacklisted
+ if (EntryPoint.Instance.Config.RoleTypeBlacklist?.Contains(role) == true)
+ {
+ Log.Debug($"player {player.Nickname} ({player.UserId}) has a role that is blacklisted so he will not be searched for a replacement player", EntryPoint.Instance.Config.DebugMode);
+
+ player.ClearInventory();
+ player.SetRole(RoleTypeId.Spectator);
+
+ if (EntryPoint.Instance.Config.AfkCount > -1 && countForKicl)
+ {
+
+ if (++afkTimes >= EntryPoint.Instance.Config.AfkCount)
+ {
+ player.SendConsoleMessage(EntryPoint.Instance.Config.MsgKick, "white");
+ player.Kick(EntryPoint.Instance.Config.MsgKick);
+ return;
+ }
+ }
+
+ component.SetAfkTimes(afkTimes);
+
+ player.SendBroadcast(EntryPoint.Instance.Config.MsgFspec, 30, shouldClearPrevious: true);
+ player.SendConsoleMessage(EntryPoint.Instance.Config.MsgFspec, "white");
+ return;
+ }
+
+ // Get a replacement player
+ Player? replacement = GetReplacement(ownerUserId);
+
+ if (replacement == null)
+ {
+ if (EntryPoint.Instance.Config.DisableReplacement)
+ Log.Debug("AFK player replacement is disabled by the plugin configuration.", EntryPoint.Instance.Config.DebugMode);
+ else
+ Log.Debug("Unable to find replacement player, moving to spectator...", EntryPoint.Instance.Config.DebugMode);
+
+ player.ClearInventory();
+
+ if (player.IsSCP)
+ player.ReferenceHub.roleManager.ServerSetRole(RoleTypeId.Spectator, RoleChangeReason.RemoteAdmin, RoleSpawnFlags.None);
+ else
+ player.SetRole(RoleTypeId.Spectator);
+
+ if (EntryPoint.Instance.Config.AfkCount > -1 && countForKicl)
+ {
+ afkTimes++;
+
+ if (afkTimes >= EntryPoint.Instance.Config.AfkCount)
+ {
+ player.SendConsoleMessage(EntryPoint.Instance.Config.MsgKick, "white");
+
+ player.Kick(EntryPoint.Instance.Config.MsgKick);
+
+ return;
+ }
+ }
+
+ player.SendBroadcast(EntryPoint.Instance.Config.MsgFspec, 30, shouldClearPrevious: true);
+ player.SendConsoleMessage(EntryPoint.Instance.Config.MsgFspec, "white");
+ }
+ else
+ {
+ Log.Debug($"Replacement Player found: {replacement.LogName}", EntryPoint.Instance.Config.DebugMode);
+
+ SaveData(player, replacement.UserId, role is RoleTypeId.Scp079);
+
+ if (EntryPoint.Instance.Config.AfkCount > -1 && countForKicl)
+ {
+
+ if (++afkTimes >= EntryPoint.Instance.Config.AfkCount)
+ {
+ player.ClearInventory();
+ player.SendConsoleMessage(EntryPoint.Instance.Config.MsgKick, "white");
+ player.Kick(EntryPoint.Instance.Config.MsgKick);
+ replacement.SetRole(role);
+ return;
+ }
+ }
+
+ component.SetAfkTimes(afkTimes);
+ Log.Debug($"Cleaning player {player.Nickname} inventory", EntryPoint.Instance.Config.DebugMode);
+ // Clear player inventory
+ player.ClearInventory();
+ //Send player a broadcast for being too long afk
+ player.SendBroadcast(EntryPoint.Instance.Config.MsgFspec, 25, shouldClearPrevious: true);
+ player.SendConsoleMessage(EntryPoint.Instance.Config.MsgFspec, "white");
+
+ // Sends replacement to the role that had the afk
+ Log.Debug($"Changing replacement player {replacement.LogName} role to {role}", EntryPoint.Instance.Config.DebugMode);
+ replacement.SetRole(role);
+ // Sends player to spectator
+ Log.Debug($"Changing player {player.Nickname} to spectator", EntryPoint.Instance.Config.DebugMode);
+
+ if (player.IsSCP)
+ player.ReferenceHub.roleManager.ServerSetRole(RoleTypeId.Spectator, RoleChangeReason.RemoteAdmin, RoleSpawnFlags.None);
+ else
+ player.SetRole(RoleTypeId.Spectator);
+
+ player.SendConsoleMessage(string.Format(EntryPoint.Instance.Config.MsgReplaced, replacement.Nickname), "white");
+ }
+ }
+
+ ///
+ /// Checks if the specified is ammo.
+ ///
+ /// The to check.
+ /// if the is ammo; otherwise, .
+ public static bool IsAmmo(this ItemType type)
+ {
+ var itemBase = type.GetItemBase();
+ return itemBase?.Category == ItemCategory.Ammo;
+ }
+
+ ///
+ /// Retrieves the base item associated with a specific item type.
+ ///
+ /// The item type for which the base item is requested.
+ ///
+ /// The base item associated with the specified item type if available; otherwise, returns null.
+ ///
+ public static ItemBase? GetItemBase(this ItemType type)
+ {
+ if (!InventoryItemLoader.AvailableItems.TryGetValue(type, out ItemBase @base))
+ return null;
+
+ return @base;
+ }
+
+ ///
+ /// Gives the ammunition you want a player to have.
+ ///
+ public static void SendAmmo(this Player ply, Dictionary ammo)
+ {
+ foreach (var ammoItem in ammo)
+ {
+ ply.SetAmmo(ammoItem.Key, ammoItem.Value);
+ }
+ }
+
+ ///
+ /// Reloads all player 's
+ ///
+ ///
+ public static void ReloadAllWeapons(this Player ply)
+ {
+ var item = ply.Items.Where(i => i is Firearm);
+
+ foreach (ItemBase? weapon in item)
+ {
+ if (weapon is not Firearm firearm)
+ continue;
+
+ if (firearm.Modules.FirstOrDefault(m => m is MagazineModule) is MagazineModule magazineModule)
+ {
+ magazineModule.AmmoStored = magazineModule.AmmoMax;
+ }
+ }
+ }
+
+ ///
+ /// Adds several items at the same time to a player.
+ ///
+ public static void SendItems(this Player player, List types)
+ {
+ if (types.IsEmpty())
+ return;
+
+ foreach (var item in types)
+ {
+ player.AddItem(item);
+ }
+ }
+
+ ///
+ /// Applies player attachments preferences.
+ ///
+ ///
+ public static void ApplyAttachments(this Player ply)
+ {
+ var item = ply.Items.Where(i => i is Firearm);
+
+ foreach (ItemBase? fire in item)
+ {
+ if (fire is not Firearm fireArm)
+ continue;
+
+ if (AttachmentsServerHandler.PlayerPreferences.TryGetValue(ply.ReferenceHub, out var value) && value.TryGetValue(fireArm.ItemTypeId, out var value2))
+ fireArm.ApplyAttachmentsCode(value2, reValidate: true);
+ }
+ }
+
+ ///
+ /// Gets if the current player is in a elevator.
+ ///
+ ///
+ ///
+ public static bool InElevator(this Player player)
+ {
+ foreach (var elevator in AllElevators)
+ {
+ if (elevator.WorldspaceBounds.Contains(player.Position) && elevator.IsMoving())
+ return true;
+ }
+
+ return false;
+ }
+
+ ///
+ /// Check if the current is moving.
+ ///
+ ///
+ ///
+ public static bool IsMoving(this ElevatorChamber elevator) => elevator.CurSequence is ElevatorChamber.ElevatorSequence.MovingAway or ElevatorChamber.ElevatorSequence.Arriving;
+
+ ///
+ /// Gets the player to be used as a replacement, typically the longest-active spectator.
+ ///
+ /// The player to be used as a replacement, or null if no suitable replacement is found.
+ private static Player? GetReplacement(string ownerUserId)
+ {
+ try
+ {
+ // Return null if replacement is disable
+ if (EntryPoint.Instance.Config.DisableReplacement)
+ return null;
+
+ Player? longestSpectator = null;
+ float maxActiveTime = 0f;
+
+ // Find the longest-active spectator among non-ignored players
+ foreach (var player in Player.GetPlayers().Where(p => !IgnorePlayer(p, ownerUserId)))
+ {
+ if (player.Role == RoleTypeId.Spectator && player.RoleBase is SpectatorRole spectatorRole)
+ {
+ // Update the longest spectator if the current one has a longer active time
+ if (spectatorRole.ActiveTime > maxActiveTime)
+ {
+ maxActiveTime = spectatorRole.ActiveTime;
+ longestSpectator = player;
+ }
+ }
+ }
+
+ return longestSpectator;
+ }
+ catch (Exception e)
+ {
+ // Log and handle any exceptions that occur during the process
+ Log.Error($"Error in {nameof(GetReplacement)}: {e.Message} || Type: {e.GetType()}");
+ return null;
+ }
+ }
+
+ ///
+ /// Determines whether the specified player should be ignored in the context of AFK checks.
+ ///
+ /// The player to check.
+ ///
+ ///
+ /// true if the player should be ignored; otherwise, false.
+ ///
+ private static bool IgnorePlayer(Player player, string ownerUserId)
+ {
+ // Check various conditions to determine if the player should be ignored
+ return !player.IsReady || // Player is not ready
+ EntryPoint.Instance.Config.UserIdIgnored.Contains(ownerUserId) || // Player's user ID is in the ignored list
+ player.TemporaryData.StoredData.ContainsKey("uafk_disable") || // Player has AFK checking disabled
+ player.UserId == ownerUserId || // Player is the same as the owner
+ player.IsAlive || // Player is alive
+ player.CheckPermission("uafk.ignore") || // Player has the uafk.ignore permission
+ player.IsServer || // Player is a server
+ player.UserId.Contains("@server") || // Player's user ID contains "@server"
+ player.UserId.Contains("@npc") || // Player's user ID contains "@npc"
+ MainHandler.ReplacingPlayersData.TryGetValue(player.UserId, out _); // Player is being replaced
+ }
+
+ private static void SaveData(Player owner, string replacementUserId, bool isScp079 = false)
+ {
+ AfkData data;
+
+ if (isScp079)
+ {
+ if (owner.RoleBase is Scp079Role scp079Role && scp079Role.SubroutineModule.TryGetSubroutine(out Scp079TierManager tierManager)
+ && scp079Role.SubroutineModule.TryGetSubroutine(out Scp079AuxManager energyManager))
+ {
+ data = new AfkData(owner.Nickname, owner.Position, owner.Role, null, new(), owner.Health, new(tierManager.TotalExp, energyManager.CurrentAux));
+ }
+ else
+ {
+ // SCP-079 data cannot be obtained
+ data = new AfkData(owner.Nickname, owner.Position, owner.Role, null, new(), owner.Health, null);
+ }
+ }
+ else
+ {
+ data = new AfkData(owner.Nickname, owner.Position, owner.Role, owner.GetAmmo(), owner.GetItemTypes(), owner.Health, null);
+ }
+
+ MainHandler.ReplacingPlayersData.Add(replacementUserId, data);
+ }
+ }
+}
diff --git a/UltimateAFK/API/Structs/AfkData.cs b/UltimateAFK/API/Structs/AfkData.cs
new file mode 100644
index 0000000..a298b21
--- /dev/null
+++ b/UltimateAFK/API/Structs/AfkData.cs
@@ -0,0 +1,71 @@
+using PlayerRoles;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace UltimateAFK.API.Structs
+{
+ ///
+ /// Represents data related to an AFK (Away From Keyboard) player.
+ ///
+ public readonly struct AfkData
+ {
+ ///
+ /// Initializes a new instance of the .
+ ///
+ /// The nickname of the AFK player.
+ /// The position of the AFK player in the game.
+ /// The role type of the AFK player.
+ /// A dictionary representing the ammunition of the AFK player (nullable).
+ /// A list of item types associated with the AFK player.
+ /// The health points of the AFK player.
+ /// SCP-079 role data of the AFK player (nullable).
+ public AfkData(string nickname, Vector3 position, RoleTypeId roleType, Dictionary? ammo, List items, float hp, Scp079RoleData? data)
+ {
+ this.Nickname = nickname;
+ this.Position = position;
+ this.RoleType = roleType;
+ this.Ammo = ammo;
+ this.Items = items;
+ this.Health = hp;
+ this.Scp079Data = data;
+ }
+
+ ///
+ /// Gets the nickname of the AFK player.
+ ///
+ public string Nickname { get; }
+
+ ///
+ /// Gets the position of the AFK player in the game.
+ ///
+ public Vector3 Position { get; }
+
+ ///
+ /// Gets the role type of the AFK player.
+ ///
+ public RoleTypeId RoleType { get; }
+
+ ///
+ /// Gets the ammunition dictionary of the AFK player (nullable).
+ ///
+ public Dictionary? Ammo { get; }
+
+ ///
+ /// Gets the list of item types associated with the AFK player.
+ ///
+ public List Items { get; }
+
+ ///
+ /// Gets the health points of the AFK player.
+ ///
+ public float Health { get; }
+
+ ///
+ /// Gets the SCP-079 role data of the AFK player (nullable).
+ ///
+ public Scp079RoleData? Scp079Data { get; }
+
+ public override string ToString() => $"{Nickname} | {RoleType} | {Position} | {Health} | {Items.Count} | {Scp079Data is null} | {Ammo is null} |";
+ }
+
+}
diff --git a/UltimateAFK/API/Structs/Scp079RoleData.cs b/UltimateAFK/API/Structs/Scp079RoleData.cs
new file mode 100644
index 0000000..9f59ca1
--- /dev/null
+++ b/UltimateAFK/API/Structs/Scp079RoleData.cs
@@ -0,0 +1,30 @@
+namespace UltimateAFK.API.Structs
+{
+ ///
+ /// Represents data related to the role of SCP-079.
+ ///
+ public readonly struct Scp079RoleData
+ {
+ ///
+ /// Initializes a new instance of the .
+ ///
+ /// The experience of SCP-079.
+ /// The energy level of SCP-079.
+ public Scp079RoleData(int experience, float energy)
+ {
+ this.Experience = experience;
+ this.Energy = energy;
+ }
+
+ ///
+ /// Gets the experience SCP-079.
+ ///
+ public int Experience { get; }
+
+ ///
+ /// Gets the energy SCP-079.
+ ///
+ public float Energy { get; }
+ }
+
+}
diff --git a/UltimateAFK/Command/AfkCommand.cs b/UltimateAFK/Command/AfkCommand.cs
new file mode 100644
index 0000000..449593b
--- /dev/null
+++ b/UltimateAFK/Command/AfkCommand.cs
@@ -0,0 +1,192 @@
+using CommandSystem;
+using CustomPlayerEffects;
+using MapGeneration;
+using MEC;
+using PlayerRoles;
+using PluginAPI.Core;
+using System;
+using System.Collections.Generic;
+using UltimateAFK.API;
+using UnityEngine;
+
+namespace UltimateAFK.Command
+{
+ [CommandHandler(typeof(ClientCommandHandler))]
+ internal sealed class AfkCommand : ICommand
+ {
+ public bool SanitizeResponse => false;
+ public string Command { get; } = "afk";
+ public string[] Aliases { get; } = Array.Empty();
+ public string Description { get; } = "By using this command you will be moved to spectator and if the server allows it a player will replace you.";
+
+ public Dictionary InCooldown = new();
+
+ public static Dictionary CommandUses = new();
+ public static List InProcess = new();
+ public static List AllCoroutines = new();
+
+ private Config PluginConfig => EntryPoint.Instance.Config;
+
+ public bool Execute(ArraySegment arguments, ICommandSender sender, out string response)
+ {
+ try
+ {
+ if (!PluginConfig.CommandConfig.IsEnabled)
+ {
+ response = PluginConfig.CommandConfig.Responses.OnDisable;
+ return false;
+ }
+ if (!Round.IsRoundStarted)
+ {
+ response = PluginConfig.CommandConfig.Responses.OnRoundIsNotStarted;
+ return false;
+ }
+
+ var ply = Player.Get(sender);
+ if (ply == null || !ply.IsReady)
+ {
+ response = "The player is not fully connected to the server. you cannot use this command, please try to reconnect to the server.";
+ return false;
+ }
+ if (!ply.IsAlive)
+ {
+ response = PluginConfig.CommandConfig.Responses.OnPlayerIsDead;
+ return false;
+ }
+ if (ply.Zone == FacilityZone.Other || ply.EffectsManager.TryGetEffect(out var corroding) && corroding.IsEnabled)
+ {
+ response = PluginConfig.CommandConfig.Responses.OnPocketDimension;
+ return false;
+ }
+ if (PluginConfig.CommandConfig.DisableForCertainRole && PluginConfig.CommandConfig.RoleTypeIdBlackList.Contains(ply.Role))
+ {
+ response = string.Format(PluginConfig.CommandConfig.Responses.OnBlackListedRole,
+ ply.Role);
+ return false;
+ }
+ if (PluginConfig.CommandConfig.ExclusiveForGroups &&
+ !PluginConfig.CommandConfig.UserGroupsAllowed.Contains(ply.ReferenceHub.serverRoles.Group.BadgeText))
+ {
+ response = PluginConfig.CommandConfig.Responses.OnGroupExclusive;
+ return false;
+ }
+ if (ply.EffectsManager.TryGetEffect(out var severedHands) && severedHands.IsEnabled)
+ {
+ response = PluginConfig.CommandConfig.Responses.OnSevereHands;
+ return false;
+ }
+ if (ply.EffectsManager.TryGetEffect(out var cardiacArrest) && cardiacArrest.IsEnabled)
+ {
+ response = PluginConfig.CommandConfig.Responses.OnHearthAttack;
+ return false;
+ }
+ if (ply.InElevator())
+ {
+ response = PluginConfig.CommandConfig.Responses.OnElevatorMoving;
+ return false;
+ }
+ if (ply.TemporaryData.StoredData.ContainsKey("uafk_disable"))
+ {
+ response = PluginConfig.CommandConfig.Responses.OnUafkDisable;
+ return false;
+ }
+ if (CommandUses.TryGetValue(ply.UserId, out var uses) && PluginConfig.CommandConfig.UseLimitsPerRound > 0 && uses > PluginConfig.CommandConfig.UseLimitsPerRound)
+ {
+ response = PluginConfig.CommandConfig.Responses.OnLimit;
+ return false;
+ }
+ if (InProcess.Contains(ply.UserId))
+ {
+ response = string.Format(PluginConfig.CommandConfig.Responses.OnTryToExecute, PluginConfig.CommandConfig.SecondsStill);
+ return false;
+ }
+ if (InCooldown.TryGetValue(ply.UserId, out var cooldown))
+ {
+ // In cooldown
+ if (cooldown >= Time.time)
+ {
+ var cooldownTimer = (int)(cooldown - Time.time);
+
+ response = string.Format(PluginConfig.CommandConfig.Responses.OnCooldown,
+ cooldownTimer);
+ return false;
+ }
+ else
+ {
+ // Not in cooldown
+ InCooldown.Remove(ply.UserId);
+ }
+ }
+
+ AllCoroutines.Add(Timing.RunCoroutine(AfkCountdown(ply, ply.UserId, ply.Role, ply.Position)));
+ InCooldown.Add(ply.UserId, Time.time + PluginConfig.CommandConfig.Cooldown);
+ response = string.Format(PluginConfig.CommandConfig.Responses.OnSuccess, PluginConfig.CommandConfig.SecondsStill);
+ return true;
+ }
+ catch (Exception e)
+ {
+ Log.Error($"Error on {nameof(AfkCommand)}::{nameof(Execute)}: {e} || Typeof {e.GetType()}");
+ response = $"Error on {nameof(AfkCommand)}::{nameof(Execute)}: {e.Message}";
+ return false;
+ }
+ }
+
+
+ private IEnumerator AfkCountdown(Player player, string userid, RoleTypeId roleType, Vector3 position)
+ {
+ InProcess.Add(userid);
+
+ for (int i = PluginConfig.CommandConfig.SecondsStill; i >= 0; i--)
+ {
+ yield return Timing.WaitForSeconds(1);
+
+ if (player == null || !player.IsAlive || !Round.IsRoundStarted)
+ {
+ InProcess.Remove(userid);
+ yield break;
+ }
+
+ if (position != player.Position)
+ {
+ InProcess.Remove(userid);
+ player.SendConsoleMessage(string.Format(PluginConfig.CommandConfig.Responses.OnMoving, PluginConfig.CommandConfig.SecondsStill), "red");
+ player.ReceiveHint(string.Format(PluginConfig.CommandConfig.Responses.OnMoving, PluginConfig.CommandConfig.SecondsStill), 5);
+ yield break;
+ }
+
+ string text = string.Format(PluginConfig.CommandConfig.Responses.OnWaitingForAfk, i);
+ player.ReceiveHint(text, 1);
+ player.SendConsoleMessage(text, "red");
+ }
+
+ player.Replace(roleType);
+
+ API.EventArgs.Events.OnDetectedAfkPlayer(new(player, true));
+
+ if (PluginConfig.CommandConfig.UseLimitsPerRound > 0)
+ AddUse(userid);
+
+ InProcess.Remove(userid);
+ }
+
+ private void AddUse(string userID)
+ {
+ if (CommandUses.TryGetValue(userID, out var uses))
+ {
+ CommandUses[userID] = uses + 1;
+ }
+ else
+ {
+ CommandUses.Add(userID, 1);
+ }
+ }
+
+ public static void ClearAllCachedData()
+ {
+ AllCoroutines.ForEach(c => Timing.KillCoroutines(c));
+ AllCoroutines.Clear();
+ InProcess.Clear();
+ CommandUses.Clear();
+ }
+ }
+}
\ No newline at end of file
diff --git a/UltimateAFK/Config.cs b/UltimateAFK/Config.cs
index 868f589..0cc96fb 100644
--- a/UltimateAFK/Config.cs
+++ b/UltimateAFK/Config.cs
@@ -1,32 +1,296 @@
-namespace UltimateAFK
-{
- using System.ComponentModel;
- using Exiled.API.Interfaces;
+using CustomPlayerEffects;
+using PlayerRoles;
+using System.Collections.Generic;
+using System.ComponentModel;
- public sealed class Config : IConfig
+namespace UltimateAFK
+{
+ ///
+ /// Plugin config class.
+ ///
+ public class Config
{
- [Description("Is the plugin enabled?")]
+ ///
+ /// Gets or sets if the plugin is enabled.
+ ///
+ [Description("Set if the plugin is enabled. If false the plugin will not load any events.")]
public bool IsEnabled { get; set; } = true;
- [Description("Minimum required players for uAFK to be active.")]
- public int MinPlayers { get; set; } = 2;
- [Description("Do AFK players get replaced by spectators?")]
- public bool TryReplace { get; private set; } = true;
- [Description("Should Tutorials be ignored?")]
- public bool IgnoreTut { get; private set; } = false;
- [Description("How long can player not move?")]
- public int AfkTime { get; private set; } = 30;
- [Description("How long to wait before player gets kicked after getting a warning for not moving?")]
- public int GraceTime { get; private set; } = 15;
- [Description("After how many changes to spectator for AFK should player get kicked?")]
- public int NumBeforeKick { get; private set; } = 2;
- [Description("Maximum replace time, if the round time is past this value it will not replace the player (Set to -1 to disable)")]
- public int MaxReplaceTime { get; private set; } = -1;
- [Description("Don't touch this if you do not understand the repercussions! - Ignore Perm and IP Checks.")]
- public bool IgnorePermissionsAndIP { get; private set; } = false;
- public string MsgPrefix { get; private set; } = "[uAFK]";
- public string MsgGrace { get; private set; } = "You will be moved to spectator in %timeleft% seconds if you do not move!";
- public string MsgFspec { get; private set; } = "You were detected as AFK and automatically moved to spectator!";
- public string MsgKick { get; private set; } = "[Kicked by uAFK] You were AFK for too long!";
- public string MsgReplace { get; private set; } = "You have replaced a player that was AFK.";
+
+ ///
+ /// Gets or sets if the plugin is in debug mode.
+ ///
+ [Description("set if the plugin is in debug mode. enabling this will activate log debugs in the code, this is useful to identify issues and report them in Github.")]
+ public bool DebugMode { get; set; } = false;
+
+ // copy from repository
+
+
+ ///
+ /// Gets or sets if the replacement of afk player is disabled.
+ ///
+ [Description("Setting this to true will cause players who are detected afk not to be replaced but only moved to spectator/kicked of the server.")]
+ public bool DisableReplacement { get; set; } = false;
+
+ ///
+ /// Gets or sets the deplay for replacing players.
+ ///
+ [Description("When a player is replaced it is called a delay, if when replacing the player the position is not updated correctly, increase this value but it must not exceed 2.5 since it would be too long.")]
+ public float ReplaceDelay { get; set; } = 1.3f;
+
+ ///
+ /// Gets or sets the minimun player to the works.
+ ///
+ [Description("If the number of players is less than this the plugin will not work.")]
+ public int MinPlayers { get; set; } = 8;
+
+ ///
+ /// Gets or sets if you should ignore the players in tutorial.
+ ///
+ [Description("Tutorials should be ignored ?")]
+ public bool IgnoreTut { get; set; } = true;
+
+ ///
+ /// Gets or sets the list of RoleTypes that should be ignored for the afk check.
+ ///
+ [Description("RoleTypes on this list will not be replaced by other players")]
+ public List RoleTypeBlacklist { get; set; } = new() { RoleTypeId.Scp0492 };
+
+ ///
+ /// Gets or sets how long a player can be afk for.
+ ///
+ [Description("How long a player can remain motionless before being detected as AFK")]
+ public int AfkTime { get; set; } = 80;
+
+ ///
+ /// Gets or sets the length of time the player will be on grace period
+ ///
+ [Description("After being detected as AFK a message will appear on his face and he will be given this time to move or he will be Kicked/Moved to spectator.")]
+ public int GraceTime { get; set; } = 30;
+
+ ///
+ /// The number of times a player has to be afk before being kicked from the server.
+ ///
+ [Description("The number of times a player must be moved to spectator for a player to be kicked from the server. Use -1 to disable it")]
+ public int AfkCount { get; set; } = -1;
+
+ ///
+ /// Gets or sets the grace time broadcast message.
+ ///
+ [Description("When the player is detected as AFK and is in grace period this message will appear on his face. {0} represents the seconds the player has to move or be moved to spectator.")]
+ public string MsgGrace { get; set; } = "[Ultimate-AFK] You will be moved to spectator if you do not move in less than {0} seconds.";
+
+ ///
+ /// Gets or sets the broadcast when a player is moved to espectator.
+ ///
+ [Description("This message will be sent to the player who has been moved to spectator when he is detected as AFK, it is also sent to the player's console.")]
+ public string MsgFspec { get; set; } = "You were detected as AFK and were moved to spectator";
+
+ ///
+ /// Gets or sets the replace message sended to the player console.
+ ///
+ [Description("When a player is replaced by another player, this message will be sent to his console.")]
+ public string MsgReplaced { get; set; } = "\nyou were replaced by {0}";
+
+ ///
+ /// Gets or sets the message that will be sent to the player when is kicked from the server.
+ ///
+ [Description("This will be the reason for the Kick, due to the VSR it is obligatory to clarify that it is a plugin with flags like [UltimateAFK] or something similar.")]
+ public string MsgKick { get; set; } = "[Ultimate-AFK] You were removed from the server for being AFK for too long.!";
+
+ ///
+ /// Gets or sets the broadcast message to be sent to the replacement player
+ ///
+ [Description("When a player replaces another player, this message will appear on the player's face and on the player console. | {0} it is the name of the player who was afk")]
+ public string MsgReplace { get; set; } = " You replaced {0} who was afk.";
+
+ ///
+ /// Gets or sets the user ids ignored by afk check.
+ ///
+ [Description("Similar to give the permission of \"uafk.ignore\". This is more focused on Exiled users.")]
+ public List UserIdIgnored { get; set; } = new()
+ {
+ "11111111111@steam"
+ };
+
+ ///
+ /// Gets or sets all configuracion related with the commands.
+ ///
+ [Description("All configuration related with the command")]
+ public CommandConfig CommandConfig { get; set; } = new();
+ }
+
+ ///
+ /// All settings related to the command
+ ///
+ public class CommandConfig
+ {
+ ///
+ /// Gets or sets if the command is enabled.
+ ///
+ [Description("Is the command enabled on this server ?")]
+ public bool IsEnabled { get; set; } = false;
+
+ ///
+ /// Gets or sets the amount of time a player must stand still to be replaced/sent to a spectator
+ ///
+ [Description("When a player uses the command, he must stand still for this amount of seconds to be moved to spectator.")]
+ public int SecondsStill { get; set; } = 10;
+
+ ///
+ /// Gets or sets the limit of times a player can use this command per round
+ ///
+ [Description("The number of times a player can be this command per round")]
+ public int UseLimitsPerRound { get; set; } = 3;
+
+ ///
+ ///
+ ///
+ [Description("If this is true and afk_count is greater than 1 and the player reaches the maximum afk_count he will be kicked from the server.")]
+ public bool CountForKick { get; set; } = false;
+
+ ///
+ /// Gets or sets the cooldown that the player will have when using the command
+ ///
+ [Description("The coldown of the command when using it")]
+ public float Cooldown { get; set; } = 40f;
+
+ ///
+ /// Gets or sets if the command is exclusive to certain groups.
+ ///
+ [Description("The command can only be used by players who have a group that is on the list ?")]
+ public bool ExclusiveForGroups { get; set; } = false;
+
+ ///
+ /// Gets or sets the list of groups that can use the command
+ ///
+ [Description("List of groups.")]
+ public List UserGroupsAllowed { get; set; } = new()
+ {
+ "someGroup",
+ };
+
+ ///
+ /// Gets or sets if the command is disabled for certain
+ ///
+ [Description("The command is disabled for certain RoleTypes?")]
+ public bool DisableForCertainRole { get; set; } = false;
+
+ ///
+ /// Gets or sets the list of that cannot use the command
+ ///
+ [Description("List of RoleTypes that cannot use the command")]
+ public List RoleTypeIdBlackList { get; set; } = new()
+ {
+ RoleTypeId.None,
+ RoleTypeId.Scp0492
+ };
+
+ ///
+ /// Gets or sets command responses.
+ ///
+ [Description("all the responses given by the command")]
+ public Responses Responses { get; set; } = new();
+ }
+
+ ///
+ /// All respones for the command.
+ ///
+ public class Responses
+ {
+ ///
+ /// Gets or sets the response of the command when it is deactivated.
+ ///
+ [Description("Response given to the player when trying to use the command when it is disabled.")]
+ public string OnDisable { get; set; } = "This command is disabled";
+
+ ///
+ /// Gets or sets the response of the command when successfully executed
+ ///
+ [Description("Response given to the player when successfully executing the command.")]
+ public string OnSuccess { get; set; } = "You will be moved to spectator in {0} seconds, stand still.";
+
+ ///
+ /// Gets or sets the response of the command when the player has no hands
+ ///
+ [Description("Response given to the player when he has no hands")]
+ public string OnSevereHands { get; set; } = "You cannot use this command if you have no hands";
+
+ ///
+ /// Gets or sets the response of the command when the player has the effect of
+ ///
+ [Description("Response given to the player when affected by Cardiac Arrest (Effect of SCP-049)")]
+ public string OnHearthAttack { get; set; } = "You cannot use this command if you have a heart attack.";
+
+ ///
+ /// Gets or sets the response of the command when the player is in the pocket dimension
+ ///
+ [Description("Response given to the player when trying to use the command when in the pocket dimension.")]
+ public string OnPocketDimension { get; set; } = "There is no easy escape from the pocket dimension.";
+
+ ///
+ /// Gets or sets the response of the command when the player is in cooldown
+ ///
+ [Description("Response given to the player when he still has cooldown to use the command. {0} is the number of seconds the player has to wait.")]
+ public string OnCooldown { get; set; } = "You cannot use the command yet, you have to wait {0} seconds.";
+
+ ///
+ /// Gets or sets the response of the command when the player has a roletype that cannot use the command
+ ///
+ [Description("Response given when a player tries to use the command with a role in the blacklist")]
+ public string OnBlackListedRole { get; set; } = "You cannot use this command when you are {0}";
+
+ ///
+ /// Gets or sets the response of the command when the player does not have the group required to use the command
+ ///
+ [Description("Response given to the player when not in the group list")]
+ public string OnGroupExclusive { get; set; } = "Your current group is not in the list of allowed groups.";
+
+ ///
+ /// Gets or sets the command response when the round is not started
+ ///
+ [Description("Response given to the player when he tries to use the command when the round has not started.")]
+ public string OnRoundIsNotStarted { get; set; } = "The round has not started yet, you cannot use the command.";
+
+ ///
+ /// Gets or sets the response of the command when the player is dead
+ ///
+ [Description("Response given to the player when trying to use the command while is dead.")]
+ public string OnPlayerIsDead { get; set; } = "You cannot use the command if you are dead.";
+
+ ///
+ /// Gets or sets the response of the command when the player has the command disabled due to "afk disable".
+ ///
+ [Description("If a player has the value \"afk disable\" (bool) set to true in his Temporary Storage, trying to use the command will give him this message")]
+ public string OnUafkDisable { get; set; } = "You can't use this command because you have a subclass or some plugin temporarily removed your access to the command";
+
+ ///
+ /// Gets or sets the command response when the player is in a moving elevator
+ ///
+ [Description("If a player is inside an elevator he will not be able to use the command because his replacement will fall into the void if the elevator is moving.")]
+ public string OnElevatorMoving { get; set; } = " You cannot use this command while in a moving elevator.";
+
+ ///
+ /// Gets or sets the command response when the player is being processed to go afk
+ ///
+ [Description("When a player uses the command he will have to wait X seconds to be spectator.")]
+ public string OnWaitingForAfk { get; set; } = "You will be moved to spectator in {0} seconds.";
+
+ ///
+ /// Gets or sets the response of the command when the player moved when processed to go afk
+ ///
+ [Description("If a player moves within the time limit this message will be sent to the player's console.")]
+ public string OnMoving { get; set; } = "You moved, you have to be still for {0} seconds to be moved to spectator.";
+
+ ///
+ /// Gets or sets the response of the command when the player reached the maximum number of times the command can be used per round
+ ///
+ [Description("If a player tries to execute the command when he has already reached his limit per round this message will be sent to the console.")]
+ public string OnLimit { get; set; } = "You have reached the limit of uses of the command per round.";
+
+ ///
+ /// Gets or sets the response of the command when the player tries to use the command 2 or more times in a row
+ ///
+ [Description("If a player tries to execute the command while it is being processed to move to spectator he will get this message")]
+ public string OnTryToExecute { get; set; } = "You are already being processed to move to spectator, you have to stand still for {0} seconds.";
}
}
diff --git a/UltimateAFK/EntryPoint.cs b/UltimateAFK/EntryPoint.cs
new file mode 100644
index 0000000..610d633
--- /dev/null
+++ b/UltimateAFK/EntryPoint.cs
@@ -0,0 +1,57 @@
+using GameCore;
+using PluginAPI.Core;
+using PluginAPI.Core.Attributes;
+
+namespace UltimateAFK
+{
+ ///
+ /// Plugin main class
+ ///
+ public class EntryPoint
+ {
+ ///
+ /// Gets the singleton instance of the plugin.
+ ///
+ public static EntryPoint Instance { get; private set; } = null!;
+
+ ///
+ /// Plugin config
+ ///
+ [PluginConfig]
+ public Config Config = null!;
+
+ ///
+ /// Gets the plugin version.
+ ///
+ public const string Version = "7.0.6";
+
+ ///
+ /// Called when loading the plugin
+ ///
+ [PluginPriority(PluginAPI.Enums.LoadPriority.High)]
+ [PluginEntryPoint("UltimateAFK", Version, "Plugin that checks if a player is afk for too long and if detected as afk will be replaced by a spectator.", "SrLicht")]
+ private void OnLoad()
+ {
+ Instance = this;
+
+ if (!Config.IsEnabled)
+ {
+ PluginAPI.Core.Log.Warning($"UltimateAfk was disabled through configuration.");
+ return;
+ }
+
+ PluginAPI.Events.EventManager.RegisterEvents(Instance, new MainHandler());
+
+ PluginAPI.Core.Log.Info($"UltimateAfk {Version} fully loaded.");
+ }
+
+ ///
+ /// Called when unloading the plugin
+ ///
+ [PluginUnload]
+ private void OnUnload()
+ {
+ PluginAPI.Events.EventManager.UnregisterEvents(Instance);
+ }
+ }
+}
diff --git a/UltimateAFK/MainClass.cs b/UltimateAFK/MainClass.cs
deleted file mode 100644
index 84cb339..0000000
--- a/UltimateAFK/MainClass.cs
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
-* +==================================================================================+
-* | _ ___ ____ _ _ |
-* | | |/ (_) _ __ __ _ ___ | _ \| | __ _ _ _ __ _ _ __ ___ _ _ _ __ __| | |
-* | | ' /| | '_ \ / _` / __| | |_) | |/ _` | | | |/ _` | '__/ _ \| | | | '_ \ / _` | |
-* | | . \| | | | | (_| \__ \ | __/| | (_| | |_| | (_| | | | (_) | |_| | | | | (_| | |
-* | |_|\_\_|_| |_|\__, |___/ |_| |_|\__,_|\__, |\__, |_| \___/ \__,_|_| |_|\__,_| |
-* | |___/ |___/ |___/ |
-* | |
-* +==================================================================================+
-* | SCP:SL Ultimate AFK Checker |
-* | by Thomasjosif |
-* | |
-* | Special thanks to iopietro for his awesome suggestions :) |
-* | https://kingsplayground.fun |
-* +==================================================================================+
-* | MIT License |
-* | |
-* | Copyright (C) 2020 Thomas Dick |
-* | Copyright (C) 2020 King's Playground |
-* | |
-* | Permission is hereby granted, free of charge, to any person obtaining a copy |
-* | of this software and associated documentation files (the "Software"), to deal |
-* | in the Software without restriction, including without limitation the rights |
-* | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
-* | copies of the Software, and to permit persons to whom the Software is |
-* | furnished to do so, subject to the following conditions: |
-* | |
-* | The above copyright notice and this permission notice shall be included in all |
-* | copies or substantial portions of the Software. |
-* | |
-* | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
-* | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
-* | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
-* | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
-* | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
-* | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
-* | SOFTWARE. |
-* +==================================================================================+
-*/
-
-using System;
-using Handlers = Exiled.Events.Handlers;
-using Exiled.API.Enums;
-using Exiled.API.Features;
-
-namespace UltimateAFK
-{
- public class MainClass : Plugin
- {
- public override string Author { get; } = "Thomasjosif";
- public override string Name { get; } = "Ultimate AFK";
- public override string Prefix { get; } = "uAFK";
- public override Version Version { get; } = new Version(3, 1, 6);
- public override Version RequiredExiledVersion { get; } = new Version(2, 2, 4);
- public PlayerEvents PlayerEvents;
-
- public override PluginPriority Priority { get; } = PluginPriority.Medium;
-
- public override void OnEnabled()
- {
- base.OnEnabled();
- try
- {
- PlayerEvents = new PlayerEvents(this);
-
- Handlers.Player.Verified += PlayerEvents.OnPlayerVerified;
- Handlers.Player.ChangingRole += PlayerEvents.OnSetClass;
- Handlers.Player.Shooting += PlayerEvents.OnPlayerShoot;
- Handlers.Player.InteractingDoor += PlayerEvents.OnDoorInteract;
- Handlers.Scp914.Activating += PlayerEvents.On914Activate;
- Handlers.Scp914.ChangingKnobSetting += PlayerEvents.On914Change;
- Handlers.Player.InteractingLocker += PlayerEvents.OnLockerInteract;
- Handlers.Player.ItemDropped += PlayerEvents.OnDropItem;
- Handlers.Scp079.GainingExperience += PlayerEvents.OnSCP079Exp;
-
- Log.Info($"UltimateAFK plugin loaded.\n Written by Thomasjosif for King's Playground");
- }
- catch (Exception e)
- {
- Log.Error($"There was an error loading the plugin: {e}");
- }
-
- }
- public override void OnDisabled()
- {
- base.OnDisabled();
- Handlers.Player.Verified -= PlayerEvents.OnPlayerVerified;
- Handlers.Player.ChangingRole -= PlayerEvents.OnSetClass;
- Handlers.Player.Shooting -= PlayerEvents.OnPlayerShoot;
- Handlers.Player.InteractingDoor -= PlayerEvents.OnDoorInteract;
- Handlers.Scp914.Activating -= PlayerEvents.On914Activate;
- Handlers.Scp914.ChangingKnobSetting -= PlayerEvents.On914Change;
- Handlers.Player.InteractingLocker -= PlayerEvents.OnLockerInteract;
- Handlers.Player.ItemDropped -= PlayerEvents.OnDropItem;
- Handlers.Scp079.GainingExperience -= PlayerEvents.OnSCP079Exp;
-
- PlayerEvents = null;
- }
- }
-}
\ No newline at end of file
diff --git a/UltimateAFK/MainHandler.cs b/UltimateAFK/MainHandler.cs
new file mode 100644
index 0000000..ce87398
--- /dev/null
+++ b/UltimateAFK/MainHandler.cs
@@ -0,0 +1,169 @@
+using MEC;
+using PlayerRoles;
+using PlayerRoles.PlayableScps.Scp079;
+using PluginAPI.Core;
+using PluginAPI.Core.Attributes;
+using PluginAPI.Events;
+using System.Collections.Generic;
+using System.Linq;
+using UltimateAFK.API;
+using UltimateAFK.API.Components;
+using UltimateAFK.API.Structs;
+using UltimateAFK.Command;
+
+namespace UltimateAFK
+{
+ ///
+ /// Main handler where players are given the AFK component and replacement players are stored.
+ ///
+ public class MainHandler
+ {
+ private Config PluginConfig => EntryPoint.Instance.Config;
+
+ ///
+ /// A dictionary where replacement players are stored to give them the stats and items of the original player.
+ ///
+ public static Dictionary ReplacingPlayersData = new();
+
+ ///
+ /// When a player join the server i give him the
+ ///
+ ///
+ [PluginEvent]
+ private void OnPlayerJoined(PlayerJoinedEvent ev)
+ {
+ if (!PluginConfig.IsEnabled || ev.Player is null || ev.Player.UserId.Contains("@server") || ev.Player.ReferenceHub.authManager.InstanceMode != CentralAuth.ClientInstanceMode.ReadyClient)
+ return;
+
+ ev.Player.GameObject.AddComponent();
+ }
+
+ ///
+ /// On map generation clear al cached data and update cached elevators.
+ ///
+ ///
+ [PluginEvent]
+ private void OnMapGenerated(MapGeneratedEvent _)
+ {
+ API.EventArgs.Events.DetectedAfkPlayer += OnDetectAfk;
+ ReplacingPlayersData.Clear();
+ AfkCommand.ClearAllCachedData();
+ Extensions.AllElevators = Map.Elevators.ToList();
+ }
+
+ ///
+ /// Im lazy...
+ ///
+ ///
+ [PluginEvent]
+ private void OnRoundEnd(RoundEndEvent _)
+ {
+ API.EventArgs.Events.DetectedAfkPlayer -= OnDetectAfk;
+ }
+
+ private void OnDetectAfk(API.EventArgs.DetectedAfkPlayerEventArgs ev)
+ {
+ if (ev.IsForCommand)
+ {
+ Log.Info($"{ev.Player.LogName} use the command to be moved to spectator");
+ }
+ }
+
+ ///
+ /// I make sure that no player is in the dictionary in case it has not been cleaned correctly, this event is also executed when a player disconnects.
+ ///
+ [PluginEvent]
+ private void OnPlayerDeath(PlayerDeathEvent ev)
+ {
+ if (!ev.Player.IsReady)
+ return;
+
+ if (ReplacingPlayersData.TryGetValue(ev.Player.UserId, out _))
+ {
+ ReplacingPlayersData.Remove(ev.Player.UserId);
+ }
+ }
+
+ ///
+ /// Here i detec if the player who is changing role is any replacement player.
+ ///
+ ///
+ [PluginEvent]
+ private void OnChangeRole(PlayerChangeRoleEvent ev)
+ {
+ if (ev.Player is null || !ev.Player.IsReady || ev.NewRole == PlayerRoles.RoleTypeId.Spectator || !ReplacingPlayersData.TryGetValue(ev.Player.UserId, out var data))
+ return;
+
+ Log.Debug($"Detecting player {ev.Player.LogName} who replaced a player {data.Nickname} who was afk", PluginConfig.DebugMode);
+
+ Timing.CallDelayed(PluginConfig.ReplaceDelay, () => GiveData(ev.Player, data, ev.NewRole));
+ }
+
+ private void GiveData(Player player, AfkData data, RoleTypeId roleType)
+ {
+ try
+ {
+ Log.Debug($"Replacing player is {player.Nickname} ({player.UserId}) new role is {roleType}", PluginConfig.DebugMode);
+
+ if (roleType == RoleTypeId.Scp079)
+ {
+ Log.Debug("The new role is a SCP-079, transferring energy and experience.", PluginConfig.DebugMode);
+
+ if (player.RoleBase is Scp079Role scp079Role && scp079Role.SubroutineModule.TryGetSubroutine(out Scp079TierManager tierManager)
+ && scp079Role.SubroutineModule.TryGetSubroutine(out Scp079AuxManager energyManager))
+ {
+ player.SendBroadcast(string.Format(PluginConfig.MsgReplace, data.Nickname), 16, shouldClearPrevious: true);
+ player.SendConsoleMessage(string.Format(PluginConfig.MsgReplace, data.Nickname), "white");
+
+ if (data.Scp079Data.HasValue)
+ {
+ tierManager.TotalExp = data.Scp079Data.Value.Experience;
+ energyManager.CurrentAux = data.Scp079Data.Value.Energy;
+ Log.Debug($"Energy and experience transferred to the player", PluginConfig.DebugMode);
+ }
+
+ Log.Debug($"Removing player from diccionary.", PluginConfig.DebugMode);
+ ReplacingPlayersData.Remove(player.UserId);
+ }
+ else
+ {
+ Log.Error($"Error transferring experience and level to the replacement player, Player.RoleBase is not Scp079 or there was an error obtaining the subroutines.");
+ }
+ }
+ else
+ {
+ // Clear default role inventory.
+ player.ClearInventory();
+
+ // I add the ammunition first since it is the slowest thing to be done.
+ if (data.Ammo != null)
+ player.SendAmmo(data.Ammo);
+
+ // This call delayed is necessary.
+ Timing.CallDelayed(0.3f, () =>
+ {
+ // Teleport the player to the afk position, please don't fall off the map.
+ player.Position = data.Position;
+ // Set player health to afk health.
+ player.Health = data.Health;
+ // Give afk items
+ player.SendItems(data.Items);
+ // I apply the modifications of the replacement player not of the afk, I could do it but I sincerely prefer this method.
+ player.ApplyAttachments();
+ // I refill the ammunition of the weapons, since it is annoying to appear without a loaded weapon.
+ player.ReloadAllWeapons();
+ // Send the broadcast to the player
+ player.SendBroadcast(string.Format(PluginConfig.MsgReplace, data.Nickname), 16, shouldClearPrevious: true);
+ player.SendConsoleMessage(string.Format(PluginConfig.MsgReplace, data.Nickname), "white");
+
+ ReplacingPlayersData.Remove(player.UserId);
+ });
+ }
+ }
+ catch (System.Exception e)
+ {
+ Log.Error($"{nameof(GiveData)}: {e}");
+ }
+ }
+ }
+}
diff --git a/UltimateAFK/PlayerEvents.cs b/UltimateAFK/PlayerEvents.cs
deleted file mode 100644
index 1f55f64..0000000
--- a/UltimateAFK/PlayerEvents.cs
+++ /dev/null
@@ -1,172 +0,0 @@
-using System;
-using System.Reflection;
-using Exiled.API.Features;
-using Exiled.Events.EventArgs;
-using Exiled.Permissions.Extensions;
-using Exiled.Loader;
-using System.Linq;
-
-namespace UltimateAFK
-{
- public class PlayerEvents
- {
- public MainClass plugin;
-
- public PlayerEvents(MainClass plugin)
- {
- this.plugin = plugin;
- }
-
- public void OnPlayerVerified(VerifiedEventArgs ev)
- {
- // Add a component to the player to check AFK status.
- AFKComponent afkComponent = ev.Player.GameObject.gameObject.AddComponent();
- afkComponent.plugin = plugin;
- }
-
- // This check was moved here, because player's rank's are set AFTER OnPlayerJoin()
- public void OnSetClass(ChangingRoleEventArgs ev)
- {
- try
- {
- if (ev.Player == null) return;
- AFKComponent afkComponent = ev.Player.GameObject.gameObject.GetComponent();
-
- if (afkComponent != null)
- {
- if (!plugin.Config.IgnorePermissionsAndIP)
- if (ev.Player.CheckPermission("uafk.ignore") || ev.Player.IPAddress == "127.0.0.1") //127.0.0.1 is sometimes used for "Pets" which causes issues
- afkComponent.disabled = true;
- if (IsGhost(ev.Player))
- afkComponent.disabled = true;
- }
-
-
- }
- catch (Exception e)
- {
- Log.Error($"ERROR In OnSetClass(): {e}");
- }
- }
-
- /*
- * The following events are only here as additional AFK checks for some very basic player interactions
- * I can add more interactions, but this seems good for now.
- */
- public void OnDoorInteract(InteractingDoorEventArgs ev)
- {
- try
- {
- ResetAFKTime(ev.Player);
- }
- catch (Exception e)
- {
- Log.Error($"ERROR In OnDoorInteract(): {e}");
- }
- }
-
- public void OnPlayerShoot(ShootingEventArgs ev)
- {
- try
- {
- ResetAFKTime(ev.Shooter);
- }
- catch (Exception e)
- {
- Log.Error($"ERROR In ResetAFKTime(): {e}");
- }
- }
- public void On914Activate(ActivatingEventArgs ev)
- {
- try
- {
- ResetAFKTime(ev.Player);
- }
- catch (Exception e)
- {
- Log.Error($"ERROR In On914Activate(): {e}");
- }
- }
- public void On914Change(ChangingKnobSettingEventArgs ev)
- {
- try
- {
- ResetAFKTime(ev.Player);
- }
- catch (Exception e)
- {
- Log.Error($"ERROR In OnLockerInteract(): {e}");
- }
- }
-
- public void OnLockerInteract(InteractingLockerEventArgs ev)
- {
- try
- {
- ResetAFKTime(ev.Player);
- }
- catch (Exception e)
- {
- Log.Error($"ERROR In OnLockerInteract(): {e}");
- }
- }
- public void OnDropItem(ItemDroppedEventArgs ev)
- {
- try
- {
- ResetAFKTime(ev.Player);
- }
- catch (Exception e)
- {
- Log.Error($"ERROR In OnDropItem(): {e}");
- }
- }
-
- public void OnSCP079Exp(GainingExperienceEventArgs ev)
- {
- try
- {
- ResetAFKTime(ev.Player);
- }
- catch (Exception e)
- {
- Log.Error($"ERROR In OnSCP079Exp(): {e}");
- }
- }
-
- ///
- /// Reset the AFK time of a player.
- /// Thanks iopietro!
- ///
- ///
- public void ResetAFKTime(Player player)
- {
- try
- {
- if (player == null) return;
-
- AFKComponent afkComponent = player.GameObject.gameObject.GetComponent();
-
- if (afkComponent != null)
- afkComponent.AFKTime = 0;
-
- }
- catch (Exception e)
- {
- Log.Error($"ERROR In ResetAFKTime(): {e}");
- }
- }
-
- ///
- /// Checks if a player is a "ghost" using GhostSpectator's API.
- ///
- ///
- ///
- public static bool IsGhost(Player player)
- {
- Assembly assembly = Loader.Plugins.FirstOrDefault(pl => pl.Name == "GhostSpectator")?.Assembly;
- if (assembly == null) return false;
- return ((bool)assembly.GetType("GhostSpectator.API")?.GetMethod("IsGhost")?.Invoke(null, new object[] { player })) == true;
- }
- }
-}
diff --git a/UltimateAFK/Properties/AssemblyInfo.cs b/UltimateAFK/Properties/AssemblyInfo.cs
deleted file mode 100644
index bb455c1..0000000
--- a/UltimateAFK/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-using System.Reflection;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("UltimateAFK")]
-[assembly: AssemblyDescription("Ultimate AFK Checker")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("KingsPlayground")]
-[assembly: AssemblyProduct("UltimateAFK")]
-[assembly: AssemblyCopyright("Copyright © 2020 Thomas Dick")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components. If you need to access a type in this assembly from
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("9280B8BA-6290-4FC8-A58F-BC24E43AA486")]
-
-// Version information for an assembly consists of the following four values:
-//
-// Major Version
-// Minor Version
-// Build Number
-// Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("3.1.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
\ No newline at end of file
diff --git a/UltimateAFK/UltimateAFK.csproj b/UltimateAFK/UltimateAFK.csproj
index d615735..7e722dc 100644
--- a/UltimateAFK/UltimateAFK.csproj
+++ b/UltimateAFK/UltimateAFK.csproj
@@ -1,116 +1,41 @@
-
-
-
- Debug
- AnyCPU
- {9280B8BA-6290-4FC8-A58F-BC24E43AA486}
+
+
+
Library
- Properties
- UltimateAFK
UltimateAFK
- v4.7.2
- 512
+ true
+ Enable
-
- AnyCPU
- true
- full
- false
- bin\Debug\
- DEBUG;TRACE
- prompt
- 4
-
-
- x64
- pdbonly
- true
- bin\Release\
- TRACE
- prompt
- 4
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
- False
- ..\..\..\EXILED_REFERENCES\0Harmony.dll
-
-
- False
- ..\..\..\EXILED_REFERENCES\Assembly-CSharp-firstpass.dll
-
-
- ..\..\..\EXILED_REFERENCES\Assembly-CSharp-Publicized.dll
-
-
- False
- ..\..\..\EXILED_REFERENCES\CommandSystem.Core.dll
-
-
- ..\packages\EXILED.2.2.4\lib\net472\Exiled.API.dll
-
-
- ..\packages\EXILED.2.2.4\lib\net472\Exiled.Bootstrap.dll
-
-
- ..\packages\EXILED.2.2.4\lib\net472\Exiled.Events.dll
-
-
- ..\packages\EXILED.2.2.4\lib\net472\Exiled.Loader.dll
-
-
- ..\packages\EXILED.2.2.4\lib\net472\Exiled.Permissions.dll
-
-
- ..\packages\EXILED.2.2.4\lib\net472\Exiled.Updater.dll
-
-
- False
- ..\..\..\EXILED_REFERENCES\Mirror.dll
-
-
- False
- ..\..\..\EXILED_REFERENCES\scp035.dll
-
-
-
- False
- ..\..\..\EXILED_REFERENCES\UnityEngine.dll
-
-
- False
- ..\..\..\EXILED_REFERENCES\UnityEngine.CoreModule.dll
-
-
- False
- ..\..\..\EXILED\bin\Debug\YamlDotNet.dll
-
-
- False
- ..\..\..\EXILED_REFERENCES\zxing.unity.dll
-
+
+
+
+
+
+
+
+
+
+
+
-
-
\ No newline at end of file
diff --git a/UltimateAFK/app.config b/UltimateAFK/app.config
deleted file mode 100644
index 97df915..0000000
--- a/UltimateAFK/app.config
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/UltimateAFK/bin/Release/Exiled.Bootstrap.xml b/UltimateAFK/bin/Release/Exiled.Bootstrap.xml
deleted file mode 100644
index 5df0458..0000000
--- a/UltimateAFK/bin/Release/Exiled.Bootstrap.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
- Exiled.Bootstrap
-
-
-
-
- The assembly loader class for Exiled.
-
-
-
-
- Gets a value indicating whether exiled has already been loaded or not.
-
-
-
-
- Internally called loading method.
-
-
-
-
diff --git a/UltimateAFK/bin/Release/Exiled.Permissions.xml b/UltimateAFK/bin/Release/Exiled.Permissions.xml
deleted file mode 100644
index b9bde10..0000000
--- a/UltimateAFK/bin/Release/Exiled.Permissions.xml
+++ /dev/null
@@ -1,283 +0,0 @@
-
-
-
- Exiled.Permissions
-
-
-
-
- Adds a permission to a group.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Adds a group to permissions.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Handles commands about permissions groups.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Removes a group to permissions.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Handles commands about permissions.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Reloads all permissions.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Removes a permission from a group.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
- Gets a value indicating whether the debug should be shown or not.
-
-
-
-
- Gets the permissions folder path.
-
-
-
-
- Gets the permissions full path.
-
-
-
-
-
-
-
-
-
-
- Gets groups list.
-
-
-
-
- Gets the default group.
-
-
-
-
- Create permissions.
-
-
-
-
- Reloads permissions.
-
-
-
-
- Save permissions.
-
-
-
-
- Checks a sender's permission.
-
- The sender to be checked.
- The permission to be checked.
- Returns a value indicating whether the user has the permission or not.
-
-
-
- Checks a sender's permission.
-
- The sender to be checked.
- The permission to be checked.
- Returns a value indicating whether the user has the permission or not.
-
-
-
- Checks a player's permission.
-
- The player to be checked.
- The permission to be checked.
- true if the player's current or native group has permissions; otherwise, false.
-
-
-
- Represents a player's group.
-
-
-
-
- Gets or sets a value indicating whether group is the default one or not.
-
-
-
-
- Gets or sets the group inheritance.
-
-
-
-
- Gets or sets the group permissions.
-
-
-
-
- Gets the combined permissions of the group plus all inherited groups.
-
-
-
-
- Handles all plugin-related permissions, for executing commands, doing actions and so on.
-
-
-
-
- Gets the permissions instance.
-
-
-
-
-
-
-
-
-
-
- Classe di risorse fortemente tipizzata per la ricerca di stringhe localizzate e così via.
-
-
-
-
- Restituisce l'istanza di ResourceManager nella cache utilizzata da questa classe.
-
-
-
-
- Esegue l'override della proprietà CurrentUICulture del thread corrente per tutte le
- ricerche di risorse eseguite utilizzando questa classe di risorse fortemente tipizzata.
-
-
-
-
- Cerca una risorsa localizzata di tipo System.Byte[].
-
-
-
-
diff --git a/UltimateAFK/bin/Release/Exiled.Updater.xml b/UltimateAFK/bin/Release/Exiled.Updater.xml
deleted file mode 100644
index 21c3562..0000000
--- a/UltimateAFK/bin/Release/Exiled.Updater.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
- Exiled.Updater
-
-
-
-
-
-
-
-
-
-
- Gets a value indicating whether testing releases have to be downloaded or not.
-
-
-
-
- Gets a value that indicates which assemblies should be excluded from the update.
-
-
-
-
-
-
-
-
-
-
diff --git a/UltimateAFK/bin/Release/UnityEngine.ARModule.dll b/UltimateAFK/bin/Release/UnityEngine.ARModule.dll
deleted file mode 100644
index 87dd0a8..0000000
Binary files a/UltimateAFK/bin/Release/UnityEngine.ARModule.dll and /dev/null differ
diff --git a/UltimateAFK/bin/Release/YamlDotNet.dll b/UltimateAFK/bin/Release/YamlDotNet.dll
deleted file mode 100644
index ac728f9..0000000
Binary files a/UltimateAFK/bin/Release/YamlDotNet.dll and /dev/null differ
diff --git a/UltimateAFK/bin/Release/scp035.dll b/UltimateAFK/bin/Release/scp035.dll
deleted file mode 100644
index 5d4356b..0000000
Binary files a/UltimateAFK/bin/Release/scp035.dll and /dev/null differ
diff --git a/UltimateAFK/bin/Release/zxing.unity.dll b/UltimateAFK/bin/Release/zxing.unity.dll
deleted file mode 100644
index 6e6b17b..0000000
Binary files a/UltimateAFK/bin/Release/zxing.unity.dll and /dev/null differ
diff --git a/UltimateAFK/packages.config b/UltimateAFK/packages.config
deleted file mode 100644
index 5b7f9fa..0000000
--- a/UltimateAFK/packages.config
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/packages/EXILED.2.2.4/.signature.p7s b/packages/EXILED.2.2.4/.signature.p7s
deleted file mode 100644
index 1426aa3..0000000
Binary files a/packages/EXILED.2.2.4/.signature.p7s and /dev/null differ
diff --git a/packages/EXILED.2.2.4/EXILED.2.2.4.nupkg b/packages/EXILED.2.2.4/EXILED.2.2.4.nupkg
deleted file mode 100644
index 40d33c4..0000000
Binary files a/packages/EXILED.2.2.4/EXILED.2.2.4.nupkg and /dev/null differ
diff --git a/packages/EXILED.2.2.4/images/Exiled_Icon.jpg b/packages/EXILED.2.2.4/images/Exiled_Icon.jpg
deleted file mode 100644
index fd45975..0000000
Binary files a/packages/EXILED.2.2.4/images/Exiled_Icon.jpg and /dev/null differ
diff --git a/packages/EXILED.2.2.4/lib/net472/Exiled.API.xml b/packages/EXILED.2.2.4/lib/net472/Exiled.API.xml
deleted file mode 100644
index 19d259f..0000000
--- a/packages/EXILED.2.2.4/lib/net472/Exiled.API.xml
+++ /dev/null
@@ -1,3669 +0,0 @@
-
-
-
- Exiled.API
-
-
-
-
- Ammo types present in the game.
-
-
-
-
- 5.56mm Ammunition.
- Used by .
-
-
-
-
- 7.62mm Ammunition.
- Used by and .
-
-
-
-
- 9mm Ammunition.
- Used by , and .
-
-
-
-
- Players authentication types.
-
-
-
-
- Indicates that the player has been authenticated through Steam.
-
-
-
-
- Indicates that the player has been authenticated through Discord.
-
-
-
-
- Indicates that the player has been authenticated as a Northwood staffer.
-
-
-
-
- Indicates that the player has been authenticated as a Patreon.
-
-
-
-
- Indicates that the player has been authenticated through an unknown provider.
-
-
-
-
- Possible barrel weapon modifications.
-
-
-
-
- No barrel
-
-
-
-
- Suppressor.
-
-
-
-
- Silencer.
-
-
-
-
- Muzzle Brake.
-
-
-
-
- Heavy Barrel.
-
-
-
-
- Muzzle Booster.
-
-
-
-
- Unique identifier for the different types of SCP-079 cameras.
-
-
-
-
- Represents an unknown camera.
-
-
-
-
- Represents the camera inside the Class-D spawns.
-
-
-
-
- Represents the camera inside SCP-372's containment room.
-
-
-
-
- Represents the camera outside of SCP-173's containment chamber.
-
-
-
-
- Represents the camera outside the 173_ARMORY door.
-
-
-
-
- Represents the camera inside of SCP-173's containment chamber.
-
-
-
-
- Represents the camera above the 173_BOTTOM door.
-
-
-
-
- Represents the camera outside of SCP-012's room
-
-
-
-
- Represents the camera at the bottom of SCP-012's containment chamber.
-
-
-
-
- Represents the LCZ cafe.
-
-
-
-
- Represents the camera inside the LCZ armory.
-
-
-
-
- Represents the plant room in LCZ.
-
-
-
-
- Represents the camera inside the WC hallway.
-
-
-
-
- Represents the camera inside SCP-914.
-
-
-
-
- Represents the camera outside SCP-914.
-
-
-
-
- Represents the camera in the LCZ A in LCZ.
-
-
-
-
- Represents the camera in the LCZ B in LCZ.
-
-
-
-
- Represents the camera facing the LCZ/HCZ A checkpoint, on the Light Containment side.
-
-
-
-
- Represents the camera facing the LCZ/HCZ B checkpoint, on the Light Containment side.
-
-
-
-
- Represents the camera facing the LCZ/HCZ A checkpoint, on the Heavy Containment side.
-
-
-
-
- Represents the camera facing the LCZ/HCZ B checkpoint, on the Heavy Containment side.
-
-
-
-
- Represents the camera in the LCZ A in HCZ.
-
-
-
-
- Represents the camera in the LCZ B in heavy.
-
-
-
-
- Represents the camera in the pre-hallway in front of 079_FIRST door.
-
-
-
-
- Represents the camera in the hallway between the 079_FIRST and 079_SECOND doors.
-
-
-
-
- Represents the camera inside SCP-079's containment chamber.
-
-
-
-
- Represents the camera outside of SCP-096's containment chamber.
-
-
-
-
- Represents the camera in the SCP-049 hallway that is in front of the elevator.
-
-
-
-
- Represents the camera in the SCP-049 hallway that is not in front of the elevator.
-
-
-
-
- Represents the camera that faces toward the 049_ARMORY door.
-
-
-
-
- Represents the hallway camera in the server room.
-
-
-
-
- Represents the camera on the bottom level of the server room.
-
-
-
-
- Represents the camera on the top level of the server room.
-
-
-
-
- Represents the camera in the HID hallway.
-
-
-
-
- Represents the camera inside the Micro-HID room.
-
-
-
-
- Represents the camera outside of the alpha warhead in HCZ.
-
-
-
-
- Represents the camera inside of the alpha warhead room.
-
-
-
-
- Represents the camera above the alpha warhead switch.
-
-
-
-
- Represents the camera inside the alpha warhead armory.
-
-
-
-
- Represents the camera inside SCP-939's containment room.
-
-
-
-
- Represents the camera above the HCZ_ARMORY door.
-
-
-
-
- Represents the SCP-106 MAIN CAM camera (above the door leading to SCP-106's room).
-
-
-
-
- Represents the SCP-106 SECOND camera (outside the 106_PRIMARY door).
-
-
-
-
- Represents the 106 ENT A camera (above the 106_PRIMARY door inside the containment room).
-
-
-
-
- Represents the 106 ENT B camera (above the 106_SECONDARY door inside the containment room).
-
-
-
-
- Represents the camera above the femur breaker.
-
-
-
-
- Represents the camera facing toward the stairs in SCP-106's containment chamber.
-
-
-
-
- Represents the camera facing toward the entrance zone checkpoint (in HCZ).
-
-
-
-
- Represents the camera facing toward the heavy containment zone checkpoint (in EZ).
-
-
-
-
- Represents the camera outside the INTERCOM door.
-
-
-
-
- Represents the camera inside the INTERCOM door.
-
-
-
-
- Represents the camera facing the intercom.
-
-
-
-
- Represents the camera inside of Gate A (entrance zone).
-
-
-
-
- Represents the camera inside of Gate B (entrance zone).
-
-
-
-
- Represents the camera outside of the Gate A elevator (surface).
-
-
-
-
- Represents the camera above the Gate A balcony.
-
-
-
-
- Represents the camera on the tower at Gate A.
-
-
-
-
- Represents the camera facing the NUKE_SURFACE door.
-
-
-
-
- Represents the camera facing the SURFACE_GATE door (Gate B side)
-
-
-
-
- Represents the camera on the Gate B walkway.
-
-
-
-
- Represents the HELIPAD camera.
-
-
-
-
- Represents the ESCAPE ZONE camera (facing toward the ESCAPE door).
-
-
-
-
- Represents the EXIT camera (above the Class-D and Scientist extraction point).
-
-
-
-
- Unique identifier for the different types of doors.
-
-
-
-
- Represents an unknown door.
-
-
-
-
- Represents the 012 door.
-
-
-
-
- Represents the 012_BOTTOM door.
-
-
-
-
- Represents the 012_LOCKER door.
-
-
-
-
- Represents the 049_ARMORY door.
-
-
-
-
- Represents the 079_FIRST door.
-
-
-
-
- Represents the 079_SECOND door.
-
-
-
-
- Represents the 096 door.
-
-
-
-
- Represents the 106_BOTTOM door.
-
-
-
-
- Represents the 106_PRIMARY door.
-
-
-
-
- Represents the 106_SECONDARY door.
-
-
-
-
- Represents the 173 gate.
-
-
-
-
- Represents the door between the 173 gate and the 173 armory.
-
-
-
-
- Represents the 173_ARMORY door.
-
-
-
-
- Represents the 173_BOTTOM door.
-
-
-
-
- Represents the GR18 door.
-
-
-
-
- Represents the 914 door.
-
-
-
-
- Represents the CHECKPOINT_ENT door.
-
-
-
-
- Represents the CHECKPOINT_LCZ_A door.
-
-
-
-
- Represents the CHECKPOINT_LCZ_B door.
-
-
-
-
- RRepresents any entrance zone styled door.
-
-
-
-
- Represents the ESCAPE_PRIMARY door.
-
-
-
-
- Represents the ESCAPE_SECONDARY door.
-
-
-
-
- Represents the SERVERS_BOTTOM door.
-
-
-
-
- Represents the GATE_A door.
-
-
-
-
- Represents the GATE_B door.
-
-
-
-
- Represents the HCZ_ARMORY door.
-
-
-
-
- Represents any heavy containment styled door.
-
-
-
-
- Represents the HID door.
-
-
-
-
- Represents the HID_LEFT door.
-
-
-
-
- Represents the HID_RIGHT door.
-
-
-
-
- Represents the INTERCOM door.
-
-
-
-
- Represents the LCZ_ARMORY door.
-
-
-
-
- Represents the LCZ_CAFE door.
-
-
-
-
- Represents the LCZ_WC door.
-
-
-
-
- Represents any light containment styled door.
-
-
-
-
- Represents the NUKE_ARMORY door.
-
-
-
-
- Represents the NUKE_SURFACE door.
-
-
-
-
- Represents any of the Class-D cell doors.
-
-
-
-
- Represents the SURFACE_GATE door.
-
-
-
-
- Represents the 372 door.
-
-
-
-
- Represents the Airlocks door.
-
-
-
-
- Represents the ContDoor door.
-
-
-
-
- Represents the ESCAPE door.
-
-
-
-
- Represents the ESCAPE_INNER door.
-
-
-
-
- Represents the 173 door.
-
-
-
-
- Status effects as enum.
-
-
-
-
- The player isn't able to open their inventory or reload a weapon.
-
-
-
-
- Drains the player's stamina and then health.
-
-
-
-
- Damages the player over time.
-
-
-
-
- Blurs the player's screen.
-
-
-
-
- Increases damage the player gets.
-
-
-
-
- Blurs the player's screen when rotating.
-
-
-
-
- Teleports the player to the pocket dimension and drains health.
-
-
-
-
- Deafens the player.
-
-
-
-
- Removes 10% of the player's health per second.
-
-
-
-
- Slows down the player's movement.
-
-
-
-
- Stops the player's movement.
-
-
-
-
- Halves the player's maximum stamina and stamina regeneration rate.
-
-
-
-
- Flashes the player.
-
-
-
-
- Drains the player's health while sprinting.
-
-
-
-
- Reduces the player's FOV, gives infinite stamina and gives the effect of underwater sound.
-
-
-
-
- Increases the player's stamina consumption.
-
-
-
-
- Damages the player every 5 seconds, starting low and ramping hight.
-
-
-
-
- Makes the player faster but also drains health.
-
-
-
-
- Makes the player invisibility.
-
-
-
-
- Slows down the player's movement with SCP-106 effect.
-
-
-
-
- Gives the player the sound vision of SCP-939.
-
-
-
-
- The unique type of elevator.
-
-
-
-
- Unknown elevator Type.
-
-
-
-
- Entrance Gate A elevator.
-
-
-
-
- Entrance Gate B elevator.
-
-
-
-
- Heavy Containment Zone Nuke elevator.
-
-
-
-
- Heavy Containment Zone SCP-049 elevator.
-
-
-
-
- Light Containment Zone checkpoint A elevator.
-
-
-
-
- Light Containment Zone checkpoint B elevator.
-
-
-
-
- A set of environment types.
-
-
-
-
- The development environment, for developers.
-
-
-
-
- The testing environment, for testing things.
-
-
-
-
- The production environment, for the public.
-
-
-
-
- The ptb environment, for Public Test Builds.
-
-
-
-
- The unique type of grenade.
-
-
-
-
- Frag grenade.
- Used by .
-
-
-
-
- Flashbang.
- Used by .
-
-
-
-
- Scp018 ball.
- Used by .
-
-
-
-
- The team that is currently leading the round.
-
-
-
-
- Represents Scientists, Guards, and NTF.
-
-
-
-
- Represents Class-D and Chaos Insurgency.
-
-
-
-
- Represents SCPs.
-
-
-
-
- Represents a draw.
-
-
-
-
- Possible other weapon modifications.
-
-
-
-
- No other
-
-
-
-
- Flashlight.
-
-
-
-
- Gyroscopic Stabilizer.
-
-
-
-
- Ammo Counter.
-
-
-
-
- Laser.
-
-
-
-
- Provides simple and readable plugin priority values.
-
-
-
-
-
-
-
- Execute the plugin last, after other ones.
-
-
-
-
-
-
-
- Default plugin priority.
-
-
-
-
- Low plugin priority.
-
-
-
-
- Medium plugin priority.
-
-
-
-
- Higher plugin priority.
-
-
-
-
- Higher plugin priority.
-
-
-
-
-
-
-
- Execute the plugin first, before other ones.
-
-
-
-
- Layers game respawn effects.
-
-
-
-
- Plays the music to alive and .
-
-
-
-
- Summons the van.
-
-
-
-
- Summons the NTF chopper.
-
-
-
-
- Unique identifier for the different types of rooms.
-
-
-
-
- Unknown Room Type.
-
-
-
-
- Lower Containment Armory.
-
-
-
-
- Lower Containment L-Shaped Room.
-
-
-
-
- Lower Containment |-Shaped Room.
-
-
-
-
- Lower Containment SCP 012 Room.
-
-
-
-
- Lower Containment SCP 914 Room.
-
-
-
-
- Lower Containment X-Shaped Room.
-
-
-
-
- Lower Containment T-Shaped Room.
-
-
-
-
- Lower Containment Cafe Room.
-
-
-
-
- Lower Containment T-Shaped Plants Room.
-
-
-
-
- Lower Containment Toilets Room.
-
-
-
-
- Lower Containment Airlock Room.
-
-
-
-
- Lower Containment SCP 173 Room.
-
-
-
-
- Lower Containment Class D Spawn Room.
-
-
-
-
- Lower Containment Checkpoint B Room.
-
-
-
-
- Lower Containment Glass Box Room.
-
-
-
-
- Lower Containment Checkpoint A Room.
-
-
-
-
- Heavy Containment SCP 079 Room.
-
-
-
-
- Heavy Containment Entrance Checkpoint Room.
-
-
-
-
- Heavy Containment T-Shaped Armory Room.
-
-
-
-
- Heavy Containment SCP 939 Room.
-
-
-
-
- Heavy Containment HID-Spawn Room.
-
-
-
-
- Heavy Containment SCP 049 Room.
-
-
-
-
- Heavy Containment Checkpoint A Room.
-
-
-
-
- Heavy Containment X-Shaped Room.
-
-
-
-
- Heavy Containment SCP 106 Room.
-
-
-
-
- Heavy Containment Nuke Room.
-
-
-
-
- Heavy Containment Tesla Room.
-
-
-
-
- Heavy Containment Servers Room.
-
-
-
-
- Heavy Containment Checkpoint B Room.
-
-
-
-
- Heavy Containment T-Shaped Room.
-
-
-
-
- Heavy Containment L-Shaped Room.
-
-
-
-
- Heavy Containment SCP 096 Room.
-
-
-
-
- Entrance Red Vent Room.
-
-
-
-
- Entrance Intercom Room.
-
-
-
-
- Entrance Gate A Room.
-
-
-
-
- Entrance PC Room With Downstairs.
-
-
-
-
- Entrance L-Shaped Room.
-
-
-
-
- Entrance PC Room.
-
-
-
-
- Entrance X-Shaped Room.
-
-
-
-
- Entrance Red Collapsed Tunnel Room.
-
-
-
-
- Entrance |-Shaped Dr.L Room.
-
-
-
-
- Entrance |-Shaped Room
-
-
-
-
- Entrance Cafeteria Room.
-
-
-
-
- Entrance PC Room With Upstairs.
-
-
-
-
- Entrance Gate B Room.
-
-
-
-
- Entrance Shelter Room.
-
-
-
-
- Pocket Dimension.
-
-
-
-
- The Surface.
-
-
-
-
- In which side a certain belongs.
-
-
-
-
- The same as .
-
-
-
-
- Mobile Task Forces team.
- Contains , , , ,
- and .
-
-
-
-
- Chaos Insurgency team.
- Contains and .
-
-
-
-
- .
-
-
-
-
- .
-
-
-
-
- Possible sight weapon modifications.
-
-
-
-
- No sight
-
-
-
-
- Collimator
-
-
-
-
- Holo Sight
-
-
-
-
- Blue Dot Sight
-
-
-
-
- Red Dot
-
-
-
-
- Night Vision Sight
-
-
-
-
- Sniper Scope
-
-
-
-
- Facility zone types.
-
-
-
-
- The Surface Zone.
-
-
-
-
- The Entrance Zone.
-
-
-
-
- The Heavy Containment Zone.
-
-
-
-
- The Light Containment Zone.
-
-
-
-
- An unknown zone.
-
-
-
-
- Contains an extension method to get from , as well as additional methods to get the and of a camera.
- Internal class to cache the and on level load.
-
-
-
-
- Returns the the camera is in, or null if not found.
-
- The to check.
- A , or null if not found.
-
-
-
- Gets the .
-
- The to check.
- The .
-
-
-
- Returns the the camera is in.
-
- The to check.
- The of the zone the camera is in.
-
-
-
- Gets all the and values for for the instances using and name.
-
-
-
-
- Contains extensions related to .
-
-
-
-
- Gets the .
-
- The Door to check.
- The .
-
-
-
- Breaks the specified door, if it is not already broken.
-
- The to break.
- True if the door was broken, false if it was unable to be broken, or was already broken before.
-
-
-
- Indicates when the door can be broken.
-
- The .
- true if the door can be broken; otherwise, false.
-
-
-
- Gets a nametag of a door.
-
- The .
- A nametag of the door or null.
-
-
-
- Gets all the values for the instances using and name.
-
-
-
-
- Contains an extension method to get from .
-
-
-
-
- Gets an instance of points to an effect.
-
- The enum.
- The .
-
-
-
- A set of extensions for .
-
-
-
-
- Spawns a in a desired position.
-
- The type of the item to be spawned.
- The durability (or ammo, depends on the weapon) of the item.
- Where the item will be spawned.
- The rotation. We recommend you to use .
- The sight the weapon will have (0 is nothing, 1 is the first sight available in the weapon manager, and so on).
- The barrel of the weapon (0 is no custom barrel, 1 is the first barrel available, and so on).
- Other attachments like flashlight, laser or ammo counter.
- Returns the spawned .
-
-
-
- Spawns an in a desired position.
-
- The item to be spawned.
- Where the item will be spawned.
- The rotation. We recommend you to use .
- Returns the spawned .
-
-
-
- Set the ammo of an item.
-
- The list of items.
- The weapon to be changed.
- The ammo amount.
-
-
-
- Set the ammo value of an .
-
- The player instance.
- The weapon to be changed.
- The ammo amount.
-
-
-
- Get the ammo of an .
-
- The weapon to be get.
- Returns the weapon left ammo.
-
-
-
- Check if an item is an ammo.
-
- The item to be checked.
- Returns whether the is an ammo or not.
-
-
-
- Check if an item is a weapon.
-
- The item to be checked.
- Indicates whether the MicroHID item should be taken into account or not.
- Returns whether the is a weapon or not.
-
-
-
- Check if an item is an SCP-330.
-
- The item to be checked.
- Returns whether the is an SCP or not.
-
-
-
- Check if an item is an SCP.
-
- The item to be checked.
- Returns whether the is an SCP or not.
-
-
-
- Check if an item is an SCP.
-
- The item to be checked.
- Returns whether the is an SCP or not.
-
-
-
- Check if an item is a throwable item.
-
- The item to be checked.
- Returns whether the is a throwable item or not.
-
-
-
- Check if an item is a medical item.
-
- The item to be checked.
- Returns whether the is a medical item or not.
-
-
-
- Check if an item is a utility item.
-
- The item to be checked.
- Returns whether the is an utilty item or not.
-
-
-
- Check if an item is a keycard.
-
- The item to be checked.
- Returns whether the is a keycard or not.
-
-
-
- Gets sight modification of the weapon.
-
- The player instance.
- The weapon with attachment.
- Returns .
-
-
-
- Sets sight modification of the weapon.
-
- The player instance.
- The weapon with attachment.
- Type of the sight.
-
-
-
- Gets barrel modification of the weapon.
-
- The player instance.
- The weapon with attachment.
- Returns .
-
-
-
- Sets barrel modification of the weapon.
-
- The player instance.
- The weapon with attachment.
- Type of the barrel.
-
-
-
- Gets other modification of the weapon.
-
- The player instance.
- The weapon with attachment.
- Returns .
-
-
-
- Sets other modification of the weapon.
-
- The player instance.
- The weapon with attachment.
- Type of the other.
-
-
-
- Contains an extension method to get from .
- Internal class to cache the on level load.
-
-
-
-
- Gets the .
-
- The to check.
- The .
-
-
-
- Gets all the values for the instances using and name.
-
-
-
-
- A set of extensions for .
-
-
-
-
- Finds and returns the the ragdoll is located in.
-
- The to check the room of.
- The the ragdoll is located in.
-
-
-
- Returns the of the ragdoll.
-
- The to check the role of.
- The of the ragdoll.
-
-
-
- Returns the owner , or null if the ragdoll does not have an owner.
-
- The to get the owner of.
- The owner of the ragdoll, or null if the ragdoll does not have an owner.
-
-
-
- Returns the killing , or null if the killer is not a player.
-
- The to get the killer of.
- The killing , or null if the killer is not a player.
-
-
-
- A set of extensions for .
-
-
-
-
- Invoke a static method.
-
- The method type.
- The method name.
- The method parameters.
-
-
-
- Copy all properties from the source class to the target one.
-
- The target object.
- The source object to copy properties from.
-
-
-
- A set of extensions for .
-
-
-
-
- Get a role's .
-
- The to get the color of.
- The of the role.
-
-
-
- Get a role's .
-
- The to check the side of.
- .
-
-
-
- Get a team's .
-
- The to get the of.
- ..
-
-
-
- Get the of the given .
-
- Role.
- .
-
-
-
- A set of extensions for .
-
-
-
-
- Compute the distance between two .
-
- The first string to be compared.
- The second string to be compared.
- Returns the distance between the two strings.
-
-
-
- Extract command name and arguments from a .
-
- The to extract from.
- Returns a containing the exctracted command name and arguments.
-
-
-
- Converts a to snake_case convention.
-
- The string to be converted.
- Indicates whether special chars has to be replaced or not.
- Returns the new snake_case string.
-
-
-
- Converts an into a string.
-
- The type of the IEnumerable.
- The instance.
- Indicates whether the enumerator index should be shown or not.
- Returns the converted .
-
-
-
- Removes the prefab-generated brackets (#) on names.
-
- Name of the .
- Name without brackets.
-
-
-
- Retrieves a string before a symbol from an input.
-
- The input.
- The symbol.
- Substring before the symbol.
-
-
-
- Splits camel case string to space-separated words. Ex: SomeCamelCase -> Some Camel Case.
-
- Camel case string.
- Splitted string.
-
-
-
- Removes all space symbols from string.
-
- Input string.
- String without spaces.
-
-
-
- Gets the player's user id without the authentication.
-
- The user id.
- Returns the raw user id.
-
-
-
- Represents the in-game badge.
-
-
-
-
- Initializes a new instance of the struct.
-
- The badge text.
- The badge color.
- The badge type.
- Indicates whether the badge is global or not.
-
-
-
- Gets the badge text.
-
-
-
-
- Gets the badge color.
-
-
-
-
- Gets the badge type.
-
-
-
-
- Gets a value indicating whether the badge is global or not.
-
-
-
-
- Useful class to save broadcast configs in a cleaner way.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
- Gets or sets the broadcast content.
-
-
-
-
- Gets or sets the broadcast duration.
-
-
-
-
- Gets or sets the broadcast type.
-
-
-
-
- Gets or sets a value indicating whether the broadcast should be shown or not.
-
-
-
-
- A set of tools to use in-game C.A.S.S.I.E more easily.
-
-
-
-
- Gets a value indicating whether or not C.A.S.S.I.E is currently announcing. Does not include decontamination messages.
-
-
-
-
- Reproduce a non-glitched C.A.S.S.I.E message.
-
- The message to be reproduced.
- Indicates whether C.A.S.S.I.E has to hold the message.
- Indicates whether C.A.S.S.I.E has to make noises or not during the message.
-
-
-
- Reproduce a glitchy C.A.S.S.I.E announcement.
-
- The message to be reproduced.
- The chance of placing a glitch between each word.
- The chance of jamming each word.
-
-
-
- Reproduce a non-glitched C.A.S.S.I.E message after a certain amount of seconds.
-
- The message to be reproduced.
- The seconds that have to pass before reproducing the message.
- Indicates whether C.A.S.S.I.E has to hold the message.
- Indicates whether C.A.S.S.I.E has to make noises or not during the message.
-
-
-
- Reproduce a glitchy C.A.S.S.I.E announcement after a certain period of seconds.
-
- The message to be reproduced.
- The seconds that have to pass before reproducing the message.
- The chance of placing a glitch between each word.
- The chance of jamming each word.
-
-
-
- Calculates duration of a C.A.S.S.I.E message.
-
- The message, which duration will be calculated.
- Determines if a number won't be converted to its full pronunciation.
- Duration (in seconds) of specified message.
-
-
-
- A set of tools to print messages on the server console.
-
-
-
-
- Sends a level messages to the game console.
-
- The message to be sent.
-
-
-
- Sends a level messages to the game console.
- Server must have exiled_debug config enabled.
-
- The message to be sent.
- Indicates whether the log can be sent or not.
-
-
-
- Sends a level messages to the game console.
-
- The message to be sent.
-
-
-
- Sends a level messages to the game console.
- This should be used to send errors only.
- It's recommended to send any messages in the catch block of a try/catch as errors with the exception string.
-
- The message to be sent.
-
-
-
- Sends a log message to the game console.
-
- The message to be sent.
- The message level of importance.
- The message color.
-
-
-
- Sends a raw log message to the game console.
-
- The message to be sent.
- The of the message.
-
-
-
- A set of tools to easily handle the in-game map.
-
-
-
-
- Gets a value indicating whether decontamination has begun in the light containment zone.
-
-
-
-
- Gets the number of activated generators.
-
-
-
-
- Gets all objects.
-
-
-
-
- Gets all objects.
-
-
-
-
- Gets all objects.
-
-
-
-
- Gets all objects.
-
-
-
-
- Gets all objects.
-
-
-
-
- Gets the Default ,
- used in
- and .
-
-
- This value can be modified to change the default Ragdoll's info.
-
-
-
-
- Gets the current state of the intercom.
-
-
-
-
- Gets a value indicating whether or not the intercom is currently being used.
-
-
-
-
- Gets the that is using the intercom. Will be null if is false.
-
-
-
-
- Tries to find the room that a is inside, first using the 's parents, then using a Raycast if no room was found.
-
- The inside the room.
- The that the is located inside.
-
-
-
- Spawns a ragdoll for a player on a certain position.
-
- Victim, represented as a player.
- The message to be displayed as his death.
- Where the ragdoll will be spawned.
- The rotation for the ragdoll.
- The initial velocity the ragdoll will have, as if it was exploded.
- Sets this ragdoll as respawnable by SCP-049.
- The Ragdoll component (requires Assembly-CSharp to be referenced).
-
-
-
- Spawns a ragdoll on the map based on the different arguments.
-
-
- Tip: You can do ': true, : MyPlayer.Id' to skip parameters.
-
-
-
- // Code to spawn a fake ragdoll
- if (ev.Player == MyPlugin.TheInmortalPlayer)
- {
- var fakeRagdoll = Map.SpawnRagdoll(RoleType.ClassD, DamageTypes.Fall, "The Falling Guy", new Vector3(1234f, -1f, 4321f));
- }
-
-
- The to use as ragdoll.
- The death cause, expressed as a .
- The name from the victim, who the corpse belongs to.
- Where the ragdoll will be spawned.
- The rotation for the ragdoll.
- The initial velocity the ragdoll will have, as if it was exploded.
- Sets this ragdoll as respawnable by SCP-049. Must have a valid .
- Used for recall. The to be recalled.
- Can be ignored. The 's PlayerId field.
- The Ragdoll component (requires Assembly-CSharp to be referenced).
-
-
-
- Spawns a ragdoll on the map based on the different arguments.
-
-
- Tip: You can do, for example, ': "Vector3.up * 3"' to skip parameters.
-
-
-
- // Code to spawn a fake ragdoll
- if (ev.Player == MyPlugin.TheInmortalPlayer)
- {
- var fakeRagdoll = Map.SpawnRagdoll(ev.Player.Role, ev.Player.Position, victimNick: ev.Player.DisplayNickname, playerId: ev.Player.Id);
- }
-
-
- The to use as ragdoll.
- The name from the victim, who the corpse belongs to.
- The that displays who killed this ragdoll, and using which tool.
- Where the ragdoll will be spawned.
- The rotation for the ragdoll.
- The initial velocity the ragdoll will have, as if it was exploded.
- Sets this ragdoll as respawnable by SCP-049.
- Used for recall. The to be recalled.
- Can be ignored. The 's PlayerId field, likely used in the client.
- The Ragdoll component (requires Assembly-CSharp to be referenced).
-
-
-
- Optimized method to Spawn a ragdoll on the map.
- Will only allocate the newly created GameObject, requires extra work and pre-loaded base game roles.
-
-
-
- -
-
- EXILED already has an internal, default Ragdoll.Info: the use of this
- method to try to optimize a plugin is absolutely optional.
-
- We recommend using: Map.SpawnRagdoll(RoleType roleType, string victimNick, Vector3 position)
-
- -
- This method should only ever be used if you're dealing with massive
- server-sided lag.
-
- -
- Ragdoll.Info's "ownerID" isn't the SteamID, but the
- 's PlayerId field.
-
-
-
- Main game's thad defines the role to spawn a ragdoll.
- object containing the ragdoll's info.
- Where the ragdoll will be spawned.
- The rotation for the ragdoll.
- The initial velocity the ragdoll will have, as if it was exploded.
- Sets this ragdoll as respawnable by SCP-049.
- The component created.
-
-
-
- Spawns hands at the specified position with specified rotation.
-
- Hands position.
- Hands rotation.
-
-
-
- Broadcasts a message to all players.
-
- The duration in seconds.
- The message that will be broadcast (supports Unity Rich Text formatting).
- The broadcast type.
-
-
-
- Shows a hint to all players.
-
- The message that will be broadcasted (supports Unity Rich Text formatting).
- The duration in seconds.
-
-
-
- Clears all players' broadcasts.
-
-
-
-
- Gets a random spawn point of a .
-
- The to get the spawn point from.
- Returns the spawn point .
-
-
-
- Starts the light containment zone decontamination process.
-
-
-
-
- Turns off all lights of the facility.
-
- The duration of the blackout.
- Indicates whether or not only lights in the heavy containment zone will be turned off.
-
-
-
- Gets the camera with the given ID.
-
- The camera id to be searched for.
- The with the given ID.
-
-
-
- Gets the camera with the given camera type.
-
- The to search for.
- The with the given camera type.
-
-
-
- Gets the door with the given door name.
-
- The door name.
- The or null if a door with this name doesn't exist.
-
-
-
- Changes the color of a MTF unit.
-
- The index of the unit color you want to change.
- The new color of the Unit.
-
-
-
- Clears the lazy loading game object cache.
-
-
-
-
- A set of useful paths.
-
-
-
-
- Gets AppData path.
-
-
-
-
- Gets managed assemblies directory path.
-
-
-
-
- Gets or sets exiled directory path.
-
-
-
-
- Gets or sets plugins path.
-
-
-
-
- Gets or sets Dependencies directory path.
-
-
-
-
- Gets or sets configs path.
-
-
-
-
- Gets or sets configs path.
-
-
-
-
- Gets or sets logs path.
-
-
-
-
- Reloads all paths.
-
- The new root directory name.
-
-
-
- Represents the in-game player, by encapsulating a .
-
-
-
-
- Initializes a new instance of the class.
-
- The of the player to be encapsulated.
-
-
-
- Initializes a new instance of the class.
-
- The of the player.
-
-
-
- Finalizes an instance of the class.
-
-
-
-
- Gets a containing all on the server.
-
-
-
-
- Gets a list of all 's on the server.
-
-
-
-
- Gets a containing cached and their user ids.
-
-
-
-
- Gets a containing cached and their ids.
-
-
-
-
- Gets the encapsulated .
-
-
-
-
- Gets the encapsulated .
-
-
-
-
- Gets the player's ammo.
-
-
-
-
- Gets the HintDisplay of the player.
-
-
-
-
- Gets the player's inventory.
-
-
-
-
- Gets the encapsulated 's PlayerCamera.
-
-
-
-
- Gets the encapsulated 's PlayerCamera.
-
-
-
-
- Gets the player's grenade manager.
-
-
-
-
- Gets or sets the player's id.
-
-
-
-
- Gets the player's user id.
-
-
-
-
- Gets or sets the player's custom user id.
-
-
-
-
- Gets the player's user id without the authentication.
-
-
-
-
- Gets the player's authentication token.
-
-
-
-
-
-
-
- Gets a value indicating whether or not the player is verified.
-
-
- This is always false if online_mode is set to false.
-
-
-
-
- Gets or sets the player's display nickname.
- May be null.
-
-
-
-
- Gets the player's nickname.
-
-
-
-
- Gets or sets the player's player info area bitmask.
- You can hide player info elements with this.
-
-
-
-
- Gets or sets the player's player info area bitmask.
- You can hide player info elements with this.
-
-
-
-
- Gets or sets the player's custom player info string.
-
-
-
-
- Gets or sets the player's custom player info string.
-
-
-
-
- Gets the dictionary of player's session variables. It is not being saved on player disconnect.
-
-
-
-
- Gets or sets a value indicating whether or not the player is invisible.
-
-
-
-
- Gets a value indicating whether or not the player can be tracked.
-
-
-
-
- Gets a value indicating whether or not the player is connected to the server.
-
-
-
-
- Gets a list of player ids who can't see the player.
-
-
-
-
- Gets a list of player ids who can't see the player.
-
-
-
-
- Gets a value indicating whether or not the player has Remote Admin access.
-
-
-
-
- Gets or sets a value indicating whether or not the player's overwatch is enabled.
-
-
-
-
- Gets or sets a value indicating the cuffer id.
-
-
-
-
- Gets or sets the player's position.
-
-
-
-
- Gets or sets the player's rotations.
-
- Returns a representing the rotation of the player.
-
-
-
- Gets or sets the player's rotation.
-
- Returns the direction he's looking at, useful for Raycasts.
-
-
-
- Gets the player's .
-
-
-
-
- Gets or sets the player's .
-
-
-
-
- Gets the of the player's role.
-
-
-
-
- Gets a value indicating whether or not the palyer is cuffed.
-
-
-
-
- Gets a value indicating whether or not the player is reloading a weapon.
-
-
-
-
- Gets a value indicating whether or not the player is zooming with a weapon.
-
-
-
-
- Gets the player's current .
-
-
-
-
- Gets a value indicating whether or not the player is jumping.
-
-
-
-
- Gets the player's IP address.
-
-
-
-
- Gets or sets a value indicating whether or not the has No-clip enabled.
-
- indicating status.
-
-
-
- Gets the player's command sender instance.
-
-
-
-
- Gets the player's command sender instance.
-
-
-
-
- Gets player's .
-
-
-
-
- Gets a value indicating whether or not the player is the host.
-
-
-
-
- Gets a value indicating whether or not the player is alive.
-
-
-
-
- Gets a value indicating whether or not the player is dead.
-
-
-
-
- Gets a value indicating whether or not the player's is any NTF rank.
- Equivalent to checking the player's .
-
-
-
-
- Gets a value indicating whether or not the player's is any SCP rank.
-
-
-
-
- Gets a value indicating whether or not the player's is any human rank (except the tutorial role).
-
-
-
-
- Gets or sets the camera SCP-079 is currently controlling.
- Only applies if the player is SCP-079.
-
-
-
-
- Gets the player's they're currently in.
-
-
-
-
- Gets or sets a value indicating whether the player friendly fire is enabled or not.
- This only isAllowed to deal friendly fire damage, not take friendly fire damage.
-
-
-
-
- Gets or sets the player's scale.
-
-
-
-
- Gets or sets a value indicating whether the player's bypass mode is enabled or not.
-
-
-
-
- Gets or sets a value indicating whether or not the player is muted.
-
-
-
-
- Gets or sets a value indicating whether or not the player is intercom muted.
-
-
-
-
- Gets or sets a value indicating whether or not the player has godmode enabled.
-
-
-
-
- Gets or sets the player's health.
- If the health is greater than the , the MaxHealth will also be changed to match the health.
-
-
-
-
- Gets or sets the player's maximum health.
-
-
-
-
- Gets or sets the player's adrenaline health.
- If the health is greater than the , the MaxAdrenalineHealth will also be changed to match the adrenaline health.
-
-
-
-
- Gets or sets the player's maximum adrenaline health.
-
-
-
-
- Gets or sets the player's current SCP.
-
-
-
-
- Gets or sets the item in the player's hand, returns the default value if empty.
-
-
-
-
- Gets the index of the current item in hand.
-
-
-
-
- Gets or sets the abilities of SCP-079. Can be null.
- Only applies if the player is SCP-079.
-
-
-
-
- Gets or sets the levels of SCP-079. Can be null.
- Only applies if the player is SCP-079.
-
-
-
-
- Gets or sets the speaker this player is currently using. Can be null.
- Only applies if the player is SCP-079.
-
-
-
-
- Gets or sets the doors this player has locked. Can be null.
- Only applies if the player is SCP-079.
-
-
-
-
- Gets or sets the amount of experience this player has.
- Only applies if the player is SCP-079.
-
-
-
-
- Gets the class.
-
-
-
-
- Gets or sets this player's level.
- Only applies if the player is SCP-079.
-
-
-
-
- Gets or sets this player's max energy.
- Only applies if the player is SCP-079.
-
-
-
-
- Gets or sets this player's energy.
- Only applies if the player is SCP-079.
-
-
-
-
- Gets a value indicating whether the staff bypass is enabled or not.
-
-
-
-
- Gets or sets the player's group name.
-
-
-
-
- Gets the current room the player is in.
-
-
-
-
- Gets or sets the player's group.
-
-
-
-
- Gets or sets the player's rank color.
-
-
-
-
- Gets or sets the player's rank name.
-
-
-
-
- Gets the global badge of the player, can be null if none.
-
-
-
-
- Gets or sets a value indicating whether or not the player's badge is hidden.
-
-
-
-
- Gets a value indicating whether or not the player is in the pocket dimension.
-
-
-
-
- Gets or sets a value indicating whether player should use stamina system.
-
-
-
-
- Gets or sets a player's SCP-330 usages counter.
-
-
-
-
- Gets a value indicating whether player has hands.
-
-
-
-
- Gets a dictionary for storing player objects of connected but not yet verified players.
-
-
-
-
- Gets a filtered by team.
-
- The players' team.
- Returns the filtered .
-
-
-
- Gets a filtered by role.
-
- The players' role.
- Returns the filtered .
-
-
-
- Gets the belonging to the CommandSender, if any.
-
- The command sender.
- Returns a player or null if not found.
-
-
-
- Gets the Player belonging to the ReferenceHub, if any.
-
- The player's .
- Returns a player or null if not found.
-
-
-
- Gets the Player belonging to the GameObject, if any.
-
- The player's .
- Returns a player or null if not found.
-
-
-
- Gets the player belonging to the player with the specified id.
-
- The player id.
- Returns the player found or null if not found.
-
-
-
- Gets the player by his identifier.
-
- The player's nickname, steamID64 or Discord ID.
- Returns the player found or null if not found.
-
-
-
-
-
-
- Sets the camera the player is currently located at.
- Only applies if the player is SCP-079.
-
- Camera ID.
-
-
-
- Sets the camera the player is currently located at.
- Only applies if the player is SCP-079.
-
- The object to switch to.
-
-
-
- Sets the player's rank.
-
- The rank name to be set.
- The group to be set.
-
-
-
- Handcuff the player.
-
- The cuffer player.
-
-
-
- Sets the player's .
-
- The new to be set.
- Indicates whether it should preserve the position and inventory after changing the role or not.
- Indicates whether the player is escaped or not.
-
-
-
- Broadcasts the given to the player.
-
- The to be broadcasted.
-
-
-
- Drops an item from the player's inventory.
-
- The item to be dropped.
-
-
-
- Indicates whether or not the player has an item.
-
- The item to search for.
- true, if the player has it; otherwise, false.
-
-
-
- Removes an item from the player's inventory.
-
- The item to be removed.
-
-
-
- Removes the held item from the player's inventory.
-
-
-
-
- Sends a console message to the player's console.
-
- The message to be sent.
- The message color.
-
-
-
- Sends a console message to a .
-
- The message target.
- The message to be sent.
- The message color.
-
-
-
- Disconnects a player.
-
- The disconnection reason.
-
-
-
- Hurts the player.
-
- The damage to be inflicted.
- The damage type.
- The attacker name.
- The attacker player id.
-
-
-
- Hurts the player.
-
- The damage to be inflicted.
- The attacker.
- The damage type.
-
-
-
- Kills the player.
-
- The that will kill the player.
-
-
-
- Bans the player.
-
- The ban duration.
- The ban reason.
- The ban issuer nickname.
-
-
-
- Kicks the player.
-
- The kick reason.
- The kick issuer nickname.
-
-
-
- Blink the player's tag.
-
- Used to wait.
-
-
-
- Sends a message to the player's Remote Admin console.
-
- The message to be sent.
- Indicates whether the message should be highlighted as success or not.
- The plugin name.
-
-
-
- A simple broadcast to a . Doesn't get logged to the console and can be monospaced.
-
- The broadcast duration.
- The message to be broadcasted.
- The broadcast type.
-
-
-
- Clears the player's brodcast. Doesn't get logged to the console.
-
-
-
-
- Add an item of the specified type with default durability(ammo/charge) and no mods to the player's inventory.
-
- The item to be added.
-
-
-
- Add an item to the player's inventory.
-
- The item to be added.
-
-
-
- Resets the player's inventory to the provided list of items, clearing any items it already possess.
-
- The new items that have to be added to the inventory.
-
-
-
- Resets the player's inventory to the provided list of items, clearing any items it already possess.
-
- The new items that have to be added to the inventory.
-
-
-
- Clears the player's inventory, including all ammo and items.
-
-
-
-
- Drops all items in the player's inventory, including all ammo and items.
-
-
-
-
- Sets the amount of a specified ammo type.
-
- The to be set.
- The amount of ammo to be set.
-
-
-
- Gets the amount of a specified .
-
- The to get the amount from.
- Returns the amount of the chosen .
-
-
-
- Simple way to show a hint to the player.
-
- The message to be shown.
- The duration the text will be on screen.
-
-
-
- Gets a describing whether or not the given status effect is currently enabled.
-
- The to check.
- A determining whether or not the player effect is active.
-
-
-
- Disables all currently active status effects.
-
-
-
-
- Disables a specific status effect on the player.
-
- The to disable.
-
-
-
- Disables a specific status effect on the player.
-
- The to disable.
-
-
-
- Enables a status effect on the player.
-
- The to enable.
- The amount of time the effect will be active for.
- If the effect is already active, setting to true will add this duration onto the effect.
-
-
-
- Enables a status effect on the player.
-
- The name of the to enable.
- The amount of time the effect will be active for.
- If the effect is already active, setting to true will add this duration onto the effect.
- A bool indicating whether or not the effect was valid and successfully enabled.
-
-
-
- Enables a status effect on the player.
-
- The to enable.
- The amount of time the effect will be active for.
- If the effect is already active, setting to true will add this duration onto the effect.
-
-
-
- Gets an instance of by .
-
- The .
- The .
-
-
-
- Tries to get an instance of by .
-
- The .
- The .
- A bool indicating whether or not the was successfully gotten.
-
-
-
- Gets a indicating the intensity of the given status effect.
-
- The to check.
- Thrown if the given type is not a valid .
- The intensity of the effect.
-
-
-
- Changes the intensity of a status effect.
-
- The to change the intensity of.
- The intensity of the effect.
-
-
-
- Changes the intensity of a status effect.
-
- The name of the to enable.
- The intensity of the effect.
- The new length of the effect. Defaults to infinite length.
-
-
-
- Removes the player's hands.
-
-
-
-
-
-
-
- Expose how a plugin has to be made.
-
- The config type.
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- A set of tools to handle team respawns more easily.
-
-
-
-
- Gets the next known that will spawn.
-
-
-
-
- Gets the amount of seconds before the next respawn will occur.
-
-
-
-
- Gets a value indicating whether or not a team is currently being spawned or the animations are playing for a team.
-
-
-
-
- Gets the amount of spawn tickets belonging to the NTF.
-
-
-
-
- Gets the amount of spawn tickets belonging to the Chaos Insurgency.
-
-
-
-
- Gets the actual .
-
-
-
-
- Play an effect when a certain class spawns.
-
- The effect to be played.
-
-
-
- Play an effect when a certain class spawns.
-
- The effect to be played.
-
-
-
- Play effects when a certain class spawns.
-
- The effects to be played.
-
-
-
- Play effects when a certain class spawns.
-
- The effects to be played.
-
-
-
- Summons the NTF chopper.
-
-
-
-
- Summons the van.
-
- Whether or not to play the Chaos Insurgency spawn music.
-
-
-
- Grants tickets to a .
-
- The to grant tickets to.
- The amount of tickets to grant.
- Whether or not to override ticket locks.
- Whether or not tickets were granted successfully.
-
-
-
- Forces a spawn of the given .
-
- The to spawn.
- Whether or not effects will be played with the spawn.
-
-
-
- The in-game room.
-
-
-
-
- Gets the name.
-
-
-
-
- Gets the .
-
-
-
-
- Gets the position.
-
-
-
-
- Gets the in which the room is located.
-
-
-
-
- Gets the .
-
-
-
-
- Gets a of in the .
-
-
-
-
- Gets a of in the .
-
-
-
-
- Gets a value indicating whether or not the lights in this room are currently flickered off.
-
-
-
-
- Flickers the room's lights off for a duration.
-
- Duration in seconds.
-
-
-
- Sets the intensity of the lights in the room.
-
- The light intensity multiplier. Cannot be brighter than 2 or darker than 0.
-
-
-
- Factory method to create and add a component to a Transform.
- We can add parameters to be set privately here.
-
- The Game Object to attach the Room component to.
- The Room component that was instantiated onto the Game Object.
-
-
-
- A set of tools to handle the round more easily.
-
-
-
-
- Gets the time elapsed from the start of the round.
-
-
-
-
- Gets the start time of the round.
-
-
-
-
- Gets a value indicating whether the round is started or not.
-
-
-
-
- Gets or sets a value indicating whether the round is locked or not.
-
-
-
-
- Gets or sets a value indicating whether the lobby is locked or not.
-
-
-
-
- Restarts the round.
-
-
-
-
- Restarts the round with custom settings.
-
-
- Indicates whether or not it'll be a fast restart.
- If it's a fast restart, then players won't be reconnected from
- the server; otherwise, they will.
-
-
- Overrides a value of .
- Makes sense if someone used a command to set another action.
-
-
- The .
-
- - does nothing, just restarts the round silently.
- - restarts the server, reconnects all players.
- - shutdowns the server, also disconnects all players.
-
-
-
-
-
- Restarts the round silently.
-
-
-
-
- Forces the round to end, regardless of which factions are alive.
-
- A describing whether or not the round was successfully ended.
-
-
-
- Start the round.
-
-
-
-
- A set of tools to modify SCP-096's behaviour.
-
-
-
-
- Gets or Sets a value indicating the max shield amount SCP-096 can have during his docile state.
-
-
-
-
- Gets a list of player ids who will be turned away from SCP-096.
-
-
-
-
- A set of tools to modify SCP-173's behaviour.
-
-
-
-
- Gets a list of player ids who will be turned away from SCP-173.
-
-
-
-
- A set of tools to modify SCP-914's behaviour.
-
-
-
-
- Gets or sets SCP-914 .
-
-
-
-
- Gets or sets SCP-914 recipes.
-
-
-
-
- Gets or sets SCP-914 config mode.
-
-
-
-
- Gets a value indicating whether the SCP-914 was activated and is currently processing items.
-
-
-
-
- Gets the intake booth .
-
-
-
-
- Gets the output booth .
-
-
-
-
- Starts the SCP-914.
-
-
-
-
- A set of tools to easily work with the server.
-
-
-
-
- Gets the player's host of the server.
- Might be null when called when the server isn't loaded.
-
-
-
-
- Gets the cached component.
-
-
-
-
- Gets the cached component.
-
-
-
-
- Gets the cached .
-
-
-
-
- Gets or sets the name of the server.
-
-
-
-
- Gets the Ip address of the server.
-
-
-
-
- Gets the port of the server.
-
-
-
-
- Gets or sets a value indicating whether friendly fire is enabled or not.
-
-
-
-
- Restarts the server, reconnects all players.
-
-
-
-
- Shutdowns the server, disconnects all players.
-
-
-
-
- Redirects players to a server on another port, restarts the current server.
-
- The port to redirect players to.
- true, if redirection was successful; otherwise, false.
- If the returned value is false, the server won't restart.
-
-
-
- Redirects players to a server on another port, shutdowns the current server.
-
- The port to redirect players to.
- true, if redirection was successful; otherwise, false.
- If the returned value is false, the server won't shutdown.
-
-
-
- A set of tools to easily work with the alpha warhead.
-
-
-
-
- Gets the cached component.
-
-
-
-
- Gets the cached component.
-
-
-
-
- Gets the cached component.
-
-
-
-
- Gets or sets a value indicating whether the warhead lever is enabled or not.
-
-
-
-
- Gets or sets a value indicating whether the warhead has already been activated or not.
-
-
-
-
- Gets a value indicating whether the warhead has already been detonated or not.
-
-
-
-
- Gets a value indicating whether the warhead detonation is in progress or not.
-
-
-
-
- Gets or sets the warhead detonation timer.
-
-
-
-
- Gets the warhead real detonation timer.
-
-
-
-
- Gets or sets a value indicating whether the warhead can be disabled or not.
-
-
-
-
- Gets or sets a value indicating whether the warhead can be disabled or not.
-
-
-
-
- Gets a value indicating whether the warhead can be started or not.
-
-
-
-
- Starts the warhead countdown.
-
-
-
-
- Stops the warhead.
-
-
-
-
- Detonates the warhead.
-
-
-
-
- Shake all players, like if the warhead has been detonated.
-
-
-
-
- Defines the contract for basic config features.
-
-
-
-
- Gets or sets a value indicating whether the plugin is enabled or not.
-
-
-
-
- Defines the contract for basic plugin features.
-
- The config type.
-
-
-
- Gets the plugin assembly.
-
-
-
-
- Gets the plugin name.
-
-
-
-
- Gets the plugin prefix.
-
-
-
-
- Gets the plugin author.
-
-
-
-
- Gets the plugin commands.
-
-
-
-
- Gets the plugin priority.
- Higher values mean higher priority and vice versa.
-
-
-
-
- Gets the plugin version.
-
-
-
-
- Gets the required version of Exiled to run the plugin without bugs or incompatibilities.
-
-
-
-
- Gets the plugin config.
-
-
-
-
- Fired after enabling the plugin.
-
-
-
-
- Fired after disabling the plugin.
-
-
-
-
- Fired after reloading the plugin.
-
-
-
-
- Fired before registering commands.
-
-
-
-
- Fired before unregistering configs.
-
-
-
-
diff --git a/packages/EXILED.2.2.4/lib/net472/Exiled.Bootstrap.xml b/packages/EXILED.2.2.4/lib/net472/Exiled.Bootstrap.xml
deleted file mode 100644
index 5df0458..0000000
--- a/packages/EXILED.2.2.4/lib/net472/Exiled.Bootstrap.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
- Exiled.Bootstrap
-
-
-
-
- The assembly loader class for Exiled.
-
-
-
-
- Gets a value indicating whether exiled has already been loaded or not.
-
-
-
-
- Internally called loading method.
-
-
-
-
diff --git a/packages/EXILED.2.2.4/lib/net472/Exiled.Events.xml b/packages/EXILED.2.2.4/lib/net472/Exiled.Events.xml
deleted file mode 100644
index a43d449..0000000
--- a/packages/EXILED.2.2.4/lib/net472/Exiled.Events.xml
+++ /dev/null
@@ -1,5267 +0,0 @@
-
-
-
- Exiled.Events
-
-
-
-
- The reload configs command.
-
-
-
-
- Gets static instance of the command.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- The reload configs command.
-
-
-
-
- Gets static instance of the command.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- The reload gameplay command.
-
-
-
-
- Gets static instance of the command.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- The reload plugins command.
-
-
-
-
- Gets static instance of the command.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- The reload command.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- The reload remoteadmin command.
-
-
-
-
- Gets static instance of the command.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- The command to show all plugins.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- The command to show all plugins.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Gets or sets a value indicating whether SCP-173 can be blocked or not by the tutorial.
-
-
-
-
- Gets or sets a value indicating whether SCP-096 can be triggered or not by the tutorial.
-
-
-
-
- Gets or sets a value indicating whether the name tracking is enabled or not.
-
-
-
-
- Gets or sets a value indicating whether the inventory should be dropped before being set as spectator, through commands or plugins.
-
-
-
-
- Gets or sets a value indicating whether the blood can be spawned or not.
-
-
-
-
- Gets or sets a value indicating whether configs has to be reloaded every time a round restarts.
-
-
-
-
- Gets a value indicating whether bans should be logged or not.
-
-
-
-
- Gets or sets a value indicating the max shield amount for Scp096.
-
-
-
-
- Contains all informations before a player activates SCP-914.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
- Gets the player who's activating SCP-914.
-
-
-
-
- Gets or sets a value indicating whether or not SCP-914 can be activated.
-
-
-
-
- Contains all informations before a player activates the warhead panel.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
- Gets the player who's trying to activate the warhead panel.
-
-
-
-
- Gets a list of permissions, required to activate the warhead panel.
-
-
-
-
- Gets or sets a value indicating whether or not the warhead can be activated.
-
-
-
-
- Contains all informations before a player activates a workstation.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
- Gets the player who's trying to activate the workstation.
-
-
-
-
- Gets a workstation.
-
-
-
-
- Gets or sets a value indicating whether or not the workstation can be activated.
-
-
-
-
- Contains all informations before adding a target to SCP-096.
-
-
-
-
- Initializes a new instance of the class.
-
- who is SCP-096.
- who is the target to be added.
- amount of temporary health to add to .
- amount of time to add to 's enrage timer. Note: This does not affect anything if he doesn't already have any targets before this event is called.
-
-
-
- Gets the that is controlling SCP-096.
-
-
-
-
- Gets the being added as a target.
-
-
-
-
- Gets or sets a value indicating whether or not the target is allowed to be added.
-
-
-
-
- Gets or sets the amount of AHP to add to SCP-096 if is true.
-
-
-
-
- Gets or sets how much time is added to SCP-096's enrage timer if is true.
-
-
-
-
- Contains all informations before C.A.S.S.I.E announces light containment zone decontamination.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
- Gets or sets the announcement id, from 0 to 6.
-
-
-
-
- Gets or sets a value indicating whether the announcement is going to be global or not.
-
-
-
-
- Gets or sets a value indicating whether the event can be executed or not.
-
-
-
-
- Contains all informations before C.A.S.S.I.E announces the NTF entrance.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
- Gets the number of SCPs left.
-
-
-
-
- Gets or sets the NTF unit name.
-
-
-
-
- Gets or sets the NTF unit number.
-
-
-
-
- Gets or sets a value indicating whether or not the NTF spawn will be announced by C.A.S.S.I.E.
-
-
-
-
- Contains all informations before C.A.S.S.I.E announces an SCP termination.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
-
- Gets the player who killed the SCP.
-
-
-
-
- Gets the killed .
-
-
-
-
- Gets or sets the hit info.
-
-
-
-
- Gets or sets the termination cause.
-
-
-
-
- Gets or sets a value indicating whether or not the SCP termination will be announced by C.A.S.S.I.E.
-
-
-
-
- Contains all informations after banning a player from the server.
-
-
-
-
- Initializes a new instance of the class.
-
- The banned player.
- The issuer player.
- The ban details.
-
-
-
-
- Gets the banned player.
-
-
-
-
- Gets the banned player.
-
-
-
-
- Gets the issuer player.
-
-
-
-
- Gets the ban details.
-
-
-
-
- Gets the ban type.
-
-
-
-
- Contains all informations before banning a player from the server.
-
-
-
-
- Initializes a new instance of the class.
-
- The ban target.
- The ban issuer.
- The ban minutes duration.
- The ban reason.
- The ban full message.
- Indicates whether the event can be executed or not.
-
-
-
- Gets or sets the ban duration.
-
-
-
-
- Contains all informations before a players blink near SCP-173.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
- Gets the player who controlling SCP-173.
-
-
-
-
- Gets a list of players who have triggered SCP-173.
-
-
-
-
- Contains all informations before SCP-096 calms down.
-
-
-
-
- Initializes a new instance of the class.
-
- The instance.
- The player who's controlling SCP-096.
- Indicates whether or not SCP-096 can calm down.
-
-
-
- Contains all informations before changing item attachments.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
-
- Contains all informations before changing item attributes.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
- Gets the old item.
-
-
-
-
- Gets or sets the item.
-
-
-
-
- Gets or sets the item type.
-
-
-
-
- Gets or sets the new item durability.
-
-
-
-
- Gets or sets the new item unique id.
-
-
-
-
- Gets or sets the new item sight attachment.
-
-
-
-
- Gets or sets the new item barrel attachment.
-
-
-
-
- Gets or sets the new item other attachment.
-
-
-
-
- Gets or sets a value indicating whether the event can be executed or not.
-
-
-
-
- Contains all informations before a SCP-079 changes the current camera.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
- Gets the player who is SCP-079.
-
-
-
-
- Gets or sets the camera SCP-079 will be moved to.
-
-
-
-
- Gets or sets the amount of AP that will be required to switch cameras.
-
-
-
-
- Gets or sets a value indicating whether or not SCP-079 can switch cameras.
- Defaults to a value describing whether or not SCP-079 has enough AP to switch.
- Can be set to true to allow a switch regardless of SCP-079's AP amount.
-
-
-
-
- Contains all informations before changing item durability.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
- Contains all informations before a player changes his group.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
- Gets the player who's changing his group.
-
-
-
-
- Gets or sets the player's new group.
-
-
-
-
- Gets or sets a value indicating whether or not the player can change groups.
-
-
-
-
- Contains all informations before a player's intercom mute status is changed.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
- Gets the player who's being intercom muted/unmuted.
-
-
-
-
- Gets or sets a value indicating whether or not the player can be intercom muted/unmuted.
-
-
-
-
- Gets a value indicating whether the player is being intercom muted or unmuted.
-
-
-
-
- Contains all informations before a player's held item changes.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
- Gets the player who's changing the item.
-
-
-
-
- Gets or sets the old item.
-
-
-
-
- Gets the new item.
-
-
-
-
- Contains all informations before a player changes the SCP-914 knob setting.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
- Gets the player who's changing the SCP-914 knob setting.
-
-
-
-
- Gets or sets the SCP-914 knob setting.
-
-
-
-
- Gets or sets a value indicating whether or not SCP-914's knob setting can be changed.
-
-
-
-
- Contains all informations before a player changes the warhead lever status.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
- Gets the player who's changing the warhead status.
-
-
-
-
- Gets or sets a value indicating whether or not the lever status will change.
-
-
-
-
- Contains all informations before a player's mute status is changed.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
- Gets the player who's being muted/unmuted.
-
-
-
-
- Gets or sets a value indicating whether or not the player can be muted/unmuted.
-
-
-
-
- Gets a value indicating whether the player is being muted or unmuted.
-
-
-
-
- Contains all informations before a player's changes.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
-
- Gets the player whose is changing.
-
-
-
-
- Gets or sets the new player's role.
-
-
-
-
- Gets base items that the player will receive.
-
-
-
-
- Gets or sets a value indicating whether the player escaped or not.
-
-
-
-
- Gets or sets a value indicating whether the position has to be preserved after changing the role.
-
-
-
-
- Contains all informations before a player closes a generator.
-
-
-
-
- Initializes a new instance of the class.
-
- The player who's closing the generator.
- The instance.
- Indicates whether or not the generator can be closed.
-
-
-
- Contains all informations before containing SCP-106.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
- Gets the player who's controlling SCP-106.
-
-
-
-
- Gets the player who pressed the button.
-
-
-
-
- Gets or sets a value indicating whether or not SCP-106 can be recontained.
-
-
-
-
- Contains all informations before SCP-106 creates a portal.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
- Gets the player who's controlling SCP-106.
-
-
-
-
- Gets or sets the portal position.
-
-
-
-
- Gets or sets a value indicating whether or not SCP-106 can create a portal.
-
-
-
-
- Contains all informations before damage is dealt to a .
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
- Gets the object that is damaged.
-
-
-
-
- Gets or sets the damage the window will receive.
-
-
-
-
- Contains all informations before a player deactivates a workstation.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
- Gets or sets a value indicating whether or not the workstation can be deactivated.
-
-
-
- Contains all informations before decontaminating the light containment zone.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
- Gets or sets a value indicating whether or not light containment zone decontamination can begin.
-
-
-
-
- Contains all informations after a player dequipes a medical item.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
- Gets the player who used the medical item.
-
-
-
-
- Gets the medical item that the player consumed.
-
-
-
-
- Contains all informations before a player's object is destroyed.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
- Gets the destoying player.
-
-
-
-
- Contains all informations after a player dies.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
- Gets the killer player.
-
-
-
-
- Gets the killed player.
-
-
-
-
- Gets or sets the hit informations.
-
-
-
-
- Contains all informations before a player drops an item.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
- Gets the player who's dropping the item.
-
-
-
-
- Gets or sets the item to be dropped.
-
-
-
-
- Gets or sets a value indicating whether or not the item can be dropped.
-
-
-
-
- Contains all information before a player dies.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
- Gets the killing player.
-
-
-
-
- Gets the dying player.
-
-
-
-
- Gets or sets the hit information.
-
-
-
-
- Gets or sets a value indicating whether or not the player can be killed.
-
-
-
-
- Contains all informations before a player ejects a tablet from a generator.
-
-
-
-
- Initializes a new instance of the class.
-
- The player who's ejecting the tablet.
- The instance.
- Indicates whether or not the tablet can be ejected.
-
-
-
- Contains all informations before SCP-079 changes rooms via elevator.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
- Gets the player who is controlling SCP-079.
-
-
-
-
- Gets or sets the that SCP-079 will be moved to.
-
-
-
-
- Gets or sets the amount of AP will be consumed during the level change.
-
-
-
-
- Gets or sets a value indicating whether or not SCP-079 can teleport.
- Defaults to a describing whether or not SCP-079 has enough AP to teleport.
-
-
-
-
- Contains all informations before ending a round.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
- Gets or sets the round summary class list.
-
-
-
-
- Gets or sets the leading team.
-
-
-
-
- Gets or sets a value indicating whether the round is going to finish or not.
-
-
-
-
- Gets or sets a value indicating whether the event can be executed or not.
-
-
-
-
- Contains all informations before SCP-096 gets enraged.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
- Gets the SCP-096 instance.
-
-
-
-
- Gets the player who's controlling SCP-096.
-
-
-
-
- Gets or sets a value indicating whether or not SCP-096 can be enraged.
-
-
-
-
- Contains all informations before a player enters the femur breaker.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
- Gets the player who's entering the femur breaker.
-
-
-
-
- Gets or sets a value indicating whether or not the player can activate the femur breaker.
-
-
-
-
- Contains all informations before a player enters the pocket dimension.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
- Gets the player who's entering the pocket dimension.
-
-
-
-
- Gets the SCP-106 who sent the player to the pocket dimension.
-
-
-
-
- Gets or sets the pocket dimension position.
-
-
-
-
- Gets or sets a value indicating whether or not the player can enter the pocket dimension.
-
-
-
-
- Contains all informations before a player escapes.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
- Gets the player who's escaping.
-
-
-
-
- Gets or sets the role that will be assigned when the player escapes.
-
-
-
-
- Gets or sets a value indicating whether or not the player can escape.
-
-
-
-
- Contains all informations before a player escapes the pocket dimension.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
- Gets the player who's escaping the pocket dimension.
-
-
-
-
- Gets or sets the position in which the player is going to be teleported to.
-
-
-
-
- Gets or sets a value indicating whether or not the player can successfully escape the pocket dimension.
-
-
-
-
- Contains all informations before a grenade explodes.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
-
- Finalizes an instance of the class.
-
-
-
-
- Gets the player who thrown the grenade.
-
-
-
-
- Gets the players who could be affected by the grenade, if any, and the damage that would hurt them.
-
-
-
-
- Gets the players who could be affected by the grenade, if any.
-
-
-
-
- Gets a value indicating whether the grenade is a frag or flash grenade.
-
-
-
-
- Gets the grenade that is exploding.
-
-
-
-
- Gets or sets a value indicating whether or not the grenade can be thrown.
-
-
-
-
- Contains all informations before a player dies from walking through an incorrect exit in the pocket dimension.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
- Gets the player who's escaping the pocket dimension.
-
-
-
-
- Gets the PocketDimensionTeleport the player walked into.
-
-
-
-
- Gets or sets a value indicating whether or not the player dies by failing the pocket dimension escape.
-
-
-
-
- Contains all informations before SCP-049 finishes recalling a player.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
- Gets the player who's getting recalled.
-
-
-
-
- Gets the player who is controlling SCP-049.
-
-
-
-
- Gets or sets a value indicating whether or not the player can be recalled.
-
-
-
-
- Contains all informations before SCP-079 gains experience.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
- Gets the player who's controlling SCP-079.
-
-
-
-
- Gets the experience gain type.
-
-
-
-
- Gets or sets the amount of experience to be gained.
-
-
-
-
- Gets or sets a value indicating whether or not the experience is successfully granted.
-
-
-
-
- Contains all informations before SCP-079 gains a level.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
- Gets the player who's controlling SCP-079.
-
-
-
-
- Gets the old level of SCP-079.
-
-
-
-
- Gets or sets the new level of SCP-079.
-
-
-
-
- Gets or sets a value indicating whether or not the level is successfully granted.
-
-
-
-
- Contains all informations after activating a generator.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
- Gets the activated generator.
-
-
-
-
- Contains all informations before handcuffing a player.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
- Gets the cuffer player.
-
-
-
-
- Gets the target player to be cuffed.
-
-
-
-
- Gets or sets a value indicating whether or not the player can be handcuffed.
-
-
-
-
- Contains all informations before a player gets damaged.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
- Gets the attacker player.
-
-
-
-
- Gets the target player, who is going to be hurt.
-
-
-
-
- Gets the hit informations.
-
-
-
-
- Gets the time at which the player was hurt.
-
-
-
-
- Gets the damage type.
-
-
-
-
- Gets the tool that damaged the player.
-
-
-
-
- Gets or sets the amount of inflicted damage.
-
-
-
-
- Gets or sets a value indicating whether or not the player will be dealt damage.
-
-
-
-
- Contains all informations before a player inserts a tablet into a generator.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
- Gets the player who's inserting a tablet into the generator.
-
-
-
-
- Gets the instance.
-
-
-
-
- Gets or sets a value indicating whether or not the tablet can be inserted.
-
-
-
-
- Contains all informations after a player has interacted with an interactable.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
- Gets the player who interacted.
-
-
-
-
- Contains all informations before a player interacts with a door.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
- Gets the player who's interacting with the door.
-
-
-
-
- Gets or sets the instance.
-
-
-
-
- Gets or sets a value indicating whether or not the player can interact with the door.
-
-
-
-
- Contains all information before a player interacts with an elevator.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
- Gets the player who's interacting with the elevator.
-
-
-
-
- Gets the instance.
-
-
-
-
- Gets the instance.
-
-
-
-
- Gets the current .
-
-
-
-
- Gets the .
-
-
-
-
- Gets or sets a value indicating whether or not the player can interact with the elevator.
-
-
-
-
- Contains all informations before a player interacts with a locker.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
-
-
- Gets the player who's interacting with the locker.
-
-
-
-
- Gets the instance.
-
-
-
-
- Gets the interacting chamber.
-
-
-
-
-
-
-
- Gets the locker id.
-
-
-
-
- Gets the chamber id.
-
-
-
-
- Gets or sets a value indicating whether or not the player can interact with the locker.
-
-
-
-
- Contains all informations before SCP-079 triggers a tesla gate.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
- Gets the player who's controlling SCP-079.
-
-
-
-
- Gets the that SCP-079 is triggering.
-
-
-
-
- Gets or sets a value indicating whether or not SCP-079 can interact with the tesla gate.
-
-
-
-
- Contains all informations before a player speaks to the intercom.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
- Gets the player who's going to speak to the intercom.
-
-
-
-
- Gets or sets a value indicating whether or not the player can speak to the intercom.
-
-
-
-
- Contains all informations after a player drops an item.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
- Gets the player who dropped the item.
-
-
-
-
- Gets the dropped pickup.
-
-
-
-
- Contains all informations after a player joins the server.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
- Gets the joined player.
-
-
-
-
- Contains all informations after kicking a player from the server.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
- Gets the kicked player.
-
-
-
-
- Gets the kicked player.
-
-
-
-
- Gets or sets the kick reason.
-
-
-
-
- Gets or sets a value indicating whether the event can be executed or not.
-
-
-
-
- Contains all informations before kicking a player from the server.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
-
- Gets or sets the ban target.
-
-
-
-
- Gets or sets the ban issuer.
-
-
-
-
- Gets or sets the kick reason.
-
-
-
-
- Gets or sets the full kick message.
-
-
-
-
- Gets or sets a value indicating whether or not action is taken against the target.
-
-
-
-
- Logs the kick, anti-backdoor protection from malicious plugins.
-
- The message to be logged.
-
-
-
- Contains all player's information, after he leaves the server.
-
-
-
-
- Initializes a new instance of the class.
-
- The player who left the server.
-
-
-
- Contains informations before a report is sent to local administrators.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
- Gets the report issuer.
-
-
-
-
- Gets the report target.
-
-
-
-
- Gets or sets the report reason.
-
-
-
-
- Gets or sets a value indicating whether the report can be processed or not.
-
-
-
-
- Contains all informations before a player opens a generator.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
- Gets the player who's opening the generator.
-
-
-
-
- Gets the generator that is opening.
-
-
-
-
- Gets or sets a value indicating whether or not the generator can be opened.
-
-
-
-
- Contains all informations before a player picks up an item.
-
-
-
-
- Initializes a new instance of the class.
-
- The player who's picking up the item.
- The pickup to be picked up.
-
-
-
-
- Gets or sets a value indicating whether or not the item can be picked up.
-
-
-
-
- Contains all informations before a player interacts with SCP-330.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
- Gets the player who's interacting with SCP-330.
-
-
-
-
- Gets or sets a value indicating whether or not the player can interact with SCP-330.
-
-
-
-
- Gets or sets player's pickup counter.
-
-
-
-
- Gets or sets a value indicating whether or not the interaction should be severe.
-
-
-
-
- Gets or sets a value indicating what item will be picked up.
-
-
-
-
- Contains all informations before a player places blood.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
-
- Gets the player who's placing the blood.
-
-
-
-
- Gets or sets the blood placing position.
-
-
-
-
- Gets or sets the blood type.
-
-
-
-
- Gets or sets the blood multiplier.
-
-
-
-
- Gets or sets a value indicating whether or not the blood can be placed.
-
-
-
-
- Contains all informations before placing a decal.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
-
- Gets the decal owner.
-
-
-
-
- Gets or sets the decal position.
-
-
-
-
- Gets or sets the decal rotation.
-
-
-
-
- Gets or sets the decal type.
-
-
-
-
- Gets or sets a value indicating whether or not the decal can be placed.
-
-
-
-
- Contains all informations before pre-autenticating a player.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
-
-
- Gets the player's user id.
-
-
-
-
- Gets the reader starting position for reading the preauth.
-
-
-
-
- Gets the flags.
-
-
-
-
- Gets the player's country.
-
-
-
-
- Gets the connection request.
-
-
-
-
- Gets a value indicating whether the player can be authenticated or not.
-
-
-
-
- Delays the connection.
-
- The delay in seconds.
- Indicates whether the player has to be rejected forcefully or not.
-
-
-
- Rejects the player and redirects them to another server port.
-
- The new server port.
- Indicates whether the player has to be rejected forcefully or not.
-
-
-
- Rejects a player who's trying to authenticate.
-
- The ban reason.
- The ban expiration time.
- Indicates whether the player has to be rejected forcefully or not.
-
-
-
- Rejects a player who's trying to authenticate.
-
- The ban reason.
- The ban expiration time in .NET Ticks.
- Indicates whether the player has to be rejected forcefully or not.
-
-
-
- Rejects a player who's trying to authenticate.
-
- The instance.
- Indicates whether the player has to be rejected forcefully or not.
-
-
-
- Rejects a player who's trying to authenticate.
-
- The custom rejection reason.
- Indicates whether the player has to be rejected forcefully or not.
-
-
-
- Rejects a player who's trying to authenticate.
-
- The rejection reason.
- Indicates whether the player has to be rejected forcefully or not.
- The custom rejection reason (Banned and Custom reasons only).
- The ban expiration ticks (Banned reason only).
- The delay in seconds (Delay reason only).
- The redirection port (Redirect reason only).
-
-
-
- Disallows the connection without sending any reason. Should only be used when the connection has already been terminated by the plugin itself.
-
-
-
-
- Contains all information before a player receives a .
-
-
-
-
- Initializes a new instance of the class.
-
- The receiving the effect.
- The being added to the player.
- The state the effect is being changed to.
- The current state of the effect being changed.
-
-
-
- Gets the receiving the effect.
-
-
-
-
- Gets the being received.
-
-
-
-
- Gets or sets a value indicating whether or not the effect will be applied.
-
-
-
-
- Gets or sets a value indicating how long the effect will last.
-
-
-
-
- Gets or sets the value of the new state of the effect. Setting this to 0 is the same as setting IsAllowed to false.
-
-
-
-
- Gets the value of the current state of this effect on the player.
-
-
-
-
- Contains informations after SCP-079 recontainming.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
- Gets the player that previously controlled SCP-079.
-
-
-
-
- Contains all informations before a player's weapon is reloaded.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
- Gets the player who's reloading the weapon.
-
-
-
-
- Gets a value indicating whether only the reload animation is being reproduced or not.
-
-
-
-
- Gets or sets a value indicating whether or not the weapon can be reloaded.
-
-
-
-
- Contains all informations before freeing a handcuffed player.
-
-
-
-
- Initializes a new instance of the class.
-
- The cuffer player.
- The target player to be uncuffed.
- Indicates whether the event can be executed or not.
-
-
-
- Contains all informations before reporting a cheater.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
-
- Gets the reporter player.
-
-
-
-
- Gets the reported player.
-
-
-
-
- Gets the server id.
-
-
-
-
- Gets or sets the report reason.
-
-
-
-
- Gets or sets a value indicating whether or not the report will be sent.
-
-
-
-
- Contains all informations before spawning a wave of or .
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
- Gets the list of players that are going to be respawned.
-
-
-
-
- Gets or sets the maximum amount of respawnable players.
-
-
-
-
- Gets or sets a value indicating what the next respawnable team is.
-
-
-
-
- Gets or sets a value indicating whether or not the spawn can occur.
-
-
-
-
- Gets the current spawnable team.
-
-
-
-
- Contains all information before ending a round.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
- Gets the leading team.
-
-
-
-
- Gets or sets the round summary class list.
-
-
-
-
- Gets or sets the time to restart the next round.
-
-
-
-
- Contains all informations before sending a console message.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
-
-
-
- Gets the player who's sending the command.
-
-
-
-
- Gets the command name.
-
-
-
-
- Gets the command arguments.
-
-
-
-
- Gets a value indicating whether the command is encrypted or not.
-
-
-
-
- Gets or sets the return message, that will be shown to the user in the console.
-
-
-
-
- Gets or sets the color of the return message.
-
-
-
-
- Gets or sets a value indicating whether the event can be executed or not.
-
-
-
-
- Gets or sets a value indicating whether or not the console command can be sent.
-
-
-
-
- Contains all informations before sending a remote admin message.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
-
- Gets the sending the command.
-
-
-
-
- Gets the player who's sending the command.
-
-
-
-
- Gets the command name.
-
-
-
-
- Gets the command arguments.
-
-
-
-
- Gets or sets the message that will be returned back to the .
-
-
-
-
- Gets or sets a value indicating whether whether or not the command was a success.
-
-
-
-
- Gets or sets a value indicating whether or not the RemoteAdmin command can be sent.
-
-
-
-
- Contains all informations before a player fires a weapon.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
- Gets the player who's shooting.
-
-
-
-
- Gets the target the player's shooting at.
-
-
-
-
- Gets or sets the position of the shot.
-
-
-
-
- Gets or sets a value indicating whether or not the shot can be fired.
-
-
-
-
- Contains all informations after a player has fired a weapon.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
-
-
- Gets the player who shot.
-
-
-
-
- Gets the target of the shot.
-
-
-
-
- Gets the hitbox type of the shot.
-
-
-
-
- Gets the hitbox type of the shot.
-
-
-
-
- Gets the shot distance.
-
-
-
-
- Gets or sets the inflicted damage.
-
-
-
-
- Gets or sets a value indicating whether or not the shot can hurt the target.
-
-
-
-
- Contains all informations after the server spawns an item.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
- Gets or sets the item pickup.
-
-
-
-
- Contains all informations before spawning a player.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
- Gets the spawning player.
-
-
-
-
- Gets the player role type.
-
-
-
-
- Gets or sets the player's spawning position.
-
-
-
-
- Gets or sets the rotation y axis of the player.
-
-
-
-
- Contains all informations before the server spawns an item.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
-
- Gets or sets the item to be dropped.
-
-
-
-
- Gets or sets the position to spawn the item.
-
-
-
-
- Gets or sets the rotation to spawn the item.
-
-
-
-
- Gets or sets a value indicating whether or not the pickup will be locked.
-
-
-
-
- Gets or sets a value indicating whether or not the item can be spawned.
-
-
-
-
- Contains all informations before spawning a player ragdoll.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Gets the player who killed the owner of the ragdoll.
-
-
-
-
- Gets the owner of the ragdoll (typically the player who died).
-
-
-
-
- Gets or sets the spawning position of the ragdoll.
-
-
-
-
- Gets or sets the ragdoll rotation.
-
-
-
-
- Gets or sets the adapted ragdoll velocity.
-
-
-
-
- Gets or sets the RoleType of the ragdoll owner.
-
-
-
-
- Gets or sets the hit informations on the ragdoll.
-
-
-
-
- Gets or sets a value indicating whether or not the player can be revived by SCP-049.
-
-
-
-
- Gets or sets the ragdoll dissonance id.
-
-
-
-
- Gets or sets the ragdoll player nickname.
-
-
-
-
- Gets or sets the ragdoll player id.
-
-
-
-
- Gets or sets a value indicating whether or not the ragdoll will be spawned.
-
-
-
-
- Contains all informations before starting the warhead.
-
-
-
-
- Initializes a new instance of the class.
-
- The player who's going to start the warhead.
- Indicating whether the event can be executed or not.
-
-
-
- Gets a value indicating whether or not the nuke was set off automatically.
-
-
-
-
- Contains all informations before SCP-049 begins recalling a player.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
- Gets the player who's getting recalled.
-
-
-
-
- Gets the player who is controlling SCP-049.
-
-
-
-
- Gets or sets a value indicating whether the recall can begin.
-
-
-
-
- Contains all informations before SCP-079 uses a speaker.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
- Gets the player who's controlling SCP-079.
-
-
-
-
- Gets the room that the speaker is located in.
-
-
-
-
- Gets or sets the amount of AP that will be removed for the first time when using speakers through SCP-079.
-
-
-
-
- Gets or sets a value indicating whether or not SCP-079 can use the speaker.
-
-
-
-
- Contains all information before SCP-096 begins prying a gate open.
-
-
-
-
- Initializes a new instance of the class.
-
- The Scp096 who is triggering the event.
- The gate to be pried open.
-
-
-
- Gets the player that is controlling SCP-096.
-
-
-
-
- Gets the to be pried open.
-
-
-
-
- Gets or Sets a value indicating whether or not the gate can be pried open by SCP-096.
-
-
-
-
- Contains all informations before stopping the warhead.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
- Gets the player who's going to stop the warhead.
-
-
-
-
- Gets or sets a value indicating whether or not the warhead can be stopped.
-
-
-
-
- Contains all informations before a player cancels usage of a medical item.
-
-
-
-
- Initializes a new instance of the class.
-
- The player who's stopping the use of the medical item.
- The medical item that won't be consumed.
- The cooldown left for completing the use of the medical item.
- Whether or not the player can cancel usage of the medical item.
-
-
-
- Gets the medical item cooldown.
-
-
-
-
- Contains all informations before SCP-079 finishes using a speaker.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
- Gets the player who's controlling SCP-079.
-
-
-
-
- Gets the room that the speaker is located in.
-
-
-
-
- Gets or sets a value indicating whether or not SCP-079 can stop using the speaker.
-
-
-
-
- Contains all informations before syncing player's data with the server.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
- Gets the player of the syncing data.
-
-
-
-
- Gets the player's speed.
-
-
-
-
- Gets or sets the current player's animation.
-
-
-
-
- Gets or sets a value indicating whether or not the player's data can be synced with the server.
-
-
-
-
- Contains all informations before SCP-106 teleports using a portal.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
- Gets the player who's controlling SCP-106.
-
-
-
-
- Gets or sets the portal position.
-
-
-
-
- Gets or sets a value indicating whether or not SCP-106 can teleport using a portal.
-
-
-
-
- Contains all informations before a player throws a greande.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
- Indicates whether the event can be executed or not.
-
-
-
- Gets the player who's throwing the greande.
-
-
-
-
- Gets the instance.
-
-
-
-
- Gets the grenade id.
-
-
-
-
- Gets or sets the grenade type.
-
-
-
-
- Gets or sets a value indicating whether the throw is slow or not.
-
-
-
-
- Gets or sets the fuse time.
-
-
-
-
- Gets or sets a value indicating whether or not the grenade can be thrown.
-
-
-
-
- Contains all informations before triggering a tesla.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
- Gets the player who triggered the tesla.
-
-
-
-
- Gets or sets a value indicating whether or not the player is in hurting range.
-
-
-
-
- Gets or sets a value indicating whether or not the tesla is going to be activated.
-
-
-
-
- Contains all informations before a generator is unlocked.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
- Gets the player who's unlocking the generator.
-
-
-
-
- Gets the generator that is going to be unlocked.
-
-
-
-
- Gets or sets a value indicating whether or not the generator can be unlocked.
-
-
-
-
- Contains all informations before SCP-914 upgrades players and items.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
-
- Gets the instance.
-
-
-
-
- Gets a list of players inside SCP-914.
-
-
-
-
- Gets a list of items to be upgraded inside SCP-914.
-
-
-
-
- Gets or sets SCP-914 working knob setting.
-
-
-
-
- Gets or sets a value indicating whether or not the upgrade is successful.
-
-
-
-
- Contains all informations after a player uses a medical item.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
- Gets the player who used the medical item.
-
-
-
-
- Gets the medical item that the player consumed.
-
-
-
-
- Contains all informations before a player uses a medical item.
-
-
-
-
- Initializes a new instance of the class.
-
- The player who's going to use the medical item.
- The medical item to be used.
-
-
-
-
-
- Gets or sets the medical item cooldown.
-
-
-
-
- Gets or sets a value indicating whether or not the player can use the medical item.
-
-
-
-
- Contains all informations after the server verifies a player.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
- Gets the verified player.
-
-
-
-
- Patch and unpatch events into the game.
-
-
-
-
- The below variable is used to increment the name of the harmony instance, otherwise harmony will not work upon a plugin reload.
-
-
-
-
- The custom delegate.
-
- The type.
- The instance.
-
-
-
- The custom delegate, with empty parameters.
-
-
-
-
- Gets the plugin instance.
-
-
-
-
- Gets a list of types and methods for which EXILED patches should not be run.
-
-
-
-
- Gets a set of types and methods for which EXILED patches should not be run.
-
-
-
-
-
-
-
- Gets the instance.
-
-
-
-
-
-
-
-
-
-
- Patches all events.
-
-
-
-
- Checks the list and un-patches any methods that have been defined there. Once un-patching has been done, they can be patched by plugins, but will not be re-patchable by Exiled until a server reboot.
-
-
-
-
- Unpatches all events.
-
-
-
-
- A set of tools to execute events safely and without breaking other plugins.
-
-
-
-
- Executes all listeners safely.
-
- Event arg type.
- Source event.
- Event arg.
- Event or its arg is null.
-
-
-
- Executes all listeners safely.
-
- Source event.
- Event is null.
-
-
-
- Handles event.
-
-
-
-
- Called once the map is generated.
-
-
- This fixes an issue where
- all those extensions that
- require calling the central
- property of the Map class in
- the API were corrupted due to
- a missed call, such as before
- getting the elevator type.
-
-
-
-
- Handles some round clean-up events and some others related to players.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Handles scene unload event.
-
-
-
-
- Called once when the server changes the scene.
-
-
- This fixes the main issue with ghost mode,
- when it spams with a NRE error.
- Before that, we were clearing the cache
- on WaitForPlayers event, but
- sometimes (ordinally on silent rount restart)
- the server accepts players' tokens before
- WaitForPlayers event is called.
-
-
-
-
- Item related events.
-
-
-
-
- Invoked before the durability of an item is changed.
-
-
-
-
- Invoked before item attachments are changed.
-
-
-
-
- Called before the durability of an item is changed.
-
- The instance.
-
-
-
- Called before item attachments are changed.
-
- The instance.
-
-
-
- Map related events.
-
-
-
-
- Invoked before placing decals.
-
-
-
-
- Invoked before placing bloods.
-
-
-
-
- Invoked before announcing the light containment zone decontamination.
-
-
-
-
- Invoked before announcing an SCP termination.
-
-
-
-
- Invoked before announcing the NTF entrance.
-
-
-
-
- Invoked after a has been activated.
-
-
-
-
- Invoked before decontaminating the light containment zone.
-
-
-
-
- Invoked before damaging a window.
-
-
-
-
- Invoked before a grenade explodes.
-
-
-
-
- Invoked before an item is spawned.
-
-
-
-
- Invoked after an item is spawned.
-
-
-
-
- Invoked after the map is generated.
-
-
-
-
- Called before placing a decal.
-
- The instance.
-
-
-
- Called before placing bloods.
-
- The instance.
-
-
-
- Called before announcing the light containment zone decontamination.
-
- The instance.
-
-
-
- Called before announcing an SCP termination.
-
- The instance.
-
-
-
- Called before announcing the NTF entrance.
-
- The instance.
-
-
-
- Called after a has been activated.
-
- The instance.
-
-
-
- Called before decontaminating the light containment zone.
-
- The instance.
-
-
-
- Called before damaging a window.
-
- The instance.
-
-
-
- Called before a grenade explodes.
-
- The instance.
-
-
-
- Called before an item is spawned.
-
- The instance.
-
-
-
- Called after an item is spawned.
-
- The instance.
-
-
-
- Called after the map is generated.
-
-
-
-
- Player related events.
-
-
-
-
- Invoked before authenticating a player.
-
-
-
-
- Invoked before kicking a player from the server.
-
-
-
-
- Invoked after a player has been kicked from the server.
-
-
-
-
- Invoked before banning a player from the server.
-
-
-
-
- Invoked after a player has been banned from the server.
-
-
-
-
- Invoked after a player uses a medical item.
-
-
- Invoked after , if a player's class has
- changed during their health increase, won't fire.
-
-
-
-
- Invoked after a player dequips a medical item.
-
-
- Invoked before , if a player cancels the
- use of a medical item, won't fire.
-
-
-
-
- Invoked after a player has stopped the use of a medical item.
-
-
-
-
- Invoked after a player interacted with something.
-
-
-
-
- Invoked before spawning a player's ragdoll.
-
-
-
-
- Invoked before activating the warhead panel.
-
-
-
-
- Invoked before using a medical item.
-
-
-
-
- Invoked after a player has joined the server.
-
-
-
-
- Ivoked after a player has been verified.
-
-
-
-
- Invoked after a player has left the server.
-
-
-
-
- Invoked before destroying a player.
-
-
-
-
- Invoked before hurting a player.
-
-
-
-
- Invoked before a player dies.
-
-
-
-
- Invoked after a player died.
-
-
-
-
- Invoked before changing a player's role.
-
-
-
-
- Invoked before throwing a grenade.
-
-
-
-
- Invoked before dropping an item.
-
-
-
-
- Invoked after an item has been dropped.
-
-
-
-
- Invoked before picking up an item.
-
-
-
-
- Invoked before handcuffing a player.
-
-
-
-
- Invoked before freeing a handcuffed player.
-
-
-
-
- Invoked before a player escapes.
-
-
-
-
- Invoked before a player begins speaking to the intercom.
-
-
-
-
- Invoked after a player shoots a weapon.
-
-
-
-
- Invoked before a player shoots a weapon.
-
-
-
-
- Invoked before a player enters the pocket dimension.
-
-
-
-
- Invoked before a player escapes the pocket dimension.
-
-
-
-
- Invoked before a player fails to escape the pocket dimension.
-
-
-
-
- Invoked before a player reloads a weapon.
-
-
-
-
- Invoked before spawning a player.
-
-
-
-
- Invoked before a player enters the femur breaker.
-
-
-
-
- Invoked before syncing player's data.
-
-
-
-
- Invoked before a player's held item changes.
-
-
-
-
- Invoked before changing a player's group.
-
-
-
-
- Invoked before a player interacts with a door.
-
-
-
-
- Invoked before a player interacts with an elevator.
-
-
-
-
- Invoked before a player interacts with a locker.
-
-
-
-
- Invoked before a player triggers a tesla gate.
-
-
-
-
- Invoked before a player unlocks a generator.
-
-
-
-
- Invoked before a player opens a generator.
-
-
-
-
- Invoked before a player closes a generator.
-
-
-
-
- Invoked before a player inserts a workstation tablet into a generator.
-
-
-
-
- Invoked before a player ejects the workstation tablet out of a generator.
-
-
-
-
- Invoked before a player receives a status effect.
-
-
-
-
- Invoked before a workstation is activated.
-
-
-
-
- Invoked before a workstation is deactivated.
-
-
-
-
- Invoked before an user's mute status is changed.
-
-
-
-
- Invoked before an user's intercom mute status is changed.
-
-
-
-
- Called before pre-authenticating a player.
-
- The instance.
-
-
-
- Called before kicking a player from the server.
-
- The instance.
-
-
-
- Called after a player has been kicked from the server.
-
- The instance.
-
-
-
- Called before banning a player from the server.
-
- The instance.
-
-
-
- Called after a player has been banned from the server.
-
- The instance.
-
-
-
- Called after a player used a medical item.
-
- The instance.
-
-
-
- Called after a player dequipped a medical item.
-
- The instance.
-
-
-
- Called after a player has stopped the use of a medical item.
-
- The instance.
-
-
-
- Called after a player interacted with something.
-
- The instance.
-
-
-
- Called before spawning a player's ragdoll.
-
- The instance.
-
-
-
- Called before activating the warhead panel.
-
- The instance.
-
-
-
- Called before using a medical item.
-
- The instance.
-
-
-
- Called after a player has joined the server.
-
- The instance.
-
-
-
- Called after a player has been verified.
-
- The instance.
-
-
-
- Called after a player has left the server.
-
- The instance.
-
-
-
- Called before destroying a player.
-
- The instance.
-
-
-
- Called before hurting a player.
-
- The instance.
-
-
-
- Called before a player dies.
-
- instance.
-
-
-
- Called after a player died.
-
- The instance.
-
-
-
- Called before changing a player's role.
-
- The instance.
-
-
-
- Called before throwing a grenade.
-
- The instance.
-
-
-
- Called before dropping an item.
-
- The instance.
-
-
-
- Called after a player drops an item.
-
- The instance.
-
-
-
- Called before a user picks up an item.
-
- The instance.
-
-
-
- Called before handcuffing a player.
-
- The instance.
-
-
-
- Called before freeing a handcuffed player.
-
- The instance.
-
-
-
- Called before a player escapes.
-
- The instance.
-
-
-
- Called before a player begins speaking to the intercom.
-
- The instance.
-
-
-
- Called after a player shoots a weapon.
-
- The instance.
-
-
-
- Called before a player shoots a weapon.
-
- The instance.
-
-
-
- Called before a player enters the pocket dimension.
-
- The instance.
-
-
-
- Called before a player escapes the pocket dimension.
-
- The instance.
-
-
-
- Called before a player fails to escape the pocket dimension.
-
- The instance.
-
-
-
- Called before a player reloads a weapon.
-
- The instance.
-
-
-
- Called before spawning a player.
-
- The instance.
-
-
-
- Called before a player enters the femur breaker.
-
- The instance.
-
-
-
- Called before syncing player's data.
-
- The instance.
-
-
-
- Called before a player's held item changes.
-
- The instance.
-
-
-
- Called before changing a player's group.
-
- The instance.
-
-
-
- Called before a player interacts with a door.
-
- The instance.
-
-
-
- Called before a player interacts with an elevator.
-
- The instance.
-
-
-
- Called before a player interacts with a locker.
-
- The instance.
-
-
-
- Called before a player triggers a tesla.
-
- The instance.
-
-
-
- Called before a player unlocks a generator.
-
- The instance.
-
-
-
- Called before a player opens a generator.
-
- The instance.
-
-
-
- Called before a player closes a generator.
-
- The instance.
-
-
-
- Called before a player inserts a workstation tablet into a generator.
-
- The instance.
-
-
-
- Called before a player ejects the workstation tablet out of a generator.
-
- The instance.
-
-
-
- Called before a player receives a status effect.
-
- The instance.
-
-
-
- Called before a workstation is activated.
-
- The instance.
-
-
-
- Called before a workstation is deactivated.
-
- The instance.
-
-
-
- Called before an user's mute status is changed.
-
- The instance.
-
-
-
- Called before an user's intercom mute status is changed.
-
- The instance.
-
-
-
- SCP-049 related events.
-
-
-
-
- Invoked before SCP-049 finishes recalling a player.
-
-
-
-
- Invoked before SCP-049 begins recalling a player.
-
-
-
-
- Called before SCP-049 finishes recalling a player.
-
- The instance.
-
-
-
- Called before Scp049 starts to recall a player.
-
- The instance.
-
-
-
- SCP-079 related events.
-
-
-
-
- Invoked before SCP-079 switches cameras.
-
-
-
-
- Invoked before gaining experience with SCP-079
-
-
-
-
- Invoked before gaining levels with SCP-079
-
-
-
-
- Invoked before triggering a tesla with SCP-079.
-
-
-
-
- Invoked before triggering a door with SCP-079.
-
-
-
-
- Invoked before SCP-079 teleports using an elevator.
-
-
-
-
- Invoked before SCP-079 uses a speaker.
-
-
-
-
- Invoked before SCP-079 finishes using a speaker.
-
-
-
-
- Invoked after Scp079 recontainment.
-
-
-
-
- Called before SCP-079 switches cameras.
-
- The instance.
-
-
-
- Called before gaining experience with SCP-079.
-
- The instance.
-
-
-
- Called before gaining levels with SCP-079.
-
- The instance.
-
-
-
- Called before triggering a tesla with SCP-079.
-
- The instance.
-
-
-
- Called before interacting with a door with SCP-079.
-
- The instance.
-
-
-
- Called before SCP-079 teleports using an elevator.
-
- The instance.
-
-
-
- Called before interacting with a speaker with SCP-079.
-
- The instance.
-
-
-
- Called before SCP-079 finishes using a speaker.
-
- The instance.
-
-
-
- Called after SCP-079 is recontained.
-
- The instance.
-
-
-
- SCP-096 related events.
-
-
-
-
- Invoked before SCP-096 is enraged.
-
-
-
-
- Invoked before SCP-096 calms down.
-
-
-
-
- Invoked before adding a target to SCP-096.
-
-
-
-
- Invoked before SCP-096 begins prying open a gate.
-
-
-
-
- Called before SCP-096 is enraged.
-
- The instance.
-
-
-
- Called before SCP-096 calms down.
-
- The instance.
-
-
-
- Called before adding a target to SCP-096.
-
- The instance.
-
-
-
- Called before SCP-096 begins prying open a gate.
-
- The instance.
-
-
-
- SCP-106 related events.
-
-
-
-
- Invoked before SCP-106 creates a portal.
-
-
-
-
- Invoked before SCP-106 teleports using a portal.
-
-
-
-
- Invoked before containing SCP-106.
-
-
-
-
- Called before SCP-106 creates a portal.
-
- The instance.
-
-
-
- Called before SCP-106 teleports using a portal.
-
- The instance.
-
-
-
- Called before containing SCP-106.
-
- The instance.
-
-
-
- SCP-173 related events.
-
-
-
-
- Invoked before players near SCP-173 blink.
-
-
-
-
- Called before players near SCP-173 blink.
-
- The instance.
-
-
-
- Handles SCP-914 related events.
-
-
-
-
- Invoked before SCP-914 upgrades players and items.
-
-
-
-
- Invoked before activating the SCP-914 machine.
-
-
-
-
- Invoked before changing the SCP-914 machine knob setting.
-
-
-
-
- Called before SCP-914 upgrades players and items.
-
- The instance.
-
-
-
- Called before activating the SCP-914 machine.
-
- The instance.
-
-
-
- Called before changing the SCP-914 machine knob setting.
-
- The instance.
-
-
-
- Server related events.
-
-
-
-
- Invoked before waiting for players.
-
-
-
-
- Invoked after the start of a new round.
-
-
-
-
- Invoked before ending a round.
-
-
-
-
- Invoked after the end of a round.
-
-
-
-
- Invoked before the restart of a round.
-
-
-
-
- Invoked when a player reports a cheater.
-
-
-
-
- Invoked before respawning a wave of Chaos Insurgency or NTF.
-
-
-
-
- Invoked when sending a command through the in-game console.
-
-
-
-
- Invoked when sending a command through the Remote Admin console.
-
-
-
-
- Invoked when sending a complaint about a player to the local server administrators.
-
-
-
-
- Invoked after the "reload configs" command is ran.
-
-
-
-
- Invoked after the "reload gameplay" command is ran.
-
-
-
-
- Invoked after the "reload remoteadminconfigs" command is ran.
-
-
-
-
- Called before waiting for players.
-
-
-
-
- Called after the start of a new round.
-
-
-
-
- Called before ending a round.
-
- The instance.
-
-
-
- Called after the end of a round.
-
- The instance.
-
-
-
- Called before restarting a round.
-
-
-
-
- Called when a player reports a cheater.
-
- The instance.
-
-
-
- Called before respawning a wave of Chaso Insurgency or NTF.
-
- The instance.
-
-
-
- Called when sending a command through in-game console.
-
- The instance.
-
-
-
- Called when sending a command through the Remote Admin console.
-
- The instance.
-
-
-
- Called when sending a complaint about a player to the local server administrators.
-
- The instance.
-
-
-
- Called after the "reload configs" command is ran.
-
-
-
-
- Called after the "reload gameplay" command is ran.
-
-
-
-
- Called after the "reload remoteadminconfigs" command is ran.
-
-
-
-
- Handles warhead related events.
-
-
-
-
- Invoked before stopping the warhead.
-
-
-
-
- Invoked before starting the warhead.
-
-
-
-
- Invoked after the warhead has been detonated.
-
-
-
-
- Invoked before changing the warhead lever status.
-
-
-
-
- Called before stopping the warhead.
-
- The instance.
-
-
-
- Called before starting the warhead.
-
- The instance.
-
-
-
- Called after the warhead has been detonated.
-
-
-
-
- Called before changing the warhead lever status.
-
- The instance.
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patch the .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the and events.
-
-
-
-
- Patch the .
- Adds the event.
-
-
-
-
- Patch the .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the and events.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patch the .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patch the .
- Adds the event.
-
-
-
-
- Patches .
- Adds the and events.
-
-
-
-
- Patch the .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the and event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the and events.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Handle the player connection.
-
- The instance.
-
-
-
- Patches the method.
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the and events.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches a method, the class in which it's defined, is compiler-generated, .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the and event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the , , and event for SCP-079.
-
-
-
-
- Prefix of .
-
- The instance.
- The command to be executed.
- The target game object.
- Returns a value indicating whether the original method has to be executed or not.
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches the method.
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patch the .
- Adds the event.
-
-
-
-
- Patches .
- Adds the RestartingRound event.
-
-
-
-
- Patches .
- Adds the and event.
-
-
-
-
- Patches .
- Adds the RoundStarted event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches a method, the class in which it's defined, is compiler-generated, .
- Adds the WaitingForPlayers event.
-
-
-
-
- Patches .
- Adds the WarheadDetonated event.
-
-
-
-
- Patch the .
- Adds the event.
-
-
-
-
- Patch the .
- Adds the event.
-
-
-
-
- Patches .
- Adds the event.
-
-
-
-
- Patches .
- Fixes triggering due to the R.2 code by using the Y coordinate from the player's scale to multiply the offset.
-
-
-
-
- Patches .
- Fixes triggering due to the R.3 code by using the Y coordinate from the player's scale to multiply the offset.
-
-
-
-
- Fixes property.
-
-
-
-
- Fixes property.
-
-
-
-
- Fixes property.
-
-
-
-
- Fixes method.
-
-
-
-
- Patches .
-
-
-
-
- Patches .
-
-
-
-
- Patches the property.
-
-
-
-
- Patches .
-
-
-
-
- Patch the .
-
-
-
-
- Patches .
-
-
-
-
- An implementation of that
- allows to get two elements in one move.
- Very useful in patches.
-
-
-
-
-
- Initializes a new instance of the class.
-
- The innner .
-
-
-
-
-
-
- Gets the next element in the collection.
- Might be null if there's no element after .
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/packages/EXILED.2.2.4/lib/net472/Exiled.Loader.xml b/packages/EXILED.2.2.4/lib/net472/Exiled.Loader.xml
deleted file mode 100644
index 3395ded..0000000
--- a/packages/EXILED.2.2.4/lib/net472/Exiled.Loader.xml
+++ /dev/null
@@ -1,318 +0,0 @@
-
-
-
- Exiled.Loader
-
-
-
-
- The configs of the loader.
-
-
-
-
-
-
-
- Gets or sets a value indicating whether outdated plugins should be loaded or not.
-
-
-
-
- Gets or sets the environment type.
-
-
-
-
- Used to handle plugin configs.
-
-
-
-
- Gets the config serializer.
-
-
-
-
- Gets the config serializer.
-
-
-
-
- Loads all plugin configs.
-
- The raw configs to be loaded.
- Returns a dictionary of loaded configs.
-
-
-
- Reads, Loads and Saves plugin configs.
-
- Returns a value indicating if the reloading process has been completed successfully or not.
-
-
-
- Saves plugin configs.
-
- The configs to be saved, already serialized in yaml format.
- Returns a value indicating whether the configs have been saved successfully or not.
-
-
-
- Saves plugin configs.
-
- The configs to be saved.
- Returns a value indicating whether the configs have been saved successfully or not.
-
-
-
- Read all plugin configs.
-
- Returns the read configs.
-
-
-
- Clears the configs.
-
- Returns a value indicating whether configs have been cleared successfully or not.
-
-
-
- Reloads RemoteAdmin configs.
-
-
-
-
- Spurce: https://dotnetfiddle.net/8M6iIE.
-
-
-
-
- Initializes a new instance of the class.
-
- The inner type description instance.
-
-
-
-
-
-
- Source: https://dotnetfiddle.net/8M6iIE.
-
-
-
-
- Initializes a new instance of the class.
-
- The inner descriptor instance.
- The comment to be written.
-
-
-
- Gets the comment to be written.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Source: https://dotnetfiddle.net/8M6iIE.
-
-
-
-
- Initializes a new instance of the class.
-
- The next visitor instance.
-
-
-
-
-
-
- Source: https://dotnetfiddle.net/8M6iIE.
-
-
-
-
- Initializes a new instance of the class.
-
- The base descriptor instance.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Basic configs validation.
-
-
-
-
- Initializes a new instance of the class.
-
- The node deserializer instance.
-
-
-
-
-
-
- This class implements all possible MultiAdmin features.
-
-
-
-
- Comparator implementation according to plugin priorities.
-
-
-
-
- Public instance.
-
-
-
-
-
-
-
- Used to handle plugins.
-
-
-
-
- Gets the plugins list.
-
-
-
-
- Gets a dictionary containing the file paths of assemblies.
-
-
-
-
- Gets the initialized global random class.
-
-
-
-
- Gets the version of the assembly.
-
-
-
-
- Gets the configs of the plugin manager.
-
-
-
-
- Gets a value indicating whether the debug should be shown or not.
-
-
-
-
- Gets plugin dependencies.
-
-
-
-
- Runs the plugin manager, by loading all dependencies, plugins, configs and then enables all plugins.
-
- The dependencies that could have been loaded by Exiled.Bootstrap.
-
-
-
- Loads all plugins.
-
-
-
-
- Loads an assembly.
-
- The path to load the assembly from.
- Returns the loaded assembly or null.
-
-
-
- Create a plugin instance.
-
- The plugin assembly.
- Returns the created plugin instance or null.
-
-
-
- Enables all plugins.
-
-
-
-
- Reloads all plugins.
-
-
-
-
- Disables all plugins.
-
-
-
-
- Loads all dependencies.
-
-
-
-
- Contains the extensions to get a path.
-
-
-
-
- Gets a path of an assembly.
-
- The .
- The provided assembly is null.
- The path of the assembly or null.
-
-
-
- Gets a path of a plugin.
-
- The .
- The provided plugin is null.
- The path of the plugin or null.
-
-
-
diff --git a/packages/EXILED.2.2.4/lib/net472/Exiled.Permissions.xml b/packages/EXILED.2.2.4/lib/net472/Exiled.Permissions.xml
deleted file mode 100644
index b9bde10..0000000
--- a/packages/EXILED.2.2.4/lib/net472/Exiled.Permissions.xml
+++ /dev/null
@@ -1,283 +0,0 @@
-
-
-
- Exiled.Permissions
-
-
-
-
- Adds a permission to a group.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Adds a group to permissions.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Handles commands about permissions groups.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Removes a group to permissions.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Handles commands about permissions.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Reloads all permissions.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Removes a permission from a group.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
- Gets a value indicating whether the debug should be shown or not.
-
-
-
-
- Gets the permissions folder path.
-
-
-
-
- Gets the permissions full path.
-
-
-
-
-
-
-
-
-
-
- Gets groups list.
-
-
-
-
- Gets the default group.
-
-
-
-
- Create permissions.
-
-
-
-
- Reloads permissions.
-
-
-
-
- Save permissions.
-
-
-
-
- Checks a sender's permission.
-
- The sender to be checked.
- The permission to be checked.
- Returns a value indicating whether the user has the permission or not.
-
-
-
- Checks a sender's permission.
-
- The sender to be checked.
- The permission to be checked.
- Returns a value indicating whether the user has the permission or not.
-
-
-
- Checks a player's permission.
-
- The player to be checked.
- The permission to be checked.
- true if the player's current or native group has permissions; otherwise, false.
-
-
-
- Represents a player's group.
-
-
-
-
- Gets or sets a value indicating whether group is the default one or not.
-
-
-
-
- Gets or sets the group inheritance.
-
-
-
-
- Gets or sets the group permissions.
-
-
-
-
- Gets the combined permissions of the group plus all inherited groups.
-
-
-
-
- Handles all plugin-related permissions, for executing commands, doing actions and so on.
-
-
-
-
- Gets the permissions instance.
-
-
-
-
-
-
-
-
-
-
- Classe di risorse fortemente tipizzata per la ricerca di stringhe localizzate e così via.
-
-
-
-
- Restituisce l'istanza di ResourceManager nella cache utilizzata da questa classe.
-
-
-
-
- Esegue l'override della proprietà CurrentUICulture del thread corrente per tutte le
- ricerche di risorse eseguite utilizzando questa classe di risorse fortemente tipizzata.
-
-
-
-
- Cerca una risorsa localizzata di tipo System.Byte[].
-
-
-
-
diff --git a/packages/EXILED.2.2.4/lib/net472/Exiled.Updater.xml b/packages/EXILED.2.2.4/lib/net472/Exiled.Updater.xml
deleted file mode 100644
index 21c3562..0000000
--- a/packages/EXILED.2.2.4/lib/net472/Exiled.Updater.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
- Exiled.Updater
-
-
-
-
-
-
-
-
-
-
- Gets a value indicating whether testing releases have to be downloaded or not.
-
-
-
-
- Gets a value that indicates which assemblies should be excluded from the update.
-
-
-
-
-
-
-
-
-
-