181 lines
4.3 KiB
C#
181 lines
4.3 KiB
C#
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 { }
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|