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.
133 lines
4.5 KiB
133 lines
4.5 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; |
|
|
|
var private bool foundErrors; |
|
var private MutableText newName; |
|
|
|
var private ACommandNick_Announcer announcer; |
|
|
|
protected function Finalizer() |
|
{ |
|
_.memory.Free(announcer); |
|
_.memory.Free(newName); |
|
newName = none; |
|
super.Finalizer(); |
|
} |
|
|
|
protected function BuildData(CommandDataBuilder builder) |
|
{ |
|
builder.Group(P("gameplay")); |
|
builder.Summary(P("Changes nickname.")); |
|
builder.RequireTarget(); |
|
builder.ParamRemainder(P("nick")); |
|
builder.Describe(P("Changes nickname of targeted players to <nick>.")); |
|
builder.Option(P("plain")); |
|
builder.Describe(P("Take nickname exactly as typed, without attempting to" |
|
@ "treat it like formatted string.")); |
|
builder.Option(P("fix"), P("f")); |
|
builder.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")); |
|
builder.Describe(P("Color to use for the nickname. In case nickname is already" |
|
@ "colored, this flag will only affects uncolored parts.")); |
|
builder.ParamText(P("default_color")); |
|
announcer = ACommandNick_Announcer( |
|
_.memory.Allocate(class'ACommandNick_Announcer')); |
|
} |
|
|
|
protected function Executed( |
|
CallData arguments, |
|
EPlayer callerPlayer, |
|
CommandPermissions permissions |
|
) { |
|
local Text givenName; |
|
local array<FormattingErrorsReport.FormattedStringError> errors; |
|
|
|
givenName = arguments.parameters.GetText(P("nick")); |
|
// `newName`'s reference persists between different command calls and |
|
// only deallocated when we need this variable for the next execution. |
|
// "Leaking" a single `Text` like that is insignificant. |
|
_.memory.Free(newName); |
|
newName = _.text.Empty(); |
|
if (arguments.options.HasKey(P("plain"))) { |
|
newName = givenName.MutableCopy(); |
|
} |
|
else |
|
{ |
|
errors = class'FormattingStringParser'.static |
|
.ParseFormatted(givenName, newName, true); |
|
} |
|
foundErrors = false; |
|
if (arguments.options.HasKey(P("color"))) |
|
{ |
|
foundErrors = !TryChangeDefaultColor( |
|
arguments.options.GetTextBy(P("/color/default_color"))); |
|
} |
|
foundErrors = foundErrors || (errors.length > 0); |
|
class'FormattingReportTool'.static.Report(callerConsole, errors); |
|
class'FormattingReportTool'.static.FreeErrors(errors); |
|
} |
|
|
|
protected function ExecutedFor( |
|
EPlayer target, |
|
CallData arguments, |
|
EPlayer instigator, |
|
CommandPermissions permissions |
|
) { |
|
local Text alteredVersion; |
|
|
|
if (!foundErrors || arguments.options.HasKey(P("fix"))) |
|
{ |
|
announcer.Setup(target, instigator, othersConsole); |
|
target.SetName(newName); |
|
alteredVersion = target.GetName(); |
|
if (newName.Compare(alteredVersion, SCASE_SENSITIVE, SFORM_SENSITIVE)) { |
|
announcer.AnnounceChangedNickname(newName); |
|
} |
|
else { |
|
announcer.AnnounceChangedAlteredNickname(newName, alteredVersion); |
|
} |
|
_.memory.Free(alteredVersion); |
|
} |
|
} |
|
|
|
protected function bool TryChangeDefaultColor(BaseText specifiedColor) |
|
{ |
|
local Color defaultColor; |
|
|
|
if (newName == none) return false; |
|
if (specifiedColor == none) return false; |
|
|
|
if (_.color.Parse(specifiedColor, defaultColor)) |
|
{ |
|
newName.ChangeDefaultColor(defaultColor); |
|
return true; |
|
} |
|
callerConsole |
|
.Write(F("Specified {$TextFailure invalid} color: ")) |
|
.WriteLine(specifiedColor); |
|
return false; |
|
} |
|
|
|
defaultproperties { |
|
preferredName = "nick" |
|
} |