Overwrite
Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
This commit is contained in:
@@ -0,0 +1,283 @@
|
||||
using System;
|
||||
using Server.Items;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("a vile corpse")]
|
||||
public class ClockworkExodus : BaseCreature
|
||||
{
|
||||
public static int m_MinHits;
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public int MinHits
|
||||
{
|
||||
get { return m_MinHits; }
|
||||
set { m_MinHits = value; }
|
||||
}
|
||||
|
||||
public static List<ClockworkExodus> Instances { get; set; }
|
||||
|
||||
private static readonly Type[] m_Artifact = new Type[]
|
||||
{
|
||||
typeof(ScrollofValiantCommendation),
|
||||
typeof(BracersofAlchemicalDevastation),
|
||||
typeof(HygieiasAmulet),
|
||||
typeof(Asclepius),
|
||||
typeof(ClockworkLeggings),
|
||||
typeof(DupresSword),
|
||||
typeof(GargishDupresSword),
|
||||
typeof(GargishClockworkLeggings),
|
||||
typeof(GargishBracersofAlchemicalDevastation),
|
||||
typeof(GargishAsclepius)
|
||||
};
|
||||
|
||||
private Point3D m_LastTarget;
|
||||
|
||||
[Constructable]
|
||||
public ClockworkExodus() : base(AIType.AI_Mystic, FightMode.Closest, 10, 1, 0.2, 0.4)
|
||||
{
|
||||
Name = "Clockwork Exodus";
|
||||
Body = 1248;
|
||||
BaseSoundID = 639;
|
||||
Hue = 2500;
|
||||
Female = true;
|
||||
|
||||
SetStr(851, 950);
|
||||
SetDex(581, 683);
|
||||
SetInt(601, 750);
|
||||
|
||||
SetHits(50000);
|
||||
SetStam(507, 669);
|
||||
|
||||
SetDamage(20, 30);
|
||||
|
||||
SetDamageType(ResistanceType.Physical, 75);
|
||||
SetDamageType(ResistanceType.Fire, 25);
|
||||
SetDamageType(ResistanceType.Energy, 50);
|
||||
|
||||
SetResistance(ResistanceType.Physical, 75, 90);
|
||||
SetResistance(ResistanceType.Fire, 50, 65);
|
||||
SetResistance(ResistanceType.Cold, 45, 60);
|
||||
SetResistance(ResistanceType.Poison, 45, 60);
|
||||
SetResistance(ResistanceType.Energy, 45, 60);
|
||||
|
||||
SetSkill(SkillName.EvalInt, 130.0);
|
||||
SetSkill(SkillName.Mysticism, 120);
|
||||
SetSkill(SkillName.MagicResist, 140.0);
|
||||
SetSkill(SkillName.Tactics, 90.1, 105.0);
|
||||
SetSkill(SkillName.Wrestling, 90.1, 105.0);
|
||||
SetSkill(SkillName.SpiritSpeak, 120.0);
|
||||
SetSkill(SkillName.Necromancy, 120.0);
|
||||
SetSkill(SkillName.Poisoning, 120.0);
|
||||
SetSkill(SkillName.Meditation, 120.0);
|
||||
SetSkill(SkillName.Anatomy, 120.0);
|
||||
SetSkill(SkillName.Healing, 120.0);
|
||||
|
||||
Fame = 24000;
|
||||
Karma = -24000;
|
||||
|
||||
VirtualArmor = 20;
|
||||
|
||||
m_MinHits = Hits;
|
||||
|
||||
if (Instances == null)
|
||||
Instances = new List<ClockworkExodus>();
|
||||
|
||||
Instances.Add(this);
|
||||
|
||||
SetWeaponAbility(WeaponAbility.BleedAttack);
|
||||
SetAreaEffect(AreaEffect.AuraOfEnergy);
|
||||
}
|
||||
|
||||
public static void DistributeRandomArtifact(BaseCreature bc, Type[] typelist)
|
||||
{
|
||||
int random = Utility.Random(typelist.Length);
|
||||
Item item = Loot.Construct(typelist[random]);
|
||||
DistributeArtifact(DemonKnight.FindRandomPlayer(bc), item);
|
||||
}
|
||||
|
||||
public static void DistributeArtifact(Mobile to, Item artifact)
|
||||
{
|
||||
if (to == null || artifact == null)
|
||||
return;
|
||||
|
||||
Container pack = to.Backpack;
|
||||
|
||||
if (pack == null || !pack.TryDropItem(to, artifact, false))
|
||||
to.BankBox.DropItem(artifact);
|
||||
|
||||
to.SendLocalizedMessage(502088); // A special gift has been placed in your backpack.
|
||||
}
|
||||
|
||||
public override bool OnBeforeDeath()
|
||||
{
|
||||
if (Utility.RandomDouble() < 0.2)
|
||||
DistributeRandomArtifact(this, m_Artifact);
|
||||
|
||||
Map map = Map;
|
||||
|
||||
if (map != null)
|
||||
{
|
||||
for (int x = -8; x <= 8; ++x)
|
||||
{
|
||||
for (int y = -8; y <= 8; ++y)
|
||||
{
|
||||
double dist = Math.Sqrt(x * x + y * y);
|
||||
|
||||
if (dist <= 8)
|
||||
new GoldTimer(map, X + x, Y + y).Start();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (Instances != null && Instances.Contains(this))
|
||||
Instances.Remove(this);
|
||||
|
||||
return base.OnBeforeDeath();
|
||||
}
|
||||
|
||||
public override bool CanBeParagon { get { return false; } }
|
||||
public override bool Unprovokable { get { return true; } }
|
||||
public virtual double ChangeCombatant { get { return 0.3; } }
|
||||
public override bool AlwaysMurderer { get { return true; } }
|
||||
public override Poison PoisonImmune { get { return Poison.Greater; } }
|
||||
public override int TreasureMapLevel { get { return 5; } }
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot(LootPack.AosSuperBoss, 2);
|
||||
}
|
||||
|
||||
public void SpawnVortices(Mobile target)
|
||||
{
|
||||
Map map = Map;
|
||||
|
||||
if (map == null)
|
||||
return;
|
||||
|
||||
MovingParticles(target, 0x1AF6, 5, 0, false, false, 0x816, 0, 3006, 0, 0, 0);
|
||||
|
||||
DeathVortexTrap dv;
|
||||
|
||||
for (int i = 0; i < 3; ++i)
|
||||
{
|
||||
dv = new DeathVortexTrap();
|
||||
dv.MoveToWorld(GetSpawnPosition(target.Location, map, 3), map);
|
||||
}
|
||||
|
||||
target.SendLocalizedMessage(1152693); // The power of the Void surges around you!
|
||||
|
||||
m_LastTarget = target.Location;
|
||||
}
|
||||
|
||||
public void DoSpecialAbility(Mobile target)
|
||||
{
|
||||
if (target != null)
|
||||
{
|
||||
if (m_LastTarget != target.Location)
|
||||
{
|
||||
target.SendLocalizedMessage(1152692, Name); // ~1_CREATURE~ casts a deadly vortex at you!
|
||||
SpawnVortices(target);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnDamagedBySpell(Mobile attacker)
|
||||
{
|
||||
base.OnDamagedBySpell(attacker);
|
||||
|
||||
DoSpecialAbility(attacker);
|
||||
}
|
||||
|
||||
public override void OnGaveMeleeAttack(Mobile defender)
|
||||
{
|
||||
base.OnGaveMeleeAttack(defender); //if it hits you it spawns vortices
|
||||
|
||||
DoSpecialAbility(defender);
|
||||
}
|
||||
|
||||
public override void OnGotMeleeAttack(Mobile attacker)
|
||||
{
|
||||
base.OnGotMeleeAttack(attacker); //if you hit creature it spawns vortices
|
||||
|
||||
DoSpecialAbility(attacker);
|
||||
}
|
||||
|
||||
public override void OnDamage(int amount, Mobile from, bool willKill)
|
||||
{
|
||||
base.OnDamage(amount, from, willKill);
|
||||
|
||||
if (Hits < m_MinHits && Hits < HitsMax * 0.60)
|
||||
m_MinHits = Hits;
|
||||
|
||||
if (Hits >= HitsMax * 0.75)
|
||||
m_MinHits = HitsMax;
|
||||
}
|
||||
|
||||
public ClockworkExodus(Serial serial)
|
||||
: base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize(GenericWriter writer)
|
||||
{
|
||||
base.Serialize(writer);
|
||||
|
||||
writer.Write((int)0);
|
||||
writer.Write((int)m_MinHits);
|
||||
}
|
||||
|
||||
public override void Deserialize(GenericReader reader)
|
||||
{
|
||||
base.Deserialize(reader);
|
||||
int version = reader.ReadInt();
|
||||
|
||||
m_MinHits = reader.ReadInt();
|
||||
|
||||
if (Instances == null)
|
||||
Instances = new List<ClockworkExodus>();
|
||||
|
||||
Instances.Add(this);
|
||||
}
|
||||
|
||||
private class GoldTimer : Timer
|
||||
{
|
||||
private Map m_Map;
|
||||
private int m_X, m_Y;
|
||||
|
||||
public GoldTimer(Map map, int x, int y) : base(TimeSpan.FromSeconds(Utility.RandomDouble() * 10.0))
|
||||
{
|
||||
m_Map = map;
|
||||
m_X = x;
|
||||
m_Y = y;
|
||||
}
|
||||
|
||||
protected override void OnTick()
|
||||
{
|
||||
int z = m_Map.GetAverageZ(m_X, m_Y);
|
||||
bool canFit = m_Map.CanFit(m_X, m_Y, z, 6, false, false);
|
||||
|
||||
for (int i = -3; !canFit && i <= 3; ++i)
|
||||
{
|
||||
canFit = m_Map.CanFit(m_X, m_Y, z + i, 6, false, false);
|
||||
|
||||
if (canFit)
|
||||
z += i;
|
||||
}
|
||||
|
||||
if (!canFit)
|
||||
return;
|
||||
|
||||
Gold g = new Gold(500, 1000);
|
||||
g.MoveToWorld(new Point3D(m_X, m_Y, z), m_Map);
|
||||
|
||||
if (0.3 >= Utility.RandomDouble())
|
||||
{
|
||||
Effects.SendLocationParticles(EffectItem.Create(g.Location, g.Map, EffectItem.DefaultDuration), 0x3709, 10, 30, 5052);
|
||||
Effects.PlaySound(g, g.Map, 0x208);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
using System;
|
||||
using Server.Mobiles;
|
||||
|
||||
namespace Server.Items
|
||||
{
|
||||
public class DeathVortexTrap : BaseTrap
|
||||
{
|
||||
private Timer m_Timer;
|
||||
|
||||
[Constructable]
|
||||
public DeathVortexTrap()
|
||||
: base(0x3789)
|
||||
{
|
||||
this.Hue = 2070;
|
||||
this.Movable = false;
|
||||
|
||||
m_Timer = new InternalTimer(this);
|
||||
m_Timer.Start();
|
||||
}
|
||||
|
||||
public DeathVortexTrap(Serial serial)
|
||||
: base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
public override void OnDelete()
|
||||
{
|
||||
m_Timer.Stop();
|
||||
|
||||
base.OnDelete();
|
||||
}
|
||||
|
||||
public override bool PassivelyTriggered { get { return true; } }
|
||||
public override TimeSpan PassiveTriggerDelay { get { return TimeSpan.FromSeconds(2.0); } }
|
||||
public override int PassiveTriggerRange { get { return 3; } }
|
||||
public override TimeSpan ResetDelay { get { return TimeSpan.FromSeconds(0.2); } }
|
||||
|
||||
public override void OnTrigger(Mobile from)
|
||||
{
|
||||
if (from.IsStaff())
|
||||
return;
|
||||
|
||||
if (from.Alive && this.CheckRange(from.Location, 1) && !(from is ClockworkExodus))
|
||||
StamManaDrain(from);
|
||||
}
|
||||
|
||||
public void StamManaDrain(Mobile defender)
|
||||
{
|
||||
switch (Utility.Random(2)) // 50%/50% for stamina leech or mana leech
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
if (defender.Alive)
|
||||
{
|
||||
int manaToLeech = (int)(defender.Mana * 0.6); // defender loses 1/2 of their mana
|
||||
defender.Mana -= manaToLeech;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
if (defender.Alive)
|
||||
{
|
||||
int stamToLeech = (int)(defender.Stam * 0.7); // defender loses 9/10 of their stamina
|
||||
defender.Stam -= stamToLeech;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
defender.SendLocalizedMessage(1152694, "", 0x22); // Your life force is drained by the death vortex!
|
||||
}
|
||||
|
||||
|
||||
private class InternalTimer : Timer
|
||||
{
|
||||
private DeathVortexTrap m_Item;
|
||||
|
||||
public InternalTimer(DeathVortexTrap item) : base(TimeSpan.FromSeconds(15.0))
|
||||
{
|
||||
m_Item = item;
|
||||
|
||||
Priority = TimerPriority.OneMinute;
|
||||
}
|
||||
|
||||
protected override void OnTick()
|
||||
{
|
||||
if (m_Item != null)
|
||||
m_Item.Delete();
|
||||
|
||||
Stop();
|
||||
}
|
||||
}
|
||||
|
||||
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();
|
||||
|
||||
m_Timer = new InternalTimer(this);
|
||||
m_Timer.Start();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,144 @@
|
||||
using System;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a human corpse" )]
|
||||
public class DupresChampion : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public DupresChampion() : base( AIType.AI_Melee, FightMode.Aggressor, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = NameList.RandomName("male");
|
||||
Title = "The Champion";
|
||||
Body = 0x190;
|
||||
Hue = Utility.RandomSkinHue();
|
||||
Female = false;
|
||||
|
||||
SetStr( 190, 200 );
|
||||
SetDex( 50, 75 );
|
||||
SetInt( 150, 250 );
|
||||
SetHits( 3900, 4100 );
|
||||
SetDamage( 22, 28 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 50, 70 );
|
||||
SetResistance( ResistanceType.Fire, 50, 70 );
|
||||
SetResistance( ResistanceType.Cold, 50, 70 );
|
||||
SetResistance( ResistanceType.Poison, 50, 70 );
|
||||
SetResistance( ResistanceType.Energy, 50, 70 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 195.0, 220.0 );
|
||||
SetSkill( SkillName.Magery, 195.0, 220.0 );
|
||||
SetSkill( SkillName.Meditation, 195.0, 200.0 );
|
||||
SetSkill( SkillName.MagicResist, 100.0, 120.0 );
|
||||
SetSkill( SkillName.Tactics, 195.0, 220.0 );
|
||||
SetSkill( SkillName.Wrestling, 195.0, 220.0 );
|
||||
|
||||
VirtualArmor = 70;
|
||||
|
||||
Item cutlass = new Cutlass();
|
||||
cutlass.LootType = LootType.Blessed;
|
||||
SetWearable(cutlass);
|
||||
|
||||
Item ph = new PlateHelm();
|
||||
ph.LootType = LootType.Blessed;
|
||||
ph.Hue = 0x8A5; // gold
|
||||
SetWearable(ph);
|
||||
|
||||
Item pa = new PlateArms();
|
||||
pa.LootType = LootType.Blessed;
|
||||
pa.Hue = 0x8A5; // gold
|
||||
SetWearable(pa);
|
||||
|
||||
Item pg = new PlateGorget();
|
||||
pg.LootType = LootType.Blessed;
|
||||
pg.Hue = 0x8A5; // gold
|
||||
SetWearable(pg);
|
||||
|
||||
Item pgl = new PlateGloves();
|
||||
pgl.LootType = LootType.Blessed;
|
||||
pgl.Hue = 0x8A5; // gold
|
||||
SetWearable(pgl);
|
||||
|
||||
Item pl = new PlateLegs();
|
||||
pl.LootType = LootType.Blessed;
|
||||
pl.Hue = 0x8A5; // gold
|
||||
SetWearable(pl);
|
||||
|
||||
Item pc = new PlateChest();
|
||||
pc.LootType = LootType.Blessed;
|
||||
pc.Hue = 0x8A5; // gold
|
||||
SetWearable(pc);
|
||||
|
||||
Item mks = new MetalKiteShield();
|
||||
mks.LootType = LootType.Blessed;
|
||||
mks.Hue = 0x776;
|
||||
SetWearable(mks);
|
||||
|
||||
Item bs = new BodySash(0x486); // dark purple
|
||||
bs.LootType = LootType.Blessed;
|
||||
SetWearable(bs);
|
||||
|
||||
Item cloak = new Cloak(0x486); // dark purple
|
||||
cloak.LootType = LootType.Blessed;
|
||||
SetWearable(cloak);
|
||||
|
||||
PackGold( 400, 600 );
|
||||
}
|
||||
|
||||
public override void OnKilledBy(Mobile m)
|
||||
{
|
||||
base.OnKilledBy(m);
|
||||
|
||||
if (Utility.RandomDouble() < 0.1)
|
||||
{
|
||||
ExodusChest.GiveRituelItem(m);
|
||||
}
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
if (Utility.RandomDouble() < 0.1)
|
||||
{
|
||||
switch (Utility.Random(4))
|
||||
{
|
||||
case 0:
|
||||
PackItem(new ExodusSummoningRite());
|
||||
break;
|
||||
case 1:
|
||||
PackItem(new ExodusSacrificalDagger());
|
||||
break;
|
||||
case 2:
|
||||
PackItem(new RobeofRite());
|
||||
break;
|
||||
case 3:
|
||||
PackItem(new ExodusSummoningAlter());
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override bool CanBeParagon { get { return false; } }
|
||||
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
|
||||
public override int TreasureMapLevel{ get{ return 5; } }
|
||||
|
||||
public DupresChampion(Serial serial)
|
||||
: base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,113 @@
|
||||
using System;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a human corpse" )]
|
||||
public class DupresKnight : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public DupresKnight() : base( AIType.AI_Melee, FightMode.Aggressor, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = NameList.RandomName("male");
|
||||
Title = "The Knight";
|
||||
Body = 0x190;
|
||||
Hue = Utility.RandomSkinHue();
|
||||
Female = false;
|
||||
|
||||
SetStr( 190, 200 );
|
||||
SetDex( 50, 75 );
|
||||
SetInt( 150, 250 );
|
||||
SetHits( 3900, 4100 );
|
||||
SetDamage( 22, 28 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 50, 70 );
|
||||
SetResistance( ResistanceType.Fire, 50, 70 );
|
||||
SetResistance( ResistanceType.Cold, 50, 70 );
|
||||
SetResistance( ResistanceType.Poison, 50, 70 );
|
||||
SetResistance( ResistanceType.Energy, 50, 70 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 195.0, 220.0 );
|
||||
SetSkill( SkillName.Magery, 195.0, 220.0 );
|
||||
SetSkill( SkillName.Meditation, 195.0, 200.0 );
|
||||
SetSkill( SkillName.MagicResist, 100.0, 120.0 );
|
||||
SetSkill( SkillName.Tactics, 195.0, 220.0 );
|
||||
SetSkill( SkillName.Wrestling, 195.0, 220.0 );
|
||||
|
||||
VirtualArmor = 70;
|
||||
|
||||
Item longsword = new Longsword();
|
||||
longsword.LootType = LootType.Blessed;
|
||||
SetWearable(longsword);
|
||||
|
||||
Item ph = new PlateHelm();
|
||||
ph.LootType = LootType.Blessed;
|
||||
SetWearable(ph);
|
||||
|
||||
Item pa = new PlateArms();
|
||||
pa.LootType = LootType.Blessed;
|
||||
SetWearable(pa);
|
||||
|
||||
Item pg = new PlateGorget();
|
||||
pg.LootType = LootType.Blessed;
|
||||
SetWearable(pg);
|
||||
|
||||
Item pgl = new PlateGloves();
|
||||
pgl.LootType = LootType.Blessed;
|
||||
SetWearable(pgl);
|
||||
|
||||
Item pl = new PlateLegs();
|
||||
pl.LootType = LootType.Blessed;
|
||||
SetWearable(pl);
|
||||
|
||||
Item pc = new PlateChest();
|
||||
pc.LootType = LootType.Blessed;
|
||||
SetWearable(pc);
|
||||
|
||||
Item mks = new MetalKiteShield();
|
||||
mks.LootType = LootType.Blessed;
|
||||
mks.Hue = 0x794;
|
||||
SetWearable(mks);
|
||||
|
||||
Item bs = new BodySash(0x794); // dark purple
|
||||
bs.LootType = LootType.Blessed;
|
||||
SetWearable(bs);
|
||||
|
||||
PackGold( 400, 600 );
|
||||
}
|
||||
|
||||
public override void OnKilledBy(Mobile m)
|
||||
{
|
||||
base.OnKilledBy(m);
|
||||
|
||||
if (Utility.RandomDouble() < 0.1)
|
||||
{
|
||||
ExodusChest.GiveRituelItem(m);
|
||||
}
|
||||
}
|
||||
|
||||
public override bool CanBeParagon { get { return false; } }
|
||||
public override bool InitialInnocent { get { return true; } }
|
||||
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
|
||||
public override int TreasureMapLevel{ get{ return 5; } }
|
||||
|
||||
public DupresKnight(Serial serial)
|
||||
: base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,109 @@
|
||||
using System;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a human corpse" )]
|
||||
public class DupresSquire : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public DupresSquire() : base( AIType.AI_Melee, FightMode.Aggressor, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = NameList.RandomName("male");
|
||||
Title = "The Squire";
|
||||
Body = 0x190;
|
||||
Hue = Utility.RandomSkinHue();
|
||||
Female = false;
|
||||
|
||||
SetStr( 190, 200 );
|
||||
SetDex( 50, 75 );
|
||||
SetInt( 150, 250 );
|
||||
SetHits( 3900, 4100 );
|
||||
SetDamage( 22, 28 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 50, 70 );
|
||||
SetResistance( ResistanceType.Fire, 50, 70 );
|
||||
SetResistance( ResistanceType.Cold, 50, 70 );
|
||||
SetResistance( ResistanceType.Poison, 50, 70 );
|
||||
SetResistance( ResistanceType.Energy, 50, 70 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 195.0, 220.0 );
|
||||
SetSkill( SkillName.Magery, 195.0, 220.0 );
|
||||
SetSkill( SkillName.Meditation, 195.0, 200.0 );
|
||||
SetSkill( SkillName.MagicResist, 100.0, 120.0 );
|
||||
SetSkill( SkillName.Tactics, 195.0, 220.0 );
|
||||
SetSkill( SkillName.Wrestling, 195.0, 220.0 );
|
||||
|
||||
VirtualArmor = 70;
|
||||
|
||||
Item vikingsword = new VikingSword();
|
||||
vikingsword.LootType = LootType.Blessed;
|
||||
SetWearable(vikingsword);
|
||||
|
||||
Item cc = new ChainChest();
|
||||
cc.LootType = LootType.Blessed;
|
||||
SetWearable(cc);
|
||||
|
||||
Item cl = new ChainLegs();
|
||||
cl.LootType = LootType.Blessed;
|
||||
SetWearable(cl);
|
||||
|
||||
Item ch = new CloseHelm();
|
||||
ch.LootType = LootType.Blessed;
|
||||
SetWearable(ch);
|
||||
|
||||
Item boots = new Boots(1);
|
||||
boots.LootType = LootType.Blessed;
|
||||
SetWearable(boots);
|
||||
|
||||
Item pgl = new PlateGloves();
|
||||
pgl.LootType = LootType.Blessed;
|
||||
SetWearable(pgl);
|
||||
|
||||
Item mks = new MetalKiteShield();
|
||||
mks.LootType = LootType.Blessed;
|
||||
mks.Hue = 0x776;
|
||||
SetWearable(mks);
|
||||
|
||||
Item bs = new BodySash(0x794); // dark purple
|
||||
bs.LootType = LootType.Blessed;
|
||||
SetWearable(bs);
|
||||
|
||||
PackGold( 400, 600 );
|
||||
}
|
||||
|
||||
public override void OnKilledBy(Mobile m)
|
||||
{
|
||||
base.OnKilledBy(m);
|
||||
|
||||
if (Utility.RandomDouble() < 0.1)
|
||||
{
|
||||
ExodusChest.GiveRituelItem(m);
|
||||
}
|
||||
}
|
||||
|
||||
public override bool CanBeParagon { get { return false; } }
|
||||
public override bool InitialInnocent { get { return true; } }
|
||||
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
|
||||
public override int TreasureMapLevel{ get{ return 5; } }
|
||||
|
||||
public DupresSquire(Serial serial)
|
||||
: base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,317 @@
|
||||
#region Header
|
||||
//Exodus Encounter by Redmoon
|
||||
#endregion Header
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Server.Items;
|
||||
using Server.Gumps;
|
||||
using Server.Network;
|
||||
using Server.ContextMenus;
|
||||
using Server.Commands;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
public class ExodusArchZealot : Mobile
|
||||
{
|
||||
public virtual bool IsInvulnerable { get { return true; } }
|
||||
|
||||
[Constructable]
|
||||
public ExodusArchZealot()
|
||||
{
|
||||
Name = "Hunter";
|
||||
Title = "the Arch Zealot";
|
||||
Body = 0x190;
|
||||
CantWalk = true;
|
||||
Hue = 0;
|
||||
Blessed = true;
|
||||
|
||||
AddItem(new HoodedShroudOfShadows(0xA91));
|
||||
AddItem(new ThighBoots());
|
||||
|
||||
Item beard = new Item(0x2040);
|
||||
beard.Hue = 902;
|
||||
beard.Layer = Layer.FacialHair;
|
||||
beard.Movable = false;
|
||||
|
||||
AddItem(beard);
|
||||
}
|
||||
|
||||
public override bool OnDragDrop(Mobile from, Item dropped)
|
||||
{
|
||||
if (from.InRange(Location, 2))
|
||||
{
|
||||
if (from.Race == Race.Gargoyle && dropped.GetType() == typeof(ExodusSacrificalDagger))
|
||||
{
|
||||
dropped.Delete();
|
||||
from.AddToBackpack(new ExodusSacrificalGargishDagger());
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return base.OnDragDrop(from, dropped);
|
||||
}
|
||||
|
||||
public ExodusArchZealot(Serial serial): base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
public override void GetContextMenuEntries(Mobile from, List<ContextMenuEntry> list)
|
||||
{
|
||||
base.GetContextMenuEntries( from, list );
|
||||
list.Add(new ExodusArchZealotGumpEntry(from, this));
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
public class ExodusArchZealotGumpEntry : ContextMenuEntry
|
||||
{
|
||||
private Mobile m_Mobile;
|
||||
private Mobile m_Giver;
|
||||
|
||||
public ExodusArchZealotGumpEntry(Mobile from, Mobile giver) : base(6146, 3)
|
||||
{
|
||||
m_Mobile = from;
|
||||
m_Giver = giver;
|
||||
}
|
||||
|
||||
public override void OnClick()
|
||||
{
|
||||
if( !( m_Mobile is PlayerMobile ) )
|
||||
return;
|
||||
|
||||
PlayerMobile mobile = (PlayerMobile) m_Mobile;
|
||||
{
|
||||
if (!mobile.HasGump(typeof(ExodusArchZealotGump)))
|
||||
{
|
||||
mobile.SendGump(new ExodusArchZealotGump(mobile));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class ExodusArchZealotGump : Gump
|
||||
{
|
||||
public const int White = 0x7FFF;
|
||||
|
||||
public static void Initialize()
|
||||
{
|
||||
CommandSystem.Register("ExodusArchZealotGump", AccessLevel.GameMaster, new CommandEventHandler(ExodusArchZealotGump_OnCommand));
|
||||
}
|
||||
|
||||
private static void ExodusArchZealotGump_OnCommand(CommandEventArgs e)
|
||||
{
|
||||
e.Mobile.SendGump(new ExodusArchZealotGump(e.Mobile));
|
||||
}
|
||||
|
||||
public ExodusArchZealotGump(Mobile owner) : base(50, 50)
|
||||
{
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
|
||||
AddPage(0);
|
||||
AddImageTiled(54, 33, 369, 400, 2624);
|
||||
AddAlphaRegion(54, 33, 369, 400);
|
||||
|
||||
AddImageTiled(416, 39, 44, 389, 203);
|
||||
//--------------------------------------Window size bar--------------------------------------------
|
||||
|
||||
AddImage(97, 49, 9005);
|
||||
AddImageTiled(58, 39, 29, 390, 10460);
|
||||
AddImageTiled(412, 37, 31, 389, 10460);
|
||||
AddHtmlLocalized(140, 60, 250, 24, 1153670, White, false, false); // Exodus Arch Zealot
|
||||
AddImage(430, 9, 10441);
|
||||
AddImageTiled(40, 38, 17, 391, 9263);
|
||||
AddImage(6, 25, 10421);
|
||||
AddImage(34, 12, 10420);
|
||||
AddImageTiled(94, 25, 342, 15, 10304);
|
||||
AddImageTiled(40, 427, 415, 16, 10304);
|
||||
AddImage(-10, 314, 10402);
|
||||
AddImage(56, 150, 10411);
|
||||
AddImage(136, 84, 96);
|
||||
|
||||
AddPage(1);
|
||||
AddHtmlLocalized(107, 110, 300, 230, 1153671, White, false, true); // Greetings Traveler *sly grin* Can you feel it? Can you feel the awesome power that emanates from this place...surely Lord Exodus will join us again soon, why <20> that<61>s why you<6F>re here isn<73>t it? To perform the Ritual?
|
||||
|
||||
AddHtmlLocalized(155, 260, 250, 24, 1153672, White, false, false);
|
||||
AddButton(125, 260, 0x26B0, 0x26B1, 0, GumpButtonType.Page, 2);//Ritual?
|
||||
|
||||
AddHtmlLocalized(155, 280, 250, 24, 1153674, White, false, false);
|
||||
AddButton(125, 280, 0x26B0, 0x26B1, 0, GumpButtonType.Page, 3);//Summoning Altar?
|
||||
|
||||
AddHtmlLocalized(155, 300, 250, 24, 1153676, White, false, false);
|
||||
AddButton(125, 300, 0x26B0, 0x26B1, 0, GumpButtonType.Page, 4);//Robe of Rite?
|
||||
|
||||
AddHtmlLocalized(155, 320, 250, 24, 1153678, White, false, false);
|
||||
AddButton(125, 320, 0x26B0, 0x26B1, 0, GumpButtonType.Page, 5);//Summoning Rite?
|
||||
|
||||
AddHtmlLocalized(155, 340, 250, 24, 1153680, White, false, false);
|
||||
AddButton(125, 340, 0x26B0, 0x26B1, 0, GumpButtonType.Page, 6);//Sacrifical Dagger?
|
||||
|
||||
AddHtmlLocalized(155, 360, 250, 24, 1153682, White, false, false);
|
||||
AddButton(125, 360, 0x26B0, 0x26B1, 0, GumpButtonType.Page, 7);//The Keys?
|
||||
|
||||
AddButton(325, 390, 0xF7, 0xF8, 0, GumpButtonType.Reply, 0);//OK
|
||||
|
||||
//// START PAGE 2 Ritual
|
||||
AddPage(2);
|
||||
AddHtmlLocalized(107, 110, 300, 230, 1153673, White, false, true); // The Ritual can only be performed by the most devoted of followers...and even then, only when the Summoning Altar has been built can the Robe of Rite be worn, the Summoning Rite be read and the Sacrificial dagger used to declare thy intention...only then can the great Lord Exodus be summoned to this plane...for these are the Keys to his return *laughs manically*
|
||||
|
||||
AddHtmlLocalized(155, 280, 250, 24, 1153674, White, false, false);
|
||||
AddButton(125, 280, 0x26B0, 0x26B1, 0, GumpButtonType.Page, 3);//Summoning Altar?
|
||||
|
||||
AddHtmlLocalized(155, 300, 250, 24, 1153676, White, false, false);
|
||||
AddButton(125, 300, 0x26B0, 0x26B1, 0, GumpButtonType.Page, 4);//Robe of Rite?
|
||||
|
||||
AddHtmlLocalized(155, 320, 250, 24, 1153678, White, false, false);
|
||||
AddButton(125, 320, 0x26B0, 0x26B1, 0, GumpButtonType.Page, 5);//Summoning Rite?
|
||||
|
||||
AddHtmlLocalized(155, 340, 250, 24, 1153680, White, false, false);
|
||||
AddButton(125, 340, 0x26B0, 0x26B1, 0, GumpButtonType.Page, 6);//Sacrifical Dagger?
|
||||
|
||||
AddHtmlLocalized(155, 360, 250, 24, 1153682, White, false, false);
|
||||
AddButton(125, 360, 0x26B0, 0x26B1, 0, GumpButtonType.Page, 7);//The Keys?
|
||||
|
||||
AddButton(325, 390, 0xF7, 0xF8, 0, GumpButtonType.Reply, 0);//OK
|
||||
///// END PAGE 2 Ritual
|
||||
|
||||
|
||||
//// START PAGE 3 Summoning Alter
|
||||
AddPage(3);
|
||||
AddHtmlLocalized(107, 110, 300, 230, 1153675, White, false, true); // The Summoning Altar must be built upon a shrine, within Trammel or Felucca it matters not...
|
||||
|
||||
AddHtmlLocalized(155, 300, 250, 24, 1153676, White, false, false);
|
||||
AddButton(125, 300, 0x26B0, 0x26B1, 0, GumpButtonType.Page, 4);//Robe of Rite?
|
||||
|
||||
AddHtmlLocalized(155, 320, 250, 24, 1153678, White, false, false);
|
||||
AddButton(125, 320, 0x26B0, 0x26B1, 0, GumpButtonType.Page, 5);//Summoning Rite?
|
||||
|
||||
AddHtmlLocalized(155, 340, 250, 24, 1153680, White, false, false);
|
||||
AddButton(125, 340, 0x26B0, 0x26B1, 0, GumpButtonType.Page, 6);//Sacrifical Dagger?
|
||||
|
||||
AddHtmlLocalized(155, 360, 250, 24, 1153682, White, false, false);
|
||||
AddButton(125, 360, 0x26B0, 0x26B1, 0, GumpButtonType.Page, 7);//The Keys?
|
||||
|
||||
AddButton(325, 390, 0xF7, 0xF8, 0, GumpButtonType.Reply, 0);//OK
|
||||
///// END PAGE 3 Summoning Alter
|
||||
|
||||
|
||||
//// START PAGE 4 Robe of Rite
|
||||
|
||||
AddPage(4);
|
||||
AddHtmlLocalized(107, 110, 300, 230, 1153677, White, false, true); // These vestments must be worn as a sign of devotion to the ritual, for without them thou art not true to Lord Exodus.
|
||||
|
||||
AddHtmlLocalized(155, 320, 250, 24, 1153678, White, false, false);
|
||||
AddButton(125, 320, 0x26B0, 0x26B1, 0, GumpButtonType.Page, 5);//Summoning Rite?
|
||||
|
||||
AddHtmlLocalized(155, 340, 250, 24, 1153680, White, false, false);
|
||||
AddButton(125, 340, 0x26B0, 0x26B1, 0, GumpButtonType.Page, 6);//Sacrifical Dagger?
|
||||
|
||||
AddHtmlLocalized(155, 360, 250, 24, 1153682, White, false, false);
|
||||
AddButton(125, 360, 0x26B0, 0x26B1, 0, GumpButtonType.Page, 7);//The Keys?
|
||||
|
||||
AddButton(325, 390, 0xF7, 0xF8, 0, GumpButtonType.Reply, 0);//OK
|
||||
///// END PAGE 4 Robe of Rite
|
||||
|
||||
|
||||
//// START PAGE 5 Summoning Rite
|
||||
AddPage(5);
|
||||
AddHtmlLocalized(107, 110, 300, 230, 1153679, White, false, true); // From the tongue of the summoner these words must flow, for without them thou art not true!
|
||||
|
||||
AddHtmlLocalized(155, 340, 250, 24, 1153680, White, false, false);
|
||||
AddButton(125, 340, 0x26B0, 0x26B1, 0, GumpButtonType.Page, 6);//Sacrifical Dagger?
|
||||
|
||||
AddHtmlLocalized(155, 360, 250, 24, 1153682, White, false, false);
|
||||
AddButton(125, 360, 0x26B0, 0x26B1, 0, GumpButtonType.Page, 7);//The Keys?
|
||||
|
||||
AddButton(325, 390, 0xF7, 0xF8, 0, GumpButtonType.Reply, 0);//OK
|
||||
///// END PAGE 5 Summoning Rite
|
||||
|
||||
|
||||
//// START PAGE 6 Sacrifical Dagger
|
||||
AddPage(6);
|
||||
AddHtmlLocalized(107, 110, 300, 230, 1153681, White, false, true); // This dagger, infused with black rock, is the instrument by which thou shall prove thy intention before the altar. If you wish a dagger to fit the talons of a gargoyle, simply hand to me the human tool and I shall alter it for you.
|
||||
|
||||
AddHtmlLocalized(155, 360, 250, 24, 1153682, White, false, false);
|
||||
AddButton(125, 360, 0x26B0, 0x26B1, 0, GumpButtonType.Page, 7);//The Keys?
|
||||
|
||||
AddButton(325, 390, 0xF7, 0xF8, 0, GumpButtonType.Reply, 0);//OK
|
||||
///// END PAGE 6 Sacrifical Dagger
|
||||
|
||||
|
||||
//// START PAGE 7 Keys
|
||||
AddPage(7);
|
||||
AddHtmlLocalized(107, 110, 300, 230, 1153683, White, false, true); // Without the Keys the ritual cannot be performed. To obtain these Keys you may follow the path of the Warrior, the Rogue, or the Craftsman.
|
||||
|
||||
AddHtmlLocalized(155, 320, 250, 24, 1153684, White, false, false);
|
||||
AddButton(125, 320, 0x26B0, 0x26B1, 0, GumpButtonType.Page, 8);//The Warrior?
|
||||
|
||||
AddHtmlLocalized(155, 340, 250, 24, 1153686, White, false, false);
|
||||
AddButton(125, 340, 0x26B0, 0x26B1, 0, GumpButtonType.Page, 9);//The Rogue?
|
||||
|
||||
AddHtmlLocalized(155, 360, 250, 24, 1153688, White, false, false);
|
||||
AddButton(125, 360, 0x26B0, 0x26B1, 0, GumpButtonType.Page, 10);//The Craftsman?
|
||||
|
||||
AddButton(325, 390, 0xF7, 0xF8, 0, GumpButtonType.Reply, 0);//OK
|
||||
////END PAGE 7 Keys
|
||||
|
||||
|
||||
//// START PAGE 8 WARRIOR
|
||||
AddPage(8);
|
||||
AddHtmlLocalized(107, 110, 300, 230, 1153685, White, false, true); // Deep within Exodus Dungeon, minions of Lord Exodus battle fiercely against Lord Dupre<72>s men...slay either one to collect the Keys.
|
||||
|
||||
AddHtmlLocalized(155, 340, 250, 24, 1153686, White, false, false);
|
||||
AddButton(125, 340, 0x26B0, 0x26B1, 0, GumpButtonType.Page, 9);//The Rogue?
|
||||
|
||||
AddHtmlLocalized(155, 360, 250, 24, 1153688, White, false, false);
|
||||
AddButton(125, 360, 0x26B0, 0x26B1, 0, GumpButtonType.Page, 10);//The Craftsman?
|
||||
|
||||
AddButton(325, 390, 0xF7, 0xF8, 0, GumpButtonType.Reply, 0);//OK
|
||||
////END PAGE 8 WARRIOR
|
||||
|
||||
|
||||
////START PAGE 9 ROGUE
|
||||
AddPage(9);
|
||||
AddHtmlLocalized(107, 110, 300, 230, 1153687, White, false, true); // Hidden deep inside the dungeon are supply caches...within them the intrepid rogue can find the Keys to the ritual. Look keenly and be deft with thy touch...as these caches are likely to be trapped. For the light of touch the Keys may be stolen from Zealots within the depths of the Dungeon...
|
||||
|
||||
AddHtmlLocalized(155, 360, 250, 24, 1153688, White, false, false);
|
||||
AddButton(125, 360, 0x26B0, 0x26B1, 0, GumpButtonType.Page, 10);//The Craftsman?
|
||||
|
||||
AddButton(325, 390, 0xF7, 0xF8, 0, GumpButtonType.Reply, 0);//OK
|
||||
////END PAGE 9 ROGUE
|
||||
|
||||
////START PAGE 10 CRAFTSMAN
|
||||
AddPage(10);
|
||||
AddHtmlLocalized(107, 110, 300, 230, 1153689, White, false, true); // From the hands of the skilled artisan all of these Keys may be built by means of Tailoring, Alchemy, Carpentry, and Smithy.
|
||||
|
||||
AddButton(325, 390, 0xF7, 0xF8, 0, GumpButtonType.Reply, 0);//OK
|
||||
////END PAGE 10 CRAFTSMAN
|
||||
|
||||
}
|
||||
|
||||
public override void OnResponse(NetState state, RelayInfo info) //Function for GumpButtonType.Reply Buttons
|
||||
{
|
||||
Mobile from = state.Mobile;
|
||||
|
||||
switch (info.ButtonID)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
//Cancel
|
||||
from.SendMessage("Good Luck!");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,173 @@
|
||||
using System;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("a drone's corpse")]
|
||||
public class ExodusDrone : BaseCreature
|
||||
{
|
||||
private bool m_FieldActive;
|
||||
|
||||
[Constructable]
|
||||
public ExodusDrone() : base(AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4)
|
||||
{
|
||||
this.Name = "Exodus Drone";
|
||||
this.Body = 0x2F4;
|
||||
this.Hue = 0xA92;
|
||||
this.SetStr(554, 650);
|
||||
this.SetDex(77, 85);
|
||||
this.SetInt(64, 85);
|
||||
|
||||
this.SetHits(332, 389);
|
||||
this.SetDamage(13, 19);
|
||||
|
||||
this.SetDamageType(ResistanceType.Physical, 50);
|
||||
this.SetDamageType(ResistanceType.Energy, 50);
|
||||
|
||||
this.SetResistance(ResistanceType.Physical, 45, 55);
|
||||
this.SetResistance(ResistanceType.Fire, 40, 60);
|
||||
this.SetResistance(ResistanceType.Cold, 25, 35);
|
||||
this.SetResistance(ResistanceType.Poison, 25, 34);
|
||||
this.SetResistance(ResistanceType.Energy, 25, 35);
|
||||
|
||||
this.SetSkill(SkillName.MagicResist, 83.8, 95.4);
|
||||
this.SetSkill(SkillName.Tactics, 82.9, 94.9);
|
||||
this.SetSkill(SkillName.Wrestling, 84.7, 95.9);
|
||||
|
||||
this.Fame = 18000;
|
||||
this.Karma = -18000;
|
||||
this.VirtualArmor = 65;
|
||||
|
||||
this.PackItem(new PowerCrystal());
|
||||
this.PackItem(new ArcaneGem());
|
||||
this.PackItem(new ClockworkAssembly());
|
||||
|
||||
this.m_FieldActive = this.CanUseField;
|
||||
}
|
||||
|
||||
public override void OnKilledBy(Mobile m)
|
||||
{
|
||||
base.OnKilledBy(m);
|
||||
|
||||
if (Utility.RandomDouble() < 0.1)
|
||||
{
|
||||
ExodusChest.GiveRituelItem(m);
|
||||
}
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
this.AddLoot(LootPack.Average);
|
||||
}
|
||||
|
||||
public ExodusDrone(Serial serial) : base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
public bool FieldActive { get { return this.m_FieldActive; } }
|
||||
public bool CanUseField { get { return this.Hits >= this.HitsMax * 9 / 10; } } // TODO: an OSI bug prevents to verify this
|
||||
public override bool IsScaredOfScaryThings { get { return false; } }
|
||||
public override bool IsScaryToPets { get { return true; } }
|
||||
public override bool BardImmune { get { return !Core.AOS; } }
|
||||
public override Poison PoisonImmune { get { return Poison.Lethal; } }
|
||||
|
||||
public override int GetIdleSound() { return 0x218; }
|
||||
public override int GetAngerSound() { return 0x26C; }
|
||||
public override int GetDeathSound() { return 0x211; }
|
||||
public override int GetAttackSound() { return 0x232; }
|
||||
public override int GetHurtSound() { return 0x140; }
|
||||
|
||||
public override void AlterMeleeDamageFrom(Mobile from, ref int damage)
|
||||
{
|
||||
if (this.m_FieldActive)
|
||||
damage = 0; // no melee damage when the field is up
|
||||
}
|
||||
|
||||
public override void AlterSpellDamageFrom(Mobile from, ref int damage)
|
||||
{
|
||||
if (!this.m_FieldActive)
|
||||
damage = 0; // no spell damage when the field is down
|
||||
}
|
||||
|
||||
public override void OnDamagedBySpell(Mobile from)
|
||||
{
|
||||
if (from != null && from.Alive && 0.4 > Utility.RandomDouble())
|
||||
{
|
||||
this.SendEBolt(from);
|
||||
}
|
||||
|
||||
if (!this.m_FieldActive)
|
||||
{
|
||||
// should there be an effect when spells nullifying is on?
|
||||
this.FixedParticles(0, 10, 0, 0x2522, EffectLayer.Waist);
|
||||
}
|
||||
else if (this.m_FieldActive && !this.CanUseField)
|
||||
{
|
||||
this.m_FieldActive = false;
|
||||
|
||||
// TODO: message and effect when field turns down; cannot be verified on OSI due to a bug
|
||||
this.FixedParticles(0x3735, 1, 30, 0x251F, EffectLayer.Waist);
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnGotMeleeAttack(Mobile attacker)
|
||||
{
|
||||
base.OnGotMeleeAttack(attacker);
|
||||
|
||||
if (this.m_FieldActive)
|
||||
{
|
||||
this.FixedParticles(0x376A, 20, 10, 0x2530, EffectLayer.Waist);
|
||||
|
||||
this.PlaySound(0x2F4);
|
||||
|
||||
attacker.SendAsciiMessage("Your weapon cannot penetrate the creature's magical barrier");
|
||||
}
|
||||
|
||||
if (attacker != null && attacker.Alive && attacker.Weapon is BaseRanged && 0.4 > Utility.RandomDouble())
|
||||
{
|
||||
this.SendEBolt(attacker);
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnThink()
|
||||
{
|
||||
base.OnThink();
|
||||
|
||||
// TODO: an OSI bug prevents to verify if the field can regenerate or not
|
||||
if (!this.m_FieldActive && !this.IsHurt())
|
||||
this.m_FieldActive = true;
|
||||
}
|
||||
|
||||
public override bool Move(Direction d)
|
||||
{
|
||||
bool move = base.Move(d);
|
||||
|
||||
if (move && this.m_FieldActive && this.Combatant != null)
|
||||
this.FixedParticles(0, 10, 0, 0x2530, EffectLayer.Waist);
|
||||
|
||||
return move;
|
||||
}
|
||||
|
||||
public void SendEBolt(Mobile to)
|
||||
{
|
||||
this.MovingParticles(to, 0x379F, 7, 0, false, true, 0xBE3, 0xFCB, 0x211);
|
||||
to.PlaySound(0x229);
|
||||
this.DoHarmful(to);
|
||||
AOS.Damage(to, this, 50, 0, 0, 0, 0, 100);
|
||||
}
|
||||
|
||||
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();
|
||||
|
||||
this.m_FieldActive = this.CanUseField;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,173 @@
|
||||
using System;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("a juggernaut's corpse")]
|
||||
public class ExodusJuggernaut : BaseCreature
|
||||
{
|
||||
private bool m_FieldActive;
|
||||
|
||||
[Constructable]
|
||||
public ExodusJuggernaut() : base(AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4)
|
||||
{
|
||||
this.Name = "Exodus Juggernaut";
|
||||
this.Body = 0x2F0;
|
||||
this.Hue = 2702;
|
||||
this.SetStr(1506, 1565);
|
||||
this.SetDex(92, 99);
|
||||
this.SetInt(101, 126);
|
||||
|
||||
this.SetHits(1012, 1069);
|
||||
this.SetDamage(19, 25);
|
||||
|
||||
this.SetDamageType(ResistanceType.Physical, 60);
|
||||
this.SetDamageType(ResistanceType.Energy, 40);
|
||||
|
||||
this.SetResistance(ResistanceType.Physical, 60, 80);
|
||||
this.SetResistance(ResistanceType.Fire, 60, 80);
|
||||
this.SetResistance(ResistanceType.Cold, 20, 30);
|
||||
this.SetResistance(ResistanceType.Poison, 30, 40);
|
||||
this.SetResistance(ResistanceType.Energy, 40, 50);
|
||||
|
||||
this.SetSkill(SkillName.MagicResist, 99.1, 100.0);
|
||||
this.SetSkill(SkillName.Tactics, 99.1, 100.0);
|
||||
this.SetSkill(SkillName.Wrestling, 99.1, 100.0);
|
||||
|
||||
this.Fame = 18000;
|
||||
this.Karma = -18000;
|
||||
this.VirtualArmor = 65;
|
||||
|
||||
this.PackItem(new PowerCrystal());
|
||||
this.PackItem(new ArcaneGem());
|
||||
this.PackItem(new ClockworkAssembly());
|
||||
|
||||
this.m_FieldActive = this.CanUseField;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
this.AddLoot(LootPack.Rich);
|
||||
}
|
||||
|
||||
public override void OnKilledBy(Mobile m)
|
||||
{
|
||||
base.OnKilledBy(m);
|
||||
|
||||
if (Utility.RandomDouble() < 0.1)
|
||||
{
|
||||
ExodusChest.GiveRituelItem(m);
|
||||
}
|
||||
}
|
||||
|
||||
public ExodusJuggernaut(Serial serial): base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
public bool FieldActive { get { return this.m_FieldActive; } }
|
||||
public bool CanUseField { get { return this.Hits >= this.HitsMax * 9 / 10; } } // TODO: an OSI bug prevents to verify this
|
||||
public override bool IsScaredOfScaryThings { get { return false; } }
|
||||
public override bool IsScaryToPets { get { return true; } }
|
||||
public override bool BardImmune { get { return !Core.AOS; } }
|
||||
public override Poison PoisonImmune { get { return Poison.Lethal; } }
|
||||
|
||||
public override int GetIdleSound() { return 0x218; }
|
||||
public override int GetAngerSound() { return 0x26C; }
|
||||
public override int GetDeathSound() { return 0x211; }
|
||||
public override int GetAttackSound() { return 0x232; }
|
||||
public override int GetHurtSound() { return 0x140; }
|
||||
|
||||
public override void AlterMeleeDamageFrom(Mobile from, ref int damage)
|
||||
{
|
||||
if (this.m_FieldActive)
|
||||
damage = 0; // no melee damage when the field is up
|
||||
}
|
||||
|
||||
public override void AlterSpellDamageFrom(Mobile from, ref int damage)
|
||||
{
|
||||
if (!this.m_FieldActive)
|
||||
damage = 0; // no spell damage when the field is down
|
||||
}
|
||||
|
||||
public override void OnDamagedBySpell(Mobile from)
|
||||
{
|
||||
if (from != null && from.Alive && 0.4 > Utility.RandomDouble())
|
||||
{
|
||||
this.SendEBolt(from);
|
||||
}
|
||||
|
||||
if (!this.m_FieldActive)
|
||||
{
|
||||
// should there be an effect when spells nullifying is on?
|
||||
this.FixedParticles(0, 10, 0, 0x2522, EffectLayer.Waist);
|
||||
}
|
||||
else if (this.m_FieldActive && !this.CanUseField)
|
||||
{
|
||||
this.m_FieldActive = false;
|
||||
|
||||
// TODO: message and effect when field turns down; cannot be verified on OSI due to a bug
|
||||
this.FixedParticles(0x3735, 1, 30, 0x251F, EffectLayer.Waist);
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnGotMeleeAttack(Mobile attacker)
|
||||
{
|
||||
base.OnGotMeleeAttack(attacker);
|
||||
|
||||
if (this.m_FieldActive)
|
||||
{
|
||||
this.FixedParticles(0x376A, 20, 10, 0x2530, EffectLayer.Waist);
|
||||
|
||||
this.PlaySound(0x2F4);
|
||||
|
||||
attacker.SendAsciiMessage("Your weapon cannot penetrate the creature's magical barrier");
|
||||
}
|
||||
|
||||
if (attacker != null && attacker.Alive && attacker.Weapon is BaseRanged && 0.4 > Utility.RandomDouble())
|
||||
{
|
||||
this.SendEBolt(attacker);
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnThink()
|
||||
{
|
||||
base.OnThink();
|
||||
|
||||
// TODO: an OSI bug prevents to verify if the field can regenerate or not
|
||||
if (!this.m_FieldActive && !this.IsHurt())
|
||||
this.m_FieldActive = true;
|
||||
}
|
||||
|
||||
public override bool Move(Direction d)
|
||||
{
|
||||
bool move = base.Move(d);
|
||||
|
||||
if (move && this.m_FieldActive && this.Combatant != null)
|
||||
this.FixedParticles(0, 10, 0, 0x2530, EffectLayer.Waist);
|
||||
|
||||
return move;
|
||||
}
|
||||
|
||||
public void SendEBolt(Mobile to)
|
||||
{
|
||||
this.MovingParticles(to, 0x379F, 7, 0, false, true, 0xBE3, 0xFCB, 0x211);
|
||||
to.PlaySound(0x229);
|
||||
this.DoHarmful(to);
|
||||
AOS.Damage(to, this, 50, 0, 0, 0, 0, 100);
|
||||
}
|
||||
|
||||
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();
|
||||
|
||||
this.m_FieldActive = this.CanUseField;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,248 @@
|
||||
using System;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("a exodus minion lord's corpse")]
|
||||
public class ExodusMinionLord : BaseCreature
|
||||
{
|
||||
private bool m_FieldActive;
|
||||
|
||||
[Constructable]
|
||||
public ExodusMinionLord() : base(AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4)
|
||||
{
|
||||
Name = "Exodus Minion Lord";
|
||||
Body = 0x2FB;
|
||||
Hue = 0xA92;
|
||||
SetStr(1501, 1571);
|
||||
SetDex(74, 78);
|
||||
SetInt(66, 89);
|
||||
|
||||
SetHits(903, 957);
|
||||
|
||||
SetDamage(19, 25);
|
||||
|
||||
SetResistance(ResistanceType.Physical, 65, 80);
|
||||
SetResistance(ResistanceType.Fire, 65, 80);
|
||||
SetResistance(ResistanceType.Cold, 20, 30);
|
||||
SetResistance(ResistanceType.Poison, 30, 40);
|
||||
SetResistance(ResistanceType.Energy, 40, 50);
|
||||
|
||||
SetSkill(SkillName.MagicResist, 99.3, 99.8);
|
||||
SetSkill(SkillName.Tactics, 99.4, 100.0);
|
||||
SetSkill(SkillName.Wrestling, 99.2, 99.7);
|
||||
|
||||
Fame = 18000;
|
||||
Karma = -18000;
|
||||
VirtualArmor = 65;
|
||||
|
||||
PackItem(new PowerCrystal());
|
||||
PackItem(new ArcaneGem());
|
||||
PackItem(new ClockworkAssembly());
|
||||
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot(LootPack.Average);
|
||||
AddLoot(LootPack.Rich);
|
||||
|
||||
if (Utility.RandomDouble() < 0.1)
|
||||
{
|
||||
switch (Utility.Random(4))
|
||||
{
|
||||
case 0:
|
||||
PackItem(new ExodusSummoningRite());
|
||||
break;
|
||||
case 1:
|
||||
PackItem(new ExodusSacrificalDagger());
|
||||
break;
|
||||
case 2:
|
||||
PackItem(new RobeofRite());
|
||||
break;
|
||||
case 3:
|
||||
PackItem(new ExodusSummoningAlter());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
m_FieldActive = CanUseField;
|
||||
}
|
||||
|
||||
public ExodusMinionLord(Serial serial)
|
||||
: base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
public bool FieldActive
|
||||
{
|
||||
get
|
||||
{
|
||||
return m_FieldActive;
|
||||
}
|
||||
}
|
||||
public bool CanUseField
|
||||
{
|
||||
get
|
||||
{
|
||||
return Hits >= HitsMax * 9 / 10;
|
||||
}
|
||||
}// TODO: an OSI bug prevents to verify this
|
||||
public override bool IsScaredOfScaryThings
|
||||
{
|
||||
get
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
public override bool IsScaryToPets
|
||||
{
|
||||
get
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
public override bool AutoDispel
|
||||
{
|
||||
get
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
public override bool BardImmune
|
||||
{
|
||||
get
|
||||
{
|
||||
return !Core.AOS;
|
||||
}
|
||||
}
|
||||
public override Poison PoisonImmune
|
||||
{
|
||||
get
|
||||
{
|
||||
return Poison.Lethal;
|
||||
}
|
||||
}
|
||||
|
||||
public override int GetIdleSound()
|
||||
{
|
||||
return 0x218;
|
||||
}
|
||||
|
||||
public override int GetAngerSound()
|
||||
{
|
||||
return 0x26C;
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 0x211;
|
||||
}
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 0x232;
|
||||
}
|
||||
|
||||
public override int GetHurtSound()
|
||||
{
|
||||
return 0x140;
|
||||
}
|
||||
|
||||
public override void AlterMeleeDamageFrom(Mobile from, ref int damage)
|
||||
{
|
||||
if (m_FieldActive)
|
||||
damage = 0; // no melee damage when the field is up
|
||||
}
|
||||
|
||||
public override void AlterSpellDamageFrom(Mobile from, ref int damage)
|
||||
{
|
||||
if (!m_FieldActive)
|
||||
damage = 0; // no spell damage when the field is down
|
||||
}
|
||||
|
||||
public override void OnDamagedBySpell(Mobile from)
|
||||
{
|
||||
if (from != null && from.Alive && 0.4 > Utility.RandomDouble())
|
||||
{
|
||||
SendEBolt(from);
|
||||
}
|
||||
|
||||
if (!m_FieldActive)
|
||||
{
|
||||
// should there be an effect when spells nullifying is on?
|
||||
FixedParticles(0, 10, 0, 0x2522, EffectLayer.Waist);
|
||||
}
|
||||
else if (m_FieldActive && !CanUseField)
|
||||
{
|
||||
m_FieldActive = false;
|
||||
|
||||
// TODO: message and effect when field turns down; cannot be verified on OSI due to a bug
|
||||
FixedParticles(0x3735, 1, 30, 0x251F, EffectLayer.Waist);
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnGotMeleeAttack(Mobile attacker)
|
||||
{
|
||||
base.OnGotMeleeAttack(attacker);
|
||||
|
||||
if (m_FieldActive)
|
||||
{
|
||||
FixedParticles(0x376A, 20, 10, 0x2530, EffectLayer.Waist);
|
||||
|
||||
PlaySound(0x2F4);
|
||||
|
||||
attacker.SendAsciiMessage("Your weapon cannot penetrate the creature's magical barrier");
|
||||
}
|
||||
|
||||
if (attacker != null && attacker.Alive && attacker.Weapon is BaseRanged && 0.4 > Utility.RandomDouble())
|
||||
{
|
||||
SendEBolt(attacker);
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnThink()
|
||||
{
|
||||
base.OnThink();
|
||||
|
||||
// TODO: an OSI bug prevents to verify if the field can regenerate or not
|
||||
if (!m_FieldActive && !IsHurt())
|
||||
m_FieldActive = true;
|
||||
}
|
||||
|
||||
public override bool Move(Direction d)
|
||||
{
|
||||
bool move = base.Move(d);
|
||||
|
||||
if (move && m_FieldActive && Combatant != null)
|
||||
FixedParticles(0, 10, 0, 0x2530, EffectLayer.Waist);
|
||||
|
||||
return move;
|
||||
}
|
||||
|
||||
public void SendEBolt(Mobile to)
|
||||
{
|
||||
MovingParticles(to, 0x379F, 7, 0, false, true, 0xBE3, 0xFCB, 0x211);
|
||||
to.PlaySound(0x229);
|
||||
DoHarmful(to);
|
||||
AOS.Damage(to, this, 50, 0, 0, 0, 0, 100);
|
||||
}
|
||||
|
||||
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_FieldActive = CanUseField;
|
||||
|
||||
if (Name == "Exodus Minion Lord")
|
||||
Name = "exodus minion lord";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,174 @@
|
||||
using System;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("a sentinel's corpse")]
|
||||
public class ExodusSentinel : BaseCreature
|
||||
{
|
||||
private bool m_FieldActive;
|
||||
|
||||
[Constructable]
|
||||
public ExodusSentinel() : base(AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4)
|
||||
{
|
||||
this.Name = "Exodus Sentinel";
|
||||
this.Body = 0x2FB;
|
||||
this.Hue = 0xA92;
|
||||
this.SetStr(854, 934);
|
||||
this.SetDex(81, 90);
|
||||
this.SetInt(81, 105);
|
||||
|
||||
this.SetHits(516, 564);
|
||||
|
||||
this.SetDamage(16, 22);
|
||||
|
||||
this.SetDamageType(ResistanceType.Physical, 60);
|
||||
this.SetDamageType(ResistanceType.Energy, 40);
|
||||
|
||||
this.SetResistance(ResistanceType.Physical, 60, 70);
|
||||
this.SetResistance(ResistanceType.Fire, 40, 50);
|
||||
this.SetResistance(ResistanceType.Cold, 25, 35);
|
||||
this.SetResistance(ResistanceType.Poison, 25, 35);
|
||||
this.SetResistance(ResistanceType.Energy, 25, 35);
|
||||
|
||||
this.SetSkill(SkillName.MagicResist, 91.5, 99.6);
|
||||
this.SetSkill(SkillName.Tactics, 91.9, 99.4);
|
||||
this.SetSkill(SkillName.Wrestling, 90.1, 98.9);
|
||||
|
||||
this.Fame = 18000;
|
||||
this.Karma = -18000;
|
||||
this.VirtualArmor = 65;
|
||||
|
||||
this.PackItem(new PowerCrystal());
|
||||
this.PackItem(new ArcaneGem());
|
||||
this.PackItem(new ClockworkAssembly());
|
||||
|
||||
this.m_FieldActive = this.CanUseField;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
this.AddLoot(LootPack.Rich);
|
||||
}
|
||||
|
||||
public override void OnKilledBy(Mobile m)
|
||||
{
|
||||
base.OnKilledBy(m);
|
||||
|
||||
if (Utility.RandomDouble() < 0.1)
|
||||
{
|
||||
ExodusChest.GiveRituelItem(m);
|
||||
}
|
||||
}
|
||||
|
||||
public ExodusSentinel(Serial serial) : base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
public bool FieldActive { get { return this.m_FieldActive; } }
|
||||
public bool CanUseField { get { return this.Hits >= this.HitsMax * 9 / 10; } }// TODO: an OSI bug prevents to verify this
|
||||
public override bool IsScaredOfScaryThings { get { return false; } }
|
||||
public override bool IsScaryToPets { get { return true; } }
|
||||
public override bool BardImmune { get { return !Core.AOS; } }
|
||||
public override Poison PoisonImmune { get { return Poison.Lethal; } }
|
||||
|
||||
public override int GetIdleSound() { return 0x218; }
|
||||
public override int GetAngerSound() { return 0x26C; }
|
||||
public override int GetDeathSound() { return 0x211; }
|
||||
public override int GetAttackSound() { return 0x232; }
|
||||
public override int GetHurtSound() { return 0x140; }
|
||||
|
||||
public override void AlterMeleeDamageFrom(Mobile from, ref int damage)
|
||||
{
|
||||
if (this.m_FieldActive)
|
||||
damage = 0; // no melee damage when the field is up
|
||||
}
|
||||
|
||||
public override void AlterSpellDamageFrom(Mobile from, ref int damage)
|
||||
{
|
||||
if (!this.m_FieldActive)
|
||||
damage = 0; // no spell damage when the field is down
|
||||
}
|
||||
|
||||
public override void OnDamagedBySpell(Mobile from)
|
||||
{
|
||||
if (from != null && from.Alive && 0.4 > Utility.RandomDouble())
|
||||
{
|
||||
this.SendEBolt(from);
|
||||
}
|
||||
|
||||
if (!this.m_FieldActive)
|
||||
{
|
||||
// should there be an effect when spells nullifying is on?
|
||||
this.FixedParticles(0, 10, 0, 0x2522, EffectLayer.Waist);
|
||||
}
|
||||
else if (this.m_FieldActive && !this.CanUseField)
|
||||
{
|
||||
this.m_FieldActive = false;
|
||||
|
||||
// TODO: message and effect when field turns down; cannot be verified on OSI due to a bug
|
||||
this.FixedParticles(0x3735, 1, 30, 0x251F, EffectLayer.Waist);
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnGotMeleeAttack(Mobile attacker)
|
||||
{
|
||||
base.OnGotMeleeAttack(attacker);
|
||||
|
||||
if (this.m_FieldActive)
|
||||
{
|
||||
this.FixedParticles(0x376A, 20, 10, 0x2530, EffectLayer.Waist);
|
||||
|
||||
this.PlaySound(0x2F4);
|
||||
|
||||
attacker.SendAsciiMessage("Your weapon cannot penetrate the creature's magical barrier");
|
||||
}
|
||||
|
||||
if (attacker != null && attacker.Alive && attacker.Weapon is BaseRanged && 0.4 > Utility.RandomDouble())
|
||||
{
|
||||
this.SendEBolt(attacker);
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnThink()
|
||||
{
|
||||
base.OnThink();
|
||||
|
||||
// TODO: an OSI bug prevents to verify if the field can regenerate or not
|
||||
if (!this.m_FieldActive && !this.IsHurt())
|
||||
this.m_FieldActive = true;
|
||||
}
|
||||
|
||||
public override bool Move(Direction d)
|
||||
{
|
||||
bool move = base.Move(d);
|
||||
|
||||
if (move && this.m_FieldActive && this.Combatant != null)
|
||||
this.FixedParticles(0, 10, 0, 0x2530, EffectLayer.Waist);
|
||||
|
||||
return move;
|
||||
}
|
||||
|
||||
public void SendEBolt(Mobile to)
|
||||
{
|
||||
this.MovingParticles(to, 0x379F, 7, 0, false, true, 0xBE3, 0xFCB, 0x211);
|
||||
to.PlaySound(0x229);
|
||||
this.DoHarmful(to);
|
||||
AOS.Damage(to, this, 50, 0, 0, 0, 0, 100);
|
||||
}
|
||||
|
||||
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();
|
||||
|
||||
this.m_FieldActive = this.CanUseField;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
using System;
|
||||
using Server.Items;
|
||||
using System.Linq;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("a human corpse")]
|
||||
public class ExodusZealot : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public ExodusZealot()
|
||||
: base(AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4)
|
||||
{
|
||||
this.Body = 401;
|
||||
this.Female = false;
|
||||
this.Hue = 33875;
|
||||
this.HairItemID = Race.Human.RandomHair(this);
|
||||
this.HairHue = Race.Human.RandomHairHue();
|
||||
|
||||
this.Name = NameList.RandomName("male");
|
||||
this.Title = "The Exodus Zealot";
|
||||
|
||||
this.SetStr(150, 210);
|
||||
this.SetDex(75, 90);
|
||||
this.SetInt(255, 310);
|
||||
|
||||
this.SetHits(325, 390);
|
||||
|
||||
this.SetDamage(6, 12);
|
||||
|
||||
this.SetDamageType(ResistanceType.Physical, 100);
|
||||
|
||||
this.SetResistance(ResistanceType.Physical, 30, 40);
|
||||
this.SetResistance(ResistanceType.Fire, 20, 30);
|
||||
this.SetResistance(ResistanceType.Cold, 35, 40);
|
||||
this.SetResistance(ResistanceType.Poison, 30, 40);
|
||||
this.SetResistance(ResistanceType.Energy, 30, 40);
|
||||
|
||||
this.SetSkill(SkillName.Wrestling, 70.0, 100.0);
|
||||
this.SetSkill(SkillName.Tactics, 80.0, 100.0);
|
||||
this.SetSkill(SkillName.MagicResist, 50.0, 70.0);
|
||||
this.SetSkill(SkillName.Anatomy, 70.0, 100.0);
|
||||
this.SetSkill(SkillName.Magery, 85.0, 100.0);
|
||||
this.SetSkill(SkillName.EvalInt, 80.0, 100.0);
|
||||
this.SetSkill(SkillName.Poisoning, 70.0, 100.0);
|
||||
|
||||
this.Fame = 10000;
|
||||
this.Karma = -10000;
|
||||
this.VirtualArmor = 30;
|
||||
|
||||
Item boots = new ThighBoots();
|
||||
boots.Movable = false;
|
||||
this.SetWearable(boots);
|
||||
|
||||
Item item = new HoodedShroudOfShadows(2702);
|
||||
item.LootType = LootType.Blessed;
|
||||
this.SetWearable(item);
|
||||
|
||||
item = new Spellbook();
|
||||
item.LootType = LootType.Blessed;
|
||||
this.SetWearable(item);
|
||||
}
|
||||
|
||||
public ExodusZealot(Serial serial)
|
||||
: base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
public override bool AlwaysMurderer { get { return true; } }
|
||||
public override bool ShowFameTitle { get { return false; } }
|
||||
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
this.AddLoot(LootPack.FilthyRich);
|
||||
this.AddLoot(LootPack.MedScrolls);
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user