servuo/Scripts/Skills/Inscribe.cs
TrueUO e78c0795a9 Books now once again work correctly in the CC and EC.
Travesty now uses the proper weapon specials. Specials when in natual form have also been toned down
Controlled creatures no longer lose focus when attacking on kill/attack control order
Temporarily removed looting rights for healing as this is suspected in causing a shard lockup. It will either be refactored or investigated further
Fixed issue where boat courses were not working properly and the tillerman was piloting the boat in the wrong DirectionL
Boat course no longer works in the corgul region
Corgul Island map now indicates when the encounter will Expire
Simplified code used to determine if an item or subclass of an item can be crafted
2020-04-19 13:26:24 -04:00

171 lines
5.9 KiB
C#

using Server.Items;
using Server.Targeting;
using System;
using System.Collections;
namespace Server.SkillHandlers
{
public class Inscribe
{
private static readonly Hashtable m_UseTable = new Hashtable();
public static void Initialize()
{
SkillInfo.Table[(int)SkillName.Inscribe].Callback = OnUse;
}
public static TimeSpan OnUse(Mobile m)
{
Target target = new InternalTargetSrc();
m.Target = target;
m.SendLocalizedMessage(1046295); // Target the book you wish to copy.
target.BeginTimeout(m, TimeSpan.FromMinutes(1.0));
return TimeSpan.FromSeconds(1.0);
}
public static Mobile GetUser(BaseBook book)
{
return (Mobile)m_UseTable[book];
}
public static bool IsEmpty(BaseBook book)
{
foreach (BookPageInfo page in book.Pages)
{
foreach (string line in page.Lines)
{
if (line.Trim().Length != 0)
return false;
}
}
return true;
}
public static void Copy(BaseBook bookSrc, BaseBook bookDst)
{
bookDst.Title = bookSrc.Title;
bookDst.Author = bookSrc.Author;
BookPageInfo[] pagesSrc = bookSrc.Pages;
BookPageInfo[] pagesDst = bookDst.Pages;
for (int i = 0; i < pagesSrc.Length && i < pagesDst.Length; i++)
{
BookPageInfo pageSrc = pagesSrc[i];
BookPageInfo pageDst = pagesDst[i];
int length = pageSrc.Lines.Length;
pageDst.Lines = new string[length];
for (int j = 0; j < length; j++)
pageDst.Lines[j] = pageSrc.Lines[j];
}
}
private static void SetUser(BaseBook book, Mobile mob)
{
m_UseTable[book] = mob;
}
private static void CancelUser(BaseBook book)
{
m_UseTable.Remove(book);
}
private class InternalTargetSrc : Target
{
public InternalTargetSrc()
: base(3, false, TargetFlags.None)
{
}
protected override void OnTarget(Mobile from, object targeted)
{
BaseBook book = targeted as BaseBook;
if (book != null)
{
if (IsEmpty(book))
from.SendLocalizedMessage(501611); // Can't copy an empty book.
else if (GetUser(book) != null)
from.SendLocalizedMessage(501621); // Someone else is inscribing that item.
else
{
Target target = new InternalTargetDst(book);
from.Target = target;
from.SendLocalizedMessage(501612); // Select a book to copy this to.
target.BeginTimeout(from, TimeSpan.FromMinutes(1.0));
SetUser(book, from);
}
}
else if (targeted is Engines.Khaldun.MysteriousBook)
{
((Engines.Khaldun.MysteriousBook)targeted).OnInscribeTarget(from);
}
else
{
from.SendLocalizedMessage(1046296); // That is not a book
}
}
protected override void OnTargetCancel(Mobile from, TargetCancelType cancelType)
{
if (cancelType == TargetCancelType.Timeout)
from.SendLocalizedMessage(501619); // You have waited too long to make your inscribe selection, your inscription attempt has timed out.
}
}
private class InternalTargetDst : Target
{
private readonly BaseBook m_BookSrc;
public InternalTargetDst(BaseBook bookSrc)
: base(3, false, TargetFlags.None)
{
m_BookSrc = bookSrc;
}
protected override void OnTarget(Mobile from, object targeted)
{
if (m_BookSrc.Deleted)
return;
BaseBook bookDst = targeted as BaseBook;
if (bookDst == null)
from.SendLocalizedMessage(1046296); // That is not a book
else if (IsEmpty(m_BookSrc))
from.SendLocalizedMessage(501611); // Can't copy an empty book.
else if (bookDst == m_BookSrc)
from.SendLocalizedMessage(501616); // Cannot copy a book onto itself.
else if (!bookDst.Writable)
from.SendLocalizedMessage(501614); // Cannot write into that book.
else if (GetUser(bookDst) != null)
from.SendLocalizedMessage(501621); // Someone else is inscribing that item.
else
{
if (from.CheckTargetSkill(SkillName.Inscribe, bookDst, 0, 50))
{
Copy(m_BookSrc, bookDst);
from.SendLocalizedMessage(501618); // You make a copy of the book.
from.PlaySound(0x249);
}
else
{
from.SendLocalizedMessage(501617); // You fail to make a copy of the book.
}
}
}
protected override void OnTargetCancel(Mobile from, TargetCancelType cancelType)
{
if (cancelType == TargetCancelType.Timeout)
from.SendLocalizedMessage(501619); // You have waited too long to make your inscribe selection, your inscription attempt has timed out.
}
protected override void OnTargetFinish(Mobile from)
{
CancelUser(m_BookSrc);
}
}
}
}