Giter Site home page Giter Site logo

exiled-team / exiled Goto Github PK

View Code? Open in Web Editor NEW
259.0 13.0 173.0 55.33 MB

A high-level plugin framework for SCP: Secret Laboratory servers. It offers an event system for developers to hook in order to manipulate or change game code, or implement their own functions.

Home Page: https://www.exiled.to/

License: Other

C# 99.90% PowerShell 0.10%
plugin scp-sl exiled harmony yaml csharp unity mono nwapi

exiled's Introduction

EXILED - EXtended In-runtime Library for External Development

EXILED is a high-level plugin framework for SCP: Secret Laboratory servers. It offers an event system for developers to hook into in order to manipulate or change game code or implement their own functions. All EXILED events are coded with Harmony, meaning they require no direct editing of server assemblies to function, which allows for two unique benefits.

  • Firstly, the entirety of the framework’s code can be freely published and shared, allowing developers to better understand how it works and offer suggestions for adding to or changing its features.
  • Secondly, since all the code related to the framework is done outside of the server assembly, things like small game updates will have little, if any, effect on the framework. Making it most likely to be compatible with future game updates, as well as making it easier to update when it is necessary to do so.

Localized READMEs

Installation

Installation of EXILED is quite simple. It loads itself through Northwood’s Plugin API. That's why there are two folders inside the Exiled.tar.gz in release files. SCP Secret Laboratory contains the necessary files to load EXILED features in EXILED folder. All you need to do is move these two folders into the appropriate path, which are explained below, and you are done!

If you choose to use the installer it will, if run correctly, take care of installing all EXILED features.

Windows

Automatic installation (more information)

