Files
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

781 lines
22 KiB
C#

using Server;
using System;
using Server.Items;
using Server.Mobiles;
namespace Server.Engines.Shadowguard
{
public class ShadowguardPirate : BaseCreature
{
public ShadowguardPirate() : base(AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4)
{
Name = NameList.RandomName("male");
Title = "the Pirate";
Body = 0x190;
Hue = Utility.RandomSkinHue();
SetStr(386, 400);
SetDex(151, 165);
SetInt(161, 175);
SetHits(1200);
SetDamage(15, 21);
SetDamageType(ResistanceType.Physical, 100);
SetResistance(ResistanceType.Physical, 35, 45);
SetResistance(ResistanceType.Fire, 25, 30);
SetResistance(ResistanceType.Cold, 25, 30);
SetResistance(ResistanceType.Poison, 10, 20);
SetResistance(ResistanceType.Energy, 10, 20);
SetSkill(SkillName.Anatomy, 125.0);
SetSkill(SkillName.MagicResist, 83.5, 92.5);
SetSkill(SkillName.Wrestling, 125.0);
SetSkill(SkillName.Tactics, 125.0);
Fame = 1000;
Karma = -1000;
AddItem(new ExecutionersAxe());
AddItem(new Boots(Utility.RandomNeutralHue()));
AddItem(new ShortPants());
AddItem(new FancyShirt());
AddItem(new TricorneHat());
Fame = 5000;
Karma = -5000;
Utility.AssignRandomHair(this);
}
public override void GenerateLoot()
{
AddLoot(LootPack.Rich, 3);
}
public override bool AlwaysMurderer { get { return true; } }
public bool BlockReflect { get; set; }
public override int Damage(int amount, Mobile from, bool informMount, bool checkDisrupt)
{
int dam = base.Damage(amount, from, informMount, checkDisrupt);
if (!BlockReflect && from != null && dam > 0)
{
BlockReflect = true;
AOS.Damage(from, this, Math.Max(1, (int)((double)dam * .37)), 0, 0, 0, 0, 0, 0, 100);
BlockReflect = false;
from.PlaySound(0x1F1);
}
return dam;
}
public ShadowguardPirate(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);
int version = reader.ReadInt();
}
}
public class ShantyThePirate : ShadowguardPirate
{
[Constructable]
public ShantyThePirate()
{
Name = "Shanty";
SetHits(10000);
SetSkill(SkillName.Fencing, 120.0);
SetSkill(SkillName.Macing, 120.0);
SetSkill(SkillName.MagicResist, 120.0);
SetSkill(SkillName.Swords, 120.0);
SetSkill(SkillName.Tactics, 120.0);
SetSkill(SkillName.Wrestling, 120.0);
Fame = 15000;
Karma = -15000;
BlockReflect = true;
}
public override void GenerateLoot()
{
AddLoot(LootPack.FilthyRich, 3);
}
public ShantyThePirate(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);
int version = reader.ReadInt();
BlockReflect = true;
}
}
public class VileWaterElemental : WaterElemental
{
public override bool CanMoveOverObstacles { get { return false; } }
[Constructable]
public VileWaterElemental()
{
Name = "a vile water elemental";
Hue = 1916;
Body = 13;
}
public override bool DeleteCorpseOnDeath { get { return true; } }
public override bool OnBeforeDeath()
{
FountainEncounter encounter = ShadowguardController.GetEncounter(Location, Map) as FountainEncounter;
if (encounter != null)
{
var canal = new ShadowguardCanal();
canal.MoveToWorld(Location, Map);
encounter.AddShadowguardCanal(canal);
}
return base.OnBeforeDeath();
}
public VileWaterElemental(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);
int version = reader.ReadInt();
}
}
public class HurricaneElemental : VileWaterElemental
{
public override bool CanMoveOverObstacles { get { return false; } }
[Constructable]
public HurricaneElemental()
{
Name = "a hurricane elemental";
Body = 16;
SetStr(400, 500);
SetDex(140, 250);
SetInt(130, 150);
SetHits(550, 700);
SetMana(650, 750);
SetDamage(14, 16);
SetDamageType(ResistanceType.Physical, 50);
SetDamageType(ResistanceType.Cold, 50);
SetResistance(ResistanceType.Physical, 50, 60);
SetResistance(ResistanceType.Fire, 45, 55);
SetResistance(ResistanceType.Cold, 60, 70);
SetResistance(ResistanceType.Poison, 70, 80);
SetResistance(ResistanceType.Energy, 40, 60);
SetSkill(SkillName.Wrestling, 95.0, 110.0);
SetSkill(SkillName.Tactics, 95.0, 110.0);
SetSkill(SkillName.Magery, 95.0, 110.0);
SetSkill(SkillName.EvalInt, 95.0, 110.0);
SetSkill(SkillName.Parry, 95.0, 110.0);
SetSkill(SkillName.DetectHidden, 63.0);
}
public HurricaneElemental(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);
int version = reader.ReadInt();
}
}
public class VileTreefellow : FeralTreefellow
{
[Constructable]
public VileTreefellow()
{
Name = "a vile treefellow";
SetDamage(12, 16);
//Missing Attr - Hit Point Reg: 35, Mana Reg: 20
SetResistance(ResistanceType.Physical, 2);
SetResistance(ResistanceType.Cold, 5);
SetResistance(ResistanceType.Poison, 3);
SetResistance(ResistanceType.Energy, 2);
SetSkill(SkillName.MagicResist, 40.1, 55.0);
SetSkill(SkillName.Tactics, 65.1, 90.0);
SetSkill(SkillName.Wrestling, 65.1, 105.0);
SetSkill(SkillName.Poisoning, 100.0);
SetSkill(SkillName.DetectHidden, 40.0, 45.0);
SetSkill(SkillName.Parry, 55.0, 60.0);
SetWeaponAbility(WeaponAbility.Dismount);
SetWeaponAbility(WeaponAbility.ForceOfNature);
}
public override void OnGaveMeleeAttack(Mobile defender)
{
base.OnGaveMeleeAttack(defender);
Paralyze(defender);
}
#region Paralyze
private void Paralyze(Mobile defender)
{
defender.Paralyze(TimeSpan.FromSeconds(Utility.Random(3)));
defender.FixedEffect(0x376A, 6, 1);
defender.PlaySound(0x204);
defender.SendLocalizedMessage(1060164); // The attack has temporarily paralyzed you!
}
#endregion
public override void GenerateLoot()
{
AddLoot(LootPack.Rich, 3);
}
public VileTreefellow(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);
int version = reader.ReadInt();
}
}
[CorpseName("a magical corpse")]
public class EnsorcelledArmor : BaseCreature
{
public ArmoryEncounter Encounter { get; set; }
[Constructable]
public EnsorcelledArmor() : this(null)
{
}
[Constructable]
public EnsorcelledArmor(ArmoryEncounter encounter) : base(AIType.AI_Melee, FightMode.Weakest, 10, 1, 0.2, 0.4)
{
Encounter = encounter;
Name = "ensorcelled armor";
BaseSoundID = 412;
Body = 0x190;
SetStr(386, 400);
SetDex(151, 165);
SetInt(161, 175);
SetDamage(15, 21);
SetDamageType(ResistanceType.Physical, 100);
SetResistance(ResistanceType.Physical, 35, 45);
SetResistance(ResistanceType.Fire, 25, 30);
SetResistance(ResistanceType.Cold, 25, 30);
SetResistance(ResistanceType.Poison, 10, 20);
SetResistance(ResistanceType.Energy, 10, 20);
SetSkill(SkillName.Anatomy, 125.0);
SetSkill(SkillName.Fencing, 46.0, 77.5);
SetSkill(SkillName.Macing, 35.0, 57.5);
SetSkill(SkillName.Poisoning, 60.0, 82.5);
SetSkill(SkillName.MagicResist, 83.5, 92.5);
SetSkill(SkillName.Swords, 125.0);
SetSkill(SkillName.Tactics, 125.0);
SetSkill(SkillName.Lumberjacking, 125.0);
var helm = new CloseHelm();
helm.Hue = 0x96D;
AddItem(helm);
var arms = new PlateArms();
arms.Hue = 0x96D;
AddItem(arms);
var legs = new PlateLegs();
legs.Hue = 0x96D;
AddItem(legs);
var tunic = new PlateChest();
tunic.Hue = 0x96D;
AddItem(tunic);
var gorget = new PlateGorget();
gorget.Hue = 0x96D;
AddItem(gorget);
var golves = new PlateGloves();
golves.Hue = 0x96D;
AddItem(golves);
var halberd = new Halberd();
halberd.Hue = 0x96D;
AddItem(halberd);
AddItem(new HalfApron(728));
Fame = 8500;
Karma = -8500;
}
public override bool AlwaysMurderer { get { return true; } }
public override bool OnBeforeDeath()
{
if (!base.OnBeforeDeath())
return false;
if (0.66 > Utility.RandomDouble() && Encounter != null)
new Phylactery().MoveToWorld(Location, Map);
return true;
}
public override void GenerateLoot()
{
AddLoot(LootPack.Rich, 3);
}
public EnsorcelledArmor(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);
int version = reader.ReadInt();
}
}
public class VileDrake : Drake
{
public VileDrake()
{
Name = "a vile drake";
SetResistance(ResistanceType.Physical, 50, 60);
SetResistance(ResistanceType.Fire, 80, 90);
SetResistance(ResistanceType.Cold, 80, 90);
SetResistance(ResistanceType.Poison, 90, 100);
SetResistance(ResistanceType.Energy, 70, 80);
SetSkill(SkillName.MagicResist, 65.0, 80.0);
SetSkill(SkillName.Tactics, 65.0, 90.0);
SetSkill(SkillName.Wrestling, 110.0, 130.0);
SetSkill(SkillName.DetectHidden, 50.6);
SetSkill(SkillName.Parry, 65.0, 75.0);
SetWeaponAbility(WeaponAbility.DoubleStrike);
SetWeaponAbility(WeaponAbility.TalonStrike);
}
public override void OnDeath(Container c)
{
BelfryEncounter encounter = ShadowguardController.GetEncounter(c.Location, c.Map) as BelfryEncounter;
if (encounter != null)
{
c.DropItem(new MagicDrakeWing());
}
base.OnDeath(c);
}
public override void GenerateLoot()
{
AddLoot(LootPack.Rich, 3);
}
public VileDrake(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);
int version = reader.ReadInt();
}
}
public class ShadowguardGreaterDragon : GreaterDragon
{
public ShadowguardGreaterDragon()
{
Tamable = false;
SetHits(9800, 10999);
//Missing Attr - Hit Point Reg: 20, Stamina Reg: 43, Mana Reg: 43
SetDamage(29, 38);
SetSkill(SkillName.EvalInt, 110.0, 145.0);
SetSkill(SkillName.Magery, 110.0, 145.0);
SetSkill(SkillName.MagicResist, 110.0, 150.0);
SetSkill(SkillName.Tactics, 110.0, 155.0);
SetSkill(SkillName.Wrestling, 115.0, 155.0);
SetSkill(SkillName.DetectHidden, 120.0);
SetSkill(SkillName.Parry, 120.0);
}
public override double TeleportChance { get { return 0; } }
public override void OnThink()
{
base.OnThink();
BelfryEncounter encounter = ShadowguardController.GetEncounter(Location, Map) as BelfryEncounter;
if (encounter != null && Z == -20)
{
Point3D p = encounter.SpawnPoints[0];
encounter.ConvertOffset(ref p);
MoveToWorld(p, Map);
}
}
protected override bool OnMove(Direction d)
{
if (ShadowguardController.GetEncounter(Location, Map) != null)
{
int x = X;
int y = Y;
Movement.Movement.Offset(d, ref x, ref y);
Point3D p = new Point3D(x, y, Map.GetAverageZ(x, y));
int z = p.Z;
IPooledEnumerable eable = Map.GetItemsInRange(p, 0);
foreach (Item item in eable)
{
if (item.Z + item.ItemData.CalcHeight > z)
{
z = item.Z + item.ItemData.CalcHeight;
}
}
StaticTile[] staticTiles = Map.Tiles.GetStaticTiles(x, y, true);
foreach (StaticTile tile in staticTiles)
{
ItemData itemData = TileData.ItemTable[tile.ID & TileData.MaxItemValue];
if (tile.Z + itemData.CalcHeight > z)
z = tile.Z + itemData.CalcHeight;
}
eable.Free();
if (z < Z)
return false;
}
return base.OnMove(d);
}
public override int Damage(int amount, Mobile from, bool informmount, bool checkfizzle)
{
if (from == null || (ShadowguardController.GetEncounter(Location, Map) != null && Z == from.Z))
{
return base.Damage(amount, from, informmount, checkfizzle);
}
return 0;
}
public override void GenerateLoot()
{
AddLoot(LootPack.FilthyRich, 3);
AddLoot(LootPack.Gems, 8);
}
public override void OnGaveMeleeAttack(Mobile defender)
{
base.OnGaveMeleeAttack(defender);
if (Map != null && 0.5 > Utility.RandomDouble())
{
int pushRange = Utility.RandomMinMax(2, 4);
Direction d = Utility.GetDirection(this, defender);
int x = defender.X;
int y = defender.Y;
for (int i = 0; i < pushRange; i++)
{
Movement.Movement.Offset(d, ref x, ref y);
}
int z = Map.GetAverageZ(x, y);
IPooledEnumerable eable = Map.GetItemsInRange(new Point3D(x, y, z), 0);
foreach (Item item in eable)
{
if (item.Z + item.ItemData.CalcHeight > z)
{
z = item.Z + item.ItemData.CalcHeight;
}
}
eable.Free();
StaticTile[] staticTiles = Map.Tiles.GetStaticTiles(x, y, true);
foreach (StaticTile tile in staticTiles)
{
ItemData itemData = TileData.ItemTable[tile.ID & TileData.MaxItemValue];
if (tile.Z + itemData.CalcHeight > z)
z = tile.Z + itemData.CalcHeight;
}
defender.MoveToWorld(new Point3D(x, y, Z), Map);
}
}
public ShadowguardGreaterDragon(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);
int version = reader.ReadInt();
}
}
public class LadyMinax : BaseCreature
{
public LadyMinax()
: base(AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4)
{
Name = "Minax";
Title = "the Enchantress";
Body = 0x191;
Hue = Race.RandomSkinHue();
HairItemID = 0x203C;
HairHue = Race.RandomHairHue();
SetStr(386, 400);
SetDex(151, 165);
SetInt(161, 175);
SetDamage(15, 21);
SetDamageType(ResistanceType.Physical, 100);
SetResistance(ResistanceType.Physical, 35, 45);
SetResistance(ResistanceType.Fire, 25, 30);
SetResistance(ResistanceType.Cold, 25, 30);
SetResistance(ResistanceType.Poison, 10, 20);
SetResistance(ResistanceType.Energy, 10, 20);
SetSkill(SkillName.Magery, 125.0);
SetSkill(SkillName.EvalInt, 125.0);
SetSkill(SkillName.Meditation, 125.0);
SetSkill(SkillName.Anatomy, 125.0);
SetSkill(SkillName.Fencing, 46.0, 77.5);
SetSkill(SkillName.Macing, 35.0, 57.5);
SetSkill(SkillName.Poisoning, 60.0, 82.5);
SetSkill(SkillName.MagicResist, 83.5, 92.5);
SetSkill(SkillName.Swords, 125.0);
SetSkill(SkillName.Tactics, 125.0);
SetSkill(SkillName.Lumberjacking, 125.0);
SetWearable(new Cloak(), 1157);
SetWearable(new Boots(), 1175);
SetWearable(new FemaleStuddedChest(), 1175);
SetWearable(new LeatherGloves(), 1157);
}
public override bool AlwaysMurderer { get { return true; } }
public override double TeleportChance { get { return 0; } }
protected override bool OnMove(Direction d)
{
RoofEncounter encounter = ShadowguardController.GetEncounter(Location, Map) as RoofEncounter;
if (encounter != null)
{
Point3D spawn = encounter.SpawnPoints[0];
int x = X;
int y = Y;
Movement.Movement.Offset(d, ref x, ref y);
Point3D p = new Point3D(x, y, Map.GetAverageZ(x, y));
int z = p.Z;
if (p.Y < spawn.Y - 5 || p.Y > spawn.Y + 4 || p.X > spawn.X + 4 || p.X < spawn.X - 5)
return false;
IPooledEnumerable eable = Map.GetItemsInRange(p, 0);
Item i = null;
foreach (Item item in eable)
{
if (item.Z + item.ItemData.CalcHeight > z)
{
i = item;
z = item.Z + item.ItemData.CalcHeight;
}
}
StaticTile[] staticTiles = Map.Tiles.GetStaticTiles(x, y, true);
foreach (StaticTile tile in staticTiles)
{
ItemData itemData = TileData.ItemTable[tile.ID & TileData.MaxItemValue];
if (tile.Z + itemData.CalcHeight > z)
z = tile.Z + itemData.CalcHeight;
}
eable.Free();
if (z < Z)
return false;
}
return base.OnMove(d);
}
public override void OnThink()
{
base.OnThink();
RoofEncounter encounter = ShadowguardController.GetEncounter(Location, Map) as RoofEncounter;
if (encounter != null)
{
Point3D spawn = encounter.SpawnPoints[0];
Point3D p = Location;
encounter.ConvertOffset(ref spawn);
if (Z < 30 || p.Y < spawn.Y - 5 || p.Y > spawn.Y + 4 || p.X > spawn.X + 4 || p.X < spawn.X - 5)
{
MoveToWorld(spawn, Map.TerMur);
}
}
}
public override int Damage(int amount, Mobile from, bool informMount, bool checkfizzle)
{
RoofEncounter encounter = ShadowguardController.GetEncounter(Location, Map) as RoofEncounter;
if (encounter != null && from != null)
{
from.SendLocalizedMessage(1156254); // Minax laughs as she deflects your puny attacks! Defeat her minions to close the Time Gate!
return 0;
}
return base.Damage(amount, from, informMount, checkfizzle);
}
public LadyMinax(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);
int version = reader.ReadInt();
}
}
}