Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 37 additions & 31 deletions managed/src/SwiftlyS2.Core/Modules/Menus/MenuManagerAPI.cs
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ private void KeyStateChange( IOnClientKeyStateChangedEvent @event )
if (menu.Configuration.PlaySound)
{
scrollSound.Recipients.AddRecipient(@event.PlayerId);
scrollSound.Emit();
_ = scrollSound.Emit();
scrollSound.Recipients.RemoveRecipient(@event.PlayerId);
}
}
Expand All @@ -156,18 +156,18 @@ private void KeyStateChange( IOnClientKeyStateChangedEvent @event )
if (menu.Configuration.PlaySound)
{
scrollSound.Recipients.AddRecipient(@event.PlayerId);
scrollSound.Emit();
_ = scrollSound.Emit();
scrollSound.Recipients.RemoveRecipient(@event.PlayerId);
}
}
else if (exitKey.HasFlag(@event.Key.ToKeyBind()))
{
CloseMenuForPlayer(player, menu);
CloseMenuForPlayerInternal(player, menu, true);

if (menu.Configuration.PlaySound)
{
exitSound.Recipients.AddRecipient(@event.PlayerId);
exitSound.Emit();
_ = exitSound.Emit();
exitSound.Recipients.RemoveRecipient(@event.PlayerId);
}
}
Expand All @@ -181,7 +181,7 @@ private void KeyStateChange( IOnClientKeyStateChangedEvent @event )
if (menu.Configuration.PlaySound && option.PlaySound)
{
useSound.Recipients.AddRecipient(@event.PlayerId);
useSound.Emit();
_ = useSound.Emit();
useSound.Recipients.RemoveRecipient(@event.PlayerId);
}
}
Expand All @@ -196,7 +196,7 @@ private void KeyStateChange( IOnClientKeyStateChangedEvent @event )
if (menu.Configuration.PlaySound)
{
scrollSound.Recipients.AddRecipient(@event.PlayerId);
scrollSound.Emit();
_ = scrollSound.Emit();
scrollSound.Recipients.RemoveRecipient(@event.PlayerId);
}
}
Expand All @@ -207,17 +207,17 @@ private void KeyStateChange( IOnClientKeyStateChangedEvent @event )
if (menu.Configuration.PlaySound)
{
scrollSound.Recipients.AddRecipient(@event.PlayerId);
scrollSound.Emit();
_ = scrollSound.Emit();
scrollSound.Recipients.RemoveRecipient(@event.PlayerId);
}
}
else if (KeyBind.A.HasFlag(@event.Key.ToKeyBind()))
{
CloseMenuForPlayer(player, menu);
CloseMenuForPlayerInternal(player, menu, true);
if (menu.Configuration.PlaySound)
{
exitSound.Recipients.AddRecipient(@event.PlayerId);
exitSound.Emit();
_ = exitSound.Emit();
exitSound.Recipients.RemoveRecipient(@event.PlayerId);
}
}
Expand All @@ -231,7 +231,7 @@ private void KeyStateChange( IOnClientKeyStateChangedEvent @event )
if (menu.Configuration.PlaySound && option.PlaySound)
{
useSound.Recipients.AddRecipient(@event.PlayerId);
useSound.Emit();
_ = useSound.Emit();
useSound.Recipients.RemoveRecipient(@event.PlayerId);
}
}
Expand All @@ -247,7 +247,7 @@ private void OnClientDisconnected( IOnClientDisconnectedEvent @event )
openMenus
.Where(kvp => kvp.Key == player)
.ToList()
.ForEach(kvp => CloseMenuForPlayer(player, kvp.Value));
.ForEach(kvp => CloseMenuForPlayerInternal(player, kvp.Value, true));
}
}

Expand Down Expand Up @@ -322,7 +322,7 @@ public void OpenMenuForPlayer( IPlayer player, IMenuAPI menu )
if (menu.Parent.ParentMenu == currentMenu)
{
// We are transitioning from the current menu to one of its submenus.
// To show the submenu, we first need to close the current (parent) menu, see CloseMenuForPlayer.
// To show the submenu, we first need to close the current (parent) menu.
// The parent menu may have an onClosed callback registered in onClosedCallbacks.
// If we do not remove that callback temporarily, closing the parent menu here
// would incorrectly invoke the callback even though the user is only navigating
Expand All @@ -333,12 +333,12 @@ public void OpenMenuForPlayer( IPlayer player, IMenuAPI menu )
// 3. Re-register the callback so it will only be invoked later, when the
// logical end of the menu flow is reached and the menu is truly closed.
_ = onClosedCallbacks.TryRemove((player, currentMenu), out var callback);
CloseMenuForPlayer(player, currentMenu);
CloseMenuForPlayerInternal(player, currentMenu, false);
_ = onClosedCallbacks.AddOrUpdate((player, currentMenu), callback, ( _, _ ) => callback);
}
else
{
CloseMenuForPlayer(player, currentMenu);
CloseMenuForPlayerInternal(player, currentMenu, false);
}
}

Expand All @@ -358,15 +358,36 @@ public void CloseMenu( IMenuAPI menu )
Core.PlayerManager
.GetAllPlayers()
.ToList()
.ForEach(player => CloseMenuForPlayer(player, menu));
.ForEach(player => CloseMenuForPlayerInternal(player, menu, true));
}

public void CloseMenuForPlayer( IPlayer player, IMenuAPI menu )
{
CloseMenuForPlayerInternal(player, menu, true);
}

public void CloseAllMenus()
{
openMenus.ToList().ForEach(kvp =>
{
var currentMenu = kvp.Value;
while (currentMenu != null)
{
currentMenu.HideForPlayer(kvp.Key);
MenuClosed?.Invoke(this, new MenuManagerEventArgs { Player = kvp.Key, Menu = currentMenu });
currentMenu = currentMenu.Parent.ParentMenu;
}
_ = openMenus.TryRemove(kvp.Key, out _);
});
}

private void CloseMenuForPlayerInternal( IPlayer player, IMenuAPI menu, bool reopenParent )
{
if (!openMenus.TryGetValue(player, out var currentMenu) || currentMenu != menu)
{
return;
}

if (onClosedCallbacks.TryRemove((player, menu), out var onClosed) && onClosed != null)
{
onClosed(player, menu);
Expand All @@ -377,25 +398,10 @@ public void CloseMenuForPlayer( IPlayer player, IMenuAPI menu )
menu.HideForPlayer(player);
MenuClosed?.Invoke(this, new MenuManagerEventArgs { Player = player, Menu = menu });

if (menu.Parent.ParentMenu != null)
if (reopenParent && menu.Parent.ParentMenu != null)
{
OpenMenuForPlayer(player, menu.Parent.ParentMenu);
}
}
}

public void CloseAllMenus()
{
openMenus.ToList().ForEach(kvp =>
{
var currentMenu = kvp.Value;
while (currentMenu != null)
{
currentMenu.HideForPlayer(kvp.Key);
MenuClosed?.Invoke(this, new MenuManagerEventArgs { Player = kvp.Key, Menu = currentMenu });
currentMenu = currentMenu.Parent.ParentMenu;
}
_ = openMenus.TryRemove(kvp.Key, out _);
});
}
}
23 changes: 19 additions & 4 deletions managed/src/SwiftlyS2.Core/Natives/GameFunctions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
using System.Text;
using Spectre.Console;
using SwiftlyS2.Shared.Natives;
using SwiftlyS2.Shared.SchemaDefinitions;

namespace SwiftlyS2.Core.Natives;

