Skip to content

Commit b11607d

Browse files
committed
Add feature to show death message only from teammates
1 parent ad22e32 commit b11607d

9 files changed

Lines changed: 161 additions & 29 deletions
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace EvolutionPlugins.OpenDeathMessages.Services
2+
{
3+
public enum DisplayType
4+
{
5+
Global,
6+
Group
7+
}
8+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using EvolutionPlugins.OpenDeathMessages.Services;
2+
using OpenMod.API.Ioc;
3+
using OpenMod.Unturned.Players;
4+
using System.Drawing;
5+
using System.Threading.Tasks;
6+
7+
namespace EvolutionPlugins.OpenDeathMessages.API
8+
{
9+
[Service]
10+
public interface IPlayerMessager
11+
{
12+
Task SendMessageGlobalOrGroupAsync(UnturnedPlayer player, string message, string? iconUrl, Color color);
13+
14+
Task ChangeDisplayTypeAsync(UnturnedPlayer player, DisplayType displayType);
15+
}
16+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
using Cysharp.Threading.Tasks;
2+
using EvolutionPlugins.OpenDeathMessages.API;
3+
using EvolutionPlugins.OpenDeathMessages.Services;
4+
using Microsoft.Extensions.Configuration;
5+
using OpenMod.Core.Commands;
6+
using OpenMod.Unturned.Commands;
7+
using OpenMod.Unturned.Users;
8+
using System;
9+
10+
namespace EvolutionPlugins.OpenDeathMessages.Commands
11+
{
12+
[Command("deathmessagedisplay")]
13+
[CommandAlias("dmd")]
14+
[CommandActor(typeof(UnturnedUser))]
15+
[CommandSyntax("<group|global>")]
16+
public class CommandDeathMessageDisplay : UnturnedCommand
17+
{
18+
private readonly IPlayerMessager m_PlayerMessager;
19+
private readonly IConfiguration m_Configuration;
20+
21+
public CommandDeathMessageDisplay(IServiceProvider serviceProvider, IPlayerMessager playerMessager, IConfiguration configuration) : base(serviceProvider)
22+
{
23+
m_PlayerMessager = playerMessager;
24+
m_Configuration = configuration;
25+
}
26+
27+
protected override async UniTask OnExecuteAsync()
28+
{
29+
if (Context.Parameters.Count != 1)
30+
{
31+
throw new CommandWrongUsageException(Context);
32+
}
33+
34+
var displayType = DisplayType.Global;
35+
var displayTypeString = Context.Parameters[0];
36+
if (displayTypeString.Equals("group", StringComparison.InvariantCultureIgnoreCase))
37+
{
38+
displayType = DisplayType.Group;
39+
}
40+
else if (displayTypeString.Equals("global", StringComparison.InvariantCultureIgnoreCase))
41+
{
42+
displayType = DisplayType.Global;
43+
}
44+
else
45+
{
46+
throw new CommandWrongUsageException(Context);
47+
}
48+
49+
var user = (UnturnedUser)Context.Actor;
50+
await m_PlayerMessager.ChangeDisplayTypeAsync(user.Player, displayType);
51+
52+
await PrintAsync(m_Configuration[$"commands:deathMessageDisplay:{(displayType is DisplayType.Global ? "global" : "group")}"]);
53+
}
54+
}
55+
}

OpenDeathMessages/Events/PlayerDeathEvent.cs renamed to OpenDeathMessages/Events/UnturnedPlayerDeathEventListener.cs

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
using EvolutionPlugins.Universal.Extras.Broadcast;
1+
using EvolutionPlugins.OpenDeathMessages.API;
22
using Microsoft.Extensions.Configuration;
33
using Microsoft.Extensions.Localization;
44
using OpenMod.API.Eventing;
5-
using OpenMod.API.Users;
65
using OpenMod.Unturned.Locations;
76
using OpenMod.Unturned.Players.Life.Events;
87
using OpenMod.Unturned.Users;
@@ -12,25 +11,23 @@
1211

1312
namespace EvolutionPlugins.OpenDeathMessages.Events
1413
{
15-
public class PlayerDeathEvent : IEventListener<UnturnedPlayerDeathEvent>
14+
public class UnturnedPlayerDeathEventListener : IEventListener<UnturnedPlayerDeathEvent>
1615
{
1716
private readonly IUnturnedUserDirectory m_UnturnedUserDirectory;
18-
private readonly IUserManager m_UserManager;
1917
private readonly IStringLocalizer m_StringLocalizer;
2018
private readonly IConfiguration m_Configuration;
21-
private readonly IBroadcastManager m_BroadcastManager;
2219
private readonly IUnturnedLocationDirectory m_UnturnedLocationDirectory;
20+
private readonly IPlayerMessager m_PlayerMessager;
2321

24-
public PlayerDeathEvent(IUnturnedUserDirectory unturnedUserDirectory, IUserManager userManager,
25-
IStringLocalizer stringLocalizer, IConfiguration configuration, IBroadcastManager broadcastManager,
26-
IUnturnedLocationDirectory unturnedLocationDirectory)
22+
public UnturnedPlayerDeathEventListener(IUnturnedUserDirectory unturnedUserDirectory,
23+
IStringLocalizer stringLocalizer, IConfiguration configuration,
24+
IUnturnedLocationDirectory unturnedLocationDirectory, IPlayerMessager playerMessager)
2725
{
2826
m_UnturnedUserDirectory = unturnedUserDirectory;
29-
m_UserManager = userManager;
3027
m_StringLocalizer = stringLocalizer;
3128
m_Configuration = configuration;
32-
m_BroadcastManager = broadcastManager;
3329
m_UnturnedLocationDirectory = unturnedLocationDirectory;
30+
m_PlayerMessager = playerMessager;
3431
}
3532

3633
public async Task HandleEventAsync(object? sender, UnturnedPlayerDeathEvent @event)
@@ -65,7 +62,8 @@ public async Task HandleEventAsync(object? sender, UnturnedPlayerDeathEvent @eve
6562
return;
6663
}
6764

68-
await m_BroadcastManager.BroadcastAsync(message, m_Configuration["iconUrl"], ColorTranslator.FromHtml(m_Configuration["color"]));
65+
await m_PlayerMessager.SendMessageGlobalOrGroupAsync(victimUser.Player, message,
66+
m_Configuration["iconUrl"], ColorTranslator.FromHtml(m_Configuration["color"]));
6967
}
7068
}
7169
}

OpenDeathMessages/EvolutionPlugins.OpenDeathMessages.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@
2424

2525
<ItemGroup>
2626
<PackageReference Include="EvolutionPlugins.Universal.Extras.Unturned" Version="1.0.1" />
27-
<PackageReference Include="OpenMod.Unturned" Version="3.1.3" />
27+
<PackageReference Include="OpenMod.Unturned" Version="3.3.4" />
2828
<PackageReference Include="Legacy2CPSWorkaround" Version="1.0.0">
2929
<PrivateAssets>All</PrivateAssets>
3030
</PackageReference>
31-
<PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies.net461" Version="1.0.2">
31+
<PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies.net461" Version="1.0.3">
3232
<PrivateAssets>all</PrivateAssets>
3333
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
3434
</PackageReference>

OpenDeathMessages/ServiceConfigurator.cs

Lines changed: 0 additions & 15 deletions
This file was deleted.
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
using Cysharp.Threading.Tasks;
2+
using EvolutionPlugins.OpenDeathMessages.API;
3+
using Microsoft.Extensions.Configuration;
4+
using OpenMod.API.Ioc;
5+
using OpenMod.UnityEngine.Extensions;
6+
using OpenMod.Unturned.Players;
7+
using SDG.Unturned;
8+
using Steamworks;
9+
using System.Collections.Generic;
10+
using System.Drawing;
11+
using System.Linq;
12+
using System.Threading.Tasks;
13+
14+
namespace EvolutionPlugins.OpenDeathMessages.Services
15+
{
16+
[PluginServiceImplementation]
17+
public class PlayerMessager : IPlayerMessager
18+
{
19+
private readonly DisplayType m_DisplayType;
20+
private readonly HashSet<CSteamID> m_GroupOnlyMessagger = new();
21+
22+
public PlayerMessager(IConfiguration configuration)
23+
{
24+
m_DisplayType = (DisplayType)(configuration.GetValue("defaultDisplay:groupDeath", false) ? 1 : 0);
25+
}
26+
27+
private bool ShouldMessageToGroup(UnturnedPlayer player) => m_GroupOnlyMessagger.Contains(player.SteamId) || m_DisplayType is DisplayType.Group;
28+
29+
public Task ChangeDisplayTypeAsync(UnturnedPlayer player, DisplayType displayType)
30+
{
31+
if (displayType is DisplayType.Group)
32+
{
33+
m_GroupOnlyMessagger.Add(player.SteamId);
34+
return Task.CompletedTask;
35+
}
36+
37+
m_GroupOnlyMessagger.Remove(player.SteamId);
38+
return Task.CompletedTask;
39+
}
40+
41+
public async Task SendMessageGlobalOrGroupAsync(UnturnedPlayer player, string message, string? iconUrl, Color color)
42+
{
43+
var unityColor = color.ToUnityColor();
44+
await UniTask.SwitchToMainThread();
45+
46+
if (ShouldMessageToGroup(player))
47+
{
48+
foreach (var teammate in Provider.clients
49+
.Where(x => !x.player.quests.isMemberOfAGroup || x.player.quests.isMemberOfSameGroupAs(player.Player)))
50+
{
51+
ChatManager.serverSendMessage(message, unityColor, toPlayer: teammate, iconURL: iconUrl, useRichTextFormatting: true);
52+
}
53+
54+
return;
55+
}
56+
57+
ChatManager.serverSendMessage(message, unityColor, iconURL: iconUrl, mode: EChatMode.GLOBAL, useRichTextFormatting: true);
58+
}
59+
}
60+
}

OpenDeathMessages/config.yaml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
11
iconUrl: "https://i.imgur.com/Ld1qy8j.png"
22
# it can support hex color (#FFFFFF)
3-
color: "white"
3+
color: "white"
4+
5+
defaultDisplay:
6+
# If enabled then players will only see death messages from teammates.
7+
# If player is not in group then all death messages will be received.
8+
groupDeath: false

OpenDeathMessages/translations.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,3 +62,8 @@ deathCause:
6262
burner: "{Victim.DisplayName} was burned by a zombie"
6363
spit: "{Victim.DisplayName} was dissolved by a zombie"
6464
spark: "{Victim.DisplayName} was electrocuted by a zombie"
65+
66+
commands:
67+
deathMessageDisplay:
68+
group: "Successfully set death messages display to GROUP"
69+
global: "Successfully set death messsage display to GLOBAL"

0 commit comments

Comments
 (0)