Releases: ServerMod/Smod2
ServerMod 3.9.0
Target Game Version: 10.0.3
Changes since last update.
- Updated to the latest version of the base game.
- Fixed thrownade by moving it to the system that main game uses. (It was completely rewritten by main game devs)
You can use this by doing ThrowGrenade(GrenadeType grenadeType, Vector direction = null, float throwForce = 1f, bool slowThrow = false); - Adds AHP and HP property and deprecated old ways of doing them.
- Migrated SmodPlayer to using the ref hub system.
- Added status effect support.
- New enum of all status effects called StatusEffect
- New class PlayerEffect which contains
- StatusEffect which returns the above enum value of which status effect it is.
- Duration aka how long in seconds is going to last
- Intensity returns 0 if disabled or 1 if enabled (unless its the cola which will return how many stacks are active so if you drink 3 colas this will return 3)
- Disable the effect or enable the effect with duration and the ability to stack duration
- Two methods on SmodPlayer
- GetAllPlayerEffects() List of PlayerEffect
- GetPlayerEffect(StatusEffect effectToReturn) returns status effect from enum value
-Added 3 status effect events. - IEventHandlerDisableStatusEffect - Called whenever a status effect is disabled. Has person, the status effect and allow property.
- IEventHandlerEarlyStatusEffectChange - Called right before the duration is changed when a status effect is changed. Has person, the status effect and allow property.
- IEventHandlerLateStatusEffectChange - Called right AFTER the duration is changed. Has person and the status effect.
- Added stamina to SmodPlayer with a get/set have fun ;)
- Added IEventHandlerPlayerSCP207Use and IEventHandlerPlayerSCP268Use
- Both have player using the SCP, the item in the inventory and Allow.
- 268 event has Cooldown in seconds (get/set)
- All of the grenade events (throwing, explosion and hit player) now are properly called and now support SCP-018.
- Fixes small bug where SCP-106 grabbing people damaged twice.
- Fixes 106 create portal event triggering twice
- Adds ShowHint(string Text, float durationInSeconds = 1f) to SmodPlayer
Known issues
- Class picker modifications have not been ported. Expect base game behavior.
- Intercom text customization has not been ported. Expect base game behavior.
ServerMod 3.8.4
Target Game Version: 10.0.2
Changes since last update.
- Updated to the latest version of the base game.
- Fixed
window_health
- Fixed an issue with reserved slots.
- Readded
unlimited_radio_battery
Known issues
- None at this time.
ServerMod 3.8.3
Target Game Version: 10.0.1
Re-released to fix missing item pickup event.
Changes since last update.
- Fix not being able to change SCP-173's blink time.
- RoundStartEvent is no longer triggered multiple times.
- Updated API to support changes in newest version.
Known issues
- None at this time.
ServerMod 3.8.2
Target Game Version: 10.0.0
Re-released to fix version string.
Changes since last update.
- Fixed
scp096_ignored_role
config - Adds
Allow
property toPlayerPocketDimensionEnterEvent
so authors can prevent people from being grabbed. - When your HP is above maxHP and you heal it now does nothing instead of resetting your HP to maxHP.
- Fixes DamageType have out of date values.
Known issues
- None at this time.
ServerMod 3.8.1
Target Game Version: 10.0.0
Changes since last update.
- Updated to the latest base game.
- SCP914ActivateEvent rework, instead of object list of inputs that could be either a player or an item it returns list of items called ItemInputs and list of players called PlayerInputs
- Added LobbyLock to Round
- Added Player queue to DecideRespawnQueueEvent
- Added AnnounceCustomMessage
- Added OverchargeLights
- Added SCP018 to GrenadeType enum
- Added OnScp096AddTarget.
- Added MicroHID damage type.
- Changed the ammo type enum to the new ammo names
- Change Role to RoleType in ScpDeathAnnouncementEvent.
Known issues
- None at this time.
ServerMod 3.7.0
The forever release.
Target Game Version: 9.1.3
2020-07-14: Re-released to fix double round restarts and a potential problem with badges.
This is a clean re-implementation of ServerMod onto the latest game version. Plugins will need to be updated to match changes made in the base game and ServerMod as a result.
API changes
admin
variable fromAdminQueryEvent
can be null due to a main game change, allowing someone to issue a command with the dedicated server console.- Reworked
PlayerMedkitUseEvent
intoPlayerMedicalUseEvent
- Added
GetArtificialHealth()
andSetArtificialHealth(float amount)
methods toSmodPlayer
. - Reworked the way the API deals with steamid since now a player can join with steam, discord or as northwood staff.
SteamId
variable ofSmodPlayer
has been obsoleted in favor ofUserId
(returns full ID),GetParsedUserId()
(returns ID without ID Type) andUserIdType
(Returns STEAM, DISCORD or NORTHWOOD)
ServerMod 3.6.0
It's a big one bois
Rerereleased to update how random configs work, update assembly versions and update default value for noclip_door_open_time_percentage
to 0.2
Target Game Version: 8.0.1 (Revision III)
A LOT OF PLUGINS will no longer work and will need to be rebuilt and or changed. Before notifying the plugin dev, please make sure if they weren't already told about it.
Game
Added Configs
- Added config bool
priority_mtf_respawn_shuffle
, defaults to false. This determines whether or not to shuffle the respawn list of prioritized respawns. With shuffling disabled, those who have been dead longer will have higher ranks. - Added config float
noclip_door_open_time_percentage
, defaults to 0.667 and ranges from 0 to 1. This is the amount of time that the anti-noclip ignores player movement through doors as a percentage of the door movement animation where it's open. For the closing animation it's the first part of the animation, and for opening animation, it's the last part of the animation. - Added config bool
nuke_operational_during_decon
, defaults to false. Allows players to interact with the nuke during LightZone decontamination - Added config bool
mtf_respawn_nukecountdown
, defaults to false. Allows MTF/CI to respawn during nuke countdown - Added config bool
mtf_respawn_decontamination
, defaults to false. Allows MTF/CI to respawn during LightZone decontamination - Added config bool
ci_allow_post_nuke_respawn
, defaults to false. If set to true, CI can still spawn after nuke goes off. - Added config bool
ignore_tutorial_anticheat
, defaults to false. Decides if anticheat checks tutorial class. (Can be used to allow moderators to be ignored for example) - Added config bool
096_destroy_locked_doors
, defaults to true. Sets whether lankster can destroy locked doors.
Automatron changes
- Added config bool
automatron_enabled
, defaults to true. If this is set to false, all automatron functionality will be disabled. (bans can be disabled separately but people were too tinybrain to find the config for that) - Added check around possible false positive related to teleportation.
- Added workaround for SCP-173 players getting banned by Automatron on servers where SCP-173 max health is set below default.
- Changed sample count defaults to 6 to hopefully prevent deaths by door pushing. (This prevented any false positives on SecondFry's server. Worse servers might need to raise the sample counts even higher)
- Forced Automatron allowed observed speed multiplier to at least 1.01f
Changes
- Fixed ConfigFile populating entries like # something: something by enforcing pattern matching. This enforces config keys to be alphanumeric with ground symbol (i.e. pepegas_have_rights_too: maybe).
- Added additional checks for SteamId to be present in anticheat
- Fixed team respawns, they were previously spawning people who were dead for shorter amounts of time than others
- Prevent ghost processes by closing the game if provided with an invalid PID, but has the -id argument
- Block empty or null strings from
CmdChangeModPreferences
- Always allow players to pass through destroyed doors
- Anti-noclip now allows players to pass through broken windows and checks every collision rather than just the first collision
- Removed
disable_handcuff_event
config because the event works fine now. - Tesla gate is no longer getting config int list every fixed update.
- No longer getting bool config every time it sends debug message.
window_health
config works now.- Players should no longer trigger antispeedhack while going through destroyed doors.
scp049-2_hp
changed toscp049_2_hp
.
API
Additions
- Added weapons to the API. (See next section for more information)
- Added
PlayerDropAllItemsEvent
. Called when all of a player's items are going to be dropped. - Added
CassieCustomAnnouncementEvent
. Called when a custom CASSIE message gets added. (through the API for example.) - Added
CassieTeamAnnouncementEvent
. Called when the CASSIE message for the MTF respawns gets added. - Added
OnSetSeed
. Called when the seed is chosen and allows plugins to modify or log it. - Added
PlayerLeaveEvent
which has SteamID, IP, Nickname and PlayerID and is fired as QueryProcessor is being destroyed. - Added property
SmodPlayer.Muted
which allows you to get and set the muted state. - Added property
SmodPlayer.IntercomMuted
which allows you to get and set the intercom muted state. - Added new enum
LeadingTeam
which has all possible end screen win scenarios. - Added
GetPlayers(Predicate<Player> predicate)
. - Added
SmodPlayer.BypassMode
property to replaceSmodPlayer.GetBypassMode()
- Added method
SmodItem.ToWeapon()
which returns the accompanyingSmodWeapon
(or null if it's not a weapon) - Added property
SmodItem.IsWeapon
which allows you to get whether or not the item is a weapon. - Added 2 new overloads to SpawnItem
- Allows you to spawn weapon with ammo and set it's attachments.
- Allows you to spawn ammoboxes with ammo.
New weapon class
- This is done by converting
SmodItem
toSmodWeapon
AmmoInClip
AmmoType
Sight
Barrel
Other
MaxClipSize
DamageType
ToItem()
ConvertsSmodWeapon
toSmodItem
for events that returnSmodWeapon
.
- Added new enums
WeaponSight
All possible weapon sights.WeaponBarrel
All possible weapon barrels.WeaponOther
All possible weapon others.WeaponType
All weapons supported (COM15, Micro, E11, P90, MP4, Logicer and USP.)WeaponSound
All weapons that have sounds that be can be heard by a player. (Used in theShootEvent
and is equal in index toWeapon
array inWeaponManager
)
Changes
- Changed
SmodMap.GetSpawnPoints
to use the main game's stupid spawn point names for 939 and 096 so they should work now - Moved
CreatePortalEvent
toCmdMakePortal
to alleviate some issues. PlayerShootEvent
changed to returnSmodWeapon
andWeaponSound
instead ofDamageType
andWeaponType
(Other variables are still there)PlayerReloadEvent
now returnsSmodWeapon
instead ofItemtype
.PlayerGrenadeExplosion
now hasGrenadeType
,Position
andAllow
and moved the event to right before the grenade explodes and sends that explosion info to clients.PlayerPickupItemEvent
changed to when item is still on ground and now settingAllow
to false leaves it on the ground.RoundEndEvent
New variable calledLeadingTeam
which can be modified to set the end screen winner.- Fixed
PlayerHandcuffedEvent
event. MP4
inItemType
renamed toMP7
.- Round duration now returns 0 during waiting for players.
Removals and deprecations
- Removed
SmodConnection
fromDisconnectEvent
&LateDisconnectEvent
.These are API breaking changes
(Neither had access to the information anyways) - Deprecated
LateDisconnectEvent
in favor ofPlayerLeaveEvent
- Deprecated
SmodPlayer.GetBypassMode()
in favor ofSmodPlayer.BypassMode
property (get & set).
ServerMod 3.5.0
Target Game Version: 8.0.1 (Revision III)
Rerereleased to make it not ban and instead just disallow it.
Rereleased to add anticheat_waiting_for_players
Plugins using Server.GetPlayers
using a playerid will have to be change to Server.GetPlayer
.
Game
Added Configs
- Added config float
096_trigger_range_always
, defaults to 1.5. This is the range that a player will always contribute to SCP-096's rage, if they are in it. Setting it to 0 or lower will disable the range check (only the angle check will be performed). - Added
096_trigger_angle
, defaults to 70. This is the angle that a player must be looking relative to SCP-096 to contribute to his rage. - Added config bool
ci_respawn_music
, defaults to true. Determines if the CI music should be played on a CI team respawn. - Added config float
lift_move_duration
, defaults to the base game value (which is 5 as of now). Raising or lowering this value will change the amount of time it takes between the doors closing and opening when using an elevator. Reducing this below 2 should either do nothing or do weird things, so don't bother. - Added config float
noclip_radius_multiplier
, defaults to 0.667. This defines what number to multiply the player radius by to get the sphere radius for the "Physics.Spherecast()" - Added config bool
anticheat_waiting_for_players
, defaults to true. If you use plugins that make players open doors during the waiting for players period, disable this. Alternatively, if it shits the bed also disable this.
Automatron (new antispeedhack system)
Added AUTOMATRON which watches over nasty players (currently has improved speedhack detection and "fellow hacker" ban system).
New config variables:
- int
automatron_sample_count
, defaults to 5, amount of ticks gathered data stay. - int
automatron_allowed_observed_ticks
, defaults to 5, amount of ticks of speedhacking until ban. Most of the time should stay equal toautomatron_sample_count
. - float
automatron_allowed_observed_speed_multiplier
, defaults to 1.04f, how much speedhack do you want to allow - bool
automatron_ban_observed_speed
, default to true, boolean to check if AUTOMATRON should ban for speedhacking or not. - int
automatron_bantime
, defaults to 1440, ban time to use for other ban time variables which are to -1 - int
automatron_bantime_observed_speed
, defaults to 5, amount of minutes to ban for speedhacking. - int
automatron_bantime_nickname
, defaults to 5, amount of minutes to ban for players using a cheat client's modified names used to identify fellow cheaters.
Fixes
- Fixed SmartCP including people who stayed spectator or not in a valid role (Overwatch mode)
- Fixed and cleaned up anti-noclip, using "Physics.Spherecast()" rather than "MoreCast.BeamCast()"
- Fixed the ability of clients to rotate the head past normal limits. (This doesn't really matter, but in case something weird starts happening to heads, this is probably why and you should let us know)
- Added new anticheat that prevents players from accessing doors or other things during the Waiting for Players period. This can be disabled with
anticheat_waiting_for_players
if you want to be able to do that or if it shits the bed.
API
- Added a new possible filter for
Server.GetPlayers
function which takes a Team value and returns all players of this team. - Added
Server.GetPlayer()
, this takes an int of the playerid of the player you want to get. Previously this was handled byServer.GetPlayers(string)
but it was rather unreliable since it would also check ips & player names there. In case no player is found, this will return null, so check for that. - Added
Player.GetCurrentRoom()
andMap.GetCurrentRoom(Vector3 position)
. These functions return the transform of the room the player or position is in. If no room is found, it will return null so check for this.
ServerMod 3.4.1
Target Game Version: 8.0.1 (Revision III)
Plugins using PlayerThrowGrenadeEvent
will have to be rebuilt!
Game
Added configs
- Added config float
096_trigger_range
, defaults to 20. This determines how far away a player can be from 096 while still charging up his rage meter. - Added config float
scp173_max_looking_distance
, defaults to 250. This determines from how far away you can be considered to be looking at 173. - Added config int list
always_spawn_079_after
, defaults to an empty list. The game will check all entries in this list to see if there's currently that many SCPs spawned, and if so it will force the current SCP spawn to be 079. This is meant to be a replacement foralways_spawn_079
as it serves the same purpose but is more versatile. - Added config bool
always_spawn_after_exclude_079
, defaults to false. Based on this, the current 079 count will be subtracted from the current SCP count when used foralways_spawn_079_after checks
. (For example, if you force 079 after 1 and 2 scps, without this setting off, you'll get a random scp, then 079 then another 079. With it enabled, you'll get a random SCP, then 079, then a random SCP (could be 079), then another 079 (if the previous wasn't a random 079) - Added config bool
enable_broadcast_logging
, defaults to true. Disabling this will prevent the [BROADCAST FROM SERVER] messages from being logged in the server console. Personal Broadcasts will still be logged. This changes nothing for the messages in client consoles.
Added damage multiplier float configs
scp106_damage_multiplier
, defaults to 0.1. This multiplies the damage of a shot anywhere on SCP-106.player_headshot_damage_multiplier
, defaults to 4. This multiplies the amount of damage done by a headshot on a human player.player_legshot_damage_multiplier
, defaults to 0.5. This multiplies the amount of damage done by a leg shot on a human player.
All these values are the default values used by the vanilla game.
Added CASSIE configs
- Added a bunch of bool configs to give the option to not play C.A.S.S.I.E. announcements from the game. All of these default to true. They are the following:
cassie_generator_announcements
cassie_respawn_announcements
cassie_scp_death_announcements
cassie_scp_tesla_announcements
cassie_scp_warhead_announcements
cassie_scp_decont_announcements
cassie_079_overcharge_announcements
cassie_079_containment_announcements
General changes
- Fixed
scp173_blackout_light_check
API
Changed API Elements
- Added two warhead properties to SmodMap:
bool WarheadLeverEnabled { get; set; }
- Returns true if the lever in the HCZ warhead room is enabled
bool WarheadKeycardEntered { get; set; }
- Returns true if the keycard has been entered in the surface nuke room to allow nuke detonation
New Events
Added ScpDeathAnnouncementEvent
(EnvironmentEvent)
This is a rather simple event which has a ShouldPlay
bool which determines if it'll play (uses the cassie_scp_death_announcements
config), a Player object (which could be null, so check for it) and the player's class. The purpose is to turn off/on ShouldPlay
and potentially play a different SCP's containment announcement or even a custom announcement.
Added Scp096PanicEvent
(PlayerEvent)
Fired when SCP-096 goes into panic mode (this is the animation that plays when his rage mode is about to start)
Added Scp096Enrage
(PlayerEvent)
Fired when SCP-096 goes into rage mode
Added Scp096CooldownStart
(PlayerEvent)
Fired when SCP-096 begins his cooldown after rage mode
Added Scp096CooldownEnd
(PlayerEvent)
Fired when SCP-096 ends his cooldown
Changed Events
- Changed
PlayerThrowGrenadeEvent
to useGrenadeType
rather thanItemType
.
General changes
- Changed
GetConfigList
function to trim by default. This should mean no further issues if players added spaces after a comma in lists. - Fixed Warhead API not working
ServerMod 3.4.0
Target Game Version: 8.0.1 (Revision III)
Reminder that a new MultiAdmin has also come out recently, if you haven't noticed. https://github.com/Grover-c13/MultiAdmin/releases/tag/3.1.2
Game
Added configs
- Added config float
096_deduct_multiplier
, defaults to0.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 to20
. This is the time after raging until 096 can start charging his rage again. - Added config float
096_watcherbased_rage_gain_multiplier
, defaults to1
. This is exclusively for thewatchermultiplied
096 rage type. This is an additional multiplier for how fast 096's rage value increases when players look at him. This is added because by default, this is significantly faster (default uses all players on server rather than 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
inScp079PlayerScript.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.
API
Changed Plugins
- 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). PreviouslyRegister()
was run the line right beforeOnEnable()
was run. - Fixed config values not being populated in
Plugin.Register()
andPlugin.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 the
float Damage
property - If is less than1
, the target will not receive blood on their screen.
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 (useev.Player.GetPosition()
for accurate position). - Added get-only
Vector TargetPosition
- The client-reported position of the target or location that they shot (useev.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’sPluginDetails
attribute to use them. - Added
LiveConfig<T>
to be used in conjunction withConfigOption
. - Cleaned/optimized
Plugin.GetConfig…()
methods. - Obsoleted constructors containing
SettingsType
. UseConfigSetting.Default.GetType()
to get the type of the setting instead.
Changed Translations (Langs)
- Added attribute
LangOption
-langFile
must be set in your plugin’sPluginDetails
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 (=
). - Keys
- Changed newly appended to be lower_snake_case.
- Added whitespace trimming to both ends.
- Values
- Added support for the separator (
:
) to be in the value.
- Added support for the separator (
Added Pipes
- Attributes
PipeField
PipeProperty
PipeMethod
PipeEvent
PipeLink
- Other types
FieldPipe
(and type specific genericFieldPipe<T>
)PropertyPipe
(and type specific genericPropertyPipe<T>
)MethodPipe
(and type specific genericMethodPipe<T>
)
- Properties/fields
PluginPipes Pipes
inPlugin
(instance property)
- Methods
void InvokeEvent(string eventNames)
andInvokeExternalEvent(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 a1
if the player has the permission and a0
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 returns1
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)
- Returnstrue
if the player has the permission, returnsfalse
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
, andFindDisabledPlugins
. UseGetEnabledPlugins
,GetDisabledPlugins
, andGetMatchingPlugins
instead. - Obsoleted
Server.Verified
andServer.Visible
. These were already not working, however there was no indication they were obsoleted. - Added
Server.GetAppFolder(...)
(instance method) - Added
GetComponent()
,GetGameObject()
, orGetClass()
(TeamRole
specific) to more API objects to make it easier to go deeper than the API. - Updated the example plugin.