using System;
using Server;
using Server.Items;
using Server.Mobiles;
using Server.Network;
using Server.Accounting;
namespace Server.Misc
{
public class CharacterCreation
{
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public static void Initialize()
{
// Register our event handler
EventSink.CharacterCreated += new CharacterCreatedEventHandler( EventSink_CharacterCreated );
}
private static void AddBackpack( Mobile m )
{
Container 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 Dagger() );
PackItem( new Candle() );
}
private static Item MakeNewbie( Item item )
{
if ( !Core.AOS )
item.LootType = LootType.Newbied;
return item;
}
private static void PlaceItemIn( Container parent, int x, int y, Item item )
{
parent.AddItem( item );
item.Location = new Point3D( x, y, 0 );
}
private static Item MakePotionKeg( PotionEffect type, int hue )
{
PotionKeg keg = new PotionKeg();
keg.Held = 100;
keg.Type = type;
keg.Hue = hue;
return MakeNewbie( keg );
}
private static void FillBankAOS( Mobile m )
{
BankBox bank = m.BankBox;
if ( bank == null )
return;
// The new AOS bankboxes don't have powerscrolls, they are automatically 'applied':
for ( int i = 0; i < PowerScroll.Skills.Length; ++i )
m.Skills[PowerScroll.Skills[ i ]].Cap = 120.0;
m.StatCap = 250;
Container cont;
// Begin box of money
cont = new WoodenBox();
cont.ItemID = 0xE7D;
cont.Hue = 0x489;
PlaceItemIn( cont, 16, 51, new BankCheck( 500000 ) );
PlaceItemIn( cont, 28, 51, new BankCheck( 250000 ) );
PlaceItemIn( cont, 40, 51, new BankCheck( 100000 ) );
PlaceItemIn( cont, 52, 51, new BankCheck( 100000 ) );
PlaceItemIn( cont, 64, 51, new BankCheck( 50000 ) );
PlaceItemIn( cont, 16, 115, new Factions.Silver( 9000 ) );
PlaceItemIn( cont, 34, 115, new Gold( 60000 ) );
PlaceItemIn( bank, 18, 169, cont );
// End box of money
// Begin bag of potion kegs
cont = new Backpack();
cont.Name = "Various Potion Kegs";
PlaceItemIn( cont, 45, 149, MakePotionKeg( PotionEffect.CureGreater, 0x2D ) );
PlaceItemIn( cont, 69, 149, MakePotionKeg( PotionEffect.HealGreater, 0x499 ) );
PlaceItemIn( cont, 93, 149, MakePotionKeg( PotionEffect.PoisonDeadly, 0x46 ) );
PlaceItemIn( cont, 117, 149, MakePotionKeg( PotionEffect.RefreshTotal, 0x21 ) );
PlaceItemIn( cont, 141, 149, MakePotionKeg( PotionEffect.ExplosionGreater, 0x74 ) );
PlaceItemIn( cont, 93, 82, new Bottle( 1000 ) );
PlaceItemIn( bank, 53, 169, cont );
// End bag of potion kegs
// Begin bag of tools
cont = new Bag();
cont.Name = "Tool Bag";
PlaceItemIn( cont, 30, 35, new TinkerTools( 1000 ) );
PlaceItemIn( cont, 60, 35, new HousePlacementTool() );
PlaceItemIn( cont, 90, 35, new DovetailSaw( 1000 ) );
PlaceItemIn( cont, 30, 68, new Scissors() );
PlaceItemIn( cont, 45, 68, new MortarPestle( 1000 ) );
PlaceItemIn( cont, 75, 68, new ScribesPen( 1000 ) );
PlaceItemIn( cont, 90, 68, new SmithHammer( 1000 ) );
PlaceItemIn( cont, 30, 118, new TwoHandedAxe() );
PlaceItemIn( cont, 60, 118, new FletcherTools( 1000 ) );
PlaceItemIn( cont, 90, 118, new SewingKit( 1000 ) );
PlaceItemIn( cont, 36, 51, new RunicHammer( CraftResource.DullCopper, 50 ) );
PlaceItemIn( cont, 42, 51, new RunicHammer( CraftResource.ShadowIron, 45 ) );
PlaceItemIn( cont, 48, 51, new RunicHammer( CraftResource.Copper, 40 ) );
PlaceItemIn( cont, 54, 51, new RunicHammer( CraftResource.Bronze, 35 ) );
PlaceItemIn( cont, 61, 51, new RunicHammer( CraftResource.Gold, 30 ) );
PlaceItemIn( cont, 67, 51, new RunicHammer( CraftResource.Agapite, 25 ) );
PlaceItemIn( cont, 73, 51, new RunicHammer( CraftResource.Verite, 20 ) );
PlaceItemIn( cont, 79, 51, new RunicHammer( CraftResource.Valorite, 15 ) );
PlaceItemIn( cont, 36, 55, new RunicSewingKit( CraftResource.SpinedLeather, 45 ) );
PlaceItemIn( cont, 42, 55, new RunicSewingKit( CraftResource.HornedLeather, 30 ) );
PlaceItemIn( cont, 48, 55, new RunicSewingKit( CraftResource.BarbedLeather, 15 ) );
PlaceItemIn( bank, 118, 169, cont );
// End bag of tools
// Begin bag of archery ammo
cont = new Bag();
cont.Name = "Bag Of Archery Ammo";
PlaceItemIn( cont, 48, 76, new Arrow( 5000 ) );
PlaceItemIn( cont, 72, 76, new Bolt( 5000 ) );
PlaceItemIn( bank, 118, 124, cont );
// End bag of archery ammo
// Begin bag of treasure maps
cont = new Bag();
cont.Name = "Bag Of Treasure Maps";
PlaceItemIn( cont, 30, 35, new TreasureMap( 1, Map.Trammel ) );
PlaceItemIn( cont, 45, 35, new TreasureMap( 2, Map.Trammel ) );
PlaceItemIn( cont, 60, 35, new TreasureMap( 3, Map.Trammel ) );
PlaceItemIn( cont, 75, 35, new TreasureMap( 4, Map.Trammel ) );
PlaceItemIn( cont, 90, 35, new TreasureMap( 5, Map.Trammel ) );
PlaceItemIn( cont, 90, 35, new TreasureMap( 6, Map.Trammel ) );
PlaceItemIn( cont, 30, 50, new TreasureMap( 1, Map.Trammel ) );
PlaceItemIn( cont, 45, 50, new TreasureMap( 2, Map.Trammel ) );
PlaceItemIn( cont, 60, 50, new TreasureMap( 3, Map.Trammel ) );
PlaceItemIn( cont, 75, 50, new TreasureMap( 4, Map.Trammel ) );
PlaceItemIn( cont, 90, 50, new TreasureMap( 5, Map.Trammel ) );
PlaceItemIn( cont, 90, 50, new TreasureMap( 6, Map.Trammel ) );
PlaceItemIn( cont, 55, 100, new Lockpick( 30 ) );
PlaceItemIn( cont, 60, 100, new Pickaxe() );
PlaceItemIn( bank, 98, 124, cont );
// End bag of treasure maps
// Begin bag of raw materials
cont = new Bag();
cont.Hue = 0x835;
cont.Name = "Raw Materials Bag";
PlaceItemIn( cont, 92, 60, new BarbedLeather( 5000 ) );
PlaceItemIn( cont, 92, 68, new HornedLeather( 5000 ) );
PlaceItemIn( cont, 92, 76, new SpinedLeather( 5000 ) );
PlaceItemIn( cont, 92, 84, new Leather( 5000 ) );
PlaceItemIn( cont, 30, 118, new Cloth( 5000 ) );
PlaceItemIn( cont, 30, 84, new Board( 5000 ) );
PlaceItemIn( cont, 57, 80, new BlankScroll( 500 ) );
PlaceItemIn( cont, 30, 35, new DullCopperIngot( 5000 ) );
PlaceItemIn( cont, 37, 35, new ShadowIronIngot( 5000 ) );
PlaceItemIn( cont, 44, 35, new CopperIngot( 5000 ) );
PlaceItemIn( cont, 51, 35, new BronzeIngot( 5000 ) );
PlaceItemIn( cont, 58, 35, new GoldIngot( 5000 ) );
PlaceItemIn( cont, 65, 35, new AgapiteIngot( 5000 ) );
PlaceItemIn( cont, 72, 35, new VeriteIngot( 5000 ) );
PlaceItemIn( cont, 79, 35, new ValoriteIngot( 5000 ) );
PlaceItemIn( cont, 86, 35, new IronIngot( 5000 ) );
PlaceItemIn( cont, 30, 59, new RedScales( 5000 ) );
PlaceItemIn( cont, 36, 59, new YellowScales( 5000 ) );
PlaceItemIn( cont, 42, 59, new BlackScales( 5000 ) );
PlaceItemIn( cont, 48, 59, new GreenScales( 5000 ) );
PlaceItemIn( cont, 54, 59, new WhiteScales( 5000 ) );
PlaceItemIn( cont, 60, 59, new BlueScales( 5000 ) );
PlaceItemIn( bank, 98, 169, cont );
// End bag of raw materials
// Begin bag of spell casting stuff
cont = new Backpack();
cont.Hue = 0x480;
cont.Name = "Spell Casting Stuff";
PlaceItemIn( cont, 45, 105, new Spellbook( UInt64.MaxValue ) );
PlaceItemIn( cont, 65, 105, new NecromancerSpellbook( (UInt64)0xFFFF ) );
PlaceItemIn( cont, 85, 105, new BookOfChivalry( (UInt64)0x3FF ) );
PlaceItemIn( cont, 105, 105, new BookOfBushido() ); //Default ctor = full
PlaceItemIn( cont, 125, 105, new BookOfNinjitsu() ); //Default ctor = full
Runebook runebook = new Runebook( 10 );
runebook.CurCharges = runebook.MaxCharges;
PlaceItemIn( cont, 105, 105, runebook );
Item toHue = new BagOfReagents( 150 );
toHue.Hue = 0x2D;
PlaceItemIn( cont, 45, 150, toHue );
toHue = new BagOfNecroReagents( 150 );
toHue.Hue = 0x488;
PlaceItemIn( cont, 65, 150, toHue );
PlaceItemIn( cont, 140, 150, new BagOfAllReagents( 500 ) );
for ( int i = 0; i < 9; ++i )
PlaceItemIn( cont, 45 + (i * 10), 75, new RecallRune() );
PlaceItemIn( cont, 141, 74, new FireHorn() );
PlaceItemIn( bank, 78, 169, cont );
// End bag of spell casting stuff
// Begin bag of ethereals
cont = new Backpack();
cont.Hue = 0x490;
cont.Name = "Bag Of Ethy's!";
PlaceItemIn( cont, 45, 66, new EtherealHorse() );
PlaceItemIn( cont, 69, 82, new EtherealOstard() );
PlaceItemIn( cont, 93, 99, new EtherealLlama() );
PlaceItemIn( cont, 117, 115, new EtherealKirin() );
PlaceItemIn( cont, 45, 132, new EtherealUnicorn() );
PlaceItemIn( cont, 69, 66, new EtherealRidgeback() );
PlaceItemIn( cont, 93, 82, new EtherealSwampDragon() );
PlaceItemIn( cont, 117, 99, new EtherealBeetle() );
PlaceItemIn( bank, 38, 124, cont );
// End bag of ethereals
// Begin first bag of artifacts
cont = new Backpack();
cont.Hue = 0x48F;
cont.Name = "Bag of Artifacts";
PlaceItemIn( cont, 45, 66, new TitansHammer() );
PlaceItemIn( cont, 69, 82, new InquisitorsResolution() );
PlaceItemIn( cont, 93, 99, new BladeOfTheRighteous() );
PlaceItemIn( cont, 117, 115, new ZyronicClaw() );
PlaceItemIn( bank, 58, 124, cont );
// End first bag of artifacts
// Begin second bag of artifacts
cont = new Backpack();
cont.Hue = 0x48F;
cont.Name = "Bag of Artifacts";
PlaceItemIn( cont, 45, 66, new GauntletsOfNobility() );
PlaceItemIn( cont, 69, 82, new MidnightBracers() );
PlaceItemIn( cont, 93, 99, new VoiceOfTheFallenKing() );
PlaceItemIn( cont, 117, 115, new OrnateCrownOfTheHarrower() );
PlaceItemIn( cont, 45, 132, new HelmOfInsight() );
PlaceItemIn( cont, 69, 66, new HolyKnightsBreastplate() );
PlaceItemIn( cont, 93, 82, new ArmorOfFortune() );
PlaceItemIn( cont, 117, 99, new TunicOfFire() );
PlaceItemIn( cont, 45, 115, new LeggingsOfBane() );
PlaceItemIn( cont, 69, 132, new ArcaneShield() );
PlaceItemIn( cont, 93, 66, new Aegis() );
PlaceItemIn( cont, 117, 82, new RingOfTheVile() );
PlaceItemIn( cont, 45, 99, new BraceletOfHealth() );
PlaceItemIn( cont, 69, 115, new RingOfTheElements() );
PlaceItemIn( cont, 93, 132, new OrnamentOfTheMagician() );
PlaceItemIn( cont, 117, 66, new DivineCountenance() );
PlaceItemIn( cont, 45, 82, new JackalsCollar() );
PlaceItemIn( cont, 69, 99, new HuntersHeaddress() );
PlaceItemIn( cont, 93, 115, new HatOfTheMagi() );
PlaceItemIn( cont, 117, 132, new ShadowDancerLeggings() );
PlaceItemIn( cont, 45, 66, new SpiritOfTheTotem() );
PlaceItemIn( cont, 69, 82, new BladeOfInsanity() );
PlaceItemIn( cont, 93, 99, new AxeOfTheHeavens() );
PlaceItemIn( cont, 117, 115, new TheBeserkersMaul() );
PlaceItemIn( cont, 45, 132, new Frostbringer() );
PlaceItemIn( cont, 69, 66, new BreathOfTheDead() );
PlaceItemIn( cont, 93, 82, new TheDragonSlayer() );
PlaceItemIn( cont, 117, 99, new BoneCrusher() );
PlaceItemIn( cont, 45, 115, new StaffOfTheMagi() );
PlaceItemIn( cont, 69, 132, new SerpentsFang() );
PlaceItemIn( cont, 93, 66, new LegacyOfTheDreadLord() );
PlaceItemIn( cont, 117, 82, new TheTaskmaster() );
PlaceItemIn( cont, 45, 99, new TheDryadBow() );
PlaceItemIn( bank, 78, 124, cont );
// End second bag of artifacts
// Begin bag of minor artifacts
cont = new Backpack();
cont.Hue = 0x48F;
cont.Name = "Bag of Minor Artifacts";
PlaceItemIn( cont, 45, 66, new LunaLance() );
PlaceItemIn( cont, 69, 82, new VioletCourage() );
PlaceItemIn( cont, 93, 99, new CavortingClub() );
PlaceItemIn( cont, 117, 115, new CaptainQuacklebushsCutlass() );
PlaceItemIn( cont, 45, 132, new NightsKiss() );
PlaceItemIn( cont, 69, 66, new ShipModelOfTheHMSCape() );
PlaceItemIn( cont, 93, 82, new AdmiralsHeartyRum() );
PlaceItemIn( cont, 117, 99, new CandelabraOfSouls() );
PlaceItemIn( cont, 45, 115, new IolosLute() );
PlaceItemIn( cont, 69, 132, new GwennosHarp() );
PlaceItemIn( cont, 93, 66, new ArcticDeathDealer() );
PlaceItemIn( cont, 117, 82, new EnchantedTitanLegBone() );
PlaceItemIn( cont, 45, 99, new NoxRangersHeavyCrossbow() );
PlaceItemIn( cont, 69, 115, new BlazeOfDeath() );
PlaceItemIn( cont, 93, 132, new DreadPirateHat() );
PlaceItemIn( cont, 117, 66, new BurglarsBandana() );
PlaceItemIn( cont, 45, 82, new GoldBricks() );
PlaceItemIn( cont, 69, 99, new AlchemistsBauble() );
PlaceItemIn( cont, 93, 115, new PhillipsWoodenSteed() );
PlaceItemIn( cont, 117, 132, new PolarBearMask() );
PlaceItemIn( cont, 45, 66, new BowOfTheJukaKing() );
PlaceItemIn( cont, 69, 82, new GlovesOfThePugilist() );
PlaceItemIn( cont, 93, 99, new OrcishVisage() );
PlaceItemIn( cont, 117, 115, new StaffOfPower() );
PlaceItemIn( cont, 45, 132, new ShieldOfInvulnerability() );
PlaceItemIn( cont, 69, 66, new HeartOfTheLion() );
PlaceItemIn( cont, 93, 82, new ColdBlood() );
PlaceItemIn( cont, 117, 99, new GhostShipAnchor() );
PlaceItemIn( cont, 45, 115, new SeahorseStatuette() );
PlaceItemIn( cont, 69, 132, new WrathOfTheDryad() );
PlaceItemIn( cont, 93, 66, new PixieSwatter() );
/* TODO: Make MiBs that have 100% chance of a Ancient SoS
for( int i = 0; i < 10; i++ )
PlaceItemIn( cont, 117, 128, new MessageInABottle() );
*/
PlaceItemIn( bank, 18, 124, cont );
}
private static void FillBankbox( Mobile m )
{
if ( Core.AOS )
{
FillBankAOS( m );
return;
}
BankBox bank = m.BankBox;
if ( bank != null )
{
bank.DropItem( new BankCheck( 1000000 ) );
// Full spellbook
Spellbook book = new Spellbook();
book.Content = ulong.MaxValue;
bank.DropItem( book );
Bag bag = new Bag();
for ( int i = 0; i < 5; ++i )
bag.DropItem( new Moonstone( MoonstoneType.Felucca ) );
// Felucca moonstones
bank.DropItem( bag );
bag = new Bag();
for ( int i = 0; i < 5; ++i )
bag.DropItem( new Moonstone( MoonstoneType.Trammel ) );
// Trammel moonstones
bank.DropItem( bag );
// Treasure maps
bank.DropItem( new TreasureMap( 1, Map.Trammel ) );
bank.DropItem( new TreasureMap( 2, Map.Trammel ) );
bank.DropItem( new TreasureMap( 3, Map.Trammel ) );
bank.DropItem( new TreasureMap( 4, Map.Trammel ) );
bank.DropItem( new TreasureMap( 5, Map.Trammel ) );
// Bag containing 50 of each reagent
bank.DropItem( new BagOfReagents( 50 ) );
// Craft tools
bank.DropItem( MakeNewbie( new Scissors() ) );
bank.DropItem( MakeNewbie( new SewingKit( 1000 ) ) );
bank.DropItem( MakeNewbie( new SmithHammer( 1000 ) ) );
bank.DropItem( MakeNewbie( new FletcherTools( 1000 ) ) );
bank.DropItem( MakeNewbie( new DovetailSaw( 1000 ) ) );
bank.DropItem( MakeNewbie( new MortarPestle( 1000 ) ) );
bank.DropItem( MakeNewbie( new ScribesPen( 1000 ) ) );
bank.DropItem( MakeNewbie( new TinkerTools( 1000 ) ) );
// A few dye tubs
bank.DropItem( new Dyes() );
bank.DropItem( new DyeTub() );
bank.DropItem( new DyeTub() );
bank.DropItem( new BlackDyeTub() );
DyeTub darkRedTub = new DyeTub();
darkRedTub.DyedHue = 0x485;
darkRedTub.Redyable = false;
bank.DropItem( darkRedTub );
// Some food
bank.DropItem( MakeNewbie( new Apple( 1000 ) ) );
// Resources
bank.DropItem( MakeNewbie( new Feather( 1000 ) ) );
bank.DropItem( MakeNewbie( new BoltOfCloth( 1000 ) ) );
bank.DropItem( MakeNewbie( new BlankScroll( 1000 ) ) );
bank.DropItem( MakeNewbie( new Hides( 1000 ) ) );
bank.DropItem( MakeNewbie( new Bandage( 1000 ) ) );
bank.DropItem( MakeNewbie( new Bottle( 1000 ) ) );
bank.DropItem( MakeNewbie( new Log( 1000 ) ) );
bank.DropItem( MakeNewbie( new IronIngot( 5000 ) ) );
bank.DropItem( MakeNewbie( new DullCopperIngot( 5000 ) ) );
bank.DropItem( MakeNewbie( new ShadowIronIngot( 5000 ) ) );
bank.DropItem( MakeNewbie( new CopperIngot( 5000 ) ) );
bank.DropItem( MakeNewbie( new BronzeIngot( 5000 ) ) );
bank.DropItem( MakeNewbie( new GoldIngot( 5000 ) ) );
bank.DropItem( MakeNewbie( new AgapiteIngot( 5000 ) ) );
bank.DropItem( MakeNewbie( new VeriteIngot( 5000 ) ) );
bank.DropItem( MakeNewbie( new ValoriteIngot( 5000 ) ) );
// Reagents
bank.DropItem( MakeNewbie( new BlackPearl( 1000 ) ) );
bank.DropItem( MakeNewbie( new Bloodmoss( 1000 ) ) );
bank.DropItem( MakeNewbie( new Garlic( 1000 ) ) );
bank.DropItem( MakeNewbie( new Ginseng( 1000 ) ) );
bank.DropItem( MakeNewbie( new MandrakeRoot( 1000 ) ) );
bank.DropItem( MakeNewbie( new Nightshade( 1000 ) ) );
bank.DropItem( MakeNewbie( new SulfurousAsh( 1000 ) ) );
bank.DropItem( MakeNewbie( new SpidersSilk( 1000 ) ) );
// Some extra starting gold
bank.DropItem( MakeNewbie( new Gold( 9000 ) ) );
// 5 blank recall runes
for ( int i = 0; i < 5; ++i )
bank.DropItem( MakeNewbie( new RecallRune() ) );
AddPowerScrolls( bank );
}
}
private static void AddPowerScrolls( BankBox bank )
{
Bag bag = new Bag();
for ( int i = 0; i < PowerScroll.Skills.Length; ++i )
bag.DropItem( new PowerScroll( PowerScroll.Skills[i], 120.0 ) );
bag.DropItem( new StatCapScroll( 250 ) );
bank.DropItem( bag );
}
private static void AddShirt( Mobile m, int shirtHue )
{
int hue = Utility.ClipDyedHue( shirtHue & 0x3FFF );
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;
}
}
private static void AddPants( Mobile m, int pantsHue )
{
int hue = Utility.ClipDyedHue( pantsHue & 0x3FFF );
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;
}
}
}
private static void AddShoes( Mobile m )
{
EquipItem( new Shoes( Utility.RandomYellowHue() ), true );
}
private static void AddHair( Mobile m, int itemID, int hue )
{
Item item;
switch ( itemID & 0x3FFF )
{
case 0x2044: item = new Mohawk( hue ); break;
case 0x2045: item = new PageboyHair( hue ); break;
case 0x2046: item = new BunsHair( hue ); break;
case 0x2047: item = new Afro( hue ); break;
case 0x2048: item = new ReceedingHair( hue ); break;
case 0x2049: item = new TwoPigTails( hue ); break;
case 0x204A: item = new KrisnaHair( hue ); break;
case 0x203B: item = new ShortHair( hue ); break;
case 0x203C: item = new LongHair( hue ); break;
case 0x203D: item = new PonyTail( hue ); break;
default: return;
}
m.AddItem( item );
}
private static void AddBeard( Mobile m,