You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
138 lines
4.7 KiB
138 lines
4.7 KiB
/** |
|
* Command for changing nickname of the player. |
|
* Copyright 2021-2022 Anton Tarasenko |
|
*------------------------------------------------------------------------------ |
|
* This file is part of Acedia. |
|
* |
|
* Acedia is free software: you can redistribute it and/or modify |
|
* it under the terms of the GNU General Public License as published by |
|
* the Free Software Foundation, version 3 of the License, or |
|
* (at your option) any later version. |
|
* |
|
* Acedia is distributed in the hope that it will be useful, |
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
* GNU General Public License for more details. |
|
* |
|
* You should have received a copy of the GNU General Public License |
|
* along with Acedia. If not, see <https://www.gnu.org/licenses/>. |
|
*/ |
|
class ACommandNick extends Command; |
|
|
|
protected function BuildData(CommandDataBuilder builder) |
|
{ |
|
builder.Name(P("nick")).Summary(P("Changes nickname.")); |
|
builder.RequireTarget(); |
|
builder.ParamText(P("nick")) |
|
.Describe(P("Changes nickname of targeted players to <nick>.")); |
|
builder.Option(P("plain")) |
|
.Describe(P("Take nickname exactly as typed, without attempting to" |
|
@ "treat it like formatted string.")); |
|
builder.Option(P("fix"), P("F")) |
|
.Describe(P("In case of a nickname with erroroneous formatting or" |
|
@ "invalid default color (specified with `--color`)," |
|
@ "try to fix/ignore it instead of simply rejecting it.")); |
|
builder.Option(P("color")) |
|
.Describe(P("Color to use for the nickname. In case nickname is already" |
|
@ "colored, this flag will only affects uncolored parts.")) |
|
.ParamText(P("default_color")); |
|
} |
|
|
|
protected function ExecutedFor( |
|
EPlayer player, |
|
CallData result, |
|
EPlayer callerPlayer) |
|
{ |
|
local bool foundErrors, selfChange; |
|
local Text givenName, oldName, callerName; |
|
local MutableText newName; |
|
local array<FormattingErrorsReport.FormattedStringError> errors; |
|
oldName = player.GetName(); |
|
givenName = result.parameters.GetText(P("nick")); |
|
callerName = callerPlayer.GetName(); |
|
selfChange = callerPlayer.SameAs(player); |
|
if (result.options.HasKey(P("plain"))) |
|
{ |
|
player.SetName(givenName); |
|
AnnounceNicknameChange(callerName, oldName, givenName, selfChange); |
|
_.memory.Free(oldName); |
|
_.memory.Free(callerName); |
|
return; |
|
} |
|
newName = _.text.Empty(); |
|
errors = class'FormattingStringParser'.static |
|
.ParseFormatted(givenName, newName, true); |
|
if (result.options.HasKey(P("color"))) |
|
{ |
|
foundErrors = !TryChangeDefaultColor( |
|
newName, result.options.GetTextBy(P("/color/default_color"))); |
|
} |
|
foundErrors = foundErrors || (errors.length > 0); |
|
if (!foundErrors || result.options.HasKey(P("fix"))) |
|
{ |
|
player.SetName(newName); |
|
AnnounceNicknameChange(callerName, oldName, newName, selfChange); |
|
} |
|
class'FormattingReportTool'.static.Report(callerConsole, errors); |
|
class'FormattingReportTool'.static.FreeErrors(errors); |
|
_.memory.Free(newName); |
|
_.memory.Free(oldName); |
|
_.memory.Free(callerName); |
|
} |
|
|
|
protected function bool TryChangeDefaultColor( |
|
MutableText newName, |
|
Text specifiedColor) |
|
{ |
|
local Color defaultColor; |
|
if (newName == none) return false; |
|
if (specifiedColor == none) return false; |
|
|
|
if (_.color.Parse(specifiedColor, defaultColor)) |
|
{ |
|
newName.ChangeDefaultFormatting( |
|
_.text.FormattingFromColor(defaultColor)); |
|
return true; |
|
} |
|
callerConsole |
|
.Write(F("Specified {$TextFailure invalid} color: ")) |
|
.WriteLine(specifiedColor); |
|
return false; |
|
} |
|
|
|
protected function AnnounceNicknameChange( |
|
Text callerName, |
|
Text oldName, |
|
Text newName, |
|
bool selfChange) |
|
{ |
|
if (selfChange) |
|
{ |
|
callerConsole |
|
.Write(F("Your nickname was {$TextPositive changed} to ")) |
|
.WriteLine(newName); |
|
othersConsole |
|
.Write(callerName) |
|
.Write(F(" {$TextEmphasis changed} thier own nickname to ")) |
|
.WriteLine(newName); |
|
return; |
|
} |
|
callerConsole |
|
.Write(P("Nickname for player ")).Write(oldName) |
|
.Write(F(" was {$TextPositive changed} to ")).WriteLine(newName); |
|
targetConsole |
|
.Write(F("Your nickname was {$TextEmphasis changed} to ")) |
|
.Write(newName) |
|
.Write(P(" by ")) |
|
.WriteLine(callerName); |
|
othersConsole |
|
.Write(callerName) |
|
.Write(F(" {$TextEmphasis changed} nickname for player ")) |
|
.Write(oldName) |
|
.Write(P(" to ")) |
|
.WriteLine(newName); |
|
} |
|
|
|
defaultproperties |
|
{ |
|
} |