perf: Migrate Quest gumps to DynamicGump (#2416)

## Summary

Migrates the Quest system gumps from legacy `Gump` to `DynamicGump` / `StaticGump<T>`.

**Renames** `Engines/ML Quests/Gumps/BaseQuestGump` to **`BaseMLQuestGump`** to
disambiguate from the Core quest abstract (`Engines/Quests/Core/QuestSystem.cs`).
Both abstracts now extend `DynamicGump`.

**Abstract bases**:
- `Server.Engines.Quests.BaseQuestGump` (Core) - now `abstract DynamicGump`. Holds constants and a static `AddHtmlObject(ref DynamicGumpBuilder, ...)` helper. Concrete subclasses each provide their own `BuildLayout`.
- `Server.Engines.MLQuests.Gumps.BaseMLQuestGump` (ML, renamed) - now `abstract DynamicGump` with a `protected abstract BuildContent(ref DynamicGumpBuilder)` hook. The base's `BuildLayout` draws shared chrome (background art, frame, label header) and then invokes `BuildContent`; subclasses use `BuildPage`, `SetTitle`, `RegisterButton`, `SetPageCount`, and content helpers (`AddDescription`, `AddObjectives`, `AddObjectivesProgress`, `AddRewardsPage`, `AddRewards`, `AddConversation`).

**Concrete Core gumps** migrated to `DynamicGump`:
- `QuestCancelGump`, `QuestOfferGump` (Core), `QuestObjectivesGump`, `QuestConversationsGump`, `QuestLogUpdatedGump`, `QuestItemInfoGump`, `SheetMusicOfferGump` (Impresario), `PaintedImageGump` (renamed from `PaintedImage.InternalGump`).

**Concrete ML gumps** migrated to `DynamicGump` (extending `BaseMLQuestGump` or directly):
- `InfoNPCGump`, `QuestConversationGump`, `QuestLogDetailedGump`, `QuestLogGump`, `QuestOfferGump` (ML), `QuestReportBackGump`, `QuestRewardGump`, `QuestCancelConfirmGump`, `RaceChangeConfirmGump`.

**`StaticGump<T>` migrations**:
- `ScrollOfAbraxusGump` (Dark Tides). Its layout is a single hard-coded cliloc (1060116) with no per-instance dynamic content - safe to cache.

**Cliloc rule**: Every other quest dialog bakes per-instance cliloc IDs into its layout (quest titles, NPC names, race-specific prompts, era-conditional progress messages, escort destinations). Per the cliloc rule, baking different cliloc numbers into a cached layout would defeat `StaticGump<T>` caching - so all of these are `DynamicGump`.

**Signature changes** to support the migration:
- `QuestObjective.RenderMessage`/`RenderProgress` now take `ref DynamicGumpBuilder builder` (15 overrides updated across Collector, Solen Matriarch, Ambitious Solen Queen, Study of the Solen Hive, Terrible Hatchlings, The Summoning, Uzeraan Turmoil, Witch Apprentice, Emino's Undertaking).
- ML `BaseObjective.WriteToGump` / `BaseObjectiveInstance.WriteToGump` / `BaseReward.WriteToGump` now take `ref DynamicGumpBuilder` (KillObjective, GainSkillObjective, EscortObjective, CollectObjective, DeliverObjective, BaseReward).

**Empty-gump and `Singleton` rules**: All concrete gumps now have private constructors with static `DisplayTo` entry points that null-check the player NetState before allocation. All gumps that shouldn't stack are `Singleton => true`.

**External callers updated**: `MLQuest.SendOffer`/`OnRefuse`, `MLQuestEntry.SendProgressGump`/`SendRewardGump`/`SendReportBackGump`, `MLQuestSystem.QuestGumpRequest` and `ViewQuestsCommand`, `BoonCollector` (Darius/Nedrick), `SirHelper.OnDoubleClick` (no longer caches a single shared `InfoNPCGump` instance - `DisplayTo` constructs one per click and the gump's `Singleton => true` handles deduplication), `RaceChangeDeed.OnDoubleClick`, `PaintedImage.OnDoubleClick`, `ScrollOfAbraxus.OnDoubleClick`, `Impresario.OnTalk`, and `PlayerMobile`'s `BaseQuestGump` alias is now `BaseMLQuestGump`.

**Concrete subclasses found beyond the listed entry points**: `SheetMusicOfferGump` (in Impresario.cs), `PaintedImageGump` (was `PaintedImage.InternalGump`), `QuestObjectivesGump`, `QuestConversationsGump`, `QuestLogUpdatedGump`, `QuestItemInfoGump` (the Core base has these embedded across `QuestSystem.cs`/`QuestObjective.cs`/`QuestConversation.cs`/`QuestItemInfo.cs`).

**Code-standards cleanup**: Renamed legacy `m_X` private fields to `_x` in rewritten files; braces on all control flow.
This commit is contained in:
Kamron Batman 2026-04-25 20:23:13 -07:00 • committed by GitHub
parent ab5f615840
commit b90ac0d481
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
39 changed files with 1023 additions and 706 deletions

View file

@ -1,3 +1,4 @@
using Server.Gumps;
using Server.Items;
using Server.Mobiles;
@ -9,12 +10,12 @@ namespace Server.Engines.Quests.Ambitious
public override int MaxProgress => 5;
public override void RenderProgress(BaseQuestGump gump)
public override void RenderProgress(ref DynamicGumpBuilder builder)
{
if (!Completed)
{
// Red/Black Solen Queens killed:
gump.AddHtmlLocalized(
builder.AddHtmlLocalized(
70,
260,
270,
@ -22,13 +23,13 @@ namespace Server.Engines.Quests.Ambitious
((AmbitiousQueenQuest)System).RedSolen ? 1054064 : 1054065,
BaseQuestGump.Blue
);
gump.AddLabel(70, 280, 0x64, CurProgress.ToString());
gump.AddLabel(100, 280, 0x64, "/");
gump.AddLabel(130, 280, 0x64, MaxProgress.ToString());
builder.AddLabel(70, 280, 0x64, $"{CurProgress}");
builder.AddLabel(100, 280, 0x64, "/");
builder.AddLabel(130, 280, 0x64, $"{MaxProgress}");
}
else
{
base.RenderProgress(gump);
base.RenderProgress(ref builder);
}
}

View file

@ -40,19 +40,37 @@ public partial class PaintedImage : Item
return;
}
from.SendGump(new InternalGump(_image));
}
private class InternalGump : Gump
{
public InternalGump(ImageType image) : base(75, 25)
{
var info = ImageTypeInfo.Get(image);
AddBackground(45, 20, 100, 100, 0xA3C);
AddBackground(52, 29, 86, 82, 0xBB8);
AddItem(info.X, info.Y, info.Figurine);
}
PaintedImageGump.DisplayTo(from, _image);
}
}
public class PaintedImageGump : DynamicGump
{
private readonly ImageType _image;
public override bool Singleton => true;
private PaintedImageGump(ImageType image) : base(75, 25) => _image = image;
public static void DisplayTo(Mobile from, ImageType image)
{
if (from?.NetState == null)
{
return;
}
from.SendGump(new PaintedImageGump(image));
}
protected override void BuildLayout(ref DynamicGumpBuilder builder)
{
builder.AddPage();
var info = ImageTypeInfo.Get(_image);
builder.AddBackground(45, 20, 100, 100, 0xA3C);
builder.AddBackground(52, 29, 86, 82, 0xBB8);
builder.AddItem(info.X, info.Y, info.Figurine);
}
}

View file

@ -55,7 +55,7 @@ public partial class Impresario : BaseQuester
if (obj.IsInRightTheater())
{
player.SendGump(new SheetMusicOfferGump());
SheetMusicOfferGump.DisplayTo(player);
}
else
{
@ -69,44 +69,60 @@ public class SheetMusicOfferGump : BaseQuestGump
{
public override bool Singleton => true;
public SheetMusicOfferGump() : base(75, 25)
private SheetMusicOfferGump() : base(75, 25)
{
Closable = false;
}
AddImage(349, 10, 0x24B0);
AddImageTiled(349, 130, 100, 120, 0x24B3);
AddImageTiled(149, 10, 200, 140, 0x24AF);
AddImageTiled(149, 300, 200, 140, 0x24B5);
AddImage(349, 300, 0x24B6);
AddImage(35, 10, 0x24AE);
AddImageTiled(35, 150, 120, 100, 0x24B1);
AddImage(35, 300, 0x24B4);
public static void DisplayTo(Mobile from)
{
if (from?.NetState == null)
{
return;
}
AddHtmlLocalized(110, 60, 200, 20, 1049069, White); // <STRONG>Conversation Event</STRONG>
from.SendGump(new SheetMusicOfferGump());
}
AddImage(65, 14, 0x2776);
AddImageTiled(81, 14, 349, 17, 0x2775);
AddImage(426, 14, 0x2778);
protected override void BuildLayout(ref DynamicGumpBuilder builder)
{
builder.SetNoClose();
AddImageTiled(50, 37, 400, 376, 0xA40);
AddAlphaRegion(50, 37, 400, 376);
builder.AddPage();
AddImage(0, 0, 0x28C8);
builder.AddImage(349, 10, 0x24B0);
builder.AddImageTiled(349, 130, 100, 120, 0x24B3);
builder.AddImageTiled(149, 10, 200, 140, 0x24AF);
builder.AddImageTiled(149, 300, 200, 140, 0x24B5);
builder.AddImage(349, 300, 0x24B6);
builder.AddImage(35, 10, 0x24AE);
builder.AddImageTiled(35, 150, 120, 100, 0x24B1);
builder.AddImage(35, 300, 0x24B4);
AddImageTiled(75, 90, 200, 1, 0x238D);
AddImage(75, 58, 0x2635);
AddImage(380, 45, 0xDF);
builder.AddHtmlLocalized(110, 60, 200, 20, 1049069, White); // <STRONG>Conversation Event</STRONG>
builder.AddImage(65, 14, 0x2776);
builder.AddImageTiled(81, 14, 349, 17, 0x2775);
builder.AddImage(426, 14, 0x2778);
builder.AddImageTiled(50, 37, 400, 376, 0xA40);
builder.AddAlphaRegion(50, 37, 400, 376);
builder.AddImage(0, 0, 0x28C8);
builder.AddImageTiled(75, 90, 200, 1, 0x238D);
builder.AddImage(75, 58, 0x2635);
builder.AddImage(380, 45, 0xDF);
// Sure, I have some sheet music for a Gabriel Piete song. I'd be happy to sell you a copy for 10 gold.
AddHtmlLocalized(98, 140, 312, 200, 1055107, LightGreen, false, true);
builder.AddHtmlLocalized(98, 140, 312, 200, 1055107, LightGreen, false, true);
AddRadio(85, 350, 0x25F8, 0x25FB, true, 1);
AddHtmlLocalized(120, 356, 280, 20, 1014088, White); // I accept.
builder.AddRadio(85, 350, 0x25F8, 0x25FB, true, 1);
builder.AddHtmlLocalized(120, 356, 280, 20, 1014088, White); // I accept.
AddRadio(85, 385, 0x25F8, 0x25FB, false, 0);
AddHtmlLocalized(120, 391, 280, 20, 1049012, White); // No thanks, I decline.
builder.AddRadio(85, 385, 0x25F8, 0x25FB, false, 0);
builder.AddHtmlLocalized(120, 391, 280, 20, 1049012, White); // No thanks, I decline.
AddButton(340, 390, 0xF7, 0xF8, 1);
builder.AddButton(340, 390, 0xF7, 0xF8, 1);
}
public override void OnResponse(NetState sender, in RelayInfo info)

View file

@ -1,4 +1,5 @@
using System;
using Server.Gumps;
namespace Server.Engines.Quests.Collector
{
@ -8,20 +9,20 @@ namespace Server.Engines.Quests.Collector
public override int MaxProgress => 6;
public override void RenderProgress(BaseQuestGump gump)
public override void RenderProgress(ref DynamicGumpBuilder builder)
{
if (!Completed)
{
// Rainbow pearls collected:
gump.AddHtmlObject(70, 260, 270, 100, 1055085, BaseQuestGump.Blue, false, false);
BaseQuestGump.AddHtmlObject(ref builder, 70, 260, 270, 100, 1055085, BaseQuestGump.Blue, false, false);
gump.AddLabel(70, 280, 0x64, CurProgress.ToString());
gump.AddLabel(100, 280, 0x64, "/");
gump.AddLabel(130, 280, 0x64, MaxProgress.ToString());
builder.AddLabel(70, 280, 0x64, $"{CurProgress}");
builder.AddLabel(100, 280, 0x64, "/");
builder.AddLabel(130, 280, 0x64, $"{MaxProgress}");
}
else
{
base.RenderProgress(gump);
base.RenderProgress(ref builder);
}
}
@ -311,7 +312,7 @@ namespace Server.Engines.Quests.Collector
return CaptureResponse.Invalid;
}
public override void RenderProgress(BaseQuestGump gump)
public override void RenderProgress(ref DynamicGumpBuilder builder)
{
if (!Completed)
{
@ -319,9 +320,10 @@ namespace Server.Engines.Quests.Collector
{
var info = ImageTypeInfo.Get(m_Images[i]);
gump.AddHtmlObject(70, 260 + 20 * i, 200, 100, info.Name, BaseQuestGump.Blue, false, false);
gump.AddLabel(200, 260 + 20 * i, 0x64, " : ");
gump.AddHtmlObject(
BaseQuestGump.AddHtmlObject(ref builder, 70, 260 + 20 * i, 200, 100, info.Name, BaseQuestGump.Blue, false, false);
builder.AddLabel(200, 260 + 20 * i, 0x64, " : ");
BaseQuestGump.AddHtmlObject(
ref builder,
220,
260 + 20 * i,
100,
@ -335,7 +337,7 @@ namespace Server.Engines.Quests.Collector
}
else
{
base.RenderProgress(gump);
base.RenderProgress(ref builder);
}
}

View file

@ -58,74 +58,91 @@ namespace Server.Engines.Quests
public class QuestConversationsGump : BaseQuestGump
{
private readonly List<QuestConversation> m_Conversations;
private readonly List<QuestConversation> _conversations;
public QuestConversationsGump(QuestConversation conv) : this(new List<QuestConversation> { conv })
private QuestConversationsGump(List<QuestConversation> conversations) : base(30, 50) =>
_conversations = conversations;
public static void DisplayTo(Mobile from, QuestConversation conv)
{
if (from?.NetState == null || conv == null)
{
return;
}
from.SendGump(new QuestConversationsGump(new List<QuestConversation> { conv }));
}
public QuestConversationsGump(List<QuestConversation> conversations) : base(30, 50)
public static void DisplayTo(Mobile from, List<QuestConversation> conversations)
{
m_Conversations = conversations;
Closable = false;
AddPage(0);
AddImage(349, 10, 9392);
AddImageTiled(349, 130, 100, 120, 9395);
AddImageTiled(149, 10, 200, 140, 9391);
AddImageTiled(149, 250, 200, 140, 9397);
AddImage(349, 250, 9398);
AddImage(35, 10, 9390);
AddImageTiled(35, 150, 120, 100, 9393);
AddImage(35, 250, 9396);
AddHtmlLocalized(110, 60, 200, 20, 1049069, White); // <STRONG>Conversation Event</STRONG>
AddImage(65, 14, 10102);
AddImageTiled(81, 14, 349, 17, 10101);
AddImage(426, 14, 10104);
AddImageTiled(55, 40, 388, 323, 2624);
AddAlphaRegion(55, 40, 388, 323);
AddImageTiled(75, 90, 200, 1, 9101);
AddImage(75, 58, 9781);
AddImage(380, 45, 223);
AddButton(220, 335, 2313, 2312, 1);
AddImage(0, 0, 10440);
AddPage(1);
for (var i = 0; i < conversations.Count; ++i)
if (from?.NetState == null || conversations == null || conversations.Count == 0)
{
var conv = conversations[conversations.Count - 1 - i];
return;
}
from.SendGump(new QuestConversationsGump(conversations));
}
protected override void BuildLayout(ref DynamicGumpBuilder builder)
{
builder.SetNoClose();
builder.AddPage();
builder.AddImage(349, 10, 9392);
builder.AddImageTiled(349, 130, 100, 120, 9395);
builder.AddImageTiled(149, 10, 200, 140, 9391);
builder.AddImageTiled(149, 250, 200, 140, 9397);
builder.AddImage(349, 250, 9398);
builder.AddImage(35, 10, 9390);
builder.AddImageTiled(35, 150, 120, 100, 9393);
builder.AddImage(35, 250, 9396);
builder.AddHtmlLocalized(110, 60, 200, 20, 1049069, White); // <STRONG>Conversation Event</STRONG>
builder.AddImage(65, 14, 10102);
builder.AddImageTiled(81, 14, 349, 17, 10101);
builder.AddImage(426, 14, 10104);
builder.AddImageTiled(55, 40, 388, 323, 2624);
builder.AddAlphaRegion(55, 40, 388, 323);
builder.AddImageTiled(75, 90, 200, 1, 9101);
builder.AddImage(75, 58, 9781);
builder.AddImage(380, 45, 223);
builder.AddButton(220, 335, 2313, 2312, 1);
builder.AddImage(0, 0, 10440);
builder.AddPage(1);
for (var i = 0; i < _conversations.Count; ++i)
{
var conv = _conversations[_conversations.Count - 1 - i];
if (i > 0)
{
AddButton(65, 366, 9909, 9911, 0, GumpButtonType.Page, 1 + i);
AddHtmlLocalized(90, 367, 50, 20, 1043354, Black); // Previous
builder.AddButton(65, 366, 9909, 9911, 0, GumpButtonType.Page, 1 + i);
builder.AddHtmlLocalized(90, 367, 50, 20, 1043354, Black); // Previous
AddPage(1 + i);
builder.AddPage(1 + i);
}
AddHtmlObject(70, 110, 365, 220, conv.Message, LightGreen, false, true);
AddHtmlObject(ref builder, 70, 110, 365, 220, conv.Message, LightGreen, false, true);
if (i > 0)
{
AddButton(420, 366, 9903, 9905, 0, GumpButtonType.Page, i);
AddHtmlLocalized(370, 367, 50, 20, 1043353, Black); // Next
builder.AddButton(420, 366, 9903, 9905, 0, GumpButtonType.Page, i);
builder.AddHtmlLocalized(370, 367, 50, 20, 1043353, Black); // Next
}
}
}
public override void OnResponse(NetState sender, in RelayInfo info)
{
for (var i = m_Conversations.Count - 1; i >= 0; --i)
for (var i = _conversations.Count - 1; i >= 0; --i)
{
var qc = m_Conversations[i];
var qc = _conversations[i];
if (!qc.HasBeenRead)
{

View file

@ -1,3 +1,5 @@
using Server.Gumps;
namespace Server.Engines.Quests
{
public class QuestItemInfo
@ -15,42 +17,56 @@ namespace Server.Engines.Quests
public class QuestItemInfoGump : BaseQuestGump
{
public QuestItemInfoGump(QuestItemInfo[] info) : base(485, 75)
private readonly QuestItemInfo[] _info;
private QuestItemInfoGump(QuestItemInfo[] info) : base(485, 75) => _info = info;
public static void DisplayTo(Mobile from, QuestItemInfo[] info)
{
var height = 100 + info.Length * 75;
AddPage(0);
AddBackground(5, 10, 145, height, 5054);
AddImageTiled(13, 20, 125, 10, 2624);
AddAlphaRegion(13, 20, 125, 10);
AddImageTiled(13, height - 10, 128, 10, 2624);
AddAlphaRegion(13, height - 10, 128, 10);
AddImageTiled(13, 20, 10, height - 30, 2624);
AddAlphaRegion(13, 20, 10, height - 30);
AddImageTiled(131, 20, 10, height - 30, 2624);
AddAlphaRegion(131, 20, 10, height - 30);
AddHtmlLocalized(67, 35, 120, 20, 1011233, White); // INFO
AddImage(62, 52, 9157);
AddImage(72, 52, 9157);
AddImage(82, 52, 9157);
AddButton(25, 31, 1209, 1210, 777);
AddPage(1);
for (var i = 0; i < info.Length; ++i)
if (from?.NetState == null || info == null || info.Length == 0)
{
var cur = info[i];
return;
}
AddHtmlObject(25, 65 + i * 75, 110, 20, cur.Name, 1153, false, false);
AddItem(45, 85 + i * 75, cur.ItemID);
from.SendGump(new QuestItemInfoGump(info));
}
protected override void BuildLayout(ref DynamicGumpBuilder builder)
{
var height = 100 + _info.Length * 75;
builder.AddPage();
builder.AddBackground(5, 10, 145, height, 5054);
builder.AddImageTiled(13, 20, 125, 10, 2624);
builder.AddAlphaRegion(13, 20, 125, 10);
builder.AddImageTiled(13, height - 10, 128, 10, 2624);
builder.AddAlphaRegion(13, height - 10, 128, 10);
builder.AddImageTiled(13, 20, 10, height - 30, 2624);
builder.AddAlphaRegion(13, 20, 10, height - 30);
builder.AddImageTiled(131, 20, 10, height - 30, 2624);
builder.AddAlphaRegion(131, 20, 10, height - 30);
builder.AddHtmlLocalized(67, 35, 120, 20, 1011233, White); // INFO
builder.AddImage(62, 52, 9157);
builder.AddImage(72, 52, 9157);
builder.AddImage(82, 52, 9157);
builder.AddButton(25, 31, 1209, 1210, 777);
builder.AddPage(1);
for (var i = 0; i < _info.Length; ++i)
{
var cur = _info[i];
AddHtmlObject(ref builder, 25, 65 + i * 75, 110, 20, cur.Name, 1153, false, false);
builder.AddItem(45, 85 + i * 75, cur.ItemID);
}
}
}

View file

@ -84,14 +84,24 @@ namespace Server.Engines.Quests
CurProgress = MaxProgress;
}
public virtual void RenderMessage(BaseQuestGump gump)
public virtual void RenderMessage(ref DynamicGumpBuilder builder)
{
gump.AddHtmlObject(70, 130, 300, 100, Message, BaseQuestGump.Blue, false, false);
BaseQuestGump.AddHtmlObject(ref builder, 70, 130, 300, 100, Message, BaseQuestGump.Blue, false, false);
}
public virtual void RenderProgress(BaseQuestGump gump)
public virtual void RenderProgress(ref DynamicGumpBuilder builder)
{
gump.AddHtmlObject(70, 260, 270, 100, Completed ? 1049077 : 1049078, BaseQuestGump.Blue, false, false);
BaseQuestGump.AddHtmlObject(
ref builder,
70,
260,
270,
100,
Completed ? 1049077 : 1049078,
BaseQuestGump.Blue,
false,
false
);
}
public virtual void CheckCompletionStatus()
@ -128,116 +138,142 @@ namespace Server.Engines.Quests
public class QuestLogUpdatedGump : BaseQuestGump
{
private readonly QuestSystem m_System;
private readonly QuestSystem _system;
public override bool Singleton => true;
public QuestLogUpdatedGump(QuestSystem system) : base(3, 30)
private QuestLogUpdatedGump(QuestSystem system) : base(3, 30) => _system = system;
public static void DisplayTo(Mobile from, QuestSystem system)
{
m_System = system;
if (from?.NetState == null || system == null)
{
return;
}
AddPage(0);
from.SendGump(new QuestLogUpdatedGump(system));
}
AddImage(20, 5, 1417);
protected override void BuildLayout(ref DynamicGumpBuilder builder)
{
builder.AddPage();
AddHtmlLocalized(0, 78, 120, 40, 1049079, White); // Quest Log Updated
builder.AddImage(20, 5, 1417);
AddImageTiled(0, 78, 120, 40, 2624);
AddAlphaRegion(0, 78, 120, 40);
builder.AddHtmlLocalized(0, 78, 120, 40, 1049079, White); // Quest Log Updated
AddButton(30, 15, 5575, 5576, 1);
builder.AddImageTiled(0, 78, 120, 40, 2624);
builder.AddAlphaRegion(0, 78, 120, 40);
builder.AddButton(30, 15, 5575, 5576, 1);
}
public override void OnResponse(NetState sender, in RelayInfo info)
{
if (info.ButtonID == 1)
{
m_System.ShowQuestLog();
_system.ShowQuestLog();
}
}
}
public class QuestObjectivesGump : BaseQuestGump
{
private readonly List<QuestObjective> m_Objectives;
private readonly List<QuestObjective> _objectives;
public QuestObjectivesGump(QuestObjective obj) : this(new List<QuestObjective> { obj })
private QuestObjectivesGump(List<QuestObjective> objectives) : base(90, 50) => _objectives = objectives;
public static void DisplayTo(Mobile from, QuestObjective obj)
{
if (from?.NetState == null || obj == null)
{
return;
}
from.SendGump(new QuestObjectivesGump(new List<QuestObjective> { obj }));
}
public QuestObjectivesGump(List<QuestObjective> objectives) : base(90, 50)
public static void DisplayTo(Mobile from, List<QuestObjective> objectives)
{
m_Objectives = objectives;
Closable = false;
AddPage(0);
AddImage(0, 0, 3600);
AddImageTiled(0, 14, 15, 375, 3603);
AddImageTiled(380, 14, 14, 375, 3605);
AddImage(0, 376, 3606);
AddImageTiled(15, 376, 370, 16, 3607);
AddImageTiled(15, 0, 370, 16, 3601);
AddImage(380, 0, 3602);
AddImage(380, 376, 3608);
AddImageTiled(15, 15, 365, 365, 2624);
AddAlphaRegion(15, 15, 365, 365);
AddImage(20, 87, 1231);
AddImage(75, 62, 9307);
AddHtmlLocalized(117, 35, 230, 20, 1046026, Blue); // Quest Log
AddImage(77, 33, 9781);
AddImage(65, 110, 2104);
AddHtmlLocalized(79, 106, 230, 20, 1049073, Blue); // Objective:
AddImageTiled(68, 125, 120, 1, 9101);
AddImage(65, 240, 2104);
AddHtmlLocalized(79, 237, 230, 20, 1049076, Blue); // Progress details:
AddImageTiled(68, 255, 120, 1, 9101);
AddButton(175, 355, 2313, 2312, 1);
AddImage(341, 15, 10450);
AddImage(341, 330, 10450);
AddImage(15, 330, 10450);
AddImage(15, 15, 10450);
AddPage(1);
for (var i = 0; i < objectives.Count; ++i)
if (from?.NetState == null || objectives == null || objectives.Count == 0)
{
var obj = objectives[objectives.Count - 1 - i];
return;
}
from.SendGump(new QuestObjectivesGump(objectives));
}
protected override void BuildLayout(ref DynamicGumpBuilder builder)
{
builder.SetNoClose();
builder.AddPage();
builder.AddImage(0, 0, 3600);
builder.AddImageTiled(0, 14, 15, 375, 3603);
builder.AddImageTiled(380, 14, 14, 375, 3605);
builder.AddImage(0, 376, 3606);
builder.AddImageTiled(15, 376, 370, 16, 3607);
builder.AddImageTiled(15, 0, 370, 16, 3601);
builder.AddImage(380, 0, 3602);
builder.AddImage(380, 376, 3608);
builder.AddImageTiled(15, 15, 365, 365, 2624);
builder.AddAlphaRegion(15, 15, 365, 365);
builder.AddImage(20, 87, 1231);
builder.AddImage(75, 62, 9307);
builder.AddHtmlLocalized(117, 35, 230, 20, 1046026, Blue); // Quest Log
builder.AddImage(77, 33, 9781);
builder.AddImage(65, 110, 2104);
builder.AddHtmlLocalized(79, 106, 230, 20, 1049073, Blue); // Objective:
builder.AddImageTiled(68, 125, 120, 1, 9101);
builder.AddImage(65, 240, 2104);
builder.AddHtmlLocalized(79, 237, 230, 20, 1049076, Blue); // Progress details:
builder.AddImageTiled(68, 255, 120, 1, 9101);
builder.AddButton(175, 355, 2313, 2312, 1);
builder.AddImage(341, 15, 10450);
builder.AddImage(341, 330, 10450);
builder.AddImage(15, 330, 10450);
builder.AddImage(15, 15, 10450);
builder.AddPage(1);
for (var i = 0; i < _objectives.Count; ++i)
{
var obj = _objectives[_objectives.Count - 1 - i];
if (i > 0)
{
AddButton(55, 346, 9909, 9911, 0, GumpButtonType.Page, 1 + i);
AddHtmlLocalized(82, 347, 50, 20, 1043354, White); // Previous
builder.AddButton(55, 346, 9909, 9911, 0, GumpButtonType.Page, 1 + i);
builder.AddHtmlLocalized(82, 347, 50, 20, 1043354, White); // Previous
AddPage(1 + i);
builder.AddPage(1 + i);
}
obj.RenderMessage(this);
obj.RenderProgress(this);
obj.RenderMessage(ref builder);
obj.RenderProgress(ref builder);
if (i > 0)
{
AddButton(317, 346, 9903, 9905, 0, GumpButtonType.Page, i);
AddHtmlLocalized(278, 347, 50, 20, 1043353, White); // Next
builder.AddButton(317, 346, 9903, 9905, 0, GumpButtonType.Page, i);
builder.AddHtmlLocalized(278, 347, 50, 20, 1043353, White); // Next
}
}
}
public override void OnResponse(NetState sender, in RelayInfo info)
{
for (var i = m_Objectives.Count - 1; i >= 0; --i)
for (var i = _objectives.Count - 1; i >= 0; --i)
{
var obj = m_Objectives[i];
var obj = _objectives[i];
if (!obj.HasBeenRead)
{

View file

@ -244,7 +244,7 @@ namespace Server.Engines.Quests
public virtual void SendOffer()
{
From.SendGump(new QuestOfferGump(this));
QuestOfferGump.DisplayTo(From, this);
}
public virtual void GetContextMenuEntries(ref PooledRefList<ContextMenuEntry> list)
@ -264,7 +264,7 @@ namespace Server.Engines.Quests
public virtual void ShowQuestLogUpdated()
{
From.SendGump(new QuestLogUpdatedGump(this));
QuestLogUpdatedGump.DisplayTo(From, this);
}
public virtual void ShowQuestLog()
@ -277,13 +277,13 @@ namespace Server.Engines.Quests
gumps.Close<QuestConversationsGump>();
gumps.Close<QuestObjectivesGump>();
gumps.Send(new QuestObjectivesGump(Objectives));
QuestObjectivesGump.DisplayTo(From, Objectives);
var last = Objectives[^1];
if (last.Info != null)
{
gumps.Send(new QuestItemInfoGump(last.Info));
QuestItemInfoGump.DisplayTo(From, last.Info);
}
}
}
@ -298,20 +298,20 @@ namespace Server.Engines.Quests
gumps.Close<QuestObjectivesGump>();
gumps.Close<QuestConversationsGump>();
gumps.Send(new QuestConversationsGump(Conversations));
QuestConversationsGump.DisplayTo(From, Conversations);
var last = Conversations[^1];
if (last.Info != null)
{
From.SendGump(new QuestItemInfoGump(last.Info));
QuestItemInfoGump.DisplayTo(From, last.Info);
}
}
}
public virtual void BeginCancelQuest()
{
From.SendGump(new QuestCancelGump(this));
QuestCancelGump.DisplayTo(From, this);
}
public virtual void EndCancelQuest(bool shouldCancel)
@ -394,11 +394,19 @@ namespace Server.Engines.Quests
var gumps = From.GetGumps();
gumps.Close<QuestItemInfoGump>();
gumps.Close<QuestObjectivesGump>();
gumps.Send(conv.Logged ? new QuestConversationsGump(Conversations) : new QuestConversationsGump(conv));
if (conv.Logged)
{
QuestConversationsGump.DisplayTo(From, Conversations);
}
else
{
QuestConversationsGump.DisplayTo(From, conv);
}
if (conv.Info != null)
{
From.SendGump(new QuestItemInfoGump(conv.Info));
QuestItemInfoGump.DisplayTo(From, conv.Info);
}
}
@ -519,142 +527,166 @@ namespace Server.Engines.Quests
public class QuestCancelGump : BaseQuestGump
{
private readonly QuestSystem m_System;
private readonly QuestSystem _system;
public QuestCancelGump(QuestSystem system) : base(120, 50)
public override bool Singleton => true;
private QuestCancelGump(QuestSystem system) : base(120, 50) => _system = system;
public static void DisplayTo(Mobile from, QuestSystem system)
{
m_System = system;
Closable = false;
AddPage(0);
AddImageTiled(0, 0, 348, 262, 2702);
AddAlphaRegion(0, 0, 348, 262);
AddImage(0, 15, 10152);
AddImageTiled(0, 30, 17, 200, 10151);
AddImage(0, 230, 10154);
AddImage(15, 0, 10252);
AddImageTiled(30, 0, 300, 17, 10250);
AddImage(315, 0, 10254);
AddImage(15, 244, 10252);
AddImageTiled(30, 244, 300, 17, 10250);
AddImage(315, 244, 10254);
AddImage(330, 15, 10152);
AddImageTiled(330, 30, 17, 200, 10151);
AddImage(330, 230, 10154);
AddImage(333, 2, 10006);
AddImage(333, 248, 10006);
AddImage(2, 248, 10006);
AddImage(2, 2, 10006);
AddHtmlLocalized(25, 22, 200, 20, 1049000, 32000); // Confirm Quest Cancellation
AddImage(25, 40, 3007);
if (system.IsTutorial)
if (from?.NetState == null || system == null)
{
AddHtmlLocalized(
return;
}
from.SendGump(new QuestCancelGump(system));
}
protected override void BuildLayout(ref DynamicGumpBuilder builder)
{
builder.SetNoClose();
builder.AddPage();
builder.AddImageTiled(0, 0, 348, 262, 2702);
builder.AddAlphaRegion(0, 0, 348, 262);
builder.AddImage(0, 15, 10152);
builder.AddImageTiled(0, 30, 17, 200, 10151);
builder.AddImage(0, 230, 10154);
builder.AddImage(15, 0, 10252);
builder.AddImageTiled(30, 0, 300, 17, 10250);
builder.AddImage(315, 0, 10254);
builder.AddImage(15, 244, 10252);
builder.AddImageTiled(30, 244, 300, 17, 10250);
builder.AddImage(315, 244, 10254);
builder.AddImage(330, 15, 10152);
builder.AddImageTiled(330, 30, 17, 200, 10151);
builder.AddImage(330, 230, 10154);
builder.AddImage(333, 2, 10006);
builder.AddImage(333, 248, 10006);
builder.AddImage(2, 248, 10006);
builder.AddImage(2, 2, 10006);
builder.AddHtmlLocalized(25, 22, 200, 20, 1049000, 32000); // Confirm Quest Cancellation
builder.AddImage(25, 40, 3007);
if (_system.IsTutorial)
{
builder.AddHtmlLocalized(
25,
55,
300,
120,
1060836,
White
BaseQuestGump.White
); // This quest will give you valuable information, skills and equipment that will help you advance in the game at a quicker pace.<BR><BR>Are you certain you wish to cancel at this time?
}
else
{
AddHtmlLocalized(25, 60, 300, 20, 1049001, White); // You have chosen to abort your quest:
AddImage(25, 81, 0x25E7);
AddHtmlObject(48, 80, 280, 20, system.Name, DarkGreen, false, false);
builder.AddHtmlLocalized(25, 60, 300, 20, 1049001, BaseQuestGump.White); // You have chosen to abort your quest:
builder.AddImage(25, 81, 0x25E7);
BaseQuestGump.AddHtmlObject(ref builder, 48, 80, 280, 20, _system.Name, BaseQuestGump.DarkGreen, false, false);
AddHtmlLocalized(25, 120, 280, 20, 1049002, White); // Can this quest be restarted after quitting?
AddImage(25, 141, 0x25E7);
AddHtmlLocalized(
builder.AddHtmlLocalized(25, 120, 280, 20, 1049002, BaseQuestGump.White); // Can this quest be restarted after quitting?
builder.AddImage(25, 141, 0x25E7);
builder.AddHtmlLocalized(
48,
140,
280,
20,
system.RestartDelay < TimeSpan.MaxValue ? 1049016 : 1049017,
DarkGreen
_system.RestartDelay < TimeSpan.MaxValue ? 1049016 : 1049017,
BaseQuestGump.DarkGreen
); // Yes/No
}
AddRadio(25, 175, 9720, 9723, true, 1);
AddHtmlLocalized(60, 180, 280, 20, 1049005, White); // Yes, I really want to quit!
builder.AddRadio(25, 175, 9720, 9723, true, 1);
builder.AddHtmlLocalized(60, 180, 280, 20, 1049005, BaseQuestGump.White); // Yes, I really want to quit!
AddRadio(25, 210, 9720, 9723, false, 0);
AddHtmlLocalized(60, 215, 280, 20, 1049006, White); // No, I don't want to quit.
builder.AddRadio(25, 210, 9720, 9723, false, 0);
builder.AddHtmlLocalized(60, 215, 280, 20, 1049006, BaseQuestGump.White); // No, I don't want to quit.
AddButton(265, 220, 247, 248, 1);
builder.AddButton(265, 220, 247, 248, 1);
}
public override void OnResponse(NetState sender, in RelayInfo info)
{
if (info.ButtonID == 1)
{
m_System.EndCancelQuest(info.IsSwitched(1));
_system.EndCancelQuest(info.IsSwitched(1));
}
}
}
public class QuestOfferGump : BaseQuestGump
{
private readonly QuestSystem m_System;
private readonly QuestSystem _system;
public QuestOfferGump(QuestSystem system) : base(75, 25)
public override bool Singleton => true;
private QuestOfferGump(QuestSystem system) : base(75, 25) => _system = system;
public static void DisplayTo(Mobile from, QuestSystem system)
{
m_System = system;
if (from?.NetState == null || system == null)
{
return;
}
Closable = false;
from.SendGump(new QuestOfferGump(system));
}
AddPage(0);
protected override void BuildLayout(ref DynamicGumpBuilder builder)
{
builder.SetNoClose();
AddImageTiled(50, 20, 400, 400, 2624);
AddAlphaRegion(50, 20, 400, 400);
builder.AddPage();
AddImage(90, 33, 9005);
AddHtmlLocalized(130, 45, 270, 20, 1049010, White); // Quest Offer
AddImageTiled(130, 65, 175, 1, 9101);
builder.AddImageTiled(50, 20, 400, 400, 2624);
builder.AddAlphaRegion(50, 20, 400, 400);
AddImage(140, 110, 1209);
AddHtmlObject(160, 108, 250, 20, system.Name, DarkGreen, false, false);
builder.AddImage(90, 33, 9005);
builder.AddHtmlLocalized(130, 45, 270, 20, 1049010, BaseQuestGump.White); // Quest Offer
builder.AddImageTiled(130, 65, 175, 1, 9101);
AddHtmlObject(98, 140, 312, 200, system.OfferMessage, LightGreen, false, true);
builder.AddImage(140, 110, 1209);
BaseQuestGump.AddHtmlObject(ref builder, 160, 108, 250, 20, _system.Name, BaseQuestGump.DarkGreen, false, false);
AddRadio(85, 350, 9720, 9723, true, 1);
AddHtmlLocalized(120, 356, 280, 20, 1049011, White); // I accept!
BaseQuestGump.AddHtmlObject(ref builder, 98, 140, 312, 200, _system.OfferMessage, BaseQuestGump.LightGreen, false, true);
AddRadio(85, 385, 9720, 9723, false, 0);
AddHtmlLocalized(120, 391, 280, 20, 1049012, White); // No thanks, I decline.
builder.AddRadio(85, 350, 9720, 9723, true, 1);
builder.AddHtmlLocalized(120, 356, 280, 20, 1049011, BaseQuestGump.White); // I accept!
AddButton(340, 390, 247, 248, 1);
builder.AddRadio(85, 385, 9720, 9723, false, 0);
builder.AddHtmlLocalized(120, 391, 280, 20, 1049012, BaseQuestGump.White); // No thanks, I decline.
AddImageTiled(50, 29, 30, 390, 10460);
AddImageTiled(34, 140, 17, 279, 9263);
builder.AddButton(340, 390, 247, 248, 1);
AddImage(48, 135, 10411);
AddImage(-16, 285, 10402);
AddImage(0, 10, 10421);
AddImage(25, 0, 10420);
builder.AddImageTiled(50, 29, 30, 390, 10460);
builder.AddImageTiled(34, 140, 17, 279, 9263);
AddImageTiled(83, 15, 350, 15, 10250);
builder.AddImage(48, 135, 10411);
builder.AddImage(-16, 285, 10402);
builder.AddImage(0, 10, 10421);
builder.AddImage(25, 0, 10420);
AddImage(34, 419, 10306);
AddImage(442, 419, 10304);
AddImageTiled(51, 419, 392, 17, 10101);
builder.AddImageTiled(83, 15, 350, 15, 10250);
AddImageTiled(415, 29, 44, 390, 2605);
AddImageTiled(415, 29, 30, 390, 10460);
AddImage(425, 0, 10441);
builder.AddImage(34, 419, 10306);
builder.AddImage(442, 419, 10304);
builder.AddImageTiled(51, 419, 392, 17, 10101);
AddImage(370, 50, 1417);
AddImage(379, 60, system.Picture);
builder.AddImageTiled(415, 29, 44, 390, 2605);
builder.AddImageTiled(415, 29, 30, 390, 10460);
builder.AddImage(425, 0, 10441);
builder.AddImage(370, 50, 1417);
builder.AddImage(379, 60, _system.Picture);
}
public override void OnResponse(NetState sender, in RelayInfo info)
@ -663,17 +695,17 @@ namespace Server.Engines.Quests
{
if (info.IsSwitched(1))
{
m_System.Accept();
_system.Accept();
}
else
{
m_System.Decline();
_system.Decline();
}
}
}
}
public abstract class BaseQuestGump : Gump
public abstract class BaseQuestGump : DynamicGump
{
public const int Black = 0x0000;
public const int White = 0x7FFF;
@ -681,19 +713,29 @@ namespace Server.Engines.Quests
public const int LightGreen = 90000;
public const int Blue = 19777215;
public BaseQuestGump(int x, int y) : base(x, y)
protected BaseQuestGump(int x, int y) : base(x, y)
{
}
public void AddHtmlObject(int x, int y, int width, int height, object message, int color, bool back, bool scroll)
public static void AddHtmlObject(
ref DynamicGumpBuilder builder,
int x,
int y,
int width,
int height,
object message,
int color,
bool back,
bool scroll
)
{
if (message is int html)
{
AddHtmlLocalized(x, y, width, height, html, color.C16216(), back, scroll);
builder.AddHtmlLocalized(x, y, width, height, html, color.C16216(), back, scroll);
}
else
{
AddHtml(x, y, width, height, Html.Color($"{message}", color.C16216()), back, scroll);
builder.AddHtml(x, y, width, height, Html.Color($"{message}", color.C16216()), background: back, scrollbar: scroll);
}
}
}

View file

@ -42,7 +42,7 @@ public partial class ScrollOfAbraxus : QuestItem
{
if (IsChildOf(from.Backpack))
{
from.SendGump(new ScrollOfAbraxusGump());
ScrollOfAbraxusGump.DisplayTo(from);
if (from is PlayerMobile pm)
{
@ -66,14 +66,30 @@ public partial class ScrollOfAbraxus : QuestItem
}
}
public class ScrollOfAbraxusGump : Gump
public class ScrollOfAbraxusGump : StaticGump<ScrollOfAbraxusGump>
{
public ScrollOfAbraxusGump() : base(150, 50)
{
AddPage(0);
public override bool Singleton => true;
AddImage(0, 0, 1228);
AddImage(340, 255, 9005);
private ScrollOfAbraxusGump() : base(150, 50)
{
}
public static void DisplayTo(Mobile from)
{
if (from?.NetState == null)
{
return;
}
from.SendGump(new ScrollOfAbraxusGump());
}
protected override void BuildLayout(ref StaticGumpBuilder builder)
{
builder.AddPage();
builder.AddImage(0, 0, 1228);
builder.AddImage(340, 255, 9005);
/* Security at the Crystal Cave<BR><BR>
*
@ -111,6 +127,6 @@ public class ScrollOfAbraxusGump : Gump
*
* <I>- Frater Melkeer</I>
*/
AddHtmlLocalized(25, 36, 350, 210, 1060116, 1, false, true);
builder.AddHtmlLocalized(25, 36, 350, 210, 1060116, 1, false, true);
}
}

View file

@ -1,3 +1,4 @@
using Server.Gumps;
using Server.Items;
using Server.Mobiles;
@ -187,19 +188,19 @@ namespace Server.Engines.Quests.Ninja
public override int MaxProgress => 3;
public override void RenderProgress(BaseQuestGump gump)
public override void RenderProgress(ref DynamicGumpBuilder builder)
{
if (!Completed)
{
// Henchmen killed:
gump.AddHtmlLocalized(70, 260, 270, 100, 1063207, BaseQuestGump.Blue);
gump.AddLabel(70, 280, 0x64, CurProgress.ToString());
gump.AddLabel(100, 280, 0x64, "/");
gump.AddLabel(130, 280, 0x64, MaxProgress.ToString());
builder.AddHtmlLocalized(70, 260, 270, 100, 1063207, BaseQuestGump.Blue);
builder.AddLabel(70, 280, 0x64, $"{CurProgress}");
builder.AddLabel(100, 280, 0x64, "/");
builder.AddLabel(130, 280, 0x64, $"{MaxProgress}");
}
else
{
base.RenderProgress(gump);
base.RenderProgress(ref builder);
}
}

View file

@ -1,3 +1,4 @@
using Server.Gumps;
using Server.Items;
using Server.Mobiles;
@ -9,12 +10,12 @@ namespace Server.Engines.Quests.Matriarch
public override int MaxProgress => 7;
public override void RenderProgress(BaseQuestGump gump)
public override void RenderProgress(ref DynamicGumpBuilder builder)
{
if (!Completed)
{
// Black/Red Solen Infiltrators killed:
gump.AddHtmlLocalized(
builder.AddHtmlLocalized(
70,
260,
270,
@ -22,13 +23,13 @@ namespace Server.Engines.Quests.Matriarch
((SolenMatriarchQuest)System).RedSolen ? 1054088 : 1054087,
BaseQuestGump.Blue
);
gump.AddLabel(70, 280, 0x64, CurProgress.ToString());
gump.AddLabel(100, 280, 0x64, "/");
gump.AddLabel(130, 280, 0x64, MaxProgress.ToString());
builder.AddLabel(70, 280, 0x64, $"{CurProgress}");
builder.AddLabel(100, 280, 0x64, "/");
builder.AddLabel(130, 280, 0x64, $"{MaxProgress}");
}
else
{
base.RenderProgress(gump);
base.RenderProgress(ref builder);
}
}
@ -91,18 +92,18 @@ namespace Server.Engines.Quests.Matriarch
public override int MaxProgress => 40;
public override void RenderProgress(BaseQuestGump gump)
public override void RenderProgress(ref DynamicGumpBuilder builder)
{
if (!Completed)
{
gump.AddHtmlLocalized(70, 260, 270, 100, 1054093, BaseQuestGump.Blue); // Gallons of Water gathered:
gump.AddLabel(70, 280, 0x64, (CurProgress / 5).ToString());
gump.AddLabel(100, 280, 0x64, "/");
gump.AddLabel(130, 280, 0x64, (MaxProgress / 5).ToString());
builder.AddHtmlLocalized(70, 260, 270, 100, 1054093, BaseQuestGump.Blue); // Gallons of Water gathered:
builder.AddLabel(70, 280, 0x64, (CurProgress / 5).ToString());
builder.AddLabel(100, 280, 0x64, "/");
builder.AddLabel(130, 280, 0x64, (MaxProgress / 5).ToString());
}
else
{
base.RenderProgress(gump);
base.RenderProgress(ref builder);
}
}

View file

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using Server.Gumps;
namespace Server.Engines.Quests.Naturalist
{
@ -117,18 +118,18 @@ namespace Server.Engines.Quests.Naturalist
}
}
public override void RenderProgress(BaseQuestGump gump)
public override void RenderProgress(ref DynamicGumpBuilder builder)
{
if (!Completed)
{
gump.AddHtmlLocalized(70, 260, 270, 100, 1054055, BaseQuestGump.Blue); // Solen Nests Studied :
gump.AddLabel(70, 280, 0x64, CurProgress.ToString());
gump.AddLabel(100, 280, 0x64, "/");
gump.AddLabel(130, 280, 0x64, MaxProgress.ToString());
builder.AddHtmlLocalized(70, 260, 270, 100, 1054055, BaseQuestGump.Blue); // Solen Nests Studied :
builder.AddLabel(70, 280, 0x64, $"{CurProgress}");
builder.AddLabel(100, 280, 0x64, "/");
builder.AddLabel(130, 280, 0x64, $"{MaxProgress}");
}
else
{
base.RenderProgress(gump);
base.RenderProgress(ref builder);
}
}
@ -176,14 +177,12 @@ namespace Server.Engines.Quests.Naturalist
{
public override int Message => 1054048;
public override void RenderProgress(BaseQuestGump gump)
public override void RenderProgress(ref DynamicGumpBuilder builder)
{
var count = NestArea.NonSpecialCount.ToString();
gump.AddHtmlLocalized(70, 260, 270, 100, 1054055, BaseQuestGump.Blue); // Solen Nests Studied :
gump.AddLabel(70, 280, 0x64, count);
gump.AddLabel(100, 280, 0x64, "/");
gump.AddLabel(130, 280, 0x64, count);
builder.AddHtmlLocalized(70, 260, 270, 100, 1054055, BaseQuestGump.Blue); // Solen Nests Studied :
builder.AddLabel(70, 280, 0x64, $"{NestArea.NonSpecialCount}");
builder.AddLabel(100, 280, 0x64, "/");
builder.AddLabel(130, 280, 0x64, $"{NestArea.NonSpecialCount}");
}
}
}

View file

@ -1,3 +1,4 @@
using Server.Gumps;
using Server.Items;
using Server.Mobiles;
@ -7,20 +8,20 @@ namespace Server.Engines.Quests.Zento
{
public override int Message => 1063316;
public override void RenderProgress(BaseQuestGump gump)
public override void RenderProgress(ref DynamicGumpBuilder builder)
{
if (!Completed)
{
// Deathwatch Beetle Hatchlings killed:
gump.AddHtmlLocalized(70, 260, 270, 100, 1063318, 0xC6BF);
builder.AddHtmlLocalized(70, 260, 270, 100, 1063318, 0xC6BF);
gump.AddLabel(70, 280, 0x64, "0");
gump.AddLabel(100, 280, 0x64, "/");
gump.AddLabel(130, 280, 0x64, "10");
builder.AddLabel(70, 280, 0x64, "0");
builder.AddLabel(100, 280, 0x64, "/");
builder.AddLabel(130, 280, 0x64, "10");
}
else
{
base.RenderProgress(gump);
base.RenderProgress(ref builder);
}
}
@ -42,20 +43,20 @@ namespace Server.Engines.Quests.Zento
{
public override int Message => 1063320;
public override void RenderProgress(BaseQuestGump gump)
public override void RenderProgress(ref DynamicGumpBuilder builder)
{
if (!Completed)
{
// Deathwatch Beetle Hatchlings killed:
gump.AddHtmlLocalized(70, 260, 270, 100, 1063318, 0xC6BF);
builder.AddHtmlLocalized(70, 260, 270, 100, 1063318, 0xC6BF);
gump.AddLabel(70, 280, 0x64, "1");
gump.AddLabel(100, 280, 0x64, "/");
gump.AddLabel(130, 280, 0x64, "10");
builder.AddLabel(70, 280, 0x64, "1");
builder.AddLabel(100, 280, 0x64, "/");
builder.AddLabel(130, 280, 0x64, "10");
}
else
{
base.RenderProgress(gump);
base.RenderProgress(ref builder);
}
}
@ -90,20 +91,20 @@ namespace Server.Engines.Quests.Zento
public override int MaxProgress => 10;
public override void RenderProgress(BaseQuestGump gump)
public override void RenderProgress(ref DynamicGumpBuilder builder)
{
if (!Completed)
{
// Deathwatch Beetle Hatchlings killed:
gump.AddHtmlLocalized(70, 260, 270, 100, 1063318, 0xC6BF);
builder.AddHtmlLocalized(70, 260, 270, 100, 1063318, 0xC6BF);
gump.AddLabel(70, 280, 0x64, CurProgress.ToString());
gump.AddLabel(100, 280, 0x64, "/");
gump.AddLabel(130, 280, 0x64, "10");
builder.AddLabel(70, 280, 0x64, $"{CurProgress}");
builder.AddLabel(100, 280, 0x64, "/");
builder.AddLabel(130, 280, 0x64, "10");
}
else
{
base.RenderProgress(gump);
base.RenderProgress(ref builder);
}
}

View file

@ -1,3 +1,4 @@
using Server.Gumps;
using Server.Items;
using Server.Mobiles;
@ -42,33 +43,33 @@ namespace Server.Engines.Quests.Doom
}
}
public override void RenderMessage(BaseQuestGump gump)
public override void RenderMessage(ref DynamicGumpBuilder builder)
{
if (CurProgress > 0 && CurProgress < MaxProgress)
{
// Victoria has accepted the Daemon bones, but the requirement is not yet met.
gump.AddHtmlObject(70, 130, 300, 100, 1050028, BaseQuestGump.Blue, false, false);
BaseQuestGump.AddHtmlObject(ref builder, 70, 130, 300, 100, 1050028, BaseQuestGump.Blue, false, false);
}
else
{
base.RenderMessage(gump);
base.RenderMessage(ref builder);
}
}
public override void RenderProgress(BaseQuestGump gump)
public override void RenderProgress(ref DynamicGumpBuilder builder)
{
if (CurProgress > 0 && CurProgress < MaxProgress)
{
// Number of bones collected:
gump.AddHtmlObject(70, 260, 270, 100, 1050019, BaseQuestGump.Blue, false, false);
BaseQuestGump.AddHtmlObject(ref builder, 70, 260, 270, 100, 1050019, BaseQuestGump.Blue, false, false);
gump.AddLabel(70, 280, 100, CurProgress.ToString());
gump.AddLabel(100, 280, 100, "/");
gump.AddLabel(130, 280, 100, MaxProgress.ToString());
builder.AddLabel(70, 280, 100, $"{CurProgress}");
builder.AddLabel(100, 280, 100, "/");
builder.AddLabel(130, 280, 100, $"{MaxProgress}");
}
else
{
base.RenderProgress(gump);
base.RenderProgress(ref builder);
}
}
}

View file

@ -1,4 +1,5 @@
using Server.Engines.Help;
using Server.Gumps;
using Server.Items;
using Server.Mobiles;
@ -138,16 +139,16 @@ namespace Server.Engines.Quests.Haven
}
}
public override void RenderProgress(BaseQuestGump gump)
public override void RenderProgress(ref DynamicGumpBuilder builder)
{
if (!Completed)
{
gump.AddHtmlObject(70, 260, 270, 100, 1049090, BaseQuestGump.Blue, false, false); // Horde Minions killed:
gump.AddLabel(70, 280, 0x64, CurProgress.ToString());
BaseQuestGump.AddHtmlObject(ref builder, 70, 260, 270, 100, 1049090, BaseQuestGump.Blue, false, false); // Horde Minions killed:
builder.AddLabel(70, 280, 0x64, $"{CurProgress}");
}
else
{
base.RenderProgress(gump);
base.RenderProgress(ref builder);
}
}

View file

@ -1,4 +1,5 @@
using System;
using Server.Gumps;
using Server.Items;
using Server.Mobiles;
@ -343,20 +344,20 @@ namespace Server.Engines.Quests.Hag
public int Step => Ingredients.Length;
public bool BlackheartMet { get; private set; }
public override void RenderProgress(BaseQuestGump gump)
public override void RenderProgress(ref DynamicGumpBuilder builder)
{
if (!Completed)
{
var info = IngredientInfo.Get(Ingredient);
gump.AddHtmlLocalized(70, 260, 270, 100, info.Name, BaseQuestGump.Blue);
gump.AddLabel(70, 280, 0x64, CurProgress.ToString());
gump.AddLabel(100, 280, 0x64, "/");
gump.AddLabel(130, 280, 0x64, info.Quantity.ToString());
builder.AddHtmlLocalized(70, 260, 270, 100, info.Name, BaseQuestGump.Blue);
builder.AddLabel(70, 280, 0x64, $"{CurProgress}");
builder.AddLabel(100, 280, 0x64, "/");
builder.AddLabel(130, 280, 0x64, $"{info.Quantity}");
}
else
{
base.RenderProgress(gump);
base.RenderProgress(ref builder);
}
}