282 lines
8.8 KiB
C#
282 lines
8.8 KiB
C#
using System;
|
|
using Server;
|
|
using Server.Engines.Craft;
|
|
using Server.ContextMenus;
|
|
using System.Collections.Generic;
|
|
using Server.Multis;
|
|
using Server.Network;
|
|
|
|
namespace Server.Items
|
|
{
|
|
public class AddonToolComponent : BaseTool, IChopable
|
|
{
|
|
private CraftSystem _CraftSystem;
|
|
private int _LabelNumber;
|
|
private bool _TurnedOn;
|
|
|
|
public override CraftSystem CraftSystem { get { return _CraftSystem; } }
|
|
public override bool BreakOnDepletion { get { return false; } }
|
|
public override bool ForceShowProperties { get { return true; } }
|
|
public override int LabelNumber { get { return _LabelNumber; } }
|
|
|
|
public virtual bool NeedsWall { get { return false; } }
|
|
public virtual int MaxUses { get { return 5000; } }
|
|
public virtual Point3D WallPosition { get { return Point3D.Zero; } }
|
|
|
|
[CommandProperty(AccessLevel.GameMaster)]
|
|
public CraftAddon Addon { get; set; }
|
|
|
|
[CommandProperty(AccessLevel.GameMaster)]
|
|
public Point3D Offset { get; set; }
|
|
|
|
[CommandProperty(AccessLevel.GameMaster)]
|
|
public int InactiveID { get; private set; }
|
|
|
|
[CommandProperty(AccessLevel.GameMaster)]
|
|
public int ActiveID { get; private set; }
|
|
|
|
[CommandProperty(AccessLevel.GameMaster)]
|
|
public int InactiveMessage { get; set; }
|
|
|
|
[CommandProperty(AccessLevel.GameMaster)]
|
|
public int ActiveMessage { get; set; }
|
|
|
|
[CommandProperty(AccessLevel.GameMaster)]
|
|
public bool TurnedOn
|
|
{
|
|
get
|
|
{
|
|
return _TurnedOn;
|
|
}
|
|
set
|
|
{
|
|
if (_TurnedOn != value)
|
|
{
|
|
if (value)
|
|
ItemID = ActiveID;
|
|
else
|
|
ItemID = InactiveID;
|
|
}
|
|
|
|
_TurnedOn = value;
|
|
}
|
|
}
|
|
|
|
public AddonToolComponent(CraftSystem system, int inactiveid, int activeid, int cliloc, int uses, CraftAddon addon)
|
|
: this(system, inactiveid, activeid, 0, 0, cliloc, uses, addon)
|
|
{
|
|
}
|
|
|
|
public AddonToolComponent(CraftSystem system, int inactiveid, int activeid, int inactivemessage, int activemessage, int cliloc, int uses, CraftAddon addon)
|
|
: base(0, inactiveid)
|
|
{
|
|
_CraftSystem = system;
|
|
_LabelNumber = cliloc;
|
|
Addon = addon;
|
|
Movable = false;
|
|
|
|
InactiveID = inactiveid;
|
|
ActiveID = activeid;
|
|
|
|
InactiveMessage = inactivemessage;
|
|
ActiveMessage = activemessage;
|
|
|
|
UsesRemaining = uses;
|
|
}
|
|
|
|
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 GetContextMenuEntries(Mobile from, List<ContextMenuEntry> list)
|
|
{
|
|
base.GetContextMenuEntries(from, list);
|
|
|
|
if (Addon == null)
|
|
return;
|
|
|
|
BaseHouse house = BaseHouse.FindHouseAt(this);
|
|
|
|
if (house != null && house.HasSecureAccess(from, Addon.Level))
|
|
{
|
|
list.Add(new SimpleContextMenuEntry(from, 1155742, m => // Toggle: On/Off
|
|
{
|
|
if (_TurnedOn)
|
|
{
|
|
TurnedOn = false;
|
|
|
|
if (InactiveMessage != 0)
|
|
PrivateOverheadMessage(MessageType.Regular, 0x3B2, InactiveMessage, from.NetState);
|
|
}
|
|
else
|
|
{
|
|
TurnedOn = true;
|
|
|
|
if (ActiveMessage != 0)
|
|
{
|
|
PrivateOverheadMessage(MessageType.Regular, 0x3B2, ActiveMessage, from.NetState);
|
|
from.PlaySound(84);
|
|
}
|
|
}
|
|
}, 8));
|
|
|
|
SetSecureLevelEntry.AddTo(from, Addon, list);
|
|
}
|
|
}
|
|
|
|
public override bool CheckAccessible(Mobile m, ref int num)
|
|
{
|
|
if (m.InRange(GetWorldLocation(), 2))
|
|
{
|
|
BaseHouse house = BaseHouse.FindHouseAt(m);
|
|
|
|
if (house == null || Addon == null || !house.HasSecureAccess(m, Addon.Level))
|
|
{
|
|
num = 1061637; // You are not allowed to access
|
|
return false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
num = 500295;
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public override void OnDoubleClick(Mobile from)
|
|
{
|
|
if (Addon != null)
|
|
Addon.OnCraftComponentUsed(from, this);
|
|
}
|
|
|
|
public void SetCraftSystem(CraftSystem system)
|
|
{
|
|
_CraftSystem = system;
|
|
}
|
|
|
|
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 bool OnDragDrop(Mobile from, Item dropped)
|
|
{
|
|
BaseHouse house = BaseHouse.FindHouseAt(this);
|
|
|
|
if (house != null && Addon != null && house.HasSecureAccess(from, Addon.Level))
|
|
{
|
|
if (dropped is ITool && !(dropped is BaseRunicTool))
|
|
{
|
|
var tool = dropped as ITool;
|
|
|
|
if (tool.CraftSystem == _CraftSystem)
|
|
{
|
|
if (UsesRemaining >= MaxUses)
|
|
{
|
|
from.SendLocalizedMessage(1155740); // Adding this to the power tool would put it over the max number of charges the tool can hold.
|
|
}
|
|
else
|
|
{
|
|
int toadd = Math.Min(tool.UsesRemaining, MaxUses - UsesRemaining);
|
|
|
|
UsesRemaining += toadd;
|
|
tool.UsesRemaining -= toadd;
|
|
|
|
if (tool.UsesRemaining <= 0 && !tool.Deleted)
|
|
tool.Delete();
|
|
|
|
from.SendLocalizedMessage(1155741); // Charges have been added to the power tool.
|
|
|
|
return true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
from.SendLocalizedMessage(1074836); // The container cannot hold that type of object.
|
|
}
|
|
}
|
|
else
|
|
{
|
|
from.SendLocalizedMessage(1074836); // The container cannot hold that type of object.
|
|
}
|
|
}
|
|
else
|
|
{
|
|
from.SendLocalizedMessage(1074836); // The container cannot hold that type of object.
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public AddonToolComponent(Serial serial)
|
|
: base(serial)
|
|
{
|
|
}
|
|
|
|
public override void Serialize(GenericWriter writer)
|
|
{
|
|
base.Serialize(writer);
|
|
writer.Write((int)1);
|
|
|
|
writer.Write(InactiveMessage);
|
|
writer.Write(ActiveMessage);
|
|
writer.Write(Offset);
|
|
writer.Write(Addon);
|
|
writer.Write(_LabelNumber);
|
|
writer.Write(ActiveID);
|
|
writer.Write(InactiveID);
|
|
writer.Write(TurnedOn);
|
|
}
|
|
|
|
public override void Deserialize(GenericReader reader)
|
|
{
|
|
base.Deserialize(reader);
|
|
int version = reader.ReadInt();
|
|
|
|
switch (version)
|
|
{
|
|
case 1:
|
|
{
|
|
InactiveMessage = reader.ReadInt();
|
|
ActiveMessage = reader.ReadInt();
|
|
goto case 0;
|
|
}
|
|
case 0:
|
|
{
|
|
Offset = reader.ReadPoint3D();
|
|
Addon = reader.ReadItem() as CraftAddon;
|
|
_LabelNumber = reader.ReadInt();
|
|
ActiveID = reader.ReadInt();
|
|
InactiveID = reader.ReadInt();
|
|
TurnedOn = reader.ReadBool();
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (Addon != null)
|
|
Addon.OnCraftComponentLoaded(this);
|
|
}
|
|
}
|
|
}
|