From 03b712027a2d06687e9497b68fcd77ffa7d0f4a9 Mon Sep 17 00:00:00 2001 From: Miki_hero <100715076+Mikihero@users.noreply.github.com> Date: Mon, 30 Sep 2024 18:57:17 +0200 Subject: [PATCH] updated readme, exiled package, added roledamagereceived multiplier --- Common Utilities/Common Utilities.csproj | 2 +- Common Utilities/Config.cs | 16 +- .../EventHandlers/PlayerHandlers.cs | 5 +- .../EventHandlers/ServerHandlers.cs | 299 +++++++++--------- README.md | 167 ++++++---- 5 files changed, 264 insertions(+), 225 deletions(-) diff --git a/Common Utilities/Common Utilities.csproj b/Common Utilities/Common Utilities.csproj index 8a733f9..6618c58 100644 --- a/Common Utilities/Common Utilities.csproj +++ b/Common Utilities/Common Utilities.csproj @@ -23,7 +23,7 @@ - + diff --git a/Common Utilities/Config.cs b/Common Utilities/Config.cs index 957fd8f..ab29cd3 100644 --- a/Common Utilities/Config.cs +++ b/Common Utilities/Config.cs @@ -137,7 +137,7 @@ public class Config : IConfig }, }; - [Description("The list of custom 914 recipies. OriginalItem is the item being upgraded, NewItem is the item to upgrade to, and Chance is the percent chance of the upgrade happening. You can specify multiple upgrade choices for the same item.")] + [Description("The list of custom 914 recipies. OriginalItem is the item being upgraded, NewItem is the item to upgrade to, and Chance is the percent chance of the upgrade happening. You can specify multiple upgrade choices for the same item. For custom items use the item's name.")] public Dictionary> Scp914ItemChances { get; set; } = new() { { @@ -153,7 +153,7 @@ public class Config : IConfig }, }; - [Description("The list of custom 914 recipies for roles. Original is the role to be changed, New is the new role to assign, Chance is the % chance of the upgrade occuring.")] + [Description("The list of custom 914 recipies for roles. Original is the role to be changed, New is the new role to assign, Chance is the % chance of the upgrade occuring. For custom roles use the role's name.")] public Dictionary> Scp914ClassChanges { get; set; } = new() { { @@ -228,8 +228,16 @@ public class Config : IConfig [Description("If item cleanup should only happen in the Pocket Dimension or not.")] public bool ItemCleanupOnlyPocket { get; set; } = false; - [Description("A list of all roles and their damage modifiers. The number here is a multiplier, not a raw damage amount. Thus, setting it to 1 = normal damage, 1.5 = 50% more damage, and 0.5 = 50% less damage.")] - public Dictionary RoleDamageMultipliers { get; set; } = new() + [Description("A list of all roles and their damage dealt modifiers. The number here is a multiplier, not a raw damage amount. Thus, setting it to 1 = normal damage, 1.5 = 50% more damage, and 0.5 = 50% less damage.")] + public Dictionary RoleDamageDealtMultipliers { get; set; } = new() + { + { + RoleTypeId.Scp173, 1.0f + }, + }; + + [Description("List of roles and their damage received multipliers. 1 = normal damage, 1.5 = 50% more damage, 0.5 = 50% less damage.")] + public Dictionary RoleDamageReceivedMultipliers { get; set; } = new() { { RoleTypeId.Scp173, 1.0f diff --git a/Common Utilities/EventHandlers/PlayerHandlers.cs b/Common Utilities/EventHandlers/PlayerHandlers.cs index 49043a2..9d06540 100644 --- a/Common Utilities/EventHandlers/PlayerHandlers.cs +++ b/Common Utilities/EventHandlers/PlayerHandlers.cs @@ -101,9 +101,12 @@ public void OnPlayerDied(DiedEventArgs ev) public void OnPlayerHurting(HurtingEventArgs ev) { - if (config.RoleDamageMultipliers != null && ev.Attacker != null && config.RoleDamageMultipliers.TryGetValue(ev.Attacker.Role, out var damageMultiplier)) + if (config.RoleDamageDealtMultipliers != null && ev.Attacker != null && config.RoleDamageDealtMultipliers.TryGetValue(ev.Attacker.Role, out var damageMultiplier)) ev.Amount *= damageMultiplier; + if (config.RoleDamageReceivedMultipliers != null && config.RoleDamageReceivedMultipliers.TryGetValue(ev.Player.Role, out damageMultiplier)) + ev.Amount *= damageMultiplier; + if (config.DamageMultipliers != null && config.DamageMultipliers.TryGetValue(ev.DamageHandler.Type, out damageMultiplier)) ev.Amount *= damageMultiplier; diff --git a/Common Utilities/EventHandlers/ServerHandlers.cs b/Common Utilities/EventHandlers/ServerHandlers.cs index f580c43..003b7a3 100644 --- a/Common Utilities/EventHandlers/ServerHandlers.cs +++ b/Common Utilities/EventHandlers/ServerHandlers.cs @@ -1,202 +1,201 @@ // ReSharper disable IteratorNeverReturns -namespace Common_Utilities.EventHandlers -{ +namespace Common_Utilities.EventHandlers; + #pragma warning disable SA1313 // Parameter names should begin with lower-case letter - using System; - using System.Collections.Generic; +using System; +using System.Collections.Generic; - using Exiled.API.Features; - using Exiled.API.Features.Pickups; - using Exiled.API.Features.Roles; - using Exiled.Events.EventArgs.Server; - using Exiled.Events.EventArgs.Warhead; - using MEC; - using UnityEngine; - - public class ServerHandlers - { - private Config config => Plugin.Instance.Config; +using Exiled.API.Features; +using Exiled.API.Features.Pickups; +using Exiled.API.Features.Roles; +using Exiled.Events.EventArgs.Server; +using Exiled.Events.EventArgs.Warhead; +using MEC; +using UnityEngine; + +public class ServerHandlers +{ + private Config config => Plugin.Instance.Config; - private bool friendlyFireDisable; + private bool friendlyFireDisable; - public void OnRoundStarted() - { - if (config.AutonukeTime > -1) - Plugin.Coroutines.Add(Timing.CallDelayed(config.AutonukeTime, AutoNuke)); + public void OnRoundStarted() + { + if (config.AutonukeTime > -1) + Plugin.Coroutines.Add(Timing.CallDelayed(config.AutonukeTime, AutoNuke)); - if (config.RagdollCleanupDelay > 0) - Plugin.Coroutines.Add(Timing.RunCoroutine(RagdollCleanup())); + if (config.RagdollCleanupDelay > 0) + Plugin.Coroutines.Add(Timing.RunCoroutine(RagdollCleanup())); - if (config.ItemCleanupDelay > 0) - Plugin.Coroutines.Add(Timing.RunCoroutine(ItemCleanup())); - } + if (config.ItemCleanupDelay > 0) + Plugin.Coroutines.Add(Timing.RunCoroutine(ItemCleanup())); + } - public void OnWaitingForPlayers() + public void OnWaitingForPlayers() + { + if (config.AfkLimit > 0) { - if (config.AfkLimit > 0) - { - Plugin.AfkDict.Clear(); - Plugin.Coroutines.Add(Timing.RunCoroutine(AfkCheck())); - } + Plugin.AfkDict.Clear(); + Plugin.Coroutines.Add(Timing.RunCoroutine(AfkCheck())); + } - if (friendlyFireDisable) - { - Log.Debug($"{nameof(OnWaitingForPlayers)}: Disabling friendly fire."); - Server.FriendlyFire = false; - friendlyFireDisable = false; - } + if (friendlyFireDisable) + { + Log.Debug($"{nameof(OnWaitingForPlayers)}: Disabling friendly fire."); + Server.FriendlyFire = false; + friendlyFireDisable = false; + } - if (config.TimedBroadcastDelay > 0) - Plugin.Coroutines.Add(Timing.RunCoroutine(ServerBroadcast())); + if (config.TimedBroadcastDelay > 0) + Plugin.Coroutines.Add(Timing.RunCoroutine(ServerBroadcast())); - Warhead.IsLocked = false; - } + Warhead.IsLocked = false; + } - public void OnRoundEnded(RoundEndedEventArgs ev) + public void OnRoundEnded(RoundEndedEventArgs ev) + { + if (config.FriendlyFireOnRoundEnd && !Server.FriendlyFire) { - if (config.FriendlyFireOnRoundEnd && !Server.FriendlyFire) - { - Log.Debug($"{nameof(OnRoundEnded)}: Enabling friendly fire."); - Server.FriendlyFire = true; - friendlyFireDisable = true; - } + Log.Debug($"{nameof(OnRoundEnded)}: Enabling friendly fire."); + Server.FriendlyFire = true; + friendlyFireDisable = true; + } - Timing.KillCoroutines(Plugin.Coroutines.ToArray()); + Timing.KillCoroutines(Plugin.Coroutines.ToArray()); - Plugin.Coroutines.Clear(); - } + Plugin.Coroutines.Clear(); + } - public void OnRestartingRound() - { - foreach (CoroutineHandle coroutine in Plugin.Coroutines) - Timing.KillCoroutines(coroutine); - Plugin.Coroutines.Clear(); - } + public void OnRestartingRound() + { + foreach (CoroutineHandle coroutine in Plugin.Coroutines) + Timing.KillCoroutines(coroutine); + Plugin.Coroutines.Clear(); + } - public void OnWarheadStarting(StartingEventArgs _) - { - if (!config.ChangeWarheadColor) - return; + public void OnWarheadStarting(StartingEventArgs _) + { + if (!config.ChangeWarheadColor) + return; - foreach (Room room in Room.List) - room.Color = config.WarheadColor; - } + foreach (Room room in Room.List) + room.Color = config.WarheadColor; + } - public void OnWarheadStopping(StoppingEventArgs _) - { - if (!config.ChangeWarheadColor || Warhead.IsLocked) - return; + public void OnWarheadStopping(StoppingEventArgs _) + { + if (!config.ChangeWarheadColor || Warhead.IsLocked) + return; - foreach (Room room in Room.List) - room.ResetColor(); - } + foreach (Room room in Room.List) + room.ResetColor(); + } - private IEnumerator ServerBroadcast() + private IEnumerator ServerBroadcast() + { + while(true) { - while(true) - { - yield return Timing.WaitForSeconds(config.TimedBroadcastDelay); + yield return Timing.WaitForSeconds(config.TimedBroadcastDelay); - Map.Broadcast(config.TimedBroadcastDuration, config.TimedBroadcast); - } + Map.Broadcast(config.TimedBroadcastDuration, config.TimedBroadcast); } + } - private IEnumerator ItemCleanup() + private IEnumerator ItemCleanup() + { + while(true) { - while(true) - { - yield return Timing.WaitForSeconds(config.ItemCleanupDelay); + yield return Timing.WaitForSeconds(config.ItemCleanupDelay); - foreach (Pickup pickup in Pickup.List) - { - if (!config.ItemCleanupOnlyPocket || pickup.Position.y < -1500f) - pickup.Destroy(); - } + foreach (Pickup pickup in Pickup.List) + { + if (!config.ItemCleanupOnlyPocket || pickup.Position.y < -1500f) + pickup.Destroy(); } } + } - private IEnumerator RagdollCleanup() + private IEnumerator RagdollCleanup() + { + while(true) { - while(true) - { - yield return Timing.WaitForSeconds(config.RagdollCleanupDelay); + yield return Timing.WaitForSeconds(config.RagdollCleanupDelay); - foreach (Ragdoll ragdoll in Ragdoll.List) - { - if (!config.RagdollCleanupOnlyPocket || ragdoll.Position.y < -1500f) - ragdoll.Destroy(); - } + foreach (Ragdoll ragdoll in Ragdoll.List) + { + if (!config.RagdollCleanupOnlyPocket || ragdoll.Position.y < -1500f) + ragdoll.Destroy(); } } + } - private void AutoNuke() + private void AutoNuke() + { + if (!Warhead.IsInProgress) { - if (!Warhead.IsInProgress) + switch (config.AutonukeBroadcast.Duration) { - switch (config.AutonukeBroadcast.Duration) - { - case 0: - break; - case 1: - Cassie.Message(config.AutonukeBroadcast.Content); - break; - default: - Map.Broadcast(config.AutonukeBroadcast); - break; - } - - Warhead.Start(); + case 0: + break; + case 1: + Cassie.Message(config.AutonukeBroadcast.Content); + break; + default: + Map.Broadcast(config.AutonukeBroadcast); + break; } - if (config.AutonukeLock) - Warhead.IsLocked = true; + Warhead.Start(); } - private IEnumerator AfkCheck() + if (config.AutonukeLock) + Warhead.IsLocked = true; + } + + private IEnumerator AfkCheck() + { + while(true) { - while(true) - { - yield return Timing.WaitForSeconds(1f); + yield return Timing.WaitForSeconds(1f); - foreach (Player player in Player.List) + foreach (Player player in Player.List) + { + if (!Plugin.AfkDict.ContainsKey(player)) + Plugin.AfkDict.Add(player, new Tuple(0, player.Position)); + + if (player.Role.IsDead + || player.IsGodModeEnabled + || player.IsNoclipPermitted + || player.Role is FpcRole { IsGrounded: false } + || player.RemoteAdminPermissions.HasFlag(PlayerPermissions.AFKImmunity) + || config.AfkIgnoredRoles.Contains(player.Role.Type)) { - if (!Plugin.AfkDict.ContainsKey(player)) - Plugin.AfkDict.Add(player, new Tuple(0, player.Position)); - - if (player.Role.IsDead - || player.IsGodModeEnabled - || player.IsNoclipPermitted - || player.Role is FpcRole { IsGrounded: false } - || player.RemoteAdminPermissions.HasFlag(PlayerPermissions.AFKImmunity) - || config.AfkIgnoredRoles.Contains(player.Role.Type)) - { #pragma warning disable SA1013 - Log.Debug($"Player {player.Nickname} ({player.Role.Type}) is not a checkable player. NoClip: {player.IsNoclipPermitted} GodMode: {player.IsGodModeEnabled} IsNotGrounded: {player.Role is FpcRole { IsGrounded: false }} AFKImunity: {player.RemoteAdminPermissions.HasFlag(PlayerPermissions.AFKImmunity)}"); - continue; + Log.Debug($"Player {player.Nickname} ({player.Role.Type}) is not a checkable player. NoClip: {player.IsNoclipPermitted} GodMode: {player.IsGodModeEnabled} IsNotGrounded: {player.Role is FpcRole { IsGrounded: false }} AFKImunity: {player.RemoteAdminPermissions.HasFlag(PlayerPermissions.AFKImmunity)}"); + continue; #pragma warning restore SA1013 - } - - if ((Plugin.AfkDict[player].Item2 - player.Position).sqrMagnitude > 2) - { - Log.Debug($"Player {player.Nickname} has moved, resetting AFK timer."); - Plugin.AfkDict[player] = new Tuple(0, player.Position); - } - - if (Plugin.AfkDict[player].Item1 >= config.AfkLimit) - { - Plugin.AfkDict.Remove(player); - Log.Debug($"Kicking {player.Nickname} for being AFK."); - player.Kick("You were kicked by CommonUtilities for being AFK."); - } - else if (Plugin.AfkDict[player].Item1 >= (config.AfkLimit / 2)) - { - player.Broadcast(2, $"You have been AFK for {Plugin.AfkDict[player].Item1} seconds. You will be automatically kicked if you remain AFK for a total of {config.AfkLimit} seconds.", shouldClearPrevious: true); - } - - Plugin.AfkDict[player] = new Tuple(Plugin.AfkDict[player].Item1 + 1, Plugin.AfkDict[player].Item2); } + + if ((Plugin.AfkDict[player].Item2 - player.Position).sqrMagnitude > 2) + { + Log.Debug($"Player {player.Nickname} has moved, resetting AFK timer."); + Plugin.AfkDict[player] = new Tuple(0, player.Position); + } + + if (Plugin.AfkDict[player].Item1 >= config.AfkLimit) + { + Plugin.AfkDict.Remove(player); + Log.Debug($"Kicking {player.Nickname} for being AFK."); + player.Kick("You were kicked by CommonUtilities for being AFK."); + } + else if (Plugin.AfkDict[player].Item1 >= (config.AfkLimit / 2)) + { + player.Broadcast(2, $"You have been AFK for {Plugin.AfkDict[player].Item1} seconds. You will be automatically kicked if you remain AFK for a total of {config.AfkLimit} seconds.", shouldClearPrevious: true); + } + + Plugin.AfkDict[player] = new Tuple(Plugin.AfkDict[player].Item1 + 1, Plugin.AfkDict[player].Item2); } } } -} +} \ No newline at end of file diff --git a/README.md b/README.md index 71dcc25..11f45f9 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,39 @@ # Common-Utils Common Utils is a plugin that serves many common utilites in a day to day server life. -# Main Features +# Features ## 914 Features -- Ability to change 914's class upgrading (ex, DClass goes in; scientist comes out., supports Custom Roles) -- Ability to add custom 914 recipes (support Custom Items) +- Ability to change 914's class upgrades (ex. D Class goes in; scientist comes out, supports Custom Roles) +- Ability to add custom 914 recipes (supports Custom Items) +- Ability to make 914 apply effects and/or teleport players ## Server Broadcast/Welcoming Features -- Ability to completly configure a welcome message. -- Ability to completly configure a broadcast message, this can appear every 'x' amount seconds. -## Custom Inventories -- Ability to add custom inventories to all the main classes +- Ability to fully configure a welcome message. +- Ability to fully configure a periodic broadcast message. +## Starting Inventories +- Ability to add custom starting inventories to all main classes. +## Custom Cuffed Escape Rules +- Ability to configure which roles can escape while cuffed and what role they'll become. +## Radio Battery +- Ability to change radio battery drain rate. +## AutoNuke +- Ability to configure all the various aspects of the AutoNuke. +## Player Heatlth Info +- Ability to show player health in their custom info section. +## Friendly Fire on round end +- Ability to turn on Friendly Fire on round end (useful for no-FF servers). +## Warhead Color +- Ability to change the color of room lights during warhead. +## Anti AFK System +- Ability to configure various aspects of our Anti AFK system. +## Auto Cleanup +- Ability to configure periodic cleanups of both ragdolls and items. +## Damage Multipliers +- Ability to change the damage each role deals and receives. +- Ability to change the damage each DamageType deals. +## Health on Kill +- Ability to configure how much hp each role gets after a kill. +## Custom Health Values +- Ability to change the starting health of each class. # Default config: ```yaml CommonUtilities: @@ -22,22 +46,22 @@ CommonUtilities: NtfCaptain: ChaosMarauder ChaosMarauder: NtfCaptain # The text displayed at the timed interval specified below. - timed_broadcast: 'This server is running EXILED Common-Utilities, enjoy your stay!' + timed_broadcast: 'This server is running EXILED Common-Utilities, enjoy your stay!' # The time each timed broadcast will be displayed. timed_broadcast_duration: 5 # The delay between each timed broadcast. To disable timed broadcasts, set this to 0 - timed_broadcast_delay: 300 + timed_broadcast_delay: 0 # The message displayed to the player when they first join the server. Setting this to empty will disable these broadcasts. - join_message: 'Welcome %player%! Please read our rules!' + join_message: '' # The amount of time (in seconds) the join message is displayed. join_message_duration: 5 - # The amount of time (in seconds) after the round starts, before the facilities auto-nuke will start. - autonuke_time: 1500 + # The amount of time (in seconds) after the round starts, before the facilities auto-nuke will start. Set to -1 to disable. + autonuke_time: -1 # Wether or not the nuke should be unable to be disabled during the auto-nuke countdown. autonuke_lock: true # The message given to all players when the auto-nuke is triggered. A duration of 2 or more will be a text message on-screen. A duration of 1 makes it a cassie announcement. A duration of 0 disables it. autonuke_broadcast: - # The broadcast content + # The broadcast content content: 'The auto nuke has been activated.' # The broadcast duration duration: 10 @@ -46,40 +70,44 @@ CommonUtilities: # Indicates whether the broadcast should be shown or not show: true # Whether or not to show player's health under their name when you look at them. - player_health_info: true + player_health_info: false # Whether or not friendly fire should automatically turn on when a round ends (it will turn itself back off before the next round starts). friendly_fire_on_round_end: false # The multiplier applied to radio battery usage. Set to 0 to disable radio battery drain. radio_battery_drain_multiplier: 1 - # The color to use for lights while the warhead is active. In the RGBA format using values between 0 and 1. + # Whether to change the color of lights while warhead is active. + change_warhead_color: false + # The color to use for lights while the warhead is active. In the RGBA format using values between 0 and 1. Ignored if ChangeWarheadColor is set to false. warhead_color: r: 1 g: 0.2 b: 0.2 a: 1 # The maximum time, in seconds, that a player can be AFK before being kicked. Set to -1 to disable AFK system. - afk_limit: 120 + afk_limit: -1 # The roles that are ignored by the AFK system. afk_ignored_roles: - - Scp079 - - Spectator - - Tutorial + - Scp079 + - Spectator + - Tutorial + - Filmmaker + - Overwatch # Whether or not probabilities should be additive (50 + 50 = 100) or not (50 + 50 = 2 seperate 50% chances) additive_probabilities: false # The list of starting items for roles. ItemName is the item to give them, and Chance is the percent chance of them spawning with it, and Group allows you to restrict the item to only players with certain RA groups (Leave this as 'none' to allow all players to get the item). You can specify the same item multiple times. starting_inventories: ClassD: slot1: - - item_name: 'KeycardJanitor' - chance: 10 - group: 'none' - - item_name: 'Coin' - chance: 100 - group: 'none' + - item_name: 'KeycardJanitor' + chance: 10 + group: 'none' + - item_name: 'Coin' + chance: 100 + group: 'none' slot2: - - item_name: 'Flashlight' - chance: 100 - group: 'none' + - item_name: 'Flashlight' + chance: 100 + group: 'none' slot3: [] slot4: [] slot5: [] @@ -87,52 +115,52 @@ CommonUtilities: slot7: [] slot8: [] ammo: - - ammo_type: Ammo556x45 - amount: 200 - group: 'none' - # The list of custom 914 recipies. OriginalItem is the item being upgraded, NewItem is the item to upgrade to, and Chance is the percent chance of the upgrade happening. You can specify multiple upgrade choices for the same item. + - ammo_type: Ammo556x45 + amount: 200 + group: 'none' + # The list of custom 914 recipies. OriginalItem is the item being upgraded, NewItem is the item to upgrade to, and Chance is the percent chance of the upgrade happening. You can specify multiple upgrade choices for the same item. For custom items use the item's name. scp914_item_chances: Rough: - - original_item: 'KeycardO5' - new_item: 'MicroHID' - chance: 50 - count: 1 - # The list of custom 914 recipies for roles. Original is the role to be changed, New is the new role to assign, Chance is the % chance of the upgrade occuring. + - original: 'KeycardO5' + new: 'MicroHID' + chance: 50 + count: 1 + # The list of custom 914 recipies for roles. Original is the role to be changed, New is the new role to assign, Chance is the % chance of the upgrade occuring. For custom roles use the role's name. scp914_class_changes: Rough: - - original_role: 'ClassD' - new_role: 'Spectator' - chance: 100 - keep_inventory: true - keep_health: true - # The list of 914 teleport settings. Note that if you set "zone" to anything other than Unspecified, it will always select a random room from that zone that isn't in the ignoredRooms list, instead of the room type defined. + - original: 'ClassD' + new: 'Spectator' + chance: 100 + keep_inventory: true + keep_health: true + # The list of 914 teleport settings. Note that if you set "zone" to anything other than Unspecified, it will always select a random room from that zone that isn't in the ignoredRooms list, instead of the provided room type. scp914_teleport_chances: Rough: - - zone: Unspecified - ignored_rooms: - room: LczClassDSpawn - offset: - x: 0 - y: 0 - z: 0 - chance: 100 - damage: 0 - - zone: LightContainment - ignored_rooms: - - Lcz173 - room: Unknown - offset: - x: 0 - y: 0 - z: 0 - chance: 0 - damage: 0 + - zone: Unspecified + ignored_rooms: [] + room: LczClassDSpawn + offset: + x: 0 + y: 0 + z: 0 + chance: 50 + damage: 0 + - zone: LightContainment + ignored_rooms: + - Lcz173 + room: Unknown + offset: + x: 0 + y: 0 + z: 0 + chance: 100 + damage: 0 # A dictionary of random effects to apply to players when going through 914 on certain settings. scp914_effect_chances: Rough: - - effect: Bleeding - chance: 100 - duration: 0 + - effect: Bleeding + chance: 100 + duration: 0 # Determines if 914 effects are exclusive, meaning only one can be applied each time a player is processed by 914. scp914_effects_exclusivity: false # Whether or not SCPs are immune to effects gained from 914. @@ -145,8 +173,11 @@ CommonUtilities: item_cleanup_delay: 0 # If item cleanup should only happen in the Pocket Dimension or not. item_cleanup_only_pocket: false - # A list of all roles and their damage modifiers. The number here is a multiplier, not a raw damage amount. Thus, setting it to 1 = normal damage, 1.5 = 50% more damage, and 0.5 = 50% less damage. - role_damage_multipliers: + # A list of all roles and their damage dealt modifiers. The number here is a multiplier, not a raw damage amount. Thus, setting it to 1 = normal damage, 1.5 = 50% more damage, and 0.5 = 50% less damage. + role_damage_dealt_multipliers: + Scp173: 1 + # List of roles and their damage received multipliers. 1 = normal damage, 1.5 = 50% more damage, 0.5 = 50% less damage. + role_damage_received_multipliers: Scp173: 1 # A list of all Weapons and their damage modifiers. The number here is a multiplier, not a raw damage amount. Thus, setting it to 1 = normal damage, 1.5 = 50% more damage, and 0.5 = 50% less damage. damage_multipliers: @@ -154,9 +185,7 @@ CommonUtilities: # A list of roles and how much health they should be given when they kill someone. health_on_kill: Scp173: 0 - Scp939: 10 # A list of roles and what their default starting health should be. health_values: Scp173: 3200 - NtfCaptain: 150 ```