fix: Updates spawner gump visuals! Thanks Quick! (#1102)
This update changes the default RunUO SpawnerGump's overall look and feel and expands slightly some functionality. Inspired by the XmlSpawner gump.   1. The name of the spawner is displayed 2. This displays the total current spawn with the current allowed max spawn 3. Cleans up the display of the current count and the max count 4. The ability to turn on/off the spawner 5. Several changes to buttons - Simple Save and Cancel instead of Okay, Cancel and Apply. - Props button to display spawner properties - Goto button to teleport to the spawner - Reset button that will clear all the spawned mobs and turn off the spawner - Repositioned the buttons to make a little more sense 6. The sum of all the max spawn values per entry, from all pages
This commit is contained in:
parent
cb474712f8
commit
6601101e2e
3 changed files with 1550 additions and 1460 deletions
File diff suppressed because it is too large
Load diff
|
|
@ -13,81 +13,88 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
|
||||
*************************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using Server.Commands.Generic;
|
||||
using Server.Json;
|
||||
using Server.Network;
|
||||
|
||||
namespace Server.Engines.Spawners
|
||||
namespace Server.Engines.Spawners;
|
||||
|
||||
public class ExportSpawnersCommand : BaseCommand
|
||||
{
|
||||
public class ExportSpawnersCommand : BaseCommand
|
||||
public static void Initialize()
|
||||
{
|
||||
public static void Initialize()
|
||||
TargetCommands.Register(new ExportSpawnersCommand());
|
||||
}
|
||||
|
||||
public ExportSpawnersCommand()
|
||||
{
|
||||
AccessLevel = AccessLevel.GameMaster;
|
||||
Supports = CommandSupport.AllItems & ~CommandSupport.Contained;
|
||||
Commands = new[] { "ExportSpawners" };
|
||||
ObjectTypes = ObjectTypes.Items;
|
||||
Usage = "ExportSpawners";
|
||||
Description = "Exports the given spawners to a file";
|
||||
ListOptimized = true;
|
||||
}
|
||||
|
||||
public override void ExecuteList(CommandEventArgs e, List<object> list)
|
||||
{
|
||||
string path = e.Arguments.Length == 0 ? string.Empty : e.Arguments[0].Trim();
|
||||
string condition = e.Arguments.Length == 2 ? e.Arguments[1].Trim() : string.Empty;
|
||||
|
||||
if (string.IsNullOrEmpty(path))
|
||||
{
|
||||
TargetCommands.Register(new ExportSpawnersCommand());
|
||||
path = Path.Combine(Core.BaseDirectory, $"Data/Spawns/{Utility.GetTimeStamp()}.json");
|
||||
}
|
||||
else
|
||||
{
|
||||
var directory = Path.GetDirectoryName(Path.GetFullPath(path!))!;
|
||||
if (!Path.IsPathRooted(path))
|
||||
{
|
||||
path = Path.Combine(Core.BaseDirectory, path);
|
||||
PathUtility.EnsureDirectory(directory);
|
||||
}
|
||||
else if (!Directory.Exists(directory))
|
||||
{
|
||||
LogFailure("Directory doesn't exist.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
public ExportSpawnersCommand()
|
||||
NetState.FlushAll();
|
||||
|
||||
var options = JsonConfig.GetOptions(new TextDefinitionConverterFactory());
|
||||
|
||||
var spawnRecords = new List<DynamicJson>(list.Count);
|
||||
for (var i = 0; i < list.Count; i++)
|
||||
{
|
||||
AccessLevel = AccessLevel.GameMaster;
|
||||
Supports = CommandSupport.AllItems & ~CommandSupport.Contained;
|
||||
Commands = new[] { "ExportSpawners" };
|
||||
ObjectTypes = ObjectTypes.Items;
|
||||
Usage = "ExportSpawners";
|
||||
Description = "Exports the given the spawners to the a file";
|
||||
ListOptimized = true;
|
||||
}
|
||||
|
||||
public override void ExecuteList(CommandEventArgs e, List<object> list)
|
||||
{
|
||||
var path = e.Arguments.Length == 0 ? null : e.Arguments[0].Trim();
|
||||
|
||||
if (string.IsNullOrEmpty(path))
|
||||
if (list[i] is BaseSpawner spawner)
|
||||
{
|
||||
path = Path.Combine(Core.BaseDirectory, $"Data/Spawns/{Utility.GetTimeStamp()}.json");
|
||||
}
|
||||
else
|
||||
{
|
||||
var directory = Path.GetDirectoryName(Path.GetFullPath(path!))!;
|
||||
if (!Path.IsPathRooted(path))
|
||||
{
|
||||
path = Path.Combine(Core.BaseDirectory, path);
|
||||
PathUtility.EnsureDirectory(directory);
|
||||
}
|
||||
else if (!Directory.Exists(directory))
|
||||
{
|
||||
LogFailure("Directory doesn't exist.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
NetState.FlushAll();
|
||||
|
||||
var options = JsonConfig.GetOptions(new TextDefinitionConverterFactory());
|
||||
|
||||
var spawnRecords = new List<DynamicJson>(list.Count);
|
||||
for (var i = 0; i < list.Count; i++)
|
||||
{
|
||||
if (list[i] is BaseSpawner spawner)
|
||||
if (!string.IsNullOrEmpty(spawner.Name) && spawner.Name.StartsWith(
|
||||
condition,
|
||||
StringComparison.OrdinalIgnoreCase
|
||||
))
|
||||
{
|
||||
var dynamicJson = DynamicJson.Create(spawner.GetType());
|
||||
spawner.ToJson(dynamicJson, options);
|
||||
spawnRecords.Add(dynamicJson);
|
||||
}
|
||||
}
|
||||
|
||||
if (spawnRecords.Count == 0)
|
||||
{
|
||||
LogFailure("No matching spawners found.");
|
||||
return;
|
||||
}
|
||||
|
||||
e.Mobile.SendMessage("Exporting spawners...");
|
||||
|
||||
JsonConfig.Serialize(path, spawnRecords, options);
|
||||
|
||||
e.Mobile.SendMessage($"Spawners exported to {path}");
|
||||
}
|
||||
|
||||
if (spawnRecords.Count == 0)
|
||||
{
|
||||
LogFailure("No matching spawners found.");
|
||||
return;
|
||||
}
|
||||
|
||||
e.Mobile.SendMessage("Exporting spawners...");
|
||||
|
||||
JsonConfig.Serialize(path, spawnRecords, options);
|
||||
|
||||
e.Mobile.SendMessage($"Spawners exported to {path}");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,369 +1,447 @@
|
|||
using System.Collections.Generic;
|
||||
using Server.Collections;
|
||||
using Server.Gumps;
|
||||
using Server.Network;
|
||||
|
||||
namespace Server.Engines.Spawners
|
||||
namespace Server.Engines.Spawners;
|
||||
|
||||
public class SpawnerGump : Gump
|
||||
{
|
||||
public class SpawnerGump : Gump
|
||||
private readonly BaseSpawner _spawner;
|
||||
private SpawnerEntry _entry;
|
||||
private int _page;
|
||||
|
||||
public SpawnerGump(BaseSpawner spawner, SpawnerEntry focusentry = null, int page = 0) : base(50, 50)
|
||||
{
|
||||
private readonly BaseSpawner m_Spawner;
|
||||
private SpawnerEntry m_Entry;
|
||||
private int m_Page;
|
||||
_spawner = spawner;
|
||||
_entry = focusentry;
|
||||
_page = page;
|
||||
|
||||
public SpawnerGump(BaseSpawner spawner, SpawnerEntry focusentry = null, int page = 0) : base(50, 50)
|
||||
AddPage(0);
|
||||
|
||||
AddBackground(0, 0, 346, 400 + (_entry != null ? 44 : 0), 5054);
|
||||
AddAlphaRegion(0, 0, 346, 400 + (_entry != null ? 44 : 0));
|
||||
|
||||
AddHtml(240, 1, 250, 20, "<BASEFONT COLOR=#F4F4F4>#</BASEFONT>");
|
||||
AddHtml(271, 1, 250, 20, "<BASEFONT COLOR=#F4F4F4>Max</BASEFONT>");
|
||||
AddHtml(311, 1, 250, 20, "<BASEFONT COLOR=#F4F4F4>Prb</BASEFONT>");
|
||||
|
||||
// AddLabel( 95, 1, 0, "Creatures List" );
|
||||
|
||||
var offset = 0;
|
||||
|
||||
for (var i = 0; i < 13; i++)
|
||||
{
|
||||
m_Spawner = spawner;
|
||||
m_Entry = focusentry;
|
||||
m_Page = page;
|
||||
var textIndex = i * 5;
|
||||
var entryIndex = _page * 13 + i;
|
||||
|
||||
AddPage(0);
|
||||
SpawnerEntry entry = null;
|
||||
|
||||
AddBackground(0, 0, 343, 371 + (m_Entry != null ? 44 : 0), 5054);
|
||||
|
||||
AddHtml(95, 1, 250, 20, "<BASEFONT COLOR=#F4F4F4>Creatures List</BASEFONT>");
|
||||
AddHtml(245, 1, 250, 20, "<BASEFONT COLOR=#F4F4F4>#</BASEFONT>");
|
||||
AddHtml(282, 1, 250, 20, "<BASEFONT COLOR=#F4F4F4>Prb</BASEFONT>");
|
||||
|
||||
// AddLabel( 95, 1, 0, "Creatures List" );
|
||||
|
||||
var offset = 0;
|
||||
|
||||
for (var i = 0; i < 13; i++)
|
||||
if (entryIndex < spawner.Entries.Count)
|
||||
{
|
||||
var textindex = i * 5;
|
||||
var entryindex = m_Page * 13 + i;
|
||||
entry = _spawner.Entries[entryIndex];
|
||||
}
|
||||
|
||||
SpawnerEntry entry = null;
|
||||
if (entry == null || _entry != entry)
|
||||
{
|
||||
AddButton(
|
||||
5,
|
||||
22 * i + 21 + offset,
|
||||
entry != null ? 0xFBA : 0xFA5,
|
||||
entry != null ? 0xFBC : 0xFA7,
|
||||
GetButtonID(2, i * 2)
|
||||
); // Expand
|
||||
}
|
||||
else
|
||||
{
|
||||
AddButton(
|
||||
5,
|
||||
22 * i + 21 + offset,
|
||||
0xFBB,
|
||||
0xFBC,
|
||||
GetButtonID(2, i * 2)
|
||||
); // Unexpand
|
||||
}
|
||||
|
||||
if (entryindex < spawner.Entries.Count)
|
||||
AddButton(38, 22 * i + 21 + offset, 0xFA2, 0xFA4, GetButtonID(2, 1 + i * 2)); // Delete
|
||||
|
||||
AddImageTiled(71, 22 * i + 20 + offset, 161, 23, 0xA40); // creature text box
|
||||
AddImageTiled(72, 22 * i + 21 + offset, 159, 21, 0xBBC); // creature text box
|
||||
|
||||
AddImageTiled(235, 22 * i + 20 + offset, 35, 23, 0xA40); // count html label
|
||||
AddImageTiled(236, 22 * i + 21 + offset, 33, 21, 0xE14); // count html label
|
||||
|
||||
AddImageTiled(267, 22 * i + 20 + offset, 35, 23, 0xA40); // maxcount text box
|
||||
AddImageTiled(268, 22 * i + 21 + offset, 33, 21, 0xBBC); // maxcount text box
|
||||
|
||||
AddImageTiled(305, 22 * i + 20 + offset, 35, 23, 0xA40); // probability text box
|
||||
AddImageTiled(306, 22 * i + 21 + offset, 33, 21, 0xBBC); // probability text box
|
||||
|
||||
string name;
|
||||
string probability;
|
||||
string maxCount;
|
||||
var flags = EntryFlags.None;
|
||||
|
||||
if (entry != null)
|
||||
{
|
||||
name = entry.SpawnedName;
|
||||
probability = entry.SpawnedProbability.ToString();
|
||||
maxCount = entry.SpawnedMaxCount.ToString();
|
||||
flags = entry.Valid;
|
||||
|
||||
var count = spawner.CountSpawns(entry);
|
||||
|
||||
AddHtml(235, 22 * i + 20 + offset + 1, 35, 15, $"<BASEFONT COLOR={GetCountColor(count, entry.SpawnedMaxCount)}><div align=RIGHT>{count}<BASEFONT COLOR=#F4F4F4>/</BASEFONT></div></BASEFONT>");
|
||||
}
|
||||
else
|
||||
{
|
||||
name = "";
|
||||
probability = "";
|
||||
maxCount = "";
|
||||
}
|
||||
|
||||
// creature
|
||||
AddTextEntry(
|
||||
75,
|
||||
22 * i + 21 + offset,
|
||||
156,
|
||||
21,
|
||||
(flags & EntryFlags.InvalidType) != 0 ? 33 : 0,
|
||||
textIndex,
|
||||
name
|
||||
);
|
||||
AddTextEntry(270, 22 * i + 21 + offset, 30, 21, 0, textIndex + 1, maxCount); // max count
|
||||
AddTextEntry(308, 22 * i + 21 + offset, 30, 21, 0, textIndex + 2, probability); // probability
|
||||
|
||||
if (entry != null && _entry == entry)
|
||||
{
|
||||
AddLabel(5, 22 * i + 42, 0x384, "Params");
|
||||
AddImageTiled(55, 22 * i + 42, 253, 23, 0xA40); // Parameters
|
||||
AddImageTiled(56, 22 * i + 43, 251, 21, 0xBBC); // Parameters
|
||||
|
||||
AddLabel(5, 22 * i + 64, 0x384, "Props");
|
||||
AddImageTiled(55, 22 * i + 64, 253, 23, 0xA40); // Properties
|
||||
AddImageTiled(56, 22 * i + 65, 251, 21, 0xBBC); // Properties
|
||||
|
||||
AddTextEntry(
|
||||
59,
|
||||
22 * i + 42,
|
||||
248,
|
||||
21,
|
||||
(flags & EntryFlags.InvalidParams) != 0 ? 33 : 0,
|
||||
textIndex + 3,
|
||||
entry.Parameters
|
||||
); // parameters
|
||||
AddTextEntry(
|
||||
59,
|
||||
22 * i + 62,
|
||||
248,
|
||||
21,
|
||||
(flags & EntryFlags.InvalidProps) != 0 ? 33 : 0,
|
||||
textIndex + 4,
|
||||
entry.Properties
|
||||
); // properties
|
||||
|
||||
offset += 44;
|
||||
}
|
||||
}
|
||||
|
||||
if (spawner.Running)
|
||||
{
|
||||
AddButton(5, 312 + offset, 0x2A4E, 0x2A3A, GetButtonID(1, 6));
|
||||
AddLabel(38, 317 + offset, 0x384, "On");
|
||||
}
|
||||
else
|
||||
{
|
||||
AddButton(5, 312 + offset, 0x2A62, 0x2A3A, GetButtonID(1, 7));
|
||||
AddLabel(38, 317 + offset, 0x384, "Off");
|
||||
}
|
||||
|
||||
var totalSpawned = 0;
|
||||
var totalSpawns = 0;
|
||||
var totalWeight = 0;
|
||||
|
||||
foreach (SpawnerEntry spawnerEntry in _spawner.Entries)
|
||||
{
|
||||
totalSpawns += spawnerEntry.SpawnedMaxCount;
|
||||
totalSpawned += spawner.CountSpawns(spawnerEntry);
|
||||
totalWeight += spawnerEntry.SpawnedProbability;
|
||||
}
|
||||
|
||||
AddHtml(270, 308 + offset, 35, 20, $"<BASEFONT COLOR=#F4F4F4><CENTER>{totalSpawns}</CENTER></BASEFONT>");
|
||||
AddHtml(308, 308 + offset, 35, 20, $"<BASEFONT COLOR=#F4F4F4><CENTER>{totalWeight}</CENTER></BASEFONT>");
|
||||
|
||||
AddHtml(5, 1, 161, 20, $"<BASEFONT COLOR=#FFEA00>{spawner.Name}</BASEFONT><BASEFONT COLOR={GetCountColor(totalSpawned, spawner.Count)}> ({totalSpawned}/{spawner.Count})</BASEFONT>");
|
||||
|
||||
AddButton(5, 347 + offset, 0xFAB, 0xFAD, GetButtonID(1, 2));
|
||||
AddLabel(38, 347 + offset, 0x384, "Props");
|
||||
|
||||
AddButton(5, 369 + offset, 0xFAE, 0xFAF, GetButtonID(1, 8));
|
||||
AddLabel(38, 369 + offset, 0x384, "Goto");
|
||||
|
||||
AddButton(90, 325 + offset, 0xFA2, 0xFA3, GetButtonID(1, 9));
|
||||
AddLabel(123, 325 + offset, 0x384, "Reset");
|
||||
|
||||
AddButton(90, 347 + offset, 0xFB4, 0xFB6, GetButtonID(1, 3));
|
||||
AddLabel(123, 347 + offset, 0x384, "Bring Home");
|
||||
|
||||
AddButton(90, 369 + offset, 0xFA8, 0xFAA, GetButtonID(1, 4));
|
||||
AddLabel(123, 369 + offset, 0x384, "Total Respawn");
|
||||
|
||||
AddButton(260, 347 + offset, 0xFB7, 0xFB9, GetButtonID(1, 5));
|
||||
AddLabel(293, 347 + offset, 0x384, "Save");
|
||||
|
||||
AddButton(260, 369 + offset, 0xFB1, 0xFB3, 0);
|
||||
AddLabel(293, 369 + offset, 0x384, "Cancel");
|
||||
|
||||
if (_page > 0)
|
||||
{
|
||||
AddButton(200, 308 + offset, 0x15E3, 0x15E7, GetButtonID(1, 0));
|
||||
}
|
||||
else
|
||||
{
|
||||
AddImage(200, 308 + offset, 0x25EA);
|
||||
}
|
||||
|
||||
if ((_page + 1) * 13 <= _spawner.Entries.Count)
|
||||
{
|
||||
AddButton(217, 308 + offset, 0x15E1, 0x15E5, GetButtonID(1, 1));
|
||||
}
|
||||
else
|
||||
{
|
||||
AddImage(217, 308 + offset, 0x25E6);
|
||||
}
|
||||
}
|
||||
|
||||
public int GetButtonID(int type, int index) => 1 + index * 10 + type;
|
||||
|
||||
private static string GetCountColor(int count, int maxCount) =>
|
||||
((double) count / maxCount) switch
|
||||
{
|
||||
<= 0.25 => "#DE3163", // red
|
||||
<= 0.50 => "#FF7F50", // orange
|
||||
<= 0.75 => "#DFFF00", // yellow
|
||||
<= 1 => "#00FF00", // green
|
||||
_ => "#F4F4F4" // white
|
||||
};
|
||||
|
||||
public void CreateArray(RelayInfo info, Mobile from, BaseSpawner spawner)
|
||||
{
|
||||
var ocount = spawner.Entries.Count;
|
||||
|
||||
using var queue = PooledRefQueue<SpawnerEntry>.Create();
|
||||
|
||||
for (var i = 0; i < 13; i++)
|
||||
{
|
||||
var index = i * 5;
|
||||
var entryindex = _page * 13 + i;
|
||||
|
||||
var cte = info.GetTextEntry(index);
|
||||
var mte = info.GetTextEntry(index + 1);
|
||||
var poste = info.GetTextEntry(index + 2);
|
||||
var parmte = info.GetTextEntry(index + 3);
|
||||
var propte = info.GetTextEntry(index + 4);
|
||||
|
||||
if (cte == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var str = cte.Text.Trim().ToLower();
|
||||
|
||||
if (str.Length > 0)
|
||||
{
|
||||
var type = AssemblyHandler.FindTypeByName(str);
|
||||
|
||||
if (type == null)
|
||||
{
|
||||
entry = m_Spawner.Entries[entryindex];
|
||||
from.SendMessage("{0} is not a valid type name for entry #{1}.", str, i);
|
||||
return;
|
||||
}
|
||||
|
||||
if (entry == null || m_Entry != entry)
|
||||
SpawnerEntry entry;
|
||||
|
||||
if (entryindex < ocount)
|
||||
{
|
||||
AddButton(
|
||||
5,
|
||||
22 * i + 21 + offset,
|
||||
entry != null ? 0xFBA : 0xFA5,
|
||||
entry != null ? 0xFBC : 0xFA7,
|
||||
GetButtonID(2, i * 2)
|
||||
); // Expand
|
||||
entry = spawner.Entries[entryindex];
|
||||
entry.SpawnedName = str;
|
||||
|
||||
if (mte != null)
|
||||
{
|
||||
entry.SpawnedMaxCount = Utility.ToInt32(mte.Text.Trim());
|
||||
}
|
||||
|
||||
if (poste != null)
|
||||
{
|
||||
entry.SpawnedProbability = Utility.ToInt32(poste.Text.Trim());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
AddButton(
|
||||
5,
|
||||
22 * i + 21 + offset,
|
||||
0xFBB,
|
||||
0xFBC,
|
||||
GetButtonID(2, i * 2)
|
||||
); // Unexpand
|
||||
var maxcount = 1;
|
||||
var probcount = 100;
|
||||
|
||||
if (mte != null)
|
||||
{
|
||||
maxcount = Utility.ToInt32(mte.Text.Trim());
|
||||
}
|
||||
|
||||
if (poste != null)
|
||||
{
|
||||
probcount = Utility.ToInt32(poste.Text.Trim());
|
||||
}
|
||||
|
||||
entry = spawner.AddEntry(str, probcount, maxcount);
|
||||
}
|
||||
|
||||
AddButton(38, 22 * i + 21 + offset, 0xFA2, 0xFA4, GetButtonID(2, 1 + i * 2)); // Delete
|
||||
|
||||
AddImageTiled(71, 22 * i + 20 + offset, 161, 23, 0xA40); // creature text box
|
||||
AddImageTiled(72, 22 * i + 21 + offset, 159, 21, 0xBBC); // creature text box
|
||||
|
||||
AddImageTiled(235, 22 * i + 20 + offset, 35, 23, 0xA40); // maxcount text box
|
||||
AddImageTiled(236, 22 * i + 21 + offset, 33, 21, 0xBBC); // maxcount text box
|
||||
|
||||
AddImageTiled(273, 22 * i + 20 + offset, 35, 23, 0xA40); // probability text box
|
||||
AddImageTiled(274, 22 * i + 21 + offset, 33, 21, 0xBBC); // probability text box
|
||||
|
||||
var name = "";
|
||||
var probability = "";
|
||||
var maxcount = "";
|
||||
var flags = EntryFlags.None;
|
||||
|
||||
if (entry != null)
|
||||
if (parmte != null)
|
||||
{
|
||||
name = entry.SpawnedName;
|
||||
probability = entry.SpawnedProbability.ToString();
|
||||
maxcount = entry.SpawnedMaxCount.ToString();
|
||||
flags = entry.Valid;
|
||||
|
||||
AddLabel(315, 22 * i + 20 + offset, 0, spawner.CountSpawns(entry).ToString());
|
||||
entry.Parameters = parmte.Text.Trim();
|
||||
}
|
||||
|
||||
AddTextEntry(
|
||||
75,
|
||||
22 * i + 21 + offset,
|
||||
156,
|
||||
21,
|
||||
(flags & EntryFlags.InvalidType) != 0 ? 33 : 0,
|
||||
textindex,
|
||||
name
|
||||
); // creature
|
||||
AddTextEntry(239, 22 * i + 21 + offset, 30, 21, 0, textindex + 1, maxcount); // max count
|
||||
AddTextEntry(277, 22 * i + 21 + offset, 30, 21, 0, textindex + 2, probability); // probability
|
||||
|
||||
if (entry != null && m_Entry == entry)
|
||||
if (propte != null)
|
||||
{
|
||||
AddLabel(5, 22 * i + 42, 0x384, "Params");
|
||||
AddImageTiled(55, 22 * i + 42, 253, 23, 0xA40); // Parameters
|
||||
AddImageTiled(56, 22 * i + 43, 251, 21, 0xBBC); // Parameters
|
||||
|
||||
AddLabel(5, 22 * i + 64, 0x384, "Props");
|
||||
AddImageTiled(55, 22 * i + 64, 253, 23, 0xA40); // Properties
|
||||
AddImageTiled(56, 22 * i + 65, 251, 21, 0xBBC); // Properties
|
||||
|
||||
AddTextEntry(
|
||||
59,
|
||||
22 * i + 42,
|
||||
248,
|
||||
21,
|
||||
(flags & EntryFlags.InvalidParams) != 0 ? 33 : 0,
|
||||
textindex + 3,
|
||||
entry.Parameters
|
||||
); // parameters
|
||||
AddTextEntry(
|
||||
59,
|
||||
22 * i + 62,
|
||||
248,
|
||||
21,
|
||||
(flags & EntryFlags.InvalidProps) != 0 ? 33 : 0,
|
||||
textindex + 4,
|
||||
entry.Properties
|
||||
); // properties
|
||||
|
||||
offset += 44;
|
||||
entry.Properties = propte.Text.Trim();
|
||||
}
|
||||
}
|
||||
|
||||
AddButton(5, 347 + offset, 0xFB1, 0xFB3, 0);
|
||||
AddLabel(38, 347 + offset, 0x384, "Cancel");
|
||||
|
||||
AddButton(5, 325 + offset, 0xFB7, 0xFB9, GetButtonID(1, 2));
|
||||
AddLabel(38, 325 + offset, 0x384, "Okay");
|
||||
|
||||
AddButton(110, 325 + offset, 0xFB4, 0xFB6, GetButtonID(1, 3));
|
||||
AddLabel(143, 325 + offset, 0x384, "Bring to Home");
|
||||
|
||||
AddButton(110, 347 + offset, 0xFA8, 0xFAA, GetButtonID(1, 4));
|
||||
AddLabel(143, 347 + offset, 0x384, "Total Respawn");
|
||||
|
||||
AddButton(253, 325 + offset, 0xFB7, 0xFB9, GetButtonID(1, 5));
|
||||
AddLabel(286, 325 + offset, 0x384, "Apply");
|
||||
|
||||
if (m_Page > 0)
|
||||
else if (entryindex < ocount && spawner.Entries[entryindex] != null)
|
||||
{
|
||||
AddButton(276, 308 + offset, 0x15E3, 0x15E7, GetButtonID(1, 0));
|
||||
}
|
||||
else
|
||||
{
|
||||
AddImage(276, 308 + offset, 0x25EA);
|
||||
}
|
||||
|
||||
if ((m_Page + 1) * 13 <= m_Spawner.Entries.Count)
|
||||
{
|
||||
AddButton(293, 308 + offset, 0x15E1, 0x15E5, GetButtonID(1, 1));
|
||||
}
|
||||
else
|
||||
{
|
||||
AddImage(293, 308 + offset, 0x25E6);
|
||||
queue.Enqueue(spawner.Entries[entryindex]);
|
||||
}
|
||||
}
|
||||
|
||||
public int GetButtonID(int type, int index) => 1 + index * 10 + type;
|
||||
|
||||
public void CreateArray(RelayInfo info, Mobile from, BaseSpawner spawner)
|
||||
while (queue.Count > 0)
|
||||
{
|
||||
var ocount = spawner.Entries.Count;
|
||||
|
||||
var rementries = new List<SpawnerEntry>();
|
||||
|
||||
for (var i = 0; i < 13; i++)
|
||||
{
|
||||
var index = i * 5;
|
||||
var entryindex = m_Page * 13 + i;
|
||||
|
||||
var cte = info.GetTextEntry(index);
|
||||
var mte = info.GetTextEntry(index + 1);
|
||||
var poste = info.GetTextEntry(index + 2);
|
||||
var parmte = info.GetTextEntry(index + 3);
|
||||
var propte = info.GetTextEntry(index + 4);
|
||||
|
||||
if (cte == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var str = cte.Text.Trim().ToLower();
|
||||
|
||||
if (str.Length > 0)
|
||||
{
|
||||
var type = AssemblyHandler.FindTypeByName(str);
|
||||
|
||||
if (type == null)
|
||||
{
|
||||
from.SendMessage("{0} is not a valid type name for entry #{1}.", str, i);
|
||||
return;
|
||||
}
|
||||
|
||||
SpawnerEntry entry;
|
||||
|
||||
if (entryindex < ocount)
|
||||
{
|
||||
entry = spawner.Entries[entryindex];
|
||||
entry.SpawnedName = str;
|
||||
|
||||
if (mte != null)
|
||||
{
|
||||
entry.SpawnedMaxCount = Utility.ToInt32(mte.Text.Trim());
|
||||
}
|
||||
|
||||
if (poste != null)
|
||||
{
|
||||
entry.SpawnedProbability = Utility.ToInt32(poste.Text.Trim());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var maxcount = 1;
|
||||
var probcount = 100;
|
||||
|
||||
if (mte != null)
|
||||
{
|
||||
maxcount = Utility.ToInt32(mte.Text.Trim());
|
||||
}
|
||||
|
||||
if (poste != null)
|
||||
{
|
||||
probcount = Utility.ToInt32(poste.Text.Trim());
|
||||
}
|
||||
|
||||
entry = spawner.AddEntry(str, probcount, maxcount);
|
||||
}
|
||||
|
||||
if (parmte != null)
|
||||
{
|
||||
entry.Parameters = parmte.Text.Trim();
|
||||
}
|
||||
|
||||
if (propte != null)
|
||||
{
|
||||
entry.Properties = propte.Text.Trim();
|
||||
}
|
||||
}
|
||||
else if (entryindex < ocount && spawner.Entries[entryindex] != null)
|
||||
{
|
||||
rementries.Add(spawner.Entries[entryindex]);
|
||||
}
|
||||
}
|
||||
|
||||
for (var i = 0; i < rementries.Count; i++)
|
||||
{
|
||||
spawner.RemoveEntry(rementries[i]);
|
||||
}
|
||||
|
||||
if (ocount == 0 && spawner.Entries.Count > 0)
|
||||
{
|
||||
spawner.Start();
|
||||
}
|
||||
spawner.RemoveEntry(queue.Dequeue());
|
||||
}
|
||||
|
||||
public override void OnResponse(NetState state, RelayInfo info)
|
||||
if (ocount == 0 && spawner.Entries.Count > 0)
|
||||
{
|
||||
if (m_Spawner.Deleted)
|
||||
{
|
||||
return;
|
||||
}
|
||||
spawner.Start();
|
||||
}
|
||||
}
|
||||
|
||||
var val = info.ButtonID - 1;
|
||||
public override void OnResponse(NetState state, RelayInfo info)
|
||||
{
|
||||
if (_spawner.Deleted)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (val < 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
var val = info.ButtonID - 1;
|
||||
|
||||
var type = val % 10;
|
||||
var index = val / 10;
|
||||
if (val < 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case 0: // Cancel
|
||||
var type = val % 10;
|
||||
var index = val / 10;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case 0: // Cancel
|
||||
{
|
||||
return;
|
||||
case 1:
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
switch (index)
|
||||
{
|
||||
switch (index)
|
||||
{
|
||||
case 0:
|
||||
case 0:
|
||||
{
|
||||
if (_spawner.Entries != null && _page > 0)
|
||||
{
|
||||
if (m_Spawner.Entries != null && m_Page > 0)
|
||||
{
|
||||
m_Page--;
|
||||
m_Entry = null;
|
||||
}
|
||||
_page--;
|
||||
_entry = null;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case 1:
|
||||
break;
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
if ((_page + 1) * 13 <= _spawner.Entries?.Count)
|
||||
{
|
||||
if ((m_Page + 1) * 13 <= m_Spawner.Entries?.Count)
|
||||
{
|
||||
m_Page++;
|
||||
m_Entry = null;
|
||||
}
|
||||
_page++;
|
||||
_entry = null;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case 2: // Okay
|
||||
{
|
||||
CreateArray(info, state.Mobile, m_Spawner);
|
||||
return;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
m_Spawner.BringToHome();
|
||||
break;
|
||||
}
|
||||
case 4: // Complete respawn
|
||||
{
|
||||
m_Spawner.Respawn();
|
||||
break;
|
||||
}
|
||||
case 5:
|
||||
{
|
||||
CreateArray(info, state.Mobile, m_Spawner);
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 2: // Props
|
||||
{
|
||||
state.Mobile.SendGump(new PropertiesGump(state.Mobile, _spawner));
|
||||
break;
|
||||
}
|
||||
case 3: // Bring Home
|
||||
{
|
||||
_spawner.BringToHome();
|
||||
break;
|
||||
}
|
||||
case 4: // Complete respawn
|
||||
{
|
||||
_spawner.Respawn();
|
||||
break;
|
||||
}
|
||||
case 5: // Save
|
||||
{
|
||||
CreateArray(info, state.Mobile, _spawner);
|
||||
break;
|
||||
}
|
||||
case 6: // On button
|
||||
{
|
||||
_spawner.Running = false;
|
||||
|
||||
break;
|
||||
break;
|
||||
}
|
||||
case 7: // Off button
|
||||
{
|
||||
_spawner.Running = true;
|
||||
break;
|
||||
}
|
||||
case 8: // Goto
|
||||
{
|
||||
state.Mobile.MoveToWorld(_spawner.Location, _spawner.Map);
|
||||
break;
|
||||
}
|
||||
case 9: // Reset
|
||||
{
|
||||
_spawner.Reset();
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 2:
|
||||
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
var entryIndex = index / 2 + _page * 13;
|
||||
var buttonType = index % 2;
|
||||
|
||||
if (entryIndex >= 0 && entryIndex < _spawner.Entries.Count)
|
||||
{
|
||||
var entryindex = index / 2 + m_Page * 13;
|
||||
var buttontype = index % 2;
|
||||
|
||||
if (entryindex >= 0 && entryindex < m_Spawner.Entries.Count)
|
||||
var entry = _spawner.Entries[entryIndex];
|
||||
if (buttonType == 0) // Spawn creature
|
||||
{
|
||||
var entry = m_Spawner.Entries[entryindex];
|
||||
if (buttontype == 0) // Spawn creature
|
||||
{
|
||||
m_Entry = m_Entry != entry ? entry : null;
|
||||
}
|
||||
else // Remove creatures
|
||||
{
|
||||
m_Spawner.RemoveSpawn(entryindex);
|
||||
}
|
||||
_entry = _entry != entry ? entry : null;
|
||||
}
|
||||
else // Remove creatures
|
||||
{
|
||||
_spawner.RemoveSpawn(entryIndex);
|
||||
}
|
||||
|
||||
CreateArray(info, state.Mobile, m_Spawner);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (m_Entry != null && m_Spawner.Entries?.Contains(m_Entry) == true)
|
||||
{
|
||||
state.Mobile.SendGump(new SpawnerGump(m_Spawner, m_Entry, m_Page));
|
||||
}
|
||||
else
|
||||
{
|
||||
state.Mobile.SendGump(new SpawnerGump(m_Spawner, null, m_Page));
|
||||
}
|
||||
CreateArray(info, state.Mobile, _spawner);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (_entry != null && _spawner.Entries?.Contains(_entry) == true)
|
||||
{
|
||||
state.Mobile.SendGump(new SpawnerGump(_spawner, _entry, _page));
|
||||
}
|
||||
else
|
||||
{
|
||||
state.Mobile.SendGump(new SpawnerGump(_spawner, null, _page));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue