Files
Unstable Kitsune b918192e4e Overwrite
Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
2023-11-28 23:20:26 -05:00

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;
}
}
}
}