gortz
°¡ÀÔÀÏ: 2004³â 11¿ù 13ÀÏ
°Ô½Ã¹°: 2
ÁÖ ¼Ò: /
|
±Û ÀÛ¼º½Ã°£ : 2004-11-14 ÀÏ 6:51 pm Á¦¸ñ: [±ÞÇÔ] ½ºÅ³, ½ºÅÝ ³À̵µ ¼³Á¤ ¹æ¹ýÀ» ¾Ë°í½Í½À´Ï´Ù. |
|
|
¿ø·¡ ÀÖ´Â ¼³¸íÀ¸·Ð Àú´Â ÀÌÇØ°¡ ¾ÈµÇ¼¿ä.
ÀÚ¼¼ÇÏ°Ô ¾Ë·ÁÁֽǺРã¾Æ¿ä.
CharacterCreation.cs¶û SkillCheck.cs ¸¦ ¼öÁ¤À» ÇØº¸¾Ò´Âµ¥ ¹ÝÀÀÀÌ ¾ø´Â°Í °°¾Æ¼¿ä.
ÄÚµå :
using System;
using Server;
using Server.Mobiles;
namespace Server.Misc
{
public class SkillCheck
{
private const bool AntiMacroCode = true; //Change this to false to disable anti-macro code
public static TimeSpan AntiMacroExpire = TimeSpan.FromMinutes( 5.0 ); //How long do we remember targets/locations?
public const int Allowance = 3; //How many times may we use the same location/target for gain
private const int LocationSize = 5; //The size of eeach location, make this smaller so players dont have to move as far
private static bool[] UseAntiMacro = new bool[]
{
// true if this skill uses the anti-macro code, false if it does not
false,// Alchemy = 0,
true,// Anatomy = 1,
true,// AnimalLore = 2,
true,// ItemID = 3,
true,// ArmsLore = 4,
false,// Parry = 5,
true,// Begging = 6,
false,// Blacksmith = 7,
false,// Fletching = 8,
true,// Peacemaking = 9,
true,// Camping = 10,
false,// Carpentry = 11,
false,// Cartography = 12,
false,// Cooking = 13,
true,// DetectHidden = 14,
true,// Discordance = 15,
true,// EvalInt = 16,
true,// Healing = 17,
true,// Fishing = 18,
true,// Forensics = 19,
true,// Herding = 20,
true,// Hiding = 21,
true,// Provocation = 22,
false,// Inscribe = 23,
true,// Lockpicking = 24,
true,// Magery = 25,
true,// MagicResist = 26,
false,// Tactics = 27,
true,// Snooping = 28,
true,// Musicianship = 29,
true,// Poisoning = 30,
false,// Archery = 31,
true,// SpiritSpeak = 32,
true,// Stealing = 33,
false,// Tailoring = 34,
true,// AnimalTaming = 35,
true,// TasteID = 36,
false,// Tinkering = 37,
true,// Tracking = 38,
true,// Veterinary = 39,
false,// Swords = 40,
false,// Macing = 41,
false,// Fencing = 42,
false,// Wrestling = 43,
true,// Lumberjacking = 44,
true,// Mining = 45,
true,// Meditation = 46,
true,// Stealth = 47,
true,// RemoveTrap = 48,
true,// Necromancy = 49,
false,// Focus = 50,
true,// Chivalry = 51
};
public static void Initialize()
{
Mobile.SkillCheckLocationHandler = new SkillCheckLocationHandler( Mobile_SkillCheckLocation );
Mobile.SkillCheckDirectLocationHandler = new SkillCheckDirectLocationHandler( Mobile_SkillCheckDirectLocation );
Mobile.SkillCheckTargetHandler = new SkillCheckTargetHandler( Mobile_SkillCheckTarget );
Mobile.SkillCheckDirectTargetHandler = new SkillCheckDirectTargetHandler( Mobile_SkillCheckDirectTarget );
}
public static bool Mobile_SkillCheckLocation( Mobile from, SkillName skillName, double minSkill, double maxSkill )
{
Skill skill = from.Skills[skillName];
if ( skill == null )
return false;
double value = skill.Value;
if ( value < minSkill )
return false; // Too difficult
else if ( value >= maxSkill )
return true; // No challenge
double chance = (value - minSkill) / (maxSkill - minSkill);
Point2D loc = new Point2D( from.Location.X / LocationSize, from.Location.Y / LocationSize );
return CheckSkill( from, skill, loc, chance );
}
public static bool Mobile_SkillCheckDirectLocation( Mobile from, SkillName skillName, double chance )
{
Skill skill = from.Skills[skillName];
if ( skill == null )
return false;
if ( chance < 0.0 )
return false; // Too difficult
else if ( chance >= 1.0 )
return true; // No challenge
Point2D loc = new Point2D( from.Location.X / LocationSize, from.Location.Y / LocationSize );
return CheckSkill( from, skill, loc, chance );
}
public static bool CheckSkill( Mobile from, Skill skill, object amObj, double chance )
{
if ( from.Skills.Cap == 0 )
return false;
bool success = ( chance >= Utility.RandomDouble() );
double gc = (double)(from.Skills.Cap - from.Skills.Total) / from.Skills.Cap;
gc += ( skill.Cap - skill.Base ) / skill.Cap;
gc /= 2;
gc += ( 1.0 - chance ) * ( success ? 0.5 : 0.2 );
gc /= 2;
gc *= skill.Info.GainFactor;
if ( gc < 0.01 )
gc = 0.01;
if ( from is BaseCreature && ((BaseCreature)from).Controled )
gc *= 2;
if ( from.Alive && ( ( gc >= Utility.RandomDouble() && AllowGain( from, skill, amObj ) ) || skill.Base < 10.0 ) )
Gain( from, skill );
return success;
}
public static bool Mobile_SkillCheckTarget( Mobile from, SkillName skillName, object target, double minSkill, double maxSkill )
{
Skill skill = from.Skills[skillName];
if ( skill == null )
return false;
double value = skill.Value;
if ( value < minSkill )
return false; // Too difficult
else if ( value >= maxSkill )
return true; // No challenge
double chance = (value - minSkill) / (maxSkill - minSkill);
return CheckSkill( from, skill, target, chance );
}
public static bool Mobile_SkillCheckDirectTarget( Mobile from, SkillName skillName, object target, double chance )
{
Skill skill = from.Skills[skillName];
if ( skill == null )
return false;
if ( chance < 0.0 )
return false; // Too difficult
else if ( chance >= 1.0 )
return true; // No challenge
return CheckSkill( from, skill, target, chance );
}
private static bool AllowGain( Mobile from, Skill skill, object obj )
{
if ( from is PlayerMobile && AntiMacroCode && UseAntiMacro[skill.Info.SkillID] )
return ((PlayerMobile)from).AntiMacroCheck( skill, obj );
else
return true;
}
public enum Stat { Str, Dex, Int }
public static void Gain( Mobile from, Skill skill )
{
if ( from.Region is Regions.Jail )
return;
if ( from is BaseCreature && ((BaseCreature)from).IsDeadPet )
return;
if ( skill.SkillName == SkillName.Focus && from is BaseCreature )
return;
if ( skill.Base < skill.Cap && skill.Lock == SkillLock.Up )
{
int toGain = 1;
if ( skill.Base <= 5.0 )
toGain = Utility.Random( 4 ) + 1;
Skills skills = from.Skills;
if ( ( skills.Total / skills.Cap ) >= Utility.RandomDouble() )//( skills.Total >= skills.Cap )
{
for ( int i = 0; i < skills.Length; ++i )
{
Skill toLower = skills[i];
if ( toLower != skill && toLower.Lock == SkillLock.Down && toLower.BaseFixedPoint >= toGain )
{
toLower.BaseFixedPoint -= toGain;
break;
}
}
}
if ( (skills.Total + toGain) <= skills.Cap )
{
skill.BaseFixedPoint += toGain;
}
}
if ( skill.Lock == SkillLock.Up )
{
SkillInfo info = skill.Info;
//*****ÀÌ ºÎºÐÀ» 0.00 ¿¡¼ 1.00 °ªÀ¸·Î ¼öÁ¤Çϼ¼¿ä. ·±À¯¿À ±âº»°ªÀº 0À¸·Î ¼³Á¤µÇ¾îÀÖ½À´Ï´Ù. 1¿¡ °¡±î¿ï¼ö·Ï ½ºÅÈ ³À̵µ°¡ ½±´Ù°í »ý°¢ÇϽøéµË´Ï´Ù.********//
double StatGainBonus = 1.00; //Extra chance to gain in stats. Left at 0 would be default runuo gains.
//******************************************************************************************************************************************//
if ( from.StrLock == StatLockType.Up && ((info.StrGain / 33.3) + StatGainBonus) > Utility.RandomDouble() )
{
if( info.StrGain != 1.00 )
GainStat( from, Stat.Str );
}
else if ( from.DexLock == StatLockType.Up && ((info.DexGain / 33.3) + StatGainBonus) > Utility.RandomDouble() )
{
if( info.DexGain != 1.00 )
GainStat( from, Stat.Dex );
}
else if ( from.IntLock == StatLockType.Up && ((info.IntGain / 33.3) + StatGainBonus) > Utility.RandomDouble() )
{
if( info.IntGain != 1.00 )
GainStat( from, Stat.Int );
}
//following line used to show chance to gain stats ingame
//from.SendMessage( "Str: {0} Dex: {1} Int: {2}",((info.StrGain / 33.3) + StatGainBonus),((info.DexGain / 33.3) + StatGainBonus),((info.IntGain / 33.3) + StatGainBonus) );
}
}
public static bool CanLower( Mobile from, Stat stat )
{
switch ( stat )
{
case Stat.Str: return ( from.StrLock == StatLockType.Down && from.RawStr > 10 );
case Stat.Dex: return ( from.DexLock == StatLockType.Down && from.RawDex > 10 );
case Stat.Int: return ( from.IntLock == StatLockType.Down && from.RawInt > 10 );
}
return false;
}
public static bool CanRaise( Mobile from, Stat stat )
{
if ( !(from is BaseCreature && ((BaseCreature)from).Controled) )
{
if ( from.RawStatTotal >= from.StatCap )
return false;
}
switch ( stat )
{
case Stat.Str: return ( from.StrLock == StatLockType.Up && from.RawStr < 125 );
case Stat.Dex: return ( from.DexLock == StatLockType.Up && from.RawDex < 125 );
case Stat.Int: return ( from.IntLock == StatLockType.Up && from.RawInt < 125 );
}
return false;
}
public static void IncreaseStat( Mobile from, Stat stat, bool atrophy )
{
atrophy = atrophy || (from.RawStatTotal >= from.StatCap);
switch ( stat )
{
case Stat.Str:
{
if ( atrophy )
{
if ( CanLower( from, Stat.Dex ) && (from.RawDex < from.RawInt || !CanLower( from, Stat.Int )) )
--from.RawDex;
else if ( CanLower( from, Stat.Int ) )
--from.RawInt;
}
if ( CanRaise( from, Stat.Str ) )
++from.RawStr;
break;
}
case Stat.Dex:
{
if ( atrophy )
{
if ( CanLower( from, Stat.Str ) && (from.RawStr < from.RawInt || !CanLower( from, Stat.Int )) )
--from.RawStr;
else if ( CanLower( from, Stat.Int ) )
--from.RawInt;
}
if ( CanRaise( from, Stat.Dex ) )
++from.RawDex;
break;
}
case Stat.Int:
{
if ( atrophy )
{
if ( CanLower( from, Stat.Str ) && (from.RawStr < from.RawDex || !CanLower( from, Stat.Dex )) )
--from.RawStr;
else if ( CanLower( from, Stat.Dex ) )
--from.RawDex;
}
if ( CanRaise( from, Stat.Int ) )
++from.RawInt;
break;
}
}
}
private static TimeSpan m_StatGainDelay = TimeSpan.FromMinutes( 0.0 );
public static void GainStat( Mobile from, Stat stat )
{
if ( (from.LastStatGain + m_StatGainDelay) >= DateTime.Now )
return;
from.LastStatGain = DateTime.Now;
bool atrophy = ( (from.RawStatTotal / (double)from.StatCap) >= Utility.RandomDouble() );
IncreaseStat( from, stat, atrophy );
}
}
}
SkillCheck´Â À§Ã³·³ µÇÀÖ±¸¿ä.
CharacterCreation.cs´Â ¾Æ·¡ ó·³ µÇ¾îÀÖ½À´Ï´Ù.
ÄÚµå :
using System;
using Server;
using Server.Items;
using Server.Mobiles;
using Server.Network;
using Server.Accounting;
namespace Server.Misc
{
public class CharacterCreation
{
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, 34, 115, MakeNewbie( 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, MakeNewbie( 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, MakeNewbie( new TinkerTools( 1000 ) ) );
PlaceItemIn( cont, 60, 35, new HousePlacementTool() );
PlaceItemIn( cont, 90, 35, MakeNewbie( new DovetailSaw( 1000 ) ) );
PlaceItemIn( cont, 30, 68, MakeNewbie( new Scissors() ) );
PlaceItemIn( cont, 45, 68, MakeNewbie( new MortarPestle( 1000 ) ) );
PlaceItemIn( cont, 75, 68, MakeNewbie( new ScribesPen( 1000 ) ) );
PlaceItemIn( cont, 90, 68, MakeNewbie( new SmithHammer( 1000 ) ) );
PlaceItemIn( cont, 30, 118, MakeNewbie( new TwoHandedAxe() ) );
PlaceItemIn( cont, 60, 118, MakeNewbie( new FletcherTools( 1000 ) ) );
PlaceItemIn( cont, 90, 118, MakeNewbie( new SewingKit( 1000 ) ) );
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, MakeNewbie( new Arrow( 5000 ) ) );
PlaceItemIn( cont, 72, 76, MakeNewbie( 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, MakeNewbie( new TreasureMap( 1, Map.Trammel ) ) );
PlaceItemIn( cont, 45, 35, MakeNewbie( new TreasureMap( 2, Map.Trammel ) ) );
PlaceItemIn( cont, 60, 35, MakeNewbie( new TreasureMap( 3, Map.Trammel ) ) );
PlaceItemIn( cont, 75, 35, MakeNewbie( new TreasureMap( 4, Map.Trammel ) ) );
PlaceItemIn( cont, 90, 35, MakeNewbie( new TreasureMap( 5, Map.Trammel ) ) );
PlaceItemIn( cont, 30, 50, MakeNewbie( new TreasureMap( 1, Map.Trammel ) ) );
PlaceItemIn( cont, 45, 50, MakeNewbie( new TreasureMap( 2, Map.Trammel ) ) );
PlaceItemIn( cont, 60, 50, MakeNewbie( new TreasureMap( 3, Map.Trammel ) ) );
PlaceItemIn( cont, 75, 50, MakeNewbie( new TreasureMap( 4, Map.Trammel ) ) );
PlaceItemIn( cont, 90, 50, MakeNewbie( new TreasureMap( 5, Map.Trammel ) ) );
PlaceItemIn( cont, 55, 100, MakeNewbie( new Lockpick( 30 ) ) );
PlaceItemIn( cont, 60, 100, MakeNewbie( 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, MakeNewbie( new BarbedLeather( 5000 ) ) );
PlaceItemIn( cont, 92, 68, MakeNewbie( new HornedLeather( 5000 ) ) );
PlaceItemIn( cont, 92, 76, MakeNewbie( new SpinedLeather( 5000 ) ) );
PlaceItemIn( cont, 92, 84, MakeNewbie( new Leather( 5000 ) ) );
PlaceItemIn( cont, 30, 118, MakeNewbie( new Cloth( 5000 ) ) );
PlaceItemIn( cont, 30, 84, MakeNewbie( new Board( 5000 ) ) );
PlaceItemIn( cont, 57, 80, MakeNewbie( new BlankScroll( 500 ) ) );
PlaceItemIn( cont, 30, 35, MakeNewbie( new DullCopperIngot( 5000 ) ) );
PlaceItemIn( cont, 37, 35, MakeNewbie( new ShadowIronIngot( 5000 ) ) );
PlaceItemIn( cont, 44, 35, MakeNewbie( new CopperIngot( 5000 ) ) );
PlaceItemIn( cont, 51, 35, MakeNewbie( new BronzeIngot( 5000 ) ) );
PlaceItemIn( cont, 58, 35, MakeNewbie( new GoldIngot( 5000 ) ) );
PlaceItemIn( cont, 65, 35, MakeNewbie( new AgapiteIngot( 5000 ) ) );
PlaceItemIn( cont, 72, 35, MakeNewbie( new VeriteIngot( 5000 ) ) );
PlaceItemIn( cont, 79, 35, MakeNewbie( new ValoriteIngot( 5000 ) ) );
PlaceItemIn( cont, 86, 35, MakeNewbie( new IronIngot( 5000 ) ) );
PlaceItemIn( cont, 30, 59, MakeNewbie( new RedScales( 5000 ) ) );
PlaceItemIn( cont, 36, 59, MakeNewbie( new YellowScales( 5000 ) ) );
PlaceItemIn( cont, 42, 59, MakeNewbie( new BlackScales( 5000 ) ) );
PlaceItemIn( cont, 48, 59, MakeNewbie( new GreenScales( 5000 ) ) );
PlaceItemIn( cont, 54, 59, MakeNewbie( new WhiteScales( 5000 ) ) );
PlaceItemIn( cont, 60, 59, MakeNewbie( 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 ) );
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, MakeNewbie( new RecallRune() ) );
PlaceItemIn( bank, 78, 169, cont );
// End bag of spell casting stuff
}
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, int itemID, int hue )
{
if ( m.Female )
return;
Item item;
switch ( itemID & 0x3FFF )
{
case 0x203E: item = new LongBeard( hue ); break;
case 0x203F: item = new ShortBeard( hue ); break;
case 0x2040: item = new Goatee( hue ); break;
case 0x2041: item = new Mustache( hue ); break;
case 0x204B: item = new MediumShortBeard( hue ); break;
case 0x204C: item = new MediumLongBeard( hue ); break;
case 0x204D: item = new Vandyke( hue ); break;
default: return;
}
m.AddItem( item );
}
private static Mobile CreateMobile( Account a )
{
for ( int i = 0; i < 5; ++i )
if ( a[i] == null )
return (a[i] = new PlayerMobile());
return null;
}
private static void EventSink_CharacterCreated( CharacterCreatedEventArgs args )
{
Mobile newChar = CreateMobile( args.Account as Account );
if ( newChar == null )
{
Console.WriteLine( "Login: {0}: Character creation failed, account full", args.State );
return;
}
args.Mobile = newChar;
m_Mobile = newChar;
newChar.Player = true;
newChar.AccessLevel = ((Account)args.Account).AccessLevel;
newChar.Female = args.Female;
newChar.Body = newChar.Female ? 0x191 : 0x190;
newChar.Hue = Utility.ClipSkinHue( args.Hue & 0x3FFF ) | 0x8000;
newChar.Hunger = 20;
newChar.Skills.Cap=700; //¿øÇÏ´Â ½ºÅ³ÃÑÇÕ
newChar.StatCap=250; //¿øÇÏ´Â ½ºÅÈ ÃÑÇÕ
if ( newChar is PlayerMobile )
((PlayerMobile)newChar).Profession = args.Profession;
SetName( newChar, args.Name );
AddBackpack( newChar );
SetStats( newChar, args.Str, args.Dex, args.Int );
SetSkills( newChar, args.Skills, args.Profession );
AddHair( newChar, args.HairID, Utility.ClipHairHue( args.HairHue & 0x3FFF ) );
AddBeard( newChar, args.BeardID, Utility.ClipHairHue( args.BeardHue & 0x3FFF ) );
if ( !Core.AOS || (args.Profession != 4 && args.Profession != 5) )
{
AddShirt( newChar, args.ShirtHue );
AddPants( newChar, args.PantsHue );
AddShoes( newChar );
}
FillBankbox( newChar );
//CityInfo city = args.City;
CityInfo city = new CityInfo( "Britain", "Sweet Dreams Inn", 1496, 1628, 10 );
newChar.MoveToWorld( city.Location, Map.Felucca );
Console.WriteLine( "Login: {0}: New character being created (account={1})", args.State, ((Account)args.Account).Username );
Console.WriteLine( " - Character: {0} (serial={1})", newChar.Name, newChar.Serial );
Console.WriteLine( " - Started: {0} {1}", city.City, city.Location );
new WelcomeTimer( newChar ).Start();
}
private static void FixStats( ref int str, ref int dex, ref int intel )
{
int vStr = str - 10;
int vDex = dex - 10;
int vInt = intel - 10;
if ( vStr < 0 )
vStr = 0;
if ( vDex < 0 )
vDex = 0;
if ( vInt < 0 )
vInt = 0;
int total = vStr + vDex + vInt;
if ( total == 0 || total == 50 )
return;
double scalar = 50 / (double)total;
vStr = (int)(vStr * scalar);
vDex = (int)(vDex * scalar);
vInt = (int)(vInt * scalar);
FixStat( ref vStr, (vStr + vDex + vInt) - 50 );
FixStat( ref vDex, (vStr + vDex + vInt) - 50 );
FixStat( ref vInt, (vStr + vDex + vInt) - 50 );
str = vStr + 10;
dex = vDex + 10;
intel = vInt + 10;
}
private static void FixStat( ref int stat, int diff )
{
stat += diff;
if ( stat < 0 )
stat = 0;
else if ( stat > 50 )
stat = 50;
}
private static void SetStats( Mobile m, int str, int dex, int intel )
{
FixStats( ref str, ref dex, ref intel );
if ( str < 10 || str > 60 || dex < 10 || dex > 60 || intel < 10 || intel > 60 || (str + dex + intel) != 80 )
{
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, true, true, 1, NameVerification.SpaceDashPeriodQuote ) )
name = "Generic Player";
m.Name = name;
}
private static bool ValidSkills( SkillNameValue[] skills )
{
int total = 0;
for ( int i = 0; i < skills.Length; ++i )
{
if ( skills[i].Value < 0 || skills[i].Value > 50 )
return false;
total += skills[i].Value;
for ( int j = i + 1; j < skills.Length; ++j )
{
if ( skills[j].Value > 0 && skills[j].Name == skills[i].Name )
return false;
}
}
return ( total == 100 );
}
private static Mobile m_Mobile;
private static void SetSkills( Mobile m, SkillNameValue[] skills, int prof )
{
switch ( prof )
{
case 1: // Warrior
{
skills = new SkillNameValue[]
{
new SkillNameValue( SkillName.Anatomy, 30 ),
new SkillNameValue( SkillName.Healing, 45 ),
new SkillNameValue( SkillName.Swords, 35 ),
new SkillNameValue( SkillName.Tactics, 50 )
};
break;
}
case 2: // Magician
{
skills = new SkillNameValue[]
{
new SkillNameValue( SkillName.EvalInt, 30 ),
new SkillNameValue( SkillName.Wrestling, 30 ),
new SkillNameValue( SkillName.Magery, 50 ),
new SkillNameValue( SkillName.Meditation, 50 )
};
break;
}
case 3: // Blacksmith
{
skills = new SkillNameValue[]
{
new SkillNameValue( SkillName.Mining, 30 ),
new SkillNameValue( SkillName.ArmsLore, 30 ),
new SkillNameValue( SkillName.Blacksmith, 50 ),
new SkillNameValue( SkillName.Tinkering, 50 )
};
break;
}
case 4: // Necromancer
{
if ( !Core.AOS )
goto default;
skills = new SkillNameValue[]
{
new SkillNameValue( SkillName.Necromancy, 50 ),
new SkillNameValue( SkillName.Focus, 30 ),
new SkillNameValue( SkillName.SpiritSpeak, 30 ),
new SkillNameValue( SkillName.Swords, 30 ),
new SkillNameValue( SkillName.Tactics, 20 )
};
break;
}
case 5: // Paladin
{
if ( !Core.AOS )
goto default;
skills = new SkillNameValue[]
{
new SkillNameValue( SkillName.Chivalry, 51 ),
new SkillNameValue( SkillName.Swords, 49 ),
new SkillNameValue( SkillName.Focus, 30 ),
new SkillNameValue( SkillName.Tactics, 30 )
};
break;
}
default:
{
if ( !ValidSkills( skills ) )
return;
break;
}
}
bool addSkillItems = true;
switch ( prof )
{
case 1: // Warrior
{
EquipItem( new LeatherChest() );
break;
}
case 4: // Necromancer
{
Container regs = new BagOfNecroReagents( 50 );
if ( !Core.AOS )
{
foreach ( Item item in regs.Items )
item.LootType = LootType.Newbied;
}
PackItem( regs );
regs.LootType = LootType.Regular;
EquipItem( new BoneHarvester() );
EquipItem( new BoneHelm() );
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 ) );
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
{
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 ) );
Spellbook book = new BookOfChivalry( (ulong)0x3FF );
PackItem( book );
book.LootType = LootType.Blessed;
break;
}
}
for ( int i = 0; i < skills.Length; ++i )
{
SkillNameValue snv = skills[i];
if ( snv.Value > 0 && snv.Name != SkillName.Stealth && snv.Name != SkillName.RemoveTrap )
{
Skill skill = m.Skills[snv.Name];
if ( skill != null )
{
skill.BaseFixedPoint = snv.Value * 10;
if ( addSkillItems )
AddSkillItems( snv.Name );
}
}
}
}
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;
Container 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;
Container 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 * 8) )
{
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 )
{
switch ( skill )
{
case SkillName.Alchemy:
{
PackItem( new Bottle( 4 ) );
PackItem( new MortarPestle() );
EquipItem( new Robe( Utility.RandomPinkHue() ) );
break;
}
case SkillName.Anatomy:
{
PackItem( new Bandage( 3 ) );
EquipItem( new Robe( Utility.RandomYellowHue() ) );
break;
}
case SkillName.AnimalLore:
{
EquipItem( new ShepherdsCrook() );
EquipItem( new Robe( Utility.RandomBlueHue() ) );
break;
}
case SkillName.Archery:
{
PackItem( new Arrow( 25 ) );
EquipItem( new Bow() );
break;
}
case SkillName.ArmsLore:
{
switch ( Utility.Random( 3 ) )
{
case 0: EquipItem( new Kryss() ); break;
case 1: EquipItem( new Katana() ); break;
case 2: EquipItem( new Club() ); break;
}
break;
}
case SkillName.Begging:
{
EquipItem( new GnarledStaff() );
break;
}
case SkillName.Blacksmith:
{
PackItem( new Tongs() );
PackItem( new Pickaxe() );
PackItem( new Pickaxe() );
PackItem( new IronIngot( 50 ) );
EquipItem( new HalfApron( Utility.RandomYellowHue() ) );
break;
}
case SkillName.Fletching:
{
PackItem( new Board( 14 ) );
PackItem( new Feather( 5 ) );
PackItem( new Shaft( 5 ) );
break;
}
case SkillName.Camping:
{
// TODO: Bedroll
PackItem( new Kindling( 5 ) );
break;
}
case SkillName.Carpentry:
{
PackItem( new Board( 10 ) );
PackItem( new Saw() );
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.DetectHidden:
{
EquipItem( new Cloak( 0x455 ) );
break;
}
case SkillName.Discordance:
{
PackInstrument();
break;
}
case SkillName.Fencing:
{
EquipItem( new Kryss() );
break;
}
case SkillName.Fishing:
{
EquipItem( new FishingPole() );
EquipItem( new FloppyHat( Utility.RandomYellowHue() ) );
break;
}
case SkillName.Healing:
{
PackItem( new Bandage( 50 ) );
PackItem( new Scissors() );
break;
}
case SkillName.Herding:
{
EquipItem( new ShepherdsCrook() );
break;
}
case SkillName.Hiding:
{
EquipItem( new Cloak( 0x455 ) );
break;
}
case SkillName.Inscribe:
{
PackItem( new BlankScroll( 2 ) );
PackItem( new BlueBook() );
break;
}
case SkillName.ItemID:
{
EquipItem( new GnarledStaff() );
break;
}
case SkillName.Lockpicking:
{
PackItem( new Lockpick( 20 ) );
break;
}
case SkillName.Lumberjacking:
{
EquipItem( new Hatchet() );
break;
}
case SkillName.Macing:
{
EquipItem( new Club() );
break;
}
case SkillName.Magery:
{
BagOfReagents regs = new BagOfReagents( 30 );
if ( !Core.AOS )
{
foreach ( Item item in regs.Items )
item.LootType = LootType.Newbied;
}
PackItem( regs );
regs.LootType = LootType.Regular;
PackScroll( 0 );
PackScroll( 1 );
PackScroll( 2 );
Spellbook book = new Spellbook( (ulong)0x382A8C38 );
EquipItem( book );
book.LootType = LootType.Blessed;
EquipItem( new Robe( Utility.RandomBlueHue() ) );
EquipItem( new WizardsHat() );
break;
}
case SkillName.Mining:
{
PackItem( new Pickaxe() );
break;
}
case SkillName.Musicianship:
{
PackInstrument();
break;
}
case SkillName.Parry:
{
EquipItem( new WoodenShield() );
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:
{
EquipItem( new Cloak( 0x455 ) );
break;
}
case SkillName.Stealing:
{
PackItem( new Lockpick( 20 ) );
break;
}
case SkillName.Swords:
{
EquipItem( new Katana() );
break;
}
case SkillName.Tactics:
{
EquipItem( new Katana() );
break;
}
case SkillName.Tailoring:
{
PackItem( new BoltOfCloth() );
PackItem( new SewingKit() );
break;
}
case SkillName.Tracking:
{
if ( m_Mobile != null )
{
Item shoes = m_Mobile.FindItemOnLayer( Layer.Shoes );
if ( shoes != null )
shoes.Delete();
}
EquipItem( new Boots( Utility.RandomYellowHue() ) );
EquipItem( new SkinningKnife() );
break;
}
case SkillName.Veterinary:
{
PackItem( new Bandage( 5 ) );
PackItem( new Scissors() );
break;
}
case SkillName.Wrestling:
{
EquipItem( new LeatherGloves() );
break;
}
}
}
}
}
³À̵µ¸¦ ³·Ãß´Â°Ô ÀÌ·¸°Ô ÈûµçÁÙ ¸ô¶ù³×¿ä^^;
¼öÁ¤ÇҺκРºÎŹµå¸³´Ï´Ù. |
|