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) Releases + # 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. - - - - - - - - - -