Note: Make sure you're on the user that runs the server, or you have Admin privileges before running the Installer.

  • Download the Exiled.Installer-Win.exe from here (click on Assets -> click the Installer)
  • Place it on your server folder (download the dedicated server if you haven't)
  • Double click the Exiled.Installer.exe or download this .bat and place it in the server folder to install the latest pre-release
  • To get and install plugins, check the Installing plugins section down below. Note: If you are installing EXILED on a remote server, make sure you run the .exe as the same user that runs your SCP:SL servers (or one with Admin privileges)

Manual installation

  • Download the Exiled.tar.gz from here
  • Extract its contents with 7Zip or WinRar
  • Move the EXILED folder to %appdata% Note: This folder needs to go in C:\Users\%UserName%\AppData\Roaming, and NOT C:\Users\%UserName%\AppData\Roaming\SCP Secret Laboratory, and IT MUST be in (...)\AppData\Roaming, not (...)\AppData!
  • Move SCP Secret Laboratory to %appdata%.
    • Windows 10 & 11: Write %appdata% in Cortana / the search icon, or the Windows Explorer bar.
    • Any other Windows version: Press Win + R and type %appdata%

Installing plugins

That's it, EXILED should now be installed and active the next time you boot up your server. Note that EXILED by themselves will do almost nothing, so make sure to get new plugins from our Discord server

  • To install a plugin, simply:
    • Download a plugin from their releases page (it MUST be a .dll!)
    • Move it to: C:\Users\%UserName%\AppData\Roaming\EXILED\Plugins (move here by pressing Win + R, then writing %appdata%)

Linux

Automatic installation (more information)

Note: If you are installing EXILED on a remote server, make sure you run the Installer as the same user that runs your SCP:SL servers (or root)

  • Download the Exiled.Installer-Linux from here (click on Assets -> download the Installer)
  • Install it by either typing ./Exiled.Installer-Linux --path /path/to/server or move it inside the server folder directly, move to it with the terminal (cd) and type: ./Exiled.Installer-Linux.
  • If you want the latest pre-release, simply add --pre-releases. Example: ./Exiled.Installer-Linux /home/scp/server --pre-releases
  • Another example, if you placed Exiled.Installer-Linux in your server folder: /home/scp/server/Exiled.Installer-Linux --pre-releases
  • To get and install plugins, check the Installing plugins section down below.

Manual installation

  • Ensure you are logged in on the user that runs the SCP servers.
  • Download the Exiled.tar.gz from here (SSH: right click and to get the Exiled.tar.gz link, then type: wget (link_to_download))
  • To extract it to your current folder, type tar -xzvf EXILED.tar.gz
  • Move the EXILED folder to ~/.config. Note: This folder needs to go in ~/.config, and NOT ~/.config/SCP Secret Laboratory (SSH: mv EXILED ~/.config/)
  • Move the SCP Secret Laboratory folder to ~/.config. Note: This folder needs to go in ~/.config, and NOT ~/.config/SCP Secret Laboratory (SSH: mv SCP Secret Laboratory ~/.config/)

Installing plugins

That's it, EXILED should now be installed and active the next time you boot up your server. Note that EXILED by themselves will do almost nothing, so make sure to get plugins from our Discord server

  • To install a plugin, simply:
    • Download a plugin from their releases page (it MUST be a .dll!)
    • Move it to: ~/.config/EXILED/Plugins (if you use your SSH as root, then search for the correct .config which will be inside /home/(SCP Server User))

Config

EXILED by itself offers some config options. All of them are auto-generated at the server startup, they are located at ~/.config/EXILED/Configs/(ServerPortHere)-config.yml file (%AppData%\EXILED\Configs\(ServerPortHere)-config.yml on Windows).

Plugin configs will NOT be in the aforementioned config_gameplay.txt file, instead, plugin configs are set in the ~/.config/EXILED/Configs/(ServerPortHere)-config.yml file (%AppData%\EXILED\(ServerPortHere)-config.yml on Windows). However, some plugins might get their config settings from other locations on their own, this is simply the default EXILED location for them, so refer to the individual plugin if there are issues.

For Developers

If you wish to make a plugin for EXILED, it's quite simple to do so. If you would like more of a tutorial please visit our Getting Started Page..

For more comprehensive and actively updated tutorials, see the EXILED website.

But make sure to follow these rules when publishing your plugins:

  • Your plugin must contain a class that inherits from Exiled.API.Features.Plugin<>, if it does not, EXILED will not load your plugin when the server starts.
  • When a plugin is loaded, the code within the aforementioned class' OnEnabled() method is executed immediately, it does not wait for other plugins to be loaded. It does not wait for the server startup process to finish. It does not wait for anything. When setting up your OnEnabled() method, be sure you are not accessing things which may not be initialized by the server yet, such as ServerConsole.Port, or PlayerManager.localPlayer.
  • If you need to access things early on that are not initialized before your plugin is loaded, it is recommended to wait for the WaitingForPlayers event to do so, if you need to do things sooner, wrap the code in a while(!x) loop that checks for the variable/object you need to no longer be null before continuing.
  • EXILED supports dynamically reloading plugin assemblies mid-execution, meaning that if you need to update a plugin, it can be done without rebooting the server, however, if you are updating a plugin mid-execution, the plugin needs to be properly setup to support it, or you will have a very bad time. Refer to the Dynamic Updates section for more information and guidelines to follow.
  • There is NO OnUpdate, OnFixedUpdate or OnLateUpdate event within EXILED. If you need to run code that often, you can use a MEC coroutine that waits for one frame, 0.01f, or use a Timing layer like Timing.FixedUpdate instead.

MEC Coroutines

If you are unfamiliar with MEC, this will be a very brief and simple primer to get you started. MEC Coroutines are basically timed methods, that support waiting periods of time before continuing execution, without interrupting/sleeping the main game thread. MEC coroutines are safe to use with Unity, unlike traditional threading. DO NOT try and make new threads to interact with Unity on, they WILL crash the server.

To use MEC, you will need to reference Assembly-CSharp-firstpass.dll from the server files and include using MEC;. Example of calling a simple coroutine, that repeats itself with a delay between each loop:

using MEC;
using Exiled.API.Features;

public void SomeMethod()
{
    Timing.RunCoroutine(MyCoroutine());
}

public IEnumerator<float> MyCoroutine()
{
    for (;;) //repeat the following infinitely
    {
        Log.Info("Hey I'm a infinite loop!"); //Call Log.Info to print a line to the game console/server logs.
        yield return Timing.WaitForSeconds(5f); //Tells the coroutine to wait 5 seconds before continuing, since this is at the end of the loop, it effectively stalls the loop from repeating for 5 seconds.
    }
}

It is strongly recommended that you do some googling or ask around in the Discord if you are unfamiliar with MEC and would like to learn more, get advice, or need help. Questions, no matter how 'stupid' they are, will always be answered as helpfully and clearly as possible to help plugin developers to excel. Better code is better for everyone.

Dynamic Updates

EXILED as a framework supports dynamic reloading of plugin assemblies without requiring a server reboot. For example, if you start the server with just Exiled.Events as the only plugin, and wish to add a new one, you do not need to reboot the server to complete this task. You can simply use the Remote Admin or Server Console command reload plugins to reload all EXILED plugins, including new ones that weren't loaded before.

This also means that you can update plugins without having to fully reboot the server as well. However, there are a few guidelines that must be followed by the plugin developer for this to be achieved properly:

For Hosts

  • If you are updating a plugin, make sure that its assembly name is not the same as the current version you have installed (if any). The plugin must be built by the developer with Dynamic Updates in mind for this to work, simply renaming the file will not.
  • If the plugin supports dynamic updates, be sure that when you put the newer version of the plugin into the "Plugins" folder, you also remove the older version from the folder before reloading EXILED, failure to ensure this will result in many bad things.
  • Any problems that arise from dynamically updating a plugin are solely the responsibility of you and the developer of the plugin in question. While EXILED fully supports and encourages dynamic updates, the only way it could fail or go wrong is if the server host or plugin dev did something wrong. Verify that everything was done correctly by both of those parties before reporting a bug to EXILED developers regarding dynamic updates.

For Developers

  • Plugins that want to support dynamic updating need to be sure to unsubscribe from all events they are hooked into when they are disabled or reloaded.
  • Plugins that have custom Harmony patches must use some kind of changing variable within the name of the Harmony Instance, and must UnPatchAll() on their harmony instance when the plugin is disabled or reloaded.
  • Any coroutines started by the plugin in OnEnabled() must also be killed when the plugin is disabled or reloaded.

All of these can be achieved in either the OnReloaded() or OnDisabled() methods in the plugin class. When EXILED reloads plugins, it calls OnDisabled(), then OnReloaded(), then it will load in the new assemblies, and then executes OnEnabled().

Note that it’s new assemblies. If you replace an assembly with another one of the same name, it will NOT be updated. This is due to the GAC (Global Assembly Cache), if you attempt to 'load' and assembly that is already in the cache, it will always use the cached assembly instead. For this reason, if your plugin supports dynamic updates, you must build each version with a different assembly name in the build options (renaming the file will not work). Also, since the old assembly is not "destroyed" when it is no longer needed, if you fail to unsubscribe from events, unpatch your harmony instance, kill coroutines, etc., that code will continue to run as well as the new version's code. This is an extremely bad idea to let happen.

As such, plugins that support dynamic updates MUST follow these guidelines or they will be removed from the discord server due to potential risk to server hosts.

Not every plugin must support dynamic updates. If you do not intend to support dynamic updates, that's perfectly fine. Just avoid changing the assembly name of your plugin when you build a new version. In such cases make sure server hosts know they will need to completely reboot their servers to update your plugin.

exiled's People

Contributors

arithfeather avatar cyanox62 avatar dgvagabond avatar fruitboi avatar gabirp avatar gamehunt avatar iopietro avatar iracle1 avatar irebbok avatar jeppevinkel avatar jesus-qc avatar joker-119 avatar kade-github avatar louis1706 avatar lufou avatar marco15453 avatar michal78900 avatar misaka-zerotwo avatar naounderscore avatar pintthedragon avatar rayzerbrain avatar remuchi avatar rintheweeb avatar rogerfk avatar sanyae2439 avatar sebascapo avatar thundermaker300 avatar valera771 avatar vladislav-cs avatar xnexusacs avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

exiled's Issues

Banned from discord?

No idea why I was banned from the discord but I was. Maybe I got mad at someone who said I had a small brain?

Feature: Standardize output of plugin loading

When a server starts up, it seems plugins send their own messages to mark they are enabled, making it difficult for debugging when installing new plugins. EXILED should output a list of all plugins as they are loaded/enabled.

Please forgive me if this request is nonsense as I am unfamiliar with plugin development for EXILED as well as C#.

Issue

** [Exiled.Loader] An error has occurred while loading configs! YamlDotNet.Core.SemanticErrorException: (Line: 120, Col: 3, Idx: 4169) - (Line: 120, Col: 3, Idx: 4169): While parsing a block mapping, did not find expected key.**

EXILED 2.0.0 CurrentRoom.Zone

Seems to incorrectly determine the current zone of the player’s room
Annotation 2020-06-08 190007

And yes, about the Player.Died event, it defines ev.Target.Team is rip, not team when he died.

[ERROR] [Exiled.Updater] #

image

I once submitted this question to other plugins ....
Because this problem appears intermittently that affects my judgment.

Really appreciate your help
:)

