perf: Migrates New Guild System gumps from legacy Gump. (#2422)

## Summary

Migrates the eight concrete New Guild System gumps (CreateGuild, GuildInfo,
GuildMemberInfo, GuildRoster, GuildDiplomacy, WarDeclaration,
GuildAdvancedSearch, GuildInvitationRequest) and three abstract bases
(BaseGuildGump, BaseGuildListGump, OtherGuildInfo) from the legacy `Gump`
class to `DynamicGump`. Layout work moves from constructor-side `AddX(...)`
calls into `BuildLayout(ref DynamicGumpBuilder builder)` — the abstract
`BaseGuildGump` now provides a `BuildContent` callout for shared
tab-strip chrome, and `BaseGuildListGump<T>` adds another
`BuildListExtras` hook so subclasses can paint highlighted titles after
the filter/sort/pagination chrome.

The headline win is the **self-refresh pattern** on the list gumps and
diplomacy advanced search. Previously each filter/sort/back/forward
click allocated a brand new gump via `GetResentGump`. After migration,
those handlers mutate `_filter`, `_startNumber`, `_comparer`, `_ascending`,
or `_display` on the existing gump and call `from.SendGump(this)`,
letting the singleton path in `NetStateGumps.Send` swap in the same
instance with the new layout. The original list is preserved separately
from the per-render filtered/sorted `_displayList`, so refreshes pick up
the latest state without losing the source list.

All guild gumps deal with per-instance dynamic strings (guild names,
member names, war declarations, alliance names), which would defeat
`StaticGump<T>` caching per the cliloc rule, so every concrete subclass
migrates to `DynamicGump`. `AllianceRosterGump` (in `Misc/Guild.cs`)
is a `GuildDiplomacyGump` subclass and inherits the new behavior; its
unused override and stored alliance reference were dropped along with
the now-obsolete `GetResentGump` abstract.
This commit is contained in:
Kamron Batman 2026-05-03 00:09:22 -07:00 committed by GitHub
parent 598c3c125c
commit 9c2ac2b8ea
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 642 additions and 689 deletions

View file

@ -8,55 +8,53 @@ namespace Server.Guilds
public class GuildAdvancedSearchGump : BaseGuildGump public class GuildAdvancedSearchGump : BaseGuildGump
{ {
private readonly SearchSelectionCallback m_Callback; private readonly SearchSelectionCallback _callback;
private readonly GuildDisplayType m_Display; private readonly GuildDisplayType _display;
public GuildAdvancedSearchGump(PlayerMobile pm, Guild g, GuildDisplayType display, SearchSelectionCallback callback) public GuildAdvancedSearchGump(PlayerMobile pm, Guild g, GuildDisplayType display, SearchSelectionCallback callback)
: base(pm, g) : base(pm, g)
{ {
m_Callback = callback; _callback = callback;
m_Display = display; _display = display;
PopulateGump();
} }
public override void PopulateGump() protected override void BuildContent(ref DynamicGumpBuilder builder)
{ {
base.PopulateGump(); builder.AddHtmlLocalized(431, 43, 110, 26, 1062978, 0xF); // Diplomacy
AddHtmlLocalized(431, 43, 110, 26, 1062978, 0xF); // Diplomacy builder.AddHtmlLocalized(65, 80, 480, 26, 1063124, 0xF, true); // <i>Advanced Search Options</i>
AddHtmlLocalized(65, 80, 480, 26, 1063124, 0xF, true); // <i>Advanced Search Options</i> // Showing All Guilds/w/Relation/Waiting Relation
builder.AddHtmlLocalized(
AddHtmlLocalized(
65, 65,
110, 110,
480, 480,
26, 26,
1063136 + (int)m_Display, 1063136 + (int)_display,
0xF 0xF
); // Showing All Guilds/w/Relation/Waiting Relation );
AddGroup(1); builder.AddGroup(1);
AddRadio(75, 140, 0xD2, 0xD3, false, 2); builder.AddRadio(75, 140, 0xD2, 0xD3, false, 2);
AddHtmlLocalized(105, 140, 200, 26, 1063006, 0x0); // Show Guilds with Relationship builder.AddHtmlLocalized(105, 140, 200, 26, 1063006, 0x0); // Show Guilds with Relationship
AddRadio(75, 170, 0xD2, 0xD3, false, 1); builder.AddRadio(75, 170, 0xD2, 0xD3, false, 1);
AddHtmlLocalized(105, 170, 200, 26, 1063005, 0x0); // Show Guilds Awaiting Action builder.AddHtmlLocalized(105, 170, 200, 26, 1063005, 0x0); // Show Guilds Awaiting Action
AddRadio(75, 200, 0xD2, 0xD3, false, 0); builder.AddRadio(75, 200, 0xD2, 0xD3, false, 0);
AddHtmlLocalized(105, 200, 200, 26, 1063007, 0x0); // Show All Guilds builder.AddHtmlLocalized(105, 200, 200, 26, 1063007, 0x0); // Show All Guilds
AddBackground(450, 370, 100, 26, 0x2486); builder.AddBackground(450, 370, 100, 26, 0x2486);
AddButton(455, 375, 0x845, 0x846, 5); builder.AddButton(455, 375, 0x845, 0x846, 5);
AddHtmlLocalized(480, 373, 60, 26, 1006044, 0x0); // OK builder.AddHtmlLocalized(480, 373, 60, 26, 1006044, 0x0); // OK
AddBackground(340, 370, 100, 26, 0x2486); builder.AddBackground(340, 370, 100, 26, 0x2486);
AddButton(345, 375, 0x845, 0x846, 0); builder.AddButton(345, 375, 0x845, 0x846, 0);
AddHtmlLocalized(370, 373, 60, 26, 1006045, 0x0); // Cancel builder.AddHtmlLocalized(370, 373, 60, 26, 1006045, 0x0); // Cancel
} }
public override void OnResponse(NetState sender, in RelayInfo info) public override void OnResponse(NetState sender, in RelayInfo info)
{ {
base.OnResponse(sender, info); base.OnResponse(sender, info);
if (sender.Mobile is not PlayerMobile pm || !IsMember(pm, guild)) if (sender.Mobile is not PlayerMobile pm || !IsMember(pm, Guild))
{ {
return; return;
} }
@ -68,7 +66,7 @@ namespace Server.Guilds
if (info.IsSwitched(i)) if (info.IsSwitched(i))
{ {
var display = (GuildDisplayType)i; var display = (GuildDisplayType)i;
m_Callback(display); _callback(display);
break; break;
} }
} }

View file

@ -6,39 +6,49 @@ using Server.Network;
namespace Server.Guilds namespace Server.Guilds
{ {
public abstract class BaseGuildGump : Gump public abstract class BaseGuildGump : DynamicGump
{ {
public override bool Singleton => true; public override bool Singleton => true;
public BaseGuildGump(PlayerMobile pm, Guild g, int x = 10, int y = 10) : base(x, y) protected BaseGuildGump(PlayerMobile pm, Guild g, int x = 10, int y = 10) : base(x, y)
{ {
guild = g; Guild = g;
player = pm; Player = pm;
} }
protected Guild guild { get; } protected Guild Guild { get; }
protected PlayerMobile player { get; } protected PlayerMobile Player { get; }
// There's prolly a way to have all the vars set of inherited classes before something is called in the Ctor... but... I can't think of it right now, and I can't use Timer.DelayCall here :< // Subclasses that draw their own background/layout (e.g. OtherGuildInfo,
// WarDeclarationGump, GuildMemberInfoGump) can opt out of the standard
// 600x440 frame and three-button tab strip drawn at the top of the gump.
protected virtual bool ShowTabStrip => true;
public virtual void PopulateGump() protected override void BuildLayout(ref DynamicGumpBuilder builder)
{ {
AddPage(0); builder.AddPage();
AddBackground(0, 0, 600, 440, 0x24AE); if (ShowTabStrip)
AddBackground(66, 40, 150, 26, 0x2486); {
AddButton(71, 45, 0x845, 0x846, 1); builder.AddBackground(0, 0, 600, 440, 0x24AE);
AddHtmlLocalized(96, 43, 110, 26, 1063014, 0x0); // My Guild builder.AddBackground(66, 40, 150, 26, 0x2486);
AddBackground(236, 40, 150, 26, 0x2486); builder.AddButton(71, 45, 0x845, 0x846, 1);
AddButton(241, 45, 0x845, 0x846, 2); builder.AddHtmlLocalized(96, 43, 110, 26, 1063014, 0x0); // My Guild
AddHtmlLocalized(266, 43, 110, 26, 1062974, 0x0); // Guild Roster builder.AddBackground(236, 40, 150, 26, 0x2486);
AddBackground(401, 40, 150, 26, 0x2486); builder.AddButton(241, 45, 0x845, 0x846, 2);
AddButton(406, 45, 0x845, 0x846, 3); builder.AddHtmlLocalized(266, 43, 110, 26, 1062974, 0x0); // Guild Roster
AddHtmlLocalized(431, 43, 110, 26, 1062978, 0x0); // Diplomacy builder.AddBackground(401, 40, 150, 26, 0x2486);
AddPage(1); builder.AddButton(406, 45, 0x845, 0x846, 3);
builder.AddHtmlLocalized(431, 43, 110, 26, 1062978, 0x0); // Diplomacy
builder.AddPage(1);
}
BuildContent(ref builder);
} }
protected abstract void BuildContent(ref DynamicGumpBuilder builder);
public override void OnResponse(NetState sender, in RelayInfo info) public override void OnResponse(NetState sender, in RelayInfo info)
{ {
if (sender.Mobile is not PlayerMobile pm) if (sender.Mobile is not PlayerMobile pm)
@ -46,7 +56,7 @@ namespace Server.Guilds
return; return;
} }
if (!IsMember(pm, guild)) if (!IsMember(pm, Guild))
{ {
return; return;
} }
@ -55,29 +65,27 @@ namespace Server.Guilds
{ {
case 1: case 1:
{ {
pm.SendGump(new GuildInfoGump(pm, guild)); pm.SendGump(new GuildInfoGump(pm, Guild));
break; break;
} }
case 2: case 2:
{ {
pm.SendGump(new GuildRosterGump(pm, guild)); pm.SendGump(new GuildRosterGump(pm, Guild));
break; break;
} }
case 3: case 3:
{ {
pm.SendGump(new GuildDiplomacyGump(pm, guild)); pm.SendGump(new GuildDiplomacyGump(pm, Guild));
break; break;
} }
} }
} }
public static bool IsLeader(Mobile m, Guild g) => public static bool IsLeader(Mobile m, Guild g) =>
!(m.Deleted || g.Disbanded || m is not PlayerMobile || !(m.Deleted || g.Disbanded || m is not PlayerMobile || m.AccessLevel < AccessLevel.GameMaster && g.Leader != m);
m.AccessLevel < AccessLevel.GameMaster && g.Leader != m);
public static bool IsMember(Mobile m, Guild g) => public static bool IsMember(Mobile m, Guild g) =>
!(m.Deleted || g.Disbanded || m is not PlayerMobile || !(m.Deleted || g.Disbanded || m is not PlayerMobile || m.AccessLevel < AccessLevel.GameMaster && !g.IsMember(m));
m.AccessLevel < AccessLevel.GameMaster && !g.IsMember(m));
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool CheckProfanity(string s, int maxLength = 50) => public static bool CheckProfanity(string s, int maxLength = 50) =>
@ -94,15 +102,24 @@ namespace Server.Guilds
ProfanityProtection.DisallowedSearchValues ProfanityProtection.DisallowedSearchValues
); );
public void AddHtmlText(int x, int y, int width, int height, TextDefinition text, bool back, bool scroll) protected static void AddHtmlText(
ref DynamicGumpBuilder builder,
int x,
int y,
int width,
int height,
TextDefinition text,
bool back,
bool scroll
)
{ {
if (text?.Number > 0) if (text?.Number > 0)
{ {
AddHtmlLocalized(x, y, width, height, text.Number, back, scroll); builder.AddHtmlLocalized(x, y, width, height, text.Number, back, scroll);
} }
else if (text?.String != null) else if (text?.String != null)
{ {
AddHtml(x, y, width, height, text.String, back, scroll); builder.AddHtml(x, y, width, height, text.String, background: back, scrollbar: scroll);
} }
} }
} }

View file

@ -9,137 +9,146 @@ namespace Server.Guilds
public abstract class BaseGuildListGump<T> : BaseGuildGump public abstract class BaseGuildListGump<T> : BaseGuildGump
{ {
private const int itemsPerPage = 8; private const int itemsPerPage = 8;
private readonly IComparer<T> m_Comparer;
private readonly InfoField<T>[] m_Fields;
private readonly string m_Filter;
private bool m_Ascending;
private List<T> m_List;
private int m_StartNumber;
public BaseGuildListGump( private readonly InfoField<T>[] _fields;
private readonly List<T> _originalList;
private List<T> _displayList;
private IComparer<T> _comparer;
private bool _ascending;
private string _filter;
private int _startNumber;
protected BaseGuildListGump(
PlayerMobile pm, Guild g, List<T> list, IComparer<T> currentComparer, bool ascending, PlayerMobile pm, Guild g, List<T> list, IComparer<T> currentComparer, bool ascending,
string filter, int startNumber, InfoField<T>[] fields string filter, int startNumber, InfoField<T>[] fields
) ) : base(pm, g)
: base(pm, g)
{ {
m_Filter = filter.Trim(); _filter = filter.Trim();
_comparer = currentComparer;
m_Comparer = currentComparer; _fields = fields;
m_Fields = fields; _ascending = ascending;
m_Ascending = ascending; _startNumber = startNumber;
m_StartNumber = startNumber; _originalList = list;
m_List = list;
} }
public virtual bool WillFilter => m_Filter.Length > 0; public virtual bool WillFilter => _filter.Length > 0;
public override void PopulateGump() protected override void BuildContent(ref DynamicGumpBuilder builder)
{ {
base.PopulateGump(); // Build the filtered/sorted display list per-render so refreshes pick up
// the latest filter/sort/pagination state.
var list = m_List;
if (WillFilter) if (WillFilter)
{ {
m_List = []; var filtered = new List<T>(_originalList.Count);
for (var i = 0; i < list.Count; i++) for (var i = 0; i < _originalList.Count; i++)
{ {
if (!IsFiltered(list[i], m_Filter)) if (!IsFiltered(_originalList[i], _filter))
{ {
m_List.Add(list[i]); filtered.Add(_originalList[i]);
} }
} }
_displayList = filtered;
} }
else else
{ {
m_List = new List<T>(list); _displayList = new List<T>(_originalList);
} }
m_List.Sort(m_Comparer); _displayList.Sort(_comparer);
m_StartNumber = Math.Max(Math.Min(m_StartNumber, m_List.Count - 1), 0); _startNumber = Math.Max(Math.Min(_startNumber, _displayList.Count - 1), 0);
AddBackground(130, 75, 385, 30, 0xBB8); builder.AddBackground(130, 75, 385, 30, 0xBB8);
AddTextEntry(135, 80, 375, 30, 0x481, 1, m_Filter); builder.AddTextEntry(135, 80, 375, 30, 0x481, 1, _filter);
AddButton(520, 75, 0x867, 0x868, 5); // Filter Button builder.AddButton(520, 75, 0x867, 0x868, 5); // Filter Button
var width = 0; var width = 0;
for (var i = 0; i < m_Fields.Length; i++) for (var i = 0; i < _fields.Length; i++)
{ {
var f = m_Fields[i]; var f = _fields[i];
AddImageTiled(65 + width, 110, f.Width + 10, 26, 0xA40); builder.AddImageTiled(65 + width, 110, f.Width + 10, 26, 0xA40);
AddImageTiled(67 + width, 112, f.Width + 6, 22, 0xBBC); builder.AddImageTiled(67 + width, 112, f.Width + 6, 22, 0xBBC);
AddHtmlText(70 + width, 113, f.Width, 20, f.Name, false, false); AddHtmlText(ref builder, 70 + width, 113, f.Width, 20, f.Name, false, false);
var isComparer = m_Fields[i].Comparer.GetType() == m_Comparer.GetType(); var isComparer = _fields[i].Comparer.GetType() == _comparer.GetType();
var ButtonID = isComparer ? m_Ascending ? 0x983 : 0x985 : 0x2716; var buttonId = isComparer ? _ascending ? 0x983 : 0x985 : 0x2716;
AddButton(59 + width + f.Width, 117, ButtonID, ButtonID + (isComparer ? 1 : 0), 100 + i); builder.AddButton(59 + width + f.Width, 117, buttonId, buttonId + (isComparer ? 1 : 0), 100 + i);
width += f.Width + 12; width += f.Width + 12;
} }
if (m_StartNumber <= 0) if (_startNumber <= 0)
{ {
AddButton(65, 80, 0x15E3, 0x15E7, 0, GumpButtonType.Page); builder.AddButton(65, 80, 0x15E3, 0x15E7, 0, GumpButtonType.Page);
} }
else else
{ {
AddButton(65, 80, 0x15E3, 0x15E7, 6); // Back builder.AddButton(65, 80, 0x15E3, 0x15E7, 6); // Back
} }
if (m_StartNumber + itemsPerPage > m_List.Count) if (_startNumber + itemsPerPage > _displayList.Count)
{ {
AddButton(95, 80, 0x15E1, 0x15E5, 0, GumpButtonType.Page); builder.AddButton(95, 80, 0x15E1, 0x15E5, 0, GumpButtonType.Page);
} }
else else
{ {
AddButton(95, 80, 0x15E1, 0x15E5, 7); // Forward builder.AddButton(95, 80, 0x15E1, 0x15E5, 7); // Forward
} }
var itemNumber = 0; var itemNumber = 0;
if (m_Ascending) if (_ascending)
{ {
for (var i = m_StartNumber; i < m_StartNumber + itemsPerPage && i < m_List.Count; i++) for (var i = _startNumber; i < _startNumber + itemsPerPage && i < _displayList.Count; i++)
{ {
DrawEntry(m_List[i], i, itemNumber++); DrawEntry(ref builder, _displayList[i], i, itemNumber++);
} }
} }
else // descending, go from bottom of list to the top else // descending, go from bottom of list to the top
{ {
for (var i = m_List.Count - 1 - m_StartNumber; for (var i = _displayList.Count - 1 - _startNumber;
i >= 0 && i >= m_List.Count - itemsPerPage - m_StartNumber; i >= 0 && i >= _displayList.Count - itemsPerPage - _startNumber;
i--) i--)
{ {
DrawEntry(m_List[i], i, itemNumber++); DrawEntry(ref builder, _displayList[i], i, itemNumber++);
} }
} }
DrawEndingEntry(itemNumber); DrawEndingEntry(ref builder, itemNumber);
BuildListExtras(ref builder);
} }
public virtual void DrawEndingEntry(int itemNumber) protected virtual void BuildListExtras(ref DynamicGumpBuilder builder)
{
}
protected virtual void DrawEndingEntry(ref DynamicGumpBuilder builder, int itemNumber)
{ {
} }
public virtual bool HasRelationship(T o) => false; public virtual bool HasRelationship(T o) => false;
public virtual void DrawEntry(T o, int index, int itemNumber) protected virtual void DrawEntry(ref DynamicGumpBuilder builder, T o, int index, int itemNumber)
{ {
var width = 0; var width = 0;
for (var j = 0; j < m_Fields.Length; j++) var values = GetValuesFor(o, _fields.Length);
for (var j = 0; j < _fields.Length; j++)
{ {
var f = m_Fields[j]; var f = _fields[j];
AddImageTiled(65 + width, 138 + itemNumber * 28, f.Width + 10, 26, 0xA40); builder.AddImageTiled(65 + width, 138 + itemNumber * 28, f.Width + 10, 26, 0xA40);
AddImageTiled(67 + width, 140 + itemNumber * 28, f.Width + 6, 22, 0xBBC); builder.AddImageTiled(67 + width, 140 + itemNumber * 28, f.Width + 6, 22, 0xBBC);
AddHtmlText( AddHtmlText(
ref builder,
70 + width, 70 + width,
141 + itemNumber * 28, 141 + itemNumber * 28,
f.Width, f.Width,
20, 20,
GetValuesFor(o, m_Fields.Length)[j], values[j],
false, false,
false false
); );
@ -149,22 +158,23 @@ namespace Server.Guilds
if (HasRelationship(o)) if (HasRelationship(o))
{ {
AddButton(40, 143 + itemNumber * 28, 0x8AF, 0x8AF, 200 + index); // Info Button builder.AddButton(40, 143 + itemNumber * 28, 0x8AF, 0x8AF, 200 + index); // Info Button
} }
else else
{ {
AddButton(40, 143 + itemNumber * 28, 0x4B9, 0x4BA, 200 + index); // Info Button builder.AddButton(40, 143 + itemNumber * 28, 0x4B9, 0x4BA, 200 + index); // Info Button
} }
} }
protected abstract TextDefinition[] GetValuesFor(T o, int aryLength); protected abstract TextDefinition[] GetValuesFor(T o, int aryLength);
protected abstract bool IsFiltered(T o, string filter); protected abstract bool IsFiltered(T o, string filter);
public override void OnResponse(NetState sender, in RelayInfo info) public override void OnResponse(NetState sender, in RelayInfo info)
{ {
base.OnResponse(sender, info); base.OnResponse(sender, info);
if (sender.Mobile is not PlayerMobile pm || !IsMember(pm, guild)) if (sender.Mobile is not PlayerMobile pm || !IsMember(pm, Guild))
{ {
return; return;
} }
@ -176,52 +186,59 @@ namespace Server.Guilds
case 5: // Filter case 5: // Filter
{ {
var t = info.GetTextEntry(1); var t = info.GetTextEntry(1);
pm.SendGump(GetResentGump(player, guild, m_Comparer, m_Ascending, t ?? "", 0)); _filter = (t ?? "").Trim();
break; _startNumber = 0;
pm.SendGump(this);
return;
} }
case 6: // Back case 6: // Back
{ {
pm.SendGump( _startNumber -= itemsPerPage;
GetResentGump(player, guild, m_Comparer, m_Ascending, m_Filter, m_StartNumber - itemsPerPage) pm.SendGump(this);
); return;
break;
} }
case 7: // Forward case 7: // Forward
{ {
pm.SendGump( _startNumber += itemsPerPage;
GetResentGump(player, guild, m_Comparer, m_Ascending, m_Filter, m_StartNumber + itemsPerPage) pm.SendGump(this);
); return;
break;
} }
} }
if (id >= 100 && id < 100 + m_Fields.Length) if (id >= 100 && id < 100 + _fields.Length)
{ {
var comparer = m_Fields[id - 100].Comparer; var comparer = _fields[id - 100].Comparer;
if (m_Comparer.GetType() == comparer.GetType()) if (_comparer.GetType() == comparer.GetType())
{ {
m_Ascending = !m_Ascending; _ascending = !_ascending;
}
else
{
_comparer = comparer;
} }
pm.SendGump(GetResentGump(player, guild, comparer, m_Ascending, m_Filter, 0)); _startNumber = 0;
pm.SendGump(this);
} }
else if (id >= 200 && id < 200 + m_List.Count) else if (id >= 200)
{ {
pm.SendGump(GetObjectInfoGump(player, guild, m_List[id - 200])); // The display list is rebuilt every render, so we use the most recent
// build to resolve the clicked entry.
var list = _displayList ?? _originalList;
var idx = id - 200;
if (idx < list.Count)
{
pm.SendGump(GetObjectInfoGump(Player, Guild, list[idx]));
}
} }
} }
public abstract Gump GetResentGump( public abstract BaseGump GetObjectInfoGump(PlayerMobile pm, Guild g, T o);
PlayerMobile pm, Guild g, IComparer<T> comparer, bool ascending, string filter,
int startNumber
);
public abstract Gump GetObjectInfoGump(PlayerMobile pm, Guild g, T o);
public void ResendGump() public void ResendGump()
{ {
player.SendGump(GetResentGump(player, guild, m_Comparer, m_Ascending, m_Filter, m_StartNumber)); Player.SendGump(this);
} }
} }

View file

@ -4,43 +4,55 @@ using Server.Network;
namespace Server.Guilds namespace Server.Guilds
{ {
public class CreateGuildGump : Gump public class CreateGuildGump : DynamicGump
{ {
private readonly PlayerMobile _player;
private readonly string _guildName;
private readonly string _guildAbbrev;
public override bool Singleton => true; public override bool Singleton => true;
public CreateGuildGump(PlayerMobile pm, string guildName = "Guild Name", string guildAbbrev = "") : base(10, 10) public CreateGuildGump(PlayerMobile pm, string guildName = "Guild Name", string guildAbbrev = "") : base(10, 10)
{ {
_player = pm;
_guildName = guildName;
_guildAbbrev = guildAbbrev;
pm.CloseGump<BaseGuildGump>(); pm.CloseGump<BaseGuildGump>();
}
AddPage(0); protected override void BuildLayout(ref DynamicGumpBuilder builder)
{
builder.AddPage();
AddBackground(0, 0, 500, 300, 0x2422); builder.AddBackground(0, 0, 500, 300, 0x2422);
AddHtmlLocalized(25, 20, 450, 25, 1062939, 0x0, true); // <center>GUILD MENU</center> builder.AddHtmlLocalized(25, 20, 450, 25, 1062939, 0x0, true); // <center>GUILD MENU</center>
// As you are not a member of any guild, you can create your own by providing a unique guild name and paying the standard guild registration fee. // As you are not a member of any guild, you can create your own by providing a unique guild name and
AddHtmlLocalized(25, 60, 450, 60, 1062940, 0x0); // paying the standard guild registration fee.
builder.AddHtmlLocalized(25, 60, 450, 60, 1062940, 0x0);
AddHtmlLocalized(25, 135, 120, 25, 1062941, 0x0); // Registration Fee: builder.AddHtmlLocalized(25, 135, 120, 25, 1062941, 0x0); // Registration Fee:
AddLabel(155, 135, 0x481, Guild.RegistrationFee.ToString()); builder.AddLabel(155, 135, 0x481, $"{Guild.RegistrationFee}");
AddHtmlLocalized(25, 165, 120, 25, 1011140, 0x0); // Enter Guild Name: builder.AddHtmlLocalized(25, 165, 120, 25, 1011140, 0x0); // Enter Guild Name:
AddBackground(155, 160, 320, 26, 0xBB8); builder.AddBackground(155, 160, 320, 26, 0xBB8);
AddTextEntry(160, 163, 315, 21, 0x481, 5, guildName); builder.AddTextEntry(160, 163, 315, 21, 0x481, 5, _guildName);
AddHtmlLocalized(25, 191, 120, 26, 1063035, 0x0); // Abbreviation: builder.AddHtmlLocalized(25, 191, 120, 26, 1063035, 0x0); // Abbreviation:
AddBackground(155, 186, 320, 26, 0xBB8); builder.AddBackground(155, 186, 320, 26, 0xBB8);
AddTextEntry(160, 189, 315, 21, 0x481, 6, guildAbbrev); builder.AddTextEntry(160, 189, 315, 21, 0x481, 6, _guildAbbrev);
AddButton(415, 217, 0xF7, 0xF8, 1); builder.AddButton(415, 217, 0xF7, 0xF8, 1);
AddButton(345, 217, 0xF2, 0xF1, 0); builder.AddButton(345, 217, 0xF2, 0xF1, 0);
if (pm.AcceptGuildInvites) if (_player.AcceptGuildInvites)
{ {
AddButton(20, 260, 0xD2, 0xD3, 2); builder.AddButton(20, 260, 0xD2, 0xD3, 2);
} }
else else
{ {
AddButton(20, 260, 0xD3, 0xD2, 2); builder.AddButton(20, 260, 0xD3, 0xD2, 2);
} }
AddHtmlLocalized(45, 260, 200, 30, 1062943, 0x0); // <i>Ignore Guild Invites</i> builder.AddHtmlLocalized(45, 260, 200, 30, 1062943, 0x0); // <i>Ignore Guild Invites</i>
} }
public override void OnResponse(NetState sender, in RelayInfo info) public override void OnResponse(NetState sender, in RelayInfo info)

View file

@ -14,8 +14,8 @@ namespace Server.Guilds
public class GuildDiplomacyGump : BaseGuildListGump<Guild> public class GuildDiplomacyGump : BaseGuildListGump<Guild>
{ {
private readonly TextDefinition m_LowerText; private readonly TextDefinition _lowerText;
private GuildDisplayType m_Display; private GuildDisplayType _display;
public GuildDiplomacyGump(PlayerMobile pm, Guild g) public GuildDiplomacyGump(PlayerMobile pm, Guild g)
: this( : this(
@ -85,9 +85,8 @@ namespace Server.Guilds
] ]
) )
{ {
m_Display = display; _display = display;
m_LowerText = lowerText; _lowerText = lowerText;
PopulateGump();
} }
protected virtual bool AllowAdvancedSearch => true; protected virtual bool AllowAdvancedSearch => true;
@ -96,7 +95,7 @@ namespace Server.Guilds
{ {
get get
{ {
if (m_Display == GuildDisplayType.All) if (_display == GuildDisplayType.All)
{ {
return base.WillFilter; return base.WillFilter;
} }
@ -105,25 +104,23 @@ namespace Server.Guilds
} }
} }
public override void PopulateGump() protected override void BuildListExtras(ref DynamicGumpBuilder builder)
{ {
base.PopulateGump(); builder.AddHtmlLocalized(431, 43, 110, 26, 1062978, 0xF); // Diplomacy
AddHtmlLocalized(431, 43, 110, 26, 1062978, 0xF); // Diplomacy
} }
protected override TextDefinition[] GetValuesFor(Guild g, int aryLength) protected override TextDefinition[] GetValuesFor(Guild g, int aryLength)
{ {
var defs = new TextDefinition[aryLength]; var defs = new TextDefinition[aryLength];
defs[0] = g == guild ? g.Name.Color(0x006600) : g.Name; defs[0] = g == Guild ? g.Name.Color(0x006600) : g.Name;
defs[1] = g.Abbreviation; defs[1] = g.Abbreviation;
defs[2] = 3000085; // Peace defs[2] = 3000085; // Peace
if (guild.IsAlly(g)) if (Guild.IsAlly(g))
{ {
if (guild.Alliance.Leader == g) if (Guild.Alliance.Leader == g)
{ {
defs[2] = 1063237; // Alliance Leader defs[2] = 1063237; // Alliance Leader
} }
@ -132,7 +129,7 @@ namespace Server.Guilds
defs[2] = 1062964; // Ally defs[2] = 1062964; // Ally
} }
} }
else if (guild.IsWar(g)) else if (Guild.IsWar(g))
{ {
defs[2] = 3000086; // War defs[2] = 3000086; // War
} }
@ -142,17 +139,17 @@ namespace Server.Guilds
public override bool HasRelationship(Guild g) public override bool HasRelationship(Guild g)
{ {
if (g == guild) if (g == Guild)
{ {
return false; return false;
} }
if (guild.FindPendingWar(g) != null) if (Guild.FindPendingWar(g) != null)
{ {
return true; return true;
} }
var alliance = guild.Alliance; var alliance = Guild.Alliance;
if (alliance != null) if (alliance != null)
{ {
@ -160,7 +157,7 @@ namespace Server.Guilds
if (leader != null) if (leader != null)
{ {
if (guild == leader && alliance.IsPendingMember(g) || g == leader && alliance.IsPendingMember(guild)) if (Guild == leader && alliance.IsPendingMember(g) || g == leader && alliance.IsPendingMember(Guild))
{ {
return true; return true;
} }
@ -174,25 +171,22 @@ namespace Server.Guilds
return false; return false;
} }
public override void DrawEndingEntry(int itemNumber) protected override void DrawEndingEntry(ref DynamicGumpBuilder builder, int itemNumber)
{ {
// AddHtmlLocalized( 66, 153 + itemNumber * 28, 280, 26, 1063136 + (int)m_Display, 0xF, false, false ); // Showing All Guilds/Awaiting Action/ w/Relation Ship if (_lowerText?.Number > 0)
// AddHtmlText( 66, 153 + itemNumber * 28, 280, 26, m_LowerText, false, false );
if (m_LowerText?.Number > 0)
{ {
AddHtmlLocalized(66, 153 + itemNumber * 28, 280, 26, m_LowerText.Number, 0xF); builder.AddHtmlLocalized(66, 153 + itemNumber * 28, 280, 26, _lowerText.Number, 0xF);
} }
else if (m_LowerText?.String != null) else if (_lowerText?.String != null)
{ {
AddHtml(66, 153 + itemNumber * 28, 280, 26, m_LowerText.String.Color(0x99)); builder.AddHtml(66, 153 + itemNumber * 28, 280, 26, _lowerText.String.Color(0x99));
} }
if (AllowAdvancedSearch) if (AllowAdvancedSearch)
{ {
AddBackground(350, 148 + itemNumber * 28, 200, 26, 0x2486); builder.AddBackground(350, 148 + itemNumber * 28, 200, 26, 0x2486);
AddButton(355, 153 + itemNumber * 28, 0x845, 0x846, 8); builder.AddButton(355, 153 + itemNumber * 28, 0x845, 0x846, 8);
AddHtmlLocalized(380, 151 + itemNumber * 28, 160, 26, 1063083, 0x0); // Advanced Search builder.AddHtmlLocalized(380, 151 + itemNumber * 28, 160, 26, 1063083, 0x0); // Advanced Search
} }
} }
@ -203,12 +197,12 @@ namespace Server.Guilds
return true; return true;
} }
switch (m_Display) switch (_display)
{ {
case GuildDisplayType.Relations: case GuildDisplayType.Relations:
{ {
// As per OSI, only the guild leader wars show up under the sorting by relation // As per OSI, only the guild leader wars show up under the sorting by relation
return !(guild.FindActiveWar(g) != null || guild.IsAlly(g)); return !(Guild.FindActiveWar(g) != null || Guild.IsAlly(g));
} }
case GuildDisplayType.AwaitingAction: case GuildDisplayType.AwaitingAction:
{ {
@ -219,15 +213,9 @@ namespace Server.Guilds
return !(g.Name.InsensitiveContains(filter) || g.Abbreviation.InsensitiveContains(filter)); return !(g.Name.InsensitiveContains(filter) || g.Abbreviation.InsensitiveContains(filter));
} }
public override Gump GetResentGump( public override BaseGump GetObjectInfoGump(PlayerMobile pm, Guild g, Guild o)
PlayerMobile pm, Guild g, IComparer<Guild> comparer, bool ascending,
string filter, int startNumber
) =>
new GuildDiplomacyGump(pm, g, comparer, ascending, filter, startNumber, m_Display);
public override Gump GetObjectInfoGump(PlayerMobile pm, Guild g, Guild o)
{ {
if (guild == o) if (Guild == o)
{ {
return new GuildInfoGump(pm, g); return new GuildInfoGump(pm, g);
} }
@ -239,20 +227,20 @@ namespace Server.Guilds
{ {
base.OnResponse(sender, info); base.OnResponse(sender, info);
if (sender.Mobile is not PlayerMobile pm || !IsMember(pm, guild)) if (sender.Mobile is not PlayerMobile pm || !IsMember(pm, Guild))
{ {
return; return;
} }
if (AllowAdvancedSearch && info.ButtonID == 8) if (AllowAdvancedSearch && info.ButtonID == 8)
{ {
pm.SendGump(new GuildAdvancedSearchGump(pm, guild, m_Display, AdvancedSearch_Callback)); pm.SendGump(new GuildAdvancedSearchGump(pm, Guild, _display, AdvancedSearch_Callback));
} }
} }
public void AdvancedSearch_Callback(GuildDisplayType display) public void AdvancedSearch_Callback(GuildDisplayType display)
{ {
m_Display = display; _display = display;
ResendGump(); ResendGump();
} }
@ -283,9 +271,9 @@ namespace Server.Guilds
private class StatusComparer : IComparer<Guild> private class StatusComparer : IComparer<Guild>
{ {
private readonly Guild m_Guild; private readonly Guild _guild;
public StatusComparer(Guild g) => m_Guild = g; public StatusComparer(Guild g) => _guild = g;
public int Compare(Guild x, Guild y) public int Compare(Guild x, Guild y)
{ {
@ -307,20 +295,20 @@ namespace Server.Guilds
var aStatus = GuildCompareStatus.Peace; var aStatus = GuildCompareStatus.Peace;
var bStatus = GuildCompareStatus.Peace; var bStatus = GuildCompareStatus.Peace;
if (m_Guild.IsAlly(x)) if (_guild.IsAlly(x))
{ {
aStatus = GuildCompareStatus.Ally; aStatus = GuildCompareStatus.Ally;
} }
else if (m_Guild.IsWar(x)) else if (_guild.IsWar(x))
{ {
aStatus = GuildCompareStatus.War; aStatus = GuildCompareStatus.War;
} }
if (m_Guild.IsAlly(y)) if (_guild.IsAlly(y))
{ {
bStatus = GuildCompareStatus.Ally; bStatus = GuildCompareStatus.Ally;
} }
else if (m_Guild.IsWar(y)) else if (_guild.IsWar(y))
{ {
bStatus = GuildCompareStatus.War; bStatus = GuildCompareStatus.War;
} }

View file

@ -8,81 +8,76 @@ namespace Server.Guilds
{ {
public class GuildInfoGump : BaseGuildGump public class GuildInfoGump : BaseGuildGump
{ {
private readonly bool m_IsResigning; private readonly bool _isResigning;
public GuildInfoGump(PlayerMobile pm, Guild g, bool isResigning = false) : base(pm, g) public GuildInfoGump(PlayerMobile pm, Guild g, bool isResigning = false) : base(pm, g) => _isResigning = isResigning;
protected override void BuildContent(ref DynamicGumpBuilder builder)
{ {
m_IsResigning = isResigning; var isLeader = IsLeader(Player, Guild);
PopulateGump();
}
public override void PopulateGump() builder.AddHtmlLocalized(96, 43, 110, 26, 1063014, 0xF); // My Guild
{
var isLeader = IsLeader(player, guild);
base.PopulateGump();
AddHtmlLocalized(96, 43, 110, 26, 1063014, 0xF); // My Guild builder.AddImageTiled(65, 80, 160, 26, 0xA40);
builder.AddImageTiled(67, 82, 156, 22, 0xBBC);
builder.AddHtmlLocalized(70, 83, 150, 20, 1062954, 0x0); // <i>Guild Name</i>
builder.AddHtml(233, 84, 320, 26, Guild.Name);
AddImageTiled(65, 80, 160, 26, 0xA40); builder.AddImageTiled(65, 114, 160, 26, 0xA40);
AddImageTiled(67, 82, 156, 22, 0xBBC); builder.AddImageTiled(67, 116, 156, 22, 0xBBC);
AddHtmlLocalized(70, 83, 150, 20, 1062954, 0x0); // <i>Guild Name</i> builder.AddHtmlLocalized(70, 117, 150, 20, 1063025, 0x0); // <i>Alliance</i>
AddHtml(233, 84, 320, 26, guild.Name);
AddImageTiled(65, 114, 160, 26, 0xA40); if (Guild.Alliance?.IsMember(Guild) == true)
AddImageTiled(67, 116, 156, 22, 0xBBC);
AddHtmlLocalized(70, 117, 150, 20, 1063025, 0x0); // <i>Alliance</i>
if (guild.Alliance?.IsMember(guild) == true)
{ {
AddHtml(233, 118, 320, 26, guild.Alliance.Name); builder.AddHtml(233, 118, 320, 26, Guild.Alliance.Name);
AddButton(40, 120, 0x4B9, 0x4BA, 6); // Alliance Roster builder.AddButton(40, 120, 0x4B9, 0x4BA, 6); // Alliance Roster
} }
if (Guild.OrderChaos && isLeader) if (Guild.OrderChaos && isLeader)
{ {
AddButton(40, 154, 0x4B9, 0x4BA, 100); // Guild Faction builder.AddButton(40, 154, 0x4B9, 0x4BA, 100); // Guild Faction
} }
AddImageTiled(65, 148, 160, 26, 0xA40); builder.AddImageTiled(65, 148, 160, 26, 0xA40);
AddImageTiled(67, 150, 156, 22, 0xBBC); builder.AddImageTiled(67, 150, 156, 22, 0xBBC);
AddHtmlLocalized(70, 151, 150, 20, 1063084, 0x0); // <i>Guild Faction</i> builder.AddHtmlLocalized(70, 151, 150, 20, 1063084, 0x0); // <i>Guild Faction</i>
GuildType gt; GuildType gt;
Faction f; Faction f;
if ((gt = guild.Type) != GuildType.Regular) if ((gt = Guild.Type) != GuildType.Regular)
{ {
AddHtml(233, 152, 320, 26, gt.ToString()); builder.AddHtml(233, 152, 320, 26, $"{gt}");
} }
else if ((f = Faction.Find(guild.Leader)) != null) else if ((f = Faction.Find(Guild.Leader)) != null)
{ {
AddHtml(233, 152, 320, 26, f.ToString()); builder.AddHtml(233, 152, 320, 26, $"{f}");
} }
AddImageTiled(65, 196, 480, 4, 0x238D); builder.AddImageTiled(65, 196, 480, 4, 0x238D);
var s = guild.Charter.DefaultIfNullOrEmpty("The guild leader has not yet set the guild charter."); var s = Guild.Charter.DefaultIfNullOrEmpty("The guild leader has not yet set the guild charter.");
AddHtml(65, 216, 480, 80, s, true, true); builder.AddHtml(65, 216, 480, 80, s, background: true, scrollbar: true);
if (isLeader) if (isLeader)
{ {
AddButton(40, 251, 0x4B9, 0x4BA, 4); // Charter Edit button builder.AddButton(40, 251, 0x4B9, 0x4BA, 4); // Charter Edit button
} }
s = guild.Website.DefaultIfNullOrEmpty("Guild website not yet set."); s = Guild.Website.DefaultIfNullOrEmpty("Guild website not yet set.");
AddHtml(65, 306, 480, 30, s, true); builder.AddHtml(65, 306, 480, 30, s, background: true);
if (isLeader) if (isLeader)
{ {
AddButton(40, 313, 0x4B9, 0x4BA, 5); // Website Edit button builder.AddButton(40, 313, 0x4B9, 0x4BA, 5); // Website Edit button
} }
AddCheck(65, 370, 0xD2, 0xD3, player.DisplayGuildTitle, 0); builder.AddCheckbox(65, 370, 0xD2, 0xD3, Player.DisplayGuildTitle, 0);
AddHtmlLocalized(95, 370, 150, 26, 1063085, 0x0); // Show Guild Title builder.AddHtmlLocalized(95, 370, 150, 26, 1063085, 0x0); // Show Guild Title
AddBackground(450, 370, 100, 26, 0x2486); builder.AddBackground(450, 370, 100, 26, 0x2486);
AddButton(455, 375, 0x845, 0x846, 7); builder.AddButton(455, 375, 0x845, 0x846, 7);
AddHtmlLocalized(480, 373, 60, 26, 3006115, m_IsResigning ? 0x5000 : 0); // Resign builder.AddHtmlLocalized(480, 373, 60, 26, 3006115, _isResigning ? 0x5000 : 0); // Resign
} }
public override void OnResponse(NetState sender, in RelayInfo info) public override void OnResponse(NetState sender, in RelayInfo info)
@ -91,7 +86,7 @@ namespace Server.Guilds
var pm = (PlayerMobile)sender.Mobile; var pm = (PlayerMobile)sender.Mobile;
if (!IsMember(pm, guild)) if (!IsMember(pm, Guild))
{ {
return; return;
} }
@ -103,27 +98,23 @@ namespace Server.Guilds
// 1-3 handled by base.OnResponse // 1-3 handled by base.OnResponse
case 4: case 4:
{ {
if (IsLeader(pm, guild)) if (IsLeader(pm, Guild))
{ {
pm.SendLocalizedMessage(1013071); // Enter the new guild charter (50 characters max): pm.SendLocalizedMessage(1013071); // Enter the new guild charter (50 characters max):
pm.BeginPrompt( // Have the same callback handle both canceling and deletion cause the 2nd callback would
SetCharter_Callback, // just get a text of ""
true pm.BeginPrompt(SetCharter_Callback, true);
); // Have the same callback handle both canceling and deletion cause the 2nd callback would just get a text of ""
} }
break; break;
} }
case 5: case 5:
{ {
if (IsLeader(pm, guild)) if (IsLeader(pm, Guild))
{ {
pm.SendLocalizedMessage(1013072); // Enter the new website for the guild (50 characters max): pm.SendLocalizedMessage(1013072); // Enter the new website for the guild (50 characters max):
pm.BeginPrompt( pm.BeginPrompt(SetWebsite_Callback, true);
SetWebsite_Callback,
true
); // Have the same callback handle both canceling and deletion cause the 2nd callback would just get a text of ""
} }
break; break;
@ -131,9 +122,9 @@ namespace Server.Guilds
case 6: case 6:
{ {
// Alliance Roster // Alliance Roster
if (guild.Alliance?.IsMember(guild) == true) if (Guild.Alliance?.IsMember(Guild) == true)
{ {
pm.SendGump(new AllianceInfo.AllianceRosterGump(pm, guild, guild.Alliance)); pm.SendGump(new AllianceInfo.AllianceRosterGump(pm, Guild, Guild.Alliance));
} }
break; break;
@ -141,14 +132,14 @@ namespace Server.Guilds
case 7: case 7:
{ {
// Resign // Resign
if (!m_IsResigning) if (!_isResigning)
{ {
pm.SendLocalizedMessage(1063332); // Are you sure you wish to resign from your guild? pm.SendLocalizedMessage(1063332); // Are you sure you wish to resign from your guild?
pm.SendGump(new GuildInfoGump(pm, guild, true)); pm.SendGump(new GuildInfoGump(pm, Guild, true));
} }
else else
{ {
guild.RemoveMember(pm, 1063411); // You resign from your guild. Guild.RemoveMember(pm, 1063411); // You resign from your guild.
} }
break; break;
@ -156,9 +147,9 @@ namespace Server.Guilds
case 100: // Custom code to support Order/Chaos in the new guild system case 100: // Custom code to support Order/Chaos in the new guild system
{ {
// Guild Faction // Guild Faction
if (Guild.OrderChaos && IsLeader(pm, guild)) if (Guild.OrderChaos && IsLeader(pm, Guild))
{ {
GuildChangeTypeGump.DisplayTo(pm, guild); GuildChangeTypeGump.DisplayTo(pm, Guild);
} }
break; break;
@ -168,7 +159,7 @@ namespace Server.Guilds
public void SetCharter_Callback(Mobile from, string text) public void SetCharter_Callback(Mobile from, string text)
{ {
if (!IsLeader(from, guild)) if (!IsLeader(from, Guild))
{ {
return; return;
} }
@ -181,14 +172,14 @@ namespace Server.Guilds
} }
else else
{ {
guild.Charter = charter; Guild.Charter = charter;
from.SendLocalizedMessage(1070775); // You submit a new guild charter. from.SendLocalizedMessage(1070775); // You submit a new guild charter.
} }
} }
public void SetWebsite_Callback(Mobile from, string text) public void SetWebsite_Callback(Mobile from, string text)
{ {
if (!IsLeader(from, guild)) if (!IsLeader(from, Guild))
{ {
return; return;
} }
@ -201,7 +192,7 @@ namespace Server.Guilds
} }
else else
{ {
guild.Website = site; Guild.Website = site;
from.SendLocalizedMessage(1070778); // You submit a new guild website. from.SendLocalizedMessage(1070778); // You submit a new guild website.
} }
} }

View file

@ -6,39 +6,30 @@ namespace Server.Guilds
{ {
public class GuildInvitationRequest : BaseGuildGump public class GuildInvitationRequest : BaseGuildGump
{ {
private readonly PlayerMobile m_Inviter; private readonly PlayerMobile _inviter;
public GuildInvitationRequest(PlayerMobile pm, Guild g, PlayerMobile inviter) : base(pm, g) public GuildInvitationRequest(PlayerMobile pm, Guild g, PlayerMobile inviter) : base(pm, g)
{ {
m_Inviter = inviter; _inviter = inviter;
PopulateGump();
} }
public override void PopulateGump() protected override bool ShowTabStrip => false;
{
AddPage(0);
AddBackground(0, 0, 350, 170, 0x2422); protected override void BuildContent(ref DynamicGumpBuilder builder)
AddHtmlLocalized( {
25, builder.AddBackground(0, 0, 350, 170, 0x2422);
20, // <center>You have been invited to join a guild! (Warning: Accepting will make you attackable!)</center>
300, builder.AddHtmlLocalized(25, 20, 300, 45, 1062946, 0x0, true);
45, builder.AddHtml(25, 75, 300, 25, $"<center>{Guild.Name}</center>", background: true);
1062946, builder.AddButton(265, 130, 0xF7, 0xF8, 1);
0x0, builder.AddButton(195, 130, 0xF2, 0xF1, 0);
true builder.AddButton(20, 130, 0xD2, 0xD3, 2);
); // <center>You have been invited to join a guild! (Warning: Accepting will make you attackable!)</center> builder.AddHtmlLocalized(45, 130, 150, 30, 1062943, 0x0); // <i>Ignore Guild Invites</i>
AddHtml(25, 75, 300, 25, $"<center>{guild.Name}</center>", true);
AddButton(265, 130, 0xF7, 0xF8, 1);
AddButton(195, 130, 0xF2, 0xF1, 0);
AddButton(20, 130, 0xD2, 0xD3, 2);
AddHtmlLocalized(45, 130, 150, 30, 1062943, 0x0); // <i>Ignore Guild Invites</i>
} }
public override void OnResponse(NetState sender, in RelayInfo info) public override void OnResponse(NetState sender, in RelayInfo info)
{ {
if (guild.Disbanded || player.Guild != null) if (Guild.Disbanded || Player.Guild != null)
{ {
return; return;
} }
@ -47,27 +38,23 @@ namespace Server.Guilds
{ {
case 0: case 0:
{ {
m_Inviter.SendLocalizedMessage( // ~1_val~ has declined your invitation to join ~2_val~.
1063250, _inviter.SendLocalizedMessage(1063250, $"{Player.Name}\t{Guild.Name}");
$"{player.Name}\t{guild.Name}"
); // ~1_val~ has declined your invitation to join ~2_val~.
break; break;
} }
case 1: case 1:
{ {
guild.AddMember(player); Guild.AddMember(Player);
player.SendLocalizedMessage(1063056, guild.Name); // You have joined ~1_val~. Player.SendLocalizedMessage(1063056, Guild.Name); // You have joined ~1_val~.
m_Inviter.SendLocalizedMessage( // ~1_val~ has accepted your invitation to join ~2_val~.
1063249, _inviter.SendLocalizedMessage(1063249, $"{Player.Name}\t{Guild.Name}");
$"{player.Name}\t{guild.Name}"
); // ~1_val~ has accepted your invitation to join ~2_val~.
break; break;
} }
case 2: case 2:
{ {
player.AcceptGuildInvites = false; Player.AcceptGuildInvites = false;
player.SendLocalizedMessage(1070698); // You are now ignoring guild invitations. Player.SendLocalizedMessage(1070698); // You are now ignoring guild invitations.
break; break;
} }

View file

@ -7,75 +7,74 @@ namespace Server.Guilds
{ {
public class GuildMemberInfoGump : BaseGuildGump public class GuildMemberInfoGump : BaseGuildGump
{ {
private readonly PlayerMobile m_Member; private readonly PlayerMobile _member;
private readonly bool m_toKick; private readonly bool _toKick;
private readonly bool m_ToLeader; private readonly bool _toLeader;
public GuildMemberInfoGump( public GuildMemberInfoGump(
PlayerMobile pm, Guild g, PlayerMobile member, bool toKick, bool toPromoteToLeader PlayerMobile pm, Guild g, PlayerMobile member, bool toKick, bool toPromoteToLeader
) : base(pm, g, 10, 40) ) : base(pm, g, 10, 40)
{ {
m_ToLeader = toPromoteToLeader; _toLeader = toPromoteToLeader;
m_toKick = toKick; _toKick = toKick;
m_Member = member; _member = member;
PopulateGump();
} }
public override void PopulateGump() protected override bool ShowTabStrip => false;
protected override void BuildContent(ref DynamicGumpBuilder builder)
{ {
AddPage(0); builder.AddBackground(0, 0, 350, 255, 0x242C);
builder.AddHtmlLocalized(20, 15, 310, 26, 1063018, 0x0); // <div align=center><i>Guild Member Information</i></div>
builder.AddImageTiled(20, 40, 310, 2, 0x2711);
AddBackground(0, 0, 350, 255, 0x242C); builder.AddHtmlLocalized(20, 50, 150, 26, 1062955, 0x0, true); // <i>Name</i>
AddHtmlLocalized(20, 15, 310, 26, 1063018, 0x0); // <div align=center><i>Guild Member Information</i></div> builder.AddHtml(180, 53, 150, 26, _member.Name);
AddImageTiled(20, 40, 310, 2, 0x2711);
AddHtmlLocalized(20, 50, 150, 26, 1062955, 0x0, true); // <i>Name</i> builder.AddHtmlLocalized(20, 80, 150, 26, 1062956, 0x0, true); // <i>Rank</i>
AddHtml(180, 53, 150, 26, m_Member.Name); builder.AddHtmlLocalized(180, 83, 150, 26, _member.GuildRank.Name, 0x0);
AddHtmlLocalized(20, 80, 150, 26, 1062956, 0x0, true); // <i>Rank</i> builder.AddHtmlLocalized(20, 110, 150, 26, 1062953, 0x0, true); // <i>Guild Title</i>
AddHtmlLocalized(180, 83, 150, 26, m_Member.GuildRank.Name, 0x0); builder.AddHtml(180, 113, 150, 26, _member.GuildTitle);
builder.AddImageTiled(20, 142, 310, 2, 0x2711);
AddHtmlLocalized(20, 110, 150, 26, 1062953, 0x0, true); // <i>Guild Title</i> builder.AddBackground(20, 150, 310, 26, 0x2486);
AddHtml(180, 113, 150, 26, m_Member.GuildTitle); builder.AddButton(25, 155, 0x845, 0x846, 4);
AddImageTiled(20, 142, 310, 2, 0x2711); builder.AddHtmlLocalized(
AddBackground(20, 150, 310, 26, 0x2486);
AddButton(25, 155, 0x845, 0x846, 4);
AddHtmlLocalized(
50, 50,
153, 153,
270, 270,
26, 26,
m_Member == player.GuildFealty && guild.Leader != m_Member ? 1063082 : 1062996, _member == Player.GuildFealty && Guild.Leader != _member ? 1063082 : 1062996,
0x0 0x0
); // Clear/Cast Vote For This Member ); // Clear/Cast Vote For This Member
AddBackground(20, 180, 150, 26, 0x2486); builder.AddBackground(20, 180, 150, 26, 0x2486);
AddButton(25, 185, 0x845, 0x846, 1); builder.AddButton(25, 185, 0x845, 0x846, 1);
AddHtmlLocalized(50, 183, 110, 26, 1062993, m_ToLeader ? 0x990000 : 0); // Promote builder.AddHtmlLocalized(50, 183, 110, 26, 1062993, _toLeader ? 0x990000 : 0); // Promote
AddBackground(180, 180, 150, 26, 0x2486); builder.AddBackground(180, 180, 150, 26, 0x2486);
AddButton(185, 185, 0x845, 0x846, 3); builder.AddButton(185, 185, 0x845, 0x846, 3);
AddHtmlLocalized(210, 183, 110, 26, 1062995, 0x0); // Set Guild Title builder.AddHtmlLocalized(210, 183, 110, 26, 1062995, 0x0); // Set Guild Title
AddBackground(20, 210, 150, 26, 0x2486); builder.AddBackground(20, 210, 150, 26, 0x2486);
AddButton(25, 215, 0x845, 0x846, 2); builder.AddButton(25, 215, 0x845, 0x846, 2);
AddHtmlLocalized(50, 213, 110, 26, 1062994, 0x0); // Demote builder.AddHtmlLocalized(50, 213, 110, 26, 1062994, 0x0); // Demote
AddBackground(180, 210, 150, 26, 0x2486); builder.AddBackground(180, 210, 150, 26, 0x2486);
AddButton(185, 215, 0x845, 0x846, 5); builder.AddButton(185, 215, 0x845, 0x846, 5);
AddHtmlLocalized(210, 213, 110, 26, 1062997, m_toKick ? 0x5000 : 0); // Kick builder.AddHtmlLocalized(210, 213, 110, 26, 1062997, _toKick ? 0x5000 : 0); // Kick
} }
public override void OnResponse(NetState sender, in RelayInfo info) public override void OnResponse(NetState sender, in RelayInfo info)
{ {
if (sender.Mobile is not PlayerMobile pm || !IsMember(pm, guild) || !IsMember(m_Member, guild)) if (sender.Mobile is not PlayerMobile pm || !IsMember(pm, Guild) || !IsMember(_member, Guild))
{ {
return; return;
} }
var playerRank = pm.GuildRank; var playerRank = pm.GuildRank;
var targetRank = m_Member.GuildRank; var targetRank = _member.GuildRank;
switch (info.ButtonID) switch (info.ButtonID)
{ {
@ -89,34 +88,26 @@ namespace Server.Guilds
if (targetRank == RankDefinition.Leader) if (targetRank == RankDefinition.Leader)
{ {
if (m_ToLeader) if (_toLeader)
{ {
m_Member.GuildRank = targetRank; _member.GuildRank = targetRank;
pm.SendLocalizedMessage( // The guild information for ~1_val~ has been updated.
1063156, pm.SendLocalizedMessage(1063156, _member.Name);
m_Member.Name pm.SendLocalizedMessage(1063156, pm.Name);
); // The guild information for ~1_val~ has been updated. Guild.Leader = _member;
pm.SendLocalizedMessage(
1063156,
pm.Name
); // The guild information for ~1_val~ has been updated.
guild.Leader = m_Member;
} }
else else
{ {
pm.SendLocalizedMessage( // Are you sure you wish to make this member the new guild leader?
1063144 pm.SendLocalizedMessage(1063144);
); // Are you sure you wish to make this member the new guild leader? pm.SendGump(new GuildMemberInfoGump(Player, Guild, _member, false, true));
pm.SendGump(new GuildMemberInfoGump(player, guild, m_Member, false, true));
} }
} }
else else
{ {
m_Member.GuildRank = targetRank; _member.GuildRank = targetRank;
pm.SendLocalizedMessage( // The guild information for ~1_val~ has been updated.
1063156, pm.SendLocalizedMessage(1063156, _member.Name);
m_Member.Name
); // The guild information for ~1_val~ has been updated.
} }
} }
else else
@ -143,11 +134,9 @@ namespace Server.Guilds
} }
else else
{ {
m_Member.GuildRank = RankDefinition.Ranks[targetRank.Rank - 1]; _member.GuildRank = RankDefinition.Ranks[targetRank.Rank - 1];
pm.SendLocalizedMessage( // The guild information for ~1_val~ has been updated.
1063156, pm.SendLocalizedMessage(1063156, _member.Name);
m_Member.Name
); // The guild information for ~1_val~ has been updated.
} }
} }
else else
@ -160,52 +149,47 @@ namespace Server.Guilds
case 3: // Set Guild title case 3: // Set Guild title
{ {
if (playerRank.GetFlag(RankFlags.CanSetGuildTitle) && if (playerRank.GetFlag(RankFlags.CanSetGuildTitle) &&
(playerRank.Rank > targetRank.Rank || m_Member == player)) (playerRank.Rank > targetRank.Rank || _member == Player))
{ {
pm.SendLocalizedMessage( // Enter the new title for this guild member or 'none' to remove a title:
1011128 pm.SendLocalizedMessage(1011128);
); // Enter the new title for this guild member or 'none' to remove a title:
pm.BeginPrompt(SetTitle_Callback); pm.BeginPrompt(SetTitle_Callback);
} }
else if (m_Member.GuildTitle == null || m_Member.GuildTitle.Length <= 0) else if (_member.GuildTitle == null || _member.GuildTitle.Length <= 0)
{ {
pm.SendLocalizedMessage( // You don't have the permission to set that member's guild title.
1070746 pm.SendLocalizedMessage(1070746);
); // You don't have the permission to set that member's guild title.
} }
else else
{ {
pm.SendLocalizedMessage( // You don't have permission to change this member's guild title.
1063148 pm.SendLocalizedMessage(1063148);
); // You don't have permission to change this member's guild title.
} }
break; break;
} }
case 4: // Vote case 4: // Vote
{ {
if (m_Member == pm.GuildFealty && guild.Leader != m_Member) if (_member == pm.GuildFealty && Guild.Leader != _member)
{ {
pm.SendLocalizedMessage(1063158); // You have cleared your vote for guild leader. pm.SendLocalizedMessage(1063158); // You have cleared your vote for guild leader.
} }
else if (guild.CanVote(m_Member)) else if (Guild.CanVote(_member))
{ {
if (m_Member == guild.Leader) if (_member == Guild.Leader)
{ {
pm.SendLocalizedMessage(1063424); // You can't vote for the current guild leader. pm.SendLocalizedMessage(1063424); // You can't vote for the current guild leader.
} }
else if (!guild.CanBeVotedFor(m_Member)) else if (!Guild.CanBeVotedFor(_member))
{ {
pm.SendLocalizedMessage(1063425); // You can't vote for an inactive guild member. pm.SendLocalizedMessage(1063425); // You can't vote for an inactive guild member.
} }
else else
{ {
pm.GuildFealty = m_Member; pm.GuildFealty = _member;
pm.SendLocalizedMessage( // You cast your vote for ~1_val~ for guild leader.
1063159, pm.SendLocalizedMessage(1063159, _member.Name);
m_Member.Name
); // You cast your vote for ~1_val~ for guild leader.
} }
} }
else else
@ -220,17 +204,16 @@ namespace Server.Guilds
if (playerRank.GetFlag(RankFlags.RemovePlayers) && playerRank.Rank > targetRank.Rank || if (playerRank.GetFlag(RankFlags.RemovePlayers) && playerRank.Rank > targetRank.Rank ||
playerRank.GetFlag(RankFlags.RemoveLowestRank) && targetRank == RankDefinition.Lowest) playerRank.GetFlag(RankFlags.RemoveLowestRank) && targetRank == RankDefinition.Lowest)
{ {
if (m_toKick) if (_toKick)
{ {
guild.RemoveMember(m_Member); Guild.RemoveMember(_member);
pm.SendLocalizedMessage(1063157); // The member has been removed from your guild. pm.SendLocalizedMessage(1063157); // The member has been removed from your guild.
} }
else else
{ {
pm.SendLocalizedMessage( // Are you sure you wish to kick this member from the guild?
1063152 pm.SendLocalizedMessage(1063152);
); // Are you sure you wish to kick this member from the guild? pm.SendGump(new GuildMemberInfoGump(Player, Guild, _member, true, false));
pm.SendGump(new GuildMemberInfoGump(player, guild, m_Member, true, false));
} }
} }
else else
@ -245,22 +228,24 @@ namespace Server.Guilds
public void SetTitle_Callback(Mobile from, string text) public void SetTitle_Callback(Mobile from, string text)
{ {
if (from is not PlayerMobile pm || m_Member == null) if (from is not PlayerMobile pm || _member == null)
{ {
return; return;
} }
if (m_Member.Guild is not Guild g || !IsMember(pm, g) || if (_member.Guild is not Guild g || !IsMember(pm, g) ||
!(pm.GuildRank.GetFlag(RankFlags.CanSetGuildTitle) && !(pm.GuildRank.GetFlag(RankFlags.CanSetGuildTitle) &&
(pm.GuildRank.Rank > m_Member.GuildRank.Rank || pm == m_Member))) (pm.GuildRank.Rank > _member.GuildRank.Rank || pm == _member)))
{ {
if (m_Member.GuildTitle == null || m_Member.GuildTitle.Length <= 0) if (_member.GuildTitle == null || _member.GuildTitle.Length <= 0)
{ {
pm.SendLocalizedMessage(1070746); // You don't have the permission to set that member's guild title. // You don't have the permission to set that member's guild title.
pm.SendLocalizedMessage(1070746);
} }
else else
{ {
pm.SendLocalizedMessage(1063148); // You don't have permission to change this member's guild title. // You don't have permission to change this member's guild title.
pm.SendLocalizedMessage(1063148);
} }
return; return;
@ -278,16 +263,10 @@ namespace Server.Guilds
} }
else else
{ {
if (title.InsensitiveEquals("none")) _member.GuildTitle = title.InsensitiveEquals("none") ? null : title;
{
m_Member.GuildTitle = null;
}
else
{
m_Member.GuildTitle = title;
}
pm.SendLocalizedMessage(1063156, m_Member.Name); // The guild information for ~1_val~ has been updated. // The guild information for ~1_val~ has been updated.
pm.SendLocalizedMessage(1063156, _member.Name);
} }
} }
} }

View file

@ -9,7 +9,7 @@ namespace Server.Guilds
{ {
public class GuildRosterGump : BaseGuildListGump<PlayerMobile> public class GuildRosterGump : BaseGuildListGump<PlayerMobile>
{ {
private static readonly InfoField<PlayerMobile>[] m_Fields = private static readonly InfoField<PlayerMobile>[] _fields =
[ [
new(1062955, 130, NameComparer.Instance), // Name new(1062955, 130, NameComparer.Instance), // Name
new(1062956, 80, RankComparer.Instance), // Rank new(1062956, 80, RankComparer.Instance), // Rank
@ -33,33 +33,30 @@ namespace Server.Guilds
ascending, ascending,
filter, filter,
startNumber, startNumber,
m_Fields _fields
) )
{ {
PopulateGump();
} }
public override void PopulateGump() protected override void BuildListExtras(ref DynamicGumpBuilder builder)
{ {
base.PopulateGump(); builder.AddHtmlLocalized(266, 43, 110, 26, 1062974, 0xF); // Guild Roster
AddHtmlLocalized(266, 43, 110, 26, 1062974, 0xF); // Guild Roster
} }
public override void DrawEndingEntry(int itemNumber) protected override void DrawEndingEntry(ref DynamicGumpBuilder builder, int itemNumber)
{ {
AddBackground(225, 148 + itemNumber * 28, 150, 26, 0x2486); builder.AddBackground(225, 148 + itemNumber * 28, 150, 26, 0x2486);
AddButton(230, 153 + itemNumber * 28, 0x845, 0x846, 8); builder.AddButton(230, 153 + itemNumber * 28, 0x845, 0x846, 8);
AddHtmlLocalized(255, 151 + itemNumber * 28, 110, 26, 1062992, 0x0); // Invite Player builder.AddHtmlLocalized(255, 151 + itemNumber * 28, 110, 26, 1062992, 0x0); // Invite Player
} }
protected override TextDefinition[] GetValuesFor(PlayerMobile pm, int aryLength) protected override TextDefinition[] GetValuesFor(PlayerMobile pm, int aryLength)
{ {
var defs = new TextDefinition[aryLength]; var defs = new TextDefinition[aryLength];
var name = $"{pm.Name}{(player.GuildFealty == pm && player.GuildFealty != guild.Leader ? " *" : "")}"; var name = $"{pm.Name}{(Player.GuildFealty == pm && Player.GuildFealty != Guild.Leader ? " *" : "")}";
if (pm == player) if (pm == Player)
{ {
name = name.Color(0x006600); name = name.Color(0x006600);
} }
@ -86,20 +83,14 @@ namespace Server.Guilds
return !pm.Name.InsensitiveContains(filter); return !pm.Name.InsensitiveContains(filter);
} }
public override Gump GetResentGump( public override BaseGump GetObjectInfoGump(PlayerMobile pm, Guild g, PlayerMobile o) =>
PlayerMobile pm, Guild g, IComparer<PlayerMobile> comparer, bool ascending,
string filter, int startNumber
) =>
new GuildRosterGump(pm, g, comparer, ascending, filter, startNumber);
public override Gump GetObjectInfoGump(PlayerMobile pm, Guild g, PlayerMobile o) =>
new GuildMemberInfoGump(pm, g, o, false, false); new GuildMemberInfoGump(pm, g, o, false, false);
public override void OnResponse(NetState sender, in RelayInfo info) public override void OnResponse(NetState sender, in RelayInfo info)
{ {
base.OnResponse(sender, info); base.OnResponse(sender, info);
if (sender.Mobile is not PlayerMobile pm || !IsMember(pm, guild)) if (sender.Mobile is not PlayerMobile pm || !IsMember(pm, Guild))
{ {
return; return;
} }
@ -109,7 +100,7 @@ namespace Server.Guilds
if (pm.GuildRank.GetFlag(RankFlags.CanInvitePlayer)) if (pm.GuildRank.GetFlag(RankFlags.CanInvitePlayer))
{ {
pm.SendLocalizedMessage(1063048); // Whom do you wish to invite into your guild? pm.SendLocalizedMessage(1063048); // Whom do you wish to invite into your guild?
pm.BeginTarget(-1, false, TargetFlags.None, InvitePlayer_Callback, guild); pm.BeginTarget(-1, false, TargetFlags.None, InvitePlayer_Callback, Guild);
} }
else else
{ {
@ -129,7 +120,7 @@ namespace Server.Guilds
var guildFaction = guildState?.Faction; var guildFaction = guildState?.Faction;
var targetFaction = targetState?.Faction; var targetFaction = targetState?.Faction;
if (pm == null || !IsMember(pm, guild) || !pm.GuildRank.GetFlag(RankFlags.CanInvitePlayer)) if (pm == null || !IsMember(pm, Guild) || !pm.GuildRank.GetFlag(RankFlags.CanInvitePlayer))
{ {
from.SendLocalizedMessage(503301); // You don't have permission to do that. from.SendLocalizedMessage(503301); // You don't have permission to do that.
} }
@ -181,7 +172,7 @@ namespace Server.Guilds
else else
{ {
pm.SendLocalizedMessage(1063053, targ.Name); // You invite ~1_val~ to join your guild. pm.SendLocalizedMessage(1063053, targ.Name); // You invite ~1_val~ to join your guild.
targ.SendGump(new GuildInvitationRequest(targ, guild, pm)); targ.SendGump(new GuildInvitationRequest(targ, Guild, pm));
} }
} }

View file

@ -8,55 +8,55 @@ namespace Server.Guilds
{ {
public class OtherGuildInfo : BaseGuildGump public class OtherGuildInfo : BaseGuildGump
{ {
private readonly Guild m_Other; private readonly Guild _other;
public OtherGuildInfo(PlayerMobile pm, Guild g, Guild otherGuild) : base(pm, g, 10, 40) public OtherGuildInfo(PlayerMobile pm, Guild g, Guild otherGuild) : base(pm, g, 10, 40)
{ {
m_Other = otherGuild; _other = otherGuild;
g.CheckExpiredWars(); g.CheckExpiredWars();
PopulateGump();
} }
public void AddButtonAndBackground(int x, int y, int buttonID, int locNum) protected override bool ShowTabStrip => false;
private static void AddButtonAndBackground(ref DynamicGumpBuilder builder, int x, int y, int buttonID, int locNum)
{ {
AddBackground(x, y, 225, 26, 0x2486); builder.AddBackground(x, y, 225, 26, 0x2486);
AddButton(x + 5, y + 5, 0x845, 0x846, buttonID); builder.AddButton(x + 5, y + 5, 0x845, 0x846, buttonID);
AddHtmlLocalized(x + 30, y + 3, 185, 26, locNum, 0x0); builder.AddHtmlLocalized(x + 30, y + 3, 185, 26, locNum, 0x0);
} }
public override void PopulateGump() protected override void BuildContent(ref DynamicGumpBuilder builder)
{ {
var g = Guild.GetAllianceLeader(guild); builder.AddBackground(0, 0, 520, 335, 0x242C);
var other = Guild.GetAllianceLeader(m_Other);
var g = Guild.GetAllianceLeader(Guild);
var other = Guild.GetAllianceLeader(_other);
var war = g.FindPendingWar(other); var war = g.FindPendingWar(other);
var activeWar = g.FindActiveWar(other); var activeWar = g.FindActiveWar(other);
var alliance = guild.Alliance; var alliance = Guild.Alliance;
var otherAlliance = m_Other.Alliance; var otherAlliance = _other.Alliance;
// NOTE TO SELF: Only only alliance leader can see pending guild alliance statuses // NOTE TO SELF: Only only alliance leader can see pending guild alliance statuses
var PendingWar = war != null; var pendingWar = war != null;
var ActiveWar = activeWar != null; var activeWarFlag = activeWar != null;
AddPage(0);
AddBackground(0, 0, 520, 335, 0x242C); builder.AddHtmlLocalized(20, 15, 480, 26, 1062975, 0x0); // <div align=center><i>Guild Relationship</i></div>
AddHtmlLocalized(20, 15, 480, 26, 1062975, 0x0); // <div align=center><i>Guild Relationship</i></div> builder.AddImageTiled(20, 40, 480, 2, 0x2711);
AddImageTiled(20, 40, 480, 2, 0x2711); builder.AddHtmlLocalized(20, 50, 120, 26, 1062954, 0x0, true); // <i>Guild Name</i>
AddHtmlLocalized(20, 50, 120, 26, 1062954, 0x0, true); // <i>Guild Name</i> builder.AddHtml(150, 53, 360, 26, _other.Name);
AddHtml(150, 53, 360, 26, m_Other.Name);
AddHtmlLocalized(20, 80, 120, 26, 1063025, 0x0, true); // <i>Alliance</i> builder.AddHtmlLocalized(20, 80, 120, 26, 1063025, 0x0, true); // <i>Alliance</i>
if (otherAlliance?.IsMember(m_Other) == true) if (otherAlliance?.IsMember(_other) == true)
{ {
AddHtml(150, 83, 360, 26, otherAlliance.Name); builder.AddHtml(150, 83, 360, 26, otherAlliance.Name);
} }
AddHtmlLocalized(20, 110, 120, 26, 1063139, 0x0, true); // <i>Abbreviation</i> builder.AddHtmlLocalized(20, 110, 120, 26, 1063139, 0x0, true); // <i>Abbreviation</i>
AddHtml(150, 113, 120, 26, m_Other.Abbreviation); builder.AddHtml(150, 113, 120, 26, _other.Abbreviation);
var kills = "0/0"; var kills = "0/0";
var time = "00:00"; var time = "00:00";
@ -64,7 +64,7 @@ namespace Server.Guilds
WarDeclaration otherWar; WarDeclaration otherWar;
if (ActiveWar) if (activeWarFlag)
{ {
kills = $"{activeWar.Kills}/{activeWar.MaxKills}"; kills = $"{activeWar.Kills}/{activeWar.MaxKills}";
@ -77,38 +77,38 @@ namespace Server.Guilds
time = $"{timeRemaining.Hours:D2}:{DateTime.MinValue + timeRemaining:mm}"; time = $"{timeRemaining.Hours:D2}:{DateTime.MinValue + timeRemaining:mm}";
otherWar = m_Other.FindActiveWar(guild); otherWar = _other.FindActiveWar(Guild);
if (otherWar != null) if (otherWar != null)
{ {
otherKills = $"{otherWar.Kills}/{otherWar.MaxKills}"; otherKills = $"{otherWar.Kills}/{otherWar.MaxKills}";
} }
} }
else if (PendingWar) else if (pendingWar)
{ {
kills = Html.Color($"{war.Kills}/{war.MaxKills}", 0x990000); kills = Html.Color($"{war.Kills}/{war.MaxKills}", 0x990000);
time = Html.Color($"{war.WarLength.Hours:D2}:{DateTime.MinValue + war.WarLength:mm}", 0x990000); time = Html.Color($"{war.WarLength.Hours:D2}:{DateTime.MinValue + war.WarLength:mm}", 0x990000);
otherWar = m_Other.FindPendingWar(guild); otherWar = _other.FindPendingWar(Guild);
if (otherWar != null) if (otherWar != null)
{ {
otherKills = Html.Color($"{otherWar.Kills}/{otherWar.MaxKills}", 0x990000); otherKills = Html.Color($"{otherWar.Kills}/{otherWar.MaxKills}", 0x990000);
} }
} }
AddHtmlLocalized(280, 110, 120, 26, 1062966, 0x0, true); // <i>Your Kills</i> builder.AddHtmlLocalized(280, 110, 120, 26, 1062966, 0x0, true); // <i>Your Kills</i>
AddHtml(410, 113, 120, 26, kills); builder.AddHtml(410, 113, 120, 26, kills);
AddHtmlLocalized(20, 140, 120, 26, 1062968, 0x0, true); // <i>Time Remaining</i> builder.AddHtmlLocalized(20, 140, 120, 26, 1062968, 0x0, true); // <i>Time Remaining</i>
AddHtml(150, 143, 120, 26, time); builder.AddHtml(150, 143, 120, 26, time);
AddHtmlLocalized(280, 140, 120, 26, 1062967, 0x0, true); // <i>Their Kills</i> builder.AddHtmlLocalized(280, 140, 120, 26, 1062967, 0x0, true); // <i>Their Kills</i>
AddHtml(410, 143, 120, 26, otherKills); builder.AddHtml(410, 143, 120, 26, otherKills);
AddImageTiled(20, 172, 480, 2, 0x2711); builder.AddImageTiled(20, 172, 480, 2, 0x2711);
var number = 1062973; // <div align=center>You are at peace with this guild.</div> var number = 1062973; // <div align=center>You are at peace with this guild.</div>
if (PendingWar) if (pendingWar)
{ {
if (war.WarRequester) if (war.WarRequester)
{ {
@ -118,92 +118,92 @@ namespace Server.Guilds
{ {
number = 1062969; // <div align=center>This guild has challenged you to war!</div> number = 1062969; // <div align=center>This guild has challenged you to war!</div>
AddButtonAndBackground(20, 260, 5, 1062981); // Accept Challenge AddButtonAndBackground(ref builder, 20, 260, 5, 1062981); // Accept Challenge
AddButtonAndBackground(275, 260, 6, 1062983); // Modify Terms AddButtonAndBackground(ref builder, 275, 260, 6, 1062983); // Modify Terms
} }
AddButtonAndBackground(20, 290, 7, 1062982); // Dismiss Challenge AddButtonAndBackground(ref builder, 20, 290, 7, 1062982); // Dismiss Challenge
} }
else if (ActiveWar) else if (activeWarFlag)
{ {
number = 1062965; // <div align=center>You are at war with this guild!</div> number = 1062965; // <div align=center>You are at war with this guild!</div>
AddButtonAndBackground(20, 290, 8, 1062980); // Surrender AddButtonAndBackground(ref builder, 20, 290, 8, 1062980); // Surrender
} }
else if (alliance != null && alliance == otherAlliance) // alliance, Same Alliance else if (alliance != null && alliance == otherAlliance) // alliance, Same Alliance
{ {
if (alliance.IsMember(guild) && alliance.IsMember(m_Other)) // Both in Same alliance, full members if (alliance.IsMember(Guild) && alliance.IsMember(_other)) // Both in Same alliance, full members
{ {
number = 1062970; // <div align=center>You are allied with this guild.</div> number = 1062970; // <div align=center>You are allied with this guild.</div>
if (alliance.Leader == guild) if (alliance.Leader == Guild)
{ {
AddButtonAndBackground(20, 260, 12, 1062984); // Remove Guild from Alliance AddButtonAndBackground(ref builder, 20, 260, 12, 1062984); // Remove Guild from Alliance
//Note: No 'confirmation' like the other leader guild promotion things // Note: No 'confirmation' like the other leader guild promotion things
// Promote to Alliance Leader // Promote to Alliance Leader
AddButtonAndBackground(275, 260, 13, 1063433); AddButtonAndBackground(ref builder, 275, 260, 13, 1063433);
// Remove guild from alliance //Promote to Alliance Leader // Remove guild from alliance //Promote to Alliance Leader
} }
// Show roster, Centered, up // Show roster, Centered, up
AddButtonAndBackground(148, 215, 10, 1063164); // Show Alliance Roster AddButtonAndBackground(ref builder, 148, 215, 10, 1063164); // Show Alliance Roster
// Leave Alliance // Leave Alliance
AddButtonAndBackground(20, 290, 11, 1062985); // Leave Alliance AddButtonAndBackground(ref builder, 20, 290, 11, 1062985); // Leave Alliance
} }
else if (alliance.Leader == guild && alliance.IsPendingMember(m_Other)) else if (alliance.Leader == Guild && alliance.IsPendingMember(_other))
{ {
number = 1062971; // <div align=center>You have requested an alliance with this guild.</div> number = 1062971; // <div align=center>You have requested an alliance with this guild.</div>
// Show Alliance Roster, Centered, down. // Show Alliance Roster, Centered, down.
AddButtonAndBackground(148, 245, 10, 1063164); // Show Alliance Roster AddButtonAndBackground(ref builder, 148, 245, 10, 1063164); // Show Alliance Roster
// Withdraw Request // Withdraw Request
AddButtonAndBackground(20, 290, 14, 1062986); // Withdraw Request AddButtonAndBackground(ref builder, 20, 290, 14, 1062986); // Withdraw Request
AddHtml(150, 83, 360, 26, alliance.Name.Color(0x99)); builder.AddHtml(150, 83, 360, 26, alliance.Name.Color(0x99));
} }
else if (alliance.Leader == m_Other && alliance.IsPendingMember(guild)) else if (alliance.Leader == _other && alliance.IsPendingMember(Guild))
{ {
number = 1062972; // <div align=center>This guild has requested an alliance.</div> number = 1062972; // <div align=center>This guild has requested an alliance.</div>
// Show alliance Roster, top // Show alliance Roster, top
AddButtonAndBackground(148, 215, 10, 1063164); // Show Alliance Roster AddButtonAndBackground(ref builder, 148, 215, 10, 1063164); // Show Alliance Roster
// Deny Request // Deny Request
// Accept Request // Accept Request
AddButtonAndBackground(20, 260, 15, 1062988); // Deny Request AddButtonAndBackground(ref builder, 20, 260, 15, 1062988); // Deny Request
AddButtonAndBackground(20, 290, 16, 1062987); // Accept Request AddButtonAndBackground(ref builder, 20, 290, 16, 1062987); // Accept Request
AddHtml(150, 83, 360, 26, alliance.Name.Color(0x99)); builder.AddHtml(150, 83, 360, 26, alliance.Name.Color(0x99));
} }
} }
else else
{ {
AddButtonAndBackground(20, 260, 2, 1062990); // Request Alliance AddButtonAndBackground(ref builder, 20, 260, 2, 1062990); // Request Alliance
AddButtonAndBackground(20, 290, 1, 1062989); // Declare War! AddButtonAndBackground(ref builder, 20, 290, 1, 1062989); // Declare War!
} }
AddButtonAndBackground(275, 290, 0, 3000091); // Cancel AddButtonAndBackground(ref builder, 275, 290, 0, 3000091); // Cancel
AddHtmlLocalized(20, 180, 480, 30, number, 0x0, true); builder.AddHtmlLocalized(20, 180, 480, 30, number, 0x0, true);
AddImageTiled(20, 245, 480, 2, 0x2711); builder.AddImageTiled(20, 245, 480, 2, 0x2711);
} }
public override void OnResponse(NetState sender, in RelayInfo info) public override void OnResponse(NetState sender, in RelayInfo info)
{ {
if (!(sender.Mobile is PlayerMobile pm && IsMember(pm, guild))) if (!(sender.Mobile is PlayerMobile pm && IsMember(pm, Guild)))
{ {
return; return;
} }
var playerRank = pm.GuildRank; var playerRank = pm.GuildRank;
var guildLeader = Guild.GetAllianceLeader(guild); var guildLeader = Guild.GetAllianceLeader(Guild);
var otherGuild = Guild.GetAllianceLeader(m_Other); var otherGuild = Guild.GetAllianceLeader(_other);
var war = guildLeader.FindPendingWar(otherGuild); var war = guildLeader.FindPendingWar(otherGuild);
var activeWar = guildLeader.FindActiveWar(otherGuild); var activeWar = guildLeader.FindActiveWar(otherGuild);
var otherWar = otherGuild.FindPendingWar(guildLeader); var otherWar = otherGuild.FindPendingWar(guildLeader);
var alliance = guild.Alliance; var alliance = Guild.Alliance;
var otherAlliance = otherGuild.Alliance; var otherAlliance = otherGuild.Alliance;
switch (info.ButtonID) switch (info.ButtonID)
@ -216,10 +216,10 @@ namespace Server.Guilds
{ {
pm.SendLocalizedMessage(1063440); // You don't have permission to negotiate wars. pm.SendLocalizedMessage(1063440); // You don't have permission to negotiate wars.
} }
else if (alliance != null && alliance.Leader != guild) else if (alliance != null && alliance.Leader != Guild)
{ {
// ~1_val~ is not the leader of the ~2_val~ alliance. // ~1_val~ is not the leader of the ~2_val~ alliance.
pm.SendLocalizedMessage(1063239, $"{guild.Name}\t{alliance.Name}"); pm.SendLocalizedMessage(1063239, $"{Guild.Name}\t{alliance.Name}");
// You need to negotiate via ~1_val~ instead. // You need to negotiate via ~1_val~ instead.
pm.SendLocalizedMessage(1070707, alliance.Leader.Name); pm.SendLocalizedMessage(1070707, alliance.Leader.Name);
@ -227,11 +227,11 @@ namespace Server.Guilds
else else
{ {
// Accept the war // Accept the war
guild.PendingWars.Remove(war); Guild.PendingWars.Remove(war);
war.WarBeginning = Core.Now; war.WarBeginning = Core.Now;
guild.AcceptedWars.Add(war); Guild.AcceptedWars.Add(war);
if (alliance?.IsMember(guild) == true) if (alliance?.IsMember(Guild) == true)
{ {
// Guild Message: Your guild is now at war with ~1_GUILDNAME~ // Guild Message: Your guild is now at war with ~1_GUILDNAME~
alliance.AllianceMessage(1070769, otherAlliance?.Name ?? otherGuild.Name); alliance.AllianceMessage(1070769, otherAlliance?.Name ?? otherGuild.Name);
@ -240,8 +240,8 @@ namespace Server.Guilds
else else
{ {
// Guild Message: Your guild is now at war with ~1_GUILDNAME~ // Guild Message: Your guild is now at war with ~1_GUILDNAME~
guild.GuildMessage(1070769, otherAlliance?.Name ?? otherGuild.Name); Guild.GuildMessage(1070769, otherAlliance?.Name ?? otherGuild.Name);
guild.InvalidateMemberProperties(); Guild.InvalidateMemberProperties();
} }
// Technically SHOULD say Your guild is now at war w/out any info, intentional diff. // Technically SHOULD say Your guild is now at war w/out any info, intentional diff.
@ -249,16 +249,16 @@ namespace Server.Guilds
otherWar.WarBeginning = Core.Now; otherWar.WarBeginning = Core.Now;
otherGuild.AcceptedWars.Add(otherWar); otherGuild.AcceptedWars.Add(otherWar);
if (otherAlliance != null && m_Other.Alliance.IsMember(m_Other)) if (otherAlliance != null && _other.Alliance.IsMember(_other))
{ {
// Guild Message: Your guild is now at war with ~1_GUILDNAME~ // Guild Message: Your guild is now at war with ~1_GUILDNAME~
otherAlliance.AllianceMessage(1070769, alliance?.Name ?? guild.Name); otherAlliance.AllianceMessage(1070769, alliance?.Name ?? Guild.Name);
otherAlliance.InvalidateMemberProperties(); otherAlliance.InvalidateMemberProperties();
} }
else else
{ {
// Guild Message: Your guild is now at war with ~1_GUILDNAME~ // Guild Message: Your guild is now at war with ~1_GUILDNAME~
otherGuild.GuildMessage(1070769, alliance?.Name ?? guild.Name); otherGuild.GuildMessage(1070769, alliance?.Name ?? Guild.Name);
otherGuild.InvalidateMemberProperties(); otherGuild.InvalidateMemberProperties();
} }
} }
@ -274,17 +274,17 @@ namespace Server.Guilds
{ {
pm.SendLocalizedMessage(1063440); // You don't have permission to negotiate wars. pm.SendLocalizedMessage(1063440); // You don't have permission to negotiate wars.
} }
else if (alliance != null && alliance.Leader != guild) else if (alliance != null && alliance.Leader != Guild)
{ {
// ~1_val~ is not the leader of the ~2_val~ alliance. // ~1_val~ is not the leader of the ~2_val~ alliance.
pm.SendLocalizedMessage(1063239, $"{guild.Name}\t{alliance.Name}"); pm.SendLocalizedMessage(1063239, $"{Guild.Name}\t{alliance.Name}");
// You need to negotiate via ~1_val~ instead. // You need to negotiate via ~1_val~ instead.
pm.SendLocalizedMessage(1070707, alliance.Leader.Name); pm.SendLocalizedMessage(1070707, alliance.Leader.Name);
} }
else else
{ {
pm.SendGump(new WarDeclarationGump(pm, guild, otherGuild)); pm.SendGump(new WarDeclarationGump(pm, Guild, otherGuild));
} }
} }
@ -298,10 +298,10 @@ namespace Server.Guilds
{ {
pm.SendLocalizedMessage(1063440); // You don't have permission to negotiate wars. pm.SendLocalizedMessage(1063440); // You don't have permission to negotiate wars.
} }
else if (alliance != null && alliance.Leader != guild) else if (alliance != null && alliance.Leader != Guild)
{ {
// ~1_val~ is not the leader of the ~2_val~ alliance. // ~1_val~ is not the leader of the ~2_val~ alliance.
pm.SendLocalizedMessage(1063239, $"{guild.Name}\t{alliance.Name}"); pm.SendLocalizedMessage(1063239, $"{Guild.Name}\t{alliance.Name}");
// You need to negotiate via ~1_val~ instead. // You need to negotiate via ~1_val~ instead.
pm.SendLocalizedMessage(1070707, alliance.Leader.Name); pm.SendLocalizedMessage(1070707, alliance.Leader.Name);
@ -309,7 +309,7 @@ namespace Server.Guilds
else else
{ {
// Dismiss the war // Dismiss the war
guild.PendingWars.Remove(war); Guild.PendingWars.Remove(war);
otherGuild.PendingWars.Remove(otherWar); otherGuild.PendingWars.Remove(otherWar);
pm.SendLocalizedMessage(1070752); // The proposal has been updated. pm.SendLocalizedMessage(1070752); // The proposal has been updated.
// Messages to opposing guild? (Testing on OSI says no) // Messages to opposing guild? (Testing on OSI says no)
@ -324,10 +324,10 @@ namespace Server.Guilds
{ {
pm.SendLocalizedMessage(1063440); // You don't have permission to negotiate wars. pm.SendLocalizedMessage(1063440); // You don't have permission to negotiate wars.
} }
else if (alliance != null && alliance.Leader != guild) else if (alliance != null && alliance.Leader != Guild)
{ {
// ~1_val~ is not the leader of the ~2_val~ alliance. // ~1_val~ is not the leader of the ~2_val~ alliance.
pm.SendLocalizedMessage(1063239, $"{guild.Name}\t{alliance.Name}"); pm.SendLocalizedMessage(1063239, $"{Guild.Name}\t{alliance.Name}");
// You need to negotiate via ~1_val~ instead. // You need to negotiate via ~1_val~ instead.
pm.SendLocalizedMessage(1070707, alliance.Leader.Name); pm.SendLocalizedMessage(1070707, alliance.Leader.Name);
@ -336,7 +336,7 @@ namespace Server.Guilds
{ {
if (activeWar != null) if (activeWar != null)
{ {
if (alliance?.IsMember(guild) == true) if (alliance?.IsMember(Guild) == true)
{ {
// You have lost the war with ~1_val~. // You have lost the war with ~1_val~.
alliance.AllianceMessage(1070740, otherAlliance?.Name ?? otherGuild.Name); alliance.AllianceMessage(1070740, otherAlliance?.Name ?? otherGuild.Name);
@ -345,26 +345,26 @@ namespace Server.Guilds
else else
{ {
// You have lost the war with ~1_val~. // You have lost the war with ~1_val~.
guild.GuildMessage(1070740, otherAlliance?.Name ?? otherGuild.Name); Guild.GuildMessage(1070740, otherAlliance?.Name ?? otherGuild.Name);
guild.InvalidateMemberProperties(); Guild.InvalidateMemberProperties();
} }
guild.AcceptedWars.Remove(activeWar); Guild.AcceptedWars.Remove(activeWar);
if (otherAlliance?.IsMember(otherGuild) == true) if (otherAlliance?.IsMember(otherGuild) == true)
{ {
// You have won the war against ~1_val~! // You have won the war against ~1_val~!
otherAlliance.AllianceMessage(1070739, guild.Alliance?.Name ?? guild.Name); otherAlliance.AllianceMessage(1070739, Guild.Alliance?.Name ?? Guild.Name);
otherAlliance.InvalidateMemberProperties(); otherAlliance.InvalidateMemberProperties();
} }
else else
{ {
// You have won the war against ~1_val~! // You have won the war against ~1_val~!
otherGuild.GuildMessage(1070739, guild.Alliance?.Name ?? guild.Name); otherGuild.GuildMessage(1070739, Guild.Alliance?.Name ?? Guild.Name);
otherGuild.InvalidateMemberProperties(); otherGuild.InvalidateMemberProperties();
} }
otherGuild.AcceptedWars.Remove(otherGuild.FindActiveWar(guild)); otherGuild.AcceptedWars.Remove(otherGuild.FindActiveWar(Guild));
} }
} }
@ -378,25 +378,25 @@ namespace Server.Guilds
{ {
pm.SendLocalizedMessage(1063440); // You don't have permission to negotiate wars. pm.SendLocalizedMessage(1063440); // You don't have permission to negotiate wars.
} }
else if (alliance != null && alliance.Leader != guild) else if (alliance != null && alliance.Leader != Guild)
{ {
// ~1_val~ is not the leader of the ~2_val~ alliance. // ~1_val~ is not the leader of the ~2_val~ alliance.
pm.SendLocalizedMessage(1063239, $"{guild.Name}\t{alliance.Name}"); pm.SendLocalizedMessage(1063239, $"{Guild.Name}\t{alliance.Name}");
// You need to negotiate via ~1_val~ instead. // You need to negotiate via ~1_val~ instead.
pm.SendLocalizedMessage(1070707, alliance.Leader.Name); pm.SendLocalizedMessage(1070707, alliance.Leader.Name);
} }
else if (otherAlliance != null && otherAlliance.Leader != m_Other) else if (otherAlliance != null && otherAlliance.Leader != _other)
{ {
// ~1_val~ is not the leader of the ~2_val~ alliance. // ~1_val~ is not the leader of the ~2_val~ alliance.
pm.SendLocalizedMessage(1063239, $"{m_Other.Name}\t{otherAlliance.Name}"); pm.SendLocalizedMessage(1063239, $"{_other.Name}\t{otherAlliance.Name}");
// You need to negotiate via ~1_val~ instead. // You need to negotiate via ~1_val~ instead.
pm.SendLocalizedMessage(1070707, otherAlliance.Leader.Name); pm.SendLocalizedMessage(1070707, otherAlliance.Leader.Name);
} }
else else
{ {
pm.SendGump(new WarDeclarationGump(pm, guild, m_Other)); pm.SendGump(new WarDeclarationGump(pm, Guild, _other));
} }
} }
@ -411,33 +411,33 @@ namespace Server.Guilds
{ {
pm.SendLocalizedMessage(1070747); // You don't have permission to create an alliance. pm.SendLocalizedMessage(1070747); // You don't have permission to create an alliance.
} }
else if (Faction.Find(guild.Leader) != Faction.Find(m_Other.Leader)) else if (Faction.Find(Guild.Leader) != Faction.Find(_other.Leader))
{ {
// You cannot propose an alliance to a guild with a different faction allegiance. // You cannot propose an alliance to a guild with a different faction allegiance.
pm.SendLocalizedMessage(1070758); pm.SendLocalizedMessage(1070758);
} }
else if (otherAlliance != null) else if (otherAlliance != null)
{ {
if (otherAlliance.IsPendingMember(m_Other)) if (otherAlliance.IsPendingMember(_other))
{ {
// ~1_val~ is currently considering another alliance proposal. // ~1_val~ is currently considering another alliance proposal.
pm.SendLocalizedMessage(1063416, m_Other.Name); pm.SendLocalizedMessage(1063416, _other.Name);
} }
else else
{ {
// ~1_val~ already belongs to an alliance. // ~1_val~ already belongs to an alliance.
pm.SendLocalizedMessage(1063426, m_Other.Name); pm.SendLocalizedMessage(1063426, _other.Name);
} }
} }
else if (m_Other.AcceptedWars.Count > 0 || m_Other.PendingWars.Count > 0) else if (_other.AcceptedWars.Count > 0 || _other.PendingWars.Count > 0)
{ {
// ~1_val~ is currently involved in a guild war. // ~1_val~ is currently involved in a guild war.
pm.SendLocalizedMessage(1063427, m_Other.Name); pm.SendLocalizedMessage(1063427, _other.Name);
} }
else if (guild.AcceptedWars.Count > 0 || guild.PendingWars.Count > 0) else if (Guild.AcceptedWars.Count > 0 || Guild.PendingWars.Count > 0)
{ {
// ~1_val~ is currently involved in a guild war. // ~1_val~ is currently involved in a guild war.
pm.SendLocalizedMessage(1063427, guild.Name); pm.SendLocalizedMessage(1063427, Guild.Name);
} }
else else
{ {
@ -451,40 +451,40 @@ namespace Server.Guilds
{ {
pm.SendLocalizedMessage(1063436); // You don't have permission to negotiate an alliance. pm.SendLocalizedMessage(1063436); // You don't have permission to negotiate an alliance.
} }
else if (alliance.Leader != guild) else if (alliance.Leader != Guild)
{ {
// ~1_val~ is not the leader of the ~2_val~ alliance. // ~1_val~ is not the leader of the ~2_val~ alliance.
pm.SendLocalizedMessage(1063239, $"{guild.Name}\t{alliance.Name}"); pm.SendLocalizedMessage(1063239, $"{Guild.Name}\t{alliance.Name}");
} }
else if (otherAlliance != null) else if (otherAlliance != null)
{ {
if (otherAlliance.IsPendingMember(m_Other)) if (otherAlliance.IsPendingMember(_other))
{ {
// ~1_val~ is currently considering another alliance proposal. // ~1_val~ is currently considering another alliance proposal.
pm.SendLocalizedMessage(1063416, m_Other.Name); pm.SendLocalizedMessage(1063416, _other.Name);
} }
else else
{ {
// ~1_val~ already belongs to an alliance. // ~1_val~ already belongs to an alliance.
pm.SendLocalizedMessage(1063426, m_Other.Name); pm.SendLocalizedMessage(1063426, _other.Name);
} }
} }
else if (alliance.IsPendingMember(guild)) else if (alliance.IsPendingMember(Guild))
{ {
// ~1_val~ is currently considering another alliance proposal. // ~1_val~ is currently considering another alliance proposal.
pm.SendLocalizedMessage(1063416, guild.Name); pm.SendLocalizedMessage(1063416, Guild.Name);
} }
else if (m_Other.AcceptedWars.Count > 0 || m_Other.PendingWars.Count > 0) else if (_other.AcceptedWars.Count > 0 || _other.PendingWars.Count > 0)
{ {
// ~1_val~ is currently involved in a guild war. // ~1_val~ is currently involved in a guild war.
pm.SendLocalizedMessage(1063427, m_Other.Name); pm.SendLocalizedMessage(1063427, _other.Name);
} }
else if (guild.AcceptedWars.Count > 0 || guild.PendingWars.Count > 0) else if (Guild.AcceptedWars.Count > 0 || Guild.PendingWars.Count > 0)
{ {
// ~1_val~ is currently involved in a guild war. // ~1_val~ is currently involved in a guild war.
pm.SendLocalizedMessage(1063427, guild.Name); pm.SendLocalizedMessage(1063427, Guild.Name);
} }
else if (Faction.Find(guild.Leader) != Faction.Find(m_Other.Leader)) else if (Faction.Find(Guild.Leader) != Faction.Find(_other.Leader))
{ {
// You cannot propose an alliance to a guild with a different faction allegiance. // You cannot propose an alliance to a guild with a different faction allegiance.
pm.SendLocalizedMessage(1070758); pm.SendLocalizedMessage(1070758);
@ -492,12 +492,11 @@ namespace Server.Guilds
else else
{ {
// An invitation to join your alliance has been sent to ~1_val~. // An invitation to join your alliance has been sent to ~1_val~.
pm.SendLocalizedMessage(1070750, m_Other.Name); pm.SendLocalizedMessage(1070750, _other.Name);
m_Other.GuildMessage(1070780, guild.Name); // ~1_val~ has proposed an alliance. _other.GuildMessage(1070780, Guild.Name); // ~1_val~ has proposed an alliance.
m_Other.Alliance = alliance; // Calls addPendingGuild _other.Alliance = alliance; // Calls addPendingGuild
// alliance.AddPendingGuild( m_Other );
} }
} }
@ -507,7 +506,7 @@ namespace Server.Guilds
{ {
if (alliance != null && alliance == otherAlliance) if (alliance != null && alliance == otherAlliance)
{ {
pm.SendGump(new AllianceInfo.AllianceRosterGump(pm, guild, alliance)); pm.SendGump(new AllianceInfo.AllianceRosterGump(pm, Guild, alliance));
} }
break; break;
@ -518,14 +517,13 @@ namespace Server.Guilds
{ {
pm.SendLocalizedMessage(1063436); // You don't have permission to negotiate an alliance. pm.SendLocalizedMessage(1063436); // You don't have permission to negotiate an alliance.
} }
else if (alliance?.IsMember(guild) == true) else if (alliance?.IsMember(Guild) == true)
{ {
guild.Alliance = null; // Calls alliance.RemoveGuild Guild.Alliance = null; // Calls alliance.RemoveGuild
// alliance.RemoveGuild( guild );
m_Other.InvalidateWarNotoriety(); _other.InvalidateWarNotoriety();
guild.InvalidateMemberNotoriety(); Guild.InvalidateMemberNotoriety();
} }
break; break;
@ -536,18 +534,18 @@ namespace Server.Guilds
{ {
pm.SendLocalizedMessage(1063436); // You don't have permission to negotiate an alliance. pm.SendLocalizedMessage(1063436); // You don't have permission to negotiate an alliance.
} }
else if (alliance != null && alliance.Leader != guild) else if (alliance != null && alliance.Leader != Guild)
{ {
// ~1_val~ is not the leader of the ~2_val~ alliance. // ~1_val~ is not the leader of the ~2_val~ alliance.
pm.SendLocalizedMessage(1063239, $"{guild.Name}\t{alliance.Name}"); pm.SendLocalizedMessage(1063239, $"{Guild.Name}\t{alliance.Name}");
} }
else if (alliance?.IsMember(guild) == true && alliance.IsMember(m_Other)) else if (alliance?.IsMember(Guild) == true && alliance.IsMember(_other))
{ {
m_Other.Alliance = null; _other.Alliance = null;
m_Other.InvalidateMemberNotoriety(); _other.InvalidateMemberNotoriety();
guild.InvalidateWarNotoriety(); Guild.InvalidateWarNotoriety();
} }
break; break;
@ -558,17 +556,17 @@ namespace Server.Guilds
{ {
pm.SendLocalizedMessage(1063436); // You don't have permission to negotiate an alliance. pm.SendLocalizedMessage(1063436); // You don't have permission to negotiate an alliance.
} }
else if (alliance != null && alliance.Leader != guild) else if (alliance != null && alliance.Leader != Guild)
{ {
// ~1_val~ is not the leader of the ~2_val~ alliance. // ~1_val~ is not the leader of the ~2_val~ alliance.
pm.SendLocalizedMessage(1063239, $"{guild.Name}\t{alliance.Name}"); pm.SendLocalizedMessage(1063239, $"{Guild.Name}\t{alliance.Name}");
} }
else if (alliance?.IsMember(guild) == true && alliance.IsMember(m_Other)) else if (alliance?.IsMember(Guild) == true && alliance.IsMember(_other))
{ {
// ~1_val~ is now the leader of ~2_val~. // ~1_val~ is now the leader of ~2_val~.
pm.SendLocalizedMessage(1063434, $"{m_Other.Name}\t{alliance.Name}"); pm.SendLocalizedMessage(1063434, $"{_other.Name}\t{alliance.Name}");
alliance.Leader = m_Other; alliance.Leader = _other;
} }
break; break;
@ -579,9 +577,9 @@ namespace Server.Guilds
{ {
pm.SendLocalizedMessage(1063436); // You don't have permission to negotiate an alliance. pm.SendLocalizedMessage(1063436); // You don't have permission to negotiate an alliance.
} }
else if (alliance != null && alliance.Leader == guild && alliance.IsPendingMember(m_Other)) else if (alliance != null && alliance.Leader == Guild && alliance.IsPendingMember(_other))
{ {
m_Other.Alliance = null; _other.Alliance = null;
pm.SendLocalizedMessage(1070752); // The proposal has been updated. pm.SendLocalizedMessage(1070752); // The proposal has been updated.
} }
@ -593,15 +591,15 @@ namespace Server.Guilds
{ {
pm.SendLocalizedMessage(1063436); // You don't have permission to negotiate an alliance. pm.SendLocalizedMessage(1063436); // You don't have permission to negotiate an alliance.
} }
else if (alliance != null && otherAlliance != null && alliance.Leader == m_Other && else if (alliance != null && otherAlliance != null && alliance.Leader == _other &&
otherAlliance.IsPendingMember(guild)) otherAlliance.IsPendingMember(Guild))
{ {
// The proposal has been updated. // The proposal has been updated.
// m_Other.GuildMessage( 1070782 ); // _other.GuildMessage( 1070782 );
// // ~1_val~ has responded to your proposal. // // ~1_val~ has responded to your proposal.
// //Per OSI commented out. // // Per OSI commented out.
pm.SendLocalizedMessage(1070752); pm.SendLocalizedMessage(1070752);
guild.Alliance = null; Guild.Alliance = null;
} }
break; break;
@ -612,15 +610,15 @@ namespace Server.Guilds
{ {
pm.SendLocalizedMessage(1063436); // You don't have permission to negotiate an alliance. pm.SendLocalizedMessage(1063436); // You don't have permission to negotiate an alliance.
} }
else if (otherAlliance != null && otherAlliance.Leader == m_Other && else if (otherAlliance != null && otherAlliance.Leader == _other &&
otherAlliance.IsPendingMember(guild)) otherAlliance.IsPendingMember(Guild))
{ {
pm.SendLocalizedMessage(1070752); // The proposal has been updated. pm.SendLocalizedMessage(1070752); // The proposal has been updated.
// No need to verify it's in the guild or already a member, the function does this // No need to verify it's in the guild or already a member, the function does this
otherAlliance.TurnToMember(m_Other); otherAlliance.TurnToMember(_other);
otherAlliance.TurnToMember(guild); otherAlliance.TurnToMember(Guild);
} }
break; break;
@ -635,10 +633,10 @@ namespace Server.Guilds
return; return;
} }
var alliance = guild.Alliance; var alliance = Guild.Alliance;
var otherAlliance = m_Other.Alliance; var otherAlliance = _other.Alliance;
if (!IsMember(from, guild) || alliance != null) if (!IsMember(from, Guild) || alliance != null)
{ {
return; return;
} }
@ -649,7 +647,7 @@ namespace Server.Guilds
{ {
pm.SendLocalizedMessage(1070747); // You don't have permission to create an alliance. pm.SendLocalizedMessage(1070747); // You don't have permission to create an alliance.
} }
else if (Faction.Find(guild.Leader) != Faction.Find(m_Other.Leader)) else if (Faction.Find(Guild.Leader) != Faction.Find(_other.Leader))
{ {
// Notes about this: OSI only cares/checks when proposing, you can change your faction all you want later. // Notes about this: OSI only cares/checks when proposing, you can change your faction all you want later.
// You cannot propose an alliance to a guild with a different faction allegiance. // You cannot propose an alliance to a guild with a different faction allegiance.
@ -657,23 +655,23 @@ namespace Server.Guilds
} }
else if (otherAlliance != null) else if (otherAlliance != null)
{ {
if (otherAlliance.IsPendingMember(m_Other)) if (otherAlliance.IsPendingMember(_other))
{ {
// ~1_val~ is currently considering another alliance proposal. // ~1_val~ is currently considering another alliance proposal.
pm.SendLocalizedMessage(1063416, m_Other.Name); pm.SendLocalizedMessage(1063416, _other.Name);
} }
else else
{ {
pm.SendLocalizedMessage(1063426, m_Other.Name); // ~1_val~ already belongs to an alliance. pm.SendLocalizedMessage(1063426, _other.Name); // ~1_val~ already belongs to an alliance.
} }
} }
else if (m_Other.AcceptedWars.Count > 0 || m_Other.PendingWars.Count > 0) else if (_other.AcceptedWars.Count > 0 || _other.PendingWars.Count > 0)
{ {
pm.SendLocalizedMessage(1063427, m_Other.Name); // ~1_val~ is currently involved in a guild war. pm.SendLocalizedMessage(1063427, _other.Name); // ~1_val~ is currently involved in a guild war.
} }
else if (guild.AcceptedWars.Count > 0 || guild.PendingWars.Count > 0) else if (Guild.AcceptedWars.Count > 0 || Guild.PendingWars.Count > 0)
{ {
pm.SendLocalizedMessage(1063427, guild.Name); // ~1_val~ is currently involved in a guild war. pm.SendLocalizedMessage(1063427, Guild.Name); // ~1_val~ is currently involved in a guild war.
} }
else else
{ {
@ -695,11 +693,11 @@ namespace Server.Guilds
else else
{ {
// An invitation to join your alliance has been sent to ~1_val~. // An invitation to join your alliance has been sent to ~1_val~.
pm.SendLocalizedMessage(1070750, m_Other.Name); pm.SendLocalizedMessage(1070750, _other.Name);
m_Other.GuildMessage(1070780, guild.Name); // ~1_val~ has proposed an alliance. _other.GuildMessage(1070780, Guild.Name); // ~1_val~ has proposed an alliance.
new AllianceInfo(guild, name, m_Other); new AllianceInfo(Guild, name, _other);
} }
} }
} }

View file

@ -7,40 +7,42 @@ namespace Server.Guilds
{ {
public class WarDeclarationGump : BaseGuildGump public class WarDeclarationGump : BaseGuildGump
{ {
private readonly Guild m_Other; private readonly Guild _other;
public WarDeclarationGump(PlayerMobile pm, Guild g, Guild otherGuild) : base(pm, g) public WarDeclarationGump(PlayerMobile pm, Guild g, Guild otherGuild) : base(pm, g) => _other = otherGuild;
protected override bool ShowTabStrip => false;
protected override void BuildContent(ref DynamicGumpBuilder builder)
{ {
m_Other = otherGuild; var war = Guild.FindPendingWar(_other);
var war = g.FindPendingWar(otherGuild);
AddPage(0); builder.AddBackground(0, 0, 500, 340, 0x24AE);
builder.AddBackground(65, 50, 370, 30, 0x2486);
AddBackground(0, 0, 500, 340, 0x24AE); // <div align=center><i>Declaration of War</i></div>
AddBackground(65, 50, 370, 30, 0x2486); builder.AddHtmlLocalized(75, 55, 370, 26, 1062979, 0x3C00);
AddHtmlLocalized(75, 55, 370, 26, 1062979, 0x3C00); // <div align=center><i>Declaration of War</i></div> builder.AddImage(410, 45, 0x232C);
AddImage(410, 45, 0x232C); builder.AddHtmlLocalized(65, 95, 200, 20, 1063009, 0x14AF); // <i>Duration of War</i>
AddHtmlLocalized(65, 95, 200, 20, 1063009, 0x14AF); // <i>Duration of War</i> builder.AddHtmlLocalized(65, 120, 400, 20, 1063010, 0x0); // Enter the number of hours the war will last.
AddHtmlLocalized(65, 120, 400, 20, 1063010, 0x0); // Enter the number of hours the war will last. builder.AddBackground(65, 150, 40, 30, 0x2486);
AddBackground(65, 150, 40, 30, 0x2486); builder.AddTextEntry(70, 154, 50, 30, 0x481, 10, $"{war?.WarLength.Hours ?? 0}");
AddTextEntry(70, 154, 50, 30, 0x481, 10, war?.WarLength.Hours.ToString() ?? "0"); builder.AddHtmlLocalized(65, 195, 200, 20, 1063011, 0x14AF); // <i>Victory Condition</i>
AddHtmlLocalized(65, 195, 200, 20, 1063011, 0x14AF); // <i>Victory Condition</i> builder.AddHtmlLocalized(65, 220, 400, 20, 1063012, 0x0); // Enter the winning number of kills.
AddHtmlLocalized(65, 220, 400, 20, 1063012, 0x0); // Enter the winning number of kills. builder.AddBackground(65, 250, 40, 30, 0x2486);
AddBackground(65, 250, 40, 30, 0x2486); builder.AddTextEntry(70, 254, 50, 30, 0x481, 11, $"{war?.MaxKills ?? 0}");
AddTextEntry(70, 254, 50, 30, 0x481, 11, war?.MaxKills.ToString() ?? "0"); builder.AddBackground(190, 270, 130, 26, 0x2486);
AddBackground(190, 270, 130, 26, 0x2486); builder.AddButton(195, 275, 0x845, 0x846, 0);
AddButton(195, 275, 0x845, 0x846, 0); builder.AddHtmlLocalized(220, 273, 90, 26, 1006045, 0x0); // Cancel
AddHtmlLocalized(220, 273, 90, 26, 1006045, 0x0); // Cancel builder.AddBackground(330, 270, 130, 26, 0x2486);
AddBackground(330, 270, 130, 26, 0x2486); builder.AddButton(335, 275, 0x845, 0x846, 1);
AddButton(335, 275, 0x845, 0x846, 1); builder.AddHtmlLocalized(360, 273, 90, 26, 1062989, 0x5000); // Declare War!
AddHtmlLocalized(360, 273, 90, 26, 1062989, 0x5000); // Declare War!
} }
public override void OnResponse(NetState sender, in RelayInfo info) public override void OnResponse(NetState sender, in RelayInfo info)
{ {
var pm = sender.Mobile as PlayerMobile; var pm = sender.Mobile as PlayerMobile;
if (!IsMember(pm, guild)) if (!IsMember(pm, Guild))
{ {
return; return;
} }
@ -51,45 +53,38 @@ namespace Server.Guilds
{ {
case 1: case 1:
{ {
var alliance = guild.Alliance; var alliance = Guild.Alliance;
var otherAlliance = m_Other.Alliance; var otherAlliance = _other.Alliance;
if (!playerRank.GetFlag(RankFlags.ControlWarStatus)) if (!playerRank.GetFlag(RankFlags.ControlWarStatus))
{ {
pm.SendLocalizedMessage(1063440); // You don't have permission to negotiate wars. pm.SendLocalizedMessage(1063440); // You don't have permission to negotiate wars.
} }
else if (alliance != null && alliance.Leader != guild) else if (alliance != null && alliance.Leader != Guild)
{ {
pm.SendLocalizedMessage( // ~1_val~ is not the leader of the ~2_val~ alliance.
1063239, pm.SendLocalizedMessage(1063239, $"{Guild.Name}\t{alliance.Name}");
$"{guild.Name}\t{alliance.Name}" // You need to negotiate via ~1_val~ instead.
); // ~1_val~ is not the leader of the ~2_val~ alliance. pm.SendLocalizedMessage(1070707, alliance.Leader.Name);
pm.SendLocalizedMessage(
1070707,
alliance.Leader.Name
); // You need to negotiate via ~1_val~ instead.
} }
else if (otherAlliance != null && otherAlliance.Leader != m_Other) else if (otherAlliance != null && otherAlliance.Leader != _other)
{ {
pm.SendLocalizedMessage( // ~1_val~ is not the leader of the ~2_val~ alliance.
1063239, pm.SendLocalizedMessage(1063239, $"{_other.Name}\t{otherAlliance.Name}");
$"{m_Other.Name}\t{otherAlliance.Name}" // You need to negotiate via ~1_val~ instead.
); // ~1_val~ is not the leader of the ~2_val~ alliance. pm.SendLocalizedMessage(1070707, otherAlliance.Leader.Name);
pm.SendLocalizedMessage(
1070707,
otherAlliance.Leader.Name
); // You need to negotiate via ~1_val~ instead.
} }
else else
{ {
var activeWar = guild.FindActiveWar(m_Other); var activeWar = Guild.FindActiveWar(_other);
if (activeWar == null) if (activeWar == null)
{ {
var war = guild.FindPendingWar(m_Other); var war = Guild.FindPendingWar(_other);
var otherWar = m_Other.FindPendingWar(guild); var otherWar = _other.FindPendingWar(Guild);
// Note: OSI differs from what it says on website. unlimited war = 0 kills/ 0 hrs. Not > 999. (sidenote: they both cap at 65535, 7.5 years, but, still.) // Note: OSI differs from what it says on website. unlimited war = 0 kills/0 hrs.
// Not > 999. (sidenote: they both cap at 65535, 7.5 years, but, still.)
var tKills = info.GetTextEntry(11); var tKills = info.GetTextEntry(11);
var tWarLength = info.GetTextEntry(10); var tWarLength = info.GetTextEntry(10);
@ -110,7 +105,7 @@ namespace Server.Guilds
} }
else else
{ {
guild.PendingWars.Add(new WarDeclaration(guild, m_Other, maxKills, warLength, true)); Guild.PendingWars.Add(new WarDeclaration(Guild, _other, maxKills, warLength, true));
} }
if (otherWar != null) if (otherWar != null)
@ -121,7 +116,7 @@ namespace Server.Guilds
} }
else else
{ {
m_Other.PendingWars.Add(new WarDeclaration(m_Other, guild, maxKills, warLength, false)); _other.PendingWars.Add(new WarDeclaration(_other, Guild, maxKills, warLength, false));
} }
if (war != null) if (war != null)
@ -130,20 +125,22 @@ namespace Server.Guilds
} }
else else
{ {
m_Other.GuildMessage( // ~1_val~ has proposed a war.
_other.GuildMessage(
1070781, 1070781,
guild.Alliance != null Guild.Alliance != null
? guild.Alliance.Name ? Guild.Alliance.Name
: guild.Name : Guild.Name
); // ~1_val~ has proposed a war. );
} }
// War proposal has been sent to ~1_val~.
pm.SendLocalizedMessage( pm.SendLocalizedMessage(
1070751, 1070751,
m_Other.Alliance != null _other.Alliance != null
? m_Other.Alliance.Name ? _other.Alliance.Name
: m_Other.Name : _other.Name
); // War proposal has been sent to ~1_val~. );
} }
} }
@ -151,7 +148,7 @@ namespace Server.Guilds
} }
default: default:
{ {
pm.SendGump(new OtherGuildInfo(pm, guild, m_Other)); pm.SendGump(new OtherGuildInfo(pm, Guild, _other));
break; break;
} }
} }

View file

@ -351,8 +351,6 @@ namespace Server.Guilds
public class AllianceRosterGump : GuildDiplomacyGump public class AllianceRosterGump : GuildDiplomacyGump
{ {
private readonly AllianceInfo m_Alliance;
public AllianceRosterGump(PlayerMobile pm, Guild g, AllianceInfo alliance) : base( public AllianceRosterGump(PlayerMobile pm, Guild g, AllianceInfo alliance) : base(
pm, pm,
g, g,
@ -361,32 +359,12 @@ namespace Server.Guilds
0, 0,
alliance.m_Members, alliance.m_Members,
alliance.Name alliance.Name
) => )
m_Alliance = alliance; {
}
public AllianceRosterGump(
PlayerMobile pm, Guild g, AllianceInfo alliance, IComparer<Guild> currentComparer,
bool ascending, string filter, int startNumber
) : base(
pm,
g,
currentComparer,
ascending,
filter,
startNumber,
alliance.m_Members,
alliance.Name
) =>
m_Alliance = alliance;
protected override bool AllowAdvancedSearch => false; protected override bool AllowAdvancedSearch => false;
public override Gump GetResentGump(
PlayerMobile pm, Guild g, IComparer<Guild> comparer, bool ascending,
string filter, int startNumber
) =>
new AllianceRosterGump(pm, g, m_Alliance, comparer, ascending, filter, startNumber);
public override void OnResponse(NetState sender, in RelayInfo info) public override void OnResponse(NetState sender, in RelayInfo info)
{ {
if (info.ButtonID != 8) // So that they can't get to the AdvancedSearch button if (info.ButtonID != 8) // So that they can't get to the AdvancedSearch button