Материал из SCP:SL Wiki
Перейти к: навигация, поиск


ServerMod2 — это система плагинов, устанавливаемая на стороне сервера. Позволяет подключать пользовательские плагины, значительно расширяет возможности при настройке сервера. Так же в него включены пользовательские исправления багов основной игры и несколько вещей которые значительно оптимизируют серверную часть.

Здесь вы можете посмотреть пример конфигурационного файла: SMod2\Настройка


Изменения: Game

  • Added configs
  • Added config float 096_deduct_multiplier, defaults to 0.08. This is a multiplier used to detract from 096's rage value. Changing this will change how long 096 rages.
  • Added config float 096_looking_multiplier, defaults to Not Sure TBH. This is a multiplier used for increasing 096's rage value when someone looks at him. Changing this will change how long it takes until 096 rages.
  • Added config float 096_rage_cooldown, defaults to 20. This is the time after raging until 096 can start charging his rage again.
  • Added config float 096_watcherbased_rage_gain_multiplier, defaults to 1. This is exclusively for the watchermultiplied 096 rage type. This is an additional multiplied for how fast 096's rage value increases when players look at him. Since by default, this is significantly faster (all players on server instead of all players looking at 096)

General changes

  • Changed tag fail messages so it is more clear what the issue is and how to resolve them.
  • Fixed NullReferenceException in Scp079PlayerScript.CmdInteract
  • Properly set the "CustomNetworkManager#Modded" variable
  • Fixed command pm. Previously disabled plugins were impossible to re-enable because the command would search for enabled (should've been disabled) plugins to re-enable.


  • Changed the method of logging exceptions during plugin initialization/register from debug to error.
  • Moved Register() invocation to after the plugin has been registered to core managers (config, lang, pipe). Previously Register() was run the line right before OnEnable() was run.
  • Fixed config values not being populated in Plugin.Register() and Plugin.OnEnable(). Now config file read first on startup.

Changed Events

  • Added WarheadChangeLeverEvent (PlayerEvent)
  • Fires when the lever in the nuke silo is flipped. Can be denied using the bool Allow property.
  • Added WarheadKeycardAccessEvent (PlayerEvent)
  • Fires when a player attempts to lift the cover off of the nuke surface terminal using a CONT_LVL_3 keycard (there is a clientside check). Can be denied using the bool Allow property.
  • Changed PlayerHurtEvent

Changed PlayerShootEvent

  • Added get/set bool ShouldSpawnHitmarker - Whether or not to spawn the hitmarker.
  • Added get-only bool ShouldSpawnBloodDecal - Whether or not to spawn the blood decal.
  • Added get-only Vector SourcePosition - The client-reported position that they shot from (use ev.Player.GetPosition() for accurate position).
  • Added get-only Vector TargetPosition - The client-reported position of the target or location that they shot (use ev.Target.GetPosition() for accurate target player position).
  • Added get-only string Hitbox - The client-reported hitbox that the player hit.
  • Added get/set Weapon? WeaponSound - Null will not play a sound or the shoot animation. If it is not null, a client must be in the game when the shooter holds set weapon in order to hear the different sound.
  • Added get/set Vector Direction - The direction that the player shot in. This affects the decal that is placed (e.g. bullet sparks or blood).

Changed Configs

  • Added attribute ConfigOption - configPrefix must be set in your plugin’s PluginDetails attribute to use them.
  • Added LiveConfig<T> to be used in conjunction with ConfigOption.
  • Cleaned/optimized Plugin.GetConfig…() methods.
  • Obsoleted constructors containing SettingsType. Use ConfigSetting.Default.GetType() to get the type of the setting instead.

Changed Translations (Langs)

  • Added attribute LangOption - langFile must be set in your plugin’s PluginDetails attribute to use them.
  • Added support for comments using #.
  • Changed the separator to a colon (:) instead of an equals sign with spaces on both sides (=).


  • Changed newly appended to be lower_snake_case.
  • Added whitespace trimming to both ends.


  • Added support for the separator (:) to be in the value.

Added Pipes

   Other types
       *FieldPipe (and type specific generic FieldPipe<T>)
       *PropertyPipe (and type specific generic PropertyPipe<T>)
       *MethodPipe (and type specific generic MethodPipe<T>)
       *PluginPipes Pipes in Plugin (instance property)
       *void InvokeEvent(string eventNames) and InvokeExternalEvent(string fullName) (both have overloads supporting passing parameters)

Added Permissions For permission plugins:

  • Added PluginManager.PermissionsManager - Contains all permission handlers and handles negotiation between them.
  • Added IPermissionsHandler - Is implemented by permission plugins to handle HasPermission calls. Plugins implement a single abstract method which is called whenever other plugins check a permission on a player. This function should return a 1 if the player has the permission and a 0 if they do not. It also supports permission plugins with negative permissions (a.k.a. negating permissions allowed by other handlers such as permissions given by default). Your plugin should return -1 to completely prevent other handlers from allowing the permission check.
  • Added DefaultPermissionsHandler - This is an internal permissions handler in Smod, it returns 1 if a permission is given by default, 0 if it is not. Thus other permission handlers can override it if they return -1.
  • Added Plugin.RegisterPermissionsHandler(IPermissionsHandler) - Function used to register a new permissions handler.
  • Added Plugin.UnregisterPermissionsHandler(IPermissionsHandler) - Function used to unregister a permissions handler.

For normal plugins:

  • Added Player.HasPermission(string) - Returns true if the player has the permission, returns false if they do not. Use the following pattern for permission names: Ex: admintoolbox.heal.self. This is used both to guarantee compatibility with permission plugins and to make sure no plugins have conflicting permission names.
  • Added Plugin.AddDefaultPermission(string) - Gives this permission to all players by default.
  • Added Plugin.RemoveDefaultPermission(string) - Removes this permission from being given by default.

General changes

  • Obsoleted PluginManager’s methods: FindPlugins, FindEnabledPlugins, and FindDisabledPlugins. Use GetEnabledPlugins, GetDisabledPlugins, and GetMatchingPlugins instead.
  • Obsoleted Server.Verified and Server.Visible. These were already not working, however there was no indication they were obsoleted.
  • Added Server.GetAppFolder(...) (instance method)
  • Added GetComponent(), GetGameObject(), or GetClass() (TeamRole specific) to more API objects to make it easier to go deeper than the API.
  • Updated the example plugin.


Изменения: Game

  • Plugin dependencies folder will now be automatically be created within sm_plugins
  • Removed loading translation audio files to lower RAM consumption by a large amount.
  • Readd reduce_ammo_on_reload (was removed in update to 8.0.1).
  • Added ServerMod config validator, which will save all requested config variables to config file. sm_write_defaults is config for that, being false by default. In case you actually want to write exact default values, use sm_write_exact_defaults, which is false by default.
  • Added a flashbang command FLASH
  • Added config Rint random_scp_chances, defaults to empty string. This dictates the odds of each SCP. Don't use this for 049_2 or 079, as 049_2 is always banned (I think) and 079 uses a different spawning system. Example is {4%0|2%3|2%5|1%9|1%16|1%17}.
  • Added config int random_scp_attempts, defaults to 0. This dictates how many times it attempts to find a random option according to random_scp_chances that isn't banned or full. If you go past the attempt count, it'll use the default type instead. (By default this disables random_scp_chances).
  • Added config boolean scp173_blackout_light_check, defaults to true. When true, SCP-173 will be unable to move when a flashlight is being shined at it during blackout
  • Added config float generator_duration, defaults to 120. The number specified is the time (in seconds) that a generator will start at.
  • Added config list generator_keycard_perm, defaults to ARMORY_LVL_3. Determines what keycard permissions are allowed to unlock generator doors.
  • Added config int list generator_insert_teams, defaults to all team IDs. Team IDs specified will be allowed to insert a tablet into a generator.
  • Added config int list generator_eject_teams, defaults to all team IDs. Team IDs specified will be allowed to eject a tablet from a generator.
  • Added config int list generator_unlock_teams, defaults to all team IDs. Team IDs specified will be allowed to unlock a generator (given that they have the proper keycard for it).
  • Added config string scp096_rage_increase_mode. This allows you to set 4 new ways of handling 096's rage increase. watchermultiplied will increase the rage by amount of players watching 096, instead of all players currently on the server. notmultiplied will not multiply the rage increase at all. optimized should be a more performant version of default (exits the loop as soon as a watcher is found). optimizednotmultiplied should be a more performant version of notmultiplied. Setting any other value should default to the current main game system. If no flaws are found with optimized or optimizednotmultiplied, these will replace the default & notmultiplied versions. (they're simply here for safety)
  • Fixed scp096_ignored_role, scp173_ignored_role and spawn_protect_team. They were previously using the pseudoYAML list entry (similar to port queue).
  • Fixed issue added in 079 update where an SCP's count would increase even if that SCP was then changed to 079. This would have outcomes where not all your SCPs could spawn.


  • Renamed UserGroup.Name to UserGroup.BadgeText (the text of the tag to display)
  • Added Player Attacker to PlayerPocketDimensionEnterEvent
  • Added UserGroup.Name (name of the group, not tag to display)
  • Added UserGroup.Cover
  • Added UserGroup.HiddenByDefault
  • Added API for controlling the warhead: Map.DetonateWarhead(), Map.StartWarhead(), and Map.StopWarhead().
  • Added two new variations of GetPlayers with Role & Role[] as overloads.

