mirror of
https://github.com/MSWS/TTT.git
synced 2025-12-05 22:20:25 -08:00
More work on events
This commit is contained in:
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
34
TTT.CS2/Messages/CS2Messenger.cs
Normal file
34
TTT.CS2/Messages/CS2Messenger.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
24
TTT.Game/EventModifiedMessenger.cs
Normal file
24
TTT.Game/EventModifiedMessenger.cs
Normal 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);
|
||||
}
|
||||
@@ -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";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
35
TTT.Test/Messages/MessageModificationTest.cs
Normal file
35
TTT.Test/Messages/MessageModificationTest.cs
Normal 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]);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user