Please rename "Exiled Permissions" to just "Permissions" in .config\EXILED\Plugins

Sorry for the premature creation of the issue and issue name spam, spilled rum on my keyboard and since then the keys have been sticking. Tried to clean it with Denatured Alcohol but it looks like the \ and Enter button are still getting stuck together.

Anyway, thank you so much for putting the Plugins folder inside the EXILED folder. This makes a lot more sense in terms of directory structure, more neat and orderly.

While you're changing the directory structure, could you please rename the "Exiled Permissions" folder to just "Permissions", or will the "permissions.yml" file be moved to the new EXILED\Configs folder?

Having a space in a directory can be a bitch on Linux, as I found out to my chagrin for a file in on Smod2.

ev.Thrower in ExplodingGrenadeEventArgs is null.

Hey there,

ev.Thrower in ExplodingGrenadeEventArgs is always null - and I'm not sure if it's meant to be null.

Reproduction:

  • Create a handler for ExplodingGrenadeEventArgs.
  • Try and use ev.Thrower for something.

I'm not sure if I'm doing it wrong. Here's an example piece of code

public void OnExplodingGrenade(ExplodingGrenadeEventArgs ev)
{
    //stuff
    ev.Thrower.Hurt(10f, DamageTypes.Grenade, "test"); //this will return an "NullReferenceException" error
}

