[Tweak] Ghost respawn check upgrade (#441)

* [Tweak] Ghost respawn check upgrade

* fix
This commit is contained in:
HitPanda
2023-09-27 06:59:45 +03:00
committed by Aviu00
parent 3854704b3e
commit 4009932fb2
2 changed files with 77 additions and 8 deletions

View File

@@ -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<MindComponent>()
.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;

View File

@@ -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 = Попытка обойти запрет входа в раунд тем же персонажем. Ваши действия будут переданы администрации!