From 4009932fb20bc06c3f891a2498f749f6c2a9eefb Mon Sep 17 00:00:00 2001 From: HitPanda <104197232+EnefFlow@users.noreply.github.com> Date: Wed, 27 Sep 2023 06:59:45 +0300 Subject: [PATCH] [Tweak] Ghost respawn check upgrade (#441) * [Tweak] Ghost respawn check upgrade * fix --- .../GameTicking/GameTicker.Spawning.cs | 80 +++++++++++++++++-- Resources/Locale/ru-RU/ghost/ghost-gui.ftl | 5 ++ 2 files changed, 77 insertions(+), 8 deletions(-) diff --git a/Content.Server/GameTicking/GameTicker.Spawning.cs b/Content.Server/GameTicking/GameTicker.Spawning.cs index 1eb0ee7d50..86de5844df 100644 --- a/Content.Server/GameTicking/GameTicker.Spawning.cs +++ b/Content.Server/GameTicking/GameTicker.Spawning.cs @@ -164,21 +164,64 @@ namespace Content.Server.GameTicking //WD start //Ghost system return to round, check for whether the character isn't the same. - if (lateJoin) + if (lateJoin && !_adminManager.IsAdmin(player)) { + var sameChar = false; + var checkAvoid = false; + var allPlayerMinds = EntityQuery() .Where(mind => mind.OriginalOwnerUserId == player.UserId); foreach (var mind in allPlayerMinds) { - if (mind.CharacterName == character.Name && !_adminManager.IsAdmin(player)) + if (mind.CharacterName == character.Name) { - var message = Loc.GetString("ghost-respawn-same-character"); - var wrappedMessage = Loc.GetString("chat-manager-server-wrap-message", ("message", message)); - _chatManager.ChatMessageToOne(ChatChannel.Server, message, wrappedMessage, - default, false, player.ConnectedClient, Color.Red); - - return; + sameChar = true; + break; } + + if (mind.ClownName == character.ClownName + && mind.BorgName == character.BorgName + && mind.MimeName == character.MimeName) + { + sameChar = true; + break; + } + + if (mind.CharacterName != null) + { + var similarity = CalculateStringSimilarity(mind.CharacterName, character.Name); + + switch (similarity) + { + case >= 85f: + { + _chatManager.SendAdminAlert(Loc.GetString("ghost-respawn-character-almost-same", + ("player", player.Name), ("try", false), ("oldName", mind.CharacterName), ("newName", character.Name))); + checkAvoid = true; + sameChar = true; + break; + } + case >= 50f: + { + _chatManager.SendAdminAlert(Loc.GetString("ghost-respawn-character-almost-same", + ("player", player.Name), ("try", true), ("oldName", mind.CharacterName), + ("newName", character.Name))); + break; + } + } + } + } + + if (sameChar) + { + var message = checkAvoid + ? Loc.GetString("ghost-respawn-same-character-slightly-changed-name") + : Loc.GetString("ghost-respawn-same-character"); + var wrappedMessage = Loc.GetString("chat-manager-server-wrap-message", ("message", message)); + _chatManager.ChatMessageToOne(ChatChannel.Server, message, wrappedMessage, + default, false, player.ConnectedClient, Color.Red); + + return; } } //WD end @@ -323,6 +366,27 @@ namespace Content.Server.GameTicking RaiseLocalEvent(mob, aev, true); } + //WD start - Need this to check player not respawning with the slightly changed name in the same round. + private float CalculateStringSimilarity(string str1, string str2) + { + var minLength = Math.Min(str1.Length, str2.Length); + var matchingCharacters = 0; + + for (var i = 0; i < minLength; i++) + { + if (str1[i] == str2[i]) + { + matchingCharacters++; + } + } + + float maxLength = Math.Max(str1.Length, str2.Length); + var similarityPercentage = (matchingCharacters / maxLength) * 100; + + return similarityPercentage; + } + //WD end + private HumanoidCharacterProfile ReplaceBlacklistedSpecies(ICommonSession player, HumanoidCharacterProfile character, JobPrototype jobPrototype) { var whitelistedSpecies = jobPrototype.WhitelistedSpecies; diff --git a/Resources/Locale/ru-RU/ghost/ghost-gui.ftl b/Resources/Locale/ru-RU/ghost/ghost-gui.ftl index 56d2259eba..5d5596b460 100644 --- a/Resources/Locale/ru-RU/ghost/ghost-gui.ftl +++ b/Resources/Locale/ru-RU/ghost/ghost-gui.ftl @@ -29,3 +29,8 @@ ghost-respawn-window-request-button = Принять ghost-respawn-window-rules-footer = Пользуясь это функцией, вы [color=#ff7700]обязуетесь[/color] [color=#ff0000]не переносить[/color] знания своего прошлого персонажа в нового, [color=#ff0000]не метамстить[/color]. Каждый новый персонаж - [color=#ff7700]чистый уникальный лист[/color], который никак не связан с предыдущим. Поэтому не забудьте [color=#ff7700]поменять персонажа[/color] перед заходом, а также помните, что за нарушение пункта, указанного здесь, следует [color=#ff0000]бан в размере от 3ех дней[/color]. ghost-respawn-bug = Нет времени смерти. Установлено стандартное значение. ghost-respawn-same-character = Нельзя заходить в раунд за того же персонажа. Поменяйте его в настройках персонажей. +ghost-respawn-character-almost-same = Игрок { $player } { $try -> + [true] зашёл + *[false] попытался зайти +} в раунд после респауна с похожим именем. Прошлое имя: { $oldName }, текущее: { $newName }. +ghost-respawn-same-character-slightly-changed-name = Попытка обойти запрет входа в раунд тем же персонажем. Ваши действия будут переданы администрации!