Added many methods to Vector including:

       float Distance(Vector a, Vector b)
       Vector Lerp(Vector a, Vector b, float t)
       Vector UnclampedLerp(Vector a, Vector b, float t)
       Vector Min(Vector a, Vector b)
       Vector Max(Vector a, Vector b)
       string ToString() override (prints out (X, Y, Z))
       string ToString(string format) (prints out normal string ToString() but uses the format on the individual numbers)
  • Added the following getter-only properties to Vector
       float SqrMagnitude
       float Magnitude
       Vector Normalize
  • Added operator (+ - / *) support to Vector and float, as well Vector and Vector.
  • Added Generator API object for the new 079 generators. All Generator objects can be retrieved by using Map.GetGenerators().
  • Added enums ZoneType, RoomType, Scp079InteractionType, and ExperienceType
  • Added Scp079Data object which can be accessed from a Player object. This allows plugins to perform SCP-079 actions as if the player did them (basically an Scp079PlayerScript wrapper). Calling something that can be done via an interaction in game (e.g. locking a door as a player) will not grant or show XP, but the float Exp property can be added to and the void ShowGainExp(ExperienceType expType) method can be used to simulate a player gaining XP.
  • Added Room object which are found in the Generator object, List<Room> Map.Get079InteractionRooms(Scp079InteractionType type) (with supported interactions in the enum), and new speaker and lockdown events. The object stores the type of room, but int GenericID allows you to identify generic (curved/straight corridors, 4 ways, etc) rooms as well.
  • Added object GetComponent() to Door and TeslaGate.
  • Added parameter bool instant (default false) to void TeslaGate.Trigger().
  • Changed equality operator of Vector. Now == will compare the value of x, y, and z. If you'd like to do reference equality, use Vector.Equals(object obj) instead
  • Changed Player.GetRankName() to now return null if the player has no group set
  • Fixed Player.GetRankName() not returning anything when player group is not set through Remote Admin config
  • Fixed Player.SetRank() not properly handling empty strings


  • Added LateDisconnectEvent, this event fires after DisconnectEvent, after the player has been fully disconnected and removed.
  • Added GeneratorUnlockEvent: fired when a player attempts to unlock a generator.
  • Added GeneratorAccessEvent: fired when a player attempts to open/close a generator.
  • Added GeneratorInsertTabletEvent: fired when a tablet is inserted into a generator.
  • Added GeneratorEjectTabletEvent: fired when a tablet is ejected from a generator.
  • Added GeneratorFinishEvent: fired when a generator is finished powering up and has become engaged.
  • Added 079DoorEvent: fired when SCP-079 opens or closes a door.
  • Added 079LockEvent: fired when SCP-079 locks a door.
  • Added 079ElevatorEvent: fired when SCP-079 uses an elevator.
  • Added 079TeslaGateEvent: fired when SCP-079 uses a tesla gate.
  • Added 079AddExpEvent: fired when an SCP-079 gains XP.
  • Added 079LevelUpEvent: fired when an SCP-079 levels up.
  • Added 079UnlockDoorsEvent: fired when an SCP-079 unlocks doors.
  • Added 079CameraTeleportEvent: fired when an SCP-079 teleports to a new camera.
  • Added 079StartSpeakerEvent: fired when an SCP-079 starts speaking through a speaker.
  • Added 079StopSpeakerEvent: fired when an SCP-079 stops speaking through a speaker.
  • Added 079LockdownEvent: fired when an SCP-079 causes a lockdown in the room (the hazard sign that causes lights go off and doors close and lock).
  • Added 079ElevatorTeleportEvent: fired when an SCP-079 teleports to a different level via an elevator.
  • Fixed 914ActivateEvent getting an SmodPlayer object of the 914 machine (which basically doesn't work) instead of the player that activated 914.
  • Fixed SCP-106 event positions crashing the game if set to null, now it simply ignores the position in the event if it's null
  • Fixed BanEvent not having a player object in case the ban was done through RA Panel (the only time there is a player object).


Изменения: Game

  • Updated to 8.0.1 (Revision III)
  • Added Broadcast (and broadcast clearing) commands to the server console. (see BC and BCCLEAR)
  • Added Personal Broadcast (and personal broadcast clearing) commands to server console. (see PBC and PBCCLEAR)
  • Added a new way to print config entries when you have sm_debug enabled. This will package all the config entries into one message, rather than one message per entry. This will likely make the server seem a bit more responsive when booting as compared to the old system, as it won't have to catch up to all the printed messages. To enable this, use the below config entry.
  • Added config bool package_config_debug, defaults to false. When you enable this, it will activate the above new method of printing the debug messages.
  • Added config bool sort_config_debug, defaults to false. When you enable this, it will print the config entries alphabetically sorted by the config key.
  • Added config bool reduce_ammo_on_reload, defaults to true. When this is disabled, players won't lose ammo when reloading their weapons. This essentially gives every player infinite ammo.
  • Added config bool disable_dropping_empty_boxes, defaults to false. When this is enabled, players will no longer be able to drop ammo boxes with 0 ammo in them. Unless this nukes your server, you should probably enable this 🤷‍♂️
  • Changed the way escapes were counted so that detained Class-D now count as scientist escapes and vice versa when escapee_restrained_check is enabled.
  • Changed 914's class changing config logic. If you set the value of the class it should change to to -1, it'll not trigger on that class. This is opposed to the situation where if you used 0:0 for example, it would trigger a new spawn event, as it would effectively spawn that player as a new SCP173.
  • Fixed an issue that happened when a plugin tried to register a command that was already registered (either by main game or a different plugin.)


  • Added Map.Broadcast function. Takes a uint for the duration, a string for the message that should be displayed and a bool for whether or not it should be monospaced. This allows you to display a message for all your players, similar to the BC command.
  • Added Map.ClearBroadcasts function. This allows you to empty the queue of messages to broadcast, similar to the BCCLEAR command.
  • Added GrenadeExplosionEvent. This event will fire once per frag grenade and pass the player that threw the grenade. This event is supposed to be used in conjunction with PlayerHurt or PlayerDie events as the information in those events was sometimes lacking when the thrower died themselves. Be careful as the Thrower can be null.
  • Added GrenadeHitPlayerEvent. This event will fire once per player hit by a frag grenade and pass the player that threw the grenade and the player that was hit. This event is supposed to be used in conjunction with PlayerHurt or PlayerDie events as the information in those events was sometimes lacking when the thrower died themselves. Be careful as the Thrower can be null.
  • Changed 914ActivateEvent to also have the player object that activated 914. Also renamed some of the variables.


Изменения: Game

  • Fixed default item not being able to give USP.
  • Added christmas achievement & fast escape achievement

3.2.21 A Game

  • Updated to 8.0.0 (Christmas Event) 🎄
  • Added .{Command} & /{Command} options. These are used in game to contact the server. The period prefix will be able to be used by any player, and as such will mainly be used by plugins. The slash prefix will be used by people who have RA panel access to effectively send a command as if it was sent in the server console. This is effectively the same functionality as server_command_whitelist.
  • Fixed an issue that caused some configs to not work correctly when they were set to a value of default.


  • Added PlayerCallCommandEvent, which passes the player, the command they called & allows you to read & set the return message the player will get back in their console. Please use a prefix similar to your configs when you wish to make use of this functionality, so different plugins don't listen to the same command. As a precaution, you should also check if the the return message is Command not found. If it isn't, another plugin likely already used it


Изменения: Game

  • Updated to 8.0.0
  • Actually kill 079 when nuke goes off 👀
  • Added config integer tutorial_hp, defaults to 100.
  • Added config bool always_spawn_079, defaults to false.
  • This will make 079 always spawn within the first two SCPs (unless 079 can't spawn at all due to ban or count)
  • Re-added config bool no_scp079_first, defaults to true.
  • When this is disabled, 079 will have a 40% chance to spawn as first SCP.
  • Fixed scp079_disable & scp079_amount
  • Fixed disable_commander_mtf_disarm (main game changed how it calculates if players can handcuff eachother)
  • Disabled player position interpolation for the server


  • Added RoundStats.ScientistsEscaped & RoundStats.ClassDEscaped setters. Plugins should now be able to set their values. (this should allow you to manipulate the end conditions)
  • Added Player.DoNotTrack property. When this is set to true, your plugin cannot log any information about that specific data. You can still log nonidentifiable data using that player (such as total amount of kills on your server accross all players).
  • Added DamageType.USP and ItemType.USP


Изменения: Game

  • More anticheat improvements that'll be in main game next update. (reason for update)

3.1.22 B Game

  • Added new anticheat improvement that'll be in main game next update. (reason for update)
  • Changed AFK kicker to give "You were AFK for too long." message to kicked player, rather than the default kick message.


  • Fixed Player.GetCurrentItem function to not shit the bed if player doesn't have items. (hopefully)

3.1.22 A API

  • Added safeguard around plugins returning Role.UNASSIGNED in OnSetRole event
  • Fixed exception related to character role being Role.UNASSIGNED in HurtPlayer function
  • Changed SmodPlayer.GetPlayers() function to now also work with SteamIDs
  • Changed SmodPlayer.GetPlayers() function to match only exact IPs


Изменения: Game

  • Added config float allowed_speed_multiplier, defaults to 1.3f.
  • This is used to determine whether a certain player's movement is allowed or not. Lowering this value will mean it is less likely players will use speedhacks on your server, however it will mean people with a high latency will have more rubberbanding. (I highly recommend not lowering this under 1.15)
  • Added config list scp096_ignored_role option, defaults to an empty list.
  • All roles added to this list will be ignored from 096's detection, and as such will not be able to trigger his rage state.
  • Fixed CONFIG commands (config reload etc.)
  • Trying to fix random invisible players


  • Added event OnSetConfig
  • Added event OnSummonVehicle


Изменения: 3.1.20-B

  • Fixed MicroHID
  • Fixed LCZ Decontamination & Tesla Gate
  • Re-added antifly config
  • Re-added start_round_minimum_players

3.1.20-A Game

  • Added config list cleanup_ignored_items, defaults to an empty list. Items that have an ItemID in this list won't get added to the automatic cleanup queue.
  • Added config floats 939_damage_multiplier and zombie_damage_multiplier, defaults to 1.
  • This will allow you to easily change the amount of damage 049_2 & 939 deal with attacks. The flat amount is 60 for 049_2 and between 50 & 80 for 939.
  • Added config bool sm_enable_ghostmode, defaults to false.


  • Added Player.GetGhostMode() & Player.SetGhostMode(bool ghostMode, bool visibleToSpec = true, bool visibleWhenTalking = true) This will make the player invisible.
  • Note: visibleWhenTalking only works when the player is using radio.
  • Added event OnMakeNoise


Изменения: Game

  • Added config bool prevent_false_173_moves, defaults to false.
  • This disables the new anticheat which is supposed to prevent players from moving as 173 when they shouldn't be able to. (This type of anticheat was having issues)
  • Changed griefing global bans to exploiting global bans (should be in game next version). This means config bool global_bans_griefing was changed to global_bans_exploiting.


  • Plugins using Player.ChangeRole(...) will need to be rebuilt.


  • Added config bool unlimited_radio_battery. defaults to false
  • Added config bools antifly_code_Code Number_log, defaults to true for all
  • Added config bool disable_antifly_logging, defaults to false (disables all anti-fly logging)
  • Added config bool disable_commander_mtf_disarm, defaults to false (aka still allowing Commander to disarm teammates). This will prevent Commander from disarming fellow MTF members
  • Added config floats min_blink_time and max_blink_time, defaults to 2.5 & 3.5. A random value is taken between these two, which determines how long players have to look at 173 before a blink is triggered.
  • Added config int seconds_until_force_restart, defaults to -1 which won't cause automatic restarts. This will force the round to end after the round has been active for X seconds.
  • Added ability to have a reason when kicking/banning. Format is BAN [player name/IP] [duration (minutes)] [reason]. Reason is optional & can consist of multiple words. This works in both Remote Admin Panel and from the server console. (Reason will be shown in your ban logs, in the server console & for the disconnected player)
  • Changed clean command to support removing items more efficiently (Check the help command for more info)
  • Changed antifly_kill_player to antifly_code_Code Number_kill_player, defaults to true for all
  • Changed anti-fly logging to prevent spam (Prints one per player per code every 30 seconds)
  • Change Reserved Slots' default file from Reserved Slots.txt to ReservedSlots.txt


  • Added Player.OverwatchMode property
  • Added Player.HandcuffPlayer(Player playerToHandcuff) function. This will attempt to make the player it's called on handcuff the player passed as an argument. If they are more than 200 units apart this will likely immediately unhandcuff the second player. Strange things might happen if you try to make player handcuff himself or make a spectator handcuff someone. (This is untested)
  • Added Player.RemoveHandcuffs() function. This will attempt to remove handcuffs from the player it's called upon.
  • Changed Player.ChangeRole(...) function to have additional optional parameter bool spawnProtect, defaults to true. Check spawn protect config options for more detail.
  • Changed Player.Changerole(...) function to have additional optional parameter bool removeHandcuffs, defaults to false. This will attempt to remove handcuffs from the player when changing his role.
  • Changed Door.Locked property's set handling to work the same way as the Remote Admin Lock functionality works
  • Changed Door.Open property's set handling to resolve an issue and work the same way as Remote Admin Close functionality


  • Added config antifly_enable , defaults to true
  • Added config antifly_kill_player , defaults to false
  • Integrated SpawnProtect. Added config spawn_protect_disable , defaults to true
  • Added command SetSpeaker <Player>

API Fixed API PlayerListTitle

  • Added API Map.SetIntercomSpeaker & Map.GetIntercomSpeaker
  • Added API Player.RadioStatus
  • Added API Player.SetRadioBattery
  • Added event OnPlayerRadioSwitch
  • Added event OnPlayerPickupItemLate



  • Fixed SCP-106 not being killed after contained
  • Fixed tesla_triggerable_team default value
  • Added set_role_ignore_lite config variable which allows you to spawn before round start
  • Added config allow_multiple_auth
  • (This will allow multiple players with the same authentication token to connect. Default to false.)
  • Added config disable_handcuff_event. Default to true.


  • Fixed IntercomStatus
  • Fixed event OnSCP914ChangeKnob
  • Fixed API Player.ChangeRole not providing items to player
  • Changed event OnHandcuff to OnHandcuffed


  • Integrated Default Item
  • Added int[] items & bool DefaultItem to OnSetRole



  • Added config hide_global_badges (This will hide all global badges by default and prevent people from reenabling them on your server. The people will still have their global badges and as such will keep their RA access unless you disabled it for their role. If you only want to hide them at start or only specific badges, that can be accomplished with other config commands that are part of the main game. Check the smod readme for all the options.)
  • Added config tesla_triggerable_team (Teams that can trigger tesla gates. Defaults to 1,2,3,4,6.)
  • Added translations for plugins (LangManager)
  • Fixed round not ending with less than two players
  • Fixed dependency loader


  • Added API for TeslaGate
  • Added API Player.Get106Portal
  • Added API Map.SetIntercomContent & Map.GetIntercomContent
  • Added API Round.AddNTFUnit
  • Added API Round.MTFRespawn
  • Added API Round.RestartRound
  • Added API Connection.IsBanned
  • Added event OnSetNTFUnitName
  • Added event OnPlayerTriggerTesla
  • Added event OnSCP914ChangeKnob
  • Re-added event OnPocketDimensionEnter
  • CallCommand is now case-insensitive



  • Support for new MultiAdmin
  • Added option PORTAL to config pd_random_exit_rids(Portal is the black hole set by SCP-106)
  • Added disable_global_badges config (This could get you delisted if you're verified, definitely put something about global badges being disabled on your server in the servername)


  • Added GetConfigPath()
  • Made rotation in SmodMap.SpawnItem an optional arguement. Defaults to Vector3(0,0,0)



  • Fixed no Announcement on 106 containment through Lure (hopefully)
  • Fixed player gets stuck in floor when escaping from PD (hopefully)
  • Updated Godmode's permission from Overwatch to PlayerPermissions (will be in base game next patch too)
  • Added config nuke_cleanup (deletes all items in the facility when nuke goes off)
  • Added $grenade_kills as a server name variable
  • Added config window_health. Default to 30.
  • Added command TPPOS <Player(s) to be Teleported> <x> <y> <z> (takes coordinates)
  • Added command POSITION <player/s name|player/s ip> (Prints position for player/players)
  • Added config scp106_lure_team (Teams that are allowed to use, aka enter & be killed in, femur breaker. Defaults to 1, 2, 3, 4, 6)


  • Fixed grenade damage type in PlayerHurt and PlayerDeath events
  • Fixed Elevator.ElevatorType
  • Added SmodPlayer.GetBypassMode()
  • Added SmodPlayer.GetAuthToken()
  • Added Player.HideTag (takes a bool)
  • Added event OnHandcuff
  • Added OpenDoorsAfter to StartCountdownEvent (this defaults to true, if you switch it to false, it won't open the doors like it normally does)
  • Allow altering the playerlist in TeamRespawn (untested, but should allow you to spawn in less players, or even none at all)



  • Fixed 106 animations
  • Fixed Cassie announcement
  • Realllow plugins to give SCPs access to 106's containment button
  • Added API Map.FemurBreaker(bool enable)
  • Added ability to make SCP-106 uncontainable by setting scp106_lure_amount to 0.
  • Added Elevator API
  • Added DamageType to PlayerDeathEvent



  • Fixed duplicate config key halting game server loading
  • Fixed RoundStats API not actually setting a RoundSummary object (Apparently it looked for it in the Host object, but that object doesn't have a RoundSummary Component)
  • Fixed double pastebin and expected version in servername
  • Made Reserved Slots location use the AppFolder by default
  • Made Remote Admin commands use the sender's Player object
  • Fixed OnUpdate & OnFixedUpdate
  • Fixed OnIntercom. Removed bool allowSpeech. You can use OnIntercomCooldownCheck instead
  • Added API Door.Name & Door.Permission
  • Added event OnMedkitUse
  • Added event OnShoot
  • Added event On106CreatePortal
  • Added event On106Teleport
  • Added event OnElevatorUse
  • Config option scp914_keep_health now clamps the health within the max health of the new class
  • Added scp914_keep_health_above_max config option, a bool that defaults to false (counters the change above)



  • Reserved Slots now uses the "#" comment symbol by default
  • Added event OnPlayerInfected
  • Added event OnSpawnRagdoll
  • Added API Player.Infect
  • Added event OnLure
  • Added event OnContain106
  • Added config scp106_lure_amount
  • Added API Player.ThrowGrenade
  • Fixed command Grenade
  • Usage: Grenade <Player(s)|All>
  • Added more Vector API
  • Added update events (untested)
  • Added AddCommands (allows for setting multiple commands to the same handler)
  • Changed 106contain event (when u press button) to allow plugins to disable the activation
  • Fixed half the SCPs passing the victim as attacker in Hurtplayer.



  • Removed legacy ReservedSlot config options
  • Re-added config item_cleanup & ragdoll_cleanup
  • Fixed OnRoundEnd
  • Added SCP939 to OnSetSCPConfig
  • Fixed auto_warhead_start_lock



  • Added API Player.GetRotation
  • Added API Player.SendConsoleMessage
  • Added Vector rotation to Map.SpawnItem
  • Added event OnPocketDimensionDie
  • Prevent client using ServerMod
  • Added config pd_random_exit_rids_after_decontamination
  • Re-added OnWaitingForPlayers
  • Re-added Round.Duration
  • Fixed TeamRole of SCP-173
  • Allow MTF not to respawn. By setting maximum_MTF_respawn_amount to 0.
  • Added config scp_healing_duration Defaults to -1.
  • Heal SCPs who haven't moved and got hurt in a specified amount of time.
  • Added config scp_healing_health
  • The amount of HP that SCPs will recover.



  • Updated to base game Open Beta v7.2.0.
  • Added kinematic API methods for Items (enables / disables item physics)
  • Added API Map.SpawnItem
  • Added event OnThrowGrenade
  • Added bool allowSpeech to OnIntercom
  • Fixed event OnIntercom



  • Updated for game version 7.1.0
  • Added OnIntercomCooldownCheckEvent. Happens before the server checks current cooldown on the intercom broadcast system. This allows you to alter how long until someone can broadcast again. If you set this to 0, they'll immediately start broadcasting, so if that's not the behaviour you want set it to 0.5 or 1 instead.
  • Add API Item.GetPosition & Item.SetPosition
  • Add config option disable_blood_on_screen, defaults to false
  • Add command ITEMPOS
  • Fixed Pocket Dimension not working properly
  • Reserved Slots now ignore empty or commented lines (Allows more/better formatting)
  • Reserved Slots should now print out the line number of any errors
  • Reserved Slots now supports changing the IP, SteamID, or comment of any entry programmatically
  • Make Reserved Slots handle custom paths better
  • Added config option reserved_slots_comment_symbol, this sets the primary comment symbol to use for Reserved Slots, this also allows for custom symbols, defaults to "//"
  • Changed config option dedicated_slots to reserved_slots
  • Changed config option dedicated_slot_file_name to reserved_slots_file_name
  • Make Reserved Slots attempt sending a disconnect message instead of trying to send a "Server is Full" error (which didn't work)
  • Fixed intercom sound effect not playing
  • Added better config creation debug output for Reserved Slots
  • Made YAML config options case-insensitive
  • Added ServerMod build version identifier, ServerMod and Smod2 have separate build version identifiers
  • Added build identifier to sm_tracking
  • Added role support for server_command_whitelist (for example, "owner, admin, moderator"), this doesn't work with the override password
  • Added GetRankName and PlayerId to Player in the Smod2 API
  • Fix RA Server Commands not outputting information to people not whitelisted to run commands
  • Implemented new Items, Roles, and DamageTypes
  • Use better player count listing (hopefully won't break?), this should now update when players are connecting too
  • Extend the time limit for authentication to 20 seconds (should be more than enough time)
  • Added more info to CLASSLIST command
  • Added SCP-939 HP and count config options (scp939_53_disable, scp939_89_disable, scp939_53_amount, scp939_89_amount, scp939_53_hp, and scp939_89_hp)
  • Made initial listing use ServerMod variable parsing (didn't do this before)
  • Added sm_floating_items_everyone config option, defaults to false
  • Added sm_floating_items_steamids config options, a list of SteamIDs of player's to make their items float



  • Change OnSetSCPAmount to OnSetSCPConfig
  • Add Role to PlayerSetRoleEvent
  • You can change the role with the event now.
  • Add event OnRoundRestart
  • Add event OnDecontaminate
  • Add event OnSetServerName
  • Add API Map.WarheadDetonated
  • Add API Map.LCZDecontaminated
  • Add API Player.GetGodmode
  • Add API Player.SetGodmode
  • Add config "decontamination_time"
  • Default value: 11.74
  • Add config "pd_random_exit_rids"
  • Remove config "pd_random_exit" and "pd_random_exit_ignore_rids"
  • Fix bind_ip
  • Fix and improve Reserved Slots



  • Add Map.Shake()
  • Add OnWaitingForPlayers event
  • Add OnPocketDimensionEnter event
  • Add OnSetSCPAmount event
  • Fix OnDecideTeamRespawnQueue event
  • Fix grenades (probably)
  • Fix endround not working and Smod2.EndRound not working
  • Do some voice chat tweaks
  • Bump up dissoance internal packet buffers to 4096
  • Set Network max sent message queue to 2048
  • Added debug command DC, prints network and dissonance info.



  • Re-uploaded to fix issue with the new "bind_ip" option not working on dedicated servers.



  • Add GRENADE command, usage: grenade will spawn grenades at the feet of all players that explode in seconds.
  • Add a fixed check to TPROOM cmd for the following rooms: "pocket" -> pocket dimension, "intercom" -> intercom speaking area
  • Fix 106 containment for real this time hopefully maybe probably.
  • make 106 pocket cleanup work for both UPPERCASE and LOWERCASE settings, i recommend swapping to uppercase as this is the setting the base game uses and we will prob strip this change out in a few versions.
  • Readded Round restarting message so multiadmin function properly
  • Hopefully fix grenades



  • Readd config "pd_exit_count"
  • Add config "pd_refresh_exit"
  • Add config "pd_random_exit_ignore_rids", room ids that will not be teleported to. see ROOMs command.
  • 106 random exit is back to normal game behaviour by default, you can reenable it with pd_random_exit: true
  • SCP HP defaults will now default to the game values instead of being hard coded
  • added TPROOM <player/s> command
  • Fix 106 not being able to be contained
  • Fix 106 not being able to teleport
  • Fix 106 dying when nuke goes off on surface
  • sm_tracking tag in the servername is now set to an invisible colour. This means it shouldnt appear even if your text is really big.



  • Updated for game version 6.2.0.e
  • Add Map.GetBlastDoorPoints()
  • Add Map.GetDoors()
  • Add GetPocketDimensionExits()
  • Add Door API
  • Add PocketDimensionExit API
  • Add PlayerPocketDimensionExit Event
  • Add a config "pd_random_exit"
  • If true, players will be teleported to a random place after escaping from Pocket Dimension.
  • Stop stack overflow when setting role inside set role event
  • Update door access event to use the new Door API.
  • Fix round not being set on RoundEnd and CheckRoundEnd
  • GiveItem now returns an Item object
  • Add void SetCurrentItem(ItemType type);
  • Add public abstract int GetCurrentItemIndex();
  • Add public abstract void SetCurrentItemIndex(int index);
  • Add bool HasItem(ItemType type);
  • Add int GetItemIndex(ItemType type);
  • Add spawnTeleport parameter to ChangeRole (default true)


Основные изменения:

  • Team enum has been renamed to Team
  • Classes enum has been renamed to Role
  • TeamClass object has been renamed to TeamRole
  • TeamClass.ClassDisallowed field renamed to TeamClass.RoleDisallowed
  • TeamClass.Class field renamed to TeamClass.Role
  • AuthType enum moved to API namespace
  • Player.Class has been renamed to Player.Role
  • Player.SetRole has been renamed SetRank
  • Player.ChangeClass has been renamed to Player.ChangeRole
  • Player.Role renamed to Player.UserRank
  • AuthType enum now has two values: (SERVER, GAMESTAFF) changed from (PASSWORD, STAFF, PROJECT_OWNER)
  • Add new UserGroup API to support the new custom user groups in config_remoteadmin.txt
  • New Map API
  • Server.GetItems moved to Map.GetItems
  • Add Map.GetRandomSpawnPoint(Role role) method, returns a vector of a random spawn point for that role.
  • Add Map.GetSpawnPoints(Role role) method, gets all spawn points for that role.
  • Add Map.GetElevatorTeleportPoints()
  • Add Player.GetCurrentItem
  • Add new ROUND END STATUS enum.
  • Add Player.RunCommand(cmd, args)

Event system:

  • Events have been reworked, they now use Objects are arguments, no more out variables.
  • unimplemented events have been stripped from Smod2
  • Team/Role assignment events updated to reflect new name and moved to PlayerEvents
  • Nickname change event moved to PlayerEvents
  • ALL remaining event handlers have been renamed to have Handler in their name.
  • All event handlers now exist in the Smod2.EventHandlers namespace, all Events exist in the Smod2.Event namespace
  • Misc Event handlers file renamed to EnvironmentEventHandlers, warhead event handlers moved there.
  • Event handler registration now has a simpler registration command plugin.AddEventHandlers(new EventHandler());


  • Warhead start / stop now has a Player parameter in the event (NOTE: this can be null)
  • Warhead start / stop can be cancelled.
  • AdminQueryEvent now has additional fields: Output, Handled, Successful.
  • rename AssignTeam event to InitialTeamAssignment event to reduce confusion (it only gets called once at the start of the round)
  • Add Status to Round End Event
  • New Pickup item event.
  • New Drop item event.
  • New Player Check Escape event.
  • New On Spawn event.
  • New Door Access Event.
  • New Team Respawn event.
  • New On Set Role Max HP event.
  • New On Intercom event.
  • New Check For Round End event

Plugin System:

  • Plugins will no longer load if their MAJOR and MINOR version does not match Smod2 version (not servermod, the actual Smod2.dll)
  • better handling for the at "System.Reflection.Assembly:GetTypes (bool)" error when using outdated Smod2/plugin
  • Plugins now have an OnDisable event that will be called on Server shutdown (if not forced closed or crashed
  • Plugins can now have their own directory instead of just being a DLL, this directory can include a dependency folder to load other DLLs.
  • Add sm_plugin_path to config to specify plugin location

Command System:

  • Commands now need to return a string array as its output.
  • Commands no longer parse an CommandManager, instead parses a sender.
  • remote admin console command will now output to remote admin.


  • New PARROT command, will repeat anything you type into it.
  • New PLUGINMANAGER command (PM alias), usage: pm [(enable|disable|commands) <plugin/s>][list (all|enabled|disabled)]
  • New ROOMPOS command, will print all rooms tagged with a roomid and their position.



  • Re-added the ability to set groups in Player::SetRole().
  • RE-RELEASED: To fix an ordering issue with Player::SetRole() that resulted in the group's default title and color overriding SetRole()'s title and color.



  • Fixed ConfigFile causing errors
  • Fixed "port_queue" not using the config
  • Fixed SCP-914 and made it use more Smod2 API
  • Replaces \n with new line char in config options (use this for server names and such)
  • Added more info to the weaponlist command
  • Implemented changed damage types
  • Add disconnect with message, health and ammo APIs
  • Added FACILITYGUARD_HP config option
  • Added config options dedicated_slot_location and dedicated_slot_file_name



  • Updated Central Server to match the update in the base game.
  • Allow default list values to have randomization.
  • Re-wrote reserved slots system, now uses a separate config file and accepts SteamIDs (SteamID64).
  • Add config option "reserved_slots_simulate_full" for debugging (Simulates the server being full, so only players with reserved slots can join and please, do not enable this if you don't know what you're doing).
  • Default list values can now use randomization.

Известные баги:

  • Server might crash when first creating "Reserved Slots.txt"



  • Add SHOWTAG command to Remote Admin
  • Fixed ChangeClass not allowing SCP-173
  • Moved OnPlayerJoin "black magic" to DisableUselessComponents (Thanks, greg!)
  • Consequentially removed sm_onplayerjoin_tries_timeout option
  • Running server commands now uses a whitelist
  • Added config option enable_ra_server_commands, defaults to true
  • Added config option server_command_whitelist, a list of SteamIDs
  • Added config option bypass_server_command_whitelist, defaults to false
  • Fixed and improved the anti-cheat
  • Added randomization to all config value types
  • Minor fixes for list value type
  • Minor bug fixes in Smart Class Picker
  • optimization for Smart Class Picker
  • Every Smart Class Picker config option using smart_class_picker has been changed to smart_cp except for the config option that is just smart_class_picker
  • Added smart_cp_weight_min and smart_cp_weight_max



  • Updated to game version Open Beta v5.1.1.
  • Make OnPlayerJoin wait for SteamID.
  • ServerMod and MultiAdmin are now available through SteamCMD.



  • Updated to game version Open Beta v5.1.0.
  • Implemented limit support for commands in remote admin console. Commands can not currently reply to the remote admin console.



  • Pocket dimension no longer teleports after the nuke goes off
  • SCP106_CLEANUP should work again
  • Added command "WEAPONLIST"
  • Make OnPlayerJoin wait for more player info to be loaded
  • Add timeout to OnPlayerJoin if a player disconnects while connecting
  • Add config option sm_onplayerjoin_tries_timeout (integer, defaults to 50), the amount of tries before the OnPlayerJoin event gives up on executing for a player (to prevent it constantly running if a player disconnects before it's run)
  • Implement DamageType into OnPlayerHurt and SmodPlay Kill and Damage
  • Set config option rejected_movement_limit default value to -1
  • Implement the On914Activate event



  • Re-upload to fix issue with rejected movements and SCP-106.
  • Replace "HWID" command with "STEAMID" to now check SteamIDs
  • Added more secondary server browser functionality through secondary_servers_to_contact, master_server_to_contact is obsolete but still gets added to list too
  • Additional anticheat checks: Lifts, 096 spawn, player spawns, and death position
  • Make separate randomization methods (Only code difference)
  • Fixed filtering of specific characters after "CallOnNicknameSet" in Smod2 API
  • Major commands re-write: Clean, GiveAll, GivePlayer, GiveTeam, Tp, and TpAll
  • Changed HardwareId in Smod2 Player to SteamId
  • Modified Smod2 Player Teleport and ChangeClass to work better and have more options
  • Re-wrote SCP-914 config options to use Smod2 API
  • Modified dedicated player slot kick timing
  • Make teleportation ignore spectators
  • Added option rejected_movement_limit (integer, defaults to 10, -1 to disable), the amount of movements detected by the anti-cheat as invalid before a player is kicked, the detection count increases per invalid movement and decreases per valid movement
  • Added config option last_movement_timeout (seconds, defaults to 30), after this amount of time without a player sending any movement, they will be kicked (still sends movement if they're standing still, so this isn't anti-afk)
  • Better teleportation exemption from anti-cheat (Teleports work better)
  • Spawn zombies in SCP-049's room by default
  • Fixed random values not working properly
  • Pocket dimension exit is now server side
  • Added config option PD_EXIT_COUNT, defaults to 1 (The amount of pocket dimension exits)
  • Remote Admin queries now use the ServerMod API and don't break as much
  • SCP-096 doesn't get stuck on broken doors when enraged anymore
  • Fix server not reloading config and opening it in a text editor
  • Added OnPlayerJoin, OnDecideTeamRespawnQueue, OnStartCountdown, OnStopCountdown, and OnDetonate events to Smod2 API
  • Added config option filler_team_id which takes an int and decides which team it adds to fill up the spawnqueue if spawnqueue is shorter than the max player count



  • Updated to game version 5.0.1



  • Updated to game version 5.0.0
  • Added config options disable_decontamination (boolean value, defaults to false), scp_grenade_multiplier (float, defaults to 2.0), human_grenade_multiplier (float, defaults to 1.0), disable_badges (boolean value, defaults to false)
  • Fixed SCP-106 recontainment activating even when nobody sacrificed themselves (Game bug)
  • Allow for multiple commands to be executed at once by separating them with semicolons (;)
  • Added CLEAN command, removes items pickups of the specified ID
  • Removed pre-made bans, the ban system was re-worked, so this will have to be too



  • Added AdminQuery event
  • Changed SetClass event to use OnSetClass instead of OnAssignTeam
  • Changed parameters of AdminQuery and AuthCheck events to be more versatile
  • Added dedicated_slot_ips, IPs to allow to join the server even if the server is full
  • Added dedicated_slots, the amount of dedicated slots to make, this defaults to the number of IPs in the dedicated slot IPs list and requires a restart to reload
  • Fixed premade bans always keeping duplicates



  • Changed Risky IP Checker to a plugin, it can now be found here
  • Added new Smod2 event NicknameSet (914Activate isn't called)
  • Added config option master_server_to_contact, adds the functionality to push data to a different master server to create private server lists
  • Added new config option values to Smod2
  • Added randomized config options, available for any list with it enabled
  • Added config options SCP914_keep_health, SCP914_in_<rough/coarse/1_to_1/fine/very_fine>_damage, and SCP914_out_<rough/coarse/1_to_1/fine/very_fine>_damage
  • Allow client mods to remotely run commands through QueryProcessor, requires config option client_mod_commands to be enabled



  • Updated to game version 4.0.0.
  • Prevent a possible issue with 914 class changing.
  • Added "risky_ip_whitelist", takes a list of IPs that won't be checked using Risky IP Checker.
  • Added "offline_ban_keep_duplicates", boolean, defaults to false.
  • Added config option "loginattempt_keyword_whitelist" which takes a list of words to prevent brute force protections from taking effect.
  • Added ServerMod hooks for playerhurt, playerdie, setclass, assignteam.
  • Added config option "escapee_restrained_check" which when enabled makes escapees the other team if they are cuffed.
  • Fixed checks on several commands to properly block exploits.
  • Added "SCP914_keep_inventory", defaults to true: keeps a players inventory the same when their class changes through 914.
  • Prevent team weight overlapping with custom values.
  • Cleaned up Risky IP Checker and added rate limit debugging.



  • Updated to Open Beta v3.3.2
  • Fixed name exploit.
  • Fixed ban exploit.
  • Added more checks to noclip protection to prevent false positives.
  • Change "1:1" in 914 config to "1_to_1".



  • Fixed noclip protection not working in certain circumstances.
  • Fixed Janitor card not being able to be picked up.
  • Fixed 914 not affecting live test subjects.
  • Fixed server's nickname not being set to "Server."
  • Updated to SCP:SL Open Beta v3.3.2.
  • Added noclip protection. Config option "noclip_protection", defaults to true.
  • Added health exploit prevention.
  • Added item exploits prevention.
  • Added Intercom display exploit protection.
  • Added IP checker, blocks VPNs and Proxies
  • Added config options: "trusted_ips_reset_every", "kick_risky_ips", "kick_risky_ips_ratelimit", "kick_risky_ips_email", "kick_risky_ips_subdomain", "kick_risky_ips_at_percent", and "ban_risky_ips_at_percent"
  • Added config options for Smart Class Picker: "SMART_CLASS_PICKER_TEAM_<Team ID>_WEIGHT_DECREASE" and "SMART_CLASS_PICKER_TEAM_<Team ID>_WEIGHT_INCREASE"
  • Re-added Nickname protection that got mistakenly removed in a previous version.



  • Add Player.GetPosition()
  • Add Player.Teleport(Vector pos)
  • Add Player.SetRole(Role)
  • Add Player.Role enum
  • Add really basic vector class
  • Add AdminEvents (only Auth event is implemented right now)
  • ServerMod will check for the correct Smod2.dll
  • Added new info for bans, now includes the time of the ban
  • Added new feature: Offline Ban Database, this automatically creates ban files for every player who joins your server
  • Added new config option: "check_HWID_for_bans", defaults to true
  • Added new config option: "create_offline_ban_files", defaults to true
  • Added new config option: "offline_ban_database_folder"
  • Added new config option: "offline_ban_duration", defaults to 26297460 (50 years)
  • Fixed minor formatting issue
  • Changed teleportation to work better (not using an exploit anymore)
  • Added config option: "SCP914_<rough/coarse/1_to_1/fine/very_fine>_change_class", changes player's class when they go through 914
  • Added config option: "SCP914_teleport_players" moves players through 914, defaults to true



  • OnServerConnect event implemented
  • OnServerDisconnect event implemented
  • OnRoundEnd Event implemented
  • OnRoundStart will call at the right time now, so players classes will be set.
  • ItemType enum is complete
  • Fix Smod2 plugin path issue
  • Hopefully fixed afk kicker kicking players when spawning in after being spectator
  • Made 914 teleport players because that's fun
  • "remove_item_loot": Removes all instances of the specified item from all lockers
  • "replace_item_loot": Replaces all instances of the specified item from all lockers with the second specified item
  • "add_item_loot": Adds the specified item to all lockers' loot
  • Fix plugins not registering with the ConfigManager

2.0.0 (Test release)[править]


  • Most implementation done.
  • Only one event is supported: IEventRoundStart