Files
abysmal-isle/Scripts/Misc/CharacterCreation.cs
Unstable Kitsune b918192e4e Overwrite
Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
2023-11-28 23:20:26 -05:00

1457 lines
30 KiB
C#

#region References
using System;
using Server.Accounting;
using Server.Items;
using Server.Mobiles;
using Server.Network;
#endregion
namespace Server.Misc
{
public class CharacterCreation
{
private static readonly CityInfo m_NewHavenInfo = new CityInfo(
"New Haven",
"The Bountiful Harvest Inn",
3503,
2574,
14,
Map.Trammel);
private static readonly CityInfo m_SiegeInfo = new CityInfo(
"Britain",
"The Wayfarer's Inn",
1075074,
1602,
1591,
20,
Map.Felucca);
private static Mobile m_Mobile;
public static void Initialize()
{
// Register our event handler
EventSink.CharacterCreated += EventSink_CharacterCreated;
}
public static bool VerifyProfession(int profession)
{
if (profession < 0)
return false;
if (profession < 4)
return true;
if (Core.AOS && profession < 6)
return true;
if (Core.SE && profession < 8)
return true;
return false;
}
private static void AddBackpack(Mobile m)
{
var pack = m.Backpack;
if (pack == null)
{
pack = new Backpack();
pack.Movable = false;
m.AddItem(pack);
}
PackItem(new RedBook("a book", m.Name, 20, true));
PackItem(new Gold(1000)); // Starting gold can be customized here
PackItem(new Candle());
if (m.Race != Race.Gargoyle)
PackItem(new Dagger());
else
PackItem(new GargishDagger());
}
private static void AddShirt(Mobile m, int shirtHue)
{
var hue = Utility.ClipDyedHue(shirtHue & 0x3FFF);
if (m.Race == Race.Elf)
{
EquipItem(new ElvenShirt(hue), true);
}
else if (m.Race == Race.Human)
{
switch (Utility.Random(3))
{
case 0:
EquipItem(new Shirt(hue), true);
break;
case 1:
EquipItem(new FancyShirt(hue), true);
break;
case 2:
EquipItem(new Doublet(hue), true);
break;
}
}
else if (m.Race == Race.Gargoyle)
{
EquipItem(new GargishClothChestArmor(hue));
}
}
private static void AddPants(Mobile m, int pantsHue)
{
var hue = Utility.ClipDyedHue(pantsHue & 0x3FFF);
if (m.Race == Race.Elf)
{
EquipItem(new ElvenPants(hue), true);
}
else if (m.Race == Race.Human)
{
if (m.Female)
{
switch (Utility.Random(2))
{
case 0:
EquipItem(new Skirt(hue), true);
break;
case 1:
EquipItem(new Kilt(hue), true);
break;
}
}
else
{
switch (Utility.Random(2))
{
case 0:
EquipItem(new LongPants(hue), true);
break;
case 1:
EquipItem(new ShortPants(hue), true);
break;
}
}
}
else if (m.Race == Race.Gargoyle)
{
EquipItem(new GargishClothKiltArmor(hue));
}
}
private static void AddShoes(Mobile m)
{
if (m.Race == Race.Elf)
EquipItem(new ElvenBoots(), true);
else if (m.Race == Race.Human)
EquipItem(new Shoes(Utility.RandomYellowHue()), true);
}
private static Mobile CreateMobile(Account a)
{
if (a.Count >= a.Limit)
return null;
for (var i = 0; i < a.Length; ++i)
{
if (a[i] == null)
return (a[i] = new PlayerMobile());
}
return null;
}
private static void EventSink_CharacterCreated(CharacterCreatedEventArgs args)
{
if (!VerifyProfession(args.Profession))
args.Profession = 0;
var state = args.State;
if (state == null)
return;
var newChar = CreateMobile(args.Account as Account);
if (newChar == null)
{
Utility.PushColor(ConsoleColor.Red);
Console.WriteLine("Login: {0}: Character creation failed, account full", state);
Utility.PopColor();
return;
}
args.Mobile = newChar;
m_Mobile = newChar;
newChar.Player = true;
newChar.AccessLevel = args.Account.AccessLevel;
newChar.Female = args.Female;
//newChar.Body = newChar.Female ? 0x191 : 0x190;
if (Core.Expansion >= args.Race.RequiredExpansion)
newChar.Race = args.Race; //Sets body
else
newChar.Race = Race.DefaultRace;
newChar.Hue = args.Hue | 0x8000;
newChar.Hunger = 20;
var young = false;
if (newChar is PlayerMobile)
{
var pm = (PlayerMobile)newChar;
pm.AutoRenewInsurance = true;
var skillcap = Config.Get("PlayerCaps.SkillCap", 1000.0d) / 10;
if (skillcap != 100.0)
{
for (var i = 0; i < Enum.GetNames(typeof(SkillName)).Length; ++i)
pm.Skills[i].Cap = skillcap;
}
pm.Profession = args.Profession;
if (pm.IsPlayer() && pm.Account.Young && !Siege.SiegeShard)
young = pm.Young = true;
}
SetName(newChar, args.Name);
AddBackpack(newChar);
SetStats(newChar, state, args.Profession, args.Str, args.Dex, args.Int);
SetSkills(newChar, args.Skills, args.Profession);
var race = newChar.Race;
if (race.ValidateHair(newChar, args.HairID))
{
newChar.HairItemID = args.HairID;
newChar.HairHue = args.HairHue;
}
if (race.ValidateFacialHair(newChar, args.BeardID))
{
newChar.FacialHairItemID = args.BeardID;
newChar.FacialHairHue = args.BeardHue;
}
var faceID = args.FaceID;
if (faceID > 0 && race.ValidateFace(newChar.Female, faceID))
{
newChar.FaceItemID = faceID;
newChar.FaceHue = args.FaceHue;
}
else
{
newChar.FaceItemID = race.RandomFace(newChar.Female);
newChar.FaceHue = newChar.Hue;
}
if (args.Profession <= 3)
{
AddShirt(newChar, args.ShirtHue);
AddPants(newChar, args.PantsHue);
AddShoes(newChar);
}
if (TestCenter.Enabled)
TestCenter.FillBankbox(newChar);
if (young)
{
var ticket = new NewPlayerTicket
{
Owner = newChar
};
newChar.BankBox.DropItem(ticket);
}
var city = args.City;
var map = Siege.SiegeShard && city.Map == Map.Trammel ? Map.Felucca : city.Map;
newChar.MoveToWorld(city.Location, map);
Utility.PushColor(ConsoleColor.Green);
Console.WriteLine("Login: {0}: New character being created (account={1})", state, args.Account.Username);
Utility.PopColor();
Utility.PushColor(ConsoleColor.DarkGreen);
Console.WriteLine(" - Character: {0} (serial={1})", newChar.Name, newChar.Serial);
Console.WriteLine(" - Started: {0} {1} in {2}", city.City, city.Location, city.Map);
Utility.PopColor();
new WelcomeTimer(newChar).Start();
}
private static void FixStats(ref int str, ref int dex, ref int intel, int max)
{
var vMax = max - 30;
var vStr = str - 10;
var vDex = dex - 10;
var vInt = intel - 10;
if (vStr < 0)
vStr = 0;
if (vDex < 0)
vDex = 0;
if (vInt < 0)
vInt = 0;
var total = vStr + vDex + vInt;
if (total == 0 || total == vMax)
return;
var scalar = vMax / (double)total;
vStr = (int)(vStr * scalar);
vDex = (int)(vDex * scalar);
vInt = (int)(vInt * scalar);
FixStat(ref vStr, (vStr + vDex + vInt) - vMax, vMax);
FixStat(ref vDex, (vStr + vDex + vInt) - vMax, vMax);
FixStat(ref vInt, (vStr + vDex + vInt) - vMax, vMax);
str = vStr + 10;
dex = vDex + 10;
intel = vInt + 10;
}
private static void FixStat(ref int stat, int diff, int max)
{
stat += diff;
if (stat < 0)
stat = 0;
else if (stat > max)
stat = max;
}
private static void SetStats(Mobile m, NetState state, int str, int dex, int intel)
{
var max = state.NewCharacterCreation ? 90 : 80;
FixStats(ref str, ref dex, ref intel, max);
if (str < 10 || str > 60 || dex < 10 || dex > 60 || intel < 10 || intel > 60 || (str + dex + intel) != max)
{
str = 10;
dex = 10;
intel = 10;
}
m.InitStats(str, dex, intel);
}
private static void SetName(Mobile m, string name)
{
name = name.Trim();
if (!NameVerification.Validate(name, 2, 16, true, false, true, 1, NameVerification.SpaceDashPeriodQuote))
name = "Generic Player";
m.Name = name;
}
private static bool ValidSkills(SkillNameValue[] skills)
{
var total = 0;
for (var i = 0; i < skills.Length; ++i)
{
if (skills[i].Value < 0 || skills[i].Value > 50)
return false;
total += skills[i].Value;
for (var j = i + 1; j < skills.Length; ++j)
{
if (skills[j].Value > 0 && skills[j].Name == skills[i].Name)
return false;
}
}
return (total == 100 || total == 120);
}
private static void SetStats(Mobile m, NetState state, int prof, int str, int dex, int intel)
{
switch (prof)
{
case 1: // Warrior
{
str = 45;
dex = 35;
intel = 10;
break;
}
case 2: // Magician
{
str = 25;
dex = 20;
intel = 45;
break;
}
case 3: // Blacksmith
{
str = 60;
dex = 15;
intel = 15;
break;
}
case 4: // Necromancer
{
str = 25;
dex = 20;
intel = 45;
break;
}
case 5: // Paladin
{
str = 45;
dex = 20;
intel = 25;
break;
}
case 6: //Samurai
{
str = 40;
dex = 30;
intel = 20;
break;
}
case 7: //Ninja
{
str = 40;
dex = 30;
intel = 20;
break;
}
default:
{
SetStats(m, state, str, dex, intel);
return;
}
}
m.InitStats(str, dex, intel);
}
private static void SetSkills(Mobile m, SkillNameValue[] skills, int prof)
{
switch (prof)
{
case 1: // Warrior
{
skills = new[]
{
new SkillNameValue(SkillName.Anatomy, 30), new SkillNameValue(SkillName.Healing, 30),
new SkillNameValue(SkillName.Swords, 30), new SkillNameValue(SkillName.Tactics, 30)
};
break;
}
case 2: // Magician
{
skills = new[]
{
new SkillNameValue(SkillName.EvalInt, 30), new SkillNameValue(SkillName.Wrestling, 30),
new SkillNameValue(SkillName.Magery, 30), new SkillNameValue(SkillName.Meditation, 30)
};
break;
}
case 3: // Blacksmith
{
skills = new[]
{
new SkillNameValue(SkillName.Mining, 30), new SkillNameValue(SkillName.ArmsLore, 30),
new SkillNameValue(SkillName.Blacksmith, 30), new SkillNameValue(SkillName.Tinkering, 30)
};
break;
}
case 4: // Necromancer
{
skills = new[]
{
new SkillNameValue(SkillName.Necromancy, 30),
new SkillNameValue(SkillName.SpiritSpeak, 30), new SkillNameValue(SkillName.Swords, 30),
new SkillNameValue(SkillName.Meditation, 20)
};
break;
}
case 5: // Paladin
{
skills = new[]
{
new SkillNameValue(SkillName.Chivalry, 30), new SkillNameValue(SkillName.Swords, 30),
new SkillNameValue(SkillName.Focus, 30), new SkillNameValue(SkillName.Tactics, 30)
};
break;
}
case 6: //Samurai
{
skills = new[]
{
new SkillNameValue(SkillName.Bushido, 30), new SkillNameValue(SkillName.Swords, 30),
new SkillNameValue(SkillName.Anatomy, 30), new SkillNameValue(SkillName.Healing, 30)
};
break;
}
case 7: //Ninja
{
skills = new[]
{
new SkillNameValue(SkillName.Ninjitsu, 30), new SkillNameValue(SkillName.Hiding, 30),
new SkillNameValue(SkillName.Fencing, 30), new SkillNameValue(SkillName.Stealth, 30)
};
break;
}
default:
{
if (!ValidSkills(skills))
return;
break;
}
}
var addSkillItems = true;
var elf = (m.Race == Race.Elf);
var human = (m.Race == Race.Human);
var gargoyle = (m.Race == Race.Gargoyle);
switch (prof)
{
case 1: // Warrior
{
if (elf)
EquipItem(new LeafChest());
else if (human)
EquipItem(new LeatherChest());
else if (gargoyle)
{
EquipItem(new GargishLeatherChest());
}
break;
}
case 4: // Necromancer
{
Container regs = new BagOfNecroReagents(50);
if (!Core.AOS)
{
foreach (var item in regs.Items)
item.LootType = LootType.Newbied;
}
PackItem(regs);
regs.LootType = LootType.Regular;
if (elf || human)
EquipItem(new BoneHelm());
if (elf)
{
EquipItem(new ElvenMachete());
EquipItem(NecroHue(new LeafChest()));
EquipItem(NecroHue(new LeafArms()));
EquipItem(NecroHue(new LeafGloves()));
EquipItem(NecroHue(new LeafGorget()));
EquipItem(NecroHue(new LeafGorget()));
EquipItem(NecroHue(new ElvenPants())); //TODO: Verify the pants
EquipItem(new ElvenBoots());
}
else if (human)
{
EquipItem(new BoneHarvester());
EquipItem(NecroHue(new LeatherChest()));
EquipItem(NecroHue(new LeatherArms()));
EquipItem(NecroHue(new LeatherGloves()));
EquipItem(NecroHue(new LeatherGorget()));
EquipItem(NecroHue(new LeatherLegs()));
EquipItem(NecroHue(new Skirt()));
EquipItem(new Sandals(0x8FD));
}
else if (gargoyle)
{
EquipItem(new GlassSword());
EquipItem(NecroHue(new GargishLeatherChest()));
EquipItem(NecroHue(new GargishLeatherArms()));
EquipItem(NecroHue(new GargishLeatherLegs()));
EquipItem(NecroHue(new GargishLeatherKilt()));
}
Spellbook
book = new NecromancerSpellbook(
(ulong)0x8981); // animate dead, evil omen, pain spike, summon familiar, wraith form
PackItem(book);
book.LootType = LootType.Blessed;
addSkillItems = false;
break;
}
case 5: // Paladin
{
if (elf)
{
EquipItem(new ElvenMachete());
EquipItem(new WingedHelm());
EquipItem(new LeafGorget());
EquipItem(new LeafArms());
EquipItem(new LeafChest());
EquipItem(new LeafLegs());
EquipItem(new ElvenBoots()); //Verify hue
}
else if (human)
{
EquipItem(new Broadsword());
EquipItem(new Helmet());
EquipItem(new PlateGorget());
EquipItem(new RingmailArms());
EquipItem(new RingmailChest());
EquipItem(new RingmailLegs());
EquipItem(new ThighBoots(0x748));
EquipItem(new Cloak(0xCF));
EquipItem(new BodySash(0xCF));
}
else if (gargoyle)
{
EquipItem(new DreadSword());
EquipItem(new GargishPlateChest());
EquipItem(new GargishPlateArms());
EquipItem(new GargishPlateLegs());
EquipItem(new GargishPlateKilt());
}
Spellbook book = new BookOfChivalry((ulong)0x3FF);
book.LootType = LootType.Blessed;
PackItem(book);
addSkillItems = false;
break;
}
case 6: // Samurai
{
if (elf || human)
{
EquipItem(new HakamaShita(0x2C3));
EquipItem(new Hakama(0x2C3));
EquipItem(new SamuraiTabi(0x2C3));
EquipItem(new TattsukeHakama(0x22D));
EquipItem(new Bokuto());
if (elf)
EquipItem(new RavenHelm());
else
EquipItem(new LeatherJingasa());
}
else if (gargoyle)
{
EquipItem(new GlassSword());
EquipItem(new GargishPlateChest());
EquipItem(new GargishPlateArms());
EquipItem(new GargishPlateLegs());
EquipItem(new GargishPlateKilt());
}
PackItem(new Scissors());
PackItem(new Bandage(50));
Spellbook book = new BookOfBushido();
PackItem(book);
addSkillItems = false;
break;
}
case 7: // Ninja
{
var hues = new[] {0x1A8, 0xEC, 0x99, 0x90, 0xB5, 0x336, 0x89};
//TODO: Verify that's ALL the hues for that above.
if (elf || human)
{
EquipItem(new Kasa());
EquipItem(new TattsukeHakama(hues[Utility.Random(hues.Length)]));
EquipItem(new HakamaShita(0x2C3));
EquipItem(new NinjaTabi(0x2C3));
if (elf)
EquipItem(new AssassinSpike());
else
EquipItem(new Tekagi());
}
else if (gargoyle)
{
EquipItem(new GargishDagger());
var hue = hues[Utility.Random(hues.Length)];
EquipItem(new GargishClothChestArmor(hue));
EquipItem(new GargishClothArmsArmor(hue));
EquipItem(new GargishClothLegsArmor(hue));
EquipItem(new GargishClothKiltArmor(hue));
}
PackItem(new SmokeBomb());
Spellbook book = new BookOfNinjitsu();
PackItem(book);
addSkillItems = false;
break;
}
}
for (var i = 0; i < skills.Length; ++i)
{
var snv = skills[i];
if (snv.Value > 0 && (snv.Name != SkillName.Stealth || prof == 7) && snv.Name != SkillName.RemoveTrap &&
snv.Name != SkillName.Spellweaving)
{
var skill = m.Skills[snv.Name];
if (skill != null)
{
skill.BaseFixedPoint = snv.Value * 10;
if (addSkillItems)
AddSkillItems(snv.Name, m);
}
}
}
}
private static void EquipItem(Item item)
{
EquipItem(item, false);
}
private static void EquipItem(Item item, bool mustEquip)
{
if (!Core.AOS)
item.LootType = LootType.Newbied;
if (m_Mobile != null && m_Mobile.EquipItem(item))
return;
var pack = m_Mobile.Backpack;
if (!mustEquip && pack != null)
pack.DropItem(item);
else
item.Delete();
}
private static void PackItem(Item item)
{
if (!Core.AOS)
item.LootType = LootType.Newbied;
var pack = m_Mobile.Backpack;
if (pack != null)
pack.DropItem(item);
else
item.Delete();
}
private static void PackInstrument()
{
switch (Utility.Random(6))
{
case 0:
PackItem(new Drums());
break;
case 1:
PackItem(new Harp());
break;
case 2:
PackItem(new LapHarp());
break;
case 3:
PackItem(new Lute());
break;
case 4:
PackItem(new Tambourine());
break;
case 5:
PackItem(new TambourineTassel());
break;
}
}
private static void PackScroll(int circle)
{
switch (Utility.Random(8) * (circle + 1))
{
case 0:
PackItem(new ClumsyScroll());
break;
case 1:
PackItem(new CreateFoodScroll());
break;
case 2:
PackItem(new FeeblemindScroll());
break;
case 3:
PackItem(new HealScroll());
break;
case 4:
PackItem(new MagicArrowScroll());
break;
case 5:
PackItem(new NightSightScroll());
break;
case 6:
PackItem(new ReactiveArmorScroll());
break;
case 7:
PackItem(new WeakenScroll());
break;
case 8:
PackItem(new AgilityScroll());
break;
case 9:
PackItem(new CunningScroll());
break;
case 10:
PackItem(new CureScroll());
break;
case 11:
PackItem(new HarmScroll());
break;
case 12:
PackItem(new MagicTrapScroll());
break;
case 13:
PackItem(new MagicUnTrapScroll());
break;
case 14:
PackItem(new ProtectionScroll());
break;
case 15:
PackItem(new StrengthScroll());
break;
case 16:
PackItem(new BlessScroll());
break;
case 17:
PackItem(new FireballScroll());
break;
case 18:
PackItem(new MagicLockScroll());
break;
case 19:
PackItem(new PoisonScroll());
break;
case 20:
PackItem(new TelekinisisScroll());
break;
case 21:
PackItem(new TeleportScroll());
break;
case 22:
PackItem(new UnlockScroll());
break;
case 23:
PackItem(new WallOfStoneScroll());
break;
}
}
private static Item NecroHue(Item item)
{
item.Hue = 0x2C3;
return item;
}
private static void AddSkillItems(SkillName skill, Mobile m)
{
var elf = (m.Race == Race.Elf);
var human = (m.Race == Race.Human);
var gargoyle = (m.Race == Race.Gargoyle);
switch (skill)
{
case SkillName.Alchemy:
{
PackItem(new Bottle(4));
PackItem(new MortarPestle());
var hue = Utility.RandomPinkHue();
if (elf)
{
if (m.Female)
EquipItem(new FemaleElvenRobe(hue));
else
EquipItem(new MaleElvenRobe(hue));
}
else
{
EquipItem(new Robe(Utility.RandomPinkHue()));
}
break;
}
case SkillName.Anatomy:
{
PackItem(new Bandage(3));
var hue = Utility.RandomYellowHue();
if (elf)
{
if (m.Female)
EquipItem(new FemaleElvenRobe(hue));
else
EquipItem(new MaleElvenRobe(hue));
}
else
{
EquipItem(new Robe(hue));
}
break;
}
case SkillName.AnimalLore:
{
var hue = Utility.RandomBlueHue();
if (elf)
{
EquipItem(new WildStaff());
if (m.Female)
EquipItem(new FemaleElvenRobe(hue));
else
EquipItem(new MaleElvenRobe(hue));
}
else
{
EquipItem(new ShepherdsCrook());
EquipItem(new Robe(hue));
}
break;
}
case SkillName.Archery:
{
PackItem(new Arrow(25));
if (elf)
EquipItem(new ElvenCompositeLongbow());
else if (human)
EquipItem(new Bow());
break;
}
case SkillName.ArmsLore:
{
if (elf)
{
switch (Utility.Random(3))
{
case 0:
EquipItem(new Leafblade());
break;
case 1:
EquipItem(new RuneBlade());
break;
case 2:
EquipItem(new DiamondMace());
break;
}
}
else if (human)
{
switch (Utility.Random(3))
{
case 0:
EquipItem(new Kryss());
break;
case 1:
EquipItem(new Katana());
break;
case 2:
EquipItem(new Club());
break;
}
}
else if (gargoyle)
{
switch (Utility.Random(3))
{
case 0:
EquipItem(new BloodBlade());
break;
case 1:
EquipItem(new GlassSword());
break;
case 2:
EquipItem(new DiscMace());
break;
}
}
break;
}
case SkillName.Begging:
{
if (elf)
EquipItem(new WildStaff());
else if (human)
EquipItem(new GnarledStaff());
else if (gargoyle)
EquipItem(new SerpentStoneStaff());
break;
}
case SkillName.Blacksmith:
{
PackItem(new Tongs());
PackItem(new Pickaxe());
PackItem(new Pickaxe());
PackItem(new IronIngot(50));
if (human || elf)
{
EquipItem(new HalfApron(Utility.RandomYellowHue()));
}
break;
}
case SkillName.Bushido:
{
if (human || elf)
{
EquipItem(new Hakama());
EquipItem(new Kasa());
}
EquipItem(new BookOfBushido());
break;
}
case SkillName.Fletching:
{
PackItem(new Board(14));
PackItem(new Feather(5));
PackItem(new Shaft(5));
break;
}
case SkillName.Camping:
{
PackItem(new Bedroll());
PackItem(new Kindling(5));
break;
}
case SkillName.Carpentry:
{
PackItem(new Board(10));
PackItem(new Saw());
if (human || elf)
{
EquipItem(new HalfApron(Utility.RandomYellowHue()));
}
break;
}
case SkillName.Cartography:
{
PackItem(new BlankMap());
PackItem(new BlankMap());
PackItem(new BlankMap());
PackItem(new BlankMap());
PackItem(new Sextant());
break;
}
case SkillName.Cooking:
{
PackItem(new Kindling(2));
PackItem(new RawLambLeg());
PackItem(new RawChickenLeg());
PackItem(new RawFishSteak());
PackItem(new SackFlour());
PackItem(new Pitcher(BeverageType.Water));
break;
}
case SkillName.Chivalry:
{
if (Core.ML)
PackItem(new BookOfChivalry((ulong)0x3FF));
break;
}
case SkillName.DetectHidden:
{
if (human || elf)
EquipItem(new Cloak(0x455));
break;
}
case SkillName.Discordance:
{
PackInstrument();
break;
}
case SkillName.Fencing:
{
if (elf)
EquipItem(new Leafblade());
else if (human)
EquipItem(new Kryss());
else if (gargoyle)
EquipItem(new BloodBlade());
break;
}
case SkillName.Fishing:
{
EquipItem(new FishingPole());
var hue = Utility.RandomYellowHue();
if (elf)
{
Item i = new Circlet();
i.Hue = hue;
EquipItem(i);
}
else if (human)
{
EquipItem(new FloppyHat(hue));
}
break;
}
case SkillName.Healing:
{
PackItem(new Bandage(50));
PackItem(new Scissors());
break;
}
case SkillName.Herding:
{
if (elf)
EquipItem(new WildStaff());
else
EquipItem(new ShepherdsCrook());
break;
}
case SkillName.Hiding:
{
if (human || elf)
EquipItem(new Cloak(0x455));
break;
}
case SkillName.Inscribe:
{
PackItem(new BlankScroll(2));
PackItem(new BlueBook());
break;
}
case SkillName.ItemID:
{
if (elf)
EquipItem(new WildStaff());
else if (human)
EquipItem(new GnarledStaff());
else if (gargoyle)
EquipItem(new SerpentStoneStaff());
break;
}
case SkillName.Lockpicking:
{
PackItem(new Lockpick(20));
break;
}
case SkillName.Lumberjacking:
{
if (human || elf)
EquipItem(new Hatchet());
else if (gargoyle)
EquipItem(new DualShortAxes());
break;
}
case SkillName.Macing:
{
if (elf)
EquipItem(new DiamondMace());
else if (human)
EquipItem(new Club());
else if (gargoyle)
EquipItem(new DiscMace());
break;
}
case SkillName.Magery:
{
var regs = new BagOfReagents(50);
if (!Core.AOS)
{
foreach (var item in regs.Items)
item.LootType = LootType.Newbied;
}
PackItem(regs);
regs.LootType = LootType.Regular;
PackScroll(0);
PackScroll(1);
PackScroll(2);
var book = new Spellbook((ulong)0x382A8C38);
book.LootType = LootType.Blessed;
EquipItem(book);
if (elf)
{
EquipItem(new Circlet());
if (m.Female)
EquipItem(new FemaleElvenRobe(Utility.RandomBlueHue()));
else
EquipItem(new MaleElvenRobe(Utility.RandomBlueHue()));
}
else
{
if (human)
EquipItem(new WizardsHat());
EquipItem(new Robe(Utility.RandomBlueHue()));
}
break;
}
case SkillName.Mining:
{
PackItem(new Pickaxe());
break;
}
case SkillName.Musicianship:
{
PackInstrument();
break;
}
case SkillName.Necromancy:
{
if (Core.ML)
{
Container regs = new BagOfNecroReagents(50);
PackItem(regs);
regs.LootType = LootType.Regular;
}
// RunUO fix
Spellbook
book = new NecromancerSpellbook(
(ulong)0x8981); // animate dead, evil omen, pain spike, summon familiar, wraith form
book.LootType = LootType.Blessed;
PackItem(book);
break;
}
case SkillName.Ninjitsu:
{
if (human || elf)
{
EquipItem(new Hakama(0x2C3)); //Only ninjas get the hued one.
EquipItem(new Kasa());
}
EquipItem(new BookOfNinjitsu());
break;
}
case SkillName.Parry:
{
if (human || elf)
EquipItem(new WoodenShield());
else if (gargoyle)
EquipItem(new GargishWoodenShield());
break;
}
case SkillName.Peacemaking:
{
PackInstrument();
break;
}
case SkillName.Poisoning:
{
PackItem(new LesserPoisonPotion());
PackItem(new LesserPoisonPotion());
break;
}
case SkillName.Provocation:
{
PackInstrument();
break;
}
case SkillName.Snooping:
{
PackItem(new Lockpick(20));
break;
}
case SkillName.SpiritSpeak:
{
if (human || elf)
{
EquipItem(new Cloak(0x455));
}
break;
}
case SkillName.Stealing:
{
PackItem(new Lockpick(20));
break;
}
case SkillName.Swords:
{
if (elf)
EquipItem(new RuneBlade());
else if (human)
EquipItem(new Katana());
else if (gargoyle)
EquipItem(new GlassSword());
break;
}
case SkillName.Tactics:
{
if (elf)
EquipItem(new RuneBlade());
else if (human)
EquipItem(new Katana());
else if (gargoyle)
EquipItem(new GlassSword());
break;
}
case SkillName.Tailoring:
{
PackItem(new BoltOfCloth());
PackItem(new SewingKit());
break;
}
case SkillName.Tinkering:
{
PackItem(new TinkerTools());
PackItem(new IronIngot(50));
PackItem(new Axle());
PackItem(new AxleGears());
PackItem(new Springs());
PackItem(new ClockFrame());
break;
}
case SkillName.Tracking:
{
if (human || elf)
{
if (m_Mobile != null)
{
var shoes = m_Mobile.FindItemOnLayer(Layer.Shoes);
if (shoes != null)
shoes.Delete();
}
var hue = Utility.RandomYellowHue();
if (elf)
EquipItem(new ElvenBoots(hue));
else
EquipItem(new Boots(hue));
EquipItem(new SkinningKnife());
}
else if (gargoyle)
PackItem(new SkinningKnife());
break;
}
case SkillName.Veterinary:
{
PackItem(new Bandage(5));
PackItem(new Scissors());
break;
}
case SkillName.Wrestling:
{
if (elf)
EquipItem(new LeafGloves());
else if (human)
EquipItem(new LeatherGloves());
else if (gargoyle)
{
// Why not give them arm armor?
EquipItem(new GargishLeatherArms());
}
break;
}
case SkillName.Throwing:
{
if (gargoyle)
EquipItem(new Boomerang());
break;
}
case SkillName.Mysticism:
{
PackItem(new MysticBook((ulong)0xAB));
break;
}
}
}
private class BadStartMessage : Timer
{
readonly Mobile m_Mobile;
readonly int m_Message;
public BadStartMessage(Mobile m, int message)
: base(TimeSpan.FromSeconds(3.5))
{
m_Mobile = m;
m_Message = message;
Start();
}
protected override void OnTick()
{
m_Mobile.SendLocalizedMessage(m_Message);
}
}
}
}