Files
abysmal-isle/Scripts/Mobiles/Normal/Leviathan.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

238 lines
6.6 KiB
C#

using System;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName("a leviathan corpse")]
public class Leviathan : BaseCreature
{
private static readonly Type[] m_Artifacts = new Type[]
{
// Decorations
typeof(CandelabraOfSouls),
typeof(GhostShipAnchor),
typeof(GoldBricks),
typeof(PhillipsWoodenSteed),
typeof(SeahorseStatuette),
typeof(ShipModelOfTheHMSCape),
typeof(AdmiralsHeartyRum),
// Equipment
typeof(AlchemistsBauble),
typeof(ArcticDeathDealer),
typeof(BlazeOfDeath),
typeof(BurglarsBandana),
typeof(CaptainQuacklebushsCutlass),
typeof(CavortingClub),
typeof(DreadPirateHat),
typeof(EnchantedTitanLegBone),
typeof(GwennosHarp),
typeof(IolosLute),
typeof(LunaLance),
typeof(NightsKiss),
typeof(NoxRangersHeavyCrossbow),
typeof(PolarBearMask),
typeof(VioletCourage)
};
private Mobile m_Fisher;
private DateTime m_NextWaterBall;
[Constructable]
public Leviathan()
: this(null)
{
}
[Constructable]
public Leviathan(Mobile fisher)
: base(AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4)
{
m_Fisher = fisher;
m_NextWaterBall = DateTime.UtcNow;
// May not be OSI accurate; mostly copied from krakens
Name = "a leviathan";
Body = 77;
BaseSoundID = 353;
Hue = 0x481;
SetStr(1000);
SetDex(501, 520);
SetInt(501, 515);
SetHits(1500);
SetDamage(25, 33);
SetDamageType(ResistanceType.Physical, 70);
SetDamageType(ResistanceType.Cold, 30);
SetResistance(ResistanceType.Physical, 55, 65);
SetResistance(ResistanceType.Fire, 45, 55);
SetResistance(ResistanceType.Cold, 45, 55);
SetResistance(ResistanceType.Poison, 35, 45);
SetResistance(ResistanceType.Energy, 25, 35);
SetSkill(SkillName.EvalInt, 97.6, 107.5);
SetSkill(SkillName.Magery, 97.6, 107.5);
SetSkill(SkillName.MagicResist, 97.6, 107.5);
SetSkill(SkillName.Meditation, 97.6, 107.5);
SetSkill(SkillName.Tactics, 97.6, 107.5);
SetSkill(SkillName.Wrestling, 97.6, 107.5);
Fame = 22500;
Karma = -22500;
VirtualArmor = 50;
CanSwim = true;
CantWalk = true;
PackItem(new MessageInABottle());
Rope rope = new Rope();
rope.ItemID = 0x14F8;
PackItem(rope);
rope = new Rope();
rope.ItemID = 0x14FA;
PackItem(rope);
SetSpecialAbility(SpecialAbility.DragonBreath);
}
public Leviathan(Serial serial)
: base(serial)
{
}
public static Type[] Artifacts { get { return m_Artifacts; } }
public Mobile Fisher
{
get { return m_Fisher; }
set { m_Fisher = value; }
}
public override int DefaultHitsRegen
{
get
{
int regen = base.DefaultHitsRegen;
return IsParagon ? regen : regen += 40;
}
}
public override int DefaultStamRegen
{
get
{
int regen = base.DefaultStamRegen;
return IsParagon ? regen : regen += 40;
}
}
public override int DefaultManaRegen
{
get
{
int regen = base.DefaultManaRegen;
return IsParagon ? regen : regen += 40;
}
}
public override double TreasureMapChance { get { return 0.25; } }
public override int TreasureMapLevel { get { return 5; } }
public override void OnActionCombat()
{
Mobile combatant = Combatant as Mobile;
if (combatant == null || combatant.Deleted || combatant.Map != Map || !InRange(combatant, 12) || !CanBeHarmful(combatant) || !InLOS(combatant))
return;
if (DateTime.UtcNow >= m_NextWaterBall)
{
double damage = combatant.Hits * 0.3;
if (damage < 10.0)
damage = 10.0;
else if (damage > 40.0)
damage = 40.0;
DoHarmful(combatant);
MovingParticles(combatant, 0x36D4, 5, 0, false, false, 195, 0, 9502, 3006, 0, 0, 0);
AOS.Damage(combatant, this, (int)damage, 100, 0, 0, 0, 0);
if (combatant is PlayerMobile && combatant.Mount != null)
{
(combatant as PlayerMobile).SetMountBlock(BlockMountType.DismountRecovery, TimeSpan.FromSeconds(10), true);
}
m_NextWaterBall = DateTime.UtcNow + TimeSpan.FromMinutes(1);
}
}
public static void GiveArtifactTo(Mobile m)
{
Item item = Loot.Construct(m_Artifacts);
if (item == null)
return;
// TODO: Confirm messages
if (m.AddToBackpack(item))
m.SendMessage("As a reward for slaying the mighty leviathan, an artifact has been placed in your backpack.");
else
m.SendMessage("As your backpack is full, your reward for destroying the legendary leviathan has been placed at your feet.");
}
public override void GenerateLoot()
{
AddLoot(LootPack.FilthyRich, 5);
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
m_NextWaterBall = DateTime.UtcNow;
}
public override void OnKilledBy(Mobile mob)
{
base.OnKilledBy(mob);
if (Paragon.CheckArtifactChance(mob, this))
{
GiveArtifactTo(mob);
if (mob == m_Fisher)
m_Fisher = null;
}
}
public override void OnDeath(Container c)
{
base.OnDeath(c);
if (m_Fisher != null && 25 > Utility.Random(100))
GiveArtifactTo(m_Fisher);
m_Fisher = null;
}
}
}