Files
abysmal-isle/Scripts/Services/XmlSpawner/XmlSpawner Core/XmlAttachments/XmlDeathAction.cs
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

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