More work on events

This commit is contained in:
MSWS
2025-07-28 13:26:14 -07:00
parent c47851f4c5
commit 404fef40b0
12 changed files with 152 additions and 67 deletions

View File

@@ -1,6 +1,6 @@
using TTT.Api.Player;
namespace TTT.Api;
namespace TTT.Api.Messages;
public interface IMessenger {
/// <summary>
@@ -10,4 +10,26 @@ public interface IMessenger {
/// <param name="message">The message to send</param>
/// <typeparam name="T"></typeparam>
Task<bool> Message(IPlayer player, string message);
/// <summary>
/// Attempt to send a message to a player without showing it on the screen.
/// This could mean sending to console, background file, or just
/// falling back to showing it on the screen.
/// </summary>
/// <param name="player"></param>
/// <param name="message"></param>
/// <returns></returns>
Task<bool> BackgroundMsg(IPlayer player, string message)
=> Message(player, message);
/// <summary>
/// Attempt to send a message to a player that will be shown on the screen using
/// an alternative method, such as a popup or a notification.
/// May just fall back to showing it on the screen if no alternative is available.
/// </summary>
/// <param name="player"></param>
/// <param name="message"></param>
/// <returns></returns>
Task<bool> ScreenMsg(IPlayer player, string message)
=> Message(player, message);
}

View File

@@ -22,4 +22,13 @@ public class CombatListeners(IEventBus bus,
bus.Dispatch(new PlayerDeathEvent(converter, ev));
return HookResult.Continue;
}
[GameEventHandler]
public HookResult OnPlayerHurt(EventPlayerHurt ev, GameEventInfo _) {
var player = ev.Userid;
if (player == null) return HookResult.Continue;
bus.Dispatch(new PlayerDamagedEvent(converter, ev));
return HookResult.Continue;
}
}

View File

@@ -0,0 +1,34 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using TTT.Api.Events;
using TTT.Api.Messages;
using TTT.Api.Player;
using TTT.Game;
namespace TTT.CS2.Messages;
public class CS2Messenger(IEventBus bus) : EventModifiedMessenger(bus) {
private CCSPlayerController? getPlayer(IPlayer player) {
if (!ulong.TryParse(player.Id, out var steamId)) return null;
var gamePlayer = Utilities.GetPlayerFromSteamId(steamId);
return gamePlayer is not { IsValid: true } ? null : gamePlayer;
}
override protected Task<bool> SendMessage(IPlayer player, string message) {
var gamePlayer = getPlayer(player);
gamePlayer?.PrintToChat(message);
return Task.FromResult(gamePlayer != null);
}
public override Task<bool> BackgroundMsg(IPlayer player, string message) {
var gamePlayer = getPlayer(player);
gamePlayer?.PrintToConsole(message);
return Task.FromResult(gamePlayer != null);
}
public override Task<bool> ScreenMsg(IPlayer player, string message) {
var gamePlayer = getPlayer(player);
gamePlayer?.PrintToCenter(message);
return Task.FromResult(gamePlayer != null);
}
}

View File

@@ -1,12 +0,0 @@
using CounterStrikeSharp.API.Core;
using TTT.Api.Events;
namespace TTT.CS2.Messages;
public class ChatMessenger(IEventBus bus) : GameMessenger(bus) {
override protected Task<bool> SendMessage(CCSPlayerController gamePlayer,
string message) {
gamePlayer.PrintToChat(message);
return Task.FromResult(true);
}
}

View File

@@ -1,28 +0,0 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using TTT.Api.Events;
using TTT.Api.Messages;
using TTT.Api.Player;
using TTT.Game.Events.Player;
namespace TTT.CS2.Messages;
public abstract class GameMessenger(IEventBus bus) : IOnlineMessenger {
public Task<bool> Message(IOnlinePlayer player, string message) {
if (!ulong.TryParse(player.Id, out var steamId))
return Task.FromResult(false);
var gamePlayer = Utilities.GetPlayerFromSteamId(steamId);
if (gamePlayer == null || !gamePlayer.IsValid || gamePlayer.IsBot)
return Task.FromResult(false);
var messageEvent = new PlayerMessageEvent(player, message);
bus.Dispatch(messageEvent);
if (messageEvent.IsCanceled) return Task.FromResult(false);
return SendMessage(gamePlayer, messageEvent.Message);
}
abstract protected Task<bool> SendMessage(CCSPlayerController gamePlayer,
string message);
}

View File

@@ -0,0 +1,24 @@
using TTT.Api.Events;
using TTT.Api.Messages;
using TTT.Api.Player;
using TTT.Game.Events.Player;
namespace TTT.Game;
public abstract class EventModifiedMessenger(IEventBus bus) : IMessenger {
public Task<bool> Message(IPlayer player, string message) {
var messageEvent = new PlayerMessageEvent(player, message);
bus.Dispatch(messageEvent);
if (messageEvent.IsCanceled) return Task.FromResult(false);
return SendMessage(player, messageEvent.Message);
}
abstract protected Task<bool> SendMessage(IPlayer player, string message);
// Allow for overriding in derived classes
public virtual Task<bool> BackgroundMsg(IPlayer player, string message)
=> Message(player, message);
public virtual Task<bool> ScreenMsg(IPlayer player, string message)
=> Message(player, message);
}

View File

@@ -11,29 +11,29 @@ namespace GitVersion
public const string PreReleaseLabelWithDash = "";
// PreReleaseNumber is null and omitted
public const int WeightedPreReleaseNumber = 60000;
public const int BuildMetaData = 6;
public const string BuildMetaDataPadded = "0006";
public const string FullBuildMetaData = "6.Branch.main.Sha.08adb86f65b1b9385eb073addd2096dba435e687";
public const int BuildMetaData = 7;
public const string BuildMetaDataPadded = "0007";
public const string FullBuildMetaData = "7.Branch.main.Sha.c47851f4c5ff2b7ca848471e9f4ab164103131e1";
public const string MajorMinorPatch = "0.1.0";
public const string SemVer = "0.1.0";
public const string LegacySemVer = "0.1.0";
public const string LegacySemVerPadded = "0.1.0";
public const string AssemblySemVer = "0.1.0.0";
public const string AssemblySemFileVer = "0.1.0.0";
public const string FullSemVer = "0.1.0+6";
public const string InformationalVersion = "0.1.0+6.Branch.main.Sha.08adb86f65b1b9385eb073addd2096dba435e687";
public const string FullSemVer = "0.1.0+7";
public const string InformationalVersion = "0.1.0+7.Branch.main.Sha.c47851f4c5ff2b7ca848471e9f4ab164103131e1";
public const string BranchName = "main";
public const string EscapedBranchName = "main";
public const string Sha = "08adb86f65b1b9385eb073addd2096dba435e687";
public const string ShortSha = "08adb86";
public const string Sha = "c47851f4c5ff2b7ca848471e9f4ab164103131e1";
public const string ShortSha = "c47851f";
public const string NuGetVersionV2 = "0.1.0";
public const string NuGetVersion = "0.1.0";
public const string NuGetPreReleaseTagV2 = "";
public const string NuGetPreReleaseTag = "";
public const string VersionSourceSha = "dabc2a6913b5b73fa972ef21c1c480615eecff36";
public const int CommitsSinceVersionSource = 6;
public const string CommitsSinceVersionSourcePadded = "0006";
public const int UncommittedChanges = 30;
public const int CommitsSinceVersionSource = 7;
public const string CommitsSinceVersionSourcePadded = "0007";
public const int UncommittedChanges = 10;
public const string CommitDate = "2025-07-28";
}
}

View File

@@ -8,28 +8,28 @@
"PreReleaseLabelWithDash": "",
"PreReleaseNumber": null,
"WeightedPreReleaseNumber": 60000,
"BuildMetaData": 6,
"BuildMetaDataPadded": "0006",
"FullBuildMetaData": "6.Branch.main.Sha.08adb86f65b1b9385eb073addd2096dba435e687",
"BuildMetaData": 7,
"BuildMetaDataPadded": "0007",
"FullBuildMetaData": "7.Branch.main.Sha.c47851f4c5ff2b7ca848471e9f4ab164103131e1",
"MajorMinorPatch": "0.1.0",
"SemVer": "0.1.0",
"LegacySemVer": "0.1.0",
"LegacySemVerPadded": "0.1.0",
"AssemblySemVer": "0.1.0.0",
"AssemblySemFileVer": "0.1.0.0",
"FullSemVer": "0.1.0+6",
"InformationalVersion": "0.1.0+6.Branch.main.Sha.08adb86f65b1b9385eb073addd2096dba435e687",
"FullSemVer": "0.1.0+7",
"InformationalVersion": "0.1.0+7.Branch.main.Sha.c47851f4c5ff2b7ca848471e9f4ab164103131e1",
"BranchName": "main",
"EscapedBranchName": "main",
"Sha": "08adb86f65b1b9385eb073addd2096dba435e687",
"ShortSha": "08adb86",
"Sha": "c47851f4c5ff2b7ca848471e9f4ab164103131e1",
"ShortSha": "c47851f",
"NuGetVersionV2": "0.1.0",
"NuGetVersion": "0.1.0",
"NuGetPreReleaseTagV2": "",
"NuGetPreReleaseTag": "",
"VersionSourceSha": "dabc2a6913b5b73fa972ef21c1c480615eecff36",
"CommitsSinceVersionSource": 6,
"CommitsSinceVersionSourcePadded": "0006",
"UncommittedChanges": 30,
"CommitsSinceVersionSource": 7,
"CommitsSinceVersionSourcePadded": "0007",
"UncommittedChanges": 10,
"CommitDate": "2025-07-28"
}

View File

@@ -1,20 +1,19 @@
using TTT.Api;
using TTT.Api.Events;
using TTT.Api.Messages;
using TTT.Api.Player;
using TTT.Game;
using TTT.Game.Events.Player;
namespace TTT.Test.Fakes;
public class FakeMessenger(IEventBus bus) : IMessenger {
public Task<bool> Message(IPlayer player, string message) {
public class FakeMessenger(IEventBus bus) : EventModifiedMessenger(bus) {
override protected Task<bool> SendMessage(IPlayer player, string message) {
if (player is not TestPlayer testPlayer)
throw new ArgumentException("Player must be a TestPlayer",
nameof(player));
var messageEvent = new PlayerMessageEvent(testPlayer, message);
bus.Dispatch(messageEvent);
if (messageEvent.IsCanceled) return Task.FromResult(false);
testPlayer.Messages.Add(messageEvent.Message);
testPlayer.Messages.Add(message);
return Task.FromResult(true);
}
}

View File

@@ -1,5 +1,6 @@
using TTT.Api;
using TTT.Api.Events;
using TTT.Api.Messages;
using TTT.Game.Events.Player;
using TTT.Test.Fakes;
using Xunit;

View File

@@ -0,0 +1,35 @@
using TTT.Api.Events;
using TTT.Api.Messages;
using TTT.Game.Events.Player;
using Xunit;
namespace TTT.Test.Messages;
public class MessageModificationTest(IEventBus bus, IMessenger messenger) {
private const string ORIGINAL_MESSAGE = "Original Message";
private const string MODIFIED_MESSAGE = "Modified Message";
private class MessageModifyListener(IEventBus bus) : IListener {
public void Dispose() => bus.UnregisterListener(this);
[EventHandler]
public void OnMessage(PlayerMessageEvent ev) {
ev.Message = MODIFIED_MESSAGE;
}
}
[Fact]
public void TestMessageModification() {
// Arrange
var listener = new MessageModifyListener(bus);
bus.RegisterListener(listener);
var player = TestPlayer.Random();
// Act
messenger.Message(player, ORIGINAL_MESSAGE);
// Assert
Assert.Single(player.Messages);
Assert.Equal(MODIFIED_MESSAGE, player.Messages[0]);
}
}

View File

@@ -1,6 +1,7 @@
using Microsoft.Extensions.DependencyInjection;
using TTT.Api;
using TTT.Api.Events;
using TTT.Api.Messages;
using TTT.Api.Player;
using TTT.Game;
using TTT.Plugin;