refactor
This commit is contained in:
parent
17c654d889
commit
96596e9c08
@ -1,32 +1,32 @@
|
|||||||
using System.Collections;
|
using LabApi.Events.Arguments.PlayerEvents;
|
||||||
using LabApi.Features;
|
|
||||||
using LabApi.Loader.Features.Plugins;
|
|
||||||
using LabApi.Events.Arguments.PlayerEvents;
|
|
||||||
using LabApi.Events.Handlers;
|
using LabApi.Events.Handlers;
|
||||||
|
using LabApi.Features;
|
||||||
using LabApi.Features.Wrappers;
|
using LabApi.Features.Wrappers;
|
||||||
using PlayerRoles;
|
using LabApi.Loader.Features.Plugins;
|
||||||
using Logger = LabApi.Features.Console.Logger;
|
|
||||||
using Version = System.Version;
|
|
||||||
using MEC;
|
using MEC;
|
||||||
|
using PlayerRoles;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
using Logger = LabApi.Features.Console.Logger;
|
||||||
|
using Random = UnityEngine.Random;
|
||||||
|
using Version = System.Version;
|
||||||
|
|
||||||
namespace AfkSwap;
|
namespace AfkSwap;
|
||||||
|
|
||||||
public class AfkSwap : Plugin
|
public class AfkSwap : Plugin
|
||||||
{
|
{
|
||||||
|
private const float AfkTimeLimit = 60; // 1 minute in seconds
|
||||||
|
private readonly Dictionary<Player, DateTime> _afkPlayers = new();
|
||||||
|
|
||||||
|
private readonly object _lock = new();
|
||||||
|
private readonly Dictionary<Player, Vector3> _playerPositions = new();
|
||||||
|
|
||||||
|
private readonly Dictionary<Player, DateTime> _playerSpawnTimes = new();
|
||||||
public override string Name => "AfkSwap";
|
public override string Name => "AfkSwap";
|
||||||
public override string Author => "Code002Lover";
|
public override string Author => "Code002Lover";
|
||||||
public override Version Version { get; } = new(1, 0, 0);
|
public override Version Version { get; } = new(1, 0, 0);
|
||||||
public override string Description => "Swaps AFK players with spectators after one minute.";
|
public override string Description => "Swaps AFK players with spectators after one minute.";
|
||||||
public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion);
|
public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion);
|
||||||
|
|
||||||
private readonly Dictionary<Player, DateTime> _playerSpawnTimes = new();
|
|
||||||
private readonly Dictionary<Player, Vector3> _playerPositions = new();
|
|
||||||
private readonly Dictionary<Player, DateTime> _afkPlayers = new();
|
|
||||||
private const float AfkTimeLimit = 60; // 1 minute in seconds
|
|
||||||
|
|
||||||
private readonly object _lock = new();
|
|
||||||
|
|
||||||
public override void Enable()
|
public override void Enable()
|
||||||
{
|
{
|
||||||
PlayerEvents.Spawned += OnPlayerSpawned;
|
PlayerEvents.Spawned += OnPlayerSpawned;
|
||||||
@ -60,7 +60,6 @@ public class AfkSwap : Plugin
|
|||||||
|
|
||||||
Logger.Debug($"Player {player.DisplayName} spawned");
|
Logger.Debug($"Player {player.DisplayName} spawned");
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private IEnumerator<float> CheckAfkPlayers()
|
private IEnumerator<float> CheckAfkPlayers()
|
||||||
@ -70,14 +69,17 @@ public class AfkSwap : Plugin
|
|||||||
{
|
{
|
||||||
lock (_lock)
|
lock (_lock)
|
||||||
{
|
{
|
||||||
foreach (var playerTime in _playerSpawnTimes.ToList().Where(playerTime => (DateTime.Now - playerTime.Value).TotalSeconds >= AfkTimeLimit))
|
foreach (var playerTime in _playerSpawnTimes.ToList().Where(playerTime =>
|
||||||
|
(DateTime.Now - playerTime.Value).TotalSeconds >= AfkTimeLimit))
|
||||||
{
|
{
|
||||||
if (playerTime.Key.Role is RoleTypeId.Spectator or RoleTypeId.Destroyed or RoleTypeId.Overwatch or RoleTypeId.Tutorial)
|
if (playerTime.Key.Role is RoleTypeId.Spectator or RoleTypeId.Destroyed or RoleTypeId.Overwatch
|
||||||
|
or RoleTypeId.Tutorial)
|
||||||
{
|
{
|
||||||
_playerSpawnTimes.Remove(playerTime.Key);
|
_playerSpawnTimes.Remove(playerTime.Key);
|
||||||
_playerPositions.Remove(playerTime.Key);
|
_playerPositions.Remove(playerTime.Key);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!_playerPositions[playerTime.Key].Equals(playerTime.Key.Position))
|
if (!_playerPositions[playerTime.Key].Equals(playerTime.Key.Position))
|
||||||
{
|
{
|
||||||
_playerSpawnTimes.Remove(playerTime.Key);
|
_playerSpawnTimes.Remove(playerTime.Key);
|
||||||
@ -97,13 +99,15 @@ public class AfkSwap : Plugin
|
|||||||
|
|
||||||
private void SwapWithSpectator(Player afkPlayer)
|
private void SwapWithSpectator(Player afkPlayer)
|
||||||
{
|
{
|
||||||
var spectators = Player.ReadyList.Where(p => p.Role == RoleTypeId.Spectator && (DateTime.Now - _afkPlayers[p]).TotalSeconds > 10).ToList();
|
var spectators = Player.ReadyList
|
||||||
|
.Where(p => p.Role == RoleTypeId.Spectator && (DateTime.Now - _afkPlayers[p]).TotalSeconds > 10).ToList();
|
||||||
if (!spectators.Any())
|
if (!spectators.Any())
|
||||||
{
|
{
|
||||||
Logger.Warn("No spectators to swap to");
|
Logger.Warn("No spectators to swap to");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var randomSpectator = spectators[UnityEngine.Random.Range(0, spectators.Count)];
|
|
||||||
|
var randomSpectator = spectators[Random.Range(0, spectators.Count)];
|
||||||
Logger.Debug($"Swapping {afkPlayer.DisplayName} with {randomSpectator.DisplayName}");
|
Logger.Debug($"Swapping {afkPlayer.DisplayName} with {randomSpectator.DisplayName}");
|
||||||
|
|
||||||
// Store the AFK player's position and role
|
// Store the AFK player's position and role
|
||||||
|
@ -26,12 +26,6 @@
|
|||||||
<Reference Include="Assembly-CSharp-firstpass">
|
<Reference Include="Assembly-CSharp-firstpass">
|
||||||
<HintPath>..\dependencies\Assembly-CSharp-firstpass.dll</HintPath>
|
<HintPath>..\dependencies\Assembly-CSharp-firstpass.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Mirror">
|
|
||||||
<HintPath>..\dependencies\Mirror.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Pooling">
|
|
||||||
<HintPath>..\dependencies\Pooling.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="UnityEngine.CoreModule">
|
<Reference Include="UnityEngine.CoreModule">
|
||||||
<HintPath>..\dependencies\UnityEngine.CoreModule.dll</HintPath>
|
<HintPath>..\dependencies\UnityEngine.CoreModule.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
@ -19,21 +19,6 @@
|
|||||||
<DebugType>none</DebugType>
|
<DebugType>none</DebugType>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<Reference Include="Assembly-CSharp">
|
|
||||||
<HintPath>..\dependencies\Assembly-CSharp.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Mirror">
|
|
||||||
<HintPath>..\dependencies\Mirror.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Pooling">
|
|
||||||
<HintPath>..\dependencies\Pooling.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="UnityEngine.CoreModule">
|
|
||||||
<HintPath>..\dependencies\UnityEngine.CoreModule.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Northwood.LabAPI" Version="1.0.2"/>
|
<PackageReference Include="Northwood.LabAPI" Version="1.0.2"/>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
using CustomPlayerEffects;
|
using LabApi.Events.Arguments.PlayerEvents;
|
||||||
using LabApi.Events.Arguments.PlayerEvents;
|
|
||||||
using LabApi.Events.Handlers;
|
using LabApi.Events.Handlers;
|
||||||
using LabApi.Features;
|
using LabApi.Features;
|
||||||
using LabApi.Features.Console;
|
using LabApi.Features.Console;
|
||||||
@ -7,8 +6,6 @@ using LabApi.Features.Wrappers;
|
|||||||
using LabApi.Loader.Features.Plugins;
|
using LabApi.Loader.Features.Plugins;
|
||||||
using Mirror;
|
using Mirror;
|
||||||
using PlayerRoles;
|
using PlayerRoles;
|
||||||
using PlayerRoles.PlayableScps.Scp3114;
|
|
||||||
using PlayerRoles.Ragdolls;
|
|
||||||
|
|
||||||
namespace CuffedFrenemies;
|
namespace CuffedFrenemies;
|
||||||
|
|
||||||
@ -33,10 +30,7 @@ public class CuffedFrenemies : Plugin
|
|||||||
|
|
||||||
private static void OnCuff(PlayerCuffedEventArgs ev)
|
private static void OnCuff(PlayerCuffedEventArgs ev)
|
||||||
{
|
{
|
||||||
if (ev.Target.Team is Team.ClassD or Team.Scientists)
|
if (ev.Target.Team is Team.ClassD or Team.Scientists) return;
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ev.Target.Team == ev.Player.Team)
|
if (ev.Target.Team == ev.Player.Team)
|
||||||
{
|
{
|
||||||
@ -44,10 +38,7 @@ public class CuffedFrenemies : Plugin
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ev.Target.Team is Team.SCPs or Team.Dead)
|
if (ev.Target.Team is Team.SCPs or Team.Dead) return;
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var newRole = ev.Target.Team == Team.ChaosInsurgency ? RoleTypeId.NtfPrivate : RoleTypeId.ChaosConscript;
|
var newRole = ev.Target.Team == Team.ChaosInsurgency ? RoleTypeId.NtfPrivate : RoleTypeId.ChaosConscript;
|
||||||
Logger.Debug($"Setting role to {newRole}");
|
Logger.Debug($"Setting role to {newRole}");
|
||||||
@ -62,12 +53,8 @@ public class CuffedFrenemies : Plugin
|
|||||||
ev.Target.SetRole(newRole);
|
ev.Target.SetRole(newRole);
|
||||||
ev.Target.ClearItems();
|
ev.Target.ClearItems();
|
||||||
|
|
||||||
foreach (var newItem in newItems)
|
foreach (var newItem in newItems) ev.Target.Inventory.UserInventory.Items.Add(newItem.Serial, newItem.Base);
|
||||||
{
|
|
||||||
ev.Target.Inventory.UserInventory.Items.Add(newItem.Serial,newItem.Base);
|
|
||||||
}
|
|
||||||
|
|
||||||
ev.Target.Position = newPos;
|
ev.Target.Position = newPos;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -26,9 +26,6 @@
|
|||||||
<Reference Include="Mirror">
|
<Reference Include="Mirror">
|
||||||
<HintPath>..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Mirror.dll</HintPath>
|
<HintPath>..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Mirror.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Pooling">
|
|
||||||
<HintPath>..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Pooling.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="UnityEngine.CoreModule">
|
<Reference Include="UnityEngine.CoreModule">
|
||||||
<HintPath>..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.CoreModule.dll</HintPath>
|
<HintPath>..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.CoreModule.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
@ -1,23 +1,24 @@
|
|||||||
using System.Drawing;
|
using Interactables.Interobjects.DoorUtils;
|
||||||
using CommandSystem.Commands.RemoteAdmin.Inventory;
|
|
||||||
using Interactables.Interobjects.DoorUtils;
|
|
||||||
using InventorySystem.Items;
|
using InventorySystem.Items;
|
||||||
using LabApi.Events.Arguments.PlayerEvents;
|
using LabApi.Events.Arguments.PlayerEvents;
|
||||||
using LabApi.Events.Arguments.ServerEvents;
|
using LabApi.Events.Arguments.ServerEvents;
|
||||||
using LabApi.Events.Handlers;
|
using LabApi.Events.Handlers;
|
||||||
using LabApi.Features;
|
using LabApi.Features;
|
||||||
using LabApi.Features.Console;
|
|
||||||
using LabApi.Loader.Features.Plugins;
|
|
||||||
using PlayerRoles;
|
|
||||||
using LabApi.Features.Wrappers;
|
using LabApi.Features.Wrappers;
|
||||||
|
using LabApi.Loader.Features.Plugins;
|
||||||
using MapGeneration;
|
using MapGeneration;
|
||||||
using Vector3 = UnityEngine.Vector3;
|
|
||||||
using MEC;
|
using MEC;
|
||||||
|
using PlayerRoles;
|
||||||
|
using UnityEngine;
|
||||||
|
using Logger = LabApi.Features.Console.Logger;
|
||||||
|
using Random = System.Random;
|
||||||
|
using Vector3 = UnityEngine.Vector3;
|
||||||
|
|
||||||
namespace CustomClasses;
|
namespace CustomClasses;
|
||||||
|
|
||||||
public class CustomClasses : Plugin
|
public class CustomClasses : Plugin
|
||||||
{
|
{
|
||||||
|
private readonly CustomClassManager _classManager = new();
|
||||||
public override string Name => "CustomClasses";
|
public override string Name => "CustomClasses";
|
||||||
public override string Author => "Code002Lover";
|
public override string Author => "Code002Lover";
|
||||||
public override Version Version { get; } = new(1, 0, 0);
|
public override Version Version { get; } = new(1, 0, 0);
|
||||||
@ -28,8 +29,6 @@ public class CustomClasses : Plugin
|
|||||||
public ResearchSubjectConfig ResearchSubjectConfig { get; set; } = new();
|
public ResearchSubjectConfig ResearchSubjectConfig { get; set; } = new();
|
||||||
public HeadGuardConfig HeadGuardConfig { get; set; } = new();
|
public HeadGuardConfig HeadGuardConfig { get; set; } = new();
|
||||||
|
|
||||||
private readonly CustomClassManager _classManager = new();
|
|
||||||
|
|
||||||
public override void Enable()
|
public override void Enable()
|
||||||
{
|
{
|
||||||
PlayerEvents.Spawned += OnPlayerSpawned;
|
PlayerEvents.Spawned += OnPlayerSpawned;
|
||||||
@ -57,10 +56,10 @@ public class CustomClasses : Plugin
|
|||||||
|
|
||||||
public class CustomClassManager
|
public class CustomClassManager
|
||||||
{
|
{
|
||||||
|
private readonly Dictionary<Type, ICustomClassHandler> _handlers = new();
|
||||||
private readonly object _lock = new();
|
private readonly object _lock = new();
|
||||||
private readonly Random _random = new();
|
private readonly Random _random = new();
|
||||||
private readonly Dictionary<Type, SpawnState> _spawnStates = new();
|
private readonly Dictionary<Type, SpawnState> _spawnStates = new();
|
||||||
private readonly Dictionary<Type, ICustomClassHandler> _handlers = new();
|
|
||||||
|
|
||||||
public CustomClassManager()
|
public CustomClassManager()
|
||||||
{
|
{
|
||||||
@ -90,10 +89,7 @@ public class CustomClassManager
|
|||||||
{
|
{
|
||||||
lock (_lock)
|
lock (_lock)
|
||||||
{
|
{
|
||||||
foreach (var key in _spawnStates.Keys.ToList())
|
foreach (var key in _spawnStates.Keys.ToList()) _spawnStates[key] = new SpawnState();
|
||||||
{
|
|
||||||
_spawnStates[key] = new SpawnState();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -121,10 +117,7 @@ public class CustomClassManager
|
|||||||
|
|
||||||
Logger.Debug($"Player spawning {configType} - {player.Nickname} - {state.Spawns} / {config.MaxSpawns}");
|
Logger.Debug($"Player spawning {configType} - {player.Nickname} - {state.Spawns} / {config.MaxSpawns}");
|
||||||
|
|
||||||
if (_handlers.TryGetValue(configType, out var handler))
|
if (_handlers.TryGetValue(configType, out var handler)) return handler.HandleSpawn(player, config, _random);
|
||||||
{
|
|
||||||
return handler.HandleSpawn(player, config, _random);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@ -150,6 +143,7 @@ public class JanitorHandler(CustomClassManager manager) : ICustomClassHandler
|
|||||||
player.AddItem(spawnItem, ItemAddReason.StartingItem);
|
player.AddItem(spawnItem, ItemAddReason.StartingItem);
|
||||||
Logger.Debug($"Gave player {player.Nickname} spawn item {spawnItem}");
|
Logger.Debug($"Gave player {player.Nickname} spawn item {spawnItem}");
|
||||||
}
|
}
|
||||||
|
|
||||||
player.SendBroadcast("You're a <color=#A0A0A0>Janitor</color>!", 3);
|
player.SendBroadcast("You're a <color=#A0A0A0>Janitor</color>!", 3);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -171,6 +165,7 @@ public class ResearchSubjectHandler(CustomClassManager manager) : ICustomClassHa
|
|||||||
player.AddItem(spawnItem, ItemAddReason.StartingItem);
|
player.AddItem(spawnItem, ItemAddReason.StartingItem);
|
||||||
Logger.Debug($"Gave player {player.Nickname} spawn item {spawnItem}");
|
Logger.Debug($"Gave player {player.Nickname} spawn item {spawnItem}");
|
||||||
}
|
}
|
||||||
|
|
||||||
player.SendBroadcast("You're a <color=#944710>Research Subject</color>!", 3);
|
player.SendBroadcast("You're a <color=#944710>Research Subject</color>!", 3);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -186,7 +181,8 @@ public class HeadGuardHandler(CustomClassManager manager) : ICustomClassHandler
|
|||||||
{
|
{
|
||||||
player.RemoveItem(ItemType.KeycardGuard);
|
player.RemoveItem(ItemType.KeycardGuard);
|
||||||
|
|
||||||
KeycardItem.CreateCustomKeycardTaskForce(player, "Head Guard Keycard", $"HG. {player.Nickname}", new KeycardLevels(1,1,2),UnityEngine.Color.blue,UnityEngine.Color.cyan, "1", 0);
|
KeycardItem.CreateCustomKeycardTaskForce(player, "Head Guard Keycard", $"HG. {player.Nickname}",
|
||||||
|
new KeycardLevels(1, 1, 2), Color.blue, Color.cyan, "1", 0);
|
||||||
|
|
||||||
player.AddItem(ItemType.Adrenaline, ItemAddReason.StartingItem);
|
player.AddItem(ItemType.Adrenaline, ItemAddReason.StartingItem);
|
||||||
|
|
||||||
|
@ -32,9 +32,6 @@
|
|||||||
<Reference Include="NorthwoodLib">
|
<Reference Include="NorthwoodLib">
|
||||||
<HintPath>..\dependencies\NorthwoodLib.dll</HintPath>
|
<HintPath>..\dependencies\NorthwoodLib.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Pooling">
|
|
||||||
<HintPath>..\dependencies\Pooling.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="UnityEngine.CoreModule">
|
<Reference Include="UnityEngine.CoreModule">
|
||||||
<HintPath>..\dependencies\UnityEngine.CoreModule.dll</HintPath>
|
<HintPath>..\dependencies\UnityEngine.CoreModule.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
@ -11,14 +11,13 @@ namespace CustomItemSpawn;
|
|||||||
|
|
||||||
public class CustomItemSpawn : Plugin<ItemConfig>
|
public class CustomItemSpawn : Plugin<ItemConfig>
|
||||||
{
|
{
|
||||||
|
private static CustomItemSpawn _singleton;
|
||||||
public override string Name => "CustomItemSpawn";
|
public override string Name => "CustomItemSpawn";
|
||||||
public override string Author => "Code002Lover";
|
public override string Author => "Code002Lover";
|
||||||
public override Version Version { get; } = new(1, 0, 0);
|
public override Version Version { get; } = new(1, 0, 0);
|
||||||
public override string Description => "Spawns items in a custom location.";
|
public override string Description => "Spawns items in a custom location.";
|
||||||
public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion);
|
public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion);
|
||||||
|
|
||||||
private static CustomItemSpawn _singleton;
|
|
||||||
|
|
||||||
public override void Enable()
|
public override void Enable()
|
||||||
{
|
{
|
||||||
_singleton = this;
|
_singleton = this;
|
||||||
|
@ -29,9 +29,6 @@
|
|||||||
<Reference Include="Mirror">
|
<Reference Include="Mirror">
|
||||||
<HintPath>..\dependencies\Mirror.dll</HintPath>
|
<HintPath>..\dependencies\Mirror.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Pooling">
|
|
||||||
<HintPath>..\dependencies\Pooling.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="UnityEngine.CoreModule">
|
<Reference Include="UnityEngine.CoreModule">
|
||||||
<HintPath>..\dependencies\UnityEngine.CoreModule.dll</HintPath>
|
<HintPath>..\dependencies\UnityEngine.CoreModule.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
@ -3,20 +3,22 @@ using LabApi.Features;
|
|||||||
using LabApi.Features.Console;
|
using LabApi.Features.Console;
|
||||||
using LabApi.Loader;
|
using LabApi.Loader;
|
||||||
|
|
||||||
namespace GamblingCoin
|
namespace GamblingCoin;
|
||||||
{
|
|
||||||
public class Plugin : LabApi.Loader.Features.Plugins.Plugin
|
public class Plugin : LabApi.Loader.Features.Plugins.Plugin
|
||||||
{
|
{
|
||||||
|
public static Plugin Singleton;
|
||||||
|
private GamblingCoinEventHandler _eventHandler;
|
||||||
|
public GamblingCoinChancesConfig ConfigChances;
|
||||||
|
|
||||||
|
public GamblingCoinGameplayConfig ConfigGameplay;
|
||||||
|
public GamblingCoinMessages ConfigMessages;
|
||||||
public override string Name => "GamblingCoin";
|
public override string Name => "GamblingCoin";
|
||||||
public override string Author => "Code002Lover";
|
public override string Author => "Code002Lover";
|
||||||
public override Version Version { get; } = new(1, 0, 0);
|
public override Version Version { get; } = new(1, 0, 0);
|
||||||
public override string Description => "Gamble your life away";
|
public override string Description => "Gamble your life away";
|
||||||
public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion);
|
public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion);
|
||||||
|
|
||||||
public GamblingCoinGameplayConfig ConfigGameplay;
|
|
||||||
public GamblingCoinMessages ConfigMessages;
|
|
||||||
public GamblingCoinChancesConfig ConfigChances;
|
|
||||||
|
|
||||||
public override void LoadConfigs()
|
public override void LoadConfigs()
|
||||||
{
|
{
|
||||||
base.LoadConfigs();
|
base.LoadConfigs();
|
||||||
@ -26,10 +28,6 @@ namespace GamblingCoin
|
|||||||
ConfigChances = this.LoadConfig<GamblingCoinChancesConfig>("chances.yml");
|
ConfigChances = this.LoadConfig<GamblingCoinChancesConfig>("chances.yml");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static Plugin Singleton;
|
|
||||||
private GamblingCoinEventHandler _eventHandler;
|
|
||||||
|
|
||||||
public override void Enable()
|
public override void Enable()
|
||||||
{
|
{
|
||||||
Logger.Debug("starting...");
|
Logger.Debug("starting...");
|
||||||
@ -45,4 +43,3 @@ namespace GamblingCoin
|
|||||||
PlayerEvents.FlippedCoin -= _eventHandler.OnFlippedCoin;
|
PlayerEvents.FlippedCoin -= _eventHandler.OnFlippedCoin;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
@ -1,7 +1,6 @@
|
|||||||
using CustomPlayerEffects;
|
using CustomPlayerEffects;
|
||||||
|
|
||||||
namespace GamblingCoin
|
namespace GamblingCoin;
|
||||||
{
|
|
||||||
|
|
||||||
public class GamblingCoinChancesConfig
|
public class GamblingCoinChancesConfig
|
||||||
{
|
{
|
||||||
@ -60,7 +59,8 @@ namespace GamblingCoin
|
|||||||
|
|
||||||
public class ItemPoolConfig
|
public class ItemPoolConfig
|
||||||
{
|
{
|
||||||
public ItemType[] CommonItems { get; set; } = {
|
public ItemType[] CommonItems { get; set; } =
|
||||||
|
{
|
||||||
ItemType.KeycardJanitor,
|
ItemType.KeycardJanitor,
|
||||||
ItemType.KeycardScientist,
|
ItemType.KeycardScientist,
|
||||||
ItemType.Medkit,
|
ItemType.Medkit,
|
||||||
@ -69,7 +69,8 @@ namespace GamblingCoin
|
|||||||
ItemType.Flashlight
|
ItemType.Flashlight
|
||||||
};
|
};
|
||||||
|
|
||||||
public ItemType[] UncommonItems { get; set; } = {
|
public ItemType[] UncommonItems { get; set; } =
|
||||||
|
{
|
||||||
ItemType.KeycardZoneManager,
|
ItemType.KeycardZoneManager,
|
||||||
ItemType.KeycardGuard,
|
ItemType.KeycardGuard,
|
||||||
ItemType.KeycardResearchCoordinator,
|
ItemType.KeycardResearchCoordinator,
|
||||||
@ -78,7 +79,8 @@ namespace GamblingCoin
|
|||||||
ItemType.GrenadeFlash
|
ItemType.GrenadeFlash
|
||||||
};
|
};
|
||||||
|
|
||||||
public ItemType[] RareItems { get; set; } = {
|
public ItemType[] RareItems { get; set; } =
|
||||||
|
{
|
||||||
ItemType.KeycardMTFPrivate,
|
ItemType.KeycardMTFPrivate,
|
||||||
ItemType.KeycardContainmentEngineer,
|
ItemType.KeycardContainmentEngineer,
|
||||||
ItemType.KeycardMTFOperative,
|
ItemType.KeycardMTFOperative,
|
||||||
@ -89,14 +91,16 @@ namespace GamblingCoin
|
|||||||
ItemType.GrenadeHE
|
ItemType.GrenadeHE
|
||||||
};
|
};
|
||||||
|
|
||||||
public ItemType[] EpicItems { get; set; } = {
|
public ItemType[] EpicItems { get; set; } =
|
||||||
|
{
|
||||||
ItemType.KeycardFacilityManager,
|
ItemType.KeycardFacilityManager,
|
||||||
ItemType.KeycardChaosInsurgency,
|
ItemType.KeycardChaosInsurgency,
|
||||||
ItemType.KeycardMTFCaptain,
|
ItemType.KeycardMTFCaptain,
|
||||||
ItemType.SCP500
|
ItemType.SCP500
|
||||||
};
|
};
|
||||||
|
|
||||||
public ItemType[] LegendaryItems { get; set; } = {
|
public ItemType[] LegendaryItems { get; set; } =
|
||||||
|
{
|
||||||
ItemType.KeycardO5,
|
ItemType.KeycardO5,
|
||||||
ItemType.MicroHID,
|
ItemType.MicroHID,
|
||||||
ItemType.Jailbird,
|
ItemType.Jailbird,
|
||||||
@ -132,8 +136,11 @@ namespace GamblingCoin
|
|||||||
|
|
||||||
public AdvancedEffectSettings Negative { get; set; } = new()
|
public AdvancedEffectSettings Negative { get; set; } = new()
|
||||||
{
|
{
|
||||||
Effects = new[] { nameof(Asphyxiated), nameof(AmnesiaVision), nameof(Bleeding), nameof(Blurred),
|
Effects = new[]
|
||||||
nameof(Concussed), nameof(Deafened), nameof(Disabled) },
|
{
|
||||||
|
nameof(Asphyxiated), nameof(AmnesiaVision), nameof(Bleeding), nameof(Blurred),
|
||||||
|
nameof(Concussed), nameof(Deafened), nameof(Disabled)
|
||||||
|
},
|
||||||
Settings = new Dictionary<string, EffectSettings>
|
Settings = new Dictionary<string, EffectSettings>
|
||||||
{
|
{
|
||||||
{ nameof(Asphyxiated), new EffectSettings(1, 10f, true) },
|
{ nameof(Asphyxiated), new EffectSettings(1, 10f, true) },
|
||||||
@ -153,7 +160,7 @@ namespace GamblingCoin
|
|||||||
{
|
{
|
||||||
{ nameof(InsufficientLighting), new EffectSettings(1, 30f, true) },
|
{ nameof(InsufficientLighting), new EffectSettings(1, 30f, true) },
|
||||||
{ nameof(AmnesiaVision), new EffectSettings(3, 30f, true) },
|
{ nameof(AmnesiaVision), new EffectSettings(3, 30f, true) },
|
||||||
{ nameof(Burned), new EffectSettings(3, 60f, true) },
|
{ nameof(Burned), new EffectSettings(3, 60f, true) }
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -162,16 +169,10 @@ namespace GamblingCoin
|
|||||||
{
|
{
|
||||||
public string[] Effects { get; set; }
|
public string[] Effects { get; set; }
|
||||||
public Dictionary<string, EffectSettings> Settings { get; set; }
|
public Dictionary<string, EffectSettings> Settings { get; set; }
|
||||||
|
|
||||||
public AdvancedEffectSettings(){}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class EffectSettings
|
public class EffectSettings
|
||||||
{
|
{
|
||||||
public byte Intensity { get; set; }
|
|
||||||
public float Duration { get; set; }
|
|
||||||
public bool AddDuration { get; set; }
|
|
||||||
|
|
||||||
public EffectSettings(byte intensity, float duration, bool addDuration)
|
public EffectSettings(byte intensity, float duration, bool addDuration)
|
||||||
{
|
{
|
||||||
Intensity = intensity;
|
Intensity = intensity;
|
||||||
@ -179,6 +180,11 @@ namespace GamblingCoin
|
|||||||
AddDuration = addDuration;
|
AddDuration = addDuration;
|
||||||
}
|
}
|
||||||
|
|
||||||
public EffectSettings(){}
|
public EffectSettings()
|
||||||
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public byte Intensity { get; set; }
|
||||||
|
public float Duration { get; set; }
|
||||||
|
public bool AddDuration { get; set; }
|
||||||
}
|
}
|
@ -1,20 +1,15 @@
|
|||||||
using System.Diagnostics;
|
|
||||||
using System.Numerics;
|
|
||||||
using CustomPlayerEffects;
|
|
||||||
using InventorySystem.Items;
|
|
||||||
using LabApi.Events.Arguments.PlayerEvents;
|
using LabApi.Events.Arguments.PlayerEvents;
|
||||||
using LabApi.Features.Wrappers;
|
using LabApi.Features.Wrappers;
|
||||||
using MapGeneration;
|
using MapGeneration;
|
||||||
using Mirror;
|
using Mirror;
|
||||||
using PlayerRoles;
|
using PlayerRoles;
|
||||||
using Respawning.Waves;
|
using Respawning;
|
||||||
using Utils;
|
using UnityEngine;
|
||||||
using Logger = LabApi.Features.Console.Logger;
|
|
||||||
using MicroHIDItem = InventorySystem.Items.MicroHID.MicroHIDItem;
|
using MicroHIDItem = InventorySystem.Items.MicroHID.MicroHIDItem;
|
||||||
using Random = UnityEngine.Random;
|
using Random = UnityEngine.Random;
|
||||||
|
|
||||||
namespace GamblingCoin
|
namespace GamblingCoin;
|
||||||
{
|
|
||||||
public class GamblingCoinEventHandler
|
public class GamblingCoinEventHandler
|
||||||
{
|
{
|
||||||
private readonly WeightedRandomExecutor<PlayerFlippedCoinEventArgs> _executor;
|
private readonly WeightedRandomExecutor<PlayerFlippedCoinEventArgs> _executor;
|
||||||
@ -37,9 +32,8 @@ namespace GamblingCoin
|
|||||||
{
|
{
|
||||||
x.Player.SendBroadcast(configMessages.SpawnWaveMessage, configGameplay.BroadcastDuration);
|
x.Player.SendBroadcast(configMessages.SpawnWaveMessage, configGameplay.BroadcastDuration);
|
||||||
|
|
||||||
if(GetPlayers().Any(player=>player.Role == RoleTypeId.Spectator)) {
|
if (GetPlayers().Any(player => player.Role == RoleTypeId.Spectator))
|
||||||
Respawning.WaveManager.InitiateRespawn(Respawning.WaveManager.Waves[Random.Range(0, Respawning.WaveManager.Waves.Count)]);
|
WaveManager.InitiateRespawn(WaveManager.Waves[Random.Range(0, WaveManager.Waves.Count)]);
|
||||||
}
|
|
||||||
}, configChances.SpawnWaveChance)
|
}, configChances.SpawnWaveChance)
|
||||||
.AddAction(x =>
|
.AddAction(x =>
|
||||||
{
|
{
|
||||||
@ -71,7 +65,7 @@ namespace GamblingCoin
|
|||||||
var itemIndex = Random.Range(0, items.Length);
|
var itemIndex = Random.Range(0, items.Length);
|
||||||
var item = items[itemIndex];
|
var item = items[itemIndex];
|
||||||
|
|
||||||
var pickup = Pickup.Create(item, player.Position + new UnityEngine.Vector3(0,1,0));
|
var pickup = Pickup.Create(item, player.Position + new Vector3(0, 1, 0));
|
||||||
if (pickup == null) return;
|
if (pickup == null) return;
|
||||||
|
|
||||||
if (item is ItemType.MicroHID)
|
if (item is ItemType.MicroHID)
|
||||||
@ -83,7 +77,7 @@ namespace GamblingCoin
|
|||||||
microItem.EnergyManager.ServerSetEnergy(microItem.ItemId.SerialNumber, 100);
|
microItem.EnergyManager.ServerSetEnergy(microItem.ItemId.SerialNumber, 100);
|
||||||
|
|
||||||
var newPickup = host.DropItem(micro);
|
var newPickup = host.DropItem(micro);
|
||||||
newPickup.Position = player.Position + new UnityEngine.Vector3(0, 1, 0);
|
newPickup.Position = player.Position + new Vector3(0, 1, 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -115,7 +109,8 @@ namespace GamblingCoin
|
|||||||
|
|
||||||
var newPos = randomRoom.Position;
|
var newPos = randomRoom.Position;
|
||||||
|
|
||||||
x.Player.Position = newPos + new UnityEngine.Vector3(0, configGameplay.TeleportHeightOffset, 0);;
|
x.Player.Position = newPos + new Vector3(0, configGameplay.TeleportHeightOffset, 0);
|
||||||
|
;
|
||||||
}, configChances.RandomTeleportChance)
|
}, configChances.RandomTeleportChance)
|
||||||
.AddAction(x =>
|
.AddAction(x =>
|
||||||
{
|
{
|
||||||
@ -176,7 +171,8 @@ namespace GamblingCoin
|
|||||||
|
|
||||||
var randomPlayer = players[Random.Range(0, GetPlayers().Length)];
|
var randomPlayer = players[Random.Range(0, GetPlayers().Length)];
|
||||||
|
|
||||||
while(randomPlayer.RoleBase.Team is Team.Dead or Team.SCPs) randomPlayer = players[Random.Range(0,GetPlayers().Length)];
|
while (randomPlayer.RoleBase.Team is Team.Dead or Team.SCPs)
|
||||||
|
randomPlayer = players[Random.Range(0, GetPlayers().Length)];
|
||||||
|
|
||||||
x.Player.SendBroadcast(configMessages.SwitchInventoryMessage, configGameplay.BroadcastDuration);
|
x.Player.SendBroadcast(configMessages.SwitchInventoryMessage, configGameplay.BroadcastDuration);
|
||||||
randomPlayer.SendBroadcast(configMessages.SwitchInventoryMessage, configGameplay.BroadcastDuration);
|
randomPlayer.SendBroadcast(configMessages.SwitchInventoryMessage, configGameplay.BroadcastDuration);
|
||||||
@ -186,21 +182,12 @@ namespace GamblingCoin
|
|||||||
var items = x.Player.Items;
|
var items = x.Player.Items;
|
||||||
|
|
||||||
randomPlayer.ClearInventory();
|
randomPlayer.ClearInventory();
|
||||||
foreach (var itemBase in items)
|
foreach (var itemBase in items) randomPlayer.AddItem(itemBase.Type);
|
||||||
{
|
|
||||||
randomPlayer.AddItem(itemBase.Type);
|
|
||||||
}
|
|
||||||
|
|
||||||
x.Player.ClearInventory();
|
x.Player.ClearInventory();
|
||||||
foreach (var randomPlayerItem in randomPlayerItems)
|
foreach (var randomPlayerItem in randomPlayerItems) x.Player.AddItem(randomPlayerItem.Type);
|
||||||
{
|
|
||||||
x.Player.AddItem(randomPlayerItem.Type);
|
|
||||||
}
|
|
||||||
}, configChances.SwitchInventoryChance)
|
}, configChances.SwitchInventoryChance)
|
||||||
.AddAction(x =>
|
.AddAction(x => { x.Player.CurrentItem?.DropItem().Destroy(); }, configChances.RemoveCoinChance);
|
||||||
{
|
|
||||||
x.Player.CurrentItem?.DropItem().Destroy();
|
|
||||||
}, configChances.RemoveCoinChance);
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -209,12 +196,13 @@ namespace GamblingCoin
|
|||||||
var effectChosen = settings.Effects[Random.Range(0, settings.Effects.Length)];
|
var effectChosen = settings.Effects[Random.Range(0, settings.Effects.Length)];
|
||||||
var effectSettings = settings.Settings[effectChosen];
|
var effectSettings = settings.Settings[effectChosen];
|
||||||
|
|
||||||
player.ReferenceHub.playerEffectsController.ChangeState(effectChosen, effectSettings.Intensity, effectSettings.Duration, effectSettings.AddDuration);
|
player.ReferenceHub.playerEffectsController.ChangeState(effectChosen, effectSettings.Intensity,
|
||||||
|
effectSettings.Duration, effectSettings.AddDuration);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpawnItemAtPlayer(Player player, ItemType item)
|
void SpawnItemAtPlayer(Player player, ItemType item)
|
||||||
{
|
{
|
||||||
var pickup = Pickup.Create(item, player.Position + new UnityEngine.Vector3(0,1,0));
|
var pickup = Pickup.Create(item, player.Position + new Vector3(0, 1, 0));
|
||||||
if (pickup == null) return;
|
if (pickup == null) return;
|
||||||
|
|
||||||
pickup.Spawn();
|
pickup.Spawn();
|
||||||
@ -237,4 +225,3 @@ namespace GamblingCoin
|
|||||||
_executor.Execute(ev);
|
_executor.Execute(ev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
@ -2,24 +2,6 @@ namespace GamblingCoin;
|
|||||||
|
|
||||||
public class WeightedRandomExecutor<TEvent>
|
public class WeightedRandomExecutor<TEvent>
|
||||||
{
|
{
|
||||||
private class WeightedAction
|
|
||||||
{
|
|
||||||
public Action<TEvent> Action { get; }
|
|
||||||
public double Weight { get; }
|
|
||||||
|
|
||||||
public WeightedAction(Action<TEvent> action, double weight)
|
|
||||||
{
|
|
||||||
if (weight <= 0)
|
|
||||||
throw new ArgumentOutOfRangeException(
|
|
||||||
nameof(weight),
|
|
||||||
"Weight must be positive."
|
|
||||||
);
|
|
||||||
|
|
||||||
Action = action ?? throw new ArgumentNullException(nameof(action));
|
|
||||||
Weight = weight;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private readonly List<WeightedAction> _actions = new();
|
private readonly List<WeightedAction> _actions = new();
|
||||||
private readonly Random _random = new();
|
private readonly Random _random = new();
|
||||||
private double _totalWeight;
|
private double _totalWeight;
|
||||||
@ -47,18 +29,14 @@ public class WeightedRandomExecutor<TEvent>
|
|||||||
public void Execute(TEvent ev)
|
public void Execute(TEvent ev)
|
||||||
{
|
{
|
||||||
if (_actions.Count == 0)
|
if (_actions.Count == 0)
|
||||||
{
|
|
||||||
throw new InvalidOperationException(
|
throw new InvalidOperationException(
|
||||||
"No actions have been added to execute."
|
"No actions have been added to execute."
|
||||||
);
|
);
|
||||||
}
|
|
||||||
|
|
||||||
if (_totalWeight <= 0) // Should not happen if AddAction validates weight > 0
|
if (_totalWeight <= 0) // Should not happen if AddAction validates weight > 0
|
||||||
{
|
|
||||||
throw new InvalidOperationException(
|
throw new InvalidOperationException(
|
||||||
"Total weight is zero or negative, cannot execute."
|
"Total weight is zero or negative, cannot execute."
|
||||||
);
|
);
|
||||||
}
|
|
||||||
|
|
||||||
var randomNumber = _random.NextDouble() * _totalWeight;
|
var randomNumber = _random.NextDouble() * _totalWeight;
|
||||||
double cumulativeWeight = 0;
|
double cumulativeWeight = 0;
|
||||||
@ -74,9 +52,24 @@ public class WeightedRandomExecutor<TEvent>
|
|||||||
// Fallback in case of floating point inaccuracies,
|
// Fallback in case of floating point inaccuracies,
|
||||||
// or if somehow randomNumber was exactly _totalWeight (NextDouble is < 1.0)
|
// or if somehow randomNumber was exactly _totalWeight (NextDouble is < 1.0)
|
||||||
// This should ideally pick the last item if all weights were summed up.
|
// This should ideally pick the last item if all weights were summed up.
|
||||||
if (_actions.Any())
|
if (_actions.Any()) _actions.Last().Action(ev);
|
||||||
|
}
|
||||||
|
|
||||||
|
private class WeightedAction
|
||||||
{
|
{
|
||||||
_actions.Last().Action(ev);
|
public WeightedAction(Action<TEvent> action, double weight)
|
||||||
}
|
{
|
||||||
|
if (weight <= 0)
|
||||||
|
throw new ArgumentOutOfRangeException(
|
||||||
|
nameof(weight),
|
||||||
|
"Weight must be positive."
|
||||||
|
);
|
||||||
|
|
||||||
|
Action = action ?? throw new ArgumentNullException(nameof(action));
|
||||||
|
Weight = weight;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Action<TEvent> Action { get; }
|
||||||
|
public double Weight { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,25 +1,24 @@
|
|||||||
using CustomPlayerEffects;
|
using CustomPlayerEffects;
|
||||||
using LabApi.Events.Arguments.Scp0492Events;
|
|
||||||
using LabApi.Events.Handlers;
|
|
||||||
using LabApi.Features;
|
|
||||||
using LabApi.Loader.Features.Plugins;
|
|
||||||
using InventorySystem.Items.Usables.Scp330;
|
using InventorySystem.Items.Usables.Scp330;
|
||||||
using LabApi.Events.Arguments.PlayerEvents;
|
using LabApi.Events.Arguments.PlayerEvents;
|
||||||
|
using LabApi.Events.Arguments.Scp0492Events;
|
||||||
using LabApi.Events.Arguments.ServerEvents;
|
using LabApi.Events.Arguments.ServerEvents;
|
||||||
|
using LabApi.Events.Handlers;
|
||||||
|
using LabApi.Features;
|
||||||
using LabApi.Features.Wrappers;
|
using LabApi.Features.Wrappers;
|
||||||
|
using LabApi.Loader.Features.Plugins;
|
||||||
|
|
||||||
namespace GrowingZombies;
|
namespace GrowingZombies;
|
||||||
|
|
||||||
public class GrowingZombies : Plugin
|
public class GrowingZombies : Plugin
|
||||||
{
|
{
|
||||||
|
private readonly Dictionary<Player, int> _zombieCorpseCount = new();
|
||||||
public override string Name => "GrowingZombies";
|
public override string Name => "GrowingZombies";
|
||||||
public override string Author => "Code002Lover";
|
public override string Author => "Code002Lover";
|
||||||
public override Version Version { get; } = new(1, 0, 0);
|
public override Version Version { get; } = new(1, 0, 0);
|
||||||
public override string Description => "Makes zombies grow stronger as they eat more";
|
public override string Description => "Makes zombies grow stronger as they eat more";
|
||||||
public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion);
|
public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion);
|
||||||
|
|
||||||
private readonly Dictionary<Player, int> _zombieCorpseCount = new();
|
|
||||||
|
|
||||||
public override void Enable()
|
public override void Enable()
|
||||||
{
|
{
|
||||||
Scp0492Events.ConsumedCorpse += OnZombieEat;
|
Scp0492Events.ConsumedCorpse += OnZombieEat;
|
||||||
@ -65,9 +64,7 @@ public class GrowingZombies : Plugin
|
|||||||
// Add damage resistance after eating multiple corpses
|
// Add damage resistance after eating multiple corpses
|
||||||
var damageResistance = (byte)Math.Min(0.5 - corpsesEaten * 0.5f, 2f);
|
var damageResistance = (byte)Math.Min(0.5 - corpsesEaten * 0.5f, 2f);
|
||||||
if (corpsesEaten >= 3)
|
if (corpsesEaten >= 3)
|
||||||
{
|
|
||||||
ev.Player.ReferenceHub.playerEffectsController.ChangeState<DamageReduction>(damageResistance, 20);
|
ev.Player.ReferenceHub.playerEffectsController.ChangeState<DamageReduction>(damageResistance, 20);
|
||||||
}
|
|
||||||
|
|
||||||
// Add regeneration effect after eating multiple corpses
|
// Add regeneration effect after eating multiple corpses
|
||||||
if (corpsesEaten < 5) return;
|
if (corpsesEaten < 5) return;
|
||||||
|
@ -23,18 +23,12 @@
|
|||||||
<Reference Include="Assembly-CSharp">
|
<Reference Include="Assembly-CSharp">
|
||||||
<HintPath>..\dependencies\Assembly-CSharp.dll</HintPath>
|
<HintPath>..\dependencies\Assembly-CSharp.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Assembly-CSharp-firstpass">
|
|
||||||
<HintPath>..\dependencies\Assembly-CSharp-firstpass.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Mirror">
|
<Reference Include="Mirror">
|
||||||
<HintPath>..\dependencies\Mirror.dll</HintPath>
|
<HintPath>..\dependencies\Mirror.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="NorthwoodLib">
|
<Reference Include="NorthwoodLib">
|
||||||
<HintPath>..\dependencies\NorthwoodLib.dll</HintPath>
|
<HintPath>..\dependencies\NorthwoodLib.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Pooling">
|
|
||||||
<HintPath>..\dependencies\Pooling.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="UnityEngine.CoreModule">
|
<Reference Include="UnityEngine.CoreModule">
|
||||||
<HintPath>..\dependencies\UnityEngine.CoreModule.dll</HintPath>
|
<HintPath>..\dependencies\UnityEngine.CoreModule.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
using System.Collections;
|
using System.Collections;
|
||||||
using Interactables.Interobjects;
|
|
||||||
using Interactables.Interobjects.DoorButtons;
|
using Interactables.Interobjects.DoorButtons;
|
||||||
using Interactables.Interobjects.DoorUtils;
|
using Interactables.Interobjects.DoorUtils;
|
||||||
using LabApi.Events.Arguments.PlayerEvents;
|
using LabApi.Events.Arguments.PlayerEvents;
|
||||||
@ -10,19 +9,19 @@ using UnityEngine;
|
|||||||
using KeycardItem = InventorySystem.Items.Keycards.KeycardItem;
|
using KeycardItem = InventorySystem.Items.Keycards.KeycardItem;
|
||||||
using Logger = LabApi.Features.Console.Logger;
|
using Logger = LabApi.Features.Console.Logger;
|
||||||
|
|
||||||
namespace KeycardButModern
|
namespace KeycardButModern;
|
||||||
{
|
|
||||||
public class Plugin : LabApi.Loader.Features.Plugins.Plugin
|
public class Plugin : LabApi.Loader.Features.Plugins.Plugin
|
||||||
{
|
{
|
||||||
|
public static Plugin Singleton;
|
||||||
|
|
||||||
|
public DoorLockConfiguration DoorLockConfiguration;
|
||||||
public override string Name => "KeycardButModern";
|
public override string Name => "KeycardButModern";
|
||||||
public override string Description => "Ever thought you wanted your keycard implanted in your body? No? Same.";
|
public override string Description => "Ever thought you wanted your keycard implanted in your body? No? Same.";
|
||||||
public override string Author => "Code002Lover";
|
public override string Author => "Code002Lover";
|
||||||
public override Version Version { get; } = new(1, 0, 0);
|
public override Version Version { get; } = new(1, 0, 0);
|
||||||
public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion);
|
public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion);
|
||||||
|
|
||||||
public DoorLockConfiguration DoorLockConfiguration;
|
|
||||||
public static Plugin Singleton;
|
|
||||||
|
|
||||||
public override void LoadConfigs()
|
public override void LoadConfigs()
|
||||||
{
|
{
|
||||||
base.LoadConfigs();
|
base.LoadConfigs();
|
||||||
@ -32,24 +31,15 @@ namespace KeycardButModern
|
|||||||
|
|
||||||
private void OnInteractingDoor(PlayerInteractingDoorEventArgs ev)
|
private void OnInteractingDoor(PlayerInteractingDoorEventArgs ev)
|
||||||
{
|
{
|
||||||
if (ev.CanOpen)
|
if (ev.CanOpen) return;
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ev.Door.IsLocked)
|
if (ev.Door.IsLocked) return;
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var playerItem in ev.Player.Items)
|
foreach (var playerItem in ev.Player.Items)
|
||||||
{
|
{
|
||||||
//is keycard?
|
//is keycard?
|
||||||
if (playerItem.Type is > ItemType.KeycardO5 and < ItemType.KeycardCustomTaskForce) continue;
|
if (playerItem.Type is > ItemType.KeycardO5 and < ItemType.KeycardCustomTaskForce) continue;
|
||||||
if (playerItem.Base is not KeycardItem keycardItem)
|
if (playerItem.Base is not KeycardItem keycardItem) continue;
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ev.Door.Base.CheckPermissions(keycardItem, out _)) continue;
|
if (!ev.Door.Base.CheckPermissions(keycardItem, out _)) continue;
|
||||||
ev.Door.IsOpened = !ev.Door.IsOpened;
|
ev.Door.IsOpened = !ev.Door.IsOpened;
|
||||||
@ -60,34 +50,23 @@ namespace KeycardButModern
|
|||||||
|
|
||||||
private void OnInteractingGenerator(PlayerInteractingGeneratorEventArgs ev)
|
private void OnInteractingGenerator(PlayerInteractingGeneratorEventArgs ev)
|
||||||
{
|
{
|
||||||
if (!ev.IsAllowed)
|
if (!ev.IsAllowed) return;
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ev.Player.CurrentItem?.Base is KeycardItem keycard)
|
if (ev.Player.CurrentItem?.Base is KeycardItem keycard)
|
||||||
{
|
|
||||||
if (ev.Generator.Base.CheckPermissions(keycard, out _))
|
if (ev.Generator.Base.CheckPermissions(keycard, out _))
|
||||||
{
|
{
|
||||||
ev.Generator.IsUnlocked = true;
|
ev.Generator.IsUnlocked = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (ev.Generator.IsUnlocked)
|
if (ev.Generator.IsUnlocked) return;
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
foreach (var playerItem in ev.Player.Items)
|
foreach (var playerItem in ev.Player.Items)
|
||||||
{
|
{
|
||||||
//is keycard?
|
//is keycard?
|
||||||
if (playerItem.Type is > ItemType.KeycardO5 and < ItemType.KeycardCustomTaskForce) continue;
|
if (playerItem.Type is > ItemType.KeycardO5 and < ItemType.KeycardCustomTaskForce) continue;
|
||||||
if (playerItem.Base is not KeycardItem keycardItem)
|
if (playerItem.Base is not KeycardItem keycardItem) continue;
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ev.Generator.Base.CheckPermissions(keycardItem, out _)) continue;
|
if (!ev.Generator.Base.CheckPermissions(keycardItem, out _)) continue;
|
||||||
ev.Generator.IsOpen = !ev.Generator.IsOpen;
|
ev.Generator.IsOpen = !ev.Generator.IsOpen;
|
||||||
@ -99,29 +78,19 @@ namespace KeycardButModern
|
|||||||
|
|
||||||
private void OnInteractingLocker(PlayerInteractingLockerEventArgs ev)
|
private void OnInteractingLocker(PlayerInteractingLockerEventArgs ev)
|
||||||
{
|
{
|
||||||
if (!ev.IsAllowed)
|
if (!ev.IsAllowed) return;
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ev.Chamber.Base.RequiredPermissions == DoorPermissionFlags.None)
|
if (ev.Chamber.Base.RequiredPermissions == DoorPermissionFlags.None) return;
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ev.Player.CurrentItem?.Base is KeycardItem keycard)
|
if (ev.Player.CurrentItem?.Base is KeycardItem keycard)
|
||||||
{
|
if (ev.Chamber.Base.CheckPermissions(keycard, out _))
|
||||||
if (ev.Chamber.Base.CheckPermissions(keycard, out _)) return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var playerItem in ev.Player.Items)
|
foreach (var playerItem in ev.Player.Items)
|
||||||
{
|
{
|
||||||
//is keycard?
|
//is keycard?
|
||||||
if (playerItem.Type is > ItemType.KeycardO5 and < ItemType.KeycardCustomTaskForce) continue;
|
if (playerItem.Type is > ItemType.KeycardO5 and < ItemType.KeycardCustomTaskForce) continue;
|
||||||
if (playerItem.Base is not KeycardItem keycardItem)
|
if (playerItem.Base is not KeycardItem keycardItem) continue;
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ev.Chamber.Base.CheckPermissions(keycardItem, out _)) continue;
|
if (!ev.Chamber.Base.CheckPermissions(keycardItem, out _)) continue;
|
||||||
ev.Chamber.IsOpen = !ev.Chamber.IsOpen;
|
ev.Chamber.IsOpen = !ev.Chamber.IsOpen;
|
||||||
@ -132,19 +101,13 @@ namespace KeycardButModern
|
|||||||
|
|
||||||
private void OnUnlockingWarhead(PlayerUnlockingWarheadButtonEventArgs ev)
|
private void OnUnlockingWarhead(PlayerUnlockingWarheadButtonEventArgs ev)
|
||||||
{
|
{
|
||||||
if (ev.IsAllowed)
|
if (ev.IsAllowed) return;
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var playerItem in ev.Player.Items)
|
foreach (var playerItem in ev.Player.Items)
|
||||||
{
|
{
|
||||||
//is keycard?
|
//is keycard?
|
||||||
if (playerItem.Type is > ItemType.KeycardO5 and < ItemType.KeycardCustomTaskForce) continue;
|
if (playerItem.Type is > ItemType.KeycardO5 and < ItemType.KeycardCustomTaskForce) continue;
|
||||||
if (playerItem.Base is not KeycardItem keycardItem)
|
if (playerItem.Base is not KeycardItem keycardItem) continue;
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!AlphaWarheadActivationPanel.Instance.CheckPermissions(keycardItem, out _)) continue;
|
if (!AlphaWarheadActivationPanel.Instance.CheckPermissions(keycardItem, out _)) continue;
|
||||||
ev.IsAllowed = true;
|
ev.IsAllowed = true;
|
||||||
@ -161,25 +124,14 @@ namespace KeycardButModern
|
|||||||
foreach (var hit in hits)
|
foreach (var hit in hits)
|
||||||
{
|
{
|
||||||
ButtonVariant doorButton = hit.collider.GetComponent<LcdButton>();
|
ButtonVariant doorButton = hit.collider.GetComponent<LcdButton>();
|
||||||
if (!doorButton)
|
if (!doorButton) doorButton = hit.collider.GetComponent<CheckpointKeycardButton>();
|
||||||
{
|
if (!doorButton) doorButton = hit.collider.GetComponent<KeycardButton>();
|
||||||
doorButton = hit.collider.GetComponent<CheckpointKeycardButton>();
|
if (!doorButton) doorButton = hit.collider.GetComponent<SimpleButton>();
|
||||||
}
|
|
||||||
if (!doorButton)
|
|
||||||
{
|
|
||||||
doorButton = hit.collider.GetComponent<KeycardButton>();
|
|
||||||
}
|
|
||||||
if (!doorButton)
|
|
||||||
{
|
|
||||||
doorButton = hit.collider.GetComponent<SimpleButton>();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!doorButton)
|
if (!doorButton) continue;
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
var doorVariant = DoorVariant.AllDoors.AsEnumerable()!.First(x => x.Buttons.Any(c=>c.GetInstanceID() == doorButton.GetInstanceID()));
|
var doorVariant = DoorVariant.AllDoors.AsEnumerable()!.First(x =>
|
||||||
|
x.Buttons.Any(c => c.GetInstanceID() == doorButton.GetInstanceID()));
|
||||||
|
|
||||||
doorVariant.ServerInteract(ev.Player.ReferenceHub, doorButton.ColliderId);
|
doorVariant.ServerInteract(ev.Player.ReferenceHub, doorButton.ColliderId);
|
||||||
StartDoorLockCoroutine(doorVariant);
|
StartDoorLockCoroutine(doorVariant);
|
||||||
@ -199,7 +151,6 @@ namespace KeycardButModern
|
|||||||
PlayerEvents.UnlockingWarheadButton += OnUnlockingWarhead;
|
PlayerEvents.UnlockingWarheadButton += OnUnlockingWarhead;
|
||||||
|
|
||||||
PlayerEvents.PlacedBulletHole += OnBulletHole;
|
PlayerEvents.PlacedBulletHole += OnBulletHole;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void StartDoorLockCoroutine(DoorVariant door)
|
private static void StartDoorLockCoroutine(DoorVariant door)
|
||||||
@ -230,4 +181,3 @@ namespace KeycardButModern
|
|||||||
Singleton = null;
|
Singleton = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
@ -2,8 +2,8 @@
|
|||||||
using LabApi.Features;
|
using LabApi.Features;
|
||||||
using LabApi.Loader.Features.Plugins;
|
using LabApi.Loader.Features.Plugins;
|
||||||
|
|
||||||
namespace LogEvents
|
namespace LogEvents;
|
||||||
{
|
|
||||||
internal class LogPlugin : Plugin
|
internal class LogPlugin : Plugin
|
||||||
{
|
{
|
||||||
public override string Name { get; } = "LogPlugin";
|
public override string Name { get; } = "LogPlugin";
|
||||||
@ -12,9 +12,9 @@ namespace LogEvents
|
|||||||
|
|
||||||
public override string Author { get; } = "Northwood";
|
public override string Author { get; } = "Northwood";
|
||||||
|
|
||||||
public override Version Version { get; } = new Version(1, 0, 0, 0);
|
public override Version Version { get; } = new(1, 0, 0, 0);
|
||||||
|
|
||||||
public override Version RequiredApiVersion { get; } = new Version(LabApiProperties.CompiledVersion);
|
public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion);
|
||||||
|
|
||||||
public MyCustomEventsHandler Events { get; } = new();
|
public MyCustomEventsHandler Events { get; } = new();
|
||||||
|
|
||||||
@ -28,4 +28,3 @@ namespace LogEvents
|
|||||||
CustomHandlersManager.UnregisterEventsHandler(Events);
|
CustomHandlersManager.UnregisterEventsHandler(Events);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
@ -723,7 +723,8 @@ internal class MyCustomEventsHandler : CustomEventsHandler
|
|||||||
|
|
||||||
public override void OnPlayerStayingInHazard(PlayersStayingInHazardEventArgs ev)
|
public override void OnPlayerStayingInHazard(PlayersStayingInHazardEventArgs ev)
|
||||||
{
|
{
|
||||||
Logger.Info($"{nameof(OnPlayerStayingInHazard)} triggered by {string.Join(", ", ev.AffectedPlayers.Select(x => x.UserId))}");
|
Logger.Info(
|
||||||
|
$"{nameof(OnPlayerStayingInHazard)} triggered by {string.Join(", ", ev.AffectedPlayers.Select(x => x.UserId))}");
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OnPlayerLeavingHazard(PlayerLeavingHazardEventArgs ev)
|
public override void OnPlayerLeavingHazard(PlayerLeavingHazardEventArgs ev)
|
||||||
@ -1397,5 +1398,4 @@ internal class MyCustomEventsHandler : CustomEventsHandler
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
}
|
}
|
@ -23,18 +23,6 @@
|
|||||||
<Reference Include="Assembly-CSharp">
|
<Reference Include="Assembly-CSharp">
|
||||||
<HintPath>..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Assembly-CSharp.dll</HintPath>
|
<HintPath>..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Assembly-CSharp.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Mirror">
|
|
||||||
<HintPath>..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Mirror.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="UnityEngine.CoreModule">
|
|
||||||
<HintPath>..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.CoreModule.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="UnityEngine.Physics2DModule">
|
|
||||||
<HintPath>..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.Physics2DModule.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="UnityEngine.PhysicsModule">
|
|
||||||
<HintPath>..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.PhysicsModule.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
using System.Runtime.Serialization;
|
using LabApi.Events.Arguments.PlayerEvents;
|
||||||
using LabApi.Events.Arguments.PlayerEvents;
|
|
||||||
using LabApi.Events.Handlers;
|
using LabApi.Events.Handlers;
|
||||||
using LabApi.Features;
|
using LabApi.Features;
|
||||||
using LabApi.Features.Console;
|
using LabApi.Features.Console;
|
||||||
@ -9,6 +8,11 @@ namespace RangeBan;
|
|||||||
|
|
||||||
public class RangeBan : Plugin<RangeBanConfig>
|
public class RangeBan : Plugin<RangeBanConfig>
|
||||||
{
|
{
|
||||||
|
public override string Name => "RangeBan";
|
||||||
|
public override string Author => "Code002Lover";
|
||||||
|
public override Version Version { get; } = new(1, 0, 0);
|
||||||
|
public override string Description => "Ban IP Ranges with ease";
|
||||||
|
public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion);
|
||||||
|
|
||||||
public override void Enable()
|
public override void Enable()
|
||||||
{
|
{
|
||||||
@ -26,16 +30,11 @@ public class RangeBan: Plugin<RangeBanConfig>
|
|||||||
{
|
{
|
||||||
Logger.Debug($"Ranges: {string.Join(" ; ", Config!.IpRanges)}");
|
Logger.Debug($"Ranges: {string.Join(" ; ", Config!.IpRanges)}");
|
||||||
if (!Config!.IpRanges.Any(configIpRange => IsInRange(configIpRange, ev.IpAddress))) return;
|
if (!Config!.IpRanges.Any(configIpRange => IsInRange(configIpRange, ev.IpAddress))) return;
|
||||||
ev.RejectCustom("Your IP belongs to a banned player, please contact the server administrator for more information.");
|
ev.RejectCustom(
|
||||||
|
"Your IP belongs to a banned player, please contact the server administrator for more information.");
|
||||||
Logger.Warn($"Player with IP {ev.IpAddress} got kicked. UserId: {ev.UserId}");
|
Logger.Warn($"Player with IP {ev.IpAddress} got kicked. UserId: {ev.UserId}");
|
||||||
}
|
}
|
||||||
|
|
||||||
public override string Name => "RangeBan";
|
|
||||||
public override string Author => "Code002Lover";
|
|
||||||
public override Version Version { get; } = new(1, 0, 0);
|
|
||||||
public override string Description => "Ban IP Ranges with ease";
|
|
||||||
public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion);
|
|
||||||
|
|
||||||
|
|
||||||
public static bool IsInRange(string range, string ip)
|
public static bool IsInRange(string range, string ip)
|
||||||
{
|
{
|
||||||
@ -46,29 +45,24 @@ public class RangeBan: Plugin<RangeBanConfig>
|
|||||||
if (!range.Contains("/"))
|
if (!range.Contains("/"))
|
||||||
{
|
{
|
||||||
//We only handle direct IPs and CIDR
|
//We only handle direct IPs and CIDR
|
||||||
if (range.Split('.').Length != 4)
|
if (range.Split('.').Length != 4) return false;
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ip == range;
|
return ip == range;
|
||||||
};
|
}
|
||||||
|
|
||||||
|
;
|
||||||
|
|
||||||
var parts = range.Split('/');
|
var parts = range.Split('/');
|
||||||
if (parts.Length != 2 || !int.TryParse(parts[1], out var cidrBits))
|
if (parts.Length != 2 || !int.TryParse(parts[1], out var cidrBits))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (cidrBits > 32)
|
if (cidrBits > 32) return false;
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
var networkAddress = IPToUInt32(parts[0]);
|
var networkAddress = IPToUInt32(parts[0]);
|
||||||
var mask = uint.MaxValue << (32 - cidrBits);
|
var mask = uint.MaxValue << (32 - cidrBits);
|
||||||
var ipAddress = IPToUInt32(ip);
|
var ipAddress = IPToUInt32(ip);
|
||||||
|
|
||||||
return (ipAddress & mask) == (networkAddress & mask);
|
return (ipAddress & mask) == (networkAddress & mask);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static uint IPToUInt32(string ipAddress)
|
private static uint IPToUInt32(string ipAddress)
|
||||||
@ -84,6 +78,7 @@ public class RangeBan: Plugin<RangeBanConfig>
|
|||||||
throw new ArgumentException("Invalid IP address segment");
|
throw new ArgumentException("Invalid IP address segment");
|
||||||
result = (result << 8) | part;
|
result = (result << 8) | part;
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,18 +19,6 @@
|
|||||||
<DebugType>none</DebugType>
|
<DebugType>none</DebugType>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<Reference Include="Assembly-CSharp">
|
|
||||||
<HintPath>..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Assembly-CSharp.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Mirror">
|
|
||||||
<HintPath>..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Mirror.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="UnityEngine.CoreModule">
|
|
||||||
<HintPath>..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.CoreModule.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Northwood.LabAPI" Version="1.0.2"/>
|
<PackageReference Include="Northwood.LabAPI" Version="1.0.2"/>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
@ -12,20 +12,20 @@ using PlayerRoles.PlayableScps.Scp096;
|
|||||||
using PlayerRoles.PlayableScps.Scp3114;
|
using PlayerRoles.PlayableScps.Scp3114;
|
||||||
using Timer = System.Timers.Timer;
|
using Timer = System.Timers.Timer;
|
||||||
|
|
||||||
namespace SCPTeamHint
|
namespace SCPTeamHint;
|
||||||
{
|
|
||||||
public class Plugin : LabApi.Loader.Features.Plugins.Plugin
|
public class Plugin : LabApi.Loader.Features.Plugins.Plugin
|
||||||
{
|
{
|
||||||
|
private readonly object _hintsLock = new();
|
||||||
|
private readonly Dictionary<Player, Hint> _spectatorHints = new();
|
||||||
|
|
||||||
|
private Timer _timer;
|
||||||
public override string Name => "SCPTeamHint";
|
public override string Name => "SCPTeamHint";
|
||||||
public override string Author => "HoherGeist, Code002Lover";
|
public override string Author => "HoherGeist, Code002Lover";
|
||||||
public override Version Version { get; } = new(1, 0, 0);
|
public override Version Version { get; } = new(1, 0, 0);
|
||||||
public override string Description => "Displays information about your SCP Teammates";
|
public override string Description => "Displays information about your SCP Teammates";
|
||||||
public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion);
|
public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion);
|
||||||
|
|
||||||
private Timer _timer;
|
|
||||||
private readonly object _hintsLock = new();
|
|
||||||
private readonly Dictionary<Player,Hint> _spectatorHints = new();
|
|
||||||
|
|
||||||
public override void Enable()
|
public override void Enable()
|
||||||
{
|
{
|
||||||
Logger.Debug("Apple juice");
|
Logger.Debug("Apple juice");
|
||||||
@ -52,8 +52,6 @@ namespace SCPTeamHint
|
|||||||
|
|
||||||
lock (_hintsLock)
|
lock (_hintsLock)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
foreach (var player in Player.ReadyList.Where(x => !x.IsHost && !x.IsDummy && x.IsSCP))
|
foreach (var player in Player.ReadyList.Where(x => !x.IsHost && !x.IsDummy && x.IsSCP))
|
||||||
{
|
{
|
||||||
var text =
|
var text =
|
||||||
@ -115,12 +113,10 @@ namespace SCPTeamHint
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Logger.Debug($"Player {player.Nickname} is on team {player.RoleBase.Team} | hide: {player.RoleBase.Team != Team.SCPs}");
|
Logger.Debug(
|
||||||
|
$"Player {player.Nickname} is on team {player.RoleBase.Team} | hide: {player.RoleBase.Team != Team.SCPs}");
|
||||||
hint.Hide = player.RoleBase.Team != Team.SCPs;
|
hint.Hide = player.RoleBase.Team != Team.SCPs;
|
||||||
if (!hint.Hide)
|
if (!hint.Hide) hint.Text = hintText;
|
||||||
{
|
|
||||||
hint.Text = hintText;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnJoin(PlayerJoinedEventArgs ev)
|
private void OnJoin(PlayerJoinedEventArgs ev)
|
||||||
@ -139,7 +135,6 @@ namespace SCPTeamHint
|
|||||||
{
|
{
|
||||||
_spectatorHints[ev.Player] = hint;
|
_spectatorHints[ev.Player] = hint;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnLeft(PlayerLeftEventArgs ev)
|
private void OnLeft(PlayerLeftEventArgs ev)
|
||||||
@ -152,4 +147,3 @@ namespace SCPTeamHint
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
@ -20,17 +20,12 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Northwood.LabAPI" Version="1.0.2"/>
|
<PackageReference Include="Northwood.LabAPI" Version="1.0.2"/>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="0Harmony">
|
|
||||||
<HintPath>..\dependencies\0Harmony.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Assembly-CSharp">
|
<Reference Include="Assembly-CSharp">
|
||||||
<HintPath>..\dependencies\Assembly-CSharp.dll</HintPath>
|
<HintPath>..\dependencies\Assembly-CSharp.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
using LabApi.Events.Handlers;
|
using LabApi.Features;
|
||||||
using LabApi.Features;
|
|
||||||
using LabApi.Loader.Features.Plugins;
|
using LabApi.Loader.Features.Plugins;
|
||||||
|
|
||||||
namespace ScpSwap;
|
namespace ScpSwap;
|
||||||
@ -18,6 +17,5 @@ public class ScpSwap : Plugin
|
|||||||
|
|
||||||
public override void Disable()
|
public override void Disable()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -40,7 +40,7 @@ public class SwapCommand : ICommand
|
|||||||
"096",
|
"096",
|
||||||
"106",
|
"106",
|
||||||
"173",
|
"173",
|
||||||
"939",
|
"939"
|
||||||
];
|
];
|
||||||
|
|
||||||
var arg = arguments.First();
|
var arg = arguments.First();
|
||||||
@ -51,7 +51,8 @@ public class SwapCommand : ICommand
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Player.List.Where(x=>x.IsSCP).Select(x=>x.RoleBase).Any(playerRole => playerRole.RoleName == "SCP-" + arg))
|
if (Player.List.Where(x => x.IsSCP).Select(x => x.RoleBase)
|
||||||
|
.Any(playerRole => playerRole.RoleName == "SCP-" + arg))
|
||||||
{
|
{
|
||||||
response = "Already exists";
|
response = "Already exists";
|
||||||
return false;
|
return false;
|
||||||
|
@ -8,8 +8,8 @@ using UnityEngine;
|
|||||||
using Logger = LabApi.Features.Console.Logger;
|
using Logger = LabApi.Features.Console.Logger;
|
||||||
using TimedGrenadePickup = InventorySystem.Items.ThrowableProjectiles.TimedGrenadePickup;
|
using TimedGrenadePickup = InventorySystem.Items.ThrowableProjectiles.TimedGrenadePickup;
|
||||||
|
|
||||||
namespace SensitiveGrenades
|
namespace SensitiveGrenades;
|
||||||
{
|
|
||||||
public class SensitiveGrenades : Plugin
|
public class SensitiveGrenades : Plugin
|
||||||
{
|
{
|
||||||
public override string Name => "SensitiveGrenades";
|
public override string Name => "SensitiveGrenades";
|
||||||
@ -50,4 +50,3 @@ namespace SensitiveGrenades
|
|||||||
Logger.Debug("unloading...");
|
Logger.Debug("unloading...");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
@ -30,9 +30,6 @@
|
|||||||
<Reference Include="UnityEngine.CoreModule">
|
<Reference Include="UnityEngine.CoreModule">
|
||||||
<HintPath>..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.CoreModule.dll</HintPath>
|
<HintPath>..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.CoreModule.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="UnityEngine.Physics2DModule">
|
|
||||||
<HintPath>..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.Physics2DModule.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="UnityEngine.PhysicsModule">
|
<Reference Include="UnityEngine.PhysicsModule">
|
||||||
<HintPath>..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.PhysicsModule.dll</HintPath>
|
<HintPath>..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.PhysicsModule.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
@ -36,16 +36,14 @@ public class ServerHints: Plugin
|
|||||||
{
|
{
|
||||||
ServerEvents.RoundStarted -= OnRoundStarted;
|
ServerEvents.RoundStarted -= OnRoundStarted;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnRoundStarted()
|
private void OnRoundStarted()
|
||||||
{
|
{
|
||||||
var random = new Random();
|
var random = new Random();
|
||||||
var hint = Hints[random.Next(Hints.Length)];
|
var hint = Hints[random.Next(Hints.Length)];
|
||||||
Timing.CallDelayed(1, () =>
|
Timing.CallDelayed(1, () =>
|
||||||
{
|
{
|
||||||
foreach (var player in Player.ReadyList)
|
foreach (var player in Player.ReadyList) player.SendBroadcast($"<color=grey>{hint}</color>", 3);
|
||||||
{
|
|
||||||
player.SendBroadcast($"<color=grey>{hint}</color>", 3);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -26,15 +26,9 @@
|
|||||||
<Reference Include="Assembly-CSharp-firstpass">
|
<Reference Include="Assembly-CSharp-firstpass">
|
||||||
<HintPath>..\dependencies\Assembly-CSharp-firstpass.dll</HintPath>
|
<HintPath>..\dependencies\Assembly-CSharp-firstpass.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Mirror">
|
|
||||||
<HintPath>..\dependencies\Mirror.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="NorthwoodLib">
|
<Reference Include="NorthwoodLib">
|
||||||
<HintPath>..\dependencies\NorthwoodLib.dll</HintPath>
|
<HintPath>..\dependencies\NorthwoodLib.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Pooling">
|
|
||||||
<HintPath>..\dependencies\Pooling.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="UnityEngine.CoreModule">
|
<Reference Include="UnityEngine.CoreModule">
|
||||||
<HintPath>..\dependencies\UnityEngine.CoreModule.dll</HintPath>
|
<HintPath>..\dependencies\UnityEngine.CoreModule.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
using HintServiceMeow.Core.Enum;
|
using HintServiceMeow.Core.Enum;
|
||||||
using HintServiceMeow.Core.Models.HintContent;
|
|
||||||
using HintServiceMeow.Core.Models.Hints;
|
using HintServiceMeow.Core.Models.Hints;
|
||||||
using HintServiceMeow.Core.Utilities;
|
using HintServiceMeow.Core.Utilities;
|
||||||
using LabApi.Events.Arguments.PlayerEvents;
|
using LabApi.Events.Arguments.PlayerEvents;
|
||||||
@ -9,75 +8,13 @@ using LabApi.Features.Console;
|
|||||||
using LabApi.Features.Wrappers;
|
using LabApi.Features.Wrappers;
|
||||||
using LabApi.Loader.Features.Plugins;
|
using LabApi.Loader.Features.Plugins;
|
||||||
using PlayerRoles;
|
using PlayerRoles;
|
||||||
using PlayerRoles.Spectating;
|
|
||||||
using Timer = System.Timers.Timer;
|
using Timer = System.Timers.Timer;
|
||||||
|
|
||||||
namespace VisibleSpectators
|
namespace VisibleSpectators;
|
||||||
{
|
|
||||||
public class Plugin : Plugin<SpectatorConfig>
|
public class Plugin : Plugin<SpectatorConfig>
|
||||||
{
|
{
|
||||||
public override string Name => "VisibleSpectators";
|
|
||||||
public override string Author => "Code002Lover";
|
|
||||||
public override Version Version { get; } = new(1, 0, 0);
|
|
||||||
public override string Description => "See your spectators";
|
|
||||||
public override Version RequiredApiVersion { get; } = new (LabApiProperties.CompiledVersion);
|
|
||||||
|
|
||||||
public int YCoordinate { get; set; } = 100;
|
|
||||||
|
|
||||||
private static Plugin _singleton;
|
private static Plugin _singleton;
|
||||||
private Timer _timer;
|
|
||||||
private readonly Dictionary<Player,Hint> _spectatorHints = new();
|
|
||||||
|
|
||||||
public override void Enable()
|
|
||||||
{
|
|
||||||
Logger.Debug("starting...");
|
|
||||||
_singleton = this;
|
|
||||||
|
|
||||||
PlayerEvents.ChangedSpectator += OnSpectate;
|
|
||||||
PlayerEvents.Joined += OnJoin;
|
|
||||||
|
|
||||||
_timer = new Timer(1000);
|
|
||||||
_timer.Elapsed += (_, _) => UpdateSpectators();
|
|
||||||
_timer.Start();
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void Disable()
|
|
||||||
{
|
|
||||||
Logger.Debug("unloading...");
|
|
||||||
|
|
||||||
_timer.Stop();
|
|
||||||
_timer.Dispose();
|
|
||||||
_timer = null;
|
|
||||||
|
|
||||||
PlayerEvents.Joined -= OnJoin;
|
|
||||||
PlayerEvents.ChangedSpectator -= OnSpectate;
|
|
||||||
|
|
||||||
_singleton = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void UpdateSpectators()
|
|
||||||
{
|
|
||||||
foreach (var player in GetPlayers())
|
|
||||||
{
|
|
||||||
UpdateSpectators(player);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void AddPlayerHint(Player player)
|
|
||||||
{
|
|
||||||
var hint = new Hint
|
|
||||||
{
|
|
||||||
Text = $"{Config!.HeaderMessage}\n{Config!.NoSpectatorsMessage}",
|
|
||||||
Alignment = HintAlignment.Right,
|
|
||||||
YCoordinate = YCoordinate,
|
|
||||||
Hide = true
|
|
||||||
};
|
|
||||||
|
|
||||||
var playerDisplay = PlayerDisplay.Get(player);
|
|
||||||
playerDisplay.AddHint(hint);
|
|
||||||
|
|
||||||
_spectatorHints[player] = hint;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static readonly Dictionary<string, string> GetColorMap = new()
|
private static readonly Dictionary<string, string> GetColorMap = new()
|
||||||
{
|
{
|
||||||
@ -113,6 +50,64 @@ namespace VisibleSpectators
|
|||||||
{ "GOLD", "EFC01A" }
|
{ "GOLD", "EFC01A" }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private readonly Dictionary<Player, Hint> _spectatorHints = new();
|
||||||
|
private Timer _timer;
|
||||||
|
public override string Name => "VisibleSpectators";
|
||||||
|
public override string Author => "Code002Lover";
|
||||||
|
public override Version Version { get; } = new(1, 0, 0);
|
||||||
|
public override string Description => "See your spectators";
|
||||||
|
public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion);
|
||||||
|
|
||||||
|
public int YCoordinate { get; set; } = 100;
|
||||||
|
|
||||||
|
public override void Enable()
|
||||||
|
{
|
||||||
|
Logger.Debug("starting...");
|
||||||
|
_singleton = this;
|
||||||
|
|
||||||
|
PlayerEvents.ChangedSpectator += OnSpectate;
|
||||||
|
PlayerEvents.Joined += OnJoin;
|
||||||
|
|
||||||
|
_timer = new Timer(1000);
|
||||||
|
_timer.Elapsed += (_, _) => UpdateSpectators();
|
||||||
|
_timer.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Disable()
|
||||||
|
{
|
||||||
|
Logger.Debug("unloading...");
|
||||||
|
|
||||||
|
_timer.Stop();
|
||||||
|
_timer.Dispose();
|
||||||
|
_timer = null;
|
||||||
|
|
||||||
|
PlayerEvents.Joined -= OnJoin;
|
||||||
|
PlayerEvents.ChangedSpectator -= OnSpectate;
|
||||||
|
|
||||||
|
_singleton = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateSpectators()
|
||||||
|
{
|
||||||
|
foreach (var player in GetPlayers()) UpdateSpectators(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AddPlayerHint(Player player)
|
||||||
|
{
|
||||||
|
var hint = new Hint
|
||||||
|
{
|
||||||
|
Text = $"{Config!.HeaderMessage}\n{Config!.NoSpectatorsMessage}",
|
||||||
|
Alignment = HintAlignment.Right,
|
||||||
|
YCoordinate = YCoordinate,
|
||||||
|
Hide = true
|
||||||
|
};
|
||||||
|
|
||||||
|
var playerDisplay = PlayerDisplay.Get(player);
|
||||||
|
playerDisplay.AddHint(hint);
|
||||||
|
|
||||||
|
_spectatorHints[player] = hint;
|
||||||
|
}
|
||||||
|
|
||||||
private static string PlayerToDisplay(Player player)
|
private static string PlayerToDisplay(Player player)
|
||||||
{
|
{
|
||||||
if (player == null) return "";
|
if (player == null) return "";
|
||||||
@ -127,7 +122,9 @@ namespace VisibleSpectators
|
|||||||
if (string.IsNullOrEmpty(groupColor))
|
if (string.IsNullOrEmpty(groupColor))
|
||||||
return $"<color=#{defaultColor}FF>{player.DisplayName}</color>";
|
return $"<color=#{defaultColor}FF>{player.DisplayName}</color>";
|
||||||
|
|
||||||
return GetColorMap.TryGetValue(groupColor.ToUpper(), out var color) ? $"<color=#{color}FF>{player.DisplayName}</color>" : $"<color=#{defaultColor}FF>{player.DisplayName}</color>";
|
return GetColorMap.TryGetValue(groupColor.ToUpper(), out var color)
|
||||||
|
? $"<color=#{color}FF>{player.DisplayName}</color>"
|
||||||
|
: $"<color=#{defaultColor}FF>{player.DisplayName}</color>";
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
@ -143,10 +140,7 @@ namespace VisibleSpectators
|
|||||||
private void UpdateSpectators(Player player)
|
private void UpdateSpectators(Player player)
|
||||||
{
|
{
|
||||||
// Safety check - if player doesn't have a hint, create one
|
// Safety check - if player doesn't have a hint, create one
|
||||||
if (!_spectatorHints.ContainsKey(player))
|
if (!_spectatorHints.ContainsKey(player)) AddPlayerHint(player);
|
||||||
{
|
|
||||||
AddPlayerHint(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
var spectators = Config!.NoSpectatorsMessage;
|
var spectators = Config!.NoSpectatorsMessage;
|
||||||
|
|
||||||
@ -159,15 +153,13 @@ namespace VisibleSpectators
|
|||||||
: string.Join("\n",
|
: string.Join("\n",
|
||||||
player.CurrentlySpectating?.CurrentSpectators.Where(IsNotOverwatch)
|
player.CurrentlySpectating?.CurrentSpectators.Where(IsNotOverwatch)
|
||||||
.Select(PlayerToDisplay) ?? Array.Empty<string>());
|
.Select(PlayerToDisplay) ?? Array.Empty<string>());
|
||||||
} catch (Exception e)
|
}
|
||||||
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
Logger.Error(e);
|
Logger.Error(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (spectators.Length < 2)
|
if (spectators.Length < 2) spectators = Config!.NoSpectatorsMessage;
|
||||||
{
|
|
||||||
spectators = Config!.NoSpectatorsMessage;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
_spectatorHints[player].Text = $"{Config!.HeaderMessage}\n{spectators}";
|
_spectatorHints[player].Text = $"{Config!.HeaderMessage}\n{spectators}";
|
||||||
@ -200,4 +192,3 @@ namespace VisibleSpectators
|
|||||||
public string HeaderMessage { get; set; } = "Spectators:";
|
public string HeaderMessage { get; set; } = "Spectators:";
|
||||||
public string NoSpectatorsMessage { get; set; } = "No spectators";
|
public string NoSpectatorsMessage { get; set; } = "No spectators";
|
||||||
}
|
}
|
||||||
}
|
|
@ -20,9 +20,6 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="0Harmony">
|
|
||||||
<HintPath>..\dependencies\0Harmony.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Assembly-CSharp">
|
<Reference Include="Assembly-CSharp">
|
||||||
<HintPath>..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Assembly-CSharp.dll</HintPath>
|
<HintPath>..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Assembly-CSharp.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
@ -21,7 +21,6 @@ public class WarheadEvents : Plugin
|
|||||||
|
|
||||||
public override void Disable()
|
public override void Disable()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void OnExplode(WarheadDetonatedEventArgs ev)
|
private static void OnExplode(WarheadDetonatedEventArgs ev)
|
||||||
|
@ -23,15 +23,9 @@
|
|||||||
<Reference Include="Assembly-CSharp">
|
<Reference Include="Assembly-CSharp">
|
||||||
<HintPath>..\dependencies\Assembly-CSharp.dll</HintPath>
|
<HintPath>..\dependencies\Assembly-CSharp.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Assembly-CSharp-firstpass">
|
|
||||||
<HintPath>..\dependencies\Assembly-CSharp-firstpass.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Mirror">
|
<Reference Include="Mirror">
|
||||||
<HintPath>..\dependencies\Mirror.dll</HintPath>
|
<HintPath>..\dependencies\Mirror.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Pooling">
|
|
||||||
<HintPath>..\dependencies\Pooling.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="UnityEngine.CoreModule">
|
<Reference Include="UnityEngine.CoreModule">
|
||||||
<HintPath>..\dependencies\UnityEngine.CoreModule.dll</HintPath>
|
<HintPath>..\dependencies\UnityEngine.CoreModule.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user