Overwrite
Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
This commit is contained in:
@@ -0,0 +1,180 @@
|
||||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
using Server.Network;
|
||||
using Server.Mobiles;
|
||||
using System.Collections;
|
||||
|
||||
namespace Server.Engines.XmlSpawner2
|
||||
{
|
||||
public class XmlDeathAction : XmlAttachment
|
||||
{
|
||||
private string m_Action; // action string
|
||||
private string m_Condition; // condition string
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public string Action { get { return m_Action; } set { m_Action = value; } }
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public string Condition { get { return m_Condition; } set { m_Condition = value; } }
|
||||
|
||||
// These are the various ways in which the message attachment can be constructed.
|
||||
// These can be called via the [addatt interface, via scripts, via the spawner ATTACH keyword.
|
||||
// Other overloads could be defined to handle other types of arguments
|
||||
|
||||
// a serial constructor is REQUIRED
|
||||
public XmlDeathAction(ASerial serial)
|
||||
: base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
[Attachable]
|
||||
public XmlDeathAction(string action)
|
||||
{
|
||||
Action = action;
|
||||
}
|
||||
|
||||
[Attachable]
|
||||
public XmlDeathAction()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
public override void Serialize(GenericWriter writer)
|
||||
{
|
||||
base.Serialize(writer);
|
||||
|
||||
writer.Write((int)1);
|
||||
// version 1
|
||||
writer.Write(m_Condition);
|
||||
// version 0
|
||||
writer.Write(m_Action);
|
||||
|
||||
}
|
||||
|
||||
public override void Deserialize(GenericReader reader)
|
||||
{
|
||||
base.Deserialize(reader);
|
||||
|
||||
int version = reader.ReadInt();
|
||||
switch (version)
|
||||
{
|
||||
case 1:
|
||||
m_Condition = reader.ReadString();
|
||||
goto case 0;
|
||||
case 0:
|
||||
m_Action = reader.ReadString();
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public override void OnAttach()
|
||||
{
|
||||
base.OnAttach();
|
||||
|
||||
if (AttachedTo is Item)
|
||||
{
|
||||
// dont allow item attachments
|
||||
Delete();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public override bool HandlesOnKilled { get { return true; } }
|
||||
|
||||
public override void OnKilled(Mobile killed, Mobile killer)
|
||||
{
|
||||
base.OnKilled(killed, killer);
|
||||
|
||||
if (killed == null) return;
|
||||
|
||||
// now check for any conditions as well
|
||||
// check for any condition that must be met for this entry to be processed
|
||||
if (Condition != null)
|
||||
{
|
||||
string status_str;
|
||||
|
||||
if (!BaseXmlSpawner.CheckPropertyString(null, killed, Condition, killer, out status_str))
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
ExecuteDeathActions(killed.Corpse, killer, Action);
|
||||
}
|
||||
|
||||
private void ExecuteDeathActions(Item corpse, Mobile killer, string actions)
|
||||
{
|
||||
if (actions == null || actions.Length <= 0) return;
|
||||
// execute any action associated with it
|
||||
// allow for multiple action strings on a single line separated by a semicolon
|
||||
|
||||
string[] args = actions.Split(';');
|
||||
|
||||
for (int j = 0; j < args.Length; j++)
|
||||
{
|
||||
ExecuteDeathAction(corpse, killer, args[j]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static void ExecuteDeathAction(Item corpse, Mobile killer, string action)
|
||||
{
|
||||
if (action == null || action.Length <= 0 || corpse == null) return;
|
||||
|
||||
string status_str = null;
|
||||
Server.Mobiles.XmlSpawner.SpawnObject TheSpawn = new Server.Mobiles.XmlSpawner.SpawnObject(null, 0);
|
||||
|
||||
TheSpawn.TypeName = action;
|
||||
string substitutedtypeName = BaseXmlSpawner.ApplySubstitution(null, corpse, killer, action);
|
||||
string typeName = BaseXmlSpawner.ParseObjectType(substitutedtypeName);
|
||||
|
||||
Point3D loc = corpse.Location;
|
||||
Map map = corpse.Map;
|
||||
|
||||
if (BaseXmlSpawner.IsTypeOrItemKeyword(typeName))
|
||||
{
|
||||
BaseXmlSpawner.SpawnTypeKeyword(corpse, TheSpawn, typeName, substitutedtypeName, true, killer, loc, map, out status_str);
|
||||
}
|
||||
else
|
||||
{
|
||||
// its a regular type descriptor so find out what it is
|
||||
Type type = SpawnerType.GetType(typeName);
|
||||
try
|
||||
{
|
||||
string[] arglist = BaseXmlSpawner.ParseString(substitutedtypeName, 3, "/");
|
||||
object o = Server.Mobiles.XmlSpawner.CreateObject(type, arglist[0]);
|
||||
|
||||
if (o == null)
|
||||
{
|
||||
status_str = "invalid type specification: " + arglist[0];
|
||||
}
|
||||
else
|
||||
if (o is Mobile)
|
||||
{
|
||||
Mobile m = (Mobile)o;
|
||||
if (m is BaseCreature)
|
||||
{
|
||||
BaseCreature c = (BaseCreature)m;
|
||||
c.Home = loc; // Spawners location is the home point
|
||||
}
|
||||
|
||||
m.Location = loc;
|
||||
m.Map = map;
|
||||
|
||||
BaseXmlSpawner.ApplyObjectStringProperties(null, substitutedtypeName, m, killer, corpse, out status_str);
|
||||
}
|
||||
else
|
||||
if (o is Item)
|
||||
{
|
||||
Item item = (Item)o;
|
||||
BaseXmlSpawner.AddSpawnItem(null, corpse, TheSpawn, item, loc, map, killer, false, substitutedtypeName, out status_str);
|
||||
}
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user