Overwrite

Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
This commit is contained in:
Unstable Kitsune
2023-11-28 23:20:26 -05:00
parent 3cd54811de
commit b918192e4e
11608 changed files with 2644205 additions and 47 deletions

View File

@@ -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();
}
}
}

View 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();
}
}
}

View File

@@ -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();
}
}
}

View File

@@ -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();
}
}
}

View File

@@ -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();
}
}
}

View File

@@ -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);
}
}
}
}

View File

@@ -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();
}
}
}

View File

@@ -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);
}
}
}
}

View File

@@ -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();
}
}
}

View File

@@ -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);
}
}
}
}

View File

@@ -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();
}
}
}

View 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();
}
}
}

View File

@@ -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();
}
}
}

View File

@@ -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();
}
}
}

View File

@@ -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();
}
}
}

View File

@@ -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);
}
}
}
}

View File

@@ -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();
}
}
}

View File

@@ -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();
}
}
}