Add Template, more custom classes & fix issues

This commit is contained in:
2025-06-08 00:54:06 +02:00
parent c9bee028d9
commit 73a4da1edd
9 changed files with 466 additions and 53 deletions
+161
View File
@@ -0,0 +1,161 @@
using CommandSystem.Commands.RemoteAdmin;
using GameCore;
using LabApi.Events.Arguments.ServerEvents;
using LabApi.Events.Handlers;
using LabApi.Features;
using LabApi.Loader.Features.Plugins;
using MEC;
using Interactables.Interobjects.DoorUtils;
using LabApi.Events.Arguments.PlayerEvents;
using LabApi.Features.Wrappers;
using MapGeneration;
using PlayerRoles;
using UnityEngine;
using Logger = LabApi.Features.Console.Logger;
using Version = System.Version;
namespace LobbyGame
{
public class LobbyGame: Plugin
{
public override string Name => "LobbyGame";
public override string Author => "Code002Lover";
public override Version Version { get; } = new(1, 0, 0);
public override string Description => "Adds a lobby minigame";
public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion);
public int RoundTimer { get; set; } = 20;
public static LobbyGame Singleton { get; private set; }
private bool _isStarted;
private Room _randomRoom;
public override void Enable()
{
ServerEvents.WaitingForPlayers += WaitingForPlayers;
PlayerEvents.Joined += PlayerJoined;
Singleton = this;
}
private static void PlayerJoined(PlayerJoinedEventArgs ev)
{
Timing.RunCoroutine(ContinuouslyTrySpawning());
return;
IEnumerator<float> ContinuouslyTrySpawning()
{
while (!RoundStart.RoundStarted)
{
GameObject.Find("StartRound").transform.localScale = Vector3.zero;
yield return Timing.WaitForSeconds(0.5f);
if(Singleton._randomRoom == null) continue;
if(!Singleton._isStarted) continue;
ev.Player.SetRole(RoleTypeId.ChaosRifleman, RoleChangeReason.None, RoleSpawnFlags.None);
ev.Player.Position = Singleton._randomRoom.Position + new Vector3(0, 1, 0);
break;
}
}
}
private static void WaitingForPlayers()
{
Timing.CallDelayed(15, () =>
{
if (Singleton._isStarted) return;
var randomRoom = Map.GetRandomRoom(FacilityZone.Entrance);
while (randomRoom is not { Zone: FacilityZone.Entrance })
{
randomRoom = Map.GetRandomRoom(FacilityZone.Entrance);
}
Logger.Debug($"Random entrance room: {randomRoom.Name}");
RoundStart.LobbyLock = true;
Singleton._randomRoom = randomRoom;
Singleton._isStarted = true;
foreach (var player in Player.ReadyList)
{
player.SetRole(RoleTypeId.ChaosRifleman, RoleChangeReason.None, RoleSpawnFlags.None);
try
{
player.Position = randomRoom.Position + new Vector3(0, 1, 0);
}
catch (Exception _)
{
player.SetRole(RoleTypeId.Spectator);
}
}
Timing.RunCoroutine(ContinuouslyUpdateRoundTimer());
GameObject.Find("StartRound").transform.localScale = Vector3.zero;
foreach (var door in Map.Doors)
{
door.IsOpened = false;
door.Lock(DoorLockReason.Lockdown2176, true);
}
return;
IEnumerator<float> ContinuouslyUpdateRoundTimer()
{
while (true)
{
yield return Timing.WaitForSeconds(1);
foreach (var player in Player.ReadyList)
{
player.SendBroadcast(
$"<size=30><color=grey>Round starts in</color> <color=red>{Singleton.RoundTimer}</color> <color=grey>seconds</color></size>",
10, Broadcast.BroadcastFlags.Normal, true);
}
Logger.Debug($"Round starts in {Singleton.RoundTimer} seconds");
if (Player.ReadyList.Count() <= 1)
{
Singleton.RoundTimer = 20;
continue;
}
Singleton.RoundTimer--;
if (Singleton.RoundTimer >= -1) continue;
Singleton.RoundTimer = 20;
foreach (var player in Player.ReadyList)
{
player.ClearInventory();
player.SetRole(RoleTypeId.Spectator);
}
foreach (var door in Map.Doors)
{
door.Lock(DoorLockReason.Lockdown2176, false);
}
foreach (var player in Player.ReadyList)
{
player.SendBroadcast(
"",
1, Broadcast.BroadcastFlags.Normal, true);
}
CharacterClassManager.ForceRoundStart();
break;
}
}
});
}
public override void Disable()
{
ServerEvents.WaitingForPlayers -= WaitingForPlayers;
PlayerEvents.Joined -= PlayerJoined;
Singleton = null;
}
}
}
+57
View File
@@ -0,0 +1,57 @@
<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>
<PackageReference Include="Northwood.LabAPI" Version="1.0.2"/>
</ItemGroup>
<ItemGroup>
<Reference Include="0Harmony">
<HintPath>..\dependencies\0Harmony.dll</HintPath>
</Reference>
<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="CommandSystem.Core">
<HintPath>..\dependencies\CommandSystem.Core.dll</HintPath>
</Reference>
<Reference Include="HintServiceMeow">
<HintPath>..\dependencies\HintServiceMeow-LabAPI.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>
</Project>