From ede52f4176a31dcdce8110d0724d625264c6473d Mon Sep 17 00:00:00 2001 From: Acentech Dev Date: Sun, 9 Aug 2026 02:23:02 +0300 Subject: [PATCH] feat(tvt): rename the Lorencia event NPC to "TvT Guard" The NPC (560) that opens the TvT registration stands in Lorencia and was seeded as "TvT Event Gorevlisi". Renaming the seed only helps fresh databases, so update 106 renames it on existing ones too - that name is what the admin panel lists. The name players see over its head comes from the client's own table (Data\Local\\Npcname().txt), not from this designation, and is changed there separately. Co-Authored-By: Claude Opus 5 (1M context) --- .../AddHeykelSavasiEventUpdateSeason6.cs | 2 +- .../Updates/RenameTvTEventNpcUpdatePlugIn.cs | 62 +++++++++++++++++++ .../Initialization/Updates/UpdateVersion.cs | 5 ++ .../VersionSeasonSix/NpcInitialization.cs | 2 +- 4 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 src/Persistence/Initialization/Updates/RenameTvTEventNpcUpdatePlugIn.cs diff --git a/src/Persistence/Initialization/Updates/AddHeykelSavasiEventUpdateSeason6.cs b/src/Persistence/Initialization/Updates/AddHeykelSavasiEventUpdateSeason6.cs index 9309f38..371fe8a 100644 --- a/src/Persistence/Initialization/Updates/AddHeykelSavasiEventUpdateSeason6.cs +++ b/src/Persistence/Initialization/Updates/AddHeykelSavasiEventUpdateSeason6.cs @@ -99,7 +99,7 @@ public class AddHeykelSavasiEventUpdateSeason6 : UpdatePlugInBase var npc = context.CreateNew(); gameConfiguration.Monsters.Add(npc); npc.Number = 560; - npc.Designation = "TvT Event Gorevlisi"; + npc.Designation = "TvT Guard"; npc.NpcWindow = NpcWindow.Undefined; npc.ObjectKind = NpcObjectKind.PassiveNpc; npc.SetGuid(npc.Number); diff --git a/src/Persistence/Initialization/Updates/RenameTvTEventNpcUpdatePlugIn.cs b/src/Persistence/Initialization/Updates/RenameTvTEventNpcUpdatePlugIn.cs new file mode 100644 index 0000000..0e8c428 --- /dev/null +++ b/src/Persistence/Initialization/Updates/RenameTvTEventNpcUpdatePlugIn.cs @@ -0,0 +1,62 @@ +// +// Licensed under the MIT License. See LICENSE file in the project root for full license information. +// + +namespace MUnique.OpenMU.Persistence.Initialization.Updates; + +using System.Runtime.InteropServices; +using MUnique.OpenMU.DataModel.Configuration; +using MUnique.OpenMU.PlugIns; + +/// +/// Renames the TvT event NPC (560) which stands in Lorencia. The name is what players see over its +/// head and what the admin panel lists, so it has to change on existing databases too - the seed +/// only covers new ones. +/// +[PlugIn] +[Display(Name = PlugInName, Description = PlugInDescription)] +[Guid("7B1C5E42-9A08-4D6E-9F31-2C4A5D6E7F80")] +public class RenameTvTEventNpcUpdatePlugIn : UpdatePlugInBase +{ + /// + /// The plug-in name. + /// + internal const string PlugInName = "Rename the TvT event NPC"; + + /// + /// The plug-in description. + /// + internal const string PlugInDescription = "This update renames the TvT event NPC (560) in Lorencia to 'TvT Guard'."; + + /// The monster number of the TvT event NPC in Lorencia. + private const short TvTEventNpcNumber = 560; + + /// + public override string Name => PlugInName; + + /// + public override string Description => PlugInDescription; + + /// + public override UpdateVersion Version => UpdateVersion.RenameTvTEventNpc; + + /// + public override string DataInitializationKey => VersionSeasonSix.DataInitialization.Id; + + /// + public override bool IsMandatory => false; + + /// + public override DateTime CreatedAt => new(2026, 08, 09, 0, 0, 0, DateTimeKind.Utc); + + /// + protected override ValueTask ApplyAsync(IContext context, GameConfiguration gameConfiguration) + { + if (gameConfiguration.Monsters.FirstOrDefault(m => m.Number == TvTEventNpcNumber) is { } npc) + { + npc.Designation = "TvT Guard"; + } + + return ValueTask.CompletedTask; + } +} diff --git a/src/Persistence/Initialization/Updates/UpdateVersion.cs b/src/Persistence/Initialization/Updates/UpdateVersion.cs index 83d2c5c..c2172fb 100644 --- a/src/Persistence/Initialization/Updates/UpdateVersion.cs +++ b/src/Persistence/Initialization/Updates/UpdateVersion.cs @@ -539,4 +539,9 @@ public enum UpdateVersion /// bookkeeping is keyed on this value, so a collision would skip or re-run updates on live databases. /// AddCastleSiegeData = 105, + + /// + /// The version of the . + /// + RenameTvTEventNpc = 106, } diff --git a/src/Persistence/Initialization/VersionSeasonSix/NpcInitialization.cs b/src/Persistence/Initialization/VersionSeasonSix/NpcInitialization.cs index 7ec1a5d..2d855f4 100644 --- a/src/Persistence/Initialization/VersionSeasonSix/NpcInitialization.cs +++ b/src/Persistence/Initialization/VersionSeasonSix/NpcInitialization.cs @@ -816,7 +816,7 @@ internal partial class NpcInitialization : Version095d.NpcInitialization { var def = this.Context.CreateNew(); def.Number = 560; - def.Designation = "TvT Event Gorevlisi"; + def.Designation = "TvT Guard"; def.NpcWindow = NpcWindow.Undefined; // routed via IPlayerTalkToNpcPlugIn in a later task def.ObjectKind = NpcObjectKind.PassiveNpc; this.GameConfiguration.Monsters.Add(def);