Skip to content
This repository has been archived by the owner on Sep 1, 2024. It is now read-only.

Commit

Permalink
Pre-Release (v4.0.0)
Browse files Browse the repository at this point in the history
  • Loading branch information
K4ryuu committed Mar 24, 2024
1 parent 610509c commit 65c8fca
Show file tree
Hide file tree
Showing 18 changed files with 289 additions and 66 deletions.
19 changes: 19 additions & 0 deletions CHANGELOG
Original file line number Diff line number Diff line change
@@ -1,3 +1,22 @@
-- 2023.03.24 - V4.0.0

- feat: Scoreboard premier point support
- feat: Auto delete inactive player data from db (day based settings)
- feat: Scoreboard mm rank support
- feat: Scoreboard country clantag addon
- feat: Player mute point messages for themselves (!togglepointmsg)
- feat: Possibility to hide permission based tags (!toggletag)
- fix: Possibly fix player count based bug
- fix: MySQL crash problem by @daffyy

-- 2023.03.08 - V3.3.10

- fix: RoundEndPoints duplicated print amount (visual bug)
- fix: Possible fix for the log about Entity is not valid (bug since last week)
- fix: Possible fix for time not saved properly
- fix: Not enough players print bug
- fix: Scoreboard rank not getting synced instantly

-- 2023.02.13 - V3.3.9

- refactor: Disable MySQL pooling limitations
Expand Down
1 change: 1 addition & 0 deletions src/K4-System.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
<ExcludeAssets>runtime</ExcludeAssets>
<IncludeAssets>compile; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="MaxMind.GeoIP2" Version="5.2.0" />
<PackageReference Include="MySqlConnector" Version="*" />
<PackageReference Include="Newtonsoft.Json" Version="*" />
</ItemGroup>
Expand Down
43 changes: 43 additions & 0 deletions src/Module/Rank/RankCommands.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,49 @@ public void Initialize_Commands(Plugin plugin)
plugin.AddCommand("css_setpoints", "SEt the targeted player's points", plugin.CallbackAnonymizer(OnCommandSetPoints));
plugin.AddCommand("css_givepoints", "Give points the targeted player", plugin.CallbackAnonymizer(OnCommandGivePoints));
plugin.AddCommand("css_removepoints", "Remove points from the targeted player", plugin.CallbackAnonymizer(OnCommandRemovePoints));
plugin.AddCommand("css_toggletag", "Toggles the tag assigned by permissions", plugin.CallbackAnonymizer(OnCommandToggleTag));
plugin.AddCommand("css_togglepointmsg", "Toggles the chat messages of points modifications", plugin.CallbackAnonymizer(OnCommandTogglePointMessages));
}

public void OnCommandTogglePointMessages(CCSPlayerController? player, CommandInfo info)
{
Plugin plugin = (this.PluginContext.Plugin as Plugin)!;

if (!plugin.CommandHelper(player, info, CommandUsage.CLIENT_ONLY))
return;

RankData? playerData = PlayerCache.Instance.GetPlayerData(player!).rankData;

if (playerData is null)
return;

playerData.MuteMessages = !playerData.MuteMessages;
info.ReplyToCommand($" {plugin.Localizer["k4.general.prefix"]} {plugin.Localizer["k4.general.togglepointmsg", playerData.MuteMessages ? plugin.Localizer["k4.general.state.disabled"] : plugin.Localizer["k4.general.state.enabled"]]}");
}

public void OnCommandToggleTag(CCSPlayerController? player, CommandInfo info)
{
Plugin plugin = (this.PluginContext.Plugin as Plugin)!;

if (!plugin.CommandHelper(player, info, CommandUsage.CLIENT_ONLY))
return;

RankData? playerData = PlayerCache.Instance.GetPlayerData(player!).rankData;

if (playerData is null)
return;

playerData.HideAdminTag = !playerData.HideAdminTag;

string tag = string.Empty;
if (Config.RankSettings.ScoreboardClantags)
{
tag = playerData.Rank.Tag ?? $"[{playerData.Rank.Name}]";
}

SetPlayerClanTag(player!, playerData, tag);

info.ReplyToCommand($" {plugin.Localizer["k4.general.prefix"]} {plugin.Localizer["k4.general.toggletag", playerData.HideAdminTag ? plugin.Localizer["k4.general.state.disabled"] : plugin.Localizer["k4.general.state.enabled"]]}");
}

public void OnCommandRank(CCSPlayerController? player, CommandInfo info)
Expand Down
48 changes: 42 additions & 6 deletions src/Module/Rank/RankEvents.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,37 @@ namespace K4System
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Admin;
using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Utils;