Thanks.

EXILED not working

Today, there was an update to the server files, and it seems like EXILED has broken with this. If you attempt to run the "SCPSL.exe" file, it will ask for the port normally, then the Unity crash app will open. After, the application crashes

Something strange

At the same time, the same IP addresses are constantly duplicated in my console. I get this error quite often when the round is restarted.
Безымянный
Sometimes this happens.
Снимок
If the reason is not EXILED, then could you tell me where to look for the reason?

096's rage duration does not have 30s cap

The rage time is supposed to be capped at 30 seconds as of 10.1. Exiled ignores this entirely and simply keeps adding it up. It should be 15 seconds to start, with 3 additional seconds per aggravator, up to a max bonus of 15, for a grand total of 30.

Ban followup

I know that I got mad and said “fuck off”, but these contributors who didn’t actually tell me where to post the issue were just reacting to my messages with :shrinkingbrain: which kind of made me mad because I still had no idea where to go for support. I assumed it was a bug report because I wasn’t able to launch the game. Only then was I told to go to plugin support but I didn’t think I would get support there (since it’s for plugins). I’m honestly sorry I would rather just move past this because I wanna keep using exiled and its plugins.

CurrentRoom.Zone and Round.ElapsedTime

Exiled 2.0.1
#124 Not fixed CurrentRoom.Zone, It defines zone as surface.
zone
Round.ElapsedTime why does it give 00:00:00, but if you write rtime then everything is fine.
rtime
Also Config does not generate static variables
staticcfg

