Skip to content
Open
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
38 changes: 33 additions & 5 deletions CS2MenuManager/API/Menu/CenterHtmlMenu.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,14 @@ public class CenterHtmlMenuInstance : BaseMenuInstance
/// </summary>
public override int NumPerPage => 5;

// Display runs on every tick; each of these walks the localization stack and
// ReplaceColorTags reflects over ChatColors, none of which changes here.
private readonly string _prevLabel;
private readonly string _exitLabel;
private readonly string _nextLabel;
private readonly StringBuilder _builder = new();
private CounterStrikeSharp.API.Core.EventShowSurvivalRespawnStatus? _panelEvent;

/// <summary>
/// Gets the number of items displayed per page.
/// </summary>
Expand All @@ -70,6 +78,10 @@ public CenterHtmlMenuInstance(CCSPlayerController player, IMenu menu) : base(pla
if (Menu is CenterHtmlMenu { CenterHtmlMenu_MaxOptionLength: > 0 } centerHtmlMenu)
Menu.ItemOptions.ForEach(option => option.Text = option.Text.TruncateHtml(centerHtmlMenu.CenterHtmlMenu_MaxOptionLength));

_prevLabel = Player.Localizer("Prev");
_exitLabel = Player.Localizer("Exit");
_nextLabel = Player.Localizer("Next");

Menu.Plugin.RegisterListener<OnTick>(Display);
}

Expand All @@ -81,7 +93,8 @@ public override void Display()
if (Menu is not CenterHtmlMenu centerHtmlMenu)
return;

StringBuilder builder = new();
StringBuilder builder = _builder;
builder.Clear();
builder.Append($"<b><font color='{centerHtmlMenu.CenterHtmlMenu_TitleColor}'>{centerHtmlMenu.Title}</font></b><br>");

int keyOffset = 1;
Expand All @@ -102,7 +115,7 @@ public override void Display()
}

AddPageOptions(centerHtmlMenu, builder);
Player.PrintToCenterHtml(builder.ToString());
SendPanel(builder.ToString());
}

/// <summary>
Expand All @@ -113,15 +126,30 @@ public override void Close(bool exitSound)
base.Close(exitSound);
Menu.Plugin.RemoveListener<OnTick>(Display);

_panelEvent?.Free();
_panelEvent = null;

if (Player.IsValid)
Player.PrintToCenterHtml(" ");
}

// The panel only stays up while it is resent, so a game event is fired every
// tick; building and freeing one each time is most of what that costs.
private void SendPanel(string text)
{
if (!Player.IsValid)
return;

_panelEvent ??= new CounterStrikeSharp.API.Core.EventShowSurvivalRespawnStatus(true) { Userid = Player, Duration = 5 };
_panelEvent.LocToken = text;
_panelEvent.FireEventToClient(Player);
}

private void AddPageOptions(CenterHtmlMenu centerHtmlMenu, StringBuilder builder)
{
string prevText = $"<font color='{centerHtmlMenu.CenterHtmlMenu_PrevPageColor}'>!8 &#60;</font> {Player.Localizer("Prev")}";
string closeText = $"<font color='{centerHtmlMenu.CenterHtmlMenu_ExitColor}'>!0 X</font> {Player.Localizer("Exit")}";
string nextText = $"<font color='{centerHtmlMenu.CenterHtmlMenu_NextPageColor}'>!9 ></font> {Player.Localizer("Next")}";
string prevText = $"<font color='{centerHtmlMenu.CenterHtmlMenu_PrevPageColor}'>!8 &#60;</font> {_prevLabel}";
string closeText = $"<font color='{centerHtmlMenu.CenterHtmlMenu_ExitColor}'>!0 X</font> {_exitLabel}";
string nextText = $"<font color='{centerHtmlMenu.CenterHtmlMenu_NextPageColor}'>!9 ></font> {_nextLabel}";

if (centerHtmlMenu.CenterHtmlMenu_InlinePageOptions)
AddInlinePageOptions(prevText, closeText, nextText, builder);
Expand Down