Overwrite
Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
This commit is contained in:
@@ -0,0 +1,114 @@
|
||||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("an allosaurus corpse")]
|
||||
public class Allosaurus : BaseCreature
|
||||
{
|
||||
public override bool AttacksFocus { get { return true; } }
|
||||
|
||||
[Constructable]
|
||||
public Allosaurus() : base(AIType.AI_Melee, FightMode.Closest, 10, 1, .2, .4)
|
||||
{
|
||||
Name = "an allosaurus";
|
||||
Body = 1290;
|
||||
|
||||
SetStr(699, 828);
|
||||
SetDex(200);
|
||||
SetInt(127, 150);
|
||||
|
||||
SetDamage(21, 23);
|
||||
|
||||
SetHits(18000);
|
||||
SetMana(48, 70);
|
||||
|
||||
SetResistance(ResistanceType.Physical, 65, 75);
|
||||
SetResistance(ResistanceType.Fire, 55, 65);
|
||||
SetResistance(ResistanceType.Cold, 60, 70);
|
||||
SetResistance(ResistanceType.Poison, 90, 100);
|
||||
SetResistance(ResistanceType.Energy, 60, 70);
|
||||
|
||||
SetDamageType(ResistanceType.Physical, 50);
|
||||
SetDamageType(ResistanceType.Fire, 50);
|
||||
|
||||
SetSkill(SkillName.MagicResist, 100.0, 110.0);
|
||||
SetSkill(SkillName.Tactics, 120.0, 140.0);
|
||||
SetSkill(SkillName.Wrestling, 120.0, 150.0);
|
||||
SetSkill(SkillName.Poisoning, 50.0, 60.0);
|
||||
SetSkill(SkillName.Wrestling, 55.0, 65.0);
|
||||
SetSkill(SkillName.Parry, 80.0, 90.0);
|
||||
SetSkill(SkillName.Magery, 70.0, 80.0);
|
||||
SetSkill(SkillName.EvalInt, 75.0, 85.0);
|
||||
|
||||
Fame = 21000;
|
||||
Karma = -21000;
|
||||
|
||||
SetWeaponAbility(WeaponAbility.ArmorPierce);
|
||||
SetWeaponAbility(WeaponAbility.CrushingBlow);
|
||||
SetWeaponAbility(WeaponAbility.Disarm);
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
if (IsChampionSpawn)
|
||||
AddLoot(LootPack.FilthyRich, 3);
|
||||
else
|
||||
AddLoot(LootPack.UltraRich, 3);
|
||||
}
|
||||
|
||||
public override int GetIdleSound()
|
||||
{
|
||||
return 0x2C4;
|
||||
}
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 0x2C0;
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 0x2C1;
|
||||
}
|
||||
|
||||
public override int GetAngerSound()
|
||||
{
|
||||
return 0x2C4;
|
||||
}
|
||||
|
||||
public override int GetHurtSound()
|
||||
{
|
||||
return 0x2C3;
|
||||
}
|
||||
|
||||
public override int TreasureMapLevel { get { return 7; } }
|
||||
|
||||
public override void SetToChampionSpawn()
|
||||
{
|
||||
SetStr(347, 387);
|
||||
SetHits(940, 1000);
|
||||
}
|
||||
|
||||
public override int Meat { get { return 3; } }
|
||||
public override int Hides { get { return 11; } }
|
||||
public override HideType HideType { get { return HideType.Horned; } }
|
||||
|
||||
public Allosaurus(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();
|
||||
}
|
||||
}
|
||||
}
|
||||
103
Scripts/Services/Expansions/Time Of Legends/Mobiles/Anchisaur.cs
Normal file
103
Scripts/Services/Expansions/Time Of Legends/Mobiles/Anchisaur.cs
Normal file
@@ -0,0 +1,103 @@
|
||||
using System;
|
||||
using Server.Items;
|
||||
using Server.Spells.SkillMasteries;
|
||||
using Server.Spells;
|
||||
using Server.Network;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("an anchisaur corpse")]
|
||||
public class Anchisaur : BaseCreature
|
||||
{
|
||||
public override bool AttacksFocus { get { return true; } }
|
||||
private DateTime _NextMastery;
|
||||
|
||||
[Constructable]
|
||||
public Anchisaur()
|
||||
: base(AIType.AI_Melee, FightMode.Closest, 10, 1, .2, .4)
|
||||
{
|
||||
Name = "an anchisaur";
|
||||
Body = 1292;
|
||||
BaseSoundID = 422;
|
||||
|
||||
SetStr(441, 511);
|
||||
SetDex(166, 185);
|
||||
SetInt(362, 431);
|
||||
|
||||
SetDamage(16, 19);
|
||||
|
||||
SetHits(2663, 3718);
|
||||
|
||||
SetResistance(ResistanceType.Physical, 3, 4);
|
||||
SetResistance(ResistanceType.Fire, 3, 4);
|
||||
SetResistance(ResistanceType.Cold, 1);
|
||||
SetResistance(ResistanceType.Poison, 2, 3);
|
||||
SetResistance(ResistanceType.Energy, 2, 3);
|
||||
|
||||
SetDamageType(ResistanceType.Physical, 100);
|
||||
|
||||
SetSkill(SkillName.MagicResist, 105.0, 115.0);
|
||||
SetSkill(SkillName.Tactics, 95.0, 105.0);
|
||||
SetSkill(SkillName.Wrestling, 100.0, 110.0);
|
||||
SetSkill(SkillName.Anatomy, 95.0, 105.0);
|
||||
SetSkill(SkillName.DetectHidden, 75.0, 85.0);
|
||||
SetSkill(SkillName.Parry, 75.0, 85.0);
|
||||
|
||||
Fame = 8000;
|
||||
Karma = -8000;
|
||||
|
||||
SetWeaponAbility(WeaponAbility.Disarm);
|
||||
SetWeaponAbility(WeaponAbility.ParalyzingBlow);
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot(LootPack.FilthyRich, 1);
|
||||
}
|
||||
|
||||
public override void OnThink()
|
||||
{
|
||||
base.OnThink();
|
||||
|
||||
if (Combatant == null)
|
||||
return;
|
||||
|
||||
if (_NextMastery < DateTime.UtcNow)
|
||||
{
|
||||
if (SkillMasterySpell.HasSpell(this, typeof(RampageSpell)) || Utility.RandomDouble() > 0.5)
|
||||
{
|
||||
SpecialMove.SetCurrentMove(this, SpellRegistry.GetSpecialMove(740));
|
||||
}
|
||||
else
|
||||
{
|
||||
SkillMasterySpell spell = new RampageSpell(this, null);
|
||||
spell.Cast();
|
||||
}
|
||||
|
||||
_NextMastery = DateTime.UtcNow + TimeSpan.FromSeconds(Utility.RandomMinMax(45, 70));
|
||||
}
|
||||
}
|
||||
|
||||
public override int DragonBlood { get { return 6; } }
|
||||
public override int Meat { get { return 6; } }
|
||||
public override int Hides { get { return 11; } }
|
||||
public override int TreasureMapLevel { get { return 1; } }
|
||||
|
||||
public Anchisaur(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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("an archaeosaurus corpse")]
|
||||
public class Archaeosaurus : BaseCreature
|
||||
{
|
||||
public override bool AttacksFocus { get { return true; } }
|
||||
|
||||
[Constructable]
|
||||
public Archaeosaurus()
|
||||
: base(AIType.AI_Melee, FightMode.Closest, 10, 1, .2, .4)
|
||||
{
|
||||
Name = "an Archaeosaurus";
|
||||
Body = 1287;
|
||||
BaseSoundID = 422;
|
||||
|
||||
SetStr(405, 421);
|
||||
SetDex(301, 320);
|
||||
SetInt(201, 224);
|
||||
|
||||
SetDamage(14, 16);
|
||||
|
||||
SetHits(1818, 2500);
|
||||
|
||||
SetResistance(ResistanceType.Physical, 2, 3);
|
||||
SetResistance(ResistanceType.Fire, 4, 5);
|
||||
SetResistance(ResistanceType.Cold, 2, 3);
|
||||
SetResistance(ResistanceType.Poison, 3, 4);
|
||||
SetResistance(ResistanceType.Energy, 3);
|
||||
|
||||
SetDamageType(ResistanceType.Poison, 50);
|
||||
SetDamageType(ResistanceType.Fire, 50);
|
||||
|
||||
SetSkill(SkillName.MagicResist, 100.0, 115.0);
|
||||
SetSkill(SkillName.Tactics, 90.0, 110.0);
|
||||
SetSkill(SkillName.Wrestling, 90.0, 110.0);
|
||||
SetSkill(SkillName.DetectHidden, 60.0, 70.0);
|
||||
SetSkill(SkillName.EvalInt, 95.0, 105.0);
|
||||
SetSkill(SkillName.Ninjitsu, 120.0);
|
||||
|
||||
Fame = 8100;
|
||||
Karma = -8100;
|
||||
|
||||
SetWeaponAbility(WeaponAbility.BleedAttack);
|
||||
SetWeaponAbility(WeaponAbility.TalonStrike);
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot(LootPack.FilthyRich, 2);
|
||||
}
|
||||
|
||||
public override int Meat { get { return 1; } }
|
||||
public override int Hides { get { return 7; } }
|
||||
public override int DragonBlood { get { return 6; } }
|
||||
public override int TreasureMapLevel { get { return 1; } }
|
||||
|
||||
public Archaeosaurus(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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,123 @@
|
||||
using System;
|
||||
using Server.Items;
|
||||
using Server.Engines.MyrmidexInvasion;
|
||||
using Server.Misc;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("a human corpse")]
|
||||
public class BritannianInfantry : BaseCreature
|
||||
{
|
||||
public override double HealChance { get { return 1.0; } }
|
||||
|
||||
[Constructable]
|
||||
public BritannianInfantry()
|
||||
: base(AIType.AI_Melee, FightMode.Closest, 10, 1, .15, .3)
|
||||
{
|
||||
SpeechHue = Utility.RandomDyedHue();
|
||||
|
||||
Body = 0x190;
|
||||
Hue = 33779;
|
||||
Name = NameList.RandomName("male");
|
||||
Title = "the Britannian";
|
||||
|
||||
SetStr(115, 150);
|
||||
SetDex(150);
|
||||
SetInt(25, 44);
|
||||
|
||||
SetDamage(12, 17);
|
||||
|
||||
SetHits(2400);
|
||||
SetMana(250);
|
||||
|
||||
SetResistance(ResistanceType.Physical, 25);
|
||||
SetResistance(ResistanceType.Fire, 15);
|
||||
SetResistance(ResistanceType.Cold, 10);
|
||||
SetResistance(ResistanceType.Poison, 15);
|
||||
SetResistance(ResistanceType.Energy, 10);
|
||||
|
||||
SetDamageType(ResistanceType.Physical, 100);
|
||||
|
||||
SetSkill(SkillName.MagicResist, 120);
|
||||
SetSkill(SkillName.Tactics, 120);
|
||||
SetSkill(SkillName.Anatomy, 120);
|
||||
SetSkill(SkillName.Swords, 120);
|
||||
SetSkill(SkillName.Fencing, 120);
|
||||
SetSkill(SkillName.Macing, 120);
|
||||
|
||||
AddImmovableItem(new PlateChest());
|
||||
AddImmovableItem(new PlateLegs());
|
||||
AddImmovableItem(new PlateArms());
|
||||
AddImmovableItem(new PlateGloves());
|
||||
AddImmovableItem(new PlateGorget());
|
||||
AddImmovableItem(new Kilt(1175));
|
||||
AddImmovableItem(new BodySash(1157));
|
||||
AddImmovableItem(new Halberd());
|
||||
|
||||
PackGold(Utility.RandomMinMax(250, 300));
|
||||
|
||||
Fame = 7500;
|
||||
Karma = 4500;
|
||||
|
||||
Utility.AssignRandomHair(this);
|
||||
}
|
||||
|
||||
private void AddImmovableItem(Item item)
|
||||
{
|
||||
item.LootType = LootType.Blessed;
|
||||
SetWearable(item);
|
||||
}
|
||||
|
||||
public override bool IsEnemy(Mobile m)
|
||||
{
|
||||
if (MyrmidexInvasionSystem.Active && MyrmidexInvasionSystem.IsAlliedWithEodonTribes(m))
|
||||
return false;
|
||||
|
||||
if (MyrmidexInvasionSystem.Active && MyrmidexInvasionSystem.IsAlliedWithMyrmidex(m))
|
||||
return true;
|
||||
|
||||
return base.IsEnemy(m);
|
||||
}
|
||||
|
||||
public override bool AlwaysAttackable { get { return this.Region.IsPartOf<BattleRegion>(); } }
|
||||
public override bool ShowFameTitle { get { return false; } }
|
||||
public override bool ClickTitle { get { return false; } }
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot(LootPack.Rich, 1);
|
||||
}
|
||||
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
BaseWeapon wep = Weapon as BaseWeapon;
|
||||
|
||||
if (wep != null && !(wep is Fists))
|
||||
{
|
||||
if (Utility.RandomDouble() > 0.5)
|
||||
return wep.PrimaryAbility;
|
||||
|
||||
return wep.SecondaryAbility;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public BritannianInfantry(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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("a desert scorpion corpse")]
|
||||
public class DesertScorpion : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public DesertScorpion()
|
||||
: base(AIType.AI_Melee, FightMode.Closest, 10, 1, .2, .4)
|
||||
{
|
||||
Name = "a desert scorpion";
|
||||
Body = 0x2CD;
|
||||
BaseSoundID = 397;
|
||||
|
||||
SetStr(600, 700);
|
||||
SetDex(120, 128);
|
||||
SetInt(150, 200);
|
||||
|
||||
SetDamage(15, 25);
|
||||
|
||||
SetHits(350, 400);
|
||||
|
||||
SetResistance(ResistanceType.Physical, 30, 40);
|
||||
SetResistance(ResistanceType.Fire, 50, 60);
|
||||
SetResistance(ResistanceType.Cold, 10, 20);
|
||||
SetResistance(ResistanceType.Poison, 70, 80);
|
||||
SetResistance(ResistanceType.Energy, 40, 50);
|
||||
|
||||
SetDamageType(ResistanceType.Physical, 60);
|
||||
SetDamageType(ResistanceType.Physical, 40);
|
||||
|
||||
SetSkill(SkillName.MagicResist, 60, 70);
|
||||
SetSkill(SkillName.Tactics, 80, 90);
|
||||
SetSkill(SkillName.Wrestling, 50, 60);
|
||||
SetSkill(SkillName.Poisoning, 110, 120);
|
||||
|
||||
Fame = 8100;
|
||||
Karma = -8100;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot(LootPack.FilthyRich, 1);
|
||||
}
|
||||
|
||||
public override Poison HitPoison { get { return Poison.Lethal; } }
|
||||
public override Poison PoisonImmune { get { return Poison.Lethal; } }
|
||||
public override int Meat { get { return 3; } }
|
||||
public override int TreasureMapLevel { get { return 1; } }
|
||||
|
||||
public DesertScorpion(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();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,154 @@
|
||||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("a dimetrosaur corpse")]
|
||||
public class Dimetrosaur : BaseCreature
|
||||
{
|
||||
public override bool AttacksFocus { get { return !Controlled; } }
|
||||
|
||||
[Constructable]
|
||||
public Dimetrosaur()
|
||||
: base(AIType.AI_Melee, FightMode.Closest, 10, 1, .2, .4)
|
||||
{
|
||||
Name = "a dimetrosaur";
|
||||
Body = 1285;
|
||||
|
||||
SetStr(526, 601);
|
||||
|
||||
SetDex(166, 184);
|
||||
SetInt(373, 435);
|
||||
|
||||
SetDamage(18, 21);
|
||||
SetHits(5300, 5400);
|
||||
|
||||
SetResistance(ResistanceType.Physical, 80, 90);
|
||||
SetResistance(ResistanceType.Fire, 60, 70);
|
||||
SetResistance(ResistanceType.Cold, 60, 70);
|
||||
SetResistance(ResistanceType.Poison, 65, 75);
|
||||
SetResistance(ResistanceType.Energy, 65, 75);
|
||||
|
||||
SetDamageType(ResistanceType.Physical, 90);
|
||||
SetDamageType(ResistanceType.Poison, 10);
|
||||
|
||||
SetSkill(SkillName.MagicResist, 120.0, 140.0);
|
||||
SetSkill(SkillName.Tactics, 100.0, 120.0);
|
||||
SetSkill(SkillName.Wrestling, 115.0, 125.0);
|
||||
SetSkill(SkillName.Anatomy, 70.0, 80.0);
|
||||
SetSkill(SkillName.Poisoning, 85.0, 95.0);
|
||||
SetSkill(SkillName.DetectHidden, 70.0, 80.0);
|
||||
SetSkill(SkillName.Parry, 95.0, 105.0);
|
||||
|
||||
Fame = 17000;
|
||||
Karma = -17000;
|
||||
|
||||
Tamable = true;
|
||||
ControlSlots = 3;
|
||||
MinTameSkill = 102.0;
|
||||
|
||||
SetAreaEffect(AreaEffect.PoisonBreath);
|
||||
SetWeaponAbility(WeaponAbility.MortalStrike);
|
||||
SetWeaponAbility(WeaponAbility.Dismount);
|
||||
}
|
||||
|
||||
public override int GetIdleSound()
|
||||
{
|
||||
return 0x2C4;
|
||||
}
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 0x2C0;
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 0x2C1;
|
||||
}
|
||||
|
||||
public override int GetAngerSound()
|
||||
{
|
||||
return 0x2C4;
|
||||
}
|
||||
|
||||
public override int GetHurtSound()
|
||||
{
|
||||
return 0x2C3;
|
||||
}
|
||||
|
||||
public override int TreasureMapLevel { get { return 6; } }
|
||||
|
||||
public override void SetToChampionSpawn()
|
||||
{
|
||||
SetStr(271, 299);
|
||||
SetHits(360, 380);
|
||||
}
|
||||
|
||||
public override void OnAfterTame(Mobile tamer)
|
||||
{
|
||||
if (Owners.Count == 0)
|
||||
{
|
||||
int hits = HitsMax;
|
||||
|
||||
base.OnAfterTame(tamer);
|
||||
|
||||
SetHits(hits / 4);
|
||||
}
|
||||
else
|
||||
{
|
||||
base.OnAfterTame(tamer);
|
||||
}
|
||||
}
|
||||
|
||||
public override bool CanAngerOnTame { get { return true; } }
|
||||
public override bool StatLossAfterTame { get { return true; } }
|
||||
public override int Meat { get { return 1; } }
|
||||
public override int Hides { get { return 11; } }
|
||||
public override HideType HideType { get { return HideType.Spined; } }
|
||||
public override FoodType FavoriteFood { get { return FoodType.FruitsAndVegies; } }
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
if (IsChampionSpawn)
|
||||
AddLoot(LootPack.FilthyRich, 2);
|
||||
else
|
||||
AddLoot(LootPack.UltraRich, 2);
|
||||
}
|
||||
|
||||
public Dimetrosaur(Serial serial)
|
||||
: base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize(GenericWriter writer)
|
||||
{
|
||||
base.Serialize(writer);
|
||||
writer.Write(2);
|
||||
}
|
||||
|
||||
public override void Deserialize(GenericReader reader)
|
||||
{
|
||||
base.Deserialize(reader);
|
||||
int version = reader.ReadInt();
|
||||
|
||||
if (version == 0)
|
||||
{
|
||||
if (Controlled)
|
||||
{
|
||||
SetHits(HitsMax / 4);
|
||||
}
|
||||
|
||||
SetAreaEffect(AreaEffect.PoisonBreath);
|
||||
SetWeaponAbility(WeaponAbility.MortalStrike);
|
||||
SetWeaponAbility(WeaponAbility.Dismount);
|
||||
}
|
||||
|
||||
if (version < 2)
|
||||
{
|
||||
SetMagicalAbility(MagicalAbility.Poisoning);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,342 @@
|
||||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
using Server.Engines.CannedEvil;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("a dragon turtle corpse")]
|
||||
public class DragonTurtle : BaseChampion
|
||||
{
|
||||
public override Type[] UniqueList{ get { return new Type[] { }; }}
|
||||
public override Type[] SharedList{ get { return new Type[] { }; }}
|
||||
public override Type[] DecorativeList{ get { return new Type[] { }; }}
|
||||
public override MonsterStatuetteType[] StatueTypes{ get { return new MonsterStatuetteType[] { }; }}
|
||||
|
||||
public override ChampionSkullType SkullType { get { return ChampionSkullType.None; } }
|
||||
|
||||
[Constructable]
|
||||
public DragonTurtle() : base(AIType.AI_Mage)
|
||||
{
|
||||
Name = "a dragon turtle";
|
||||
Body = 1288;
|
||||
BaseSoundID = 362;
|
||||
|
||||
SetStr(750, 800);
|
||||
SetDex(185, 240);
|
||||
SetInt(487, 562);
|
||||
|
||||
SetDamage( 25, 37 );
|
||||
|
||||
SetHits(60000);
|
||||
|
||||
SetResistance( ResistanceType.Physical, 75, 85 );
|
||||
SetResistance( ResistanceType.Fire, 65, 75 );
|
||||
SetResistance( ResistanceType.Cold, 70, 75 );
|
||||
SetResistance( ResistanceType.Poison, 100 );
|
||||
SetResistance( ResistanceType.Energy, 65, 75 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 50 );
|
||||
SetDamageType( ResistanceType.Poison, 50 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 90, 120 );
|
||||
SetSkill( SkillName.Tactics, 200, 110 );
|
||||
SetSkill( SkillName.Wrestling, 225, 227 );
|
||||
|
||||
Fame = 11000;
|
||||
Karma = -11000;
|
||||
|
||||
SetWeaponAbility(WeaponAbility.Dismount);
|
||||
SetSpecialAbility(SpecialAbility.DragonBreath);
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot(LootPack.SuperBoss, 3);
|
||||
}
|
||||
|
||||
public override int Meat{ get{ return 1; } }
|
||||
public override int Hides{ get{ return 33; } }
|
||||
public override FoodType FavoriteFood { get { return FoodType.FruitsAndVegies; } }
|
||||
public override bool TeleportsTo { get { return true; } }
|
||||
public override TimeSpan TeleportDuration { get { return TimeSpan.FromSeconds(30); } }
|
||||
public override int TeleportRange { get { return 10; } }
|
||||
public override bool ReacquireOnMovement { get { return true; } }
|
||||
public override int TreasureMapLevel { get { return 5; } }
|
||||
|
||||
public override void OnCarve(Mobile from, Corpse corpse, Item with)
|
||||
{
|
||||
if (corpse != null && !corpse.Carved)
|
||||
{
|
||||
from.SendLocalizedMessage(1156198); // You cut away some scoots, but they remain on the corpse.
|
||||
corpse.DropItem(new DragonTurtleScute(18));
|
||||
}
|
||||
|
||||
base.OnCarve(from, corpse, with);
|
||||
}
|
||||
|
||||
public override Item GetArtifact()
|
||||
{
|
||||
return new DragonTurtleEgg();
|
||||
}
|
||||
|
||||
public override void OnMovement( Mobile m, Point3D oldLocation )
|
||||
{
|
||||
base.OnMovement(m, oldLocation);
|
||||
|
||||
if(!_DoingBubbles || _BubbleLocs == null)
|
||||
return;
|
||||
|
||||
List<Tuple<Point3D, int>> copy = new List<Tuple<Point3D, int>>(_BubbleLocs.Where(tup => tup.Item1 == m.Location));
|
||||
|
||||
foreach (Tuple<Point3D, int> t in copy)
|
||||
{
|
||||
Point3D p = m.Location;
|
||||
int hue = 0;
|
||||
|
||||
for (int i = 0; i < _BubbleLocs.Count; i++)
|
||||
{
|
||||
if (_BubbleLocs[i].Item1 == p)
|
||||
{
|
||||
hue = _BubbleLocs[i].Item2;
|
||||
_BubbleLocs[i] = new Tuple<Point3D, int>(Point3D.Zero, hue);
|
||||
}
|
||||
|
||||
Effects.SendTargetEffect(m, 13920, 10, 60, hue == 0 ? 0 : hue - 1, 5);
|
||||
ApplyMod(m, hue);
|
||||
}
|
||||
}
|
||||
|
||||
ColUtility.Free(copy);
|
||||
}
|
||||
|
||||
private long _NextBubbleWander;
|
||||
private long _NextBubbleAttack;
|
||||
private bool _DoingBubbles;
|
||||
public List<Tuple<Point3D, int>> _BubbleLocs { get; set; }
|
||||
public Dictionary<Mobile, int> _Affected { get; set; }
|
||||
|
||||
private Direction[] _Directions = { Direction.North, Direction.Right, Direction.East, Direction.Down, Direction.South, Direction.Left, Direction.West, Direction.Up };
|
||||
private int[] _Hues = { 0, 33, 44, 9, 63, 53, 117 };
|
||||
|
||||
public override void OnThink()
|
||||
{
|
||||
base.OnThink();
|
||||
|
||||
if(Combatant != null && Core.TickCount - _NextBubbleWander >= 0)
|
||||
{
|
||||
DoBubble();
|
||||
_NextBubbleWander = Core.TickCount + Utility.RandomMinMax(25000, 35000);
|
||||
}
|
||||
|
||||
if(Combatant != null && Core.TickCount - _NextBubbleAttack >= 0)
|
||||
{
|
||||
DoBubbleAttack();
|
||||
_NextBubbleAttack = Core.TickCount + Utility.RandomMinMax(40000, 60000);
|
||||
}
|
||||
}
|
||||
|
||||
public void DoBubble()
|
||||
{
|
||||
if(!this.Alive || this.Map == Map.Internal || this.Map == null)
|
||||
return;
|
||||
|
||||
int pathLength = Utility.RandomMinMax(5, 11);
|
||||
_DoingBubbles = true;
|
||||
_BubbleLocs = new List<Tuple<Point3D, int>>();
|
||||
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
_BubbleLocs.Add(new Tuple<Point3D, int>(this.Location, _Hues[Utility.Random(_Hues.Length)]));
|
||||
}
|
||||
|
||||
for(int i = 0; i < pathLength; i++)
|
||||
{
|
||||
Timer.DelayCall(TimeSpan.FromSeconds((double)i + 1.0), () =>
|
||||
{
|
||||
for(int j = 0; j < _BubbleLocs.Count; j++)
|
||||
{
|
||||
Map map = this.Map;
|
||||
|
||||
if(!this.Alive || map == null || (i > 0 && _BubbleLocs[j].Item1 == Point3D.Zero))
|
||||
continue;
|
||||
|
||||
Point3D newLoc;
|
||||
Direction d = _Directions[j];
|
||||
|
||||
int hue = _BubbleLocs[j].Item2;
|
||||
int x = _BubbleLocs[j].Item1.X;
|
||||
int y = _BubbleLocs[j].Item1.Y;
|
||||
|
||||
if (i > 2 && 0.4 > Utility.RandomDouble())
|
||||
{
|
||||
if (d == Direction.Up)
|
||||
d = Direction.North;
|
||||
else
|
||||
d += 1;
|
||||
|
||||
Movement.Movement.Offset(d, ref x, ref y);
|
||||
}
|
||||
else
|
||||
Movement.Movement.Offset(d, ref x, ref y);
|
||||
|
||||
IPoint3D p = new Point3D(x, y, this.Map.GetAverageZ(x, y)) as IPoint3D;
|
||||
Server.Spells.SpellHelper.GetSurfaceTop(ref p);
|
||||
|
||||
newLoc = new Point3D(p);
|
||||
|
||||
bool hasMobile = false;
|
||||
IPooledEnumerable eable = this.Map.GetMobilesInRange(newLoc, 0);
|
||||
|
||||
foreach (Mobile m in eable)
|
||||
{
|
||||
if (m != this && CanBeHarmful(m) && (m is PlayerMobile || (m is BaseCreature && ((BaseCreature)m).GetMaster() is PlayerMobile)))
|
||||
{
|
||||
hasMobile = true;
|
||||
|
||||
Effects.SendTargetEffect(m, 13920, 10, 60, hue == 0 ? 0 : hue - 1, 5);
|
||||
_BubbleLocs[j] = new Tuple<Point3D, int>(Point3D.Zero, hue);
|
||||
|
||||
ApplyMod(m, hue);
|
||||
}
|
||||
}
|
||||
|
||||
if (!hasMobile)
|
||||
{
|
||||
Effects.SendLocationEffect(newLoc, this.Map, 13920, 20, 10, hue == 0 ? 0 : hue - 1, 5);
|
||||
_BubbleLocs[j] = new Tuple<Point3D, int>(newLoc, hue);
|
||||
}
|
||||
}
|
||||
|
||||
if(i == pathLength - 1)
|
||||
{
|
||||
Timer.DelayCall(TimeSpan.FromSeconds(1), () =>
|
||||
{
|
||||
_DoingBubbles = false;
|
||||
_BubbleLocs.Clear();
|
||||
_BubbleLocs = null;
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
public void DoBubbleAttack()
|
||||
{
|
||||
if(!this.Alive || this.Map == Map.Internal || this.Map == null)
|
||||
return;
|
||||
|
||||
List<Mobile> toget = new List<Mobile>();
|
||||
|
||||
IPooledEnumerable eable = this.Map.GetMobilesInRange(this.Location, 11);
|
||||
|
||||
foreach(Mobile m in eable)
|
||||
{
|
||||
if(m != this && CanBeHarmful(m) && InLOS(m) && (m is PlayerMobile || (m is BaseCreature && ((BaseCreature)m).GetMaster() is PlayerMobile)))
|
||||
toget.Add(m);
|
||||
}
|
||||
|
||||
eable.Free();
|
||||
|
||||
toget.ForEach(mob =>
|
||||
{
|
||||
int hue;
|
||||
|
||||
if (_Affected != null && _Affected.ContainsKey(mob))
|
||||
hue = _Affected[mob];
|
||||
else
|
||||
hue = _Hues[Utility.Random(_Hues.Length)];
|
||||
|
||||
this.MovingParticles(mob, 13920, 10, 0, false, true, hue == 0 ? 0 : hue - 1, 5, 9502, 14120, 0, 0);
|
||||
|
||||
Timer.DelayCall(TimeSpan.FromSeconds(.7), DoAttack_Callback, new object[] { mob, hue } );
|
||||
});
|
||||
}
|
||||
|
||||
private void ApplyMod(Mobile m, int hue)
|
||||
{
|
||||
ResistanceType type = GetResistanceFromHue(hue);
|
||||
|
||||
if (_Affected == null)
|
||||
_Affected = new Dictionary<Mobile, int>();
|
||||
|
||||
_Affected[m] = hue;
|
||||
|
||||
ResistanceMod mod = new ResistanceMod(type, -25);
|
||||
m.AddResistanceMod(mod);
|
||||
|
||||
BuffInfo.AddBuff(m, new BuffInfo(BuffIcon.DragonTurtleDebuff, 1156192, 1156192));
|
||||
|
||||
Server.Timer.DelayCall(TimeSpan.FromSeconds(30), RemoveMod_Callback, new object[] { m, mod } );
|
||||
}
|
||||
|
||||
private void RemoveMod_Callback(object obj)
|
||||
{
|
||||
object[] o = obj as object[];
|
||||
Mobile m = o[0] as Mobile;
|
||||
ResistanceMod mod = (ResistanceMod)o[1];
|
||||
|
||||
m.RemoveResistanceMod(mod);
|
||||
BuffInfo.RemoveBuff(m, BuffIcon.DragonTurtleDebuff);
|
||||
|
||||
if (_Affected != null && _Affected.ContainsKey(m))
|
||||
_Affected.Remove(m);
|
||||
}
|
||||
|
||||
private void DoAttack_Callback(object obj)
|
||||
{
|
||||
if (!this.Alive)
|
||||
return;
|
||||
|
||||
object[] o = obj as object[];
|
||||
Mobile mob = o[0] as Mobile;
|
||||
int hue = (int)o[1];
|
||||
|
||||
ResistanceType type = GetResistanceFromHue(hue);
|
||||
int damage = Utility.RandomMinMax(60, 80);
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case ResistanceType.Physical: AOS.Damage(mob, this, damage, 100, 0, 0, 0, 0); break;
|
||||
case ResistanceType.Fire: AOS.Damage(mob, this, damage, 0, 100, 0, 0, 0); break;
|
||||
case ResistanceType.Cold: AOS.Damage(mob, this, damage, 0, 0, 100, 0, 0); break;
|
||||
case ResistanceType.Poison: AOS.Damage(mob, this, damage, 0, 0, 0, 100, 0); break;
|
||||
case ResistanceType.Energy: AOS.Damage(mob, this, damage, 0, 0, 0, 0, 100); break;
|
||||
}
|
||||
}
|
||||
|
||||
private ResistanceType GetResistanceFromHue(int hue)
|
||||
{
|
||||
switch (hue)
|
||||
{
|
||||
case 0: return ResistanceType.Physical;
|
||||
case 33:
|
||||
case 44: return ResistanceType.Fire;
|
||||
case 9: return ResistanceType.Cold;
|
||||
case 63: return ResistanceType.Poison;
|
||||
case 53:
|
||||
case 126: return ResistanceType.Energy;
|
||||
}
|
||||
|
||||
return ResistanceType.Physical;
|
||||
}
|
||||
|
||||
public DragonTurtle(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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,111 @@
|
||||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("a dragon turtle hatchling corpse")]
|
||||
public class DragonTurtleHatchling : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public DragonTurtleHatchling()
|
||||
: base(AIType.AI_Mage, FightMode.Aggressor, 10, 1, 0.2, 0.4)
|
||||
{
|
||||
Body = 1294;
|
||||
BaseSoundID = 362;
|
||||
Name = "a dragon turtle hatchling";
|
||||
|
||||
SetStr(550, 650);
|
||||
SetDex(55, 65);
|
||||
SetInt(550, 650);
|
||||
|
||||
SetHits(550, 850);
|
||||
|
||||
SetDamage(24, 33);
|
||||
|
||||
SetDamageType(ResistanceType.Physical, 100);
|
||||
|
||||
SetResistance(ResistanceType.Physical, 65, 85);
|
||||
SetResistance(ResistanceType.Fire, 80, 90);
|
||||
SetResistance(ResistanceType.Cold, 50, 55);
|
||||
SetResistance(ResistanceType.Poison, 60);
|
||||
SetResistance(ResistanceType.Energy, 70, 75);
|
||||
|
||||
SetSkill(SkillName.MagicResist, 130, 140);
|
||||
SetSkill(SkillName.Tactics, 110, 120);
|
||||
SetSkill(SkillName.Wrestling, 140, 150);
|
||||
SetSkill(SkillName.Magery, 130, 140);
|
||||
SetSkill(SkillName.EvalInt, 100, 119);
|
||||
|
||||
Fame = 16000;
|
||||
Karma = -16000;
|
||||
|
||||
Tamable = true;
|
||||
ControlSlots = 5;
|
||||
MinTameSkill = 104.7;
|
||||
|
||||
SetWeaponAbility(WeaponAbility.BleedAttack);
|
||||
SetSpecialAbility(SpecialAbility.DragonBreath);
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
this.AddLoot(LootPack.Average, 3);
|
||||
}
|
||||
|
||||
public override void OnAfterTame(Mobile tamer)
|
||||
{
|
||||
if (Owners.Count == 0)
|
||||
{
|
||||
SkillsCap = this.Skills.Total;
|
||||
|
||||
foreach (Skill sk in this.Skills)
|
||||
{
|
||||
if (sk.Base > 0)
|
||||
{
|
||||
sk.Cap = Math.Max(100, sk.Base - (sk.Base * 10));
|
||||
sk.Base = sk.Base - (sk.Base * .55);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override int Meat { get { return 4; } }
|
||||
public override FoodType FavoriteFood { get { return FoodType.Fish; } }
|
||||
|
||||
public override void OnCarve(Mobile from, Corpse corpse, Item with)
|
||||
{
|
||||
if (!Controlled && corpse != null && !corpse.Carved)
|
||||
{
|
||||
from.SendLocalizedMessage(1156198); // You cut away some pelts, but they remain on the corpse.
|
||||
corpse.DropItem(new DragonTurtleScute(4));
|
||||
}
|
||||
|
||||
base.OnCarve(from, corpse, with);
|
||||
}
|
||||
|
||||
public DragonTurtleHatchling(Serial serial)
|
||||
: base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize(GenericWriter writer)
|
||||
{
|
||||
base.Serialize(writer);
|
||||
|
||||
writer.Write((int)1); // version
|
||||
}
|
||||
|
||||
public override void Deserialize(GenericReader reader)
|
||||
{
|
||||
base.Deserialize(reader);
|
||||
|
||||
int version = reader.ReadInt();
|
||||
|
||||
if(version == 0)
|
||||
{
|
||||
SetWeaponAbility(WeaponAbility.BleedAttack);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,752 @@
|
||||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
using System.Collections.Generic;
|
||||
using Server.Spells.SkillMasteries;
|
||||
using Server.Spells;
|
||||
using System.Linq;
|
||||
using Server.Engines.MyrmidexInvasion;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
public enum EodonTribe
|
||||
{
|
||||
Jukari,
|
||||
Kurak,
|
||||
Barrab,
|
||||
Barako,
|
||||
Urali,
|
||||
Sakkhra
|
||||
}
|
||||
|
||||
public abstract class BaseEodonTribesman : BaseCreature
|
||||
{
|
||||
protected long _NextMastery;
|
||||
private bool _HasYelled;
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public bool HasYelled
|
||||
{
|
||||
get { return _HasYelled; }
|
||||
set
|
||||
{
|
||||
if (value != _HasYelled)
|
||||
{
|
||||
_HasYelled = value;
|
||||
|
||||
if (_HasYelled)
|
||||
Timer.DelayCall(TimeSpan.FromSeconds(Utility.RandomMinMax(180, 360)), () => _HasYelled = false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public EodonTribe TribeType { get; private set; }
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public override Poison PoisonImmune
|
||||
{
|
||||
get
|
||||
{
|
||||
if (TribeType == EodonTribe.Barrab)
|
||||
return Poison.Deadly;
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public override bool InitialInnocent { get { return true; } }
|
||||
public override int TreasureMapLevel { get { return 2; } }
|
||||
|
||||
public override MasteryInfo[] Masteries
|
||||
{
|
||||
get
|
||||
{
|
||||
BaseWeapon wep = Weapon as BaseWeapon;
|
||||
|
||||
if (wep == null)
|
||||
return null;
|
||||
|
||||
var infos = MasteryInfo.Infos.Where(i => i.MasterySkill == wep.DefSkill && !i.Passive).ToArray();
|
||||
|
||||
if (infos != null && infos.Length > 0)
|
||||
{
|
||||
return infos;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
set { }
|
||||
}
|
||||
|
||||
private void AddImmovableItem(Item item)
|
||||
{
|
||||
item.LootType = LootType.Blessed;
|
||||
SetWearable(item);
|
||||
}
|
||||
|
||||
public BaseEodonTribesman(AIType ai, EodonTribe type) : base(ai, FightMode.Closest, 10, 1, .2, .4)
|
||||
{
|
||||
TribeType = type;
|
||||
|
||||
BuildBody();
|
||||
BuildEquipment();
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case EodonTribe.Jukari:
|
||||
SetResistance(ResistanceType.Physical, 20, 30);
|
||||
SetResistance(ResistanceType.Fire, 100);
|
||||
SetResistance(ResistanceType.Cold, 10, 20);
|
||||
SetResistance(ResistanceType.Poison, 40, 50);
|
||||
SetResistance(ResistanceType.Energy, 40, 50);
|
||||
break;
|
||||
case EodonTribe.Kurak:
|
||||
SetResistance(ResistanceType.Physical, 20, 30);
|
||||
SetResistance(ResistanceType.Fire, 10, 20);
|
||||
SetResistance(ResistanceType.Cold, 100);
|
||||
SetResistance(ResistanceType.Poison, 40, 50);
|
||||
SetResistance(ResistanceType.Energy, 40, 50);
|
||||
break;
|
||||
case EodonTribe.Barrab:
|
||||
SetResistance(ResistanceType.Physical, 20, 30);
|
||||
SetResistance(ResistanceType.Fire, 40, 50);
|
||||
SetResistance(ResistanceType.Cold, 40, 50);
|
||||
SetResistance(ResistanceType.Poison, 100);
|
||||
SetResistance(ResistanceType.Energy, 10, 20);
|
||||
break;
|
||||
case EodonTribe.Barako:
|
||||
SetResistance(ResistanceType.Physical, 20, 30);
|
||||
SetResistance(ResistanceType.Fire, 40, 50);
|
||||
SetResistance(ResistanceType.Cold, 40, 50);
|
||||
SetResistance(ResistanceType.Poison, 10, 20);
|
||||
SetResistance(ResistanceType.Energy, 40, 50);
|
||||
break;
|
||||
case EodonTribe.Urali:
|
||||
SetResistance(ResistanceType.Physical, 20, 30);
|
||||
SetResistance(ResistanceType.Fire, 40, 50);
|
||||
SetResistance(ResistanceType.Cold, 40, 50);
|
||||
SetResistance(ResistanceType.Poison, 10, 20);
|
||||
SetResistance(ResistanceType.Energy, 100);
|
||||
break;
|
||||
case EodonTribe.Sakkhra:
|
||||
SetResistance(ResistanceType.Physical, 100);
|
||||
SetResistance(ResistanceType.Fire, 40, 50);
|
||||
SetResistance(ResistanceType.Cold, 40, 50);
|
||||
SetResistance(ResistanceType.Poison, 60, 70);
|
||||
SetResistance(ResistanceType.Energy, 40, 50);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public abstract void BuildBody();
|
||||
public abstract void BuildEquipment();
|
||||
|
||||
private static string[] _Names;
|
||||
|
||||
public static void Initialize()
|
||||
{
|
||||
NameList list1 = NameList.GetNameList("savage");
|
||||
NameList list2 = NameList.GetNameList("savage rider");
|
||||
NameList list3 = NameList.GetNameList("savage shaman");
|
||||
|
||||
List<string> names = new List<string>(list1.List);
|
||||
names.AddRange(list2.List);
|
||||
names.AddRange(list3.List);
|
||||
|
||||
_Names = names.ToArray();
|
||||
}
|
||||
|
||||
public static string GetRandomName()
|
||||
{
|
||||
return _Names[Utility.Random(_Names.Length)];
|
||||
}
|
||||
|
||||
public override void AggressiveAction(Mobile aggressor, bool criminal)
|
||||
{
|
||||
base.AggressiveAction(aggressor, criminal);
|
||||
|
||||
if (this.Map == null)
|
||||
return;
|
||||
|
||||
IPooledEnumerable eable = this.Map.GetMobilesInRange(this.Location, this.RangePerception);
|
||||
|
||||
foreach (Mobile m in eable)
|
||||
{
|
||||
if (m != this && m != aggressor && m is BaseEodonTribesman && ((BaseEodonTribesman)m).TribeType == this.TribeType && m.Combatant == null)
|
||||
{
|
||||
BaseEodonTribesman tribesman = m as BaseEodonTribesman;
|
||||
m.Warmode = true;
|
||||
m.Combatant = aggressor;
|
||||
|
||||
if (!tribesman.HasYelled)
|
||||
{
|
||||
m.PublicOverheadMessage(Server.Network.MessageType.Regular, 0x47E, 1156584); // Ahhhh-OOOO! Ahhh-OOOO!
|
||||
tribesman.HasYelled = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override bool IsEnemy(Mobile m)
|
||||
{
|
||||
// Basically, this makes them FightMode.Agressor. More can can be added in to make htem attack others, such as other tribes, etc.
|
||||
bool valid = this.Aggressors.FirstOrDefault(a => a.Attacker == m) != null;
|
||||
|
||||
if (!valid && MyrmidexInvasionSystem.Active)
|
||||
valid = MyrmidexInvasionSystem.AreEnemies(this, m);
|
||||
|
||||
return valid;
|
||||
}
|
||||
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
BaseWeapon wep = Weapon as BaseWeapon;
|
||||
|
||||
if (wep == null)
|
||||
return null;
|
||||
|
||||
if (Utility.RandomBool())
|
||||
return wep.PrimaryAbility;
|
||||
|
||||
return wep.SecondaryAbility;
|
||||
}
|
||||
|
||||
public BaseEodonTribesman(Serial serial) : base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize(GenericWriter writer)
|
||||
{
|
||||
base.Serialize(writer);
|
||||
writer.Write(0);
|
||||
writer.Write((int)TribeType);
|
||||
}
|
||||
|
||||
public override void Deserialize(GenericReader reader)
|
||||
{
|
||||
base.Deserialize(reader);
|
||||
int version = reader.ReadInt();
|
||||
TribeType = (EodonTribe)reader.ReadInt();
|
||||
}
|
||||
}
|
||||
|
||||
public class TribeWarrior : BaseEodonTribesman
|
||||
{
|
||||
[Constructable]
|
||||
public TribeWarrior(EodonTribe type) : base(AIType.AI_Melee, type)
|
||||
{
|
||||
}
|
||||
|
||||
public override void BuildBody()
|
||||
{
|
||||
Name = String.Format("{0} the {1} warrior", GetRandomName(), TribeType.ToString());
|
||||
|
||||
SetStr(150);
|
||||
SetDex(150);
|
||||
SetInt(75);
|
||||
|
||||
SetHits(2500);
|
||||
|
||||
SetDamage(10, 23);
|
||||
|
||||
SetDamageType(ResistanceType.Physical, 100);
|
||||
|
||||
SetSkill(SkillName.Wrestling, 100, 120);
|
||||
SetSkill(SkillName.Fencing, 100, 120);
|
||||
SetSkill(SkillName.Swords, 100, 120);
|
||||
SetSkill(SkillName.Macing, 100, 120);
|
||||
SetSkill(SkillName.Archery, 100, 120);
|
||||
|
||||
SetSkill(SkillName.Tactics, 100, 120);
|
||||
SetSkill(SkillName.Anatomy, 100, 120);
|
||||
SetSkill(SkillName.MagicResist, 100, 120);
|
||||
SetSkill(SkillName.Parry, 120);
|
||||
|
||||
switch(TribeType)
|
||||
{
|
||||
case EodonTribe.Jukari:
|
||||
Female = Utility.RandomBool();
|
||||
Body = Female ? 0x191 : 0x190;
|
||||
HairItemID = 0;
|
||||
Hue = 34723; break;
|
||||
case EodonTribe.Kurak:
|
||||
Female = Utility.RandomBool();
|
||||
Body = Female ? 0x191 : 0x190;
|
||||
HairItemID = 0x2047;
|
||||
Hue = 33960; break;
|
||||
case EodonTribe.Barrab:
|
||||
Female = false;
|
||||
Body = 0x190;
|
||||
HairItemID = 0x203B;
|
||||
Hue = 34214; break;
|
||||
case EodonTribe.Barako:
|
||||
Female = Utility.RandomBool();
|
||||
Body = Female ? 0x191 : 0x190;
|
||||
HairItemID = 0x203C;
|
||||
Hue = 35187; break;
|
||||
case EodonTribe.Urali:
|
||||
Female = true;
|
||||
Body = 0x25E;
|
||||
Race = Race.Elf;
|
||||
HairItemID = 0x2FC1;
|
||||
Hue = 35356;
|
||||
break;
|
||||
case EodonTribe.Sakkhra:
|
||||
Female = Utility.RandomBool();
|
||||
Body = Female ? 0x191 : 0x190;
|
||||
HairItemID = 0x203C;
|
||||
Hue = 34894;
|
||||
RangeFight = 7; break;
|
||||
}
|
||||
|
||||
Fame = 12000;
|
||||
Karma = 8000;
|
||||
}
|
||||
|
||||
public override void BuildEquipment()
|
||||
{
|
||||
Item weapon = null;
|
||||
|
||||
switch(TribeType)
|
||||
{
|
||||
default:
|
||||
case EodonTribe.Jukari:
|
||||
weapon = new Pickaxe();
|
||||
weapon.Hue = 1175;
|
||||
if (Female)
|
||||
{
|
||||
SetWearable(new LeatherShorts(), 1175);
|
||||
SetWearable(new LeatherBustierArms(), 1175);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetWearable(new LeatherLegs(), 1175);
|
||||
SetWearable(new BodySash(), 1175);
|
||||
}
|
||||
SetWearable(new Torch());
|
||||
break;
|
||||
case EodonTribe.Kurak:
|
||||
weapon = new Tekagi();
|
||||
SetWearable(new LeatherDo());
|
||||
SetWearable(new PlateMempo(), 1192);
|
||||
SetWearable(new ShortPants(), 1192);
|
||||
SetWearable(new Sandals(), 1192);
|
||||
break;
|
||||
case EodonTribe.Barrab:
|
||||
weapon = new Spear();
|
||||
SetWearable(new PlateDo(), 1828);
|
||||
SetWearable(new Obi(), 1828);
|
||||
SetWearable(new PlateSuneate(), 1828);
|
||||
SetWearable(new DecorativePlateKabuto(), 1834);
|
||||
SetWearable(new SilverEarrings());
|
||||
SetWearable(new Sandals(), 1828);
|
||||
break;
|
||||
case EodonTribe.Barako:
|
||||
if (Female)
|
||||
{
|
||||
weapon = new Maul();
|
||||
SetWearable(new DeerMask(), 2414);
|
||||
}
|
||||
else
|
||||
{
|
||||
weapon = new WarMace();
|
||||
SetWearable(new BearMask(), 2414);
|
||||
}
|
||||
weapon.Hue = 2414;
|
||||
SetWearable(new StuddedChest(), 2414);
|
||||
SetWearable(new StuddedArms(), 2414);
|
||||
SetWearable(new StuddedLegs(), 2414);
|
||||
SetWearable(new StuddedGorget(), 2414);
|
||||
SetWearable(new LeatherNinjaMitts(), 2414);
|
||||
SetWearable(new Boots(), 2414);
|
||||
break;
|
||||
case EodonTribe.Urali:
|
||||
SetWearable(new DragonChest(), 2576);
|
||||
SetWearable(new LeatherJingasa(), 2576);
|
||||
SetWearable(new MetalShield(), 2576);
|
||||
SetWearable(new Waraji(), 2576);
|
||||
SetWearable(new ChainLegs(), 2576);
|
||||
break;
|
||||
case EodonTribe.Sakkhra:
|
||||
weapon = new Bow();
|
||||
weapon.Hue = 2125;
|
||||
if (Female)
|
||||
{
|
||||
SetWearable(new LeatherBustierArms(), 2128);
|
||||
SetWearable(new LeatherSkirt(), 2125);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetWearable(new LeatherChest(), 2128);
|
||||
SetWearable(new SkullCap(), 2125);
|
||||
SetWearable(new Kilt(), 2125);
|
||||
}
|
||||
SetWearable(new ThighBoots(), 2129);
|
||||
break;
|
||||
}
|
||||
|
||||
if (weapon != null)
|
||||
{
|
||||
weapon.LootType = LootType.Blessed;
|
||||
SetWearable(weapon);
|
||||
}
|
||||
}
|
||||
|
||||
public override bool AlwaysAttackable { get { return this.Region.IsPartOf<BattleRegion>(); } }
|
||||
public override bool ShowFameTitle { get { return false; } }
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot(LootPack.Rich, 2);
|
||||
}
|
||||
|
||||
public TribeWarrior(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 TribeShaman : BaseEodonTribesman
|
||||
{
|
||||
public override bool ShowSpellMantra { get { return true; } }
|
||||
|
||||
[Constructable]
|
||||
public TribeShaman(EodonTribe type) : base(AIType.AI_Mage, type)
|
||||
{
|
||||
RangeFight = 7;
|
||||
|
||||
PackGold(60, 70);
|
||||
PackReg(1, 3);
|
||||
|
||||
Bandage b = new Bandage();
|
||||
b.Amount = Utility.RandomMinMax(3, 5);
|
||||
PackItem(b);
|
||||
}
|
||||
|
||||
public override void BuildBody()
|
||||
{
|
||||
Name = String.Format("{0} the {1} shaman", GetRandomName(), TribeType.ToString());
|
||||
|
||||
SetStr(125);
|
||||
SetDex(75, 100);
|
||||
SetInt(200, 250);
|
||||
|
||||
SetHits(2500);
|
||||
|
||||
SetDamage( 10, 15 );
|
||||
|
||||
SetDamageType(ResistanceType.Physical, 100);
|
||||
|
||||
SetSkill(SkillName.Wrestling, 100);
|
||||
SetSkill(SkillName.Fencing, 100);
|
||||
SetSkill(SkillName.Swords, 100);
|
||||
SetSkill(SkillName.Macing, 100);
|
||||
SetSkill(SkillName.Archery, 100);
|
||||
|
||||
SetSkill(SkillName.Tactics, 100);
|
||||
SetSkill(SkillName.Anatomy, 100);
|
||||
SetSkill(SkillName.MagicResist, 100);
|
||||
SetSkill(SkillName.Magery, 120);
|
||||
SetSkill(SkillName.EvalInt, 120);
|
||||
|
||||
switch (TribeType)
|
||||
{
|
||||
case EodonTribe.Jukari:
|
||||
Female = Utility.RandomBool();
|
||||
Body = Female ? 0x191 : 0x190;
|
||||
HairItemID = 0;
|
||||
Hue = 34723; break;
|
||||
case EodonTribe.Kurak:
|
||||
Female = Utility.RandomBool();
|
||||
Body = Female ? 0x191 : 0x190;
|
||||
HairItemID = Female ? 0x203C : 0x203B;
|
||||
Hue = 33960; break;
|
||||
case EodonTribe.Barrab:
|
||||
Female = true;
|
||||
Body = 0x191;
|
||||
HairItemID = 0x203B;
|
||||
Hue = 34214; break;
|
||||
case EodonTribe.Barako:
|
||||
Female = Utility.RandomBool();
|
||||
Body = Female ? 0x191 : 0x190;
|
||||
HairItemID = 0x203C;
|
||||
Hue = 35187; break;
|
||||
case EodonTribe.Urali:
|
||||
Female = false;
|
||||
Body = 0x25D;
|
||||
Race = Race.Elf;
|
||||
HairItemID = 0x2FC1;
|
||||
Hue = 35356;
|
||||
break;
|
||||
case EodonTribe.Sakkhra:
|
||||
Female = Utility.RandomBool();
|
||||
Body = Female ? 0x191 : 0x190;
|
||||
HairItemID = 0x203C;
|
||||
Hue = 34894;
|
||||
RangeFight = 7; break;
|
||||
}
|
||||
|
||||
Fame = 12000;
|
||||
Karma = 8000;
|
||||
}
|
||||
|
||||
public override void BuildEquipment()
|
||||
{
|
||||
Item weapon = new WildStaff();
|
||||
|
||||
switch(TribeType)
|
||||
{
|
||||
default:
|
||||
case EodonTribe.Jukari:
|
||||
SetWearable(new FemaleLeatherChest(), 1933);
|
||||
SetWearable(new LeatherSkirt(), 1933);
|
||||
SetWearable(new Torch());
|
||||
weapon.Hue = 1933;
|
||||
break;
|
||||
case EodonTribe.Kurak:
|
||||
SetWearable(new LeatherDo(), 1150);
|
||||
SetWearable(new PlateMempo(), 1150);
|
||||
SetWearable(new TattsukeHakama(), 1150);
|
||||
SetWearable(new Sandals(), 1150);
|
||||
weapon.Hue = 1150;
|
||||
break;
|
||||
case EodonTribe.Barrab:
|
||||
Robe robe = new Robe();
|
||||
robe.ItemID = 9860;
|
||||
SetWearable(robe, 1834);
|
||||
SetWearable(new Obi(), 1834);
|
||||
SetWearable(new Sandals(), 1831);
|
||||
weapon.Hue = 1831;
|
||||
break;
|
||||
case EodonTribe.Barako:
|
||||
SetWearable(new LeatherHiroSode(), 1518);
|
||||
SetWearable(new LeatherGloves(), 1518);
|
||||
SetWearable(new TribalMask(), 1518);
|
||||
SetWearable(new LeatherNinjaPants(), 1518);
|
||||
SetWearable(new BoneChest(), 1518);
|
||||
SetWearable(new StuddedGorget(), 1518);
|
||||
SetWearable(new Boots(), 1518);
|
||||
SetWearable(new Surcoat(), 1518);
|
||||
weapon.Hue = 1518;
|
||||
break;
|
||||
case EodonTribe.Urali:
|
||||
SetWearable(new DragonLegs(), 2576);
|
||||
SetWearable(new GoldEarrings());
|
||||
SetWearable(new NinjaTabi(), 2576);
|
||||
weapon.Hue = 2576;
|
||||
break;
|
||||
case EodonTribe.Sakkhra:
|
||||
SetWearable(new StuddedChest(), 2118);
|
||||
SetWearable(new LeatherArms(), 2106);
|
||||
SetWearable(new LeatherGloves(), 2106);
|
||||
SetWearable(new SkullCap(), 2118);
|
||||
SetWearable(new RingmailLegs(), 2106);
|
||||
SetWearable(new ThighBoots(), 2106);
|
||||
weapon.Hue = 2118;
|
||||
break;
|
||||
}
|
||||
|
||||
if (weapon != null)
|
||||
{
|
||||
weapon.LootType = LootType.Blessed;
|
||||
SetWearable(weapon);
|
||||
}
|
||||
}
|
||||
|
||||
public override bool AlwaysAttackable { get { return this.Region.IsPartOf<BattleRegion>(); } }
|
||||
public override bool ShowFameTitle { get { return false; } }
|
||||
|
||||
public TribeShaman(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 TribeChieftan : BaseEodonTribesman
|
||||
{
|
||||
[Constructable]
|
||||
public TribeChieftan(EodonTribe type) : base(AIType.AI_Melee, type)
|
||||
{
|
||||
}
|
||||
|
||||
public override void BuildBody()
|
||||
{
|
||||
Name = String.Format("{0} the {1} {2}", GetRandomName(), TribeType.ToString(), Female ? "chieftess" : "chieftan");
|
||||
|
||||
SetStr(200);
|
||||
SetDex(2000);
|
||||
SetInt(200, 250);
|
||||
|
||||
SetHits(4500);
|
||||
|
||||
SetDamage( 15, 28 );
|
||||
|
||||
SetDamageType(ResistanceType.Physical, 100);
|
||||
|
||||
//Set resistances?
|
||||
|
||||
SetSkill(SkillName.Wrestling, 120);
|
||||
SetSkill(SkillName.Fencing, 120);
|
||||
SetSkill(SkillName.Swords, 120);
|
||||
SetSkill(SkillName.Macing, 120);
|
||||
SetSkill(SkillName.Archery, 120);
|
||||
|
||||
SetSkill(SkillName.Tactics, 120);
|
||||
SetSkill(SkillName.Anatomy, 120);
|
||||
SetSkill(SkillName.MagicResist, 120);
|
||||
SetSkill(SkillName.Parry, 120);
|
||||
|
||||
switch (TribeType)
|
||||
{
|
||||
case EodonTribe.Jukari:
|
||||
Female = Utility.RandomBool();
|
||||
Body = Female ? 0x191 : 0x190;
|
||||
HairItemID = 0;
|
||||
Hue = 34723; break;
|
||||
case EodonTribe.Kurak:
|
||||
Female = Utility.RandomBool();
|
||||
Body = Female ? 0x191 : 0x190;
|
||||
HairItemID = Female ? 0x2046 : 0x203B;
|
||||
Hue = 33960; break;
|
||||
case EodonTribe.Barrab:
|
||||
Female = true;
|
||||
Body = 0x191;
|
||||
HairItemID = 0x203B;
|
||||
Hue = 34214; break;
|
||||
case EodonTribe.Barako:
|
||||
Female = Utility.RandomBool();
|
||||
Body = Female ? 0x191 : 0x190;
|
||||
HairItemID = 0x203C;
|
||||
Hue = 35187; break;
|
||||
case EodonTribe.Urali:
|
||||
Female = true;
|
||||
Body = 0x25E;
|
||||
Race = Race.Elf;
|
||||
HairItemID = 0x2FD0;
|
||||
Hue = 35356;
|
||||
break;
|
||||
case EodonTribe.Sakkhra:
|
||||
Female = Utility.RandomBool();
|
||||
Body = Female ? 0x191 : 0x190;
|
||||
HairItemID = 0x203C;
|
||||
Hue = 34894;
|
||||
RangeFight = 7; break;
|
||||
}
|
||||
|
||||
Fame = 18000;
|
||||
Karma = 8000;
|
||||
}
|
||||
|
||||
public override void BuildEquipment()
|
||||
{
|
||||
Item weapon = null;
|
||||
|
||||
switch (TribeType)
|
||||
{
|
||||
default:
|
||||
case EodonTribe.Jukari:
|
||||
SetWearable(new LeatherLegs(), 1175);
|
||||
SetWearable(new Shirt(), 1175);
|
||||
SetWearable(new Torch());
|
||||
weapon = new Bokuto();
|
||||
weapon.Hue = 1175;
|
||||
break;
|
||||
case EodonTribe.Kurak:
|
||||
SetWearable(new LeatherDo(), 1175);
|
||||
SetWearable(new FancyShirt(), 1175);
|
||||
SetWearable(new TattsukeHakama());
|
||||
SetWearable(new Sandals(), 1175);
|
||||
weapon = new Tekagi();
|
||||
weapon.Hue = 1175;
|
||||
break;
|
||||
case EodonTribe.Barrab:
|
||||
SetWearable(new PlateDo(), 1828);
|
||||
SetWearable(new PlateSuneate(), 1828);
|
||||
SetWearable(new DecorativePlateKabuto(), 1834);
|
||||
SetWearable(new Sandals(), 1828);
|
||||
weapon = new Spear();
|
||||
weapon.Hue = 1828;
|
||||
break;
|
||||
case EodonTribe.Barako:
|
||||
SetWearable(new BoneChest(), 2407);
|
||||
SetWearable(new LeatherNinjaPants(), 2407);
|
||||
SetWearable(new StuddedHiroSode(), 2407);
|
||||
SetWearable(new BoneGloves(), 2407);
|
||||
SetWearable(new StuddedGorget(), 2407);
|
||||
SetWearable(new Boots(), 2407);
|
||||
weapon = new Scepter();
|
||||
weapon.Hue = 2407;
|
||||
break;
|
||||
case EodonTribe.Urali:
|
||||
SetWearable(new ChainLegs(), 2576);
|
||||
SetWearable(new DragonChest(), 2576);
|
||||
SetWearable(new DragonArms(), 2576);
|
||||
SetWearable(new MetalShield(), 2576);
|
||||
SetWearable(new Circlet(), 2576);
|
||||
SetWearable(new JinBaori(), 2592);
|
||||
SetWearable(new Waraji(), 2576);
|
||||
break;
|
||||
case EodonTribe.Sakkhra:
|
||||
SetWearable(new StuddedChest(), 2118);
|
||||
SetWearable(new LeatherArms(), 2106);
|
||||
SetWearable(new LeatherGloves(), 2106);
|
||||
SetWearable(new SkullCap(), 2118);
|
||||
SetWearable(new RingmailLegs(), 2106);
|
||||
SetWearable(new ThighBoots(), 2106);
|
||||
weapon = new Yumi();
|
||||
weapon.Hue = 2118;
|
||||
break;
|
||||
}
|
||||
|
||||
if (weapon != null)
|
||||
{
|
||||
weapon.LootType = LootType.Blessed;
|
||||
SetWearable(weapon);
|
||||
}
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot(LootPack.FilthyRich, 2);
|
||||
}
|
||||
|
||||
public TribeChieftan(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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("a gallusaurus corpse")]
|
||||
public class Gallusaurus : BaseCreature
|
||||
{
|
||||
public override bool AttacksFocus { get { return !Controlled; } }
|
||||
|
||||
[Constructable]
|
||||
public Gallusaurus()
|
||||
: base(AIType.AI_Melee, FightMode.Closest, 10, 1, .2, .4)
|
||||
{
|
||||
Name = "a gallusaurus";
|
||||
Body = 1286;
|
||||
BaseSoundID = 0x275;
|
||||
|
||||
SetStr(477, 511);
|
||||
SetDex(155, 168);
|
||||
SetInt(221, 274);
|
||||
|
||||
SetDamage(11, 17);
|
||||
|
||||
SetHits(700, 900);
|
||||
|
||||
SetDamageType(ResistanceType.Physical, 100);
|
||||
|
||||
SetResistance(ResistanceType.Physical, 50, 60);
|
||||
SetResistance(ResistanceType.Fire, 20, 30);
|
||||
SetResistance(ResistanceType.Cold, 20, 30);
|
||||
SetResistance(ResistanceType.Poison, 60, 70);
|
||||
SetResistance(ResistanceType.Energy, 20, 30);
|
||||
|
||||
SetSkill(SkillName.MagicResist, 70.0, 80.0);
|
||||
SetSkill(SkillName.Tactics, 80.0, 90.0);
|
||||
SetSkill(SkillName.Wrestling, 80.0, 91.0);
|
||||
SetSkill(SkillName.Bushido, 110.0, 120.0);
|
||||
SetSkill(SkillName.DetectHidden, 25.0, 35.0);
|
||||
|
||||
Fame = 8100;
|
||||
Karma = -8100;
|
||||
|
||||
Tamable = true;
|
||||
ControlSlots = 3;
|
||||
MinTameSkill = 102.0;
|
||||
|
||||
SetWeaponAbility(WeaponAbility.Block);
|
||||
SetSpecialAbility(SpecialAbility.GraspingClaw);
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot(LootPack.FilthyRich, 1);
|
||||
}
|
||||
|
||||
public override int Meat { get { return 3; } }
|
||||
public override bool CanAngerOnTame { get { return true; } }
|
||||
public override int TreasureMapLevel { get { return 1; } }
|
||||
|
||||
public Gallusaurus(Serial serial)
|
||||
: base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize(GenericWriter writer)
|
||||
{
|
||||
base.Serialize(writer);
|
||||
writer.Write(1);
|
||||
}
|
||||
|
||||
public override void Deserialize(GenericReader reader)
|
||||
{
|
||||
base.Deserialize(reader);
|
||||
int version = reader.ReadInt();
|
||||
|
||||
if (version == 0)
|
||||
{
|
||||
SetSpecialAbility(SpecialAbility.GraspingClaw);
|
||||
SetWeaponAbility(WeaponAbility.Block);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("a greater phoenix corpse")]
|
||||
public class GreaterPhoenix : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public GreaterPhoenix()
|
||||
: base(AIType.AI_Mage, FightMode.Closest, 10, 1, .2, .4)
|
||||
{
|
||||
Name = "a greater phoenix";
|
||||
Body = 832;
|
||||
BaseSoundID = 0x8F;
|
||||
|
||||
SetStr(332, 386);
|
||||
SetDex(97, 113);
|
||||
SetInt(182, 258);
|
||||
|
||||
SetDamage( 11, 14 );
|
||||
|
||||
SetHits(119, 240);
|
||||
|
||||
SetResistance( ResistanceType.Physical, 45, 55 );
|
||||
SetResistance( ResistanceType.Fire, 70, 80 );
|
||||
SetResistance( ResistanceType.Cold, 20, 30 );
|
||||
SetResistance( ResistanceType.Poison, 40, 50 );
|
||||
SetResistance( ResistanceType.Energy, 35, 45 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 40 );
|
||||
SetDamageType( ResistanceType.Fire, 60 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 60, 77 );
|
||||
SetSkill(SkillName.MagicResist, 90, 105);
|
||||
SetSkill(SkillName.Tactics, 50, 70);
|
||||
SetSkill(SkillName.Magery, 90, 100);
|
||||
SetSkill(SkillName.EvalInt, 90, 100);
|
||||
|
||||
PackGold(500, 700);
|
||||
|
||||
Fame = 10000;
|
||||
Karma = -10000;
|
||||
|
||||
SetSpecialAbility(SpecialAbility.GraspingClaw);
|
||||
}
|
||||
|
||||
public GreaterPhoenix(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();
|
||||
}
|
||||
}
|
||||
}
|
||||
169
Scripts/Services/Expansions/Time Of Legends/Mobiles/Infernus.cs
Normal file
169
Scripts/Services/Expansions/Time Of Legends/Mobiles/Infernus.cs
Normal file
@@ -0,0 +1,169 @@
|
||||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("an infernus corpse")]
|
||||
public class Infernus : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public Infernus()
|
||||
: base(AIType.AI_Melee, FightMode.Closest, 10, 1, .2, .4)
|
||||
{
|
||||
Name = "an infernus";
|
||||
Body = 0x9F;
|
||||
Hue = 1955;
|
||||
BaseSoundID = 278;
|
||||
|
||||
SetStr(318, 400);
|
||||
SetDex(97, 115);
|
||||
SetInt(184, 266);
|
||||
|
||||
SetDamage(11, 14);
|
||||
|
||||
SetHits(202, 243);
|
||||
|
||||
SetResistance(ResistanceType.Physical, 45, 55);
|
||||
SetResistance(ResistanceType.Fire, 80, 90);
|
||||
SetResistance(ResistanceType.Cold, 25, 35);
|
||||
SetResistance(ResistanceType.Poison, 40, 50);
|
||||
SetResistance(ResistanceType.Energy, 35, 45);
|
||||
|
||||
SetDamageType(ResistanceType.Fire, 100);
|
||||
|
||||
SetSkill(SkillName.MagicResist, 90, 100);
|
||||
SetSkill(SkillName.Tactics, 60, 70);
|
||||
SetSkill(SkillName.Wrestling, 80);
|
||||
|
||||
PackGold(500, 600);
|
||||
|
||||
Fame = 10000;
|
||||
Karma = -10000;
|
||||
}
|
||||
|
||||
public override int TreasureMapLevel { get { return 5; } }
|
||||
|
||||
private DateTime _NextDrop;
|
||||
|
||||
public override void OnActionCombat()
|
||||
{
|
||||
Mobile combatant = Combatant as Mobile;
|
||||
|
||||
if (DateTime.UtcNow < _NextDrop || combatant == null || combatant.Deleted || combatant.Map != Map || !InRange(combatant, 12))
|
||||
return;
|
||||
|
||||
DropFire(combatant);
|
||||
|
||||
_NextDrop = DateTime.UtcNow + TimeSpan.FromSeconds(Utility.RandomMinMax(10, 15));
|
||||
}
|
||||
|
||||
public void DropFire(Mobile m)
|
||||
{
|
||||
for (int x = m.X - 1; x <= m.X + 1; x++)
|
||||
{
|
||||
for (int y = m.Y - 1; y <= m.Y + 1; y++)
|
||||
{
|
||||
IPoint3D p = new Point3D(x, y, Map.GetAverageZ(x, y)) as IPoint3D;
|
||||
Server.Spells.SpellHelper.GetSurfaceTop(ref p);
|
||||
|
||||
if (((x == 0 && y == 0) || .5 > Utility.RandomDouble()) && Map.CanSpawnMobile(p.X, p.Y, p.Z))
|
||||
{
|
||||
var item = new FireItem(this);
|
||||
item.MoveToWorld(new Point3D(p), this.Map);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class FireItem : Item
|
||||
{
|
||||
public Infernus Mobile { get; private set; }
|
||||
public Timer Timer { get; private set; }
|
||||
|
||||
private DateTime _EndTime;
|
||||
|
||||
public FireItem(Infernus mobile)
|
||||
: base(0x19AB)
|
||||
{
|
||||
Mobile = mobile;
|
||||
|
||||
_EndTime = DateTime.UtcNow + TimeSpan.FromSeconds(Utility.RandomMinMax(30, 40));
|
||||
|
||||
Timer = Timer.DelayCall(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1), OnTick);
|
||||
}
|
||||
|
||||
public override bool OnMoveOver(Mobile from)
|
||||
{
|
||||
if (Mobile != null && Mobile != from && Server.Spells.SpellHelper.ValidIndirectTarget(Mobile, from) && Mobile.CanBeHarmful(from, false))
|
||||
{
|
||||
Mobile.DoHarmful(from);
|
||||
|
||||
AOS.Damage(from, Mobile, Utility.RandomMinMax(50, 85), 0, 100, 0, 0, 0);
|
||||
Effects.PlaySound(this.Location, this.Map, 0x1DD);
|
||||
from.PrivateOverheadMessage(Server.Network.MessageType.Regular, 0x20, 1156084, from.NetState); // *The trail of fire scorches you, setting you ablaze!*
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void OnTick()
|
||||
{
|
||||
if (_EndTime < DateTime.UtcNow)
|
||||
{
|
||||
Delete();
|
||||
}
|
||||
else
|
||||
{
|
||||
IPooledEnumerable eable = this.Map.GetMobilesInRange(this.Location, 0);
|
||||
|
||||
foreach (Mobile m in eable)
|
||||
OnMoveOver(m);
|
||||
|
||||
eable.Free();
|
||||
}
|
||||
}
|
||||
|
||||
public override void Delete()
|
||||
{
|
||||
base.Delete();
|
||||
|
||||
if (Timer != null)
|
||||
{
|
||||
Timer.Stop();
|
||||
Timer = null;
|
||||
}
|
||||
}
|
||||
|
||||
public FireItem(Serial serial)
|
||||
: base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize(GenericWriter writer)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Deserialize(GenericReader reader)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
public Infernus(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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
using Server.Engines.MyrmidexInvasion;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("a myrmidex corpse")]
|
||||
public class MyrmidexDrone : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public MyrmidexDrone()
|
||||
: base(AIType.AI_Melee, FightMode.Closest, 10, 1, .2, .4)
|
||||
{
|
||||
Name = "a myrmidex drone";
|
||||
|
||||
Body = 1402;
|
||||
BaseSoundID = 959;
|
||||
//Hue = 2676;
|
||||
|
||||
SetStr(76, 105);
|
||||
SetDex(96, 136);
|
||||
SetInt(25, 44);
|
||||
|
||||
SetDamage(6, 12);
|
||||
|
||||
SetHits(460, 597);
|
||||
SetMana(0);
|
||||
|
||||
SetResistance(ResistanceType.Physical, 1, 5);
|
||||
SetResistance(ResistanceType.Fire, 1, 5);
|
||||
SetResistance(ResistanceType.Cold, 1, 5);
|
||||
SetResistance(ResistanceType.Poison, 1, 5);
|
||||
SetResistance(ResistanceType.Energy, 1, 5);
|
||||
|
||||
SetDamageType(ResistanceType.Physical, 50);
|
||||
SetDamageType(ResistanceType.Poison, 50);
|
||||
|
||||
SetSkill(SkillName.MagicResist, 30.1, 43.5);
|
||||
SetSkill(SkillName.Tactics, 30.1, 49.0);
|
||||
SetSkill(SkillName.Wrestling, 41.1, 49.8);
|
||||
|
||||
PackGold(50, 70);
|
||||
|
||||
Fame = 2500;
|
||||
Karma = -2500;
|
||||
}
|
||||
|
||||
public override bool OnBeforeDeath()
|
||||
{
|
||||
if (Region.IsPartOf("MyrmidexBattleground") && 0.25 > Utility.RandomDouble())
|
||||
PackItem(new MyrmidexEggsac(Utility.RandomMinMax(1, 5)));
|
||||
|
||||
return base.OnBeforeDeath();
|
||||
}
|
||||
|
||||
public override int Meat { get { return 4; } }
|
||||
public override Poison HitPoison { get { return Poison.Regular; } }
|
||||
public override Poison PoisonImmune { get { return Poison.Regular; } }
|
||||
public override int TreasureMapLevel { get { return 1; } }
|
||||
|
||||
public override bool IsEnemy(Mobile m)
|
||||
{
|
||||
if (MyrmidexInvasionSystem.Active && MyrmidexInvasionSystem.IsAlliedWithEodonTribes(m))
|
||||
return true;
|
||||
|
||||
if (MyrmidexInvasionSystem.Active && MyrmidexInvasionSystem.IsAlliedWithMyrmidex(m))
|
||||
return false;
|
||||
|
||||
return base.IsEnemy(m);
|
||||
}
|
||||
|
||||
public MyrmidexDrone(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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
using Server.Engines.MyrmidexInvasion;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("a myrmidex corpse")]
|
||||
public class MyrmidexLarvae : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public MyrmidexLarvae()
|
||||
: base(AIType.AI_Melee, FightMode.Closest, 10, 1, .2, .4)
|
||||
{
|
||||
Name = "a myrmidex larvae";
|
||||
|
||||
Body = 1293;
|
||||
BaseSoundID = 959;
|
||||
|
||||
SetStr(79, 100);
|
||||
SetDex(82, 95);
|
||||
SetInt(38, 75);
|
||||
|
||||
SetDamage( 5, 13 );
|
||||
|
||||
SetHits(446, 588);
|
||||
SetMana(0);
|
||||
|
||||
SetResistance( ResistanceType.Physical, 20 );
|
||||
SetResistance( ResistanceType.Fire, 10, 20 );
|
||||
SetResistance( ResistanceType.Cold, 10, 20 );
|
||||
SetResistance( ResistanceType.Poison, 30, 40 );
|
||||
SetResistance( ResistanceType.Energy, 10, 20 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 50 );
|
||||
SetDamageType( ResistanceType.Poison, 50 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 30.1, 43.5 );
|
||||
SetSkill( SkillName.Tactics, 30.1, 49.0 );
|
||||
SetSkill( SkillName.Wrestling, 40, 50 );
|
||||
|
||||
PackGold(20, 40);
|
||||
|
||||
Fame = 2500;
|
||||
Karma = -2500;
|
||||
}
|
||||
|
||||
public override Poison HitPoison{ get{ return Poison.Lesser; } }
|
||||
public override Poison PoisonImmune{ get{ return Poison.Lesser; } }
|
||||
public override int TreasureMapLevel { get { return 1; } }
|
||||
|
||||
public override bool IsEnemy(Mobile m)
|
||||
{
|
||||
if (MyrmidexInvasionSystem.Active && MyrmidexInvasionSystem.IsAlliedWithEodonTribes(m))
|
||||
return true;
|
||||
|
||||
if (MyrmidexInvasionSystem.Active && MyrmidexInvasionSystem.IsAlliedWithMyrmidex(m))
|
||||
return false;
|
||||
|
||||
return base.IsEnemy(m);
|
||||
}
|
||||
|
||||
public MyrmidexLarvae(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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
using Server.Engines.MyrmidexInvasion;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("a myrmidex corpse")]
|
||||
public class MyrmidexWarrior : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public MyrmidexWarrior()
|
||||
: base(AIType.AI_Mage, FightMode.Closest, 10, 1, .2, .4)
|
||||
{
|
||||
Name = "a myrmidex warrior";
|
||||
|
||||
Body = 1403;
|
||||
BaseSoundID = 959;
|
||||
//Hue = 2676;
|
||||
|
||||
SetStr(500, 600);
|
||||
SetDex(82, 95);
|
||||
SetInt(130, 140);
|
||||
|
||||
SetDamage(18, 22);
|
||||
|
||||
SetHits(2800, 3000);
|
||||
SetMana(40, 50);
|
||||
|
||||
SetResistance(ResistanceType.Physical, 1, 10);
|
||||
SetResistance(ResistanceType.Fire, 1, 10);
|
||||
SetResistance(ResistanceType.Cold, 1, 10);
|
||||
SetResistance(ResistanceType.Poison, 1, 10);
|
||||
SetResistance(ResistanceType.Energy, 1, 10);
|
||||
|
||||
SetDamageType(ResistanceType.Physical, 50);
|
||||
SetDamageType(ResistanceType.Poison, 50);
|
||||
|
||||
SetSkill(SkillName.Wrestling, 90, 100);
|
||||
SetSkill(SkillName.Tactics, 90, 100);
|
||||
SetSkill(SkillName.MagicResist, 70, 80);
|
||||
SetSkill(SkillName.Poisoning, 70, 80);
|
||||
SetSkill(SkillName.Magery, 80, 90);
|
||||
SetSkill(SkillName.EvalInt, 70, 80);
|
||||
|
||||
Fame = 8000;
|
||||
Karma = -8000;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
this.AddLoot(LootPack.Rich, 2);
|
||||
}
|
||||
|
||||
public override bool OnBeforeDeath()
|
||||
{
|
||||
if (Region.IsPartOf("MyrmidexBattleground") && 0.25 > Utility.RandomDouble())
|
||||
PackItem(new MoonstoneCrystalShard(Utility.RandomMinMax(1, 5)));
|
||||
|
||||
return base.OnBeforeDeath();
|
||||
}
|
||||
|
||||
public override Poison HitPoison { get { return Poison.Deadly; } }
|
||||
public override Poison PoisonImmune { get { return Poison.Deadly; } }
|
||||
public override int TreasureMapLevel { get { return 2; } }
|
||||
|
||||
public override bool IsEnemy(Mobile m)
|
||||
{
|
||||
if (MyrmidexInvasionSystem.Active && MyrmidexInvasionSystem.IsAlliedWithEodonTribes(m))
|
||||
return true;
|
||||
|
||||
if (MyrmidexInvasionSystem.Active && MyrmidexInvasionSystem.IsAlliedWithMyrmidex(m))
|
||||
return false;
|
||||
|
||||
return base.IsEnemy(m);
|
||||
}
|
||||
|
||||
public MyrmidexWarrior(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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
using System;
|
||||
using Server;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("a najasaurus corpse")]
|
||||
public class Najasaurus : BaseCreature
|
||||
{
|
||||
public override bool AttacksFocus { get { return !Controlled; } }
|
||||
|
||||
[Constructable]
|
||||
public Najasaurus()
|
||||
: base(AIType.AI_Melee, FightMode.Closest, 10, 1, .2, .4)
|
||||
{
|
||||
Name = "a najasaurus";
|
||||
Body = 1289;
|
||||
BaseSoundID = 219;
|
||||
|
||||
SetStr(162, 346);
|
||||
SetDex(151, 218);
|
||||
SetInt(21, 40);
|
||||
|
||||
SetDamage(13, 24);
|
||||
SetHits(737, 854);
|
||||
|
||||
SetDamageType(ResistanceType.Physical, 50);
|
||||
SetDamageType(ResistanceType.Poison, 50);
|
||||
|
||||
SetResistance(ResistanceType.Physical, 45, 55);
|
||||
SetResistance(ResistanceType.Fire, 50, 60);
|
||||
SetResistance(ResistanceType.Cold, 45, 55);
|
||||
SetResistance(ResistanceType.Poison, 100);
|
||||
SetResistance(ResistanceType.Energy, 35, 45);
|
||||
|
||||
SetSkill(SkillName.MagicResist, 150.0, 190.0);
|
||||
SetSkill(SkillName.Tactics, 80.0, 95.0);
|
||||
SetSkill(SkillName.Wrestling, 80.0, 100.0);
|
||||
SetSkill(SkillName.Poisoning, 90.0, 100.0);
|
||||
SetSkill(SkillName.DetectHidden, 45.0, 55.0);
|
||||
|
||||
Fame = 17000;
|
||||
Karma = -17000;
|
||||
|
||||
Tamable = true;
|
||||
ControlSlots = 2;
|
||||
MinTameSkill = 102.0;
|
||||
}
|
||||
|
||||
public override Poison HitPoison { get { return Poison.Lethal; } }
|
||||
public override Poison PoisonImmune { get { return Poison.Lethal; } }
|
||||
public override bool CanAngerOnTame { get { return true; } }
|
||||
public override int TreasureMapLevel { get { return 2; } }
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot(LootPack.FilthyRich);
|
||||
}
|
||||
|
||||
public Najasaurus(Serial serial)
|
||||
: base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize(GenericWriter writer)
|
||||
{
|
||||
base.Serialize(writer);
|
||||
writer.Write(1);
|
||||
}
|
||||
|
||||
public override void Deserialize(GenericReader reader)
|
||||
{
|
||||
base.Deserialize(reader);
|
||||
int version = reader.ReadInt();
|
||||
|
||||
if (version == 0)
|
||||
{
|
||||
SetMagicalAbility(MagicalAbility.Poisoning);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
using System;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("a saurosaurus corpse")]
|
||||
public class Saurosaurus : BaseCreature
|
||||
{
|
||||
public override bool AttacksFocus { get { return !Controlled; } }
|
||||
|
||||
[Constructable]
|
||||
public Saurosaurus() : base(AIType.AI_Mage, FightMode.Closest, 10, 1, .2, .4)
|
||||
{
|
||||
Name = "a saurosaurus";
|
||||
Body = 1291;
|
||||
BaseSoundID = 362;
|
||||
|
||||
SetStr(802, 824);
|
||||
SetDex(201, 220);
|
||||
SetInt(403, 440);
|
||||
|
||||
SetDamage(21, 28);
|
||||
|
||||
SetHits(1321, 1468);
|
||||
|
||||
SetResistance(ResistanceType.Physical, 75, 85);
|
||||
SetResistance(ResistanceType.Fire, 80, 90);
|
||||
SetResistance(ResistanceType.Cold, 45, 55);
|
||||
SetResistance(ResistanceType.Poison, 35, 45);
|
||||
SetResistance(ResistanceType.Energy, 45, 55);
|
||||
|
||||
SetDamageType(ResistanceType.Physical, 100);
|
||||
|
||||
SetSkill(SkillName.MagicResist, 70.0, 90.0);
|
||||
SetSkill(SkillName.Tactics, 110.0, 120.0);
|
||||
SetSkill(SkillName.Wrestling, 110.0, 130.0);
|
||||
SetSkill(SkillName.Anatomy, 50.0, 60.0);
|
||||
SetSkill(SkillName.DetectHidden, 80.0);
|
||||
SetSkill(SkillName.Parry, 80.0, 90);
|
||||
SetSkill(SkillName.Focus, 115.0, 125.0);
|
||||
|
||||
Fame = 11000;
|
||||
Karma = -11000;
|
||||
|
||||
Tamable = true;
|
||||
ControlSlots = 3;
|
||||
MinTameSkill = 102.0;
|
||||
|
||||
SetWeaponAbility(WeaponAbility.ConcussionBlow);
|
||||
SetSpecialAbility(SpecialAbility.TailSwipe);
|
||||
SetSpecialAbility(SpecialAbility.LifeLeech);
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot(LootPack.FilthyRich, 3);
|
||||
}
|
||||
|
||||
// Missing: Life Leech, Tail Swipe ability
|
||||
|
||||
public override bool CanAngerOnTame { get { return true; } }
|
||||
public override bool StatLossAfterTame { get { return true; } }
|
||||
public override int DragonBlood { get { return 8; } }
|
||||
public override int Meat { get { return 5; } }
|
||||
public override int Hides { get { return 11; } }
|
||||
public override int TreasureMapLevel { get { return 2; } }
|
||||
|
||||
public Saurosaurus(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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("a silverback gorilla corpse")]
|
||||
public class SilverbackGorilla : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public SilverbackGorilla()
|
||||
: base(AIType.AI_Melee, FightMode.Closest, 10, 1, .2, .4)
|
||||
{
|
||||
Name = "a silverback gorilla";
|
||||
Body = 0x1D;
|
||||
BaseSoundID = 0x9E;
|
||||
|
||||
SetStr(79, 106);
|
||||
SetDex(77, 91);
|
||||
SetInt(16, 29);
|
||||
|
||||
SetDamage(5, 10);
|
||||
|
||||
SetHits(446, 588);
|
||||
SetMana(0);
|
||||
|
||||
SetResistance(ResistanceType.Physical, 20);
|
||||
SetResistance(ResistanceType.Fire, 10, 20);
|
||||
SetResistance(ResistanceType.Cold, 10, 20);
|
||||
SetResistance(ResistanceType.Poison, 30, 40);
|
||||
SetResistance(ResistanceType.Energy, 10, 20);
|
||||
|
||||
SetDamageType(ResistanceType.Physical, 50);
|
||||
SetDamageType(ResistanceType.Poison, 50);
|
||||
|
||||
SetSkill(SkillName.MagicResist, 30.1, 43.5);
|
||||
SetSkill(SkillName.Tactics, 30.1, 49.0);
|
||||
SetSkill(SkillName.Wrestling, 40, 50);
|
||||
|
||||
PackGold(60, 70);
|
||||
|
||||
Fame = 5000;
|
||||
Karma = -5000;
|
||||
}
|
||||
|
||||
public override int Meat { get { return 1; } }
|
||||
public override int Hides { get { return 7; } }
|
||||
public override FoodType FavoriteFood { get { return FoodType.FruitsAndVegies; } }
|
||||
|
||||
private DateTime _NextBanana;
|
||||
private int _Thrown;
|
||||
|
||||
public override void OnActionCombat()
|
||||
{
|
||||
Mobile combatant = Combatant as Mobile;
|
||||
|
||||
if (DateTime.UtcNow < _NextBanana || combatant == null || combatant.Deleted || combatant.Map != Map || !InRange(combatant, 12) || !CanBeHarmful(combatant) || !InLOS(combatant))
|
||||
return;
|
||||
|
||||
ThrowBanana(combatant);
|
||||
|
||||
_Thrown++;
|
||||
|
||||
if (0.75 >= Utility.RandomDouble() && (_Thrown % 2) == 1) // 75% chance to quickly throw another bomb
|
||||
_NextBanana = DateTime.UtcNow + TimeSpan.FromSeconds(3.0);
|
||||
else
|
||||
_NextBanana = DateTime.UtcNow + TimeSpan.FromSeconds(5.0 + (10.0 * Utility.RandomDouble())); // 5-15 seconds
|
||||
}
|
||||
|
||||
public void ThrowBanana(Mobile m)
|
||||
{
|
||||
DoHarmful(m);
|
||||
|
||||
this.MovingParticles(m, Utility.RandomList(0x171f, 0x1720, 0x1721, 0x1722), 10, 0, false, true, 0, 0, 9502, 6014, 0x11D, EffectLayer.Waist, 0);
|
||||
|
||||
Timer.DelayCall(TimeSpan.FromSeconds(1), () =>
|
||||
{
|
||||
m.PlaySound(0x11D);
|
||||
AOS.Damage(m, this, Utility.RandomMinMax(50, 85), 100, 0, 0, 0, 0);
|
||||
});
|
||||
}
|
||||
|
||||
public override bool OnBeforeDeath()
|
||||
{
|
||||
if (Region.IsPartOf("GreatApeLair") && 0.25 > Utility.RandomDouble())
|
||||
PackItem(new PerfectBanana(Utility.RandomMinMax(1, 5)));
|
||||
|
||||
return base.OnBeforeDeath();
|
||||
}
|
||||
|
||||
public SilverbackGorilla(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();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user