grenade chain explosions are broken

custom grenades spawn as as if they were thrown as oposed to the normal instant chain explosions and normal grenades dont have chain explosions at all

`reload configs` tries to load configs twice, throws exception, fails to reload configs

I got this when trying to reload my configs. I have two SCP:SL servers on this box so that might be causing this.

[2020-09-07 20:46:25.080 -05:00] >>> reload configs
[2020-09-07 20:46:25.102 -05:00] [INFO] [Exiled.Loader] Loading plugin configs...
[2020-09-07 20:46:25.115 -05:00] [WARN] [Exiled.Loader] Exiled.Events doesn't have default configs, generating...
[2020-09-07 20:46:25.125 -05:00] [WARN] [Exiled.Loader] Exiled.Events doesn't have default configs, generating...
[2020-09-07 20:46:25.138 -05:00] [ERROR] [Exiled.Loader] An error has occurred while loading configs! System.ArgumentException: An item with the same key has already been added. Key: exiled_events
  at System.Collections.Generic.Dictionary`2[TKey,TValue].TryInsert (TKey key, TValue value, System.Collections.Generic.InsertionBehavior behavior) [0x000c1] in <437ba245d8404784b9fbab9b439ac908>:0
  at System.Collections.Generic.Dictionary`2[TKey,TValue].Add (TKey key, TValue value) [0x00000] in <437ba245d8404784b9fbab9b439ac908>:0
  at Exiled.Loader.ConfigManager.Load (System.String rawConfigs) [0x000f5] in <d8361f45551f4f888ef238f47eadc446>:0
[2020-09-07 20:46:25.151 -05:00] Plugin configs have been reloaded successfully!

It does not reload plugins successfully. Here's what I did to test:

  1. Change SCP-173's health to 6000 in Common Utils.
  2. Run reload configs.
  3. Spawn in as 173. Health not updated. Waited until next round. Still no update.

There are a lot of mistakes.

1-3. I don’t know what it’s connected with. Perhaps with better sinkholes. I wanted to clarify here to whom I should write.
1
2
3
4. I don't know what it is. What kind of plugin could it be?
4
5-7. Perhaps this is due to the recently updated "common utilities". "common utilities 1.0.3 5fc1947" worked well. I'm not sure about new versions. Perhaps these are errors of the "friendly fire" built into the server.
5
6
7
8. List of plugins that I use.
8

Do you really think you should be banned for this forever? I have a lot of plugin bug reports that I don't know where to upload. I don't even fully understand why the ban is. For racism (which was not) or for what I wrote in a channel not intended for this?

About racism. You have double standards. Many people in Russia communicate like that. It turns out that by banning me, do you have something against our communication style? You generally have a strange concept of racism. When I call someone stupid because of obvious attacks in my direction, it is not racism. This is protection. In any case, the racism that is correct (wiki to help you), I am against it.

About the fact that we communicated in a channel not intended for communication, I agree. But in any case, this is not a reason to ban forever.

Connection issue

It wont let me connect over the IP (when i connect the % stays at 0)

Add optional translation config

Adding the ability to translate messages can be very helpful to a lot of plugins, but will clutter up the config significantly. This is why I propose there be a separate config for translations, that plugins are not required to use. Before, I'd like to define what might go inside of the translation config, and what can be left out of it:

Messages used inside of plugins should go inside of the translation config. These messages help certain plugin features, but are not a feature themselves.
Custom broadcast/hint messages should be inside of the plugin config. These exist as plugin features on their own, and shouldn't be with the other translations. There are very few of these types of messages, so they won't clutter the config and won't get mixed up with the other translations.

Translations can be implemented as follows:

IPlugin/Plugin is given a new property, of type ITranslation, which is default to null.
A new interface called ITranslation, similar to IConfig is created, although it does not include is_enabled.
Where the config manager loads configs, it also loads translations from a separate translations file, ignoring plugins that have null translations.

This should be an easy-to-implement feature, as most of what is required already exists in the config manager, and will make translating plugins much easier.

SCP-106 cannot capture players running 2.6.1-beta (Exiled.Events.dll)

I just spend the past 2 hours deleting every single plugin from my server, and finally I figured out that if I deleted Exiled.Events.dll, SCP-106 could capture members again, but if I keep Exiled.Events.dll on the server even by itself, he can't capture anyone.

I would try downgrading to 2.5.0 but it has no download. I also tried 2.4.4-beta and the game process went on a crash loop.

ERROR

[ERROR] [Exiled.API] An error has occurred while registering a command: System.ArgumentException: An item with the same key has already been added. Key: di
at System.Collections.Generic.Dictionary2[TKey,TValue].TryInsert (TKey key, TValue value, System.Collections.Generic.InsertionBehavior behavior) [0x000c1] in <9577ac7a62ef43179789031239ba8798>:0 at System.Collections.Generic.Dictionary2[TKey,TValue].Add (TKey key, TValue value) [0x00000] in <9577ac7a62ef43179789031239ba8798>:0
at CommandSystem.CommandHandler.RegisterCommand (CommandSystem.ICommand command) [0x0008b] in <445724aca0854baf9bac580cf29e2327>:0
at Exiled.API.Features.Plugin1[TConfig].OnRegisteringCommands () [0x000e7] in <2a4ff9bb51e04f8abecbafeb85c4c1fa>:0 [2021-04-18 00:18:25.119 -04:00] [ERROR] [Exiled.API] An error has occurred while registering a command: System.ArgumentException: An item with the same key has already been added. Key: di at System.Collections.Generic.Dictionary2[TKey,TValue].TryInsert (TKey key, TValue value, System.Collections.Generic.InsertionBehavior behavior) [0x000c1] in <9577ac7a62ef43179789031239ba8798>:0
at System.Collections.Generic.Dictionary2[TKey,TValue].Add (TKey key, TValue value) [0x00000] in <9577ac7a62ef43179789031239ba8798>:0 at CommandSystem.CommandHandler.RegisterCommand (CommandSystem.ICommand command) [0x0008b] in <445724aca0854baf9bac580cf29e2327>:0 at Exiled.API.Features.Plugin1[TConfig].OnRegisteringCommands () [0x0010d] in <2a4ff9bb51e04f8abecbafeb85c4c1fa>:0

I have suggest.

I would like to suggest that all plugins have a general view of how the config should look. Just for the beauty of the config. I understand that many of these things work anyway, but it would remove a lot of unnecessary questions and just make the config cleaner and more beautiful.
More details here:
Cassie:
image
If cassie should be silent:
image
And this example is essentially the same not entirely correct. By sound logic, it should be like this:
image

BroadCast
image
And this
image

Other:
image

Lists:
image

Perhaps for some it will seem nonsense. But why not just bring the whole config back to normal. It would be cool.

[ERROR] [Exiled.Loader]

ok,
image
[ERROR] [Exiled.Loader] Error while initializing plugin at ! System.Reflection.ReflectionTypeLoadException: Exception of type 'System.Reflection.ReflectionTypeLoadException' was thrown.
at (wrapper managed-to-native) System.Reflection.Assembly.GetTypes(System.Reflection.Assembly,bool)
at System.Reflection.Assembly.GetTypes () [0x00000] in <437ba245d8404784b9fbab9b439ac908>:0
at Exiled.Loader.Loader.CreatePlugin (System.Reflection.Assembly assembly) [0x00000] in :0

Someone knows what the problem is? : )

Path can't be null or whitespace even though it's declared with Linux Installer

Installer CLI complains that the path is null despite it being declared.

[email protected]
System.ArgumentException: Path cannot be the empty string or all whitespace. (Parameter 'path')
   at System.IO.Directory.CreateDirectory(String path)
   at Exiled.Installer.Program.MainSafe(CommandSettings args)
Read the exception message, read the readme, and if you still don't understand what to do, then contact #support in our discord server with the attached screenshot of the full exception```

Server is running Ubuntu 18.04, and SCP:SL is already installed. 

096 does not gain extra rage per target when targets are empty

The vanilla game adds 3 seconds of rage time when you gain an additional target. The game checks for two conditions, either your target list being empty (second target gained during enrage), or if you are already enraged (in case all your targets die, you still get the extra time because you are already enraged). The code currently only has "!__instance._targets.IsEmpty", when it should be "!__instance._targets.IsEmpty || __instance.Enraged", according to what I asked Build.

InteractingDoor patch does not account correctly for bypass mode.

I tried to open a door with bypass while it was locked; It didn't work, which I knew wasn't how the base game handled bypass mode; I tried it in a single-player server without EXILED and bypass allowed opening of locked doors; I checked the source code for the event and indeed found that it wasn't handling the bypass mode correctly.

You can see the source code here under Exiled.Events.Patches.Events.Player.InteractingDoor.cs:
codeimage
The issue occurs because if (ev.IsAllowed && !ev.Door.locked) doesn't actually come up as true if the door is locked, so it doesn't open the door.

Trigger SCP914UpgradeEvent while waiting for players

but It doesn't trigger every time.

[11:13:55] Waiting for players...
[11:13:56] [INFO] [EXILED_Idler] Server process resuming..
[11:13:56] Player 1@steam preauthenticated from endpoint 1.1.1.1:29026.
[11:13:57] Player 2@steam preauthenticated from endpoint 2.2.2.2:53529.
[11:13:57] [ERROR] [EXILED_Events] SCP914UpgradeEvent error: System.NullReferenceException
at (wrapper managed-to-native) UnityEngine.Transform.get_position_Injected(UnityEngine.Transform,UnityEngine.Vector3&)
at UnityEngine.Transform.get_position () [0x00000] in :0
at EXILED.Patches.SCP914UpgradeEvent.Prefix (Scp914.Scp914Machine __instance) [0x00028] in :0
[11:14:00] [INFO] [EXILED_Idler] The server is now idle..

[11:44:31] Waiting for players...
[11:44:32] [ERROR] [EXILED_Events] SCP914UpgradeEvent error: System.NullReferenceException
at (wrapper managed-to-native) UnityEngine.Transform.get_position_Injected(UnityEngine.Transform,UnityEngine.Vector3&)
at UnityEngine.Transform.get_position () [0x00000] in :0
at EXILED.Patches.SCP914UpgradeEvent.Prefix (Scp914.Scp914Machine __instance) [0x00028] in :0
[11:44:40] [INFO] [EXILED_Idler] Server process resuming..

Map.Broadcast and Player.Broadcast should have the same parameter order

This is by no means a major issue and just something that would make it easier for plugins that have to manage a lot of both global and personal broadcasts. Right now the method definitions are:

Map
public static void Broadcast(string message, uint duration, bool monospace = false);
Player
public static void Broadcast(this ReferenceHub player, uint time, string message, bool monospace = false);

I don't want to break any existing plugins, so an extra method override could be added to Map for (uint duration, string message, bool monospace = false).

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.