Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
bb7d282
Added PlaceholderReplacing to CustomKeycard
MedveMarci Jun 29, 2026
cdc1863
Fixed LastHuman checker with fake SCP role
MedveMarci Jun 29, 2026
6bb86c9
Fixed FF in TeamPatch when the player is attacking the same Team
MedveMarci Jun 29, 2026
bd73b19
Refactored event handling in CustomRoleEventHandler and PlayerEventPr…
MedveMarci Jul 12, 2026
650614a
Refactored role attribute checks in ImportManager and PluginImportMan…
MedveMarci Jul 12, 2026
e1d70d0
Optimized TeamPatch; Improved FakeRole getter
MedveMarci Jul 12, 2026
dee8ee1
Added null check for placeholder origin
MedveMarci Jul 12, 2026
014c3a2
Improved CustomKeycard Flag
MedveMarci Jul 12, 2026
f6ac4a6
Prevented spamming in EscapeController
MedveMarci Jul 12, 2026
4fde917
Fixed a hume shield config with amount: 0 but maximum > 0 (start empt…
MedveMarci Jul 12, 2026
c4ca47d
Refactored list initializations to use array syntax for consistency; …
MedveMarci Jul 12, 2026
e70ec36
Added null checks for PlaceholderManager
MedveMarci Jul 12, 2026
625aed0
Renamed colorMap to ColorMap for consistency; Added white color
MedveMarci Jul 13, 2026
39e216b
feat(api): add custom role event system and role extension helpers
MedveMarci Jul 14, 2026
8e040d1
Fixed CustomInfo removing
MedveMarci Jul 15, 2026
b011533
Fixed escaping when there is no EscapeScenarioType for that role; Fix…
MedveMarci Jul 15, 2026
a89e535
Fixed UCI Integration
MedveMarci Jul 15, 2026
d416c5d
Added config option to disable config validator
MedveMarci Jul 15, 2026
9f56bd8
Cleanup again
MedveMarci Jul 15, 2026
9f97077
Fixed OverrideRpNames function; the coroutine stops if the player's r…
MedveMarci Jul 15, 2026
8c3a456
Refactor CustomInfo and add FlagMigrator for deprecated flag handling…
MedveMarci Jul 20, 2026
341b97d
Fixed custom category limits
MedveMarci Jul 20, 2026
563afae
Fixed Fake SCP's door permission
MedveMarci Jul 20, 2026
5ac5c76
Mark ColorfulNickname, CustomInfoOrder, and NoUnitName modules as dep…
MedveMarci Jul 20, 2026
f6aae82
Added CustomTeam flag
MedveMarci Jul 23, 2026
e8f1a48
Added Timed spawns; More detailed Percentages command; Fixed handling…
MedveMarci Aug 5, 2026
dc0372c
Version bump
MedveMarci Aug 5, 2026
25cc645
Version bump2
MedveMarci Aug 5, 2026
4bd60a1
Quick version manager update
MedveMarci Aug 5, 2026
3b5a1e5
Downgraded System.Text.Json to 9.0.4 and removed System.ComponentModel
MedveMarci Aug 10, 2026
0fc0e37
Removed UCS Spawnpoint API; only local spawnpoint supported
MedveMarci Aug 10, 2026
2097594
Little tweaks for RoleValidator
MedveMarci Aug 10, 2026
f1e0830
Updated VersionManager
MedveMarci Aug 10, 2026
aea9d2e
Added CustomInfo formatter
MedveMarci Aug 15, 2026
2308fc9
Fixed "Collection was modified"
MedveMarci Aug 26, 2026
b9accf9
Fixed RoleAppearance when invalid or empty
MedveMarci Aug 26, 2026
7673a98
fix: the custom info parts will be translated by the client if it's n…
MedveMarci Aug 26, 2026
aff2fe1
Updated README.md
MedveMarci Aug 26, 2026
f495a76
Added OpenCollective funding
MedveMarci Aug 26, 2026
cf70751
9.6.0-rev3 version bump
MedveMarci Aug 26, 2026
a41f282
9.6.0 version bump
MedveMarci Aug 27, 2026
f9bb3ad
Fixed an xml doc
MedveMarci Aug 28, 2026
ba9ec9e
Cache what a CustomModule reads from its args, and reject empty requi…
MedveMarci Aug 28, 2026
5ec8fa6
Run every UCS cloud call through UnityWebRequest
MedveMarci Aug 28, 2026
03fdf16
Using LatestUnitName instead of the first one
MedveMarci Aug 28, 2026
1fa91c4
Cleaned up and formatted the solution
MedveMarci Aug 28, 2026
83c024e
Added several null checks
MedveMarci Aug 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions .github/FUNDING.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# These are supported funding model platforms

github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: ucs
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
polar: # Replace with a single Polar username
buy_me_a_coffee: # Replace with a single Buy Me a Coffee username
thanks_dev: # Replace with a single thanks.dev username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
63 changes: 42 additions & 21 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<div align="center"><a href="https://github.com/UncomplicatedCustomServer/UncomplicatedCustomRoles/releases/latest"><img src="https://img.shields.io/github/v/release/UncomplicatedCustomServer/UncomplicatedCustomRoles"></a> <a href="https://github.com/UncomplicatedCustomServer/UncomplicatedCustomRoles/releases/latest"><img src="https://img.shields.io/github/downloads/UncomplicatedCustomServer/UncomplicatedCustomRoles/total"></a> <a href="https://github.com/UncomplicatedCustomServer/UncomplicatedCustomRoles/pulls"><img src="https://img.shields.io/github/issues-pr/UncomplicatedCustomServer/UncomplicatedCustomRoles"></a> <a href="https://github.com/UncomplicatedCustomServer/UncomplicatedCustomRoles/pulls"><img src="https://img.shields.io/github/issues-pr-closed/UncomplicatedCustomServer/UncomplicatedCustomRoles"></a> <a href="https://github.com/UncomplicatedCustomServer/UncomplicatedCustomRoles/commits/main/"><img src="https://badgen.net/github/commits/UncomplicatedCustomServer/UncomplicatedCustomRoles/main"></a> <img src="https://img.shields.io/badge/Verified_Exiled_Plugin-ss">
<div align="center"><a href="https://github.com/UncomplicatedCustomServer/UncomplicatedCustomRoles/releases/latest"><img src="https://img.shields.io/github/v/release/UncomplicatedCustomServer/UncomplicatedCustomRoles"></a> <a href="https://github.com/UncomplicatedCustomServer/UncomplicatedCustomRoles/releases/latest"><img src="https://img.shields.io/github/downloads/UncomplicatedCustomServer/UncomplicatedCustomRoles/total"></a> <a href="https://github.com/UncomplicatedCustomServer/UncomplicatedCustomRoles/pulls"><img src="https://img.shields.io/github/issues-pr/UncomplicatedCustomServer/UncomplicatedCustomRoles"></a> <a href="https://github.com/UncomplicatedCustomServer/UncomplicatedCustomRoles/pulls"><img src="https://img.shields.io/github/issues-pr-closed/UncomplicatedCustomServer/UncomplicatedCustomRoles"></a> <a href="https://github.com/UncomplicatedCustomServer/UncomplicatedCustomRoles/commits/main/"><img src="https://badgen.net/github/commits/UncomplicatedCustomServer/UncomplicatedCustomRoles/main"></a> <a href="https://opencollective.com/ucs"><img src="https://img.shields.io/opencollective/all/ucs?label=OpenCollective%20backers&color=7FADF2"></a>

<img src="https://raw.githubusercontent.com/UncomplicatedCustomServer/UncomplicatedCustomRoles/refs/heads/resources/ucr_promo_banner.png">
<i>Easy, fully configurable and customizable custom roles for your SCP:SL Server!</i>
Expand All @@ -9,8 +9,11 @@
<br><br>
</div>

**LabAPI** >= `v1.x`
<br><br>
## Requirements
- **LabAPI** >= `v1.x`
- **Harmony** (`0Harmony.dll`) >= `v2.x`

<br>

## Localized READMEs
- [&#127467;&#127479; Français](https://github.com/UncomplicatedCustomServer/UncomplicatedCustomRoles/blob/main/Localization/README-FR.md)
Expand All @@ -20,26 +23,42 @@
- [&#127477;&#127473; Polski](https://github.com/UncomplicatedCustomServer/UncomplicatedCustomRoles/blob/main/Localization/README-PL.md)
- [🇨🇳 简体中文](https://github.com/UncomplicatedCustomServer/UncomplicatedCustomRoles/blob/main/Localization/README-CN.md)

> [!NOTE]
> The localized READMEs are written and updated by volunteers from the community, so they can fall behind this one.
> If a translation is missing something, or says something different, **this English README is the one that is up to date**.

## What's UncomplicatedCustomRoles
**UncomplicatedCustomRoles** or **UCR** is a plugin for **LabAPI** that allow you to create fully configurable and customizable custom role with YAML.\
**UncomplicatedCustomRoles** or **UCR** is a plugin for **LabAPI** that lets you create fully configurable and customizable custom roles with YAML.\
A custom role starts from a normal SCP:SL role and changes whatever you want about it: health, items, effects, spawn point, team, custom info and much more.\
With UCR, you can fully customize your Custom Roles by modifying almost every setting, allowing you to create whatever you can imagine: the only limit is your imagination

## Features
### 🖥️ Fully customizable Custom Roles
Let your imagination run wild with virtually complete customization of the basic roles.\
Health, tags, role, name, special mechanics: make your SCP:SL server one-of-a-kind!
### 🫂 Active community on Discord
Join our Discord community to chat with other users and even the developers!\
Interact, ask for help, share your knowledge and your roles: we’d love to have you!
### 📑 Exaustive documentation
Check out the [official UCR documentation](https://docs.ucr.ucserver.it/), where you'll find everything you need to use the plugin: from getting started to advanced settings!
Health, AHP, hume shield, stamina, scale, nickname, badge, role name, custom info, effects, damage multiplier, inventory, ammo, item limits and custom items: make your SCP:SL server one-of-a-kind!
### 🎯 Spawns exactly where and when you want
Pick how every role spawns: a random room, a whole zone, specific rooms, a spawn point you saved in-game, the position of another role, the Class-D cells, or simply wherever the player already is.\
Then tune when it happens: spawn chance, spawn delay, how many can be alive at the same time, the minimum amount of players, which vanilla roles it may replace and the permission a player needs to get it.
### 🧩 More than 25 built-in modules
Add extra mechanics to a role with a single line of config: damage resistance, life stealing, custom keycard permissions, item bans, pacifism until the role takes damage, silent footsteps, tesla gates and SCP-096 that ignore the role, a fake team, a custom custom info layout, a schematic attached to the player, and many more.
### 🚪 Escape system
Decide whether a role can escape and which role it becomes afterwards — with a different outcome depending on whether it escaped free or cuffed, and by whom — and let it keep its inventory on the way out.
### 🔗 Plays well with your other plugins
UCR integrates out of the box with **UncomplicatedCustomItems**, **UncomplicatedCustomTeams**, **Exiled CustomItems**, **ScriptedEvents**, **SLWardrobe**, **RespawnTimer** and **LabApiExtensions**.
### 🧪 Built-in role validator
Every role is checked while it is being loaded, and UCR tells you in the console what is wrong with it, so a typo in a config does not turn into a broken round.
### ⌨️ In-game commands
Manage your custom roles using the many built-in commands provided by UCR:\
`ucr list`, `ucr info`, `ucr role`, `ucr spawn`, `ucr cinfo`, `ucr reload`, `ucr spawnpoint`, `ucr percentages`, `ucr errors`, `ucr generate`, `ucr update`, `ucr version` and more.
### 🗂️ YAML based
You don't need to know how to code to use UCR: custom roles are created using `yml` ([YAML](https://en.wikipedia.org/wiki/YAML)) files, an extremely easy and intuitive serialization language!
### 📑 Exhaustive documentation
Check out the [official UCR documentation](https://docs.ucr.ucserver.it/), where you'll find everything you need to use the plugin: from getting started to advanced settings!
### 🔌 Designed for developers
UCR was also designed to make life easier for developers: integrating with the plugin is simple, intuitive, and well-documented!\
[Check it out!](https://docs.ucr.ucserver.it/developers/intro)
### ⌨️ In-game commands
Manage your custom roles using the many built-in commands provided by UCR.
### 🫂 Active community on Discord
Join our Discord community to chat with other users and even the developers!\
Interact, ask for help, share your knowledge and your roles: we’d love to have you!

## Bugs and plan
To track bugs and UCR planning, UCSC has made a FlySpray instance available.\
Expand All @@ -50,12 +69,14 @@ Check the [documentation](https://docs.ucr.ucserver.it/getting-started/installat

## If you use UCR, please consider making a donation
UCR is a plugin made by **UCS Collective**.\
Every plugin we create is **free** and **open-source**.\
Please consider donating something to support our work through **OpenCollective**:
Every plugin we create is **free** and **open-source**, and it always will be.\
What there is, is the time we spend writing the plugin, answering your questions on Discord and keeping everything working after every SCP:SL update.\
If UCR is running on your server, **please consider donating something through OpenCollective** — every contribution, however small, goes straight back into the plugins you are using:

<a href="https://opencollective.com/ucs"><img height="15" src="https://raw.githubusercontent.com/UncomplicatedCustomServer/UncomplicatedCustomRoles/refs/heads/resources/oc_icon.png">&nbsp;&nbsp;Donate</a>

## Contacts
### UncomplicatedCustomRoles
### UCS - UncomplicatedCustomServer
**Discord:** [https://discord.gg/5StRGu8EJV](https://discord.gg/5StRGu8EJV)

### FoxWorn3365
Expand All @@ -67,9 +88,9 @@ Please consider donating something to support our work through **OpenCollective*
**Discord:** `dr.agenda`

## Translation Credits
**French:** `@robocnop`\
**Italian:** `@foxworn`\
**Russian:** `@naxefir`\
**Français:** `@robocnop`\
**Italiano:** `@foxworn`\
**Русский:** `@naxefir`\
**Deutsch:** `@seekedstroy`\
**Polish:** `@.piwnica2137`\
**Simplified Chinese** `@Raiden-Yayi`
**Polski:** `@.piwnica2137`\
**简体中文:** `@Raiden-Yayi`
13 changes: 7 additions & 6 deletions UncomplicatedCustomRoles/API/Attributes/PluginCustomRole.cs
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
/*
* This file is a part of the UncomplicatedCustomRoles project.
*
*
* Copyright (c) 2023-present FoxWorn3365 (Federico Cosma) <me@fcosma.it>
*
*
* This file is licensed under the GNU Affero General Public License v3.0.
* You should have received a copy of the AGPL license along with this file.
* If not, see <https://www.gnu.org/licenses/>.
*/

using System;

namespace UncomplicatedCustomRoles.API.Attributes
namespace UncomplicatedCustomRoles.API.Attributes;

[AttributeUsage(AttributeTargets.Class)]
public class PluginCustomRole : Attribute
{
[AttributeUsage(AttributeTargets.Class)]
public class PluginCustomRole : Attribute { }
}
}
55 changes: 27 additions & 28 deletions UncomplicatedCustomRoles/API/Enums/CustomFlags.cs
Original file line number Diff line number Diff line change
@@ -1,40 +1,39 @@
/*
* This file is a part of the UncomplicatedCustomRoles project.
*
*
* Copyright (c) 2023-present FoxWorn3365 (Federico Cosma) <me@fcosma.it>
*
*
* This file is licensed under the GNU Affero General Public License v3.0.
* You should have received a copy of the AGPL license along with this file.
* If not, see <https://www.gnu.org/licenses/>.
*/

using System;

namespace UncomplicatedCustomRoles.API.Enums
namespace UncomplicatedCustomRoles.API.Enums;

[Flags]
public enum CustomFlags
{
[Flags]
public enum CustomFlags
{
NotExecutable = -1,
None = 0,
DoNotTriggerTeslaGates = 1 << 0,
LifeStealer = 1 << 1,
HalfLifeStealer = 1 << 2,
NotAffectedByAppearance = 1 << 3,
PacifismUntilDamage = 1 << 4,
CustomScpAnnouncer = 1 << 5,
ShowOnlyCustomInfo = 1 << 6,
SilentWalker = 1 << 7,
SilentAnnouncer = 1 << 8,
TutorialRagdoll = 1 << 9,
DoNotTrigger096 = 1 << 10,
BanKeycards = 1 << 11,
BanMedicals = 1 << 12,
BanRadios = 1 << 13,
BanFirearms = 1 << 14,
BanGrenades = 1 << 15,
BanSCPItems = 1 << 16,
BanMicroHID = 1 << 17,
BanArmors = 1 << 18,
}
NotExecutable = -1,
None = 0,
DoNotTriggerTeslaGates = 1 << 0,
LifeStealer = 1 << 1,
HalfLifeStealer = 1 << 2,
NotAffectedByAppearance = 1 << 3,
PacifismUntilDamage = 1 << 4,
CustomScpAnnouncer = 1 << 5,
ShowOnlyCustomInfo = 1 << 6,
SilentWalker = 1 << 7,
SilentAnnouncer = 1 << 8,
TutorialRagdoll = 1 << 9,
DoNotTrigger096 = 1 << 10,
BanKeycards = 1 << 11,
BanMedicals = 1 << 12,
BanRadios = 1 << 13,
BanFirearms = 1 << 14,
BanGrenades = 1 << 15,
BanSCPItems = 1 << 16,
BanMicroHID = 1 << 17,
BanArmors = 1 << 18
}
115 changes: 57 additions & 58 deletions UncomplicatedCustomRoles/API/Enums/DamageType.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,63 +8,62 @@
* If not, see <https://www.gnu.org/licenses/>.
*/

namespace UncomplicatedCustomRoles.API.Enums
namespace UncomplicatedCustomRoles.API.Enums;

public enum DamageType
{
public enum DamageType
{
Unknown,
Falldown,
Warhead,
Decontamination,
Asphyxiation,
Poison,
Bleeding,
Firearm,
MicroHid,
Tesla,
Scp,
Explosion,
Scp018,
Scp207,
Recontainment,
Crushed,
FemurBreaker,
PocketDimension,
FriendlyFireDetector,
SeveredHands,
SeveredEyes,
Custom,
Scp049,
Scp096,
Scp173,
Scp939,
Scp0492,
Scp106,
Crossvec,
Logicer,
Revolver,
Shotgun,
AK,
Com15,
Com18,
Fsp9,
E11Sr,
Hypothermia,
ParticleDisruptor,
CardiacArrest,
Com45,
Jailbird,
Frmg0,
A7,
Scp3114,
Strangled,
Marshmallow,
Scp1507,
Scp956,
SnowBall,
Scp127,
Silent,
GrayCandy,
Scp1509,
}
Unknown,
Falldown,
Warhead,
Decontamination,
Asphyxiation,
Poison,
Bleeding,
Firearm,
MicroHid,
Tesla,
Scp,
Explosion,
Scp018,
Scp207,
Recontainment,
Crushed,
FemurBreaker,
PocketDimension,
FriendlyFireDetector,
SeveredHands,
SeveredEyes,
Custom,
Scp049,
Scp096,
Scp173,
Scp939,
Scp0492,
Scp106,
Crossvec,
Logicer,
Revolver,
Shotgun,
AK,
Com15,
Com18,
Fsp9,
E11Sr,
Hypothermia,
ParticleDisruptor,
CardiacArrest,
Com45,
Jailbird,
Frmg0,
A7,
Scp3114,
Strangled,
Marshmallow,
Scp1507,
Scp956,
SnowBall,
Scp127,
Silent,
GrayCandy,
Scp1509
}
20 changes: 10 additions & 10 deletions UncomplicatedCustomRoles/API/Enums/LoadStatusType.cs
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
/*
* This file is a part of the UncomplicatedCustomRoles project.
*
*
* Copyright (c) 2023-present FoxWorn3365 (Federico Cosma) <me@fcosma.it>
*
*
* This file is licensed under the GNU Affero General Public License v3.0.
* You should have received a copy of the AGPL license along with this file.
* If not, see <https://www.gnu.org/licenses/>.
*/

namespace UncomplicatedCustomRoles.API.Enums
namespace UncomplicatedCustomRoles.API.Enums;

public enum LoadStatusType
{
public enum LoadStatusType
{
Success,
ValidatorError,
SameId
}
}
Success,
ValidatorError,
SameId,
Denied
}
Loading