internal static class GameFunctions
{
private static readonly bool IsWindows = System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.Windows);
public static unsafe delegate* unmanaged< CTakeDamageInfo*, nint, nint, nint, Vector*, Vector*, float, int, int, void*, void > pCTakeDamageInfo_Constructor;
public static unsafe delegate* unmanaged< nint, Ray_t*, Vector, Vector, CTraceFilter*, CGameTrace*, void > pTraceShape;
public static unsafe delegate* unmanaged< Vector, Vector, BBox_t, CTraceFilter*, CGameTrace*, void > pTracePlayerBBox;
Expand All @@ -16,7 +16,8 @@ internal static class GameFunctions
public static unsafe delegate* unmanaged< nint, nint, float, void > pSetOrAddAttribute;
public static unsafe delegate* unmanaged< int, nint, nint > pGetWeaponCSDataFromKey;
public static unsafe delegate* unmanaged< nint, uint, nint, byte, CUtlSymbolLarge, byte, int, nint, nint, void > pDispatchParticleEffect;
public static unsafe delegate* unmanaged< nint, uint, float, nint, byte, void > pTerminateRound;
public static unsafe delegate* unmanaged< nint, uint, float, nint, byte, void > pTerminateRoundLinux;
public static unsafe delegate* unmanaged< nint, float, uint, nint, byte, void > pTerminateRoundWindows;
public static unsafe delegate* unmanaged< nint, Vector*, QAngle*, Vector*, void > pTeleport;
public static int TeleportOffset => NativeOffsets.Fetch("CBaseEntity::Teleport");
public static int CommitSuicideOffset => NativeOffsets.Fetch("CBasePlayerPawn::CommitSuicide");
Expand All @@ -43,7 +44,14 @@ public static void Initialize()
pSetOrAddAttribute = (delegate* unmanaged< nint, IntPtr, float, void >)NativeSignatures.Fetch("CAttributeList::SetOrAddAttributeValueByName");
pGetWeaponCSDataFromKey = (delegate* unmanaged< int, nint, nint >)NativeSignatures.Fetch("GetWeaponCSDataFromKey");
pDispatchParticleEffect = (delegate* unmanaged< nint, uint, nint, byte, CUtlSymbolLarge, byte, int, nint, nint, void >)NativeSignatures.Fetch("DispatchParticleEffect");
pTerminateRound = (delegate* unmanaged< nint, uint, float, nint, byte, void >)NativeSignatures.Fetch("CGameRules::TerminateRound");
if (IsWindows)
{
pTerminateRoundWindows = (delegate* unmanaged< nint, float, uint, nint, byte, void >)NativeSignatures.Fetch("CGameRules::TerminateRound");
}
else
{
pTerminateRoundLinux = (delegate* unmanaged< nint, uint, float, nint, byte, void >)NativeSignatures.Fetch("CGameRules::TerminateRound");
}
pTeleport = (delegate* unmanaged< nint, Vector*, QAngle*, Vector*, void >)((void**)NativeMemoryHelpers.GetVirtualTableAddress("server", "CBaseEntity"))[TeleportOffset];
}
}
Expand All @@ -60,7 +68,14 @@ public static void TerminateRound( nint gameRules, uint reason, float delay )
{
unsafe
{
pTerminateRound(gameRules, reason, delay, 0, 0);
if (IsWindows)
{
pTerminateRoundWindows(gameRules, delay, reason, 0, 0);
}
else
{
pTerminateRoundLinux(gameRules, reason, delay, 0, 0);
}
}
}
catch (Exception e)
Expand Down
45 changes: 39 additions & 6 deletions managed/src/TestPlugin/TestPlugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
using System.Collections.Concurrent;
using Dia2Lib;
using System.Reflection.Metadata;
using Microsoft.Diagnostics.Tracing.Parsers.MicrosoftWindowsTCPIP;

namespace TestPlugin;

Expand Down Expand Up @@ -620,6 +621,12 @@ public void GetIpCommand( ICommandContext context )

// Core.Menus.OpenMenu(player, settingsMenu);
// }
[Command("ed")]
public void EndRoundCommand( ICommandContext _ )
{
var gameRules = Core.EntitySystem.GetGameRules()!;
gameRules.TerminateRound(RoundEndReason.CTsWin, 10.0f);
}

[Command("tm")]
public void TestMenuCommand( ICommandContext context )
Expand All @@ -645,16 +652,42 @@ public void TestMenuCommand( ICommandContext context )
.AddOption(new ButtonMenuOption("Cancel") { CloseAfterClick = true })
.Build();

var menu = Core.MenusAPI
var shopMenu = Core.MenusAPI
.CreateBuilder()
.Design.SetMenuTitle("Shop Menu")
.AddOption(new SubmenuMenuOption("Item 1", confirmMenu))
.AddOption(new SubmenuMenuOption("Item 2", confirmMenu))
.AddOption(new SubmenuMenuOption("Item 3", confirmMenu))
.AddOption(new SubmenuMenuOption("Item 4", confirmMenu))
.AddOption(new SubmenuMenuOption("Item 1", async () =>
{
await Task.Delay(100);
return confirmMenu;
}))
.AddOption(new SubmenuMenuOption("Item 2", async () =>
{
await Task.Delay(100);
return confirmMenu;
}))
.AddOption(new SubmenuMenuOption("Item 3", async () =>
{
await Task.Delay(100);
return confirmMenu;
}))
.AddOption(new SubmenuMenuOption("Item 4", async () =>
{
await Task.Delay(100);
return confirmMenu;
}))
.Build();

var mainMenu = Core.MenusAPI
.CreateBuilder()
.Design.SetMenuTitle("Menu")
.AddOption(new SubmenuMenuOption("Shop", async () =>
{
await Task.Delay(100);
return shopMenu;
}))
.Build();

Core.MenusAPI.OpenMenu(menu, ( player, menu ) =>
Core.MenusAPI.OpenMenu(mainMenu, ( player, menu ) =>
{
Console.WriteLine($"{menu.Configuration.Title} closed for player: {player.Controller.PlayerName}");
});
Expand Down
38 changes: 28 additions & 10 deletions src/server/players/manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -210,8 +210,14 @@ void CheckTransmitHook(void* _this, CCheckTransmitInfo** ppInfoList, int infoCou
auto& pInfo = ppInfoList[i];
int playerid = pInfo->m_nPlayerSlot.Get();
if (!playermanager->IsPlayerOnline(playerid))
{
continue;
}
auto player = playermanager->GetPlayer(playerid);
if (!player)
{
continue;
}

auto& blockedBits = player->GetBlockedTransmittingBits();

Expand Down Expand Up @@ -275,12 +281,21 @@ bool ClientConnectHook(void* _this, CPlayerSlot slot, const char* pszName, uint6
static auto playermanager = g_ifaceService.FetchInterface<IPlayerManager>(PLAYERMANAGER_INTERFACE_VERSION);
auto playerid = slot.Get();
auto player = playermanager->RegisterPlayer(playerid);
player->Initialize(playerid);
// player->Initialize(playerid);
if (!player)
{
return false;
}

player->SetUnauthorizedSteamID(xuid);

if (g_pOnClientConnectCallback)
{
if (reinterpret_cast<bool (*)(int)>(g_pOnClientConnectCallback)(playerid) == false)
{
return false;
}
}

return reinterpret_cast<decltype(&ClientConnectHook)>(g_pClientConnectHook->GetOriginal())(_this, slot, pszName, xuid, pszNetworkID, unk1, pRejectReason);
}
Expand All @@ -291,8 +306,8 @@ void OnClientConnectedHook(void* _this, CPlayerSlot slot, const char* pszName, u
auto playerid = slot.Get();
if (bFakePlayer)
{
auto player = playermanager->RegisterPlayer(playerid);
player->Initialize(playerid);
playermanager->RegisterPlayer(playerid);
// player->Initialize(playerid);
}
else
{
Expand Down Expand Up @@ -326,10 +341,11 @@ IPlayer* CPlayerManager::RegisterPlayer(int playerid)
if (g_Players[playerid] != nullptr)
UnregisterPlayer(playerid);

g_Players[playerid] = new CPlayer();
g_Players[playerid]->Initialize(playerid);
auto player = new CPlayer();
player->Initialize(playerid);
g_Players[playerid] = player;

return g_Players[playerid];
return player;
}

void CPlayerManager::UnregisterPlayer(int playerid)
Expand All @@ -341,11 +357,13 @@ void CPlayerManager::UnregisterPlayer(int playerid)

static auto vgui = g_ifaceService.FetchInterface<IVGUI>(VGUI_INTERFACE_VERSION);

vgui->UnregisterForPlayer(g_Players[playerid]);

g_Players[playerid]->Shutdown();
delete g_Players[playerid];
auto player = g_Players[playerid];
g_Players[playerid] = nullptr;

vgui->UnregisterForPlayer(player);

player->Shutdown();
delete player;
}

IPlayer* CPlayerManager::GetPlayer(int playerid)
Expand Down
Loading
Loading