add and fix a lot
This commit is contained in:
parent
9bf05f87aa
commit
17c654d889
130
AfkSwap/AfkSwap.cs
Normal file
130
AfkSwap/AfkSwap.cs
Normal file
@ -0,0 +1,130 @@
|
||||
using System.Collections;
|
||||
using LabApi.Features;
|
||||
using LabApi.Loader.Features.Plugins;
|
||||
using LabApi.Events.Arguments.PlayerEvents;
|
||||
using LabApi.Events.Handlers;
|
||||
using LabApi.Features.Wrappers;
|
||||
using PlayerRoles;
|
||||
using Logger = LabApi.Features.Console.Logger;
|
||||
using Version = System.Version;
|
||||
using MEC;
|
||||
using UnityEngine;
|
||||
|
||||
namespace AfkSwap;
|
||||
|
||||
public class AfkSwap : Plugin
|
||||
{
|
||||
public override string Name => "AfkSwap";
|
||||
public override string Author => "Code002Lover";
|
||||
public override Version Version { get; } = new(1, 0, 0);
|
||||
public override string Description => "Swaps AFK players with spectators after one minute.";
|
||||
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()
|
||||
{
|
||||
PlayerEvents.Spawned += OnPlayerSpawned;
|
||||
|
||||
Timing.RunCoroutine(CheckAfkPlayers());
|
||||
}
|
||||
|
||||
public override void Disable()
|
||||
{
|
||||
PlayerEvents.Spawned -= OnPlayerSpawned;
|
||||
|
||||
lock (_lock)
|
||||
{
|
||||
_playerSpawnTimes.Clear();
|
||||
_playerPositions.Clear();
|
||||
_afkPlayers.Clear();
|
||||
}
|
||||
}
|
||||
|
||||
private void OnPlayerSpawned(PlayerSpawnedEventArgs ev)
|
||||
{
|
||||
var player = ev.Player;
|
||||
Timing.CallDelayed(1, () =>
|
||||
{
|
||||
lock (_lock)
|
||||
{
|
||||
_playerSpawnTimes[player] = DateTime.Now;
|
||||
_playerPositions[player] = player.Position;
|
||||
_afkPlayers[player] = DateTime.Now;
|
||||
}
|
||||
|
||||
Logger.Debug($"Player {player.DisplayName} spawned");
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
private IEnumerator<float> CheckAfkPlayers()
|
||||
{
|
||||
Logger.Debug("Starting Afk Checking");
|
||||
while (true)
|
||||
{
|
||||
lock (_lock)
|
||||
{
|
||||
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)
|
||||
{
|
||||
_playerSpawnTimes.Remove(playerTime.Key);
|
||||
_playerPositions.Remove(playerTime.Key);
|
||||
continue;
|
||||
}
|
||||
if (!_playerPositions[playerTime.Key].Equals(playerTime.Key.Position))
|
||||
{
|
||||
_playerSpawnTimes.Remove(playerTime.Key);
|
||||
_playerPositions.Remove(playerTime.Key);
|
||||
continue; // Player has moved, don't swap
|
||||
}
|
||||
|
||||
_afkPlayers[playerTime.Key] = DateTime.Now;
|
||||
SwapWithSpectator(playerTime.Key);
|
||||
}
|
||||
}
|
||||
|
||||
yield return Timing.WaitForSeconds(1);
|
||||
}
|
||||
// ReSharper disable once IteratorNeverReturns
|
||||
}
|
||||
|
||||
private void SwapWithSpectator(Player afkPlayer)
|
||||
{
|
||||
var spectators = Player.ReadyList.Where(p => p.Role == RoleTypeId.Spectator && (DateTime.Now - _afkPlayers[p]).TotalSeconds > 10).ToList();
|
||||
if (!spectators.Any())
|
||||
{
|
||||
Logger.Warn("No spectators to swap to");
|
||||
return;
|
||||
}
|
||||
var randomSpectator = spectators[UnityEngine.Random.Range(0, spectators.Count)];
|
||||
Logger.Debug($"Swapping {afkPlayer.DisplayName} with {randomSpectator.DisplayName}");
|
||||
|
||||
// Store the AFK player's position and role
|
||||
var afkPosition = afkPlayer.Position;
|
||||
var afkRole = afkPlayer.Role;
|
||||
|
||||
// Give the spectator the AFK player's role and position
|
||||
randomSpectator.Role = afkRole;
|
||||
randomSpectator.Position = afkPosition;
|
||||
|
||||
// Make the AFK player a spectator
|
||||
afkPlayer.Role = RoleTypeId.Spectator;
|
||||
|
||||
// Remove the AFK player from tracking
|
||||
_playerSpawnTimes.Remove(afkPlayer);
|
||||
_playerPositions.Remove(afkPlayer);
|
||||
_playerSpawnTimes[randomSpectator] = DateTime.Now;
|
||||
_playerPositions[randomSpectator] = randomSpectator.Position;
|
||||
|
||||
// Broadcast the swap
|
||||
afkPlayer.SendBroadcast($"You were swapped with {randomSpectator.DisplayName} due to inactivity.", 10);
|
||||
randomSpectator.SendBroadcast($"You were swapped with {afkPlayer.DisplayName} due to them being AFK.", 5);
|
||||
}
|
||||
}
|
43
AfkSwap/AfkSwap.csproj
Normal file
43
AfkSwap/AfkSwap.csproj
Normal file
@ -0,0 +1,43 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net48</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>disable</Nullable>
|
||||
<LangVersion>10</LangVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||
<Optimize>true</Optimize>
|
||||
<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
|
||||
<DebugType>full</DebugType>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
||||
<Optimize>true</Optimize>
|
||||
<CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
|
||||
<DebugType>none</DebugType>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Reference Include="Assembly-CSharp">
|
||||
<HintPath>..\dependencies\Assembly-CSharp.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Assembly-CSharp-firstpass">
|
||||
<HintPath>..\dependencies\Assembly-CSharp-firstpass.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>
|
||||
<PackageReference Include="Northwood.LabAPI" Version="1.0.2" />
|
||||
</ItemGroup>
|
||||
</Project>
|
40
CandySetting/CandySetting.csproj
Normal file
40
CandySetting/CandySetting.csproj
Normal file
@ -0,0 +1,40 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net48</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>disable</Nullable>
|
||||
<LangVersion>10</LangVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||
<Optimize>true</Optimize>
|
||||
<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
|
||||
<DebugType>full</DebugType>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
||||
<Optimize>true</Optimize>
|
||||
<CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
|
||||
<DebugType>none</DebugType>
|
||||
</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>
|
||||
<PackageReference Include="Northwood.LabAPI" Version="1.0.2" />
|
||||
</ItemGroup>
|
||||
</Project>
|
32
CandySetting/Class1.cs
Normal file
32
CandySetting/Class1.cs
Normal file
@ -0,0 +1,32 @@
|
||||
using LabApi.Events.Arguments.PlayerEvents;
|
||||
using LabApi.Events.Handlers;
|
||||
using LabApi.Features;
|
||||
using LabApi.Loader.Features.Plugins;
|
||||
|
||||
namespace CandySetting;
|
||||
|
||||
public class CandySetting : Plugin
|
||||
{
|
||||
public override string Name => "CandySetting";
|
||||
public override string Author => "HoherGeist, Code002Lover";
|
||||
public override Version Version { get; } = new(1, 0, 0);
|
||||
public override string Description => "Edits # of Candy you can take";
|
||||
public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion);
|
||||
|
||||
public int MaxUses { get; set; } = 6;
|
||||
|
||||
public override void Enable()
|
||||
{
|
||||
PlayerEvents.InteractingScp330 += TakingCandy;
|
||||
}
|
||||
|
||||
public override void Disable()
|
||||
{
|
||||
PlayerEvents.InteractingScp330 -= TakingCandy;
|
||||
}
|
||||
|
||||
private void TakingCandy(PlayerInteractingScp330EventArgs ev)
|
||||
{
|
||||
ev.AllowPunishment = ev.Uses > MaxUses;
|
||||
}
|
||||
}
|
239
CustomClasses/CustomClasses.cs
Normal file
239
CustomClasses/CustomClasses.cs
Normal file
@ -0,0 +1,239 @@
|
||||
using System.Drawing;
|
||||
using CommandSystem.Commands.RemoteAdmin.Inventory;
|
||||
using Interactables.Interobjects.DoorUtils;
|
||||
using InventorySystem.Items;
|
||||
using LabApi.Events.Arguments.PlayerEvents;
|
||||
using LabApi.Events.Arguments.ServerEvents;
|
||||
using LabApi.Events.Handlers;
|
||||
using LabApi.Features;
|
||||
using LabApi.Features.Console;
|
||||
using LabApi.Loader.Features.Plugins;
|
||||
using PlayerRoles;
|
||||
using LabApi.Features.Wrappers;
|
||||
using MapGeneration;
|
||||
using Vector3 = UnityEngine.Vector3;
|
||||
using MEC;
|
||||
|
||||
namespace CustomClasses;
|
||||
|
||||
public class CustomClasses : Plugin
|
||||
{
|
||||
public override string Name => "CustomClasses";
|
||||
public override string Author => "Code002Lover";
|
||||
public override Version Version { get; } = new(1, 0, 0);
|
||||
public override string Description => "Adds custom classes to the game";
|
||||
public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion);
|
||||
|
||||
public JanitorConfig JanitorConfig { get; set; } = new();
|
||||
public ResearchSubjectConfig ResearchSubjectConfig { get; set; } = new();
|
||||
public HeadGuardConfig HeadGuardConfig { get; set; } = new();
|
||||
|
||||
private readonly CustomClassManager _classManager = new();
|
||||
|
||||
public override void Enable()
|
||||
{
|
||||
PlayerEvents.Spawned += OnPlayerSpawned;
|
||||
ServerEvents.RoundEnded += OnRoundEnded;
|
||||
}
|
||||
|
||||
public override void Disable()
|
||||
{
|
||||
PlayerEvents.Spawned -= OnPlayerSpawned;
|
||||
ServerEvents.RoundEnded -= OnRoundEnded;
|
||||
}
|
||||
|
||||
private void OnRoundEnded(RoundEndedEventArgs ev)
|
||||
{
|
||||
_classManager.ResetSpawnStates();
|
||||
}
|
||||
|
||||
private void OnPlayerSpawned(PlayerSpawnedEventArgs ev)
|
||||
{
|
||||
if(_classManager.TryHandleSpawn(ev.Player, JanitorConfig, typeof(JanitorConfig))) return;
|
||||
if(_classManager.TryHandleSpawn(ev.Player, ResearchSubjectConfig, typeof(ResearchSubjectConfig))) return;
|
||||
if(_classManager.TryHandleSpawn(ev.Player, HeadGuardConfig, typeof(HeadGuardConfig))) return;
|
||||
}
|
||||
}
|
||||
|
||||
public class CustomClassManager
|
||||
{
|
||||
private readonly object _lock = new();
|
||||
private readonly Random _random = new();
|
||||
private readonly Dictionary<Type, SpawnState> _spawnStates = new();
|
||||
private readonly Dictionary<Type, ICustomClassHandler> _handlers = new();
|
||||
|
||||
public CustomClassManager()
|
||||
{
|
||||
// Register handlers
|
||||
RegisterHandler<JanitorConfig>(new JanitorHandler(this));
|
||||
RegisterHandler<ResearchSubjectConfig>(new ResearchSubjectHandler(this));
|
||||
RegisterHandler<HeadGuardConfig>(new HeadGuardHandler(this));
|
||||
}
|
||||
|
||||
public void TeleportPlayerToAround(Player player, Vector3 position)
|
||||
{
|
||||
player.Position = position + new Vector3(0,1,0) + new Vector3((float)(_random.NextDouble() * 2), 0,
|
||||
(float)(_random.NextDouble() * 2));
|
||||
}
|
||||
|
||||
private void RegisterHandler<T>(ICustomClassHandler handler) where T : CustomClassConfig
|
||||
{
|
||||
lock (_lock)
|
||||
{
|
||||
_spawnStates[typeof(T)] = new SpawnState();
|
||||
}
|
||||
|
||||
_handlers[typeof(T)] = handler;
|
||||
}
|
||||
|
||||
public void ResetSpawnStates()
|
||||
{
|
||||
lock (_lock)
|
||||
{
|
||||
foreach (var key in _spawnStates.Keys.ToList())
|
||||
{
|
||||
_spawnStates[key] = new SpawnState();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public bool TryHandleSpawn(Player player, CustomClassConfig config, Type configType)
|
||||
{
|
||||
if (player.Role != config.RequiredRole) return false;
|
||||
if (Player.ReadyList.Count() <= config.MinPlayers) return false;
|
||||
|
||||
lock (_lock)
|
||||
{
|
||||
var state = _spawnStates[configType];
|
||||
if (state.Spawns >= config.MaxSpawns)
|
||||
{
|
||||
Logger.Debug($"Max spawns reached {configType} - {player.Nickname}");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (_random.NextDouble() > config.ChancePerPlayer)
|
||||
{
|
||||
Logger.Debug($"Chance not met {configType} - {player.Nickname}");
|
||||
return false;
|
||||
}
|
||||
|
||||
state.Spawns++;
|
||||
|
||||
Logger.Debug($"Player spawning {configType} - {player.Nickname} - {state.Spawns} / {config.MaxSpawns}");
|
||||
|
||||
if (_handlers.TryGetValue(configType, out var handler))
|
||||
{
|
||||
return handler.HandleSpawn(player, config, _random);
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public interface ICustomClassHandler
|
||||
{
|
||||
bool HandleSpawn(Player player, CustomClassConfig config, Random random);
|
||||
}
|
||||
|
||||
public class JanitorHandler(CustomClassManager manager) : ICustomClassHandler
|
||||
{
|
||||
public bool HandleSpawn(Player player, CustomClassConfig config, Random random)
|
||||
{
|
||||
var scp914 = Map.Rooms.First(r => r.Name == RoomName.Lcz914);
|
||||
Timing.CallDelayed(0.5f, () =>
|
||||
{
|
||||
manager.TeleportPlayerToAround(player, scp914.Position);
|
||||
|
||||
foreach (var spawnItem in config.Items)
|
||||
{
|
||||
player.AddItem(spawnItem, ItemAddReason.StartingItem);
|
||||
Logger.Debug($"Gave player {player.Nickname} spawn item {spawnItem}");
|
||||
}
|
||||
player.SendBroadcast("You're a <color=#A0A0A0>Janitor</color>!", 3);
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public class ResearchSubjectHandler(CustomClassManager manager) : ICustomClassHandler
|
||||
{
|
||||
public bool HandleSpawn(Player player, CustomClassConfig config, Random random)
|
||||
{
|
||||
var scientist = Player.ReadyList.First(p => p.Role == RoleTypeId.Scientist);
|
||||
Timing.CallDelayed(0.5f, () =>
|
||||
{
|
||||
manager.TeleportPlayerToAround(player, scientist.Position);
|
||||
|
||||
foreach (var spawnItem in config.Items)
|
||||
{
|
||||
player.AddItem(spawnItem, ItemAddReason.StartingItem);
|
||||
Logger.Debug($"Gave player {player.Nickname} spawn item {spawnItem}");
|
||||
}
|
||||
player.SendBroadcast("You're a <color=#944710>Research Subject</color>!", 3);
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public class HeadGuardHandler(CustomClassManager manager) : ICustomClassHandler
|
||||
{
|
||||
public bool HandleSpawn(Player player, CustomClassConfig config, Random random)
|
||||
{
|
||||
Timing.CallDelayed(0.5f, () =>
|
||||
{
|
||||
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);
|
||||
|
||||
player.AddItem(ItemType.Adrenaline, ItemAddReason.StartingItem);
|
||||
|
||||
player.RemoveItem(ItemType.ArmorLight);
|
||||
player.AddItem(ItemType.ArmorCombat, ItemAddReason.StartingItem);
|
||||
|
||||
player.RemoveItem(ItemType.GunFSP9);
|
||||
|
||||
var pickup = Pickup.Create(ItemType.GunCrossvec, Vector3.one);
|
||||
|
||||
if (pickup != null) player.AddItem(pickup);
|
||||
|
||||
player.SetAmmo(ItemType.Ammo9x19, 120);
|
||||
|
||||
player.SendBroadcast("You're a <color=#00B7EB>Head Guard</color>!", 3);
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
internal record SpawnState
|
||||
{
|
||||
public int Spawns;
|
||||
}
|
||||
|
||||
public abstract class CustomClassConfig
|
||||
{
|
||||
public virtual int MinPlayers { get; set; } = 4;
|
||||
public virtual double ChancePerPlayer { get; set; } = 0.7;
|
||||
public virtual int MaxSpawns { get; set; } = 1;
|
||||
public virtual ItemType[] Items { get; set; } = [];
|
||||
public virtual RoleTypeId RequiredRole { get; set; } = RoleTypeId.ClassD;
|
||||
}
|
||||
|
||||
public class ResearchSubjectConfig : CustomClassConfig;
|
||||
|
||||
public class JanitorConfig : CustomClassConfig
|
||||
{
|
||||
public override int MinPlayers { get; set; } = 5;
|
||||
public override double ChancePerPlayer { get; set; } = 0.3;
|
||||
public override int MaxSpawns { get; set; } = 2;
|
||||
public override ItemType[] Items { get; set; } = [ItemType.KeycardJanitor];
|
||||
}
|
||||
|
||||
public class HeadGuardConfig : CustomClassConfig
|
||||
{
|
||||
public override int MinPlayers { get; set; } = 9;
|
||||
public override RoleTypeId RequiredRole { get; set; } = RoleTypeId.FacilityGuard;
|
||||
}
|
46
CustomClasses/CustomClasses.csproj
Normal file
46
CustomClasses/CustomClasses.csproj
Normal file
@ -0,0 +1,46 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net48</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>disable</Nullable>
|
||||
<LangVersion>latest</LangVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||
<Optimize>true</Optimize>
|
||||
<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
|
||||
<DebugType>full</DebugType>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
||||
<Optimize>true</Optimize>
|
||||
<CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
|
||||
<DebugType>none</DebugType>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Reference Include="Assembly-CSharp">
|
||||
<HintPath>..\dependencies\Assembly-CSharp.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Assembly-CSharp-firstpass">
|
||||
<HintPath>..\dependencies\Assembly-CSharp-firstpass.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Mirror">
|
||||
<HintPath>..\dependencies\Mirror.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="NorthwoodLib">
|
||||
<HintPath>..\dependencies\NorthwoodLib.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>
|
||||
<PackageReference Include="Northwood.LabAPI" Version="1.0.2" />
|
||||
</ItemGroup>
|
||||
</Project>
|
80
CustomItemSpawn/CustomItemSpawn.cs
Normal file
80
CustomItemSpawn/CustomItemSpawn.cs
Normal file
@ -0,0 +1,80 @@
|
||||
using LabApi.Events.Handlers;
|
||||
using LabApi.Features;
|
||||
using LabApi.Features.Wrappers;
|
||||
using LabApi.Loader.Features.Plugins;
|
||||
using MEC;
|
||||
using Logger = LabApi.Features.Console.Logger;
|
||||
using Random = System.Random;
|
||||
using Vector3 = UnityEngine.Vector3;
|
||||
|
||||
namespace CustomItemSpawn;
|
||||
|
||||
public class CustomItemSpawn : Plugin<ItemConfig>
|
||||
{
|
||||
public override string Name => "CustomItemSpawn";
|
||||
public override string Author => "Code002Lover";
|
||||
public override Version Version { get; } = new(1, 0, 0);
|
||||
public override string Description => "Spawns items in a custom location.";
|
||||
public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion);
|
||||
|
||||
private static CustomItemSpawn _singleton;
|
||||
|
||||
public override void Enable()
|
||||
{
|
||||
_singleton = this;
|
||||
ServerEvents.RoundStarted += OnRoundStart;
|
||||
}
|
||||
|
||||
public override void Disable()
|
||||
{
|
||||
ServerEvents.RoundStarted -= OnRoundStart;
|
||||
_singleton = null;
|
||||
}
|
||||
|
||||
private static void OnRoundStart()
|
||||
{
|
||||
Timing.CallDelayed(10,SpawnItems);
|
||||
}
|
||||
|
||||
private static void SpawnItems()
|
||||
{
|
||||
Random rng = new();
|
||||
|
||||
foreach (var pickup in from configPair in _singleton.Config!.Items
|
||||
let itemType = configPair.Key
|
||||
let config = configPair.Value
|
||||
where rng.NextDouble() * 100f <= config.Chance
|
||||
select Pickup.Create(itemType, config.Position + new Vector3(0, 1, 0)))
|
||||
{
|
||||
if (pickup == null)
|
||||
{
|
||||
Logger.Error("Could not create pickup.");
|
||||
break;
|
||||
}
|
||||
|
||||
pickup.Spawn();
|
||||
Logger.Debug($"Spawned Pickup: {pickup.Base} @ {pickup.Position}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class ItemConfig
|
||||
{
|
||||
public Dictionary<ItemType, SpecificConfig> Items { get; set; } = new()
|
||||
{
|
||||
{
|
||||
ItemType.GunAK,
|
||||
new SpecificConfig
|
||||
{
|
||||
Position = new Vector3(0, 0, 0),
|
||||
Chance = 100f
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public class SpecificConfig
|
||||
{
|
||||
public Vector3 Position { get; set; }
|
||||
public float Chance { get; set; } = 100f;
|
||||
}
|
43
CustomItemSpawn/CustomItemSpawn.csproj
Normal file
43
CustomItemSpawn/CustomItemSpawn.csproj
Normal file
@ -0,0 +1,43 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net48</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>disable</Nullable>
|
||||
<LangVersion>10</LangVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||
<Optimize>true</Optimize>
|
||||
<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
|
||||
<DebugType>full</DebugType>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
||||
<Optimize>true</Optimize>
|
||||
<CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
|
||||
<DebugType>none</DebugType>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Reference Include="Assembly-CSharp">
|
||||
<HintPath>..\dependencies\Assembly-CSharp.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Assembly-CSharp-firstpass">
|
||||
<HintPath>..\dependencies\Assembly-CSharp-firstpass.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>
|
||||
<PackageReference Include="Northwood.LabAPI" Version="1.0.2" />
|
||||
</ItemGroup>
|
||||
</Project>
|
@ -148,12 +148,12 @@ namespace GamblingCoin
|
||||
|
||||
public AdvancedEffectSettings AdvancedNegative { get; set; } = new()
|
||||
{
|
||||
Effects = new[] { nameof(InsufficientLighting), nameof(AmnesiaVision) },
|
||||
Effects = new[] { nameof(InsufficientLighting), nameof(AmnesiaVision), nameof(Burned) },
|
||||
Settings = new Dictionary<string, EffectSettings>
|
||||
{
|
||||
{ nameof(InsufficientLighting), new EffectSettings(1, 20f, true) },
|
||||
{ nameof(InsufficientLighting), new EffectSettings(1, 30f, true) },
|
||||
{ nameof(AmnesiaVision), new EffectSettings(3, 30f, true) },
|
||||
{ nameof(Bleeding), new EffectSettings(3, 40f, true) },
|
||||
{ nameof(Burned), new EffectSettings(3, 60f, true) },
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -147,11 +147,7 @@ namespace GamblingCoin
|
||||
{
|
||||
x.Player.SendBroadcast(configMessages.PocketDimensionMessage, configGameplay.BroadcastDuration);
|
||||
|
||||
var newPos = Map.Rooms.First(roomIdentifier => roomIdentifier.Zone==FacilityZone.Other).Position;
|
||||
|
||||
x.Player.ReferenceHub.playerEffectsController.ChangeState(nameof(Corroding),1, 999, true);
|
||||
|
||||
x.Player.Position = newPos + new UnityEngine.Vector3(0, configGameplay.TeleportHeightOffset, 0);
|
||||
PocketDimension.ForceInside(x.Player);
|
||||
},
|
||||
configChances.PocketDimensionChance)
|
||||
.AddAction(x =>
|
||||
@ -232,7 +228,7 @@ namespace GamblingCoin
|
||||
|
||||
Player[] GetPlayers()
|
||||
{
|
||||
return Player.Dictionary.Values.ToArray();
|
||||
return Player.ReadyList.ToArray();
|
||||
}
|
||||
}
|
||||
|
||||
|
78
GrowingZombies/GrowingZombies.cs
Normal file
78
GrowingZombies/GrowingZombies.cs
Normal file
@ -0,0 +1,78 @@
|
||||
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 LabApi.Events.Arguments.PlayerEvents;
|
||||
using LabApi.Events.Arguments.ServerEvents;
|
||||
using LabApi.Features.Wrappers;
|
||||
|
||||
namespace GrowingZombies;
|
||||
|
||||
public class GrowingZombies : Plugin
|
||||
{
|
||||
public override string Name => "GrowingZombies";
|
||||
public override string Author => "Code002Lover";
|
||||
public override Version Version { get; } = new(1, 0, 0);
|
||||
public override string Description => "Makes zombies grow stronger as they eat more";
|
||||
public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion);
|
||||
|
||||
private readonly Dictionary<Player, int> _zombieCorpseCount = new();
|
||||
|
||||
public override void Enable()
|
||||
{
|
||||
Scp0492Events.ConsumedCorpse += OnZombieEat;
|
||||
ServerEvents.RoundEnded += OnRoundEnd;
|
||||
PlayerEvents.Left += OnPlayerLeave;
|
||||
}
|
||||
|
||||
public override void Disable()
|
||||
{
|
||||
Scp0492Events.ConsumedCorpse -= OnZombieEat;
|
||||
ServerEvents.RoundEnded -= OnRoundEnd;
|
||||
PlayerEvents.Left -= OnPlayerLeave;
|
||||
_zombieCorpseCount.Clear();
|
||||
}
|
||||
|
||||
private void OnRoundEnd(RoundEndedEventArgs ev)
|
||||
{
|
||||
_zombieCorpseCount.Clear();
|
||||
}
|
||||
|
||||
private void OnPlayerLeave(PlayerLeftEventArgs ev)
|
||||
{
|
||||
_zombieCorpseCount.Remove(ev.Player);
|
||||
}
|
||||
|
||||
private void OnZombieEat(Scp0492ConsumedCorpseEventArgs ev)
|
||||
{
|
||||
if (!ev?.Player.ReferenceHub.playerEffectsController)
|
||||
return;
|
||||
|
||||
// Increment corpse count for this zombie
|
||||
if (!_zombieCorpseCount.ContainsKey(ev.Player))
|
||||
_zombieCorpseCount[ev.Player] = 0;
|
||||
_zombieCorpseCount[ev.Player]++;
|
||||
|
||||
var corpsesEaten = _zombieCorpseCount[ev.Player];
|
||||
|
||||
ev.Player.MaxHealth += 50;
|
||||
|
||||
var movementBoostIntensity = (byte)Math.Min(1 + corpsesEaten * 0.1f, 3f);
|
||||
ev.Player.ReferenceHub.playerEffectsController.ChangeState<MovementBoost>(movementBoostIntensity, 30);
|
||||
|
||||
// Add damage resistance after eating multiple corpses
|
||||
var damageResistance = (byte)Math.Min(0.5 - corpsesEaten * 0.5f, 2f);
|
||||
if (corpsesEaten >= 3)
|
||||
{
|
||||
ev.Player.ReferenceHub.playerEffectsController.ChangeState<DamageReduction>(damageResistance, 20);
|
||||
}
|
||||
|
||||
// Add regeneration effect after eating multiple corpses
|
||||
if (corpsesEaten < 5) return;
|
||||
var regenIntensity = Math.Min(1 + corpsesEaten * 0.2f, 3f);
|
||||
|
||||
Scp330Bag.AddSimpleRegeneration(ev.Player.ReferenceHub, regenIntensity, 15f);
|
||||
}
|
||||
}
|
46
GrowingZombies/GrowingZombies.csproj
Normal file
46
GrowingZombies/GrowingZombies.csproj
Normal file
@ -0,0 +1,46 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net48</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>disable</Nullable>
|
||||
<LangVersion>latest</LangVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||
<Optimize>true</Optimize>
|
||||
<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
|
||||
<DebugType>full</DebugType>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
||||
<Optimize>true</Optimize>
|
||||
<CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
|
||||
<DebugType>none</DebugType>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Reference Include="Assembly-CSharp">
|
||||
<HintPath>..\dependencies\Assembly-CSharp.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Assembly-CSharp-firstpass">
|
||||
<HintPath>..\dependencies\Assembly-CSharp-firstpass.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Mirror">
|
||||
<HintPath>..\dependencies\Mirror.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="NorthwoodLib">
|
||||
<HintPath>..\dependencies\NorthwoodLib.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>
|
||||
<PackageReference Include="Northwood.LabAPI" Version="1.0.2" />
|
||||
</ItemGroup>
|
||||
</Project>
|
@ -45,7 +45,7 @@ namespace KeycardButModern
|
||||
foreach (var playerItem in ev.Player.Items)
|
||||
{
|
||||
//is keycard?
|
||||
if (playerItem.Type > ItemType.KeycardO5) continue;
|
||||
if (playerItem.Type is > ItemType.KeycardO5 and < ItemType.KeycardCustomTaskForce) continue;
|
||||
if (playerItem.Base is not KeycardItem keycardItem)
|
||||
{
|
||||
continue;
|
||||
@ -83,7 +83,7 @@ namespace KeycardButModern
|
||||
foreach (var playerItem in ev.Player.Items)
|
||||
{
|
||||
//is keycard?
|
||||
if (playerItem.Type > ItemType.KeycardO5) continue;
|
||||
if (playerItem.Type is > ItemType.KeycardO5 and < ItemType.KeycardCustomTaskForce) continue;
|
||||
if (playerItem.Base is not KeycardItem keycardItem)
|
||||
{
|
||||
continue;
|
||||
@ -117,7 +117,7 @@ namespace KeycardButModern
|
||||
foreach (var playerItem in ev.Player.Items)
|
||||
{
|
||||
//is keycard?
|
||||
if (playerItem.Type > ItemType.KeycardO5) continue;
|
||||
if (playerItem.Type is > ItemType.KeycardO5 and < ItemType.KeycardCustomTaskForce) continue;
|
||||
if (playerItem.Base is not KeycardItem keycardItem)
|
||||
{
|
||||
continue;
|
||||
@ -140,7 +140,7 @@ namespace KeycardButModern
|
||||
foreach (var playerItem in ev.Player.Items)
|
||||
{
|
||||
//is keycard?
|
||||
if (playerItem.Type > ItemType.KeycardO5) continue;
|
||||
if (playerItem.Type is > ItemType.KeycardO5 and < ItemType.KeycardCustomTaskForce) continue;
|
||||
if (playerItem.Base is not KeycardItem keycardItem)
|
||||
{
|
||||
continue;
|
||||
|
@ -23,12 +23,14 @@ namespace SCPTeamHint
|
||||
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()
|
||||
{
|
||||
Logger.Debug("Apple juice");
|
||||
PlayerEvents.Joined += OnJoin;
|
||||
PlayerEvents.Left += OnLeft;
|
||||
|
||||
_timer = new Timer(1000);
|
||||
_timer.Elapsed += (_,_) => UpdateHints();
|
||||
@ -38,19 +40,24 @@ namespace SCPTeamHint
|
||||
public override void Disable()
|
||||
{
|
||||
PlayerEvents.Joined -= OnJoin;
|
||||
_timer.Stop();
|
||||
PlayerEvents.Left -= OnLeft;
|
||||
_timer?.Stop();
|
||||
_timer?.Dispose();
|
||||
_timer = null;
|
||||
}
|
||||
|
||||
private void UpdateHints()
|
||||
{
|
||||
var hintTexts = new List<string>();
|
||||
|
||||
foreach (var player in Player.List)
|
||||
lock (_hintsLock)
|
||||
{
|
||||
if (player.IsDummy || player.IsHost) continue;
|
||||
if (!player.IsSCP) continue;
|
||||
|
||||
var text = $" <size=25><color=red>{player.RoleBase.RoleName}</color> | <color=#6761cd>{player.HumeShield}</color> | <color=#da0101>{player.Health}</color> | <color=grey>{player.Zone}</color></size> ";
|
||||
|
||||
foreach (var player in Player.ReadyList.Where(x => !x.IsHost && !x.IsDummy && x.IsSCP))
|
||||
{
|
||||
var text =
|
||||
$" <size=25><color=red>{player.RoleBase.RoleName}</color> | <color=#6761cd>{player.HumeShield}</color> | <color=#da0101>{player.Health}</color> | <color=grey>{player.Zone}</color></size> ";
|
||||
|
||||
switch (player.RoleBase)
|
||||
{
|
||||
@ -59,6 +66,8 @@ namespace SCPTeamHint
|
||||
|
||||
scp.SubroutineModule.TryGetSubroutine(out Scp096TargetsTracker tracker);
|
||||
|
||||
if(!tracker) break;
|
||||
|
||||
text += $"Targets: {tracker.Targets.Count}";
|
||||
break;
|
||||
case Scp3114Role scp3114:
|
||||
@ -78,43 +87,69 @@ namespace SCPTeamHint
|
||||
scp079.SubroutineModule.TryGetSubroutine(out Scp079AuxManager auxManager);
|
||||
scp079.SubroutineModule.TryGetSubroutine(out Scp079TierManager tierManager);
|
||||
|
||||
text += $" <color=grey>AUX: {auxManager.CurrentAuxFloored} / {auxManager.MaxAux} Level: {tierManager.AccessTierLevel}</color>";
|
||||
if(!auxManager || !tierManager) break;
|
||||
|
||||
text +=
|
||||
$" <color=grey>AUX: {auxManager.CurrentAuxFloored} / {auxManager.MaxAux} | Level {tierManager.AccessTierLevel}</color>";
|
||||
break;
|
||||
}
|
||||
|
||||
hintTexts.Add(text);
|
||||
}
|
||||
|
||||
foreach (var player in Player.List.Where(x=>!x.IsHost))
|
||||
var hintText = string.Join("\n", hintTexts);
|
||||
|
||||
foreach (var player in Player.ReadyList.Where(x => !x.IsHost && !x.IsDummy))
|
||||
{
|
||||
Logger.Debug($"Updating hint for {player.DisplayName}");
|
||||
UpdateHint(player, string.Join("\n", hintTexts));
|
||||
UpdateHint(player, hintText);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateHint(Player player, string hintText)
|
||||
{
|
||||
var hint = _spectatorHints[player];
|
||||
if (!_spectatorHints.TryGetValue(player, out var hint))
|
||||
{
|
||||
Logger.Debug($"No hint found for player {player.DisplayName}");
|
||||
return;
|
||||
}
|
||||
|
||||
Logger.Debug($"Player {player.Nickname} is on team {player.RoleBase.Team} | hide: {player.RoleBase.Team != Team.SCPs}");
|
||||
hint.Hide = player.RoleBase.Team != Team.SCPs;
|
||||
|
||||
if (!hint.Hide)
|
||||
{
|
||||
hint.Text = hintText;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnJoin(PlayerJoinedEventArgs ev)
|
||||
{
|
||||
if(ev.Player.IsDummy || ev.Player.IsHost) return;
|
||||
|
||||
var hint = new Hint
|
||||
{
|
||||
Text = "Apfelsaft", Alignment = HintAlignment.Left, YCoordinate = 100, Hide = true
|
||||
Text = "", Alignment = HintAlignment.Left, YCoordinate = 100, Hide = true
|
||||
};
|
||||
|
||||
var playerDisplay = PlayerDisplay.Get(ev.Player);
|
||||
playerDisplay.AddHint(hint);
|
||||
|
||||
lock (_hintsLock)
|
||||
{
|
||||
_spectatorHints[ev.Player] = hint;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void OnLeft(PlayerLeftEventArgs ev)
|
||||
{
|
||||
if(ev.Player.IsDummy || ev.Player.IsHost) return;
|
||||
|
||||
lock (_hintsLock)
|
||||
{
|
||||
_spectatorHints.Remove(ev.Player);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
23
ScpSwap/ScpSwap.cs
Normal file
23
ScpSwap/ScpSwap.cs
Normal file
@ -0,0 +1,23 @@
|
||||
using LabApi.Events.Handlers;
|
||||
using LabApi.Features;
|
||||
using LabApi.Loader.Features.Plugins;
|
||||
|
||||
namespace ScpSwap;
|
||||
|
||||
public class ScpSwap : Plugin
|
||||
{
|
||||
public override string Name => "ScpSwap";
|
||||
public override string Author => "HoherGeist, Code002Lover";
|
||||
public override Version Version { get; } = new(1, 0, 0);
|
||||
public override string Description => "Swap SCPs.";
|
||||
public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion);
|
||||
|
||||
public override void Enable()
|
||||
{
|
||||
}
|
||||
|
||||
public override void Disable()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
43
ScpSwap/ScpSwap.csproj
Normal file
43
ScpSwap/ScpSwap.csproj
Normal file
@ -0,0 +1,43 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net48</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>disable</Nullable>
|
||||
<LangVersion>latest</LangVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||
<Optimize>true</Optimize>
|
||||
<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
|
||||
<DebugType>full</DebugType>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
||||
<Optimize>true</Optimize>
|
||||
<CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
|
||||
<DebugType>none</DebugType>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Reference Include="Assembly-CSharp">
|
||||
<HintPath>..\dependencies\Assembly-CSharp.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="CommandSystem.Core">
|
||||
<HintPath>..\dependencies\CommandSystem.Core.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>
|
||||
<PackageReference Include="Northwood.LabAPI" Version="1.0.2" />
|
||||
</ItemGroup>
|
||||
</Project>
|
81
ScpSwap/SwapCommand.cs
Normal file
81
ScpSwap/SwapCommand.cs
Normal file
@ -0,0 +1,81 @@
|
||||
using CommandSystem;
|
||||
using LabApi.Features.Wrappers;
|
||||
using PlayerRoles;
|
||||
|
||||
namespace ScpSwap;
|
||||
|
||||
[CommandHandler(typeof(ClientCommandHandler))]
|
||||
public class SwapCommand : ICommand
|
||||
{
|
||||
public bool Execute(ArraySegment<string> arguments, ICommandSender sender, out string response)
|
||||
{
|
||||
if (arguments.Count != 1)
|
||||
{
|
||||
response = "Usage: .scpswap <SCP_NUMBER>";
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!Player.TryGet(sender, out var player))
|
||||
{
|
||||
response = "You must be a player to use this command!";
|
||||
return false;
|
||||
}
|
||||
|
||||
if (Round.Duration.TotalSeconds > 120)
|
||||
{
|
||||
response = "You can't swap SCPs during a round!";
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!player.IsSCP)
|
||||
{
|
||||
response = "You must be an SCP to use this command!";
|
||||
return false;
|
||||
}
|
||||
|
||||
List<string> validScp =
|
||||
[
|
||||
"049",
|
||||
"079",
|
||||
"096",
|
||||
"106",
|
||||
"173",
|
||||
"939",
|
||||
];
|
||||
|
||||
var arg = arguments.First();
|
||||
|
||||
if (!validScp.Contains(arg))
|
||||
{
|
||||
response = "Invalid SCP number.";
|
||||
return false;
|
||||
}
|
||||
|
||||
if (Player.List.Where(x=>x.IsSCP).Select(x=>x.RoleBase).Any(playerRole => playerRole.RoleName == "SCP-" + arg))
|
||||
{
|
||||
response = "Already exists";
|
||||
return false;
|
||||
}
|
||||
|
||||
var role = arg switch
|
||||
{
|
||||
"049" => RoleTypeId.Scp049,
|
||||
"079" => RoleTypeId.Scp079,
|
||||
"096" => RoleTypeId.Scp096,
|
||||
"106" => RoleTypeId.Scp106,
|
||||
"173" => RoleTypeId.Scp173,
|
||||
"939" => RoleTypeId.Scp939,
|
||||
_ => throw new ArgumentOutOfRangeException()
|
||||
};
|
||||
|
||||
player.SetRole(role);
|
||||
|
||||
response = "Swapping...";
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public string Command { get; } = "scpswap";
|
||||
public string[] Aliases { get; } = ["ss"];
|
||||
public string Description { get; } = "Swaps SCPs";
|
||||
}
|
@ -18,6 +18,22 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RangeBan.Tests", "RangeBan.
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CuffedFrenemies", "CuffedFrenemies\CuffedFrenemies.csproj", "{C3FEEC52-B7C0-4DB6-A0CA-54BE175072D8}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CandySetting", "CandySetting\CandySetting.csproj", "{DF3E3243-BD16-4484-BA01-020170FFC871}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScpSwap", "ScpSwap\ScpSwap.csproj", "{B56CA1D5-0927-4542-B967-5E7F5B092E50}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CustomItemSpawn", "CustomItemSpawn\CustomItemSpawn.csproj", "{887DC217-999F-400B-8918-6737B7694BEE}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AfkSwap", "AfkSwap\AfkSwap.csproj", "{A21DBED5-2B6C-4298-B2CC-DE8F4BAC9766}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WarheadEvents", "WarheadEvents\WarheadEvents.csproj", "{83EB26E9-C1EB-43C9-B010-BBE0F7F05EE9}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CustomClasses", "CustomClasses\CustomClasses.csproj", "{234E0C4B-5CD2-4FEB-8222-950959E6C082}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServerHints", "ServerHints\ServerHints.csproj", "{146AC6C6-AFE6-4EEA-B2F4-6403AD7189D9}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GrowingZombies", "GrowingZombies\GrowingZombies.csproj", "{5751F8D6-7A8D-4C2C-B7E9-A8A3DB324329}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
@ -60,5 +76,37 @@ Global
|
||||
{C3FEEC52-B7C0-4DB6-A0CA-54BE175072D8}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{C3FEEC52-B7C0-4DB6-A0CA-54BE175072D8}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{C3FEEC52-B7C0-4DB6-A0CA-54BE175072D8}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{DF3E3243-BD16-4484-BA01-020170FFC871}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{DF3E3243-BD16-4484-BA01-020170FFC871}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{DF3E3243-BD16-4484-BA01-020170FFC871}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{DF3E3243-BD16-4484-BA01-020170FFC871}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{B56CA1D5-0927-4542-B967-5E7F5B092E50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{B56CA1D5-0927-4542-B967-5E7F5B092E50}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{B56CA1D5-0927-4542-B967-5E7F5B092E50}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{B56CA1D5-0927-4542-B967-5E7F5B092E50}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{887DC217-999F-400B-8918-6737B7694BEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{887DC217-999F-400B-8918-6737B7694BEE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{887DC217-999F-400B-8918-6737B7694BEE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{887DC217-999F-400B-8918-6737B7694BEE}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{A21DBED5-2B6C-4298-B2CC-DE8F4BAC9766}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{A21DBED5-2B6C-4298-B2CC-DE8F4BAC9766}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{A21DBED5-2B6C-4298-B2CC-DE8F4BAC9766}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{A21DBED5-2B6C-4298-B2CC-DE8F4BAC9766}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{83EB26E9-C1EB-43C9-B010-BBE0F7F05EE9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{83EB26E9-C1EB-43C9-B010-BBE0F7F05EE9}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{83EB26E9-C1EB-43C9-B010-BBE0F7F05EE9}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{83EB26E9-C1EB-43C9-B010-BBE0F7F05EE9}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{234E0C4B-5CD2-4FEB-8222-950959E6C082}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{234E0C4B-5CD2-4FEB-8222-950959E6C082}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{234E0C4B-5CD2-4FEB-8222-950959E6C082}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{234E0C4B-5CD2-4FEB-8222-950959E6C082}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{146AC6C6-AFE6-4EEA-B2F4-6403AD7189D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{146AC6C6-AFE6-4EEA-B2F4-6403AD7189D9}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{146AC6C6-AFE6-4EEA-B2F4-6403AD7189D9}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{146AC6C6-AFE6-4EEA-B2F4-6403AD7189D9}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{5751F8D6-7A8D-4C2C-B7E9-A8A3DB324329}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{5751F8D6-7A8D-4C2C-B7E9-A8A3DB324329}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{5751F8D6-7A8D-4C2C-B7E9-A8A3DB324329}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{5751F8D6-7A8D-4C2C-B7E9-A8A3DB324329}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
|
51
ServerHints/ServerHints.cs
Normal file
51
ServerHints/ServerHints.cs
Normal file
@ -0,0 +1,51 @@
|
||||
using LabApi.Events.Handlers;
|
||||
using LabApi.Features;
|
||||
using LabApi.Features.Wrappers;
|
||||
using LabApi.Loader.Features.Plugins;
|
||||
using MEC;
|
||||
|
||||
namespace ServerHints;
|
||||
|
||||
public class ServerHints: Plugin
|
||||
{
|
||||
public override string Name => "ServerHints";
|
||||
public override string Author => "Code002Lover";
|
||||
public override Version Version { get; } = new(1, 0, 0);
|
||||
public override string Description => "Adds hints for custom features.";
|
||||
public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion);
|
||||
|
||||
public string[] Hints { get; set; } =
|
||||
[
|
||||
"Man kann gegnerische Einheiten festnehmen, um sie zu seiner Seite zu bringen.",
|
||||
"Als Hausmeister beginnst du in der Nähe von SCP-914.",
|
||||
"Du kannst als SCP mit .scpswap <SCP nummer> deine Rolle tauschen. (Ö)",
|
||||
"Es gibt auf der Surface versteckte Items.",
|
||||
"Man kann mehr als 2 Candies nehmen.",
|
||||
"Man braucht seine Karte nicht in der Hand zu halten.",
|
||||
"Man kann Türen aufschießen",
|
||||
"Wenn man Granaten anschießt, explodieren sie sofort."
|
||||
];
|
||||
|
||||
public override void Enable()
|
||||
{
|
||||
ServerEvents.RoundStarted += OnRoundStarted;
|
||||
}
|
||||
|
||||
|
||||
public override void Disable()
|
||||
{
|
||||
ServerEvents.RoundStarted -= OnRoundStarted;
|
||||
}
|
||||
private void OnRoundStarted()
|
||||
{
|
||||
var random = new Random();
|
||||
var hint = Hints[random.Next(Hints.Length)];
|
||||
Timing.CallDelayed(1, () =>
|
||||
{
|
||||
foreach (var player in Player.ReadyList)
|
||||
{
|
||||
player.SendBroadcast($"<color=grey>{hint}</color>", 3);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
46
ServerHints/ServerHints.csproj
Normal file
46
ServerHints/ServerHints.csproj
Normal file
@ -0,0 +1,46 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net48</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>disable</Nullable>
|
||||
<LangVersion>latest</LangVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||
<Optimize>true</Optimize>
|
||||
<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
|
||||
<DebugType>full</DebugType>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
||||
<Optimize>true</Optimize>
|
||||
<CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
|
||||
<DebugType>none</DebugType>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Reference Include="Assembly-CSharp">
|
||||
<HintPath>..\dependencies\Assembly-CSharp.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Assembly-CSharp-firstpass">
|
||||
<HintPath>..\dependencies\Assembly-CSharp-firstpass.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Mirror">
|
||||
<HintPath>..\dependencies\Mirror.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="NorthwoodLib">
|
||||
<HintPath>..\dependencies\NorthwoodLib.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>
|
||||
<PackageReference Include="Northwood.LabAPI" Version="1.0.2" />
|
||||
</ItemGroup>
|
||||
</Project>
|
@ -65,8 +65,6 @@ namespace VisibleSpectators
|
||||
|
||||
private void AddPlayerHint(Player player)
|
||||
{
|
||||
if (player == null) return;
|
||||
|
||||
var hint = new Hint
|
||||
{
|
||||
Text = $"{Config!.HeaderMessage}\n{Config!.NoSpectatorsMessage}",
|
||||
@ -118,6 +116,7 @@ namespace VisibleSpectators
|
||||
private static string PlayerToDisplay(Player player)
|
||||
{
|
||||
if (player == null) return "";
|
||||
if (!player.IsReady) return "";
|
||||
|
||||
// Default color if GroupColor is null or not found in the map
|
||||
const string defaultColor = "FFFFFF";
|
||||
@ -143,11 +142,6 @@ namespace VisibleSpectators
|
||||
|
||||
private void UpdateSpectators(Player player)
|
||||
{
|
||||
if (player == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Safety check - if player doesn't have a hint, create one
|
||||
if (!_spectatorHints.ContainsKey(player))
|
||||
{
|
||||
@ -185,7 +179,7 @@ namespace VisibleSpectators
|
||||
|
||||
private static Player[] GetPlayers()
|
||||
{
|
||||
return Player.Dictionary.Values.Where(x=>!x.IsHost).ToArray();
|
||||
return Player.ReadyList.Where(IsNotOverwatch).ToArray();
|
||||
}
|
||||
|
||||
private static void OnSpectate(PlayerChangedSpectatorEventArgs ev)
|
||||
@ -203,7 +197,7 @@ namespace VisibleSpectators
|
||||
|
||||
public class SpectatorConfig
|
||||
{
|
||||
public string HeaderMessage => "Spectators:";
|
||||
public string NoSpectatorsMessage => "No spectators";
|
||||
public string HeaderMessage { get; set; } = "Spectators:";
|
||||
public string NoSpectatorsMessage { get; set; } = "No spectators";
|
||||
}
|
||||
}
|
33
WarheadEvents/WarheadEvents.cs
Normal file
33
WarheadEvents/WarheadEvents.cs
Normal file
@ -0,0 +1,33 @@
|
||||
using Interactables.Interobjects.DoorUtils;
|
||||
using LabApi.Events.Arguments.WarheadEvents;
|
||||
using LabApi.Features;
|
||||
using LabApi.Features.Wrappers;
|
||||
using LabApi.Loader.Features.Plugins;
|
||||
|
||||
namespace WarheadEvents;
|
||||
|
||||
public class WarheadEvents : Plugin
|
||||
{
|
||||
public override string Name => "WarheadEvents";
|
||||
public override string Author => "Code002Lover";
|
||||
public override Version Version { get; } = new(1, 0, 0);
|
||||
public override string Description => "Misc. stuff for after the Warhead explosion.";
|
||||
public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion);
|
||||
|
||||
public override void Enable()
|
||||
{
|
||||
LabApi.Events.Handlers.WarheadEvents.Detonated += OnExplode;
|
||||
}
|
||||
|
||||
public override void Disable()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private static void OnExplode(WarheadDetonatedEventArgs ev)
|
||||
{
|
||||
var door = Door.Get(DoorVariant.AllDoors.First(x=>x.DoorName.ToUpper() == "ESCAPE_FINAL"));
|
||||
|
||||
door.IsOpened = true;
|
||||
}
|
||||
}
|
43
WarheadEvents/WarheadEvents.csproj
Normal file
43
WarheadEvents/WarheadEvents.csproj
Normal file
@ -0,0 +1,43 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net48</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>disable</Nullable>
|
||||
<LangVersion>10</LangVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||
<Optimize>true</Optimize>
|
||||
<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
|
||||
<DebugType>full</DebugType>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
||||
<Optimize>true</Optimize>
|
||||
<CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
|
||||
<DebugType>none</DebugType>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Reference Include="Assembly-CSharp">
|
||||
<HintPath>..\dependencies\Assembly-CSharp.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Assembly-CSharp-firstpass">
|
||||
<HintPath>..\dependencies\Assembly-CSharp-firstpass.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>
|
||||
<PackageReference Include="Northwood.LabAPI" Version="1.0.2" />
|
||||
</ItemGroup>
|
||||
</Project>
|
Loading…
x
Reference in New Issue
Block a user