Files
abysmal-isle/Scripts/Mobiles/NPCs/Veterinarian.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

245 lines
6.8 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using Server;
using Server.Gumps;
using Server.Items;
using Server.Network;
using Server.Targeting;
using Server.ContextMenus;
namespace Server.Mobiles
{
public class Veterinarian : BaseVendor
{
private List<SBInfo> m_SBInfos = new List<SBInfo>();
protected override List<SBInfo> SBInfos { get { return m_SBInfos; } }
[Constructable]
public Veterinarian()
: base("the vet")
{
SetSkill(SkillName.AnimalLore, 85.0, 100.0);
SetSkill(SkillName.Veterinary, 90.0, 100.0);
}
public override void InitSBInfo()
{
m_SBInfos.Add(new SBVeterinarian());
}
private static Dictionary<Mobile, Timer> m_ExpireTable = new Dictionary<Mobile, Timer>();
public static BaseCreature[] GetDeadPets(Mobile from)
{
List<BaseCreature> pets = new List<BaseCreature>();
IPooledEnumerable eable = from.GetMobilesInRange(12);
foreach (Mobile m in eable)
{
BaseCreature bc = m as BaseCreature;
if (bc != null && bc.IsDeadBondedPet && bc.ControlMaster == from && from.InLOS(bc))
pets.Add(bc);
}
eable.Free();
if (from.Backpack != null)
{
BrokenAutomatonHead head = from.Backpack.FindItemByType(typeof(BrokenAutomatonHead)) as BrokenAutomatonHead;
if (head != null && head.Automaton != null && !head.Automaton.Deleted)
pets.Add(head.Automaton);
}
return pets.ToArray();
}
public static int GetResurrectionFee(BaseCreature bc)
{
if (bc is KotlAutomaton)
return 0;
int fee = (int)(100 + Math.Pow(1.1041, bc.MinTameSkill));
if (fee > 30000)
fee = 30000;
else if (fee < 100)
fee = 100;
return fee;
}
public override void OnMovement(Mobile m, Point3D oldLocation)
{
if (this.InRange(m, 3) && !this.InRange(oldLocation, 3) && this.InLOS(m))
{
BaseCreature[] pets = GetDeadPets(m);
if (pets.Length > 0)
{
m.Frozen = true;
m_ExpireTable[m] = Timer.DelayCall(TimeSpan.FromMinutes(1.0), new TimerStateCallback<Mobile>(ResetExpire), m);
m.CloseGump(typeof(VetResurrectGump));
m.SendGump(new VetResurrectGump(this, pets));
}
}
}
public static void ResetExpire(Mobile m)
{
m.Frozen = false;
m.CloseGump(typeof(VetResurrectGump));
if (m_ExpireTable.ContainsKey(m))
{
Timer t = m_ExpireTable[m];
if (t != null)
t.Stop();
m_ExpireTable.Remove(m);
}
}
public Veterinarian(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
/*int version = */
reader.ReadInt();
}
}
public class VetResurrectGump : Gump
{
//public override int TypeID { get { return 0xF3E96; } }
private Veterinarian m_Vet;
private BaseCreature[] m_Pets;
public VetResurrectGump(Veterinarian vet, BaseCreature[] pets)
: base(150, 50)
{
m_Vet = vet;
m_Pets = pets;
AddPage(0);
Closable = false;
AddImage(0, 0, 0xE10);
AddImageTiled(0, 14, 15, 380, 0xE13);
AddImageTiled(380, 14, 14, 380, 0xE15);
AddImage(0, 381, 0xE16);
AddImageTiled(15, 381, 370, 16, 0xE17);
AddImageTiled(15, 0, 370, 16, 0xE11);
AddImage(380, 0, 0xE12);
AddImage(380, 381, 0xE18);
AddImageTiled(15, 15, 365, 370, 0xA40);
AddHtmlLocalized(30, 20, 355, 35, 1113193, 0xFFFFFF, false, false); // Ah, thine pet seems to be in dire condition! I can help thee, but must charge a small fee...
AddHtmlLocalized(30, 72, 345, 40, 1113284, 0x1DB2D, false, false); // Please select the pet you wish to resurrect:
AddHtmlLocalized(20, 280, 345, 40, 1113286, 0x1DB2D, false, false); // <CENTER>Your pet will suffer 0.2 points of skill-loss if resurrected in this manner.</CENTER>
AddImageTiled(95, 62, 200, 1, 0x23C5);
AddImageTiled(15, 325, 365, 1, 0x2393);
AddButton(110, 343, 0xF7, 0xF8, 1, GumpButtonType.Reply, 0);
AddButton(230, 343, 0xF2, 0xF1, -1, GumpButtonType.Reply, 0);
AddImageTiled(15, 14, 365, 1, 0x2393);
AddImageTiled(380, 14, 1, 370, 0x2391);
AddImageTiled(15, 385, 365, 1, 0x2393);
AddImageTiled(15, 14, 1, 370, 0x2391);
AddImageTiled(0, 0, 395, 1, 0x23C5);
AddImageTiled(394, 0, 1, 397, 0x23C3);
AddImageTiled(0, 396, 395, 1, 0x23C5);
AddImageTiled(0, 0, 1, 397, 0x23C3);
for (int i = 0, yOffset = 0; i < m_Pets.Length; i++, yOffset += 35)
{
BaseCreature pet = m_Pets[i];
AddRadio(30, 102 + yOffset, 0x25FF, 0x2602, (i == 0), i);
AddLabel(70, 107 + yOffset, 0x47E, String.Format("{0} {1}", pet.Name, Veterinarian.GetResurrectionFee(pet).ToString()));
}
}
public override void OnResponse(NetState sender, RelayInfo info)
{
Mobile from = sender.Mobile;
from.Frozen = false;
switch (info.ButtonID)
{
case -1:
{
// You decide against paying the Veterinarian, and the ghost of your pet looks at you sadly...
from.SendLocalizedMessage(1113197);
break;
}
case 1:
{
for (int i = 0; i < m_Pets.Length; i++)
{
BaseCreature pet = m_Pets[i];
if (info.IsSwitched(i))
{
int fee = Veterinarian.GetResurrectionFee(pet);
if (!pet.IsDeadBondedPet)
from.SendLocalizedMessage(501041); // Target is not dead.
else if (!from.CanSee(pet) || !from.InLOS(pet))
from.SendLocalizedMessage(503376); // Target cannot be seen.
else if (!from.InRange(pet, 12))
from.SendLocalizedMessage(500643); // Target is too far away.
else if (pet.ControlMaster != from)
from.SendLocalizedMessage(1113200); // You must be the owner of that pet to have it resurrected.
else if (pet.Corpse != null && !pet.Corpse.Deleted)
from.SendLocalizedMessage(1113279); // That creature's spirit lacks cohesion. Try again in a few minutes.
else if (Banker.Withdraw(from, fee))
{
pet.PlaySound(0x214);
pet.ResurrectPet();
for (int j = 0; j < pet.Skills.Length; ++j) // Decrease all skills on pet.
pet.Skills[j].Base -= 0.2;
if (pet.Map == Map.Internal)
pet.MoveToWorld(from.Location, from.Map);
from.SendLocalizedMessage(1060398, fee.ToString()); // ~1_AMOUNT~ gold has been withdrawn from your bank box.
from.SendLocalizedMessage(1060022, Banker.GetBalance(from).ToString(), 0x16); // You have ~1_AMOUNT~ gold in cash remaining in your bank box.
}
else
from.SendLocalizedMessage(1060020); // Unfortunately, you do not have enough cash in your bank to cover the cost of the healing.
break;
}
}
break;
}
}
}
}
}