279 lines
6.0 KiB
C#
279 lines
6.0 KiB
C#
using System;
|
|
using Server;
|
|
using System.IO;
|
|
using System.Collections;
|
|
using Server.Multis;
|
|
using Server.Items;
|
|
using Server.Mobiles;
|
|
|
|
namespace Server.Engines.XmlSpawner2
|
|
{
|
|
public class XmlSpawnerAddon : BaseAddon
|
|
{
|
|
|
|
public override bool ShareHue { get { return false; } }
|
|
|
|
[CommandProperty(AccessLevel.GameMaster)]
|
|
public virtual int PartialVisibility
|
|
{
|
|
get
|
|
{
|
|
int nvisible = 0;
|
|
// figure out what percentage of components is visible and return that value
|
|
// go through the components
|
|
for (int i = 0; i < Components.Count; i++)
|
|
{
|
|
if (Components[i].Visible) nvisible++;
|
|
}
|
|
|
|
return (int)(100.0 * nvisible / Components.Count + 0.5);
|
|
}
|
|
set
|
|
{
|
|
if (Components == null || Components.Count < 1) return;
|
|
|
|
// assign visibility to the components based upon the percentage value
|
|
int nvisible = value * (Components.Count - 1) / 100;
|
|
|
|
// go through the components and assign visibility to the specified percentage
|
|
// starting at the beginning of the component list
|
|
for (int i = 0; i < Components.Count; i++)
|
|
{
|
|
Components[i].Visible = (i < nvisible);
|
|
}
|
|
}
|
|
}
|
|
|
|
// create an addon with the static components described in the multi.txt file
|
|
public static XmlSpawnerAddon ReadMultiFile(string filename, out string status_str)
|
|
{
|
|
status_str = null;
|
|
|
|
if (filename == null) return null;
|
|
|
|
XmlSpawnerAddon newaddon = null;
|
|
|
|
// look for the file in the default spawner locations
|
|
string dirname = XmlSpawner.LocateFile(filename);
|
|
|
|
if (System.IO.File.Exists(dirname))
|
|
{
|
|
int ncomponents = 0;
|
|
|
|
newaddon = new XmlSpawnerAddon();
|
|
|
|
try
|
|
{
|
|
ncomponents = LoadAddonFromMulti(newaddon, dirname, out status_str);
|
|
}
|
|
catch
|
|
{
|
|
newaddon.Delete();
|
|
status_str = "Bad Multi file : " + filename;
|
|
return null;
|
|
}
|
|
|
|
if (ncomponents == 0)
|
|
{
|
|
newaddon.Delete();
|
|
status_str += " : " + filename;
|
|
return null;
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
status_str = "No such file : " + filename;
|
|
}
|
|
|
|
return newaddon;
|
|
}
|
|
|
|
// adds components from a multi.txt file to an existing addon
|
|
public static int LoadAddonFromMulti(XmlSpawnerAddon newaddon, string filename, out string status_str)
|
|
{
|
|
status_str = null;
|
|
|
|
if (filename == null)
|
|
{
|
|
status_str = "Invalid filename";
|
|
return 0;
|
|
}
|
|
|
|
if (newaddon == null)
|
|
{
|
|
status_str = "Invalid addon";
|
|
return 0;
|
|
}
|
|
|
|
bool badformat = false;
|
|
int ncomponents = 0;
|
|
|
|
if (System.IO.File.Exists(filename))
|
|
{
|
|
|
|
using (StreamReader sr = new StreamReader(filename))
|
|
{
|
|
string line;
|
|
int linenumber = 0;
|
|
|
|
// Read and process lines from the file until the end of the file is reached.
|
|
// Individual lines have the format of
|
|
// itemid x y z visible [hue] ; attachment[,args]
|
|
// where visible is a 0/1 and hue can be optionally specified for individual itemid entries.
|
|
while ((line = sr.ReadLine()) != null)
|
|
{
|
|
linenumber++;
|
|
|
|
// process the line
|
|
if (line.Length == 0) continue;
|
|
|
|
// first parse out the component specification from any optional attachment specifications
|
|
|
|
string[] specs = line.Split(';');
|
|
|
|
// the component spec will always be first
|
|
|
|
if (specs == null || specs.Length < 1) continue;
|
|
|
|
string[] args = specs[0].Trim().Split(' ');
|
|
|
|
AddonComponent newcomponent = null;
|
|
|
|
if (args != null && args.Length >= 5)
|
|
{
|
|
|
|
int itemid = -1;
|
|
int x = 0;
|
|
int y = 0;
|
|
int z = 0;
|
|
int visible = 0;
|
|
int hue = -1;
|
|
|
|
try
|
|
{
|
|
itemid = int.Parse(args[0]);
|
|
x = int.Parse(args[1]);
|
|
y = int.Parse(args[2]);
|
|
z = int.Parse(args[3]);
|
|
visible = int.Parse(args[4]);
|
|
|
|
// handle the optional fields that are not part of the original multi.txt specification
|
|
if (args.Length > 5)
|
|
{
|
|
hue = int.Parse(args[5]);
|
|
}
|
|
}
|
|
catch { badformat = true; }
|
|
|
|
if (itemid < 0 || badformat)
|
|
{
|
|
status_str = String.Format("Error line {0}", linenumber);
|
|
break;
|
|
}
|
|
|
|
// create the new component
|
|
newcomponent = new AddonComponent(itemid);
|
|
|
|
// set the properties according to the specification
|
|
newcomponent.Visible = (visible == 1);
|
|
|
|
if (hue >= 0)
|
|
newcomponent.Hue = hue;
|
|
|
|
// add it to the addon
|
|
newaddon.AddComponent(newcomponent, x, y, z);
|
|
|
|
ncomponents++;
|
|
|
|
}
|
|
|
|
// if a valid component was added, then check to see if any additional attachment specifications need to be processed
|
|
if (newcomponent != null && specs.Length > 1)
|
|
{
|
|
for (int j = 1; j < specs.Length; j++)
|
|
{
|
|
|
|
if (specs[j] == null) continue;
|
|
|
|
string attachstring = specs[j].Trim();
|
|
|
|
Type type = null;
|
|
try
|
|
{
|
|
type = SpawnerType.GetType(BaseXmlSpawner.ParseObjectType(attachstring));
|
|
}
|
|
catch { }
|
|
|
|
// if so then create it
|
|
if (type != null && type.IsSubclassOf(typeof(XmlAttachment)))
|
|
{
|
|
object newo = XmlSpawner.CreateObject(type, attachstring, false, true);
|
|
if (newo is XmlAttachment)
|
|
{
|
|
// add the attachment to the target
|
|
XmlAttach.AttachTo(newcomponent, (XmlAttachment)newo);
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
sr.Close();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
status_str = "No such file : " + filename;
|
|
}
|
|
|
|
if (badformat)
|
|
{
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
return ncomponents;
|
|
}
|
|
}
|
|
|
|
public override BaseAddonDeed Deed
|
|
{
|
|
get
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public XmlSpawnerAddon()
|
|
{
|
|
}
|
|
|
|
public XmlSpawnerAddon(Serial serial)
|
|
: base(serial)
|
|
{
|
|
}
|
|
|
|
public override void Serialize(GenericWriter writer)
|
|
{
|
|
base.Serialize(writer);
|
|
writer.Write(1); // Version
|
|
// version 1
|
|
writer.Write(PartialVisibility);
|
|
}
|
|
|
|
public override void Deserialize(GenericReader reader)
|
|
{
|
|
base.Deserialize(reader);
|
|
int version = reader.ReadInt();
|
|
|
|
switch (version)
|
|
{
|
|
case 1:
|
|
PartialVisibility = reader.ReadInt();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
} |