public partial class ModuleRank : IModuleRank
{
public void Initialize_Events(Plugin plugin)
{
VirtualFunctions.CCSPlayerPawnBase_PostThinkFunc.Hook(_ =>
{
if (Config.RankSettings.ScoreboardRanks == 0)
return HookResult.Continue;
Utilities.GetPlayers().Where(p => p?.IsValid == true && p.PlayerPawn?.IsValid == true && !p.IsBot && !p.IsHLTV && p.SteamID.ToString().Length == 17)
.ToList()
.ForEach(p =>
{
if (!PlayerCache.Instance.ContainsPlayer(p))
return;
RankData? rankData = PlayerCache.Instance.GetPlayerData(p).rankData;
if (rankData is null)
return;
p.CompetitiveRankType = (sbyte)(Config.RankSettings.ScoreboardRanks == 1 ? 11 : 12);
p.CompetitiveRanking = Config.RankSettings.ScoreboardRanks == 1 ? rankData.Points : rankData.Rank.Id + 1 >= 19 ? 18 : rankData.Rank.Id + 1;
});
return HookResult.Continue;
}, HookMode.Post);

plugin.RegisterEventHandler((EventPlayerTeam @event, GameEventInfo info) =>
{
CCSPlayerController player = @event.Userid;
Expand All @@ -35,6 +60,12 @@ public void Initialize_Events(Plugin plugin)
rankData.PlayedRound = false;
}
if (Config.RankSettings.ScoreboardClantags)
{
string tag = rankData.Rank.Tag ?? $"[{rankData.Rank.Name}]";
SetPlayerClanTag(player, rankData, tag);
}
return HookResult.Continue;
});

Expand All @@ -48,15 +79,15 @@ public void Initialize_Events(Plugin plugin)
if (!PlayerCache.Instance.ContainsPlayer(player))
return HookResult.Continue;
if (Config.RankSettings.ScoreboardRanks)
if (Config.RankSettings.ScoreboardClantags)
{
RankData? rankData = PlayerCache.Instance.GetPlayerData(player).rankData;
if (rankData is null)
return HookResult.Continue;
string tag = rankData.Rank.Tag ?? $"[{rankData.Rank.Name}]";
SetPlayerClanTag(player, tag);
SetPlayerClanTag(player, rankData, tag);
}
return HookResult.Continue;
Expand Down Expand Up @@ -94,6 +125,11 @@ public void Initialize_Events(Plugin plugin)
{
CCSPlayerController player = @event.Userid;
ModifyPlayerPoints(player, Config.PointSettings.BombDefused, "k4.phrases.bombdefused");
Utilities.GetPlayers().Where(p => p.TeamNum == (int)CsTeam.CounterTerrorist && p.Slot != player.Slot)
.ToList()
.ForEach(p => ModifyPlayerPoints(p, Config.PointSettings.BombDefusedOthers, "k4.phrases.bombdefused"));
return HookResult.Continue;
});

Expand Down Expand Up @@ -131,9 +167,9 @@ public void Initialize_Events(Plugin plugin)

plugin.RegisterEventHandler((EventRoundStart @event, GameEventInfo info) =>
{
List<CCSPlayerController> players = Utilities.GetPlayers();
List<CCSPlayerController> players = Utilities.GetPlayers().Where(p => p?.IsValid == true && p.PlayerPawn?.IsValid == true && !p.IsBot && !p.IsHLTV && p.SteamID.ToString().Length == 17).ToList();
players.Where(p => p?.IsValid == true && p.PlayerPawn?.IsValid == true && !p.IsBot && !p.IsHLTV && p.PawnIsAlive && p.SteamID.ToString().Length == 17 && PlayerCache.Instance.ContainsPlayer(p))
players.Where(p => p.PawnIsAlive && PlayerCache.Instance.ContainsPlayer(p))
.ToList()
.ForEach(p =>
{
Expand All @@ -148,7 +184,7 @@ public void Initialize_Events(Plugin plugin)
Server.PrintToChatAll($" {plugin.Localizer["k4.general.prefix"]} {plugin.Localizer["k4.ranks.notenoughplayers", Config.RankSettings.MinPlayers]}");
return HookResult.Continue;
});
}, HookMode.Post);

plugin.RegisterEventHandler((EventBombPlanted @event, GameEventInfo info) =>
{
Expand Down Expand Up @@ -186,7 +222,7 @@ public void Initialize_Events(Plugin plugin)
}
}
if (killer != null && killer.IsValid && killer.PlayerPawn.IsValid && !killer.IsBot && victim.UserId != killer.UserId && (Config.RankSettings.PointsForBots || !victim.IsBot))
if (killer?.IsValid == true && killer.PlayerPawn?.IsValid == true && !killer.IsBot && victim.UserId != killer.UserId && (Config.RankSettings.PointsForBots || !victim.IsBot))
{
if (!Config.GeneralSettings.FFAMode && killer.TeamNum == victim.TeamNum)
{
Expand Down
69 changes: 44 additions & 25 deletions src/Module/Rank/RankFunctions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public bool IsPointsAllowed()
if (plugin.GameRules == null)
return false;

int notBots = Utilities.GetPlayers().Count(p => !p.IsBot && p.SteamID.ToString().Length == 17);
int notBots = Utilities.GetPlayers().Count(p => p?.IsValid == true && p.PlayerPawn?.IsValid == true && !p.IsBot && !p.IsHLTV && p.SteamID.ToString().Length == 17 && p.Connected == PlayerConnectedState.PlayerConnected);

return (!plugin.GameRules.WarmupPeriod || Config.RankSettings.WarmupPoints) && (Config.RankSettings.MinPlayers <= notBots);
}
Expand Down Expand Up @@ -59,7 +59,7 @@ public void BeforeRoundEnd(int winnerTeam)

Plugin plugin = (this.PluginContext.Plugin as Plugin)!;

if (Config.RankSettings.RoundEndPoints)
if (!playerData.MuteMessages && Config.RankSettings.RoundEndPoints)
{
if (playerData.RoundPoints > 0)
{
Expand All @@ -72,6 +72,8 @@ public void BeforeRoundEnd(int winnerTeam)
else
player.PrintToChat($" {plugin.Localizer["k4.general.prefix"]} {plugin.Localizer["k4.ranks.summarypoints.nochange"]}");
}

playerData.RoundPoints = 0;
}
}

Expand Down Expand Up @@ -116,9 +118,18 @@ public void ModifyPlayerPoints(CCSPlayerController player, int amount, string re
}

int oldPoints = playerData.Points;
Server.NextFrame(() =>
Server.NextWorldUpdate(() =>
{
if (!Config.RankSettings.RoundEndPoints || plugin.GameRules == null || plugin.GameRules.WarmupPeriod)
if (player is null || !player.IsValid || !player.PlayerPawn.IsValid)
return;
if (player.IsBot || player.IsHLTV)
return;
if (player.SteamID.ToString().Length != 17)
return;
if (!playerData.MuteMessages && (!Config.RankSettings.RoundEndPoints || plugin.GameRules == null || plugin.GameRules.WarmupPeriod))
{
if (amount > 0)
{
Expand Down Expand Up @@ -146,7 +157,6 @@ public void ModifyPlayerPoints(CCSPlayerController player, int amount, string re
});

playerData.Points += amount;
playerData.RoundPoints += amount;

if (playerData.Points < 0)
playerData.Points = 0;
Expand Down Expand Up @@ -179,10 +189,10 @@ public void ModifyPlayerPoints(CCSPlayerController player, int amount, string re
playerData.Rank = newRank;
}

if (Config.RankSettings.ScoreboardRanks)
if (Config.RankSettings.ScoreboardClantags)
{
string tag = playerData.Rank.Tag ?? $"[{playerData.Rank.Name}]";
SetPlayerClanTag(player, tag);
SetPlayerClanTag(player, playerData, tag);
}
}

Expand Down Expand Up @@ -249,30 +259,39 @@ public int CalculateDynamicPoints(CCSPlayerController from, CCSPlayerController
return (int)Math.Round(result);
}

public void SetPlayerClanTag(CCSPlayerController player, string tag)
public void SetPlayerClanTag(CCSPlayerController player, RankData playerData, string tag)
{
foreach (AdminSettingsEntry adminSettings in Config.GeneralSettings.AdminSettingsList)
if (!playerData.HideAdminTag)
{
if (adminSettings.ClanTag == null)
continue;

switch (adminSettings.Permission[0])
foreach (AdminSettingsEntry adminSettings in Config.GeneralSettings.AdminSettingsList)
{
case '@':
if (AdminManager.PlayerHasPermissions(player, adminSettings.Permission))
tag = adminSettings.ClanTag;
break;
case '#':
if (AdminManager.PlayerInGroup(player, adminSettings.Permission))
tag = adminSettings.ClanTag;
break;
default:
if (AdminManager.PlayerHasCommandOverride(player, adminSettings.Permission))
tag = adminSettings.ClanTag;
break;
if (adminSettings.ClanTag == null)
continue;

switch (adminSettings.Permission[0])
{
case '@':
if (AdminManager.PlayerHasPermissions(player, adminSettings.Permission))
tag = adminSettings.ClanTag;
break;
case '#':
if (AdminManager.PlayerInGroup(player, adminSettings.Permission))
tag = adminSettings.ClanTag;
break;
default:
if (AdminManager.PlayerHasCommandOverride(player, adminSettings.Permission))
tag = adminSettings.ClanTag;
break;
}
}
}

if (Config.RankSettings.CountryTagEnabled)
{
Plugin plugin = (this.PluginContext.Plugin as Plugin)!;
tag = $"{plugin.GetPlayerCountryCode(player)} | {tag}";
}

player.Clan = tag;
}
}
Expand Down
2 changes: 2 additions & 0 deletions src/Module/Rank/RankGlobals.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ public class RankData
public required Rank Rank { get; set; }
public required bool PlayedRound { get; set; }
public required int RoundPoints { get; set; }
public required bool HideAdminTag { get; set; }
public required bool MuteMessages { get; set; }
}

public readonly PluginContext PluginContext;
Expand Down
13 changes: 5 additions & 8 deletions src/Module/Stat/StatEvents.cs
Original file line number Diff line number Diff line change
Expand Up @@ -151,21 +151,18 @@ public void Initialize_Events(Plugin plugin)
return HookResult.Continue;
}
List<CCSPlayerController> players = Utilities.GetPlayers().Where(p => p?.IsValid == true && p.PlayerPawn?.IsValid == true && !p.IsBot && !p.IsHLTV && p.SteamID.ToString().Length == 17).ToList();
if (Config.GeneralSettings.FFAMode)
{
List<CCSPlayerController> players = Utilities.GetPlayers();
CCSPlayerController? player = players.OrderByDescending(p => p?.Score).FirstOrDefault();
if (player != null && player.IsValid && player.PlayerPawn.IsValid && !player.IsBot && !player.IsHLTV)
if (player != null)
{
ModifyPlayerStats(player, "game_win", 1);
}
foreach (CCSPlayerController otherPlayer in players.Where(p => p != player && p != null && p.IsValid && p.PlayerPawn.IsValid && !p.IsBot && !p.IsHLTV))
{
ModifyPlayerStats(otherPlayer, "game_lose", 1);
}
players.Where(p => p != player).ToList().ForEach(p => ModifyPlayerStats(p, "game_lose", 1));
}
else
{
Expand All @@ -183,7 +180,7 @@ public void Initialize_Events(Plugin plugin)
if ((int)winnerTeam > (int)CsTeam.Spectator)
{
Utilities.GetPlayers().Where(p => p.TeamNum > (int)CsTeam.Spectator)
players.Where(p => p.TeamNum > (int)CsTeam.Spectator)
.ToList()
.ForEach(p => ModifyPlayerStats(p, (CsTeam)p.TeamNum == winnerTeam ? "game_win" : "game_lose", 1));
}
Expand Down
7 changes: 4 additions & 3 deletions src/Module/Time/TimeCommands.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,17 +36,18 @@ public void OnCommandTime(CCSPlayerController? player, CommandInfo info)

DateTime now = DateTime.UtcNow;

playerData.TimeFields["all"] += (int)Math.Round((now - playerData.Times["Connect"]).TotalSeconds);
playerData.TimeFields[GetFieldForTeam((CsTeam)player!.TeamNum)] += (int)Math.Round((now - playerData.Times["Team"]).TotalSeconds);
playerData.TimeFields["all"] += (int)(now - playerData.Times["Connect"]).TotalSeconds;
playerData.TimeFields[GetFieldForTeam((CsTeam)player!.TeamNum)] += (int)(now - playerData.Times["Team"]).TotalSeconds;

if ((CsTeam)player.TeamNum > CsTeam.Spectator)
playerData.TimeFields[player.PawnIsAlive ? "alive" : "dead"] += (int)Math.Round((now - playerData.Times["Death"]).TotalSeconds);
playerData.TimeFields[player.PawnIsAlive ? "alive" : "dead"] += (int)(now - playerData.Times["Death"]).TotalSeconds;

info.ReplyToCommand($" {plugin.Localizer["k4.general.prefix"]} {plugin.Localizer["k4.times.title", player.PlayerName]}");
info.ReplyToCommand($" {plugin.Localizer["k4.times.line1", FormatPlaytime(playerData.TimeFields["all"])]}");
info.ReplyToCommand($" {plugin.Localizer["k4.times.line2", FormatPlaytime(playerData.TimeFields["ct"]), FormatPlaytime(playerData.TimeFields["t"])]}");
info.ReplyToCommand($" {plugin.Localizer["k4.times.line3", FormatPlaytime(playerData.TimeFields["spec"])]}");
info.ReplyToCommand($" {plugin.Localizer["k4.times.line4", FormatPlaytime(playerData.TimeFields["alive"]), FormatPlaytime(playerData.TimeFields["dead"])]}");

playerData.Times = new Dictionary<string, DateTime>
{
{ "Connect", now },
Expand Down
Loading

0 comments on commit 65c8fca

Please sign in to comment.