servuo/Scripts/Items/Addons/AddonComponent.cs

397 lines
10 KiB
C#
Raw Permalink Normal View History

+ Removed most file header regions. + Add MONO to Makefile compile definitions. + Update Ultima SDK to support MONO compile definition. + Rename Properties Gump parent directory to prevent VS issues. + Console error messages will now use red instead of dark red font. + Add crash state handler function to Core. + AI optimizations and housekeeping. + Context Menu optimizations and housekeeping. + Add ability to drop throttled packets. + Add string parsing support to Rectangle3D. + Optimize guild messages and chat. + IAddon implements IChopable. + Add more flexibility for altering Mobile names. + Add ability to enable or disable OPL for individual mobiles. + Optimize damaging regions and ensure timers are removed properly. + Update Welcome Timer with more intuitive message groups. + Normalize all virtue related objects to the Server.Services.Virtues namespace. + Add ability for ISpawner to append OPL and Context Menus to their spawn. + Add EventSink events for obtaining items, equipping items, context menus, and world broadcasts. + Add ability to lock a creature's direction and movement regardless of AI manipulation. + Add ability to dynamically change a creature's approach range and wait state. + Add extended enumeration features for AOS attributes. + Add ability to control whether creatures have blood, and its color. + Expose corpse flag manipulation methods. + Add ability to prevent criminal action when looting a corpse. + Corpse will now be permanently tagged as murderer at time of death if owner is a murderer. + Add TextDefinition support for Commodity Deed descriptions. + House add-on and component optimizations and housekeeping. + Item light is no longer backed by the direction property. + ITool implements IEntity. + Prevent trading of Siege Bless items. + Guards are naturally be immune to guards. + Siege Shard initialization housekeeping. + Character Creation housekeeping. + Generic commands housekeeping. + Add Mark command for staff.
2018-07-19 22:12:52 +01:00
#region References
using Server.ContextMenus;
using Server.Engines.Craft;
using Server.Network;
using System;
using System.Collections.Generic;
+ Removed most file header regions. + Add MONO to Makefile compile definitions. + Update Ultima SDK to support MONO compile definition. + Rename Properties Gump parent directory to prevent VS issues. + Console error messages will now use red instead of dark red font. + Add crash state handler function to Core. + AI optimizations and housekeeping. + Context Menu optimizations and housekeeping. + Add ability to drop throttled packets. + Add string parsing support to Rectangle3D. + Optimize guild messages and chat. + IAddon implements IChopable. + Add more flexibility for altering Mobile names. + Add ability to enable or disable OPL for individual mobiles. + Optimize damaging regions and ensure timers are removed properly. + Update Welcome Timer with more intuitive message groups. + Normalize all virtue related objects to the Server.Services.Virtues namespace. + Add ability for ISpawner to append OPL and Context Menus to their spawn. + Add EventSink events for obtaining items, equipping items, context menus, and world broadcasts. + Add ability to lock a creature's direction and movement regardless of AI manipulation. + Add ability to dynamically change a creature's approach range and wait state. + Add extended enumeration features for AOS attributes. + Add ability to control whether creatures have blood, and its color. + Expose corpse flag manipulation methods. + Add ability to prevent criminal action when looting a corpse. + Corpse will now be permanently tagged as murderer at time of death if owner is a murderer. + Add TextDefinition support for Commodity Deed descriptions. + House add-on and component optimizations and housekeeping. + Item light is no longer backed by the direction property. + ITool implements IEntity. + Prevent trading of Siege Bless items. + Guards are naturally be immune to guards. + Siege Shard initialization housekeeping. + Character Creation housekeeping. + Generic commands housekeeping. + Add Mark command for staff.
2018-07-19 22:12:52 +01:00
#endregion
2013-10-28 07:09:42 +00:00
namespace Server.Items
{
[Anvil]
public class AnvilComponent : AddonComponent
{
[Constructable]
public AnvilComponent(int itemID)
: base(itemID)
{ }
public AnvilComponent(Serial serial)
: base(serial)
{ }
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
reader.ReadInt();
}
}
[Forge]
public class ForgeComponent : AddonComponent
{
[Constructable]
public ForgeComponent(int itemID)
: base(itemID)
{ }
public ForgeComponent(Serial serial)
: base(serial)
{ }
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
reader.ReadInt();
}
}
public class LocalizedAddonComponent : AddonComponent
{
private int m_LabelNumber;
[Constructable]
public LocalizedAddonComponent(int itemID, int labelNumber)
: base(itemID)
{
m_LabelNumber = labelNumber;
}
public LocalizedAddonComponent(Serial serial)
: base(serial)
{ }
[CommandProperty(AccessLevel.GameMaster)]
public int Number
{
get { return m_LabelNumber; }
set
{
m_LabelNumber = value;
InvalidateProperties();
}
}
2020-04-16 20:21:33 -04:00
public override int LabelNumber => m_LabelNumber;
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
writer.Write(m_LabelNumber);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
2020-04-16 18:32:20 -04:00
int version = reader.ReadInt();
switch (version)
{
case 0:
{
m_LabelNumber = reader.ReadInt();
break;
}
}
}
}
public class AddonComponent : Item, IChopable
{
2020-04-16 20:21:33 -04:00
public override bool ForceShowProperties => Addon != null && Addon.ForceShowProperties;
private static readonly LightEntry[] m_Entries =
{
new LightEntry(
LightType.WestSmall,
1122,
1123,
1124,
1141,
1142,
1143,
1144,
1145,
1146,
2347,
2359,
2360,
2361,
2362,
2363,
2364,
2387,
2388,
2389,
2390,
2391,
2392),
new LightEntry(
LightType.NorthSmall,
1131,
1133,
1134,
1147,
1148,
1149,
1150,
1151,
1152,
2352,
2373,
2374,
2375,
2376,
2377,
2378,
2401,
2402,
2403,
2404,
2405,
2406),
new LightEntry(LightType.Circle300, 6526, 6538, 6571), new LightEntry(LightType.Circle150, 5703, 6587)
};
[Constructable]
public AddonComponent(int itemID)
: base(itemID)
{
Movable = false;
ApplyLightTo(this);
}
public AddonComponent(Serial serial)
: base(serial)
{ }
[CommandProperty(AccessLevel.GameMaster)]
public BaseAddon Addon { get; set; }
[CommandProperty(AccessLevel.GameMaster)]
public Point3D Offset { get; set; }
[Hue, CommandProperty(AccessLevel.GameMaster)]
public override int Hue
{
get { return base.Hue; }
set
{
base.Hue = value;
if (Addon != null && Addon.ShareHue)
Addon.Hue = value;
}
}
2020-04-16 20:21:33 -04:00
public virtual bool NeedsWall => false;
public virtual Point3D WallPosition => Point3D.Zero;
public static void ApplyLightTo(Item item)
{
if ((item.ItemData.Flags & TileFlag.LightSource) == 0)
return; // not a light source
2020-04-16 18:32:20 -04:00
int itemID = item.ItemID;
2020-04-16 18:32:20 -04:00
foreach (LightEntry entry in m_Entries)
{
2020-04-16 18:32:20 -04:00
int[] toMatch = entry.m_ItemIDs;
bool contains = false;
2020-04-16 18:32:20 -04:00
for (int j = 0; !contains && j < toMatch.Length; ++j)
contains = (itemID == toMatch[j]);
if (contains)
{
item.Light = entry.m_Light;
return;
}
}
}
public override void OnDoubleClick(Mobile from)
{
if (Addon != null)
Addon.OnComponentUsed(this, from);
}
public void OnChop(Mobile from)
{
if (Addon != null && from.InRange(GetWorldLocation(), 3))
Addon.OnChop(from);
else
from.SendLocalizedMessage(500446); // That is too far away.
}
public override void OnLocationChange(Point3D old)
{
if (Addon != null)
Addon.Location = new Point3D(X - Offset.X, Y - Offset.Y, Z - Offset.Z);
}
public override void OnMapChange()
{
if (Addon != null)
Addon.Map = Map;
}
public override void OnAfterDelete()
{
base.OnAfterDelete();
if (Addon != null)
Addon.Delete();
}
public override void GetProperties(ObjectPropertyList list)
{
base.GetProperties(list);
if (Addon != null)
{
Addon.GetProperties(list, this);
}
}
public override void GetContextMenuEntries(Mobile m, List<ContextMenuEntry> list)
{
base.GetContextMenuEntries(m, list);
if (Addon != null)
{
Addon.GetContextMenuEntries(m, list);
}
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(1); // version
writer.Write(Addon);
writer.Write(Offset);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
2020-04-16 18:32:20 -04:00
int version = reader.ReadInt();
switch (version)
{
case 1:
case 0:
{
Addon = reader.ReadItem() as BaseAddon;
Offset = reader.ReadPoint3D();
if (Addon != null)
{
Addon.OnComponentLoaded(this);
ApplyLightTo(this);
}
else
{
Delete();
}
break;
}
}
if (version < 1 && Weight == 0)
Weight = -1;
}
private class LightEntry
{
public readonly LightType m_Light;
public readonly int[] m_ItemIDs;
public LightEntry(LightType light, params int[] itemIDs)
{
m_Light = light;
m_ItemIDs = itemIDs;
}
}
}
public class InstrumentedAddonComponent : AddonComponent
{
[CommandProperty(AccessLevel.GameMaster)]
public int SuccessSound { get; set; }
[Constructable]
public InstrumentedAddonComponent(int itemID, int wellSound)
: base(itemID)
{
SuccessSound = wellSound;
}
public override void OnDoubleClick(Mobile from)
{
if (!from.InRange(GetWorldLocation(), 2))
{
from.LocalOverheadMessage(MessageType.Regular, 0x3B2, 1019045); // I can't reach that.
}
else if (from.BeginAction(typeof(InstrumentedAddonComponent)))
{
Timer.DelayCall(TimeSpan.FromMilliseconds(1000), () =>
{
from.EndAction(typeof(InstrumentedAddonComponent));
});
from.PlaySound(SuccessSound);
}
else
{
from.SendLocalizedMessage(500119); // You must wait to perform another action
}
}
public InstrumentedAddonComponent(Serial serial)
: base(serial)
{ }
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0);
writer.Write(SuccessSound);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
reader.ReadInt();
SuccessSound = reader.ReadInt();
}
}
2013-10-28 07:09:42 +00:00
}