fix: Fixes speed issues (#959)

- [X] Removes all speeds in constructors since _they aren't used anyways_.
- [X] Adjusted timers according to the _time transformations in RunUO_.
This commit is contained in:
Kamron Batman 2022-03-15 10:18:27 -07:00 committed by GitHub
parent 16c4268b54
commit 1ec3636951
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
73 changed files with 755 additions and 1511 deletions

View file

@ -0,0 +1,139 @@
[
{
"name": "Slow",
"active": 0.6,
"passive": 1.2,
"types": [
"AntLion", "ArcticOgreLord", "BogThing",
"Bogle", "BoneKnight", "EarthElemental",
"Ettin", "FrostOoze", "FrostTroll",
"GazerLarva", "Ghoul", "Golem",
"HeadlessOne", "Jwilson", "Mummy",
"Ogre", "OgreLord", "PlagueBeast",
"Quagmire", "Rat", "RottingCorpse",
"SewerRat", "Skeleton", "Slime",
"Zombie", "Walrus", "RestlessSoul",
"CrystalElemental", "DarknightCreeper", "MoundOfMaggots",
"Juggernaut", "Yamandon", "Serado"
]
},
{
"name": "Fast",
"active": 0.4,
"passive": 0.8,
"types": [
"LordOaks", "Silvani", "AirElemental",
"AncientWyrm", "Balron", "BladeSpirits",
"DreadSpider", "Efreet", "EtherealWarrior",
"Lich", "Nightmare", "OphidianArchmage",
"OphidianMage", "OphidianWarrior", "OphidianMatriarch",
"OphidianKnight", "PoisonElemental", "Revenant",
"SandVortex", "SavageRider", "SavageShaman",
"SnowElemental", "WhiteWyrm", "Wisp",
"DemonKnight", "GiantBlackWidow", "SummonedAirElemental",
"LesserHiryu", "Hiryu", "LadyOfTheSnow",
"RaiJu", "Ronin", "RuneBeetle",
"Changeling", "LadyJennifyr", "LadyMarai", "MasterJonath",
"MasterMikael", "MasterTheophilus", "RedDeath",
"SirPatrick", "Miasma", "Rend",
"Grobu", "Gnaw", "Guile",
"Irk", "Spite", "LadyLissith",
"LadySabrix", "Malefic", "Silk",
"Virulent", "SeaHorse"
]
},
{
"name": "Very Fast",
"active": 0.35,
"passive": 0.7,
"types": [
"Barracoon", "Mephitis", "Neira",
"Rikktor", "Semidar", "EnergyVortex",
"EliteNinja", "Pixie", "SilverSerpent",
"VorpalBunny", "FleshRenderer", "KhaldunRevenant",
"FactionDragoon", "FactionKnight", "FactionPaladin",
"FactionHenchman", "FactionMercenary", "FactionNecromancer",
"FactionSorceress", "FactionWizard", "FactionBerserker",
"FactionPaladin", "Leviathan", "FireBeetle",
"FanDancer", "FactionDeathKnight"
]
},
{
"name": "Medium",
"active": 0.5,
"passive": 1.0,
"types": [
"AcidElemental", "AgapiteElemental", "Alligator",
"AncientLich", "Betrayer", "Bird",
"BlackBear", "BlackSolenInfiltratorQueen", "BlackSolenInfiltratorWarrior",
"BlackSolenQueen", "BlackSolenWarrior", "BlackSolenWorker",
"BloodElemental", "Boar", "Bogling",
"BoneMagi", "Brigand", "BronzeElemental",
"BrownBear", "Bull", "BullFrog",
"Cat", "Centaur", "ChaosDaemon",
"Chicken", "GolemController", "CopperElemental",
"CopperElemental", "Cougar", "Cow",
"Cyclops", "Daemon", "DeepSeaSerpent",
"DesertOstard", "DireWolf", "Dog",
"Dolphin", "Dragon", "Drake",
"DullCopperElemental", "Eagle", "ElderGazer",
"EvilMage", "EvilMageLord", "Executioner",
"Savage", "FireElemental", "FireGargoyle",
"FireSteed", "ForestOstard", "FrenziedOstard",
"FrostSpider", "Gargoyle", "Gazer",
"IceSerpent", "GiantRat", "GiantSerpent",
"GiantSpider", "GiantToad", "Goat",
"GoldenElemental", "Gorilla", "GreatHart",
"GreyWolf", "GrizzlyBear", "Guardian",
"Harpy", "Harrower", "HellHound",
"Hind", "HordeMinion", "Horse",
"Horse", "IceElemental", "IceFiend",
"IceSnake", "Imp", "JackRabbit",
"Kirin", "Kraken", "PredatorHellCat",
"LavaLizard", "LavaSerpent", "LavaSnake",
"Lizardman", "Llama", "Mongbat",
"StrongMongbat", "MountainGoat", "Orc",
"OrcBomber", "OrcBrute", "OrcCaptain",
"OrcishLord", "OrcishMage", "PackHorse",
"PackLlama", "Panther", "Pig",
"PlagueSpawn", "PolarBear", "Rabbit",
"Ratman", "RatmanArcher", "RatmanMage",
"RedSolenInfiltratorQueen", "RedSolenInfiltratorWarrior", "RedSolenQueen",
"RedSolenWarrior", "RedSolenWorker", "RidableLlama",
"Ridgeback", "Scorpion", "SeaSerpent",
"SerpentineDragon", "Shade", "ShadowIronElemental",
"ShadowWisp", "ShadowWyrm", "Sheep",
"SilverSteed", "SkeletalDragon", "SkeletalMage",
"SkeletalMount", "HellCat", "Snake",
"SnowLeopard", "SpectralArmour", "Spectre",
"StoneGargoyle", "StoneHarpy", "SwampDragon",
"ScaledSwampDragon", "SwampTentacle", "TerathanAvenger",
"TerathanDrone", "TerathanMatriarch", "TerathanWarrior",
"TimberWolf", "Titan", "Troll",
"Unicorn", "ValoriteElemental", "VeriteElemental",
"CoMWarHorse", "MinaxWarHorse", "SLWarHorse",
"TBWarHorse", "WaterElemental", "WhippingVine",
"WhiteWolf", "Wraith", "Wyvern",
"KhaldunZealot", "KhaldunSummoner", "SavageRidgeback",
"LichLord", "SkeletalKnight", "SummonedDaemon",
"SummonedEarthElemental", "SummonedWaterElemental", "SummonedFireElemental",
"MeerWarrior", "MeerEternal", "MeerMage",
"MeerCaptain", "JukaLord", "JukaMage",
"JukaWarrior", "AbysmalHorror", "BoneDemon",
"Devourer", "FleshGolem", "Gibberling",
"GoreFiend", "Impaler", "PatchworkSkeleton",
"Ravager", "ShadowKnight", "SkitteringHopper",
"Treefellow", "VampireBat", "WailingBanshee",
"WandererOfTheVoid", "Cursed", "GrimmochDrummel",
"LysanderGathenwale", "MorgBergen", "ShadowFiend",
"SpectralArmour", "TavaraSewel", "ArcaneDaemon",
"Doppleganger", "EnslavedGargoyle", "ExodusMinion",
"ExodusOverseer", "GargoyleDestroyer", "GargoyleEnforcer",
"Moloch", "BakeKitsune", "DeathwatchBeetleHatchling",
"Kappa", "KazeKemono", "DeathwatchBeetle",
"TsukiWolf", "YomotsuElder", "YomotsuPriest",
"YomotsuWarrior", "RevenantLion", "Oni",
"Gaman", "Crane", "Beetle"
]
}
]

View file

@ -1019,6 +1019,21 @@ namespace Server
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool RandomBool() => RandomSources.Source.NextBool();
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static double RandomMinMax(double min, double max)
{
if (min > max)
{
(min, max) = (max, min);
}
else if (min == max)
{
return min;
}
return min + RandomSources.Source.NextDouble() * (max - min);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static uint RandomMinMax(uint min, uint max)
{

View file

@ -97,7 +97,7 @@ namespace Server.Engines.MLQuests.Definitions
{
[Constructible]
public Ben()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
: base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the Apprentice Necromancer";
Body = 0x190;
@ -107,6 +107,7 @@ namespace Server.Engines.MLQuests.Definitions
FacialHairItemID = 0x204C;
FacialHairHue = 0x463;
SetSpeed(0.5, 2.0);
InitStats(100, 100, 25);
AddItem(new Backpack());
@ -142,13 +143,13 @@ namespace Server.Engines.MLQuests.Definitions
public class Frederic : BaseCreature
{
[Constructible]
public Frederic()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Frederic() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Body = 0x1A;
Hue = 0x455;
Frozen = true;
SetSpeed(0.5, 2.0);
InitStats(100, 100, 25);
}
@ -178,14 +179,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Leon : BaseCreature
{
[Constructible]
public Leon()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Leon() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the Alchemist";
Race = Race.Human;
Body = 0x190;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2.0);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -221,8 +223,7 @@ namespace Server.Engines.MLQuests.Definitions
public class Andros : BaseCreature
{
[Constructible]
public Andros()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Andros() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the Blacksmith";
Body = 0x190;
@ -232,6 +233,7 @@ namespace Server.Engines.MLQuests.Definitions
HairItemID = 0x2049;
HairHue = 0x45E;
SetSpeed(0.5, 2.0);
InitStats(100, 100, 25);
AddItem(new Backpack());

View file

@ -69,14 +69,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Kia : BaseCreature
{
[Constructible]
public Kia()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Kia() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the student";
Race = Race.Human;
Body = 0x191;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -113,14 +114,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Emerillo : BaseCreature
{
[Constructible]
public Emerillo()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Emerillo() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the cook";
Race = Race.Human;
Body = 0x190;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -165,14 +167,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Nythalia : BaseCreature
{
[Constructible]
public Nythalia()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Nythalia() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the student";
Race = Race.Human;
Body = 0x191;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);

View file

@ -108,14 +108,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Aurelia : BaseCreature
{
[Constructible]
public Aurelia()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Aurelia() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the Architect's Daughter";
Race = Race.Human;
Body = 0x191;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -162,12 +163,13 @@ namespace Server.Engines.MLQuests.Definitions
public class SkeletonOfSzandor : BaseCreature
{
[Constructible]
public SkeletonOfSzandor()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public SkeletonOfSzandor() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the Late Architect";
Hue = 0x83F2; // TODO: Random human hue? Why???
Body = 0x32;
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
}

View file

@ -2004,14 +2004,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Saril : BaseCreature
{
[Constructible]
public Saril()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Saril() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the guard";
Race = Race.Elf;
Body = 0x25E;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -2070,14 +2071,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Cailla : BaseCreature
{
[Constructible]
public Cailla()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Cailla() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the guard";
Race = Race.Elf;
Body = 0x25E;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -2137,14 +2139,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Tamm : BaseCreature
{
[Constructible]
public Tamm()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Tamm() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the guard";
Race = Race.Elf;
Body = 0x25D;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -2202,14 +2205,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Landy : BaseCreature
{
[Constructible]
public Landy()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Landy() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the soil nurturer";
Race = Race.Elf;
Body = 0x25D;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -2268,14 +2272,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Alejaha : BaseCreature
{
[Constructible]
public Alejaha()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Alejaha() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the wise";
Race = Race.Elf;
Body = 0x25E;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -2333,14 +2338,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Mielan : BaseCreature
{
[Constructible]
public Mielan()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Mielan() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the arcanist";
Race = Race.Elf;
Body = 0x25D;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -2396,14 +2402,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Ciala : BaseCreature
{
[Constructible]
public Ciala()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Ciala() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the arborist";
Race = Race.Elf;
Body = 0x25E;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -2467,14 +2474,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Aniel : BaseCreature
{
[Constructible]
public Aniel()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Aniel() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the arborist";
Race = Race.Elf;
Body = 0x25D;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -2530,14 +2538,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Aulan : BaseCreature
{
[Constructible]
public Aulan()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Aulan() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the expeditionist";
Race = Race.Elf;
Body = 0x25D;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -2607,14 +2616,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Brinnae : BaseCreature
{
[Constructible]
public Brinnae()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Brinnae() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the wise";
Race = Race.Elf;
Body = 0x25E;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -2666,14 +2676,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Caelas : BaseCreature
{
[Constructible]
public Caelas()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Caelas() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the wise";
Race = Race.Elf;
Body = 0x25D;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -2729,14 +2740,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Clehin : BaseCreature
{
[Constructible]
public Clehin()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Clehin() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the soil nurturer";
Race = Race.Elf;
Body = 0x25E;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -2790,14 +2802,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Cloorne : BaseCreature
{
[Constructible]
public Cloorne()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Cloorne() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the expeditionist";
Race = Race.Elf;
Body = 0x25D;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -2866,14 +2879,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Salaenih : BaseCreature
{
[Constructible]
public Salaenih()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Salaenih() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the expeditionist";
Race = Race.Elf;
Body = 0x25E;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -2949,14 +2963,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Vilo : BaseCreature
{
[Constructible]
public Vilo()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Vilo() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the guard";
Race = Race.Elf;
Body = 0x25D;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -3016,14 +3031,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Tholef : BaseCreature
{
[Constructible]
public Tholef()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Tholef() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the grape tender";
Race = Race.Elf;
Body = 0x25D;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -3085,14 +3101,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Tillanil : BaseCreature
{
[Constructible]
public Tillanil()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Tillanil() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the grape tender";
Race = Race.Elf;
Body = 0x25E;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -3147,14 +3164,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Waelian : BaseCreature
{
[Constructible]
public Waelian()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Waelian() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the trinket weaver";
Race = Race.Elf;
Body = 0x25D;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -3216,14 +3234,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Sleen : BaseCreature
{
[Constructible]
public Sleen()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Sleen() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the trinket weaver";
Race = Race.Elf;
Body = 0x25E;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -3279,14 +3298,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Unoelil : BaseCreature
{
[Constructible]
public Unoelil()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Unoelil() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the bark weaver";
Race = Race.Elf;
Body = 0x25E;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -3341,14 +3361,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Anolly : BaseCreature
{
[Constructible]
public Anolly()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Anolly() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the bark weaver";
Race = Race.Elf;
Body = 0x25D;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -3390,14 +3411,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Jusae : BaseCreature
{
[Constructible]
public Jusae()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Jusae() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the bowcrafter";
Race = Race.Elf;
Body = 0x25D;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -3462,14 +3484,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Cillitha : BaseCreature
{
[Constructible]
public Cillitha()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Cillitha() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the bowcrafter";
Race = Race.Elf;
Body = 0x25E;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -3524,14 +3547,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Lohn : BaseCreature
{
[Constructible]
public Lohn()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Lohn() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the metal weaver";
Race = Race.Elf;
Body = 0x25D;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -3593,14 +3617,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Olla : BaseCreature
{
[Constructible]
public Olla()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Olla() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the metal weaver";
Race = Race.Elf;
Body = 0x25E;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -3657,14 +3682,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Thallary : BaseCreature
{
[Constructible]
public Thallary()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Thallary() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the cloth weaver";
Race = Race.Elf;
Body = 0x25D;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -3720,14 +3746,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Ahie : BaseCreature
{
[Constructible]
public Ahie()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Ahie() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the cloth weaver";
Race = Race.Elf;
Body = 0x25E;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -3782,14 +3809,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Tyeelor : BaseCreature
{
[Constructible]
public Tyeelor()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Tyeelor() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the expeditionist";
Race = Race.Elf;
Body = 0x25D;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -3845,14 +3873,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Athailon : BaseCreature
{
[Constructible]
public Athailon()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Athailon() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the expeditionist";
Race = Race.Elf;
Body = 0x25E;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -3906,14 +3935,15 @@ namespace Server.Engines.MLQuests.Definitions
public class ElderTaellia : BaseCreature
{
[Constructible]
public ElderTaellia()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public ElderTaellia() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the wise";
Race = Race.Elf;
Body = 0x25E;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -3950,14 +3980,15 @@ namespace Server.Engines.MLQuests.Definitions
public class ElderMallew : BaseCreature
{
[Constructible]
public ElderMallew()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public ElderMallew() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the wise";
Race = Race.Elf;
Body = 0x25D;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -4007,14 +4038,15 @@ namespace Server.Engines.MLQuests.Definitions
public class ElderAbbein : BaseCreature
{
[Constructible]
public ElderAbbein()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public ElderAbbein() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the wise";
Race = Race.Elf;
Body = 0x25E;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -4050,14 +4082,15 @@ namespace Server.Engines.MLQuests.Definitions
public class ElderVicaie : BaseCreature
{
[Constructible]
public ElderVicaie()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public ElderVicaie() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the wise";
Race = Race.Elf;
Body = 0x25E;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -4098,14 +4131,15 @@ namespace Server.Engines.MLQuests.Definitions
public class ElderJothan : BaseCreature
{
[Constructible]
public ElderJothan()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public ElderJothan() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the wise";
Race = Race.Elf;
Body = 0x25D;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -4143,14 +4177,15 @@ namespace Server.Engines.MLQuests.Definitions
public class ElderAlethanian : BaseCreature
{
[Constructible]
public ElderAlethanian()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public ElderAlethanian() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the wise";
Race = Race.Elf;
Body = 0x25E;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -4188,14 +4223,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Rebinil : BaseCreature
{
[Constructible]
public Rebinil()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Rebinil() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the healer";
Race = Race.Elf;
Body = 0x25E;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -4231,14 +4267,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Aluniol : BaseCreature
{
[Constructible]
public Aluniol()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Aluniol() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the healer";
Race = Race.Elf;
Body = 0x25D;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -4274,14 +4311,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Olaeni : BaseCreature
{
[Constructible]
public Olaeni()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Olaeni() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the thaumaturgist";
Race = Race.Elf;
Body = 0x25E;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -4318,14 +4356,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Bolaevin : BaseCreature
{
[Constructible]
public Bolaevin()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Bolaevin() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the arcanist";
Race = Race.Elf;
Body = 0x25D;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -4368,14 +4407,15 @@ namespace Server.Engines.MLQuests.Definitions
public class LorekeeperAneen : BaseCreature
{
[Constructible]
public LorekeeperAneen()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public LorekeeperAneen() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the keeper of tradition";
Race = Race.Elf;
Body = 0x25D;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -4411,14 +4451,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Daelas : BaseCreature
{
[Constructible]
public Daelas()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Daelas() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the arborist";
Race = Race.Elf;
Body = 0x25D;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -4463,14 +4504,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Alelle : BaseCreature
{
[Constructible]
public Alelle()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Alelle() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the arborist";
Race = Race.Elf;
Body = 0x25E;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -4519,14 +4561,15 @@ namespace Server.Engines.MLQuests.Definitions
public class LorekeeperNillaen : BaseCreature
{
[Constructible]
public LorekeeperNillaen()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public LorekeeperNillaen() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the keeper of tradition";
Race = Race.Elf;
Body = 0x25E;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -4570,14 +4613,15 @@ namespace Server.Engines.MLQuests.Definitions
public class LorekeeperRyal : BaseCreature
{
[Constructible]
public LorekeeperRyal()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public LorekeeperRyal() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the keeper of tradition";
Race = Race.Elf;
Body = 0x25D;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -4634,14 +4678,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Braen : BaseCreature
{
[Constructible]
public Braen()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Braen() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the thaumaturgist";
Race = Race.Elf;
Body = 0x25D;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -4689,14 +4734,15 @@ namespace Server.Engines.MLQuests.Definitions
public class ElderAcob : BaseCreature
{
[Constructible]
public ElderAcob()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public ElderAcob() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the wise";
Race = Race.Elf;
Body = 0x25D;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -4743,14 +4789,15 @@ namespace Server.Engines.MLQuests.Definitions
public class LorekeeperCalendor : BaseCreature
{
[Constructible]
public LorekeeperCalendor()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public LorekeeperCalendor() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the keeper of tradition";
Race = Race.Elf;
Body = 0x25E;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -4798,14 +4845,15 @@ namespace Server.Engines.MLQuests.Definitions
public class LorekeeperSiarra : BaseCreature
{
[Constructible]
public LorekeeperSiarra()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public LorekeeperSiarra() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the keeper of tradition";
Race = Race.Elf;
Body = 0x25E;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);

View file

@ -278,12 +278,12 @@ namespace Server.Engines.MLQuests.Definitions
public class Enigma : BaseCreature
{
[Constructible]
public Enigma()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Enigma() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Body = 788;
BaseSoundID = 0x3EE;
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
}
@ -616,12 +616,13 @@ namespace Server.Engines.MLQuests.Definitions
public class Sledge : BaseCreature
{
[Constructible]
public Sledge()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Sledge() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the Versatile";
Body = 400;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
AddItem(new Tunic(Utility.RandomNeutralHue()));
@ -671,12 +672,13 @@ namespace Server.Engines.MLQuests.Definitions
public class Patricus : BaseCreature
{
[Constructible]
public Patricus()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Patricus() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the Trader";
Body = 400;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
AddItem(new FancyShirt(Utility.RandomNeutralHue()));
@ -713,13 +715,14 @@ namespace Server.Engines.MLQuests.Definitions
public class Belulah : BaseCreature
{
[Constructible]
public Belulah()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Belulah() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the scorned";
Female = true;
Body = 401;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);

View file

@ -55,14 +55,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Evan : BaseCreature
{
[Constructible]
public Evan()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Evan() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the Beggar";
Race = Race.Human;
Body = 0x190;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -98,14 +99,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Regina : BaseCreature
{
[Constructible]
public Regina()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Regina() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the Noble";
Race = Race.Human;
Body = 0x191;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);

View file

@ -174,12 +174,13 @@ namespace Server.Engines.MLQuests.Definitions
public class GrandpaCharley : BaseCreature
{
[Constructible]
public GrandpaCharley()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public GrandpaCharley() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the farmer";
Body = 400;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
var hairHue = 0x3B2 + Utility.Random(2);
@ -226,14 +227,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Jelrice : BaseCreature
{
[Constructible]
public Jelrice()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Jelrice() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the trader";
Race = Race.Human;
Body = 0x191;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -276,14 +278,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Yorus : BaseCreature
{
[Constructible]
public Yorus()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Yorus() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the tinker";
Race = Race.Human;
Body = 0x190;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);

View file

@ -27,14 +27,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Drithen : BaseCreature
{
[Constructible]
public Drithen()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Drithen() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the Fierce";
Race = Race.Human;
Body = 0x190;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
AddItem(new Backpack());

View file

@ -195,14 +195,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Aernya : BaseCreature
{
[Constructible]
public Aernya()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Aernya() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the Mistress of Admissions";
Race = Race.Human;
Body = 0x191;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -241,14 +242,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Gorrow : BaseCreature
{
[Constructible]
public Gorrow()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Gorrow() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the Mayor";
Race = Race.Human;
Body = 0x190;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
AddItem(new Backpack());
@ -298,14 +300,15 @@ namespace Server.Engines.MLQuests.Definitions
public class MasterGnosos : BaseCreature
{
[Constructible]
public MasterGnosos()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public MasterGnosos() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the necromancer";
Race = Race.Human;
Body = 0x190;
Female = false;
Hue = 0x83E8;
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
HairItemID = 0x2049;

View file

@ -654,6 +654,7 @@ namespace Server.Engines.MLQuests.Definitions
FacialHairItemID = 0x204D;
FacialHairHue = 0x47D;
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
SetSkill(SkillName.Anatomy, 120.0);
@ -708,8 +709,7 @@ namespace Server.Engines.MLQuests.Definitions
public class Dimethro : BaseCreature
{
[Constructible]
public Dimethro()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Dimethro() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the Wrestling Instructor";
Body = 0x190;
@ -719,6 +719,7 @@ namespace Server.Engines.MLQuests.Definitions
FacialHairItemID = 0x204D;
FacialHairHue = 0x455;
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
SetSkill(SkillName.EvalInt, 120.0);
@ -767,8 +768,7 @@ namespace Server.Engines.MLQuests.Definitions
public class Churchill : BaseCreature
{
[Constructible]
public Churchill()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Churchill() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the Mace Fighting Instructor";
Body = 0x190;
@ -776,6 +776,7 @@ namespace Server.Engines.MLQuests.Definitions
HairItemID = 0x203C;
HairHue = 0x455;
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
SetSkill(SkillName.Anatomy, 120.0);
@ -854,6 +855,7 @@ namespace Server.Engines.MLQuests.Definitions
HairHue = 0x47D;
Female = true;
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
SetSkill(SkillName.Anatomy, 120.0);
@ -927,8 +929,7 @@ namespace Server.Engines.MLQuests.Definitions
public class Recaro : BaseCreature
{
[Constructible]
public Recaro()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Recaro() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the Fencer Instructor";
Body = 0x190;
@ -938,6 +939,7 @@ namespace Server.Engines.MLQuests.Definitions
FacialHairItemID = 0x204D;
FacialHairHue = 0x455;
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
SetSkill(SkillName.Anatomy, 120.0);
@ -1011,8 +1013,7 @@ namespace Server.Engines.MLQuests.Definitions
public class AldenArmstrong : BaseCreature
{
[Constructible]
public AldenArmstrong()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public AldenArmstrong() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the Tactics Instructor";
Body = 0x190;
@ -1020,6 +1021,7 @@ namespace Server.Engines.MLQuests.Definitions
HairItemID = 0x203B;
HairHue = 0x44E;
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
SetSkill(SkillName.Anatomy, 120.0);
@ -1076,8 +1078,7 @@ namespace Server.Engines.MLQuests.Definitions
public class Jockles : BaseCreature
{
[Constructible]
public Jockles()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Jockles() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the Swordsmanship Instructor";
Body = 0x190;
@ -1085,6 +1086,7 @@ namespace Server.Engines.MLQuests.Definitions
HairItemID = 0x203C;
HairHue = 0x8A7;
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
SetSkill(SkillName.Anatomy, 120.0);
@ -1137,14 +1139,14 @@ namespace Server.Engines.MLQuests.Definitions
public class TylAriadne : BaseCreature
{
[Constructible]
public TylAriadne()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public TylAriadne() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the Parrying Instructor";
Body = 0x190;
Hue = 0x8374;
HairItemID = 0;
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
SetSkill(SkillName.Anatomy, 120.0);
@ -1218,8 +1220,7 @@ namespace Server.Engines.MLQuests.Definitions
public class Alefian : BaseCreature
{
[Constructible]
public Alefian()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Alefian() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the Resisting Spells Instructor";
Body = 0x190;
@ -1227,6 +1228,7 @@ namespace Server.Engines.MLQuests.Definitions
HairItemID = 0x203D;
HairHue = 0x457;
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
SetSkill(SkillName.EvalInt, 120.0);
@ -1274,8 +1276,7 @@ namespace Server.Engines.MLQuests.Definitions
public class Gustar : BaseCreature
{
[Constructible]
public Gustar()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Gustar() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the Meditation Instructor";
Body = 0x190;
@ -1283,6 +1284,7 @@ namespace Server.Engines.MLQuests.Definitions
HairItemID = 0x203B;
HairHue = 0x455;
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
SetSkill(SkillName.EvalInt, 120.0);
@ -1356,8 +1358,7 @@ namespace Server.Engines.MLQuests.Definitions
public class Jillian : BaseCreature
{
[Constructible]
public Jillian()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Jillian() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the Inscription Instructor";
Body = 0x191;
@ -1366,6 +1367,7 @@ namespace Server.Engines.MLQuests.Definitions
HairItemID = 0x203D;
HairHue = 0x455;
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
SetSkill(SkillName.EvalInt, 120.0);
@ -1413,8 +1415,7 @@ namespace Server.Engines.MLQuests.Definitions
public class Kaelynna : BaseCreature
{
[Constructible]
public Kaelynna()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Kaelynna() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the Magery Instructor";
Body = 0x191;
@ -1423,6 +1424,7 @@ namespace Server.Engines.MLQuests.Definitions
HairItemID = 0x203C;
HairHue = 0x47D;
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
SetSkill(SkillName.EvalInt, 120.0);
@ -1470,8 +1472,7 @@ namespace Server.Engines.MLQuests.Definitions
public class Mithneral : BaseCreature
{
[Constructible]
public Mithneral()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Mithneral() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the Evaluating Intelligence Instructor";
Body = 0x190;
@ -1479,6 +1480,7 @@ namespace Server.Engines.MLQuests.Definitions
HairItemID = 0x203C;
HairHue = 0x455;
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
SetSkill(SkillName.EvalInt, 120.0);
@ -1540,6 +1542,7 @@ namespace Server.Engines.MLQuests.Definitions
HairItemID = 0x203D;
HairHue = 0x46C;
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
SetSkill(SkillName.ArmsLore, 120.0);
@ -1591,8 +1594,7 @@ namespace Server.Engines.MLQuests.Definitions
public class AndreasVesalius : BaseCreature
{
[Constructible]
public AndreasVesalius()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public AndreasVesalius() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the Anatomy Instructor";
Body = 0x190;
@ -1602,6 +1604,7 @@ namespace Server.Engines.MLQuests.Definitions
FacialHairItemID = 0x203E;
FacialHairHue = 0x477;
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
SetSkill(SkillName.Anatomy, 120.0);
@ -1651,8 +1654,7 @@ namespace Server.Engines.MLQuests.Definitions
public class Avicenna : BaseCreature
{
[Constructible]
public Avicenna()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Avicenna() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the Healing Instructor";
Body = 0x190;
@ -1660,6 +1662,7 @@ namespace Server.Engines.MLQuests.Definitions
HairItemID = 0x203B;
HairHue = 0x477;
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
SetSkill(SkillName.Anatomy, 120.0);
@ -1708,8 +1711,7 @@ namespace Server.Engines.MLQuests.Definitions
public class SarsmeaSmythe : BaseCreature
{
[Constructible]
public SarsmeaSmythe()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public SarsmeaSmythe() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the Focus Instructor";
Body = 0x191;
@ -1718,6 +1720,7 @@ namespace Server.Engines.MLQuests.Definitions
HairItemID = 0x203C;
HairHue = 0x456;
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
SetSkill(SkillName.Anatomy, 120.0);
@ -1840,12 +1843,12 @@ namespace Server.Engines.MLQuests.Definitions
public class Chiyo : BaseCreature
{
[Constructible]
public Chiyo()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Chiyo() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the Hiding Instructor";
Body = 0xF7;
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
SetSkill(SkillName.Hiding, 120.0);
@ -1889,8 +1892,7 @@ namespace Server.Engines.MLQuests.Definitions
public class Jun : BaseCreature
{
[Constructible]
public Jun()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Jun() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the Stealth Instructor";
Body = 0x190;
@ -1898,6 +1900,7 @@ namespace Server.Engines.MLQuests.Definitions
HairItemID = 0x203B;
HairHue = 0x455;
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
SetSkill(SkillName.Hiding, 120.0);
@ -1949,8 +1952,7 @@ namespace Server.Engines.MLQuests.Definitions
public class Walker : BaseCreature
{
[Constructible]
public Walker()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Walker() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the Tracking Instructor";
Body = 0x190;
@ -1960,6 +1962,7 @@ namespace Server.Engines.MLQuests.Definitions
FacialHairItemID = 0x204B;
FacialHairHue = 0x47D;
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
SetSkill(SkillName.Hiding, 120.0);
@ -2097,6 +2100,7 @@ namespace Server.Engines.MLQuests.Definitions
HairItemID = 0x203D;
HairHue = 0x457;
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
SetSkill(SkillName.Magery, 120.0);
@ -2176,6 +2180,7 @@ namespace Server.Engines.MLQuests.Definitions
HairItemID = 0x203C;
HairHue = 0x455;
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
SetSkill(SkillName.Magery, 120.0);
@ -2225,8 +2230,7 @@ namespace Server.Engines.MLQuests.Definitions
public class JacobWaltz : BaseCreature
{
[Constructible]
public JacobWaltz()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public JacobWaltz() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the Miner Instructor";
Body = 0x190;
@ -2236,6 +2240,7 @@ namespace Server.Engines.MLQuests.Definitions
FacialHairItemID = 0x204D;
FacialHairHue = 0x44E;
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
SetSkill(SkillName.ArmsLore, 120.0);
@ -2296,6 +2301,7 @@ namespace Server.Engines.MLQuests.Definitions
HairItemID = 0x203B;
HairHue = 0x47B;
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
SetSkill(SkillName.ArmsLore, 120.0);

View file

@ -262,14 +262,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Andric : BaseCreature
{
[Constructible]
public Andric()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Andric() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the archer trainer";
Race = Race.Human;
Body = 0x190;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -340,14 +341,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Kashiel : BaseCreature
{
[Constructible]
public Kashiel()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Kashiel() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the archer";
Race = Race.Human;
Body = 0x191;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -402,14 +404,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Asandos : BaseCreature
{
[Constructible]
public Asandos()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Asandos() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the chef";
Race = Race.Human;
Body = 0x190;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -462,14 +465,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Clairesse : BaseCreature
{
[Constructible]
public Clairesse()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Clairesse() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the servant";
Race = Race.Human;
Body = 0x191;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -518,14 +522,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Gervis : BaseCreature
{
[Constructible]
public Gervis()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Gervis() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the blacksmith trainer";
Race = Race.Human;
Body = 0x190;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -586,14 +591,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Mugg : BaseCreature
{
[Constructible]
public Mugg()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Mugg() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the miner";
Race = Race.Human;
Body = 0x190;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -639,14 +645,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Lowel : BaseCreature
{
[Constructible]
public Lowel()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Lowel() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the carpenter";
Race = Race.Human;
Body = 0x190;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -697,14 +704,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Lyle : BaseCreature
{
[Constructible]
public Lyle()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Lyle() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the mage";
Race = Race.Human;
Body = 0x190;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -753,14 +761,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Nibbet : BaseCreature
{
[Constructible]
public Nibbet()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Nibbet() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the tinker";
Race = Race.Human;
Body = 0x190;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -798,14 +807,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Norton : BaseCreature
{
[Constructible]
public Norton()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Norton() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the fisher";
Race = Race.Human;
Body = 0x190;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -856,14 +866,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Sadrah : BaseCreature
{
[Constructible]
public Sadrah()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Sadrah() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the courier";
Race = Race.Human;
Body = 0x191;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -916,14 +927,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Hargrove : BaseCreature
{
[Constructible]
public Hargrove()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Hargrove() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the Lumberjack";
Race = Race.Human;
Body = 0x190;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);

View file

@ -762,13 +762,15 @@ namespace Server.Engines.MLQuests.Definitions
{
[Constructible]
public Beotham()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
: base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the bowcrafter";
Race = Race.Elf;
Body = 0x25D;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2.0);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -828,14 +830,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Danoel : BaseCreature
{
[Constructible]
public Danoel()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Danoel() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the metal weaver";
Race = Race.Elf;
Body = 0x25D;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2.0);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -886,14 +889,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Tallinin : BaseCreature
{
[Constructible]
public Tallinin()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Tallinin() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the cloth weaver";
Race = Race.Elf;
Body = 0x25E;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2.0);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -947,14 +951,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Tiana : BaseCreature
{
[Constructible]
public Tiana()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Tiana() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the guard";
Race = Race.Elf;
Body = 0x25E;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2.0);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -1018,14 +1023,15 @@ namespace Server.Engines.MLQuests.Definitions
public class LorekeeperOolua : BaseCreature
{
[Constructible]
public LorekeeperOolua()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public LorekeeperOolua() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the keeper of tradition";
Race = Race.Elf;
Body = 0x25E;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2.0);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -1075,14 +1081,15 @@ namespace Server.Engines.MLQuests.Definitions
public class LorekeeperRollarn : BaseCreature
{
[Constructible]
public LorekeeperRollarn()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public LorekeeperRollarn() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the keeper of tradition";
Race = Race.Elf;
Body = 0x25D;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2.0);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -1143,14 +1150,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Dallid : BaseCreature
{
[Constructible]
public Dallid()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Dallid() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the cook";
Race = Race.Elf;
Body = 0x25D;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2.0);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -1206,14 +1214,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Canir : BaseCreature
{
[Constructible]
public Canir()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Canir() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the thaumaturgist";
Race = Race.Elf;
Body = 0x25E;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2.0);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -1267,14 +1276,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Yellienir : BaseCreature
{
[Constructible]
public Yellienir()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Yellienir() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the bark weaver";
Race = Race.Elf;
Body = 0x25E;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2.0);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -1313,14 +1323,15 @@ namespace Server.Engines.MLQuests.Definitions
public class ElderOnallan : BaseCreature
{
[Constructible]
public ElderOnallan()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public ElderOnallan() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the wise";
Race = Race.Elf;
Body = 0x25D;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2.0);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);

View file

@ -493,14 +493,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Aeluva : BaseCreature
{
[Constructible]
public Aeluva()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2.0)
public Aeluva() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the arcanist";
Race = Race.Elf;
Female = true;
Body = 606;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2.0);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -552,13 +553,14 @@ namespace Server.Engines.MLQuests.Definitions
public class Koole : BaseCreature
{
[Constructible]
public Koole()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2.0)
public Koole() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the arcanist";
Race = Race.Elf;
Body = 605;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2.0);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -622,14 +624,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Synaeva : BaseCreature
{
[Constructible]
public Synaeva()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2.0)
public Synaeva() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the arcanist";
Race = Race.Elf;
Female = true;
Body = 606;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2.0);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -682,14 +685,15 @@ namespace Server.Engines.MLQuests.Definitions
public class ElderBrae : BaseCreature
{
[Constructible]
public ElderBrae()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2.0)
public ElderBrae() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the wise";
Race = Race.Elf;
Female = true;
Body = 606;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2.0);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);

View file

@ -98,14 +98,15 @@ namespace Server.Engines.MLQuests.Definitions
public class LorekeeperBroolol : BaseCreature
{
[Constructible]
public LorekeeperBroolol()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public LorekeeperBroolol() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the keeper of tradition";
Race = Race.Elf;
Body = 0x25E;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2.0);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);

View file

@ -83,14 +83,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Emilio : BaseCreature
{
[Constructible]
public Emilio()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Emilio() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the Tortured Artist";
Race = Race.Human;
Body = 0x190;
Female = false;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2.0);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);
@ -130,14 +131,15 @@ namespace Server.Engines.MLQuests.Definitions
public class Thalia : BaseCreature
{
[Constructible]
public Thalia()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public Thalia() : base(AIType.AI_Vendor, FightMode.None, 2)
{
Title = "the Bride";
Race = Race.Human;
Body = 0x191;
Female = true;
Hue = Race.RandomSkinHue();
SetSpeed(0.5, 2.0);
InitStats(100, 100, 25);
Utility.AssignRandomHair(this);

View file

@ -12,9 +12,9 @@ namespace Server.Engines.MLQuests.Mobiles
{
private InternalTimer m_Timer;
public DoneQuestCollector()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public DoneQuestCollector() : base(AIType.AI_Vendor, FightMode.None, 2)
{
SetSpeed(0.5, 2.0);
}
public DoneQuestCollector(Serial serial)

View file

@ -1037,7 +1037,7 @@ namespace Server.Mobiles
public virtual bool Obey()
{
var shouldObey = !m_Mobile.Deleted && m_Mobile.ControlOrder switch
return !m_Mobile.Deleted && m_Mobile.ControlOrder switch
{
OrderType.None => DoOrderNone(),
OrderType.Come => DoOrderCome(),
@ -1054,15 +1054,6 @@ namespace Server.Mobiles
OrderType.Transfer => DoOrderTransfer(),
_ => false
};
if (shouldObey)
{
// TODO: This might cause the movement timer to reset too often if someone is spamming commands.
// Test this thoroughly.
m_Mobile.ResetSpeeds();
}
return shouldObey;
}
public virtual void OnCurrentOrderChanged()
@ -1377,6 +1368,10 @@ namespace Server.Mobiles
{
m_Mobile.CurrentSpeed = 0.1;
}
else if (m_Mobile.CurrentSpeed == m_Mobile.ActiveSpeed && m_Mobile.ControlTarget == m_Mobile.ControlMaster)
{
m_Mobile.CurrentSpeed = Math.Max(SpeedInfo.MinDelay, m_Mobile.CurrentSpeed * 0.5);
}
}
}
}
@ -1928,19 +1923,23 @@ namespace Server.Mobiles
public double TransformMoveDelay(double delay)
{
double max = m_Mobile.IsMonster ? SpeedInfo.MaxMonsterDelay : SpeedInfo.MaxDelay;
// Non-monsters in PVP combat (like pets) are penalized
if (!m_Mobile.IsMonster && m_Mobile.InActivePVPCombat() && delay <= SpeedInfo.MaxDelay)
{
delay += 0.4;
}
if (!m_Mobile.IsDeadPet && (m_Mobile.ReduceSpeedWithDamage || m_Mobile.IsSubdued))
{
double offset = m_Mobile.StamMax <= 0 ? 1.0 : m_Mobile.Stam / (double)m_Mobile.StamMax;
double offset = m_Mobile.StamMax <= 0 ? 1.0 : Math.Max(0, m_Mobile.Stam) / (double)m_Mobile.StamMax;
if (offset < 1.0)
{
delay += (max - delay) * (1.0 - offset);
delay += delay * (1.0 - offset);
}
}
return Math.Min(delay, max);
return delay;
}
public virtual bool CheckMove() => Core.TickCount - NextMove >= 0;
@ -2696,20 +2695,20 @@ namespace Server.Mobiles
{
if (!m_Timer.Running)
{
m_Timer.Delay = TimeSpan.Zero;
// We want to randomize the time at which the AI activates.
// This triggers when a mob is first created since it moves from the internal map to it's added location
// If we spawn lots of mobs, we don't want their AI synchronized exactly.
m_Timer.Delay = TimeSpan.FromMilliseconds(Utility.Random(48) * 8);
m_Timer.Start();
}
}
/*
* The mobile changed it speed, we must adjust the timer
* The mobile changed speeds, we must adjust the timer
*/
public virtual void OnCurrentSpeedChanged()
{
m_Timer.Stop();
m_Timer.Delay = TimeSpan.FromMilliseconds(Utility.Random(128) * 8);
m_Timer.Interval = TimeSpan.FromSeconds(Math.Max(0.0, m_Mobile.CurrentSpeed));
m_Timer.Start();
}
private class InternalEntry : ContextMenuEntry
@ -2989,14 +2988,12 @@ namespace Server.Mobiles
{
private readonly BaseAI m_Owner;
public AITimer(BaseAI owner)
: base(
TimeSpan.FromSeconds(Utility.Random(128) * 8),
TimeSpan.FromSeconds(Math.Max(0.0, owner.m_Mobile.CurrentSpeed))
)
public AITimer(BaseAI owner) : base(
TimeSpan.FromMilliseconds(Utility.Random(96) * 8),
TimeSpan.FromSeconds(Math.Max(0.0, owner.m_Mobile.CurrentSpeed))
)
{
m_Owner = owner;
m_Owner.m_NextDetectHidden = Core.TickCount;
}

View file

@ -0,0 +1,77 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.Json.Serialization;
using Server.Json;
using Server.Logging;
namespace Server;
public class LegacySpeedInfo
{
private static readonly ILogger logger = LogFactory.GetLogger(typeof(LegacySpeedInfo));
private const string _tablePath = "Data/npc-speeds.json";
private static Dictionary<Type, LegacySpeedEntry> m_Table;
public static bool Enabled { get; private set; }
public static bool GetSpeeds(Type type, out double activeSpeed, out double passiveSpeed)
{
if (!(Enabled && m_Table.TryGetValue(type, out var sp)))
{
activeSpeed = 0;
passiveSpeed = 0;
return false;
}
activeSpeed = sp.ActiveSpeed;
passiveSpeed = sp.PassiveSpeed;
return true;
}
public static void Configure()
{
Enabled = ServerConfiguration.GetSetting("movement.delay.useLegacySpeeds", !Core.HS);
if (!Enabled)
{
return;
}
var path = Path.Combine(Core.BaseDirectory, _tablePath);
if (!File.Exists(path))
{
logger.Warning($"Cannot find {path}. Disabling legacy speed system.");
Enabled = false;
return;
}
var speeds = JsonConfig.Deserialize<LegacySpeedEntry[]>(path);
m_Table = new Dictionary<Type, LegacySpeedEntry>();
for (var i = 0; i < speeds.Length; ++i)
{
var info = speeds[i];
foreach (var type in info.Types)
{
m_Table[type] = info;
}
}
}
public record LegacySpeedEntry
{
[JsonPropertyName("active")]
public double ActiveSpeed { get; init; }
[JsonPropertyName("passive")]
public double PassiveSpeed { get; init; }
[JsonPropertyName("types")]
public HashSet<Type> Types { get; init; }
}
}

View file

@ -72,12 +72,7 @@ namespace Server.Mobiles
return false;
}
if (ProcessTarget())
{
return true;
}
return base.Think();
return ProcessTarget() || base.Think();
}
public virtual double ScaleBySkill(double v, SkillName skill) => v * m_Mobile.Skills[skill].Value / 100;
@ -387,12 +382,9 @@ namespace Server.Mobiles
{
if (!SmartAI)
{
if (ScaleBySkill(DispelChance, SkillName.Magery) > Utility.RandomDouble())
{
return new DispelSpell(m_Mobile);
}
return ChooseSpell(toDispel);
return ScaleBySkill(DispelChance, SkillName.Magery) > Utility.RandomDouble()
? new DispelSpell(m_Mobile)
: ChooseSpell(toDispel);
}
var spell = CheckCastHealingSpell();
@ -743,13 +735,11 @@ namespace Server.Mobiles
if (m_Mobile.Hits < m_Mobile.HitsMax * 20 / 100)
{
// We are low on health, should we flee?
bool flee;
if (m_Mobile.Hits < c.Hits)
{
// We are more hurt than them
var diff = c.Hits - m_Mobile.Hits;
flee = Utility.Random(0, 100) > 10 + diff; // (10 + diff)% chance to flee
@ -772,7 +762,6 @@ namespace Server.Mobiles
if (m_Mobile.Spell == null && Core.TickCount - m_NextCastTime >= 0 && m_Mobile.InRange(c, Core.ML ? 10 : 12))
{
// We are ready to cast a spell
Spell spell;
var toDispel = FindDispelTarget(true);
@ -788,18 +777,18 @@ namespace Server.Mobiles
spell = DoDispel(toDispel);
}
else if (SmartAI && m_Combo != -1) // We are doing a spell combo
{
spell = DoCombo(c);
}
else if (SmartAI && c.Spell is HealSpell or GreaterHealSpell && !c.Poisoned
) // They have a heal spell out
{
spell = new PoisonSpell(m_Mobile);
}
else
{
spell = ChooseSpell(c);
spell = SmartAI switch
{
// We are doing a spell combo
true when m_Combo != -1 => DoCombo(c),
// They have a heal spell out
true when
!c.Poisoned &&
c.Spell is HealSpell or GreaterHealSpell => new PoisonSpell(m_Mobile),
_ => ChooseSpell(c)
};
}
// Now we have a spell picked

View file

@ -29,20 +29,19 @@ public static class SpeedInfo
public static void GetSpeeds(BaseCreature bc, out double activeSpeed, out double passiveSpeed)
{
// Legacy is used if it is enabled, and the type is in the table
if (LegacySpeedInfo.GetSpeeds(bc.GetType(), out activeSpeed, out passiveSpeed))
{
return;
}
var isMonster = bc.IsMonster;
var monsterDelay = isMonster || bc.InActivePVPCombat();
var maxDex = isMonster ? MaxMonsterDex : MaxDex;
var dex = Math.Clamp(bc.Dex, 25, maxDex);
double min = monsterDelay ? MinMonsterDelay : MinDelay;
double max = monsterDelay ? MaxMonsterDelay : MaxDelay;
if (bc.IsParagon)
{
min /= 2;
max = min + 0.5;
}
double min = isMonster ? MinMonsterDelay : MinDelay;
double max = isMonster ? MaxMonsterDelay : MaxDelay;
activeSpeed = Math.Max(max - (max - min) * ((double)dex / maxDex), min);
passiveSpeed = activeSpeed * 2;

View file

@ -11,16 +11,9 @@ namespace Server.Mobiles
private Mobile m_Rider;
public BaseMount(
string name, int bodyID, int itemID, AIType aiType, FightMode fightMode, int rangePerception,
int rangeFight, double activeSpeed = -1, double passiveSpeed = -1
) : base(
aiType,
fightMode,
rangePerception,
rangeFight,
activeSpeed,
passiveSpeed
)
string name, int bodyID, int itemID, AIType aiType, FightMode fightMode = FightMode.Closest,
int rangePerception = 10, int rangeFight = 1
) : base(aiType, fightMode, rangePerception, rangeFight)
{
Name = name;
Body = bodyID;

View file

@ -7,17 +7,7 @@ namespace Server.Mobiles
public class Beetle : BaseMount
{
[Constructible]
public Beetle(string name = "a giant beetle") : base(
name,
0x317,
0x3EBC,
AIType.AI_Melee,
FightMode.Closest,
10,
1,
0.25,
0.5
)
public Beetle(string name = "a giant beetle") : base(name, 0x317, 0x3EBC, AIType.AI_Melee)
{
SetStr(300);
SetDex(100);

View file

@ -3,17 +3,7 @@ namespace Server.Mobiles
public class DesertOstard : BaseMount
{
[Constructible]
public DesertOstard(string name = "a desert ostard") : base(
name,
0xD2,
0x3EA3,
AIType.AI_Animal,
FightMode.Aggressor,
10,
1,
0.2,
0.4
)
public DesertOstard(string name = "a desert ostard") : base(name, 0xD2, 0x3EA3, AIType.AI_Animal, FightMode.Aggressor)
{
BaseSoundID = 0x270;

View file

@ -13,8 +13,7 @@ namespace Server.Mobiles
private Mobile m_Rider;
[Constructible]
public EtherealMount(int itemID, int mountID)
: base(itemID)
public EtherealMount(int itemID, int mountID) : base(itemID)
{
m_MountedID = mountID;
m_RegularID = itemID;

View file

@ -6,17 +6,7 @@ namespace Server.Mobiles
public class FireSteed : BaseMount
{
[Constructible]
public FireSteed(string name = "a fire steed") : base(
name,
0xBE,
0x3E9E,
AIType.AI_Melee,
FightMode.Closest,
10,
1,
0.2,
0.4
)
public FireSteed(string name = "a fire steed") : base(name, 0xBE, 0x3E9E, AIType.AI_Melee)
{
BaseSoundID = 0xA8;

View file

@ -3,17 +3,7 @@ namespace Server.Mobiles
public class ForestOstard : BaseMount
{
[Constructible]
public ForestOstard(string name = "a forest ostard") : base(
name,
0xDB,
0x3EA5,
AIType.AI_Animal,
FightMode.Aggressor,
10,
1,
0.2,
0.4
)
public ForestOstard(string name = "a forest ostard") : base(name, 0xDB, 0x3EA5, AIType.AI_Animal, FightMode.Aggressor)
{
Hue = Utility.RandomSlimeHue() | 0x8000;

View file

@ -3,17 +3,7 @@ namespace Server.Mobiles
public class FrenziedOstard : BaseMount
{
[Constructible]
public FrenziedOstard(string name = "a frenzied ostard") : base(
name,
0xDA,
0x3EA4,
AIType.AI_Melee,
FightMode.Closest,
10,
1,
0.2,
0.4
)
public FrenziedOstard(string name = "a frenzied ostard") : base(name, 0xDA, 0x3EA4, AIType.AI_Melee)
{
Hue = Race.Human.RandomHairHue() | 0x8000;

View file

@ -3,17 +3,7 @@ namespace Server.Mobiles
public class HellSteed : BaseMount
{
[Constructible]
public HellSteed(string name = "a hellsteed") : base(
name,
793,
0x3EBB,
AIType.AI_Animal,
FightMode.Aggressor,
10,
1,
0.2,
0.4
)
public HellSteed(string name = "a hellsteed") : base(name, 793, 0x3EBB, AIType.AI_Animal, FightMode.Aggressor)
{
SetStats(this);
}

View file

@ -10,8 +10,7 @@ namespace Server.Mobiles
private static readonly Dictionary<Mobile, ExpireTimer> m_Table = new();
[Constructible]
public Hiryu()
: base("a hiryu", 243, 0x3E94, AIType.AI_Melee, FightMode.Closest, 10, 1)
public Hiryu() : base("a hiryu", 243, 0x3E94, AIType.AI_Melee)
{
Hue = GetHue();

View file

@ -17,17 +17,7 @@ namespace Server.Mobiles
};
[Constructible]
public Horse(string name = "a horse") : base(
name,
0xE2,
0x3EA0,
AIType.AI_Animal,
FightMode.Aggressor,
10,
1,
0.2,
0.4
)
public Horse(string name = "a horse") : base(name, 0xE2, 0x3EA0, AIType.AI_Animal, FightMode.Aggressor)
{
var random = Utility.Random(4);

View file

@ -7,7 +7,7 @@ namespace Server.Mobiles
public class Kirin : BaseMount
{
[Constructible]
public Kirin(string name = "a ki-rin") : base(name, 132, 0x3EAD, AIType.AI_Mage, FightMode.Evil, 10, 1)
public Kirin(string name = "a ki-rin") : base(name, 132, 0x3EAD, AIType.AI_Mage, FightMode.Evil)
{
BaseSoundID = 0x3C5;

View file

@ -10,8 +10,7 @@ namespace Server.Mobiles
private static readonly Dictionary<Mobile, ExpireTimer> m_Table = new();
[Constructible]
public LesserHiryu()
: base("a lesser hiryu", 243, 0x3E94, AIType.AI_Melee, FightMode.Closest, 10, 1)
public LesserHiryu() : base("a lesser hiryu", 243, 0x3E94, AIType.AI_Melee)
{
Hue = GetHue();

View file

@ -9,12 +9,7 @@ namespace Server.Mobiles
name,
0x74,
0x3EA7,
AIType.AI_Mage,
FightMode.Closest,
10,
1,
0.2,
0.4
AIType.AI_Mage
)
{
BaseSoundID = Core.AOS ? 0xA8 : 0x16A;

View file

@ -3,16 +3,7 @@ namespace Server.Mobiles
public class RidableLlama : BaseMount
{
[Constructible]
public RidableLlama(string name = "a ridable llama") : base(
name,
0xDC,
0x3EA6,
AIType.AI_Animal,
FightMode.Aggressor,
10,
1,
0.2,
0.4
public RidableLlama(string name = "a ridable llama") : base(name, 0xDC, 0x3EA6, AIType.AI_Animal, FightMode.Aggressor
)
{
BaseSoundID = 0x3F3;

View file

@ -3,17 +3,7 @@ namespace Server.Mobiles
public class Ridgeback : BaseMount
{
[Constructible]
public Ridgeback(string name = "a ridgeback") : base(
name,
187,
0x3EBA,
AIType.AI_Animal,
FightMode.Aggressor,
10,
1,
0.2,
0.4
)
public Ridgeback(string name = "a ridgeback") : base(name, 187, 0x3EBA, AIType.AI_Animal, FightMode.Aggressor)
{
BaseSoundID = 0x3F3;

View file

@ -3,17 +3,7 @@ namespace Server.Mobiles
public class SavageRidgeback : BaseMount
{
[Constructible]
public SavageRidgeback(string name = "a savage ridgeback") : base(
name,
188,
0x3EB8,
AIType.AI_Melee,
FightMode.Aggressor,
10,
1,
0.2,
0.4
)
public SavageRidgeback(string name = "a savage ridgeback") : base(name, 188, 0x3EB8, AIType.AI_Melee, FightMode.Aggressor)
{
BaseSoundID = 0x3F3;

View file

@ -3,17 +3,7 @@ namespace Server.Mobiles
public class ScaledSwampDragon : BaseMount
{
[Constructible]
public ScaledSwampDragon(string name = "a swamp dragon") : base(
name,
0x31F,
0x3EBE,
AIType.AI_Melee,
FightMode.Aggressor,
10,
1,
0.2,
0.4
)
public ScaledSwampDragon(string name = "a swamp dragon") : base(name, 0x31F, 0x3EBE, AIType.AI_Melee, FightMode.Aggressor)
{
SetStr(201, 300);
SetDex(66, 85);

View file

@ -3,18 +3,9 @@ namespace Server.Mobiles
public class SeaHorse : BaseMount
{
[Constructible]
public SeaHorse(string name = "a sea horse") : base(
name,
0x90,
0x3EB3,
AIType.AI_Animal,
FightMode.Aggressor,
10,
1,
0.2,
0.4
)
public SeaHorse(string name = "a sea horse") : base(name, 0x90, 0x3EB3, AIType.AI_Animal, FightMode.Aggressor)
{
SetSpeed(0.4, 0.8);
InitStats(Utility.Random(50, 30), Utility.Random(50, 30), 10);
Skills.MagicResist.Base = 25.0 + Utility.RandomDouble() * 5.0;
Skills.Wrestling.Base = 35.0 + Utility.RandomDouble() * 10.0;

View file

@ -3,18 +3,10 @@ namespace Server.Mobiles
public class SilverSteed : BaseMount
{
[Constructible]
public SilverSteed(string name = "a silver steed") : base(
name,
0x75,
0x3EA8,
AIType.AI_Animal,
FightMode.Aggressor,
10,
1,
0.2,
0.4
)
public SilverSteed(string name = "a silver steed") : base(name, 0x75, 0x3EA8, AIType.AI_Animal, FightMode.Aggressor)
{
SetSpeed(0.55, 1.1);
InitStats(Utility.Random(50, 30), Utility.Random(50, 30), 10);
Skills.MagicResist.Base = 25.0 + Utility.RandomDouble() * 5.0;
Skills.Wrestling.Base = 35.0 + Utility.RandomDouble() * 10.0;

View file

@ -3,18 +3,9 @@ namespace Server.Mobiles
public class SkeletalMount : BaseMount
{
[Constructible]
public SkeletalMount(string name = null) : base(
name,
793,
0x3EBB,
AIType.AI_Animal,
FightMode.Aggressor,
10,
1,
0.2,
0.4
)
public SkeletalMount(string name = null) : base(name, 793, 0x3EBB, AIType.AI_Animal, FightMode.Aggressor)
{
SetSpeed(0.55, 1.1);
SetStr(91, 100);
SetDex(46, 55);
SetInt(46, 60);

View file

@ -11,17 +11,7 @@ namespace Server.Mobiles
private bool m_HasBarding;
[Constructible]
public SwampDragon(string name = "a swamp dragon") : base(
name,
0x31A,
0x3EBD,
AIType.AI_Melee,
FightMode.Aggressor,
10,
1,
0.2,
0.4
)
public SwampDragon(string name = "a swamp dragon") : base(name, 0x31A, 0x3EBD, AIType.AI_Melee, FightMode.Aggressor)
{
BaseSoundID = 0x16A;

View file

@ -7,7 +7,7 @@ namespace Server.Mobiles
public class Unicorn : BaseMount
{
[Constructible]
public Unicorn(string name = "a unicorn") : base(name, 0x7A, 0x3EB4, AIType.AI_Mage, FightMode.Evil, 10, 1)
public Unicorn(string name = "a unicorn") : base(name, 0x7A, 0x3EB4, AIType.AI_Mage, FightMode.Evil)
{
BaseSoundID = 0x4BC;
@ -87,8 +87,8 @@ namespace Server.Mobiles
if (chanceToCure > Utility.Random(100))
{
if (Rider.CurePoison(this)
) // TODO: Confirm if mount is the one flagged for curing it or the rider is
// TODO: Confirm if mount is the one flagged for curing it or the rider is
if (Rider.CurePoison(this))
{
Rider.LocalOverheadMessage(
MessageType.Regular,

View file

@ -3,8 +3,8 @@ namespace Server.Mobiles
public abstract class BaseWarHorse : BaseMount
{
public BaseWarHorse(
int bodyID, int itemID, AIType aiType, FightMode fightMode, int rangePerception, int rangeFight,
double activeSpeed = -1, double passiveSpeed = -1
int bodyID, int itemID, AIType aiType = AIType.AI_Melee, FightMode fightMode = FightMode.Aggressor,
int rangePerception = 10, int rangeFight = 1
) : base(
"a war horse",
bodyID,
@ -12,9 +12,7 @@ namespace Server.Mobiles
aiType,
fightMode,
rangePerception,
rangeFight,
activeSpeed,
passiveSpeed
rangeFight
)
{
BaseSoundID = 0xA8;

View file

@ -3,7 +3,7 @@ namespace Server.Mobiles
public class CoMWarHorse : BaseWarHorse
{
[Constructible]
public CoMWarHorse() : base(0x77, 0x3EB1, AIType.AI_Melee, FightMode.Aggressor, 10, 1)
public CoMWarHorse() : base(0x77, 0x3EB1)
{
}

View file

@ -3,7 +3,7 @@ namespace Server.Mobiles
public class MinaxWarHorse : BaseWarHorse
{
[Constructible]
public MinaxWarHorse() : base(0x78, 0x3EAF, AIType.AI_Melee, FightMode.Aggressor, 10, 1)
public MinaxWarHorse() : base(0x78, 0x3EAF)
{
}

View file

@ -3,7 +3,7 @@ namespace Server.Mobiles
public class SLWarHorse : BaseWarHorse
{
[Constructible]
public SLWarHorse() : base(0x79, 0x3EB0, AIType.AI_Melee, FightMode.Aggressor, 10, 1)
public SLWarHorse() : base(0x79, 0x3EB0)
{
}

View file

@ -3,7 +3,7 @@ namespace Server.Mobiles
public class TBWarHorse : BaseWarHorse
{
[Constructible]
public TBWarHorse() : base(0x76, 0x3EB2, AIType.AI_Melee, FightMode.Aggressor, 10, 1)
public TBWarHorse() : base(0x76, 0x3EB2)
{
}

View file

@ -324,9 +324,10 @@ namespace Server.Mobiles
AIType ai,
FightMode mode = FightMode.Closest,
int iRangePerception = 10,
int iRangeFight = 1,
double activeSpeed = -1,
double passiveSpeed = -1
int iRangeFight = 1
// ,
// double activeSpeed = 0,
// double passiveSpeed = 0
)
{
if (iRangePerception == OldRangePerception)
@ -344,18 +345,18 @@ namespace Server.Mobiles
FightMode = mode;
m_Team = 0;
// if (activeSpeed > 0 && passiveSpeed > 0)
// {
// ActiveSpeed = activeSpeed;
// PassiveSpeed = passiveSpeed;
// CurrentSpeed = passiveSpeed;
// }
// else
// {
// CurrentSpeed = SpeedInfo.MaxMonsterDelay * 2;
// }
if (passiveSpeed < 0 || activeSpeed < 0)
{
ResetSpeeds();
}
else
{
ActiveSpeed = activeSpeed;
PassiveSpeed = passiveSpeed;
CurrentSpeed = passiveSpeed;
}
m_Team = 0;
Debug = false;
@ -685,16 +686,23 @@ namespace Server.Mobiles
[CommandProperty(AccessLevel.GameMaster)]
public double PassiveSpeed { get; set; }
[CommandProperty(AccessLevel.GameMaster)]
public double SpeedMod { get; set; }
[CommandProperty(AccessLevel.GameMaster)]
public double CurrentSpeed
{
get => TargetLocation != null ? 0.3 : m_CurrentSpeed;
get => TargetLocation != null ? 0.3 : SpeedMod <= 0 ? m_CurrentSpeed : SpeedMod;
set
{
if (m_CurrentSpeed != value)
{
m_CurrentSpeed = value;
AIObject?.OnCurrentSpeedChanged();
if (SpeedMod <= 0)
{
AIObject?.OnCurrentSpeedChanged();
}
}
}
}
@ -1370,6 +1378,14 @@ namespace Server.Mobiles
}
}
public override void OnRawDexChange(int oldValue)
{
if (oldValue != RawDex && ActiveSpeed <= 0 && PassiveSpeed <= 0)
{
ResetSpeeds();
}
}
public override void OnBeforeSpawn(Point3D location, Map m)
{
if (Paragon.CheckConvert(this, location, m))
@ -2573,7 +2589,6 @@ namespace Server.Mobiles
if (m_IdleReleaseTime > DateTime.MinValue)
{
// idling...
if (Core.Now >= m_IdleReleaseTime)
{
m_IdleReleaseTime = DateTime.MinValue;
@ -3000,11 +3015,12 @@ namespace Server.Mobiles
return null;
}
public virtual bool IsMonster =>
!Controlled || GetMaster() is not BaseCreature { Controlled: true };
public virtual bool IsMonster => !Controlled || (GetMaster() as BaseCreature)?.IsMonster == true;
public bool InActivePVPCombat() =>
Combatant is PlayerMobile && ControlOrder != OrderType.Follow;
ControlOrder != OrderType.Follow &&
Combatant is PlayerMobile ||
Combatant is BaseCreature { Controlled: true } bc && bc.GetMaster() is PlayerMobile;
public static List<DamageStore> GetLootingRights(List<DamageEntry> damageEntries, int hitsMax)
{
@ -3382,6 +3398,8 @@ namespace Server.Mobiles
ControlOrder = OrderType.None;
Guild = null;
ResetSpeeds();
Delta(MobileDelta.Noto);
}
else
@ -3414,6 +3432,8 @@ namespace Server.Mobiles
m_DeleteTimer = null;
}
ResetSpeeds(true);
Delta(MobileDelta.Noto);
}
@ -4561,6 +4581,13 @@ namespace Server.Mobiles
return false;
}
public void SetSpeed(double active, double passive)
{
ActiveSpeed = active;
PassiveSpeed = passive;
CurrentSpeed = PassiveSpeed;
}
public void SetDamage(int val)
{
m_DamageMin = val;
@ -4840,8 +4867,7 @@ namespace Server.Mobiles
}
}
// Reset speeds based on dex. Mainly used during construction and pet commands
public void ResetSpeeds(bool currentUseActive = false)
public virtual void ResetSpeeds(bool currentUseActive = false)
{
SpeedInfo.GetSpeeds(this, out var activeSpeed, out var passiveSpeed);

View file

@ -8,14 +8,7 @@ namespace Server.Mobiles
private readonly DateTime m_ExpireTime;
private readonly Mobile m_Target;
public Revenant(Mobile caster, Mobile target, TimeSpan duration) : base(
AIType.AI_Melee,
FightMode.Closest,
10,
1,
0.18,
0.36
)
public Revenant(Mobile caster, Mobile target, TimeSpan duration) : base(AIType.AI_Melee)
{
Body = 400;
Hue = 1;
@ -26,6 +19,8 @@ namespace Server.Mobiles
m_Target = target;
m_ExpireTime = Core.Now + duration;
SetSpeed(0.25, 0.55);
SetStr(200);
SetDex(150);
SetInt(150);

View file

@ -11,7 +11,7 @@ namespace Server.Mobiles
private readonly Mobile m_Target;
public KhaldunRevenant(Mobile target) : base(AIType.AI_Melee, FightMode.Closest, 10, 1, 0.175, 0.35)
public KhaldunRevenant(Mobile target) : base(AIType.AI_Melee)
{
Body = 0x3CA;
Hue = 0x41CE;
@ -19,6 +19,8 @@ namespace Server.Mobiles
m_Target = target;
m_ExpireTime = Core.Now + TimeSpan.FromMinutes(10.0);
SetSpeed(0.25, 0.55);
SetStr(401, 500);
SetDex(296, 315);
SetInt(101, 200);

View file

@ -5,11 +5,13 @@ namespace Server.Mobiles
public class ChaosDragoon : BaseCreature
{
[Constructible]
public ChaosDragoon() : base(AIType.AI_Melee, FightMode.Closest, 10, 1, 0.15, 0.4)
public ChaosDragoon() : base(AIType.AI_Melee)
{
Body = 0x190;
Hue = Race.Human.RandomSkinHue();
SetSpeed(0.25, 0.55);
SetStr(176, 225);
SetDex(81, 95);
SetInt(61, 85);

View file

@ -5,12 +5,13 @@ namespace Server.Mobiles
public class ChaosDragoonElite : BaseCreature
{
[Constructible]
public ChaosDragoonElite()
: base(AIType.AI_Mage, FightMode.Closest, 10, 1, 0.15, 0.4)
public ChaosDragoonElite() : base(AIType.AI_Mage)
{
Body = 0x190;
Hue = Race.Human.RandomSkinHue();
SetSpeed(0.25, 0.55);
SetStr(276, 350);
SetDex(66, 90);
SetInt(126, 150);

View file

@ -3,11 +3,13 @@ namespace Server.Mobiles
public class CorruptedSoul : BaseCreature
{
[Constructible]
public CorruptedSoul() : base(AIType.AI_Melee, FightMode.Closest, 10, 1, 0.1, 5)
public CorruptedSoul() : base(AIType.AI_Melee)
{
Body = 0x3CA;
Hue = 0x453;
SetSpeed(0.25, 5);
SetStr(102, 115);
SetDex(101, 115);
SetInt(203, 215);

View file

@ -11,6 +11,8 @@ namespace Server.Mobiles
Hue = 0x8FD;
SetSpeed(0.1, 0.6);
SetStr(255, 847);
SetDex(145, 428);
SetInt(26, 380);
@ -44,7 +46,7 @@ namespace Server.Mobiles
public override void OnDeath( Container c )
{
base.OnDeath( c );
if (Utility.RandomDouble() < 0.025)
{
switch ( Utility.Random( 16 ) )

View file

@ -5,10 +5,12 @@ namespace Server.Mobiles
public class Reptalon : BaseMount
{
[Constructible]
public Reptalon() : base("a reptalon", 0x114, 0x3E90, AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.35)
public Reptalon() : base("a reptalon", 0x114, 0x3E90, AIType.AI_Melee)
{
BaseSoundID = 0x16A;
SetSpeed(0.25, 0.55);
SetStr(1001, 1025);
SetDex(152, 164);
SetInt(251, 289);

View file

@ -5,7 +5,7 @@ namespace Server.Mobiles
public class ShadowWisp : BaseCreature
{
[Constructible]
public ShadowWisp() : base(AIType.AI_Mage, FightMode.Aggressor, 10, 1, 0.25, 0.5)
public ShadowWisp() : base(AIType.AI_Mage, FightMode.Aggressor)
{
Body = 165;
BaseSoundID = 466;

View file

@ -5,8 +5,7 @@ namespace Server.Mobiles
public class AnimatedWeapon : BaseCreature
{
[Constructible]
public AnimatedWeapon(Mobile caster, int level)
: base(AIType.AI_Melee, FightMode.Closest, 10, 1, 0.3, 0.6)
public AnimatedWeapon(Mobile caster, int level) : base(AIType.AI_Melee)
{
Body = 692;

View file

@ -6,11 +6,11 @@ namespace Server.Mobiles
public class BladeSpirits : BaseCreature
{
[Constructible]
public BladeSpirits()
: base(AIType.AI_Melee, FightMode.Closest, 10, 1, 0.3, 0.6)
public BladeSpirits() : base(AIType.AI_Melee)
{
Body = 574;
SetSpeed(0.6, 1.25);
SetStr(150);
SetDex(150);
SetInt(100);

View file

@ -9,7 +9,7 @@ namespace Server.Mobiles
private bool m_Stunning;
[Constructible]
public Golem(bool summoned = false, double scalar = 1.0) : base(AIType.AI_Melee, FightMode.Closest, 10, 1, 0.4, 0.8)
public Golem(bool summoned = false, double scalar = 1.0) : base(AIType.AI_Melee)
{
Body = 752;
@ -18,6 +18,8 @@ namespace Server.Mobiles
Hue = 2101;
}
SetSpeed(0.9, 1.5);
SetStr((int)(251 * scalar), (int)(350 * scalar));
SetDex((int)(76 * scalar), (int)(100 * scalar));
SetInt((int)(101 * scalar), (int)(150 * scalar));

View file

@ -6,7 +6,7 @@ namespace Server.Mobiles
public class BogThing : BaseCreature
{
[Constructible]
public BogThing() : base(AIType.AI_Melee, FightMode.Closest, 10, 1, 0.3, 0.6)
public BogThing() : base(AIType.AI_Melee)
{
Body = 780;

View file

@ -3,7 +3,7 @@ namespace Server.Mobiles
public class Quagmire : BaseCreature
{
[Constructible]
public Quagmire() : base(AIType.AI_Melee, FightMode.Closest, 10, 1, 0.3, 0.6)
public Quagmire() : base(AIType.AI_Melee)
{
Body = 789;
BaseSoundID = 352;

View file

@ -6,14 +6,7 @@ namespace Server.Mobiles
public class DeathwatchBeetleHatchling : BaseCreature
{
[Constructible]
public DeathwatchBeetleHatchling() : base(
AIType.AI_Melee,
Core.ML ? FightMode.Aggressor : FightMode.Closest,
10,
1,
0.2,
0.4
)
public DeathwatchBeetleHatchling() : base(AIType.AI_Melee, Core.ML ? FightMode.Aggressor : FightMode.Closest)
{
Body = 242;

View file

@ -7,8 +7,9 @@ namespace Server.Mobiles
{
public abstract class BaseChampion : BaseCreature
{
public BaseChampion(AIType aiType, FightMode mode = FightMode.Closest) : base(aiType, mode, 18, 1, 0.1, 0.2)
public BaseChampion(AIType aiType, FightMode mode = FightMode.Closest) : base(aiType, mode, 18)
{
SetSpeed(0.25, 0.55);
}
public BaseChampion(Serial serial) : base(serial)

View file

@ -1,163 +0,0 @@
using System;
using Server.Items;
namespace Server.Mobiles
{
/// <summary>
/// This is a test creature
/// You can set its value in game
/// It die after 5 minutes, so your test server stay clean
/// Create a macro to help your creation "[add Dummy 1 15 7 -1 0.5 2"
/// A iTeam of negative will set a faction at random
/// Say Kill if you want them to die
/// </summary>
public class Dummy : BaseCreature
{
public Timer m_Timer;
[Constructible]
public Dummy(
AIType iAI, FightMode iFightMode, int iRangePerception, int iRangeFight, double dActiveSpeed,
double dPassiveSpeed
) : base(iAI, iFightMode, iRangePerception, iRangeFight, dActiveSpeed, dPassiveSpeed)
{
Body = 400 + Utility.Random(2);
Hue = Race.Human.RandomSkinHue();
Skills.DetectHidden.Base = 100;
Skills.MagicResist.Base = 120;
Team = Utility.Random(3);
var iHue = 20 + Team * 40;
var jHue = 25 + Team * 40;
Utility.AssignRandomHair(this, iHue);
var glv = new LeatherGloves();
glv.Hue = iHue;
glv.LootType = LootType.Newbied;
AddItem(glv);
Container pack = new Backpack();
pack.Movable = false;
AddItem(pack);
m_Timer = new AutokillTimer(this);
m_Timer.Start();
}
public Dummy(Serial serial) : base(serial)
{
m_Timer = new AutokillTimer(this);
m_Timer.Start();
}
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
public override bool HandlesOnSpeech(Mobile from)
{
if (from.AccessLevel >= AccessLevel.GameMaster)
{
return true;
}
return base.HandlesOnSpeech(from);
}
public override void OnSpeech(SpeechEventArgs e)
{
base.OnSpeech(e);
if (e.Mobile.AccessLevel >= AccessLevel.GameMaster)
{
if (e.Speech == "kill")
{
m_Timer.Stop();
m_Timer.Delay = TimeSpan.FromSeconds(Utility.Random(1, 5));
m_Timer.Start();
}
}
}
public override void OnTeamChange()
{
var iHue = 20 + Team * 40;
var jHue = 25 + Team * 40;
var item = FindItemOnLayer(Layer.OuterTorso);
if (item != null)
{
item.Hue = jHue;
}
item = FindItemOnLayer(Layer.Helm);
if (item != null)
{
item.Hue = iHue;
}
item = FindItemOnLayer(Layer.Gloves);
if (item != null)
{
item.Hue = iHue;
}
item = FindItemOnLayer(Layer.Shoes);
if (item != null)
{
item.Hue = iHue;
}
HairHue = iHue;
item = FindItemOnLayer(Layer.MiddleTorso);
if (item != null)
{
item.Hue = iHue;
}
item = FindItemOnLayer(Layer.OuterLegs);
if (item != null)
{
item.Hue = iHue;
}
}
private class AutokillTimer : Timer
{
private readonly Dummy m_Owner;
public AutokillTimer(Dummy owner) : base(TimeSpan.FromMinutes(5.0))
{
m_Owner = owner;
}
protected override void OnTick()
{
m_Owner.Kill();
Stop();
}
}
}
}

View file

@ -1,784 +0,0 @@
using Server.Items;
using Server.Spells.First;
using Server.Spells.Third;
namespace Server.Mobiles
{
/// <summary>
/// This is a test creature
/// You can set its value in game
/// It die after 5 minutes, so your test server stay clean
/// Create a macro to help your creation "[add Dummy 1 15 7 -1 0.5 2"
/// A iTeam of negative will set a faction at random
/// Say Kill if you want them to die
/// </summary>
public class DummyMace : Dummy
{
[Constructible]
public DummyMace() : base(AIType.AI_Melee, FightMode.Closest, 15, 1, 0.2, 0.6)
{
// A Dummy Macer
var iHue = 20 + Team * 40;
var jHue = 25 + Team * 40;
// Skills and Stats
InitStats(125, 125, 90);
Skills.Macing.Base = 120;
Skills.Anatomy.Base = 120;
Skills.Healing.Base = 120;
Skills.Tactics.Base = 120;
// Equip
var war = new WarHammer();
war.Movable = true;
war.Crafter = this;
war.Quality = WeaponQuality.Regular;
AddItem(war);
var bts = new Boots();
bts.Hue = iHue;
AddItem(bts);
var cht = new ChainChest();
cht.Movable = false;
cht.LootType = LootType.Newbied;
cht.Crafter = RawName;
cht.Quality = ArmorQuality.Regular;
AddItem(cht);
var chl = new ChainLegs();
chl.Movable = false;
chl.LootType = LootType.Newbied;
chl.Crafter = RawName;
chl.Quality = ArmorQuality.Regular;
AddItem(chl);
var pla = new PlateArms();
pla.Movable = false;
pla.LootType = LootType.Newbied;
pla.Crafter = RawName;
pla.Quality = ArmorQuality.Regular;
AddItem(pla);
var band = new Bandage(50);
AddToBackpack(band);
}
public DummyMace(Serial serial) : base(serial)
{
}
public override string DefaultName => "Macer";
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
public class DummyFence : Dummy
{
[Constructible]
public DummyFence() : base(AIType.AI_Melee, FightMode.Closest, 15, 1, 0.2, 0.6)
{
// A Dummy Fencer
var iHue = 20 + Team * 40;
var jHue = 25 + Team * 40;
// Skills and Stats
InitStats(125, 125, 90);
Skills.Fencing.Base = 120;
Skills.Anatomy.Base = 120;
Skills.Healing.Base = 120;
Skills.Tactics.Base = 120;
// Equip
var ssp = new Spear();
ssp.Movable = true;
ssp.Crafter = this;
ssp.Quality = WeaponQuality.Regular;
AddItem(ssp);
var snd = new Boots();
snd.Hue = iHue;
snd.LootType = LootType.Newbied;
AddItem(snd);
var cht = new ChainChest();
cht.Movable = false;
cht.LootType = LootType.Newbied;
cht.Crafter = RawName;
cht.Quality = ArmorQuality.Regular;
AddItem(cht);
var chl = new ChainLegs();
chl.Movable = false;
chl.LootType = LootType.Newbied;
chl.Crafter = RawName;
chl.Quality = ArmorQuality.Regular;
AddItem(chl);
var pla = new PlateArms();
pla.Movable = false;
pla.LootType = LootType.Newbied;
pla.Crafter = RawName;
pla.Quality = ArmorQuality.Regular;
AddItem(pla);
var band = new Bandage(50);
AddToBackpack(band);
}
public DummyFence(Serial serial) : base(serial)
{
}
public override string DefaultName => "Fencer";
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
public class DummySword : Dummy
{
[Constructible]
public DummySword() : base(AIType.AI_Melee, FightMode.Closest, 15, 1, 0.2, 0.6)
{
// A Dummy Swordsman
var iHue = 20 + Team * 40;
var jHue = 25 + Team * 40;
// Skills and Stats
InitStats(125, 125, 90);
Skills.Swords.Base = 120;
Skills.Anatomy.Base = 120;
Skills.Healing.Base = 120;
Skills.Tactics.Base = 120;
Skills.Parry.Base = 120;
// Equip
var kat = new Katana();
kat.Crafter = this;
kat.Movable = true;
kat.Quality = WeaponQuality.Regular;
AddItem(kat);
var bts = new Boots();
bts.Hue = iHue;
AddItem(bts);
var cht = new ChainChest();
cht.Movable = false;
cht.LootType = LootType.Newbied;
cht.Crafter = RawName;
cht.Quality = ArmorQuality.Regular;
AddItem(cht);
var chl = new ChainLegs();
chl.Movable = false;
chl.LootType = LootType.Newbied;
chl.Crafter = RawName;
chl.Quality = ArmorQuality.Regular;
AddItem(chl);
var pla = new PlateArms();
pla.Movable = false;
pla.LootType = LootType.Newbied;
pla.Crafter = RawName;
pla.Quality = ArmorQuality.Regular;
AddItem(pla);
var band = new Bandage(50);
AddToBackpack(band);
}
public DummySword(Serial serial) : base(serial)
{
}
public override string DefaultName => "Swordsman";
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
public class DummyNox : Dummy
{
[Constructible]
public DummyNox() : base(AIType.AI_Mage, FightMode.Closest, 15, 1, 0.2, 0.6)
{
// A Dummy Nox or Pure Mage
var iHue = 20 + Team * 40;
var jHue = 25 + Team * 40;
// Skills and Stats
InitStats(90, 90, 125);
Skills.Magery.Base = 120;
Skills.EvalInt.Base = 120;
Skills.Inscribe.Base = 100;
Skills.Wrestling.Base = 120;
Skills.Meditation.Base = 120;
Skills.Poisoning.Base = 100;
// Equip
var book = new Spellbook();
book.Movable = false;
book.LootType = LootType.Newbied;
book.Content = 0xFFFFFFFFFFFFFFFF;
AddItem(book);
var kilt = new Kilt();
kilt.Hue = jHue;
AddItem(kilt);
var snd = new Sandals();
snd.Hue = iHue;
snd.LootType = LootType.Newbied;
AddItem(snd);
var skc = new SkullCap();
skc.Hue = iHue;
AddItem(skc);
// Spells
AddSpellAttack(typeof(MagicArrowSpell));
AddSpellAttack(typeof(WeakenSpell));
AddSpellAttack(typeof(FireballSpell));
AddSpellDefense(typeof(WallOfStoneSpell));
AddSpellDefense(typeof(HealSpell));
}
public DummyNox(Serial serial) : base(serial)
{
}
public override string DefaultName => "Nox Mage";
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
public class DummyStun : Dummy
{
[Constructible]
public DummyStun() : base(AIType.AI_Mage, FightMode.Closest, 15, 1, 0.2, 0.6)
{
// A Dummy Stun Mage
var iHue = 20 + Team * 40;
var jHue = 25 + Team * 40;
// Skills and Stats
InitStats(90, 90, 125);
Skills.Magery.Base = 100;
Skills.EvalInt.Base = 120;
Skills.Anatomy.Base = 80;
Skills.Wrestling.Base = 80;
Skills.Meditation.Base = 100;
Skills.Poisoning.Base = 100;
// Equip
var book = new Spellbook();
book.Movable = false;
book.LootType = LootType.Newbied;
book.Content = 0xFFFFFFFFFFFFFFFF;
AddItem(book);
var lea = new LeatherArms();
lea.Movable = false;
lea.LootType = LootType.Newbied;
lea.Crafter = RawName;
lea.Quality = ArmorQuality.Regular;
AddItem(lea);
var lec = new LeatherChest();
lec.Movable = false;
lec.LootType = LootType.Newbied;
lec.Crafter = RawName;
lec.Quality = ArmorQuality.Regular;
AddItem(lec);
var leg = new LeatherGorget();
leg.Movable = false;
leg.LootType = LootType.Newbied;
leg.Crafter = RawName;
leg.Quality = ArmorQuality.Regular;
AddItem(leg);
var lel = new LeatherLegs();
lel.Movable = false;
lel.LootType = LootType.Newbied;
lel.Crafter = RawName;
lel.Quality = ArmorQuality.Regular;
AddItem(lel);
var bts = new Boots();
bts.Hue = iHue;
AddItem(bts);
var cap = new Cap();
cap.Hue = iHue;
AddItem(cap);
// Spells
AddSpellAttack(typeof(MagicArrowSpell));
AddSpellAttack(typeof(WeakenSpell));
AddSpellAttack(typeof(FireballSpell));
AddSpellDefense(typeof(WallOfStoneSpell));
AddSpellDefense(typeof(HealSpell));
}
public DummyStun(Serial serial) : base(serial)
{
}
public override string DefaultName => "Stun Mage";
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
public class DummySuper : Dummy
{
[Constructible]
public DummySuper() : base(AIType.AI_Mage, FightMode.Closest, 15, 1, 0.2, 0.6)
{
// A Dummy Super Mage
var iHue = 20 + Team * 40;
var jHue = 25 + Team * 40;
// Skills and Stats
InitStats(125, 125, 125);
Skills.Magery.Base = 120;
Skills.EvalInt.Base = 120;
Skills.Anatomy.Base = 120;
Skills.Wrestling.Base = 120;
Skills.Meditation.Base = 120;
Skills.Poisoning.Base = 100;
Skills.Inscribe.Base = 100;
// Equip
var book = new Spellbook();
book.Movable = false;
book.LootType = LootType.Newbied;
book.Content = 0xFFFFFFFFFFFFFFFF;
AddItem(book);
var lea = new LeatherArms();
lea.Movable = false;
lea.LootType = LootType.Newbied;
lea.Crafter = RawName;
lea.Quality = ArmorQuality.Regular;
AddItem(lea);
var lec = new LeatherChest();
lec.Movable = false;
lec.LootType = LootType.Newbied;
lec.Crafter = RawName;
lec.Quality = ArmorQuality.Regular;
AddItem(lec);
var leg = new LeatherGorget();
leg.Movable = false;
leg.LootType = LootType.Newbied;
leg.Crafter = RawName;
leg.Quality = ArmorQuality.Regular;
AddItem(leg);
var lel = new LeatherLegs();
lel.Movable = false;
lel.LootType = LootType.Newbied;
lel.Crafter = RawName;
lel.Quality = ArmorQuality.Regular;
AddItem(lel);
var snd = new Sandals();
snd.Hue = iHue;
snd.LootType = LootType.Newbied;
AddItem(snd);
var jhat = new JesterHat();
jhat.Hue = iHue;
AddItem(jhat);
var dblt = new Doublet();
dblt.Hue = iHue;
AddItem(dblt);
// Spells
AddSpellAttack(typeof(MagicArrowSpell));
AddSpellAttack(typeof(WeakenSpell));
AddSpellAttack(typeof(FireballSpell));
AddSpellDefense(typeof(WallOfStoneSpell));
AddSpellDefense(typeof(HealSpell));
}
public DummySuper(Serial serial) : base(serial)
{
}
public override string DefaultName => "Super Mage";
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
public class DummyHealer : Dummy
{
[Constructible]
public DummyHealer() : base(AIType.AI_Healer, FightMode.Closest, 15, 1, 0.2, 0.6)
{
// A Dummy Healer Mage
var iHue = 20 + Team * 40;
var jHue = 25 + Team * 40;
// Skills and Stats
InitStats(125, 125, 125);
Skills.Magery.Base = 120;
Skills.EvalInt.Base = 120;
Skills.Anatomy.Base = 120;
Skills.Wrestling.Base = 120;
Skills.Meditation.Base = 120;
Skills.Healing.Base = 100;
// Equip
var book = new Spellbook();
book.Movable = false;
book.LootType = LootType.Newbied;
book.Content = 0xFFFFFFFFFFFFFFFF;
AddItem(book);
var lea = new LeatherArms();
lea.Movable = false;
lea.LootType = LootType.Newbied;
lea.Crafter = RawName;
lea.Quality = ArmorQuality.Regular;
AddItem(lea);
var lec = new LeatherChest();
lec.Movable = false;
lec.LootType = LootType.Newbied;
lec.Crafter = RawName;
lec.Quality = ArmorQuality.Regular;
AddItem(lec);
var leg = new LeatherGorget();
leg.Movable = false;
leg.LootType = LootType.Newbied;
leg.Crafter = RawName;
leg.Quality = ArmorQuality.Regular;
AddItem(leg);
var lel = new LeatherLegs();
lel.Movable = false;
lel.LootType = LootType.Newbied;
lel.Crafter = RawName;
lel.Quality = ArmorQuality.Regular;
AddItem(lel);
var snd = new Sandals();
snd.Hue = iHue;
snd.LootType = LootType.Newbied;
AddItem(snd);
var cap = new Cap();
cap.Hue = iHue;
AddItem(cap);
var robe = new Robe();
robe.Hue = iHue;
AddItem(robe);
}
public DummyHealer(Serial serial) : base(serial)
{
}
public override string DefaultName => "Healer";
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
public class DummyAssassin : Dummy
{
[Constructible]
public DummyAssassin() : base(AIType.AI_Melee, FightMode.Closest, 15, 1, 0.2, 0.6)
{
// A Dummy Hybrid Assassin
var iHue = 20 + Team * 40;
var jHue = 25 + Team * 40;
// Skills and Stats
InitStats(105, 105, 105);
Skills.Magery.Base = 120;
Skills.EvalInt.Base = 120;
Skills.Swords.Base = 120;
Skills.Tactics.Base = 120;
Skills.Meditation.Base = 120;
Skills.Poisoning.Base = 100;
// Equip
var book = new Spellbook();
book.Movable = false;
book.LootType = LootType.Newbied;
book.Content = 0xFFFFFFFFFFFFFFFF;
AddToBackpack(book);
var kat = new Katana();
kat.Movable = false;
kat.LootType = LootType.Newbied;
kat.Crafter = this;
kat.Poison = Poison.Deadly;
kat.PoisonCharges = 12;
kat.Quality = WeaponQuality.Regular;
AddToBackpack(kat);
var lea = new LeatherArms();
lea.Movable = false;
lea.LootType = LootType.Newbied;
lea.Crafter = RawName;
lea.Quality = ArmorQuality.Regular;
AddItem(lea);
var lec = new LeatherChest();
lec.Movable = false;
lec.LootType = LootType.Newbied;
lec.Crafter = RawName;
lec.Quality = ArmorQuality.Regular;
AddItem(lec);
var leg = new LeatherGorget();
leg.Movable = false;
leg.LootType = LootType.Newbied;
leg.Crafter = RawName;
leg.Quality = ArmorQuality.Regular;
AddItem(leg);
var lel = new LeatherLegs();
lel.Movable = false;
lel.LootType = LootType.Newbied;
lel.Crafter = RawName;
lel.Quality = ArmorQuality.Regular;
AddItem(lel);
var snd = new Sandals();
snd.Hue = iHue;
snd.LootType = LootType.Newbied;
AddItem(snd);
var cap = new Cap();
cap.Hue = iHue;
AddItem(cap);
var robe = new Robe();
robe.Hue = iHue;
AddItem(robe);
var pota = new DeadlyPoisonPotion();
pota.LootType = LootType.Newbied;
AddToBackpack(pota);
var potb = new DeadlyPoisonPotion();
potb.LootType = LootType.Newbied;
AddToBackpack(potb);
var potc = new DeadlyPoisonPotion();
potc.LootType = LootType.Newbied;
AddToBackpack(potc);
var potd = new DeadlyPoisonPotion();
potd.LootType = LootType.Newbied;
AddToBackpack(potd);
var band = new Bandage(50);
AddToBackpack(band);
}
public DummyAssassin(Serial serial) : base(serial)
{
}
public override string DefaultName => "Hybrid Assassin";
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
[TypeAlias("Server.Mobiles.DummyTheif")]
public class DummyThief : Dummy
{
[Constructible]
public DummyThief() : base(AIType.AI_Thief, FightMode.Closest, 15, 1, 0.2, 0.6)
{
// A Dummy Hybrid Thief
var iHue = 20 + Team * 40;
var jHue = 25 + Team * 40;
// Skills and Stats
InitStats(105, 105, 105);
Skills.Healing.Base = 120;
Skills.Anatomy.Base = 120;
Skills.Stealing.Base = 120;
Skills.ArmsLore.Base = 100;
Skills.Meditation.Base = 120;
Skills.Wrestling.Base = 120;
// Equip
var book = new Spellbook();
book.Movable = false;
book.LootType = LootType.Newbied;
book.Content = 0xFFFFFFFFFFFFFFFF;
AddItem(book);
var lea = new LeatherArms();
lea.Movable = false;
lea.LootType = LootType.Newbied;
lea.Crafter = RawName;
lea.Quality = ArmorQuality.Regular;
AddItem(lea);
var lec = new LeatherChest();
lec.Movable = false;
lec.LootType = LootType.Newbied;
lec.Crafter = RawName;
lec.Quality = ArmorQuality.Regular;
AddItem(lec);
var leg = new LeatherGorget();
leg.Movable = false;
leg.LootType = LootType.Newbied;
leg.Crafter = RawName;
leg.Quality = ArmorQuality.Regular;
AddItem(leg);
var lel = new LeatherLegs();
lel.Movable = false;
lel.LootType = LootType.Newbied;
lel.Crafter = RawName;
lel.Quality = ArmorQuality.Regular;
AddItem(lel);
var snd = new Sandals();
snd.Hue = iHue;
snd.LootType = LootType.Newbied;
AddItem(snd);
var cap = new Cap();
cap.Hue = iHue;
AddItem(cap);
var robe = new Robe();
robe.Hue = iHue;
AddItem(robe);
var band = new Bandage(50);
AddToBackpack(band);
}
public DummyThief(Serial serial) : base(serial)
{
}
public override string DefaultName => "Hybrid Thief";
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
}

View file

@ -12,6 +12,8 @@ namespace Server.Mobiles
Body = 173;
BaseSoundID = 0x183;
SetSpeed(0.1, 0.6);
SetStr(505, 1000);
SetDex(102, 300);
SetInt(402, 600);

View file

@ -6,15 +6,15 @@ namespace Server.Mobiles
{
public static class Paragon
{
public static double ChestChance = .10; // Chance that a paragon will carry a paragon chest
public static double ChocolateIngredientChance = .20; // Chance that a paragon will drop a chocolatiering ingredient
public const double ChestChance = 0.10; // Chance that a paragon will carry a paragon chest
public const double ChocolateIngredientChance = 0.20; // Chance that a paragon will drop a chocolatiering ingredient
public static Map[] Maps =
{
Map.Ilshenar
};
private static readonly TimeSpan FastRegenRate = TimeSpan.FromSeconds(.5);
private static readonly TimeSpan FastRegenRate = TimeSpan.FromSeconds(0.5);
private static readonly TimeSpan CPUSaverRate = TimeSpan.FromSeconds(2);
public static Type[] Artifacts =
@ -36,15 +36,15 @@ namespace Server.Mobiles
public static int Hue = 0x501; // Paragon hue
// Buffs
public static double HitsBuff = 5.0;
public static double StrBuff = 1.05;
public static double IntBuff = 1.20;
public static double DexBuff = 1.20;
public static double SkillsBuff = 1.20;
public static double SpeedBuff = 1.20;
public static double FameBuff = 1.40;
public static double KarmaBuff = 1.40;
public static int DamageBuff = 5;
public const double HitsBuff = 5.0;
public const double StrBuff = 1.05;
public const double IntBuff = 1.20;
public const double DexBuff = 1.20;
public const double SkillsBuff = 1.20;
public const double SpeedBuff = 1.20;
public const double FameBuff = 1.40;
public const double KarmaBuff = 1.40;
public const int DamageBuff = 5;
public static void Convert(BaseCreature bc)
{
@ -186,7 +186,7 @@ namespace Server.Mobiles
fame = 32000;
}
var chance = 1 / Math.Round(20.0 - fame / 3200);
var chance = 1 / Math.Round(20.0 - fame / 3200.0);
return chance > Utility.RandomDouble();
}

View file

@ -12,6 +12,8 @@ namespace Server.Mobiles
Body = 174;
BaseSoundID = 0x4B0;
SetSpeed(0.1, 0.6);
SetStr(502, 600);
SetDex(102, 200);
SetInt(601, 750);

View file

@ -3,11 +3,13 @@ namespace Server.Mobiles
public class Silvani : BaseCreature
{
[Constructible]
public Silvani() : base(AIType.AI_Mage, FightMode.Evil, 18, 1, 0.1, 0.2)
public Silvani() : base(AIType.AI_Mage, FightMode.Evil, 18)
{
Body = 176;
BaseSoundID = 0x467;
SetSpeed(0.25, 0.55);
SetStr(253, 400);
SetDex(157, 850);
SetInt(503, 800);

View file

@ -92,9 +92,10 @@ namespace Server.Mobiles
private MLQuest m_MLQuest;
[Constructible]
public BaseEscortable()
: base(AIType.AI_Melee, FightMode.Aggressor, 22, 1, 0.2, 1.0)
public BaseEscortable() : base(AIType.AI_Melee, FightMode.Aggressor, 22)
{
SetSpeed(0.3, 1.0);
InitBody();
InitOutfit();

View file

@ -52,9 +52,9 @@ namespace Server.Mobiles
}
}
public BaseVendor(string title = null)
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
public BaseVendor(string title = null) : base(AIType.AI_Vendor, FightMode.None, 2)
{
SetSpeed(0.5, 2);
LoadSBInfo();
Title = title;