mirror of
https://github.com/MSWS/TTT.git
synced 2025-12-08 07:16:33 -08:00
Compare commits
4 Commits
0.17.0-dev
...
0.17.0-dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bd475edd54 | ||
|
|
092a676f97 | ||
|
|
cebf48a9e6 | ||
|
|
303b6de39c |
@@ -65,6 +65,7 @@ public static class CS2ServiceCollection {
|
||||
collection.AddModBehavior<BuyMenuHandler>();
|
||||
collection.AddModBehavior<TeamChangeHandler>();
|
||||
collection.AddModBehavior<TraitorChatHandler>();
|
||||
collection.AddModBehavior<PlayerMuter>();
|
||||
|
||||
// Damage Cancelers
|
||||
collection.AddModBehavior<OutOfRoundCanceler>();
|
||||
|
||||
56
TTT/CS2/GameHandlers/PlayerMuter.cs
Normal file
56
TTT/CS2/GameHandlers/PlayerMuter.cs
Normal file
@@ -0,0 +1,56 @@
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Core.Attributes.Registration;
|
||||
using JetBrains.Annotations;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using TTT.API;
|
||||
using TTT.API.Messages;
|
||||
using TTT.API.Player;
|
||||
using TTT.CS2.lang;
|
||||
using TTT.Game.Listeners;
|
||||
using TTT.Locale;
|
||||
|
||||
namespace TTT.CS2.GameHandlers;
|
||||
|
||||
public class PlayerMuter(IServiceProvider provider) : IPluginModule {
|
||||
private readonly IMsgLocalizer locale =
|
||||
provider.GetRequiredService<IMsgLocalizer>();
|
||||
|
||||
private readonly IMessenger messenger =
|
||||
provider.GetRequiredService<IMessenger>();
|
||||
|
||||
private readonly IPlayerConverter<CCSPlayerController> converter =
|
||||
provider.GetRequiredService<IPlayerConverter<CCSPlayerController>>();
|
||||
|
||||
public void Dispose() { }
|
||||
public void Start() { }
|
||||
|
||||
public void Start(BasePlugin? plugin) {
|
||||
plugin
|
||||
?.RegisterListener<CounterStrikeSharp.API.Core.Listeners.OnClientVoice>(
|
||||
onVoice);
|
||||
}
|
||||
|
||||
private void onVoice(int playerSlot) {
|
||||
var player = Utilities.GetPlayerFromSlot(playerSlot);
|
||||
if (player == null) return;
|
||||
|
||||
if (player.Pawn.Value is { Health: > 0 }) return;
|
||||
|
||||
if ((player.VoiceFlags & VoiceFlags.Muted) != VoiceFlags.Muted) {
|
||||
var apiPlayer = converter.GetPlayer(player);
|
||||
messenger.Message(apiPlayer, locale[CS2Msgs.DEAD_MUTE_REMINDER]);
|
||||
}
|
||||
|
||||
player.VoiceFlags |= VoiceFlags.Muted;
|
||||
}
|
||||
|
||||
[UsedImplicitly]
|
||||
[GameEventHandler]
|
||||
public HookResult OnSpawn(EventPlayerSpawn ev, GameEventInfo _) {
|
||||
var player = ev.Userid;
|
||||
if (player == null) return HookResult.Continue;
|
||||
player.VoiceFlags &= ~VoiceFlags.Muted;
|
||||
return HookResult.Continue;
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Commands;
|
||||
using MAULActainShared.plugin;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
@@ -33,15 +34,25 @@ public class TraitorChatHandler(IServiceProvider provider) : IPluginModule {
|
||||
private IActain? maulService = null;
|
||||
|
||||
public void Start(BasePlugin? plugin) {
|
||||
plugin?.AddCommandListener("say_team", onSay);
|
||||
try {
|
||||
maulService ??= EgoApi.MAUL.Get();
|
||||
if (maulService != null)
|
||||
maulService.getChatShareService().OnChatShare += (
|
||||
CCSPlayerController? player, CommandInfo info, ref bool canceled) => {
|
||||
canceled = true;
|
||||
};
|
||||
} catch (KeyNotFoundException) { }
|
||||
if (maulService != null) {
|
||||
maulService.getChatShareService().OnChatShare += OnOnChatShare;
|
||||
return;
|
||||
}
|
||||
|
||||
plugin?.AddCommandListener("say_team", onSay);
|
||||
} catch (KeyNotFoundException) {
|
||||
plugin?.AddCommandListener("say_team", onSay);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnOnChatShare(CCSPlayerController? player, CommandInfo info,
|
||||
ref bool canceled) {
|
||||
if (!info.GetArg(0).Equals("say_team", StringComparison.OrdinalIgnoreCase))
|
||||
return;
|
||||
var result = onSay(player, info);
|
||||
if (result == HookResult.Handled) canceled = true;
|
||||
}
|
||||
|
||||
private HookResult onSay(CCSPlayerController? player,
|
||||
@@ -58,14 +69,18 @@ public class TraitorChatHandler(IServiceProvider provider) : IPluginModule {
|
||||
if (teammates == null) return HookResult.Continue;
|
||||
|
||||
var msg = commandInfo.ArgString;
|
||||
if (msg.StartsWith('\\') && msg.EndsWith('\\') && msg.Length >= 2)
|
||||
if (msg.StartsWith('"') && msg.EndsWith('"') && msg.Length >= 2)
|
||||
msg = msg[1..^1];
|
||||
var formatted = locale[CS2Msgs.TRAITOR_CHAT_FORMAT(apiPlayer, msg)];
|
||||
|
||||
foreach (var mate in teammates) messenger.Message(mate, formatted);
|
||||
return HookResult.Stop;
|
||||
return HookResult.Handled;
|
||||
}
|
||||
|
||||
public void Dispose() {
|
||||
if (maulService != null)
|
||||
maulService.getChatShareService().OnChatShare -= OnOnChatShare;
|
||||
}
|
||||
|
||||
public void Dispose() { }
|
||||
public void Start() { }
|
||||
}
|
||||
@@ -33,8 +33,8 @@ public class SilentAWPItem(IServiceProvider provider)
|
||||
private readonly IPlayerConverter<CCSPlayerController> playerConverter =
|
||||
provider.GetRequiredService<IPlayerConverter<CCSPlayerController>>();
|
||||
|
||||
private readonly IDictionary<IOnlinePlayer, int> silentShots =
|
||||
new Dictionary<IOnlinePlayer, int>();
|
||||
private readonly IDictionary<string, int> silentShots =
|
||||
new Dictionary<string, int>();
|
||||
|
||||
public override string Name => Locale[SilentAWPMsgs.SHOP_ITEM_SILENT_AWP];
|
||||
|
||||
@@ -49,8 +49,11 @@ public class SilentAWPItem(IServiceProvider provider)
|
||||
}
|
||||
|
||||
public override void OnPurchase(IOnlinePlayer player) {
|
||||
silentShots[player] = config.CurrentAmmo ?? 0 + config.ReserveAmmo ?? 0;
|
||||
Inventory.GiveWeapon(player, config);
|
||||
silentShots[player.Id] = config.CurrentAmmo ?? 0 + config.ReserveAmmo ?? 0;
|
||||
Task.Run(async () => {
|
||||
await Inventory.RemoveWeaponInSlot(player, 0);
|
||||
await Inventory.GiveWeapon(player, config);
|
||||
});
|
||||
}
|
||||
|
||||
private HookResult onWeaponSound(UserMessage msg) {
|
||||
@@ -75,12 +78,12 @@ public class SilentAWPItem(IServiceProvider provider)
|
||||
if (playerConverter.GetPlayer(player) is not IOnlinePlayer apiPlayer)
|
||||
return HookResult.Continue;
|
||||
|
||||
if (!silentShots.TryGetValue(apiPlayer, out var shots) || shots <= 0)
|
||||
if (!silentShots.TryGetValue(apiPlayer.Id, out var shots) || shots <= 0)
|
||||
return HookResult.Continue;
|
||||
|
||||
silentShots[apiPlayer] = shots - 1;
|
||||
if (silentShots[apiPlayer] == 0) {
|
||||
silentShots.Remove(apiPlayer);
|
||||
silentShots[apiPlayer.Id] = shots - 1;
|
||||
if (silentShots[apiPlayer.Id] == 0) {
|
||||
silentShots.Remove(apiPlayer.Id);
|
||||
Shop.RemoveItem<SilentAWPItem>(apiPlayer);
|
||||
}
|
||||
|
||||
|
||||
@@ -18,4 +18,7 @@ public static class CS2Msgs {
|
||||
public static IMsg TRAITOR_CHAT_FORMAT(IOnlinePlayer player, string msg) {
|
||||
return MsgFactory.Create(nameof(TRAITOR_CHAT_FORMAT), player.Name, msg);
|
||||
}
|
||||
|
||||
public static IMsg DEAD_MUTE_REMINDER
|
||||
=> MsgFactory.Create(nameof(DEAD_MUTE_REMINDER));
|
||||
}
|
||||
@@ -3,6 +3,8 @@ TRAITOR_CHAT_FORMAT: "{darkred}[TRAITORS] {red}{0}: {default}{1}"
|
||||
TASER_SCANNED: "%PREFIX%You scanned {0}{grey}, they are %an% {1}{grey}!"
|
||||
DNA_PREFIX: "{darkblue}D{blue}N{lightblue}A{grey} | {grey}"
|
||||
|
||||
DEAD_MUTE_REMINDER: "%PREFIX%You are dead and cannot be heard."
|
||||
|
||||
SHOP_ITEM_DNA: "DNA Scanner"
|
||||
SHOP_ITEM_DNA_DESC: "Scan bodies to reveal the person who killed them."
|
||||
SHOP_ITEM_DNA_SCANNED: "%DNA_PREFIX%You scanned {0}{1}'%s% {grey}body, their killer was {red}{2}{grey}."
|
||||
|
||||
@@ -32,7 +32,7 @@ public class LogsCommand(IServiceProvider provider) : ICommand {
|
||||
if (games.ActiveGame is not {
|
||||
State: State.IN_PROGRESS or State.FINISHED
|
||||
}) {
|
||||
info.ReplySync("No active game to show logs for.");
|
||||
messenger.Message(executor, localizer[GameMsgs.GAME_LOGS_NONE]);
|
||||
return Task.FromResult(CommandResult.ERROR);
|
||||
}
|
||||
|
||||
|
||||
@@ -26,6 +26,9 @@ public static class GameMsgs {
|
||||
|
||||
public static IMsg GAME_LOGS_FOOTER
|
||||
=> MsgFactory.Create(nameof(GAME_LOGS_FOOTER));
|
||||
|
||||
public static IMsg GAME_LOGS_NONE
|
||||
=> MsgFactory.Create(nameof(GAME_LOGS_NONE));
|
||||
|
||||
public static IMsg ROLE_REVEAL_DEATH(IRole killerRole) {
|
||||
return MsgFactory.Create(nameof(ROLE_REVEAL_DEATH),
|
||||
|
||||
@@ -22,4 +22,5 @@ NOT_ENOUGH_PLAYERS: "%PREFIX%{red}Game was canceled due to having fewer than {ye
|
||||
BODY_IDENTIFIED: "%PREFIX%{default}{0}{grey} identified the body of {blue}{1}{grey}, they were %an% {2}{grey}!"
|
||||
GAME_LOGS_HEADER: "---------- Game Logs ----------"
|
||||
GAME_LOGS_FOOTER: "-------------------------------"
|
||||
GAME_LOGS_NONE: "%PREFIX%There is no game active."
|
||||
LOGS_VIEWED_ALIVE: "%PREFIX%{red}{0}{grey} viewed the logs while alive."
|
||||
@@ -10,14 +10,14 @@ using TTT.Locale;
|
||||
namespace TTT.Shop.Commands;
|
||||
|
||||
public class ListCommand(IServiceProvider provider) : ICommand, IItemSorter {
|
||||
private readonly IDictionary<IOnlinePlayer, List<IShopItem>> cache =
|
||||
new Dictionary<IOnlinePlayer, List<IShopItem>>();
|
||||
private readonly IDictionary<string, List<IShopItem>> cache =
|
||||
new Dictionary<string, List<IShopItem>>();
|
||||
|
||||
private readonly IGameManager games = provider
|
||||
.GetRequiredService<IGameManager>();
|
||||
|
||||
private readonly IDictionary<IOnlinePlayer, DateTime> lastUpdate =
|
||||
new Dictionary<IOnlinePlayer, DateTime>();
|
||||
private readonly IDictionary<string, DateTime> lastUpdate =
|
||||
new Dictionary<string, DateTime>();
|
||||
|
||||
private readonly IMsgLocalizer locale = provider
|
||||
.GetRequiredService<IMsgLocalizer>();
|
||||
@@ -37,7 +37,7 @@ public class ListCommand(IServiceProvider provider) : ICommand, IItemSorter {
|
||||
ICommandInfo info) {
|
||||
var items = calculateSortedItems(executor);
|
||||
|
||||
if (executor != null) cache[executor] = items;
|
||||
if (executor != null) cache[executor.Id] = items;
|
||||
items = new List<IShopItem>(items);
|
||||
items.Reverse();
|
||||
|
||||
@@ -63,14 +63,14 @@ public class ListCommand(IServiceProvider provider) : ICommand, IItemSorter {
|
||||
public List<IShopItem> GetSortedItems(IOnlinePlayer? player,
|
||||
bool refresh = false) {
|
||||
if (player == null) return calculateSortedItems(null);
|
||||
if (refresh || !cache.ContainsKey(player))
|
||||
cache[player] = calculateSortedItems(player);
|
||||
return cache[player];
|
||||
if (refresh || !cache.ContainsKey(player.Id))
|
||||
cache[player.Id] = calculateSortedItems(player);
|
||||
return cache[player.Id];
|
||||
}
|
||||
|
||||
public DateTime? GetLastUpdate(IOnlinePlayer? player) {
|
||||
if (player == null) return null;
|
||||
lastUpdate.TryGetValue(player, out var time);
|
||||
lastUpdate.TryGetValue(player.Id, out var time);
|
||||
return time;
|
||||
}
|
||||
|
||||
@@ -94,7 +94,7 @@ public class ListCommand(IServiceProvider provider) : ICommand, IItemSorter {
|
||||
return string.Compare(a.Name, b.Name, StringComparison.Ordinal);
|
||||
});
|
||||
|
||||
if (player != null) lastUpdate[player] = DateTime.Now;
|
||||
if (player != null) lastUpdate[player.Id] = DateTime.Now;
|
||||
return items;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user