RunUo.Korean.Forum    :: RunUo Document 2.0 RC1 (Beta):: 
Statistics  Archive (html)  S-BLOG  [RSS FEED]   

 
  RunUo.Korean.Forum
ÀæÀºÁú¹®  ÀæÀºÁú¹®    °Ë»ö   °Ë»ö    ȸ¿ø¸®½ºÆ®  È¸¿ø¸®½ºÆ®   À¯Àú±×·ì  À¯Àú±×·ì   Gabbly äÆÃ¿­±â  Ã¤ÆÃ¿­±â 
 
ȸ¿ø°¡ÀÔ  ::  ·Î±×ÀÎ ÂÊÁö ÇÔ È®ÀÎ
 
RunUo.Korean.Forum ¢º Script Support ¢º ¾ÆÀÌÅÛ ½Ãü ±âŸ »ç¶óÁö´Â½Ã°£¼³Á¤Á» ºÎʵ右´Ï´Ù.
»õ ±ÛÀ» ÀÛ¼ºÇÕ´Ï´Ù.´äº¯±ÛÀ» ÀÛ¼ºÇÕ´Ï´Ù. ÆäÀÌÁöÀ̵¿ 1, 2  ´ÙÀ½ Post Printing
¡Ø TOPIC : ¾ÆÀÌÅÛ ½Ãü ±âŸ »ç¶óÁö´Â½Ã°£¼³Á¤Á» ºÎʵ右´Ï´Ù. ÀÌÀü ±Û :: ´ÙÀ½ ±Û
±Û ¾´ÀÌ ¸Þ¼¼Áö ³»¿ë
yuminsu
ÀÛ¼º±ÛÁ¦¸ñ : ¾ÆÀÌÅÛ ½Ãü ±âŸ »ç¶óÁö´Â½Ã°£¼³Á¤Á» ºÎʵ右´Ï´Ù.   ±Û ÀÛ¼º½Ã°£ : 2004-10-24 ÀÏ 3:01 am ±ÛÀ» ÀοëÇÏ¿© ÀÛ¼ºÇÕ´Ï´Ù.

First Cicle [6]
First Cicle [6]

°¡ÀÔÀÏ: 2004³â 10¿ù 22ÀÏ
°Ô½Ã¹°: 13
ÁÖ ¼Ò: ¼­¿ï ¾çõ±¸ ½Å¿ù3µ¿/40¡­49¹øÁö

¾ÆÀÌÅÛÀÌ 1½Ã°£ÈÄ¿¡ »ì¶óÁö´Âµ¥; ³Ê¹« ¿À·£°É¸®³×¿ä;;

±×°Å¶§¹®¿¡ ¸®¼Ò½º ¸¹ÀÌ Àâ¾Æ¸Ô°í..

À½.. ¾ÆÀÌÅÛ »ç¶óÁö´Â°÷ÀÌ ¾îµðÁö ¾Æ½ÃºÐÁ» ºÎʵ右´Ï´Ù.
¡è ¸Ç À§·Î °¡±â ¡è
ȸ¿ø ÇÁ·ÎÇÊ º¸±â ÂÊÁö º¸³»±â
roar
ÀÛ¼º±ÛÁ¦¸ñ : °£¸¸À̱º¿ä -_________-   ±Û ÀÛ¼º½Ã°£ : 2004-10-24 ÀÏ 5:35 pm ±ÛÀ» ÀοëÇÏ¿© ÀÛ¼ºÇÕ´Ï´Ù.

Eighth Cicle [4]
Eighth Cicle [4]

°¡ÀÔÀÏ: 2004³â 01¿ù 20ÀÏ
°Ô½Ã¹°: 228
ÁÖ ¼Ò: Áö±¸ ¾îµò°¡..

¾ÆÀÌÅÛÀÌ 1½Ã°£ÈÄ¿¡ »ì¶óÁö´Âµ¥; ³Ê¹« ¿À·£°É¸®³×¿ä;;

±×°Å¶§¹®¿¡ ¸®¼Ò½º ¸¹ÀÌ Àâ¾Æ¸Ô°í..

À½.. ¾ÆÀÌÅÛ »ç¶óÁö´Â°÷ÀÌ ¾îµðÁö ¾Æ½ÃºÐÁ» ºÎʵ右´Ï´Ù.

// ¿À·¡°£ ¸¸ÀÔ´Ï´Ù. -________-+
// ÇöÀç ·±À¯¿À´Â ¾ÆÀÌÅÛÀÇ ºÎ½Ä(Decay) ½Ã°£À» ¼³Á¤ÇÒ¼ö°¡ ¾ø±â ¶§¹®¿¡ ´Ù¸¥ ¹æ¹ýÀ» ½á¾ß ÇÕ´Ï´Ù.
// µµÅ¥¸àÆ®¿¡ º¸½Ã¸é ¾Ë°ÚÁö¸¸ µðÄÉÀÌ Å¸ÀÓÀ» get¸¸ °¡´ÉÇϱ⶧¹®¿¡
// µû·Î ŸÀ̸Ӹ¦ ¸¸µé¾î¼­ ÇØ°áÇØÁÖ¸é µË´Ï´Ù.

// ¸ÕÀú PlayerMobiles.cs ÆÄÀÏÀ» ¿±´Ï´Ù. ±×¸®°í ´ÙÀ½ÀÇ ³»¿ëÀ¸·Î ¼öÁ¤ÇÕ´Ï´Ù.
Àοë±Û : 

public override bool OnDroppedItemToWorld( Item item, Point3D location )
{
if ( !base.OnDroppedItemToWorld( item, location ) )
return false;

//Custom ¿ä±â¼­ ºÎÅÍ
if( item.Decays == true )
{
StartDecay t = new StartDecay( item );
t.Start();
}
//End of Custom ¿©±â±îÁö Ãß°¡ ÇØÁÝ´Ï´Ù.

BounceInfo bi = item.GetBounce();


// ±×¸®°í ´ÙÀ½ÀÇ Å¬·¡½º¸¦ Ãß°¡ÇÕ´Ï´Ù. ¾îµð ³ÖÀ»Áö °í¹ÎµÇ½Ã´Â ºÐµéÀº
// ±×³É public override bool OnDroppedItemToWorld( Item item, Point3D location ) ÀÇ À­ºÎºÐ¿¡ ºÙ¿© ³ÖÀ¸¼¼¿ä.

Àοë±Û : 

// Custom : Item Decay Part 04.10.24
private Timer m_DecayTimers;

private class StartDecay : Timer
{
private Item m_item;

public StartDecay( Item item ) : base( TimeSpan.FromSeconds( 10.0 ) ) // FromSecons( 10.0 ) ¾È¿¡ ¼ýÀÚ¸¦ ÃëÇâ¿¡ ¸Â°Ô ¼öÁ¤Çϼ¼¿ä. Å×½ºÆ®¿ëÀ¸·Î ¼³Á¤ÇѰŶó 10Ãʸ¸¿¡ ¹ø°³°°ÀÌ »ç¶óÁü
{
m_item = item;
Priority = TimerPriority.TenMS;
}

protected override void OnTick()
{
m_item.Delete(); // Emptying the trashcan!
}
}
// End of Custom : Decay


// À̰ÍÀ¸·Î¼­ ¾ÆÀÌÅÛÀ» ¹Ù´Ú¿¡ ¹ö·ÈÀ»¶§ÀÇ Ã³¸®´Â ³¡³µ½À´Ï´Ù.
// ´ÙÀ½Àº ½Ãü°¡ ¹ß»ýÇßÀ»¶§ ÀÔ´Ï´Ù.
// BaseCreature.cs ÆÄÀÏÀ» ¿±´Ï´Ù.
Àοë±Û : 

public override void OnDeath( Container c )
{
if ( IsBonded )
{
int sound = this.GetDeathSound();

if ( sound >= 0 )
Effects.PlaySound( this, this.Map, sound );

Warmode = false;

Poison = null;
Combatant = null;

Hits = 0;
Stam = 0;
Mana = 0;
.
. (»ý·«)
.
if ( qs != null )
{
qs.OnKill( this, c );
givenQuestKill = true;
}
}
}
}

// Custom : Decay Part Corpse ¿©±â ºÎÅÍ~
Item m_cItem = c as Item;

StartDecay t = new StartDecay( m_cItem );
t.Start();
// End of Custom ¿©±â±îÁö Ãß°¡ÇØÁÝ´Ï´Ù.
base.OnDeath( c );

if ( DeleteCorpseOnDeath )
c.Delete();
}
}


// ±×¸®°í ´ÙÀ½ÀÇ Å¬·¡½º¸¦ Ãß°¡ÇÕ´Ï´Ù. ±×³É Àú public override void OnDeath( Container c ) À§¿¡´Ù°¡ ºÙÀÌ´ø ¾Æ·¡¿¡ ºÙÀÌ´ø »ó°ü¾øÁö¸¸ Ȥ½Ã³ª ½Ç¼öÇϽÇÁö ¸ð¸£´Ï ±×³É À§¿¡´Ù°¡ ºÙÀ̼¼¿ä -___-
Àοë±Û : 

// Custom : Item Decay Part 04.10.24
private Timer m_DecayTimers;

private class StartDecay : Timer
{
private Item m_item;

public StartDecay( Item item ) : base( TimeSpan.FromSeconds( 10.0 ) ) // ½Ã°£ ¼³Á¤Àº ¾Ë¾Æ¼­ -___-
{
m_item = item;
Priority = TimerPriority.TenMS;
}

protected override void OnTick()
{
m_item.Delete(); // Emptying the trashcan!
}
}
// End of Custom : Decay


// À̰ÍÀ¸·Î ´ë°­ÀÇ ºÎ½Ä¼³Á¤ÀÌ ³¡³µ½À´Ï´Ù.
// ±×³É Çѹø µé·¯ºÃ´Ù°¡, ÀÌ ¹®Á¦´Â ÇØ°áÇØµÎ´Â°Ô µÚ´Ê°Ô ½ÃÀÛÇϽô ºÐµé¿¡°Ô
// ÇÊ¿äÇÒ²¨ °°¾Æ¼­ ±ÞÁ¶Çß½À´Ï´Ù. Ȥ½Ã³ª ¹®Á¦°¡ »ý±â¸é ÂÊÁö³ª ´ñ±Û ºÙÀ̼¼¿ä.
// ¾ðÁ¦ º¼Áö´Â ¸ð¸£°ÚÁö¸¸ -______________-+

_________________
!!!! FareWell !!!!
¡è ¸Ç À§·Î °¡±â ¡è
ȸ¿ø ÇÁ·ÎÇÊ º¸±â ÂÊÁö º¸³»±â E-Mail º¸³»±â
roar
ÀÛ¼º±ÛÁ¦¸ñ : ¼öÁ¤ ÆÇÀÔ´Ï´Ù -¤µ-a   ±Û ÀÛ¼º½Ã°£ : 2004-10-29 ±Ý 5:08 pm ±ÛÀ» ÀοëÇÏ¿© ÀÛ¼ºÇÕ´Ï´Ù.

Eighth Cicle [4]
Eighth Cicle [4]

°¡ÀÔÀÏ: 2004³â 01¿ù 20ÀÏ
°Ô½Ã¹°: 228
ÁÖ ¼Ò: Áö±¸ ¾îµò°¡..

// À§¿¡¼­ ½Ãü »ç¶óÁö´Â ºÎºÐÀº ¹®Á¦°¡ º°·Î ¾ø´Â °Í °°±¸¿ä.
// ¾ÆÀÌÅÛÀÌ »ç¶óÁö´Â°Ç ±ÞÁ¶Çؼ­ ±×·±Áö ÀÌ·±, Àú·± ¹®Á¦°¡ À־
// ¼öÁ¤ÆÇÀ» ¿Ã¸³´Ï´Ù.

ÄÚµå : 

                                //¿ä±â¼­ ºÎÅÍ
      // Custom : Item Decay Part 04.10.24
      private static Hashtable m_DecayTable = new Hashtable();
      private Timer m_DecayTimers;

      private class StartDecay : Timer
      {
         private Item m_item;

         public StartDecay( Item item ) : base( TimeSpan.FromSeconds( 10.0 ) )
         {
            m_item = item;
            Priority = TimerPriority.TenMS;
         }

         protected override void OnTick()
         {
               m_item.Delete();
         }
      }
      // End of Custom : Decay

      // Custom Override
      public override bool OnDragLift( Item item )
      {
         if( item.Movable != true )
            return false;

         StartDecay t = (StartDecay)m_DecayTable[ item ];

         if( t != null )
            t.Stop();

         m_DecayTable.Remove( item );
         return base.OnDragLift( item );
      }

      public override bool OnDragDrop( Mobile mob, Item item )
      {
         Container pack = mob.Backpack;
         if( !(item.IsChildOf(pack)) )
         {
            StartDecay t = new StartDecay( item );
            t.Start();
            m_DecayTable[ item ] = t;
         }

         return base.OnDragDrop( mob,item );
      }
      // End of Custom
                                // ¿ä±â±îÁö´Â ÀÌÀüÀÇ Ç׸ñ¿¡¼­ Ãß°¡Ç϶ó´Â ºÎºÐ´ë½Å ¾²¼¼¿ä.

                                // ¿ä±â°¡ ÀÌÀüÀÇ ¼öÁ¤Ç϶ó´Â ºÎºÐÀä. ¿ä·¸°Ô °íÄ¡¼¼¿ä.
      public override bool OnDroppedItemToWorld( Item item, Point3D location )
      {
         if ( !base.OnDroppedItemToWorld( item, location ) )
            return false;
                                         
         //Custom  ±×·¯´Ï±î ¿ä±â¼­
         //if( item.Decays == true )
         //{
            StartDecay t = new StartDecay( item );
            t.Start();
            m_DecayTable[ item ] = t;
         //}
         //End of Custom ¿©±â±îÁö¿ä.

         BounceInfo bi = item.GetBounce();


// ½ÇÇèÇØº» °á°ú ¹«¸® ¾øÀÌ ÀÛµ¿ÇÕ´Ï´Ù. ¾ÆÀÌÅÛÀ» ¹éÆÑ¿¡¼­ ¹Ù´ÚÀ¸·Î ¹ö¸®¸é
// ŸÀ̸Ӱ¡ ÀÛµ¿ÇÕ´Ï´Ù. ÇØ½¬Å×ÀÌºí¿¡ ³Ö¾îµÎ¾î¼­ ³ªÁß¿¡ °¹¼ö°¡ ¾öû¸¹¾Æ
// Áö¸é ¾à°£ ¹«¸®°¡ »ý±â°ÚÁö¸¸ »ç¶óÁö´Â ½Ã°£À» ±æ°Ô ÇÏÁö ¾ÊÀ¸¸é Å©°Ô ¹®Á¦
// ´Â ¾øÀ» °Ì´Ï´Ù( ÇÑ 1~2ºÐ Çϼ¼¿ä -¤µ-;) ¹Ù´Ú¿¡ ¹ö·ÁÁø ¾ÆÀÌÅÛÀ» ÁöÁ¤ÇÑ
// ½Ã°£ÈÄ¿¡ »ç¶óÁö°Ô µÇ´Âµ¥, ½Ã°£ÀÌ ¸¸·áµÇ±âÀü¿¡ ´Ù½Ã Áý¾î µé¸é ŸÀ̸Ӱ¡
// ÃʱâÈ­°¡ µË´Ï´Ù. À̶§ ¹Ù´Ú¿¡ ¹ö¸®¸é ´Ù½Ã ŸÀ̸Ӱ¡ ½ÃÀ۵ǰí, ¹éÆÑ¿¡
// ³ÖÀ¸¸é ŸÀ̸Ӱ¡ »ý¼ºµÇÁö ¾Ê½À´Ï´Ù.
// Á¦°¡ ³í¸®¿¡ °­ÇÏÁö ¾Ê¾Æ¼­ -¤µ-;; ¶Ç´Ù¸¥ ¹®Á¦Á¡ÀÌ ÀÖÀ»¼ö ÀÖÀ¸´Ï ÁöÀûÇØÁÖ
// ¼¼¿ä. ·±À¯¿À´Â ÀúÀ广½ÄÀÌ ¾à°£ ¶ì¸®Çؼ­, ¼­¹ö°¡ Á¡Á¡ È®ÀåµÉ¼ö·Ï ¼¼À̺ê
// ¿¡ ½Ã°£ÀÌ ±âÇϱ޼öÀûÀ¸·Î ´Ã¾î³ª°Ô µÈ´Ù°í ÇÏ´õ±º¿ä. ±×·¯´Ï ¾µµ¥¾ø´Â °Í
// µéÀº ½Î°Ô ½Î°Ô ¾ø¾Ö Áà¾ßÇϴµ¥, Äھ¼­ µðÄÉÀÌ Å¸ÀÓÀ» ¼öÁ¤¸øÇÏ°Ô ÇßÀ¸´Ï
// ÀÌ°Ç ³ª¸§´ë·Î Çʼö¶ó°í »ý°¢ÇÕ´Ï´Ù.

_________________
!!!! FareWell !!!!
¡è ¸Ç À§·Î °¡±â ¡è
ȸ¿ø ÇÁ·ÎÇÊ º¸±â ÂÊÁö º¸³»±â E-Mail º¸³»±â
weeea
ÀÛ¼º±ÛÁ¦¸ñ : ÆÄÀÏÀ̸§°ú method °¡ ¾ø´Âµ¥¿ä?   ±Û ÀÛ¼º½Ã°£ : 2004-10-31 ÀÏ 4:23 am ±ÛÀ» ÀοëÇÏ¿© ÀÛ¼ºÇÕ´Ï´Ù.

First Cicle [8]
First Cicle [8]

°¡ÀÔÀÏ: 2004³â 10¿ù 30ÀÏ
°Ô½Ã¹°: 16
ÁÖ ¼Ò: /

PlayerMobiles.cs ¶ó°í ¾²½Å ÆÄÀÏÀº
PlayerMobile.cs ÆÄÀÏÀ» À߸ø¾²½Åµí Çϱº¿ä.

±×·±µ¥ ½Ãü ó¸®´Â ÇØ°áÇߴµ¥, ¾ÆÀÌÅÛ Ã³¸®´Â ÇØ°áÀ» ¸øÇϰھî¿ä.
OnDroppedItemToWorld <-- ¿ä method °¡ ¾ø°Åµç¿ä.
Ä¿½ºÅÒ methodÀÎÁö.. ºñ½ÁÇÑ method ¿ª½Ã ¾ø¾î¼­,
¾î¶»°Ô ¼öÁ¤ÇؾßÇÒÁö °í¹ÎÀ̶ø´Ï´Ù.
µµ¿ÍÁÖ»õ¿ä. ^^ °¨»ç~
¡è ¸Ç À§·Î °¡±â ¡è
ȸ¿ø ÇÁ·ÎÇÊ º¸±â ÂÊÁö º¸³»±â
roar
ÀÛ¼º±ÛÁ¦¸ñ : ´ñ±Û -¤µ-;   ±Û ÀÛ¼º½Ã°£ : 2004-10-31 ÀÏ 10:33 am ±ÛÀ» ÀοëÇÏ¿© ÀÛ¼ºÇÕ´Ï´Ù.

Eighth Cicle [4]
Eighth Cicle [4]

°¡ÀÔÀÏ: 2004³â 01¿ù 20ÀÏ
°Ô½Ã¹°: 228
ÁÖ ¼Ò: Áö±¸ ¾îµò°¡..

PlayerMobiles.cs ¶ó°í ¾²½Å ÆÄÀÏÀº
PlayerMobile.cs ÆÄÀÏÀ» À߸ø¾²½Åµí Çϱº¿ä.
// ÀÚ²Ù ÆÄÀÏ À̸§ ´ë°­Àû¾î¼­ ÁöÀû¹Þ´Â±º¿ä =¤µ=;
// Á¦°¡ ±ÍÂú¾Æ¼­ ±×³É »ý°¢³ª´Â ´ë·Î ´ëÃæÀû¾î¼­ Á˼ÛÇÑ »çŰ¡ ÀÚ²Ù ÀϾ³×¿ä..

±×·±µ¥ ½Ãü ó¸®´Â ÇØ°áÇߴµ¥, ¾ÆÀÌÅÛ Ã³¸®´Â ÇØ°áÀ» ¸øÇϰھî¿ä.
OnDroppedItemToWorld <-- ¿ä method °¡ ¾ø°Åµç¿ä.
// ¾øÀ¸½Ç ¸®°¡ ¾ø½À´Ï´Ù... Äھ ÀÖ´Â ¸Þ¼ÒµåÀÔ´Ï´Ù.
// °Ô´Ù°¡ ¼öÁ¤ÇÏÁö ¾ÊÀº ºÎºÐÀÔ´Ï´Ù...
// Àß Ã£¾Æº¸¼¼¿ä.. Àú°Ç ¸ð¹ÙÀÏ¿¡¼­ ºÎÅÍ º£À̽ºÅ©¸®Ãĸ¦ °ÅÃÄ Ç÷¹À̾î¸ð¹Ù
// ÀÏ ±îÁö »ó¼ÓµÇ¾î ³»·Á¿Â »Ñ¸®±íÀº ¸Þ¼Òµå¶ø´Ï´Ù. =¤µ=;
Ä¿½ºÅÒ methodÀÎÁö.. ºñ½ÁÇÑ method ¿ª½Ã ¾ø¾î¼­,
¾î¶»°Ô ¼öÁ¤ÇؾßÇÒÁö °í¹ÎÀ̶ø´Ï´Ù.
µµ¿ÍÁÖ»õ¿ä. ^^ °¨»ç~

_________________
!!!! FareWell !!!!
¡è ¸Ç À§·Î °¡±â ¡è
ȸ¿ø ÇÁ·ÎÇÊ º¸±â ÂÊÁö º¸³»±â E-Mail º¸³»±â
weeea
ÀÛ¼º±ÛÁ¦¸ñ : ÈåÀ½...   ±Û ÀÛ¼º½Ã°£ : 2004-10-31 ÀÏ 10:50 am ±ÛÀ» ÀοëÇÏ¿© ÀÛ¼ºÇÕ´Ï´Ù.

First Cicle [8]
First Cicle [8]

°¡ÀÔÀÏ: 2004³â 10¿ù 30ÀÏ
°Ô½Ã¹°: 16
ÁÖ ¼Ò: /

Èì.. ÆÄÀÏ ¿Ã¸®´Â ¹ýÀ» ¸ô¶ó¼­ ÆÄÀÏÀ» ¿Ã·Áµå¸®Áø ¸øÇϰڱº¿ä.
±×·¸´Ù°í ½ºÅ©¸³ Àüü¸¦ Àû¾îµå¸®±âµµ »ó´çÇÑ ½Ç·Ê°í.
PlayerMobile.cs ÀÌ ÆÄÀÏÀº 49kbÀÇ ½ºÅ©¸³ ÆÄÀÏ·Î.
\RunUO\Scripts\Mobiles ¾È¿¡ ÀÖ½À´Ï´Ù¸¸..
OnDroppedItemToWorld <-- ÀÌ method ´Â ¾ø±º¿ä.

BaseAI.cs ´Â \RunUO\Scripts\Engines\AI\AI ¾È¿¡ ÀÖÁö¸¸..
Èì.. ÀÌ ÆÄÀϵµ ¾Æ´Ñµí..

´Ù¸¥ÆÄÀÏ¿¡ OnDroppedItemToWorld ÀÌ method °¡ ÀÕ´À°Ç°¡¿ä?
Á¦ Ç÷¹À̾î¸ð¹ÙÀÏ¿£ ¾ø±º¿ä.
Á÷Á¢ ÈȾ°Ô 5¹øÀ̰í.
ºñÁê¾ó ½ºÆ©µð¿À ¿Ü¿¡ ´Ù¸¥ ÇÁ·Î±×·¥À¸·Î ¿­¾î¼­ Àú method
¸¦ ã±â ÇßÁö¸¸ ³ª¿ÀÁö ¾Ê¤§¤Ã±º¿ä. ^^;;
¡è ¸Ç À§·Î °¡±â ¡è
ȸ¿ø ÇÁ·ÎÇÊ º¸±â ÂÊÁö º¸³»±â
roar
ÀÛ¼º±ÛÁ¦¸ñ : ´ñ±Û..   ±Û ÀÛ¼º½Ã°£ : 2004-10-31 ÀÏ 11:11 am ±ÛÀ» ÀοëÇÏ¿© ÀÛ¼ºÇÕ´Ï´Ù.

Eighth Cicle [4]
Eighth Cicle [4]

°¡ÀÔÀÏ: 2004³â 01¿ù 20ÀÏ
°Ô½Ã¹°: 228
ÁÖ ¼Ò: Áö±¸ ¾îµò°¡..

ÈÞ...

»ç¿ëÇϽô ·±À¯¿À ¹öÁ¯ÀÌ ¸îÀÌÁÒ?

´ÙÀ½Àº ·±À¯¿À °ø½Ä ¹®¼­¿¡ ÀÖ´Â ¸ð¹ÙÀÏ Å¬·¡½ºÀÇ ¸Þ¼ÒµåÁß ±×°ÍÀÇ ½Ã±×´ÏÃÄÀÔ´Ï´Ù.
virtual bool OnDroppedItemToWorld( Item item, Point3D location )

¾ø´Ù°í Çϼŵµ ÀÖ´Â°Ç ¾î¿¼ö ¾ø¾î¿ä..

¸¸¾à ´ÔÀÇ Ç÷¹À̾î¸ð¹ÙÀÏ ÆÄÀÏÀÌ ¹º°¡ ÀÌÀüÀÇ ¹öÁ¯ÀÌ¶ó´ø°¡, °³Á¶´çÇѰŶó¸é

±×³É ¿À¹ö¶óÀ̵åÇØ¼­ ¾²¼¼¿ä.. ÇÁ·Î±×·¡¹Ö ¹è¿ì½ÅºÐ °°Àºµ¥ ±×Á¤µµ´Â ¹«¸®°¡

¾Æ´Ï°ÚÁÒ... Á¦°¡ °ÅÁþ¸» Çϰھî¿ä? ±¦È÷ ¾ø´Â°Å ÀÖ´Ù°í ¿ì±â´Â°Ô ¾Æ´Ï¿¡¿ä =¤µ=;

p.s ±×³É ´ñ±Û·Î Àüü ºÙ¿©¾²±â ÇØÁּŵµ µÇ¿ä. Á¦°¡ ¼öÁ¤Çؼ­ µå¸®²²¿ä.
ÇÏ°í³­µÚ¿¡ Áö¿ì¸é µÇÀݾƿä

_________________
!!!! FareWell !!!!
¡è ¸Ç À§·Î °¡±â ¡è
ȸ¿ø ÇÁ·ÎÇÊ º¸±â ÂÊÁö º¸³»±â E-Mail º¸³»±â
weeea
ÀÛ¼º±ÛÁ¦¸ñ : ÀÌ·±.. ^^:;   ±Û ÀÛ¼º½Ã°£ : 2004-10-31 ÀÏ 11:25 am ±ÛÀ» ÀοëÇÏ¿© ÀÛ¼ºÇÕ´Ï´Ù.

First Cicle [8]
First Cicle [8]

°¡ÀÔÀÏ: 2004³â 10¿ù 30ÀÏ
°Ô½Ã¹°: 16
ÁÖ ¼Ò: /

ÀÌ·±.. ±âºÐ »óÇÏ°Ô ÇØµå·È³ª¿ä?
Á˼ÛÇØ¿ä. >¤µ<;;;
°ÅÁþ¸» ÇÑ´Ù´Â°Ô ¾Æ´Ï¶ó, Àü ¾ø¾î¼­ ¾î¶»°Ô ±¸ÇÒ¼ö ¾ø³ª ÇѰſ¹¿ä. ^^;;
¾Æ´Ô ÆÄÀÏÀ̸§À» À߸øÀû¾îÁÖ½Å°Ô ¾Æ´Ñ°¡ ÇØ¼­¿ä. ^^;;;
ÇÁ·Î±×·¡¹ÖÀº °è¼Ó ¤¾¤¿´ÂÁßÀ̰í, ¿ä»÷ Æ´³¯¶§¸¶´Ù ½ºÅ©¸³ °¡ÁÖ³ë´À¶ó°í¿ä.^^;


ÄÚµå : 

using System;
using System.Collections;
using Server;
using Server.Misc;
using Server.Items;
using Server.Gumps;
using Server.Multis;
using Server.Engines.Help;
using Server.ContextMenus;
using Server.Network;
using Server.Spells;
using Server.Spells.Fifth;
using Server.Spells.Seventh;
using Server.Targeting;

namespace Server.Mobiles
{
   [Flags]
   public enum PlayerFlag // First 16 bits are reserved for default-distro use, start custom flags at 0x00010000
   {
      None            = 0x00000000,
      Glassblowing      = 0x00000001,
      Masonry            = 0x00000002,
      SandMining         = 0x00000004,
      StoneMining         = 0x00000008,
      ToggleMiningStone   = 0x00000010,
      KarmaLocked         = 0x00000020,
      AutoRenewInsurance   = 0x00000040,
      UseOwnFilter      = 0x00000080,
      PublicMyRunUO      = 0x00000100,
      PagingSquelched      = 0x00000200
   }

   public enum NpcGuild
   {
      None,
      MagesGuild,
      WarriorsGuild,
      ThievesGuild,
      RangersGuild,
      HealersGuild,
      MinersGuild,
      MerchantsGuild,
      TinkersGuild,
      TailorsGuild,
      FishermensGuild,
      BardsGuild,
      BlacksmithsGuild
   }

   public class PlayerMobile : Mobile
   {
      private class CountAndTimeStamp
      {
         private int m_Count;
         private DateTime m_Stamp;

         public CountAndTimeStamp()
         {
         }

         public DateTime TimeStamp { get{ return m_Stamp; } }
         public int Count
         {
            get { return m_Count; }
            set   { m_Count = value; m_Stamp = DateTime.Now; }
         }
      }

      private DesignContext m_DesignContext;

      private NpcGuild m_NpcGuild;
      private DateTime m_NpcGuildJoinTime;
      private TimeSpan m_NpcGuildGameTime;
      private PlayerFlag m_Flags;
      private int m_StepsTaken;

      public int StepsTaken
      {
         get{ return m_StepsTaken; }
         set{ m_StepsTaken = value; }
      }

      [CommandProperty( AccessLevel.GameMaster )]
      public NpcGuild NpcGuild
      {
         get{ return m_NpcGuild; }
         set{ m_NpcGuild = value; }
      }

      [CommandProperty( AccessLevel.GameMaster )]
      public DateTime NpcGuildJoinTime
      {
         get{ return m_NpcGuildJoinTime; }
         set{ m_NpcGuildJoinTime = value; }
      }

      [CommandProperty( AccessLevel.GameMaster )]
      public TimeSpan NpcGuildGameTime
      {
         get{ return m_NpcGuildGameTime; }
         set{ m_NpcGuildGameTime = value; }
      }

      public PlayerFlag Flags
      {
         get{ return m_Flags; }
         set{ m_Flags = value; }
      }

      [CommandProperty( AccessLevel.GameMaster )]
      public bool PagingSquelched
      {
         get{ return GetFlag( PlayerFlag.PagingSquelched ); }
         set{ SetFlag( PlayerFlag.PagingSquelched, value ); }
      }

      [CommandProperty( AccessLevel.GameMaster )]
      public bool Glassblowing
      {
         get{ return GetFlag( PlayerFlag.Glassblowing ); }
         set{ SetFlag( PlayerFlag.Glassblowing, value ); }
      }

      [CommandProperty( AccessLevel.GameMaster )]
      public bool Masonry
      {
         get{ return GetFlag( PlayerFlag.Masonry ); }
         set{ SetFlag( PlayerFlag.Masonry, value ); }
      }

      [CommandProperty( AccessLevel.GameMaster )]
      public bool SandMining
      {
         get{ return GetFlag( PlayerFlag.SandMining ); }
         set{ SetFlag( PlayerFlag.SandMining, value ); }
      }

      [CommandProperty( AccessLevel.GameMaster )]
      public bool StoneMining
      {
         get{ return GetFlag( PlayerFlag.StoneMining ); }
         set{ SetFlag( PlayerFlag.StoneMining, value ); }
      }

      [CommandProperty( AccessLevel.GameMaster )]
      public bool ToggleMiningStone
      {
         get{ return GetFlag( PlayerFlag.ToggleMiningStone ); }
         set{ SetFlag( PlayerFlag.ToggleMiningStone, value ); }
      }

      [CommandProperty( AccessLevel.GameMaster )]
      public bool KarmaLocked
      {
         get{ return GetFlag( PlayerFlag.KarmaLocked ); }
         set{ SetFlag( PlayerFlag.KarmaLocked, value ); }
      }

      [CommandProperty( AccessLevel.GameMaster )]
      public bool AutoRenewInsurance
      {
         get{ return GetFlag( PlayerFlag.AutoRenewInsurance ); }
         set{ SetFlag( PlayerFlag.AutoRenewInsurance, value ); }
      }

      [CommandProperty( AccessLevel.GameMaster )]
      public bool UseOwnFilter
      {
         get{ return GetFlag( PlayerFlag.UseOwnFilter ); }
         set{ SetFlag( PlayerFlag.UseOwnFilter, value ); }
      }

      [CommandProperty( AccessLevel.GameMaster )]
      public bool PublicMyRunUO
      {
         get{ return GetFlag( PlayerFlag.PublicMyRunUO ); }
         set{ SetFlag( PlayerFlag.PublicMyRunUO, value ); InvalidateMyRunUO(); }
      }

      public bool GetFlag( PlayerFlag flag )
      {
         return ( (m_Flags & flag) != 0 );
      }

      public void SetFlag( PlayerFlag flag, bool value )
      {
         if ( value )
            m_Flags |= flag;
         else
            m_Flags &= ~flag;
      }

      public DesignContext DesignContext
      {
         get{ return m_DesignContext; }
         set{ m_DesignContext = value; }
      }

      public static void Initialize()
      {
         if ( FastwalkPrevention )
         {
            PacketHandler ph = PacketHandlers.GetHandler( 0x02 );

            ph.ThrottleCallback = new ThrottlePacketCallback( MovementThrottle_Callback );
         }

         EventSink.Login += new LoginEventHandler( OnLogin );
         EventSink.Logout += new LogoutEventHandler( OnLogout );
         EventSink.Connected += new ConnectedEventHandler( EventSink_Connected );
         EventSink.Disconnected += new DisconnectedEventHandler( EventSink_Disconnected );
      }

      public override void OnSkillInvalidated( Skill skill )
      {
         if ( Core.AOS && skill.SkillName == SkillName.MagicResist )
            UpdateResistances();
      }

      public override int GetMaxResistance( ResistanceType type )
      {
         int max = base.GetMaxResistance( type );

         if ( 60 < max && Spells.Fourth.CurseSpell.UnderEffect( this ) )
            max = 60;

         return max;
      }

      private int m_LastGlobalLight = -1, m_LastPersonalLight = -1;

      public override void OnNetStateChanged()
      {
         m_LastGlobalLight = -1;
         m_LastPersonalLight = -1;
      }

      public override void ComputeBaseLightLevels( out int global, out int personal )
      {
         global = LightCycle.ComputeLevelFor( this );
         personal = this.LightLevel;
      }

      public override void CheckLightLevels( bool forceResend )
      {
         NetState ns = this.NetState;

         if ( ns == null )
            return;

         int global, personal;

         ComputeLightLevels( out global, out personal );

         if ( !forceResend )
            forceResend = ( global != m_LastGlobalLight || personal != m_LastPersonalLight );

         if ( !forceResend )
            return;

         m_LastGlobalLight = global;
         m_LastPersonalLight = personal;

         ns.Send( new GlobalLightLevel( global ) );
         ns.Send( new PersonalLightLevel( this, personal ) );
      }

      public override int GetMinResistance( ResistanceType type )
      {
         int magicResist = (int)(Skills[SkillName.MagicResist].Value * 10);
         int min = int.MinValue;

         if ( magicResist >= 1000 )
            min = 40 + ((magicResist - 1000) / 50);
         else if ( magicResist >= 400 )
            min = (magicResist - 400) / 15;

         if ( min > MaxPlayerResistance )
            min = MaxPlayerResistance;

         int baseMin = base.GetMinResistance( type );

         if ( min < baseMin )
            min = baseMin;

         return min;
      }

      private static void OnLogin( LoginEventArgs e )
      {
         Mobile from = e.Mobile;

         SacrificeVirtue.CheckAtrophy( from );
         JusticeVirtue.CheckAtrophy( from );
         CompassionVirtue.CheckAtrophy( from );

         if ( AccountHandler.LockdownLevel > AccessLevel.Player )
         {
            string notice;

            Accounting.Account acct = from.Account as Accounting.Account;

            if ( acct == null || !acct.HasAccess( from.NetState ) )
            {
               if ( from.AccessLevel == AccessLevel.Player )
                  notice = "The server is currently under lockdown. No players are allowed to log in at this time.";
               else
                  notice = "The server is currently under lockdown. You do not have sufficient access level to connect.";

               Timer.DelayCall( TimeSpan.FromSeconds( 1.0 ), new TimerStateCallback( Disconnect ), from );
            }
            else if ( from.AccessLevel == AccessLevel.Administrator )
            {
               notice = "The server is currently under lockdown. As you are an administrator, you may change this from the [Admin gump.";
            }
            else
            {
               notice = "The server is currently under lockdown. You have sufficient access level to connect.";
            }

            from.SendGump( new NoticeGump( 1060637, 30720, notice, 0xFFC000, 300, 140, null, null ) );
         }
      }

      private bool m_NoDeltaRecursion;

      public void ValidateEquipment()
      {
         if ( m_NoDeltaRecursion || Map == null || Map == Map.Internal )
            return;

         if ( this.Items == null )
            return;

         m_NoDeltaRecursion = true;
         Timer.DelayCall( TimeSpan.Zero, new TimerCallback( ValidateEquipment_Sandbox ) );
      }

      private void ValidateEquipment_Sandbox()
      {
         try
         {
            if ( Map == null || Map == Map.Internal )
               return;

            ArrayList items = this.Items;

            if ( items == null )
               return;

            bool moved = false;

            int str = this.Str;
            int dex = this.Dex;
            int intel = this.Int;

            Mobile from = this;

            for ( int i = items.Count - 1; i >= 0; --i )
            {
               if ( i >= items.Count )
                  continue;

               Item item = (Item)items[i];

               if ( item is BaseWeapon )
               {
                  BaseWeapon weapon = (BaseWeapon)item;

                  bool drop = false;

                  if ( dex < weapon.DexRequirement )
                     drop = true;
                  else if ( str < AOS.Scale( weapon.StrRequirement, 100 - weapon.GetLowerStatReq() ) )
                     drop = true;
                  else if ( intel < weapon.IntRequirement )
                     drop = true;

                  if ( drop )
                  {
                     string name = weapon.Name;

                     if ( name == null )
                        name = String.Format( "#{0}", weapon.LabelNumber );

                     from.SendLocalizedMessage( 1062001, name ); // You can no longer wield your ~1_WEAPON~
                     from.AddToBackpack( weapon );
                     moved = true;
                  }
               }
               else if ( item is BaseArmor )
               {
                  BaseArmor armor = (BaseArmor)item;

                  bool drop = false;

                  if ( !armor.AllowMaleWearer && from.Body.IsMale && from.AccessLevel < AccessLevel.GameMaster )
                  {
                     drop = true;
                  }
                  else if ( !armor.AllowFemaleWearer && from.Body.IsFemale && from.AccessLevel < AccessLevel.GameMaster )
                  {
                     drop = true;
                  }
                  else
                  {
                     int strBonus = armor.ComputeStatBonus( StatType.Str ), strReq = armor.ComputeStatReq( StatType.Str );
                     int dexBonus = armor.ComputeStatBonus( StatType.Dex ), dexReq = armor.ComputeStatReq( StatType.Dex );
                     int intBonus = armor.ComputeStatBonus( StatType.Int ), intReq = armor.ComputeStatReq( StatType.Int );

                     if ( dex < dexReq || (dex + dexBonus) < 1 )
                        drop = true;
                     else if ( str < strReq || (str + strBonus) < 1 )
                        drop = true;
                     else if ( intel < intReq || (intel + intBonus) < 1 )
                        drop = true;
                  }

                  if ( drop )
                  {
                     string name = armor.Name;

                     if ( name == null )
                        name = String.Format( "#{0}", armor.LabelNumber );

                     if ( armor is BaseShield )
                        from.SendLocalizedMessage( 1062003, name ); // You can no longer equip your ~1_SHIELD~
                     else
                        from.SendLocalizedMessage( 1062002, name ); // You can no longer wear your ~1_ARMOR~

                     from.AddToBackpack( armor );
                     moved = true;
                  }
               }
            }

            if ( moved )
               from.SendLocalizedMessage( 500647 ); // Some equipment has been moved to your backpack.
         }
         catch ( Exception e )
         {
            Console.WriteLine( e );
         }
         finally
         {
            m_NoDeltaRecursion = false;
         }
      }

      public override void Delta( MobileDelta flag )
      {
         base.Delta( flag );

         if ( (flag & MobileDelta.Stat) != 0 )
            ValidateEquipment();

         if ( (flag & (MobileDelta.Name | MobileDelta.Hue)) != 0 )
            InvalidateMyRunUO();
      }

      private static void Disconnect( object state )
      {
         NetState ns = ((Mobile)state).NetState;

         if ( ns != null )
            ns.Dispose();
      }

      private static void OnLogout( LogoutEventArgs e )
      {
      }

      private static void EventSink_Connected( ConnectedEventArgs e )
      {
         PlayerMobile pm = e.Mobile as PlayerMobile;

         if ( pm != null )
            pm.m_SessionStart = DateTime.Now;
      }

      private static void EventSink_Disconnected( DisconnectedEventArgs e )
      {
         Mobile from = e.Mobile;
         DesignContext context = DesignContext.Find( from );

         if ( context != null )
         {
            /* Client disconnected
             *  - Remove design context
             *  - Eject client from house
             */

            // Remove design context
            DesignContext.Remove( from );

            // Eject client from house
            from.RevealingAction();
            from.Map = context.Foundation.Map;
            from.Location = context.Foundation.BanLocation;
         }

         PlayerMobile pm = e.Mobile as PlayerMobile;

         if ( pm != null )
            pm.m_GameTime += (DateTime.Now - pm.m_SessionStart);
      }

      public override void RevealingAction()
      {
         if ( m_DesignContext != null )
            return;

         Spells.Sixth.InvisibilitySpell.RemoveTimer( this );

         base.RevealingAction();
      }

      public override void OnSubItemAdded( Item item )
      {
         if ( AccessLevel < AccessLevel.GameMaster && item.IsChildOf( this.Backpack ) )
         {
            int maxWeight = WeightOverloading.GetMaxWeight( this );
            int curWeight = Mobile.BodyWeight + this.TotalWeight;

            if ( curWeight > maxWeight )
               this.SendLocalizedMessage( 1019035, true, String.Format( " : {0} / {1}", curWeight, maxWeight ) );
         }
      }

      public override bool CanBeHarmful( Mobile target, bool message, bool ignoreOurBlessedness )
      {
         if ( m_DesignContext != null || (target is PlayerMobile && ((PlayerMobile)target).m_DesignContext != null) )
            return false;

         if ( (target is BaseVendor && ((BaseVendor)target).IsInvulnerable) || target is PlayerVendor || target is TownCrier )
         {
            if ( message )
            {
               if ( target.Title == null )
                  SendMessage( "{0} the vendor cannot be harmed.", target.Name );
               else
                  SendMessage( "{0} {1} cannot be harmed.", target.Name, target.Title );
            }

            return false;
         }

         return base.CanBeHarmful( target, message, ignoreOurBlessedness );
      }

      public override bool CanBeBeneficial( Mobile target, bool message, bool allowDead )
      {
         if ( m_DesignContext != null || (target is PlayerMobile && ((PlayerMobile)target).m_DesignContext != null) )
            return false;

         return base.CanBeBeneficial( target, message, allowDead );
      }

      public override bool CheckContextMenuDisplay( IEntity target )
      {
         return ( m_DesignContext == null );
      }

      public override void OnItemAdded( Item item )
      {
         base.OnItemAdded( item );

         if ( item is BaseArmor || item is BaseWeapon )
         {
            Hits=Hits; Stam=Stam; Mana=Mana;
         }

         InvalidateMyRunUO();
      }

      public override void OnItemRemoved( Item item )
      {
         base.OnItemRemoved( item );

         if ( item is BaseArmor || item is BaseWeapon )
         {
            Hits=Hits; Stam=Stam; Mana=Mana;
         }

         InvalidateMyRunUO();
      }

      public override int HitsMax
      {
         get
         {
            int strBase;
            int strOffs = GetStatOffset( StatType.Str );

            if ( Core.AOS )
            {
               strBase = this.Str;
               strOffs += AosAttributes.GetValue( this, AosAttribute.BonusHits );
            }
            else
            {
               strBase = this.RawStr;
            }

            return (strBase / 2) + 50 + strOffs;
         }
      }

      public override int StamMax
      {
         get{ return base.StamMax + AosAttributes.GetValue( this, AosAttribute.BonusStam ); }
      }

      public override int ManaMax
      {
         get{ return base.ManaMax + AosAttributes.GetValue( this, AosAttribute.BonusMana ); }
      }

      public override bool Move( Direction d )
      {
         NetState ns = this.NetState;

         if ( ns != null )
         {
            Gump[] gumps = ns.Gumps;

            for ( int i = 0; i < gumps.Length; ++i )
            {
               if ( gumps[i] is ResurrectGump )
               {
                  if ( Alive )
                  {
                     CloseGump( typeof( ResurrectGump ) );
                  }
                  else
                  {
                     SendLocalizedMessage( 500111 ); // You are frozen and cannot move.
                     return false;
                  }
               }
            }
         }

         TimeSpan speed = ComputeMovementSpeed( d );

         if ( !base.Move( d ) )
            return false;

         m_NextMovementTime += speed;
         return true;
      }

      public override bool CheckMovement( Direction d, out int newZ )
      {
         DesignContext context = m_DesignContext;

         if ( context == null )
            return base.CheckMovement( d, out newZ );

         HouseFoundation foundation = context.Foundation;

         newZ = foundation.Z + HouseFoundation.GetLevelZ( context.Level );

         int newX = this.X, newY = this.Y;
         Movement.Movement.Offset( d, ref newX, ref newY );

         int startX = foundation.X + foundation.Components.Min.X + 1;
         int startY = foundation.Y + foundation.Components.Min.Y + 1;
         int endX = startX + foundation.Components.Width - 1;
         int endY = startY + foundation.Components.Height - 2;

         return ( newX >= startX && newY >= startY && newX < endX && newY < endY && Map == foundation.Map );
      }

      public override bool AllowItemUse( Item item )
      {
         return DesignContext.Check( this );
      }

      public override bool AllowSkillUse( SkillName skill )
      {
         return DesignContext.Check( this );
      }

      private bool m_LastProtectedMessage;
      private int m_NextProtectionCheck = 10;

      public override void SetLocation( Point3D loc, bool isTeleport )
      {
         base.SetLocation( loc, isTeleport );

         if ( isTeleport || --m_NextProtectionCheck == 0 )
         {
            m_NextProtectionCheck = 10;

            Regions.GuardedRegion reg = this.Region as Regions.GuardedRegion;
            bool isProtected = ( reg != null && !reg.IsDisabled() );

            if ( isProtected != m_LastProtectedMessage )
            {
               if ( isProtected )
                  SendLocalizedMessage( 500112 ); // You are now under the protection of the town guards.
               else
                  SendLocalizedMessage( 500113 ); // You have left the protection of the town guards.

               m_LastProtectedMessage = isProtected;
            }
         }
      }

      public override void GetContextMenuEntries( Mobile from, ArrayList list )
      {
         base.GetContextMenuEntries( from, list );

         if ( from == this )
         {
            if ( InsuranceEnabled )
            {
               list.Add( new CallbackEntry( 6201, new ContextCallback( ToggleItemInsurance ) ) );

               if ( AutoRenewInsurance )
                  list.Add( new CallbackEntry( 6202, new ContextCallback( CancelRenewInventoryInsurance ) ) );
               else
                  list.Add( new CallbackEntry( 6200, new ContextCallback( AutoRenewInventoryInsurance ) ) );
            }

            // TODO: Toggle champ titles

            BaseHouse house = BaseHouse.FindHouseAt( this );

            if ( house != null && house.IsAosRules )
               list.Add( new CallbackEntry( 6207, new ContextCallback( LeaveHouse ) ) );

            if ( m_JusticeProtectors.Count > 0 )
               list.Add( new CallbackEntry( 6157, new ContextCallback( CancelProtection ) ) );
         }
      }

      private void CancelProtection()
      {
         for ( int i = 0; i < m_JusticeProtectors.Count; ++i )
         {
            Mobile prot = (Mobile)m_JusticeProtectors[i];

            string args = String.Format( "{0}\t{1}", this.Name, prot.Name );

            prot.SendLocalizedMessage( 1049371, args ); // The protective relationship between ~1_PLAYER1~ and ~2_PLAYER2~ has been ended.
            this.SendLocalizedMessage( 1049371, args ); // The protective relationship between ~1_PLAYER1~ and ~2_PLAYER2~ has been ended.
         }

         m_JusticeProtectors.Clear();
      }

      private void ToggleItemInsurance()
      {
         BeginTarget( -1, false, TargetFlags.None, new TargetCallback( ToggleItemInsurance_Callback ) );
         SendLocalizedMessage( 1060868 ); // Target the item you wish to toggle insurance status on <ESC> to cancel
      }

      private bool CanInsure( Item item )
      {
         if ( item is Container )
            return false;

         if ( item is Spellbook || item is Runebook || item is PotionKeg )
            return false;

         if ( item.Stackable )
            return false;

         if ( item.LootType == LootType.Cursed )
            return false;

         if ( item.ItemID == 0x204E ) // death shroud
            return false;

         return true;
      }

      private void ToggleItemInsurance_Callback( Mobile from, object obj )
      {
         Item item = obj as Item;

         if ( item == null || !item.IsChildOf( this ) )
         {
            BeginTarget( -1, false, TargetFlags.None, new TargetCallback( ToggleItemInsurance_Callback ) );
            SendLocalizedMessage( 1060871, "", 0x23 ); // You can only insure items that you have equipped or that are in your backpack
         }
         else if ( item.Insured )
         {
            item.Insured = false;

            SendLocalizedMessage( 1060874, "", 0x35 ); // You cancel the insurance on the item

            BeginTarget( -1, false, TargetFlags.None, new TargetCallback( ToggleItemInsurance_Callback ) );
            SendLocalizedMessage( 1060868, "", 0x23 ); // Target the item you wish to toggle insurance status on <ESC> to cancel
         }
         else if ( !CanInsure( item ) )
         {
            BeginTarget( -1, false, TargetFlags.None, new TargetCallback( ToggleItemInsurance_Callback ) );
            SendLocalizedMessage( 1060869, "", 0x23 ); // You cannot insure that
         }
         else if ( item.LootType == LootType.Blessed || item.LootType == LootType.Newbied || item.BlessedFor == from )
         {
            BeginTarget( -1, false, TargetFlags.None, new TargetCallback( ToggleItemInsurance_Callback ) );
            SendLocalizedMessage( 1060870, "", 0x23 ); // That item is blessed and does not need to be insured
            SendLocalizedMessage( 1060869, "", 0x23 ); // You cannot insure that
         }
         else
         {
            if ( !item.PayedInsurance )
            {
               if ( Banker.Withdraw( from, 600 ) )
               {
                  SendLocalizedMessage( 1060398, "600" ); // ~1_AMOUNT~ gold has been withdrawn from your bank box.
                  item.PayedInsurance = true;
               }
               else
               {
                  SendLocalizedMessage( 1061079, "", 0x23 ); // You lack the funds to purchase the insurance
                  return;
               }
            }

            item.Insured = true;

            SendLocalizedMessage( 1060873, "", 0x23 ); // You have insured the item

            BeginTarget( -1, false, TargetFlags.None, new TargetCallback( ToggleItemInsurance_Callback ) );
            SendLocalizedMessage( 1060868, "", 0x23 ); // Target the item you wish to toggle insurance status on <ESC> to cancel
         }
      }

      private void AutoRenewInventoryInsurance()
      {
         SendLocalizedMessage( 1060881, "", 0x23 ); // You have selected to automatically reinsure all insured items upon death
         AutoRenewInsurance = true;
      }

      private void CancelRenewInventoryInsurance()
      {
         SendLocalizedMessage( 1061075, "", 0x23 ); // You have cancelled automatically reinsuring all insured items upon death
         AutoRenewInsurance = false;
      }

      // TODO: Champ titles, toggle

      private void LeaveHouse()
      {
         BaseHouse house = BaseHouse.FindHouseAt( this );

         if ( house != null )
            this.Location = house.BanLocation;
      }

      private delegate void ContextCallback();

      private class CallbackEntry : ContextMenuEntry
      {
         private ContextCallback m_Callback;

         public CallbackEntry( int number, ContextCallback callback ) : this( number, -1, callback )
         {
         }

         public CallbackEntry( int number, int range, ContextCallback callback ) : base( number, range )
         {
            m_Callback = callback;
         }

         public override void OnClick()
         {
            if ( m_Callback != null )
               m_Callback();
         }
      }

      public override void OnDoubleClick( Mobile from )
      {
         if ( this == from && !Warmode )
         {
            IMount mount = Mount;

            if ( mount != null && !DesignContext.Check( this ) )
               return;
         }

         base.OnDoubleClick( from );
      }

      public override void DisplayPaperdollTo( Mobile to )
      {
         if ( DesignContext.Check( this ) )
            base.DisplayPaperdollTo( to );
      }

      private static bool m_NoRecursion;

      protected override void OnLocationChange( Point3D oldLocation )
      {
         CheckLightLevels( false );

         DesignContext context = m_DesignContext;

         if ( context == null || m_NoRecursion )
            return;

         m_NoRecursion = true;

         HouseFoundation foundation = context.Foundation;

         int newX = this.X, newY = this.Y;
         int newZ = foundation.Z + HouseFoundation.GetLevelZ( context.Level );

         int startX = foundation.X + foundation.Components.Min.X + 1;
         int startY = foundation.Y + foundation.Components.Min.Y + 1;
         int endX = startX + foundation.Components.Width - 1;
         int endY = startY + foundation.Components.Height - 2;

         if ( newX >= startX && newY >= startY && newX < endX && newY < endY && Map == foundation.Map )
         {
            if ( Z != newZ )
               Location = new Point3D( X, Y, newZ );

            m_NoRecursion = false;
            return;
         }

         Location = new Point3D( foundation.X, foundation.Y, newZ );
         Map = foundation.Map;

         m_NoRecursion = false;
      }

      protected override void OnMapChange( Map oldMap )
      {
         DesignContext context = m_DesignContext;

         if ( context == null || m_NoRecursion )
            return;

         m_NoRecursion = true;

         HouseFoundation foundation = context.Foundation;

         if ( Map != foundation.Map )
            Map = foundation.Map;

         m_NoRecursion = false;
      }

      public override void OnDamage( int amount, Mobile from, bool willKill )
      {
         if ( amount > 0 )
         {
            BandageContext c = BandageContext.GetContext( this );

            if ( c != null )
               c.Slip();
         }

         WeightOverloading.FatigueOnDamage( this, amount );

         base.OnDamage( amount, from, willKill );
      }

      public static int ComputeSkillTotal( Mobile m )
      {
         int total = 0;

         for ( int i = 0; i < m.Skills.Length; ++i )
            total += m.Skills[i].BaseFixedPoint;

         return ( total / 10 );
      }

      public override void Resurrect()
      {
         bool wasAlive = this.Alive;

         base.Resurrect();

         if ( this.Alive && !wasAlive )
         {
            Item deathRobe = new DeathRobe();

            if ( !EquipItem( deathRobe ) )
               deathRobe.Delete();
         }
      }

      private Mobile m_InsuranceAward;
      private int m_InsuranceCost;
      private int m_InsuranceBonus;

      public override bool OnBeforeDeath()
      {
         m_InsuranceCost = 0;
         m_InsuranceAward = base.FindMostRecentDamager( false );

         if ( m_InsuranceAward != null && !m_InsuranceAward.Player )
            m_InsuranceAward = null;

         if ( m_InsuranceAward is PlayerMobile )
            ((PlayerMobile)m_InsuranceAward).m_InsuranceBonus = 0;

         return base.OnBeforeDeath();
      }

      private bool CheckInsuranceOnDeath( Item item )
      {
         if ( InsuranceEnabled && item.Insured )
         {
            if ( AutoRenewInsurance )
            {
               int cost = ( m_InsuranceAward == null ? 600 : 300 );

               if ( Banker.Withdraw( this, cost ) )
               {
                  m_InsuranceCost += cost;
                  item.PayedInsurance = true;
               }
               else
               {
                  SendLocalizedMessage( 1061079, "", 0x23 ); // You lack the funds to purchase the insurance
                  item.PayedInsurance = false;
                  item.Insured = false;
               }
            }
            else
            {
               item.PayedInsurance = false;
               item.Insured = false;
            }

            if ( m_InsuranceAward != null )
            {
               if ( Banker.Deposit( m_InsuranceAward, 300 ) )
               {
                  if ( m_InsuranceAward is PlayerMobile )
                     ((PlayerMobile)m_InsuranceAward).m_InsuranceBonus += 300;
               }
            }

            return true;
         }

         return false;
      }

      public override DeathMoveResult GetParentMoveResultFor( Item item )
      {
         if ( CheckInsuranceOnDeath( item ) )
            return DeathMoveResult.MoveToBackpack;

         return base.GetParentMoveResultFor( item );
      }

      public override DeathMoveResult GetInventoryMoveResultFor( Item item )
      {
         if ( CheckInsuranceOnDeath( item ) )
            return DeathMoveResult.MoveToBackpack;

         return base.GetInventoryMoveResultFor( item );
      }

      public override void OnDeath( Container c )
      {
         base.OnDeath( c );

         HueMod = -1;
         NameMod = null;
         SavagePaintExpiration = TimeSpan.Zero;

         SetHairMods( -1, -1 );

         PolymorphSpell.StopTimer( this );
         IncognitoSpell.StopTimer( this );
         DisguiseGump.StopTimer( this );

         EndAction( typeof( PolymorphSpell ) );
         EndAction( typeof( IncognitoSpell ) );

         MeerMage.StopEffect( this, false );

         if ( m_PermaFlags.Count > 0 )
         {
            m_PermaFlags.Clear();

            if ( c is Corpse )
               ((Corpse)c).Criminal = true;

            if ( SkillHandlers.Stealing.ClassicMode )
               Criminal = true;
         }

         if ( this.Kills >= 5 && DateTime.Now >= m_NextJustAward )
         {
            Mobile m = FindMostRecentDamager( false );

            if ( m != null && m.Player )
            {
               bool gainedPath = false;

               int theirTotal = ComputeSkillTotal( m );
               int ourTotal = ComputeSkillTotal( this );

               int pointsToGain = 1 + ((theirTotal - ourTotal) / 50);

               if ( pointsToGain < 1 )
                  pointsToGain = 1;
               else if ( pointsToGain > 4 )
                  pointsToGain = 4;

               if ( VirtueHelper.Award( m, VirtueName.Justice, pointsToGain, ref gainedPath ) )
               {
                  if ( gainedPath )
                     m.SendLocalizedMessage( 1049367 ); // You have gained a path in Justice!
                  else
                     m.SendLocalizedMessage( 1049363 ); // You have gained in Justice.

                  m.FixedParticles( 0x375A, 9, 20, 5027, EffectLayer.Waist );
                  m.PlaySound( 0x1F7 );

                  m_NextJustAward = DateTime.Now + TimeSpan.FromMinutes( pointsToGain * 2 );
               }
            }
         }

         if ( m_InsuranceCost > 0 )
            SendLocalizedMessage( 1060398, m_InsuranceCost.ToString() ); // ~1_AMOUNT~ gold has been withdrawn from your bank box.

         if ( m_InsuranceAward is PlayerMobile )
         {
            PlayerMobile pm = (PlayerMobile)m_InsuranceAward;

            if ( pm.m_InsuranceBonus > 0 )
               pm.SendLocalizedMessage( 1060397, pm.m_InsuranceBonus.ToString() ); // ~1_AMOUNT~ gold has been deposited into your bank box.
         }
      }

      private ArrayList m_PermaFlags;
      private ArrayList m_VisList;
      private Hashtable m_AntiMacroTable;
      private TimeSpan m_GameTime;
      private TimeSpan m_ShortTermElapse;
      private TimeSpan m_LongTermElapse;
      private DateTime m_SessionStart;
      private DateTime m_LastEscortTime;
      private DateTime m_NextSmithBulkOrder;
      private DateTime m_NextTailorBulkOrder;
      private DateTime m_SavagePaintExpiration;
      private SkillName m_Learning = (SkillName)(-1);

      public SkillName Learning
      {
         get{ return m_Learning; }
         set{ m_Learning = value; }
      }

      [CommandProperty( AccessLevel.GameMaster )]
      public TimeSpan SavagePaintExpiration
      {
         get
         {
            TimeSpan ts = m_SavagePaintExpiration - DateTime.Now;

            if ( ts < TimeSpan.Zero )
               ts = TimeSpan.Zero;

            return ts;
         }
         set
         {
            m_SavagePaintExpiration = DateTime.Now + value;
         }
      }

      [CommandProperty( AccessLevel.GameMaster )]
      public TimeSpan NextSmithBulkOrder
      {
         get
         {
            TimeSpan ts = m_NextSmithBulkOrder - DateTime.Now;

            if ( ts < TimeSpan.Zero )
               ts = TimeSpan.Zero;

            return ts;
         }
         set
         {
            try{ m_NextSmithBulkOrder = DateTime.Now + value; }
            catch{}
         }
      }

      [CommandProperty( AccessLevel.GameMaster )]
      public TimeSpan NextTailorBulkOrder
      {
         get
         {
            TimeSpan ts = m_NextTailorBulkOrder - DateTime.Now;

            if ( ts < TimeSpan.Zero )
               ts = TimeSpan.Zero;

            return ts;
         }
         set
         {
            try{ m_NextTailorBulkOrder = DateTime.Now + value; }
            catch{}
         }
      }

      public DateTime LastEscortTime
      {
         get{ return m_LastEscortTime; }
         set{ m_LastEscortTime = value; }
      }

      public PlayerMobile()
      {
         m_VisList = new ArrayList();
         m_PermaFlags = new ArrayList();
         m_AntiMacroTable = new Hashtable();

         m_BOBFilter = new Engines.BulkOrders.BOBFilter();

         m_GameTime = TimeSpan.Zero;
         m_ShortTermElapse = TimeSpan.FromHours( 8.0 );
         m_LongTermElapse = TimeSpan.FromHours( 40.0 );

         m_JusticeProtectors = new ArrayList();

         InvalidateMyRunUO();
      }

      public override bool MutateSpeech( ArrayList hears, ref string text, ref object context )
      {
         if ( Alive )
            return false;

         if ( Core.AOS )
         {
            for ( int i = 0; i < hears.Count; ++i )
            {
               object o = hears[i];

               if ( o != this && o is Mobile && ((Mobile)o).Skills[SkillName.SpiritSpeak].Value >= 100.0 )
                  return false;
            }
         }

         return base.MutateSpeech( hears, ref text, ref context );
      }

      public override void Damage( int amount, Mobile from )
      {
         if ( Spells.Necromancy.EvilOmenSpell.CheckEffect( this ) )
            amount = (int)(amount * 1.25);

         Mobile oath = Spells.Necromancy.BloodOathSpell.GetBloodOath( from );

         if ( oath == this )
         {
            amount = (int)(amount * 1.1);
            from.Damage( amount, from );
         }

         base.Damage( amount, from );
      }

      public override ApplyPoisonResult ApplyPoison( Mobile from, Poison poison )
      {
         if ( !Alive )
            return ApplyPoisonResult.Immune;

         if ( Spells.Necromancy.EvilOmenSpell.CheckEffect( this ) )
            return base.ApplyPoison( from, PoisonImpl.IncreaseLevel( poison ) );

         return base.ApplyPoison( from, poison );
      }

      public PlayerMobile( Serial s ) : base( s )
      {
         m_VisList = new ArrayList();
         m_AntiMacroTable = new Hashtable();
         InvalidateMyRunUO();
      }

      public ArrayList VisibilityList
      {
         get{ return m_VisList; }
      }

      public ArrayList PermaFlags
      {
         get{ return m_PermaFlags; }
      }

      public override int Luck{ get{ return AosAttributes.GetValue( this, AosAttribute.Luck ); } }

      public override bool IsHarmfulCriminal( Mobile target )
      {
         if ( SkillHandlers.Stealing.ClassicMode && target is PlayerMobile && ((PlayerMobile)target).m_PermaFlags.Count > 0 )
         {
            int noto = Notoriety.Compute( this, target );

            if ( noto == Notoriety.Innocent )
               target.Delta( MobileDelta.Noto );

            return false;
         }

         if ( target is BaseCreature && ((BaseCreature)target).InitialInnocent )
            return false;

         return base.IsHarmfulCriminal( target );
      }

      public bool AntiMacroCheck( Skill skill, object obj )
      {
         if ( obj == null || m_AntiMacroTable == null || this.AccessLevel != AccessLevel.Player )
            return true;

         Hashtable tbl = (Hashtable)m_AntiMacroTable[skill];
         if ( tbl == null )
            m_AntiMacroTable[skill] = tbl = new Hashtable();

         CountAndTimeStamp count = (CountAndTimeStamp)tbl[obj];
         if ( count != null )
         {
            if ( count.TimeStamp + SkillCheck.AntiMacroExpire <= DateTime.Now )
            {
               count.Count = 1;
               return true;
            }
            else
            {
               ++count.Count;
               if ( count.Count <= SkillCheck.Allowance )
                  return true;
               else
                  return false;
            }
         }
         else
         {
            tbl[obj] = count = new CountAndTimeStamp();
            count.Count = 1;
            
            return true;
         }
      }

      private void RevertHair()
      {
         SetHairMods( -1, -1 );
      }

      private Engines.BulkOrders.BOBFilter m_BOBFilter;

      public Engines.BulkOrders.BOBFilter BOBFilter
      {
         get{ return m_BOBFilter; }
      }
      
      public override void Deserialize( GenericReader reader )
      {
         base.Deserialize( reader );
         int version = reader.ReadInt();

         switch ( version )
         {
            case 14:
            {
               m_CompassionGains = reader.ReadEncodedInt();

               if ( m_CompassionGains > 0 )
                  m_NextCompassionDay = reader.ReadDeltaTime();

               goto case 13;
            }
            case 13: // just removed m_PayedInsurance list
            case 12:
            {
               m_BOBFilter = new Engines.BulkOrders.BOBFilter( reader );
               goto case 11;
            }
            case 11:
            {
               if ( version < 13 )
               {
                  ArrayList payed = reader.ReadItemList();

                  for ( int i = 0; i < payed.Count; ++i )
                     ((Item)payed[i]).PayedInsurance = true;
               }

               goto case 10;
            }
            case 10:
            {
               if ( reader.ReadBool() )
               {
                  m_HairModID = reader.ReadInt();
                  m_HairModHue = reader.ReadInt();
                  m_BeardModID = reader.ReadInt();
                  m_BeardModHue = reader.ReadInt();

                  // We cannot call SetHairMods( -1, -1 ) here because the items have not yet loaded
                  Timer.DelayCall( TimeSpan.Zero, new TimerCallback( RevertHair ) );
               }

               goto case 9;
            }
            case 9:
            {
               SavagePaintExpiration = reader.ReadTimeSpan();

               if ( SavagePaintExpiration > TimeSpan.Zero )
               {
                  BodyMod = ( Female ? 184 : 183 );
                  HueMod = 0;
               }

               goto case 8;
            }
            case 8:
            {
               m_NpcGuild = (NpcGuild)reader.ReadInt();
               m_NpcGuildJoinTime = reader.ReadDateTime();
               m_NpcGuildGameTime = reader.ReadTimeSpan();
               goto case 7;
            }
            case 7:
            {
               m_PermaFlags = reader.ReadMobileList();
               goto case 6;
            }
            case 6:
            {
               NextTailorBulkOrder = reader.ReadTimeSpan();
               goto case 5;
            }
            case 5:
            {
               NextSmithBulkOrder = reader.ReadTimeSpan();
               goto case 4;
            }
            case 4:
            {
               m_LastJusticeLoss = reader.ReadDeltaTime();
               m_JusticeProtectors = reader.ReadMobileList();
               goto case 3;
            }
            case 3:
            {
               m_LastSacrificeGain = reader.ReadDeltaTime();
               m_LastSacrificeLoss = reader.ReadDeltaTime();
               m_AvailableResurrects = reader.ReadInt();
               goto case 2;
            }
            case 2:
            {
               m_Flags = (PlayerFlag)reader.ReadInt();
               goto case 1;
            }
            case 1:
            {
               m_LongTermElapse = reader.ReadTimeSpan();
               m_ShortTermElapse = reader.ReadTimeSpan();
               m_GameTime = reader.ReadTimeSpan();
               goto case 0;
            }
            case 0:
            {
               break;
            }
         }

         if ( m_PermaFlags == null )
            m_PermaFlags = new ArrayList();

         if ( m_JusticeProtectors == null )
            m_JusticeProtectors = new ArrayList();

         if ( m_BOBFilter == null )
            m_BOBFilter = new Engines.BulkOrders.BOBFilter();

         ArrayList list = this.Stabled;

         for ( int i = 0; i < list.Count; ++i )
         {
            BaseCreature bc = list[i] as BaseCreature;

            if ( bc != null )
               bc.IsStabled = true;
         }
      }
      
      public override void Serialize( GenericWriter writer )
      {
         //cleanup our anti-macro table
         foreach ( Hashtable t in m_AntiMacroTable.Values )
         {
            ArrayList remove = new ArrayList();
            foreach ( CountAndTimeStamp time in t.Values )
            {
               if ( time.TimeStamp + SkillCheck.AntiMacroExpire <= DateTime.Now )
                  remove.Add( time );
            }

            for (int i=0;i<remove.Count;++i)
               t.Remove( remove[i] );
         }

         //decay our kills
         if ( m_ShortTermElapse < this.GameTime )
         {
            m_ShortTermElapse += TimeSpan.FromHours( 8 );
            if ( ShortTermMurders > 0 )
               --ShortTermMurders;
         }

         if ( m_LongTermElapse < this.GameTime )
         {
            m_LongTermElapse += TimeSpan.FromHours( 40 );
            if ( Kills > 0 )
               --Kills;
         }

         base.Serialize( writer );
         
         writer.Write( (int) 14 ); // version

         writer.WriteEncodedInt( m_CompassionGains );

         if ( m_CompassionGains > 0 )
            writer.WriteDeltaTime( m_NextCompassionDay );

         m_BOBFilter.Serialize( writer );

         bool useMods = ( m_HairModID != -1 || m_BeardModID != -1 );

         writer.Write( useMods );

         if ( useMods )
         {
            writer.Write( (int) m_HairModID );
            writer.Write( (int) m_HairModHue );
            writer.Write( (int) m_BeardModID );
            writer.Write( (int) m_BeardModHue );
         }

         writer.Write( SavagePaintExpiration );

         writer.Write( (int) m_NpcGuild );
         writer.Write( (DateTime) m_NpcGuildJoinTime );
         writer.Write( (TimeSpan) m_NpcGuildGameTime );

         writer.WriteMobileList( m_PermaFlags, true );

         writer.Write( NextTailorBulkOrder );

         writer.Write( NextSmithBulkOrder );

         writer.WriteDeltaTime( m_LastJusticeLoss );
         writer.WriteMobileList( m_JusticeProtectors, true );

         writer.WriteDeltaTime( m_LastSacrificeGain );
         writer.WriteDeltaTime( m_LastSacrificeLoss );
         writer.Write( m_AvailableResurrects );

         writer.Write( (int) m_Flags );

         writer.Write( m_LongTermElapse );
         writer.Write( m_ShortTermElapse );
         writer.Write( this.GameTime );
      }

      public void ResetKillTime()
      {
         m_ShortTermElapse = this.GameTime + TimeSpan.FromHours( 8 );
         m_LongTermElapse = this.GameTime + TimeSpan.FromHours( 40 );
      }

      [CommandProperty( AccessLevel.GameMaster )]
      public TimeSpan GameTime
      {
         get
         {
            if ( NetState != null )
               return m_GameTime + (DateTime.Now - m_SessionStart);
            else
               return m_GameTime;
         }
      }

      public override bool CanSee( Mobile m )
      {
         if ( m is PlayerMobile && ((PlayerMobile)m).m_VisList.Contains( this ) )
            return true;

         return base.CanSee( m );
      }

      public override bool CanSee( Item item )
      {
         if ( m_DesignContext != null && m_DesignContext.Foundation.IsHiddenToCustomizer( item ) )
            return false;

         return base.CanSee( item );
      }

      #region MyRunUO Invalidation
      private bool m_ChangedMyRunUO;

      public bool ChangedMyRunUO
      {
         get{ return m_ChangedMyRunUO; }
         set{ m_ChangedMyRunUO = value; }
      }

      public void InvalidateMyRunUO()
      {
         if ( !Deleted && !m_ChangedMyRunUO )
         {
            m_ChangedMyRunUO = true;
            Engines.MyRunUO.MyRunUO.QueueMobileUpdate( this );
         }
      }

      public override void OnKillsChange( int oldValue )
      {
         InvalidateMyRunUO();
      }

      public override void OnGenderChanged( bool oldFemale )
      {
         InvalidateMyRunUO();
      }

      public override void OnGuildChange( Server.Guilds.Guild oldGuild )
      {
         InvalidateMyRunUO();
      }

      public override void OnGuildTitleChange( string oldTitle )
      {
         InvalidateMyRunUO();
      }

      public override void OnKarmaChange( int oldValue )
      {
         InvalidateMyRunUO();
      }

      public override void OnFameChange( int oldValue )
      {
         InvalidateMyRunUO();
      }

      public override void OnSkillChange( SkillName skill, double oldBase )
      {
         InvalidateMyRunUO();
      }

      public override void OnAccessLevelChanged( AccessLevel oldLevel )
      {
         InvalidateMyRunUO();
      }

      public override void OnRawStatChange( StatType stat, int oldValue )
      {
         InvalidateMyRunUO();
      }

      public override void OnDelete()
      {
         InvalidateMyRunUO();
      }
      #endregion

      #region Fastwalk Prevention
      private static bool FastwalkPrevention = true; // Is fastwalk prevention enabled?
      private static TimeSpan FastwalkThreshold = TimeSpan.FromSeconds( 0.4 ); // Fastwalk prevention will become active after 0.4 seconds

      private DateTime m_NextMovementTime;

      public virtual bool UsesFastwalkPrevention{ get{ return ( AccessLevel < AccessLevel.GameMaster ); } }

      public virtual TimeSpan ComputeMovementSpeed( Direction dir )
      {
         if ( (dir & Direction.Mask) != (this.Direction & Direction.Mask) )
            return TimeSpan.Zero;

         bool running = ( (dir & Direction.Running) != 0 );

         bool onHorse = ( this.Mount != null );

         if ( onHorse )
            return ( running ? TimeSpan.FromSeconds( 0.1 ) : TimeSpan.FromSeconds( 0.2 ) );

         return ( running ? TimeSpan.FromSeconds( 0.2 ) : TimeSpan.FromSeconds( 0.4 ) );
      }

      public static bool MovementThrottle_Callback( NetState ns )
      {
         PlayerMobile pm = ns.Mobile as PlayerMobile;

         if ( pm == null || !pm.UsesFastwalkPrevention )
            return true;

         if ( pm.m_NextMovementTime == DateTime.MinValue )
         {
            // has not yet moved
            pm.m_NextMovementTime = DateTime.Now;
            return true;
         }

         TimeSpan ts = pm.m_NextMovementTime - DateTime.Now;

         if ( ts < TimeSpan.Zero )
         {
            // been a while since we've last moved
            pm.m_NextMovementTime = DateTime.Now;
            return true;
         }

         return ( ts < FastwalkThreshold );
      }
      #endregion

      #region Enemy of One
      private Type m_EnemyOfOneType;
      private bool m_WaitingForEnemy;

      public Type EnemyOfOneType
      {
         get{ return m_EnemyOfOneType; }
         set
         {
            Type oldType = m_EnemyOfOneType;
            Type newType = value;

            if ( oldType == newType )
               return;

            m_EnemyOfOneType = value;

            DeltaEnemies( oldType, newType );
         }
      }

      public bool WaitingForEnemy
      {
         get{ return m_WaitingForEnemy; }
         set{ m_WaitingForEnemy = value; }
      }

      private void DeltaEnemies( Type oldType, Type newType )
      {
         foreach ( Mobile m in this.GetMobilesInRange( 18 ) )
         {
            Type t = m.GetType();

            if ( t == oldType || t == newType )
               Send( new MobileMoving( m, Notoriety.Compute( this, m ) ) );
         }
      }
      #endregion

      #region Hair and beard mods
      private int m_HairModID = -1, m_HairModHue;
      private int m_BeardModID = -1, m_BeardModHue;

      public void SetHairMods( int hairID, int beardID )
      {
         if ( hairID == -1 )
            InternalRestoreHair( true, ref m_HairModID, ref m_HairModHue );
         else if ( hairID != -2 )
            InternalChangeHair( true, hairID, ref m_HairModID, ref m_HairModHue );

         if ( beardID == -1 )
            InternalRestoreHair( false, ref m_BeardModID, ref m_BeardModHue );
         else if ( beardID != -2 )
            InternalChangeHair( false, beardID, ref m_BeardModID, ref m_BeardModHue );
      }

      private Item CreateHair( bool hair, int id, int hue )
      {
         switch ( id )
         {
            case 0x203B: return new ShortHair( hue );
            case 0x203C: return new LongHair( hue );
            case 0x203D: return new PonyTail( hue );
            case 0x203E: return new LongBeard( hue );
            case 0x203F: return new ShortBeard( hue );
            case 0x2040: return new Goatee( hue );
            case 0x2041: return new Mustache( hue );
            case 0x2044: return new Mohawk( hue );
            case 0x2045: return new PageboyHair( hue );
            case 0x2046: return new BunsHair( hue );
            case 0x2047: return new Afro( hue );
            case 0x2048: return new ReceedingHair( hue );
            case 0x2049: return new TwoPigTails( hue );
            case 0x204A: return new KrisnaHair( hue );
            case 0x204B: return new MediumShortBeard( hue );
            case 0x204C: return new MediumLongBeard( hue );
            case 0x204D: return new Vandyke( hue );
            default:
            {
               Console.WriteLine( "Warning: Unknown hair ID specified: {0}", id );

               if ( hair )
                  return new GenericHair( id );
               else
                  return new GenericBeard( id );
            }
         }
      }

      private void InternalRestoreHair( bool hair, ref int id, ref int hue )
      {
         if ( id == -1 )
            return;

         Item item = FindItemOnLayer( hair ? Layer.Hair : Layer.FacialHair );

         if ( item != null )
            item.Delete();

         if ( id != 0 )
            AddItem( CreateHair( hair, id, hue ) );

         id = -1;
         hue = 0;
      }

      private void InternalChangeHair( bool hair, int id, ref int storeID, ref int storeHue )
      {
         Item item = FindItemOnLayer( hair ? Layer.Hair : Layer.FacialHair );

         if ( item != null )
         {
            if ( storeID == -1 )
            {
               storeID = item.ItemID;
               storeHue = item.Hue;
            }

            item.Delete();
         }
         else if ( storeID == -1 )
         {
            storeID = 0;
            storeHue = 0;
         }

         if ( id == 0 )
            return;

         AddItem( CreateHair( hair, id, 0 ) );
      }
      #endregion

      #region Virtue stuff
      private DateTime m_LastSacrificeGain;
      private DateTime m_LastSacrificeLoss;
      private int m_AvailableResurrects;

      public DateTime LastSacrificeGain{ get{ return m_LastSacrificeGain; } set{ m_LastSacrificeGain = value; } }
      public DateTime LastSacrificeLoss{ get{ return m_LastSacrificeLoss; } set{ m_LastSacrificeLoss = value; } }
      public int AvailableResurrects{ get{ return m_AvailableResurrects; } set{ m_AvailableResurrects = value; } }

      private DateTime m_NextJustAward;
      private DateTime m_LastJusticeLoss;
      private ArrayList m_JusticeProtectors;

      public DateTime LastJusticeLoss{ get{ return m_LastJusticeLoss; } set{ m_LastJusticeLoss = value; } }
      public ArrayList JusticeProtectors{ get{ return m_JusticeProtectors; } set{ m_JusticeProtectors = value; } }

      private DateTime m_LastCompassionLoss;
      private DateTime m_NextCompassionDay;
      private int m_CompassionGains;

      public DateTime LastCompassionLoss{ get{ return m_LastCompassionLoss; } set{ m_LastCompassionLoss = value; } }
      public DateTime NextCompassionDay{ get{ return m_NextCompassionDay; } set{ m_NextCompassionDay = value; } }
      public int CompassionGains{ get{ return m_CompassionGains; } set{ m_CompassionGains = value; } }
      #endregion
   }
}


¤¸¤Ã À§¿¡°ÍÀÌ Á¦ ÄÚµå.
Ç÷¹À̾î¸ð¹ÙÀÏ ½ºÅ©¸³ÀÔ´Ï´Ù.
¡è ¸Ç À§·Î °¡±â ¡è
ȸ¿ø ÇÁ·ÎÇÊ º¸±â ÂÊÁö º¸³»±â
weeea
ÀÛ¼º±ÛÁ¦¸ñ : ÀÌ·±.. ^^:;   ±Û ÀÛ¼º½Ã°£ : 2004-10-31 ÀÏ 11:25 am ±ÛÀ» ÀοëÇÏ¿© ÀÛ¼ºÇÕ´Ï´Ù.

First Cicle [8]
First Cicle [8]

°¡ÀÔÀÏ: 2004³â 10¿ù 30ÀÏ
°Ô½Ã¹°: 16
ÁÖ ¼Ò: /

ÀÌ·±.. ±âºÐ »óÇÏ°Ô ÇØµå·È³ª¿ä?
Á˼ÛÇØ¿ä. >¤µ<;;;
°ÅÁþ¸» ÇÑ´Ù´Â°Ô ¾Æ´Ï¶ó, Àü ¾ø¾î¼­ ¾î¶»°Ô ±¸ÇÒ¼ö ¾ø³ª ÇѰſ¹¿ä. ^^;;
¾Æ´Ô ÆÄÀÏÀ̸§À» À߸øÀû¾îÁÖ½Å°Ô ¾Æ´Ñ°¡ ÇØ¼­¿ä. ^^;;;
ÇÁ·Î±×·¡¹ÖÀº °è¼Ó ¤¾¤¿´ÂÁßÀ̰í, ¿ä»÷ Æ´³¯¶§¸¶´Ù ½ºÅ©¸³ °¡ÁÖ³ë´À¶ó°í¿ä.^^;


ÄÚµå : 

using System;
using System.Collections;
using Server;
using Server.Misc;
using Server.Items;
using Server.Gumps;
using Server.Multis;
using Server.Engines.Help;
using Server.ContextMenus;
using Server.Network;
using Server.Spells;
using Server.Spells.Fifth;
using Server.Spells.Seventh;
using Server.Targeting;

namespace Server.Mobiles
{
   [Flags]
   public enum PlayerFlag // First 16 bits are reserved for default-distro use, start custom flags at 0x00010000
   {
      None            = 0x00000000,
      Glassblowing      = 0x00000001,
      Masonry            = 0x00000002,
      SandMining         = 0x00000004,
      StoneMining         = 0x00000008,
      ToggleMiningStone   = 0x00000010,
      KarmaLocked         = 0x00000020,
      AutoRenewInsurance   = 0x00000040,
      UseOwnFilter      = 0x00000080,
      PublicMyRunUO      = 0x00000100,
      PagingSquelched      = 0x00000200
   }

   public enum NpcGuild
   {
      None,
      MagesGuild,
      WarriorsGuild,
      ThievesGuild,
      RangersGuild,
      HealersGuild,
      MinersGuild,
      MerchantsGuild,
      TinkersGuild,
      TailorsGuild,
      FishermensGuild,
      BardsGuild,
      BlacksmithsGuild
   }

   public class PlayerMobile : Mobile
   {
      private class CountAndTimeStamp
      {
         private int m_Count;
         private DateTime m_Stamp;

         public CountAndTimeStamp()
         {
         }

         public DateTime TimeStamp { get{ return m_Stamp; } }
         public int Count
         {
            get { return m_Count; }
            set   { m_Count = value; m_Stamp = DateTime.Now; }
         }
      }

      private DesignContext m_DesignContext;

      private NpcGuild m_NpcGuild;
      private DateTime m_NpcGuildJoinTime;
      private TimeSpan m_NpcGuildGameTime;
      private PlayerFlag m_Flags;
      private int m_StepsTaken;

      public int StepsTaken
      {
         get{ return m_StepsTaken; }
         set{ m_StepsTaken = value; }
      }

      [CommandProperty( AccessLevel.GameMaster )]
      public NpcGuild NpcGuild
      {
         get{ return m_NpcGuild; }
         set{ m_NpcGuild = value; }
      }

      [CommandProperty( AccessLevel.GameMaster )]
      public DateTime NpcGuildJoinTime
      {
         get{ return m_NpcGuildJoinTime; }
         set{ m_NpcGuildJoinTime = value; }
      }

      [CommandProperty( AccessLevel.GameMaster )]
      public TimeSpan NpcGuildGameTime
      {
         get{ return m_NpcGuildGameTime; }
         set{ m_NpcGuildGameTime = value; }
      }

      public PlayerFlag Flags
      {
         get{ return m_Flags; }
         set{ m_Flags = value; }
      }

      [CommandProperty( AccessLevel.GameMaster )]
      public bool PagingSquelched
      {
         get{ return GetFlag( PlayerFlag.PagingSquelched ); }
         set{ SetFlag( PlayerFlag.PagingSquelched, value ); }
      }

      [CommandProperty( AccessLevel.GameMaster )]
      public bool Glassblowing
      {
         get{ return GetFlag( PlayerFlag.Glassblowing ); }
         set{ SetFlag( PlayerFlag.Glassblowing, value ); }
      }

      [CommandProperty( AccessLevel.GameMaster )]
      public bool Masonry
      {
         get{ return GetFlag( PlayerFlag.Masonry ); }
         set{ SetFlag( PlayerFlag.Masonry, value ); }
      }

      [CommandProperty( AccessLevel.GameMaster )]
      public bool SandMining
      {
         get{ return GetFlag( PlayerFlag.SandMining ); }
         set{ SetFlag( PlayerFlag.SandMining, value ); }
      }

      [CommandProperty( AccessLevel.GameMaster )]
      public bool StoneMining
      {
         get{ return GetFlag( PlayerFlag.StoneMining ); }
         set{ SetFlag( PlayerFlag.StoneMining, value ); }
      }

      [CommandProperty( AccessLevel.GameMaster )]
      public bool ToggleMiningStone
      {
         get{ return GetFlag( PlayerFlag.ToggleMiningStone ); }
         set{ SetFlag( PlayerFlag.ToggleMiningStone, value ); }
      }

      [CommandProperty( AccessLevel.GameMaster )]
      public bool KarmaLocked
      {
         get{ return GetFlag( PlayerFlag.KarmaLocked ); }
         set{ SetFlag( PlayerFlag.KarmaLocked, value ); }
      }

      [CommandProperty( AccessLevel.GameMaster )]
      public bool AutoRenewInsurance
      {
         get{ return GetFlag( PlayerFlag.AutoRenewInsurance ); }
         set{ SetFlag( PlayerFlag.AutoRenewInsurance, value ); }
      }

      [CommandProperty( AccessLevel.GameMaster )]
      public bool UseOwnFilter
      {
         get{ return GetFlag( PlayerFlag.UseOwnFilter ); }
         set{ SetFlag( PlayerFlag.UseOwnFilter, value ); }
      }

      [CommandProperty( AccessLevel.GameMaster )]
      public bool PublicMyRunUO
      {
         get{ return GetFlag( PlayerFlag.PublicMyRunUO ); }
         set{ SetFlag( PlayerFlag.PublicMyRunUO, value ); InvalidateMyRunUO(); }
      }

      public bool GetFlag( PlayerFlag flag )
      {
         return ( (m_Flags & flag) != 0 );
      }

      public void SetFlag( PlayerFlag flag, bool value )
      {
         if ( value )
            m_Flags |= flag;
         else
            m_Flags &= ~flag;
      }

      public DesignContext DesignContext
      {
         get{ return m_DesignContext; }
         set{ m_DesignContext = value; }
      }

      public static void Initialize()
      {
         if ( FastwalkPrevention )
         {
            PacketHandler ph = PacketHandlers.GetHandler( 0x02 );

            ph.ThrottleCallback = new ThrottlePacketCallback( MovementThrottle_Callback );
         }

         EventSink.Login += new LoginEventHandler( OnLogin );
         EventSink.Logout += new LogoutEventHandler( OnLogout );
         EventSink.Connected += new ConnectedEventHandler( EventSink_Connected );
         EventSink.Disconnected += new DisconnectedEventHandler( EventSink_Disconnected );
      }

      public override void OnSkillInvalidated( Skill skill )
      {
         if ( Core.AOS && skill.SkillName == SkillName.MagicResist )
            UpdateResistances();
      }

      public override int GetMaxResistance( ResistanceType type )
      {
         int max = base.GetMaxResistance( type );

         if ( 60 < max && Spells.Fourth.CurseSpell.UnderEffect( this ) )
            max = 60;

         return max;
      }

      private int m_LastGlobalLight = -1, m_LastPersonalLight = -1;

      public override void OnNetStateChanged()
      {
         m_LastGlobalLight = -1;
         m_LastPersonalLight = -1;
      }

      public override void ComputeBaseLightLevels( out int global, out int personal )
      {
         global = LightCycle.ComputeLevelFor( this );
         personal = this.LightLevel;
      }

      public override void CheckLightLevels( bool forceResend )
      {
         NetState ns = this.NetState;

         if ( ns == null )
            return;

         int global, personal;

         ComputeLightLevels( out global, out personal );

         if ( !forceResend )
            forceResend = ( global != m_LastGlobalLight || personal != m_LastPersonalLight );

         if ( !forceResend )
            return;

         m_LastGlobalLight = global;
         m_LastPersonalLight = personal;

         ns.Send( new GlobalLightLevel( global ) );
         ns.Send( new PersonalLightLevel( this, personal ) );
      }

      public override int GetMinResistance( ResistanceType type )
      {
         int magicResist = (int)(Skills[SkillName.MagicResist].Value * 10);
         int min = int.MinValue;

         if ( magicResist >= 1000 )
            min = 40 + ((magicResist - 1000) / 50);
         else if ( magicResist >= 400 )
            min = (magicResist - 400) / 15;

         if ( min > MaxPlayerResistance )
            min = MaxPlayerResistance;

         int baseMin = base.GetMinResistance( type );

         if ( min < baseMin )
            min = baseMin;

         return min;
      }

      private static void OnLogin( LoginEventArgs e )
      {
         Mobile from = e.Mobile;

         SacrificeVirtue.CheckAtrophy( from );
         JusticeVirtue.CheckAtrophy( from );
         CompassionVirtue.CheckAtrophy( from );

         if ( AccountHandler.LockdownLevel > AccessLevel.Player )
         {
            string notice;

            Accounting.Account acct = from.Account as Accounting.Account;

            if ( acct == null || !acct.HasAccess( from.NetState ) )
            {
               if ( from.AccessLevel == AccessLevel.Player )
                  notice = "The server is currently under lockdown. No players are allowed to log in at this time.";
               else
                  notice = "The server is currently under lockdown. You do not have sufficient access level to connect.";

               Timer.DelayCall( TimeSpan.FromSeconds( 1.0 ), new TimerStateCallback( Disconnect ), from );
            }
            else if ( from.AccessLevel == AccessLevel.Administrator )
            {
               notice = "The server is currently under lockdown. As you are an administrator, you may change this from the [Admin gump.";
            }
            else
            {
               notice = "The server is currently under lockdown. You have sufficient access level to connect.";
            }

            from.SendGump( new NoticeGump( 1060637, 30720, notice, 0xFFC000, 300, 140, null, null ) );
         }
      }

      private bool m_NoDeltaRecursion;

      public void ValidateEquipment()
      {
         if ( m_NoDeltaRecursion || Map == null || Map == Map.Internal )
            return;

         if ( this.Items == null )
            return;

         m_NoDeltaRecursion = true;
         Timer.DelayCall( TimeSpan.Zero, new TimerCallback( ValidateEquipment_Sandbox ) );
      }

      private void ValidateEquipment_Sandbox()
      {
         try
         {
            if ( Map == null || Map == Map.Internal )
               return;

            ArrayList items = this.Items;

            if ( items == null )
               return;

            bool moved = false;

            int str = this.Str;
            int dex = this.Dex;
            int intel = this.Int;

            Mobile from = this;

            for ( int i = items.Count - 1; i >= 0; --i )
            {
               if ( i >= items.Count )
                  continue;

               Item item = (Item)items[i];

               if ( item is BaseWeapon )
               {
                  BaseWeapon weapon = (BaseWeapon)item;

                  bool drop = false;

                  if ( dex < weapon.DexRequirement )
                     drop = true;
                  else if ( str < AOS.Scale( weapon.StrRequirement, 100 - weapon.GetLowerStatReq() ) )
                     drop = true;
                  else if ( intel < weapon.IntRequirement )
                     drop = true;

                  if ( drop )
                  {
                     string name = weapon.Name;

                     if ( name == null )
                        name = String.Format( "#{0}", weapon.LabelNumber );

                     from.SendLocalizedMessage( 1062001, name ); // You can no longer wield your ~1_WEAPON~
                     from.AddToBackpack( weapon );
                     moved = true;
                  }
               }
               else if ( item is BaseArmor )
               {
                  BaseArmor armor = (BaseArmor)item;

                  bool drop = false;

                  if ( !armor.AllowMaleWearer && from.Body.IsMale && from.AccessLevel < AccessLevel.GameMaster )
                  {
                     drop = true;
                  }
                  else if ( !armor.AllowFemaleWearer && from.Body.IsFemale && from.AccessLevel < AccessLevel.GameMaster )
                  {
                     drop = true;
                  }
                  else
                  {
                     int strBonus = armor.ComputeStatBonus( StatType.Str ), strReq = armor.ComputeStatReq( StatType.Str );
                     int dexBonus = armor.ComputeStatBonus( StatType.Dex ), dexReq = armor.ComputeStatReq( StatType.Dex );
                     int intBonus = armor.ComputeStatBonus( StatType.Int ), intReq = armor.ComputeStatReq( StatType.Int );

                     if ( dex < dexReq || (dex + dexBonus) < 1 )
                        drop = true;
                     else if ( str < strReq || (str + strBonus) < 1 )
                        drop = true;
                     else if ( intel < intReq || (intel + intBonus) < 1 )
                        drop = true;
                  }

                  if ( drop )
                  {
                     string name = armor.Name;

                     if ( name == null )
                        name = String.Format( "#{0}", armor.LabelNumber );

                     if ( armor is BaseShield )
                        from.SendLocalizedMessage( 1062003, name ); // You can no longer equip your ~1_SHIELD~
                     else
                        from.SendLocalizedMessage( 1062002, name ); // You can no longer wear your ~1_ARMOR~

                     from.AddToBackpack( armor );
                     moved = true;
                  }
               }
            }

            if ( moved )
               from.SendLocalizedMessage( 500647 ); // Some equipment has been moved to your backpack.
         }
         catch ( Exception e )
         {
            Console.WriteLine( e );
         }
         finally
         {
            m_NoDeltaRecursion = false;
         }
      }

      public override void Delta( MobileDelta flag )
      {
         base.Delta( flag );

         if ( (flag & MobileDelta.Stat) != 0 )
            ValidateEquipment();

         if ( (flag & (MobileDelta.Name | MobileDelta.Hue)) != 0 )
            InvalidateMyRunUO();
      }

      private static void Disconnect( object state )
      {
         NetState ns = ((Mobile)state).NetState;

         if ( ns != null )
            ns.Dispose();
      }

      private static void OnLogout( LogoutEventArgs e )
      {
      }

      private static void EventSink_Connected( ConnectedEventArgs e )
      {
         PlayerMobile pm = e.Mobile as PlayerMobile;

         if ( pm != null )
            pm.m_SessionStart = DateTime.Now;
      }

      private static void EventSink_Disconnected( DisconnectedEventArgs e )
      {
         Mobile from = e.Mobile;
         DesignContext context = DesignContext.Find( from );

         if ( context != null )
         {
            /* Client disconnected
             *  - Remove design context
             *  - Eject client from house
             */

            // Remove design context
            DesignContext.Remove( from );

            // Eject client from house
            from.RevealingAction();
            from.Map = context.Foundation.Map;
            from.Location = context.Foundation.BanLocation;
         }

         PlayerMobile pm = e.Mobile as PlayerMobile;

         if ( pm != null )
            pm.m_GameTime += (DateTime.Now - pm.m_SessionStart);
      }

      public override void RevealingAction()
      {
         if ( m_DesignContext != null )
            return;

         Spells.Sixth.InvisibilitySpell.RemoveTimer( this );

         base.RevealingAction();
      }

      public override void OnSubItemAdded( Item item )
      {
         if ( AccessLevel < AccessLevel.GameMaster && item.IsChildOf( this.Backpack ) )
         {
            int maxWeight = WeightOverloading.GetMaxWeight( this );
            int curWeight = Mobile.BodyWeight + this.TotalWeight;

            if ( curWeight > maxWeight )
               this.SendLocalizedMessage( 1019035, true, String.Format( " : {0} / {1}", curWeight, maxWeight ) );
         }
      }

      public override bool CanBeHarmful( Mobile target, bool message, bool ignoreOurBlessedness )
      {
         if ( m_DesignContext != null || (target is PlayerMobile && ((PlayerMobile)target).m_DesignContext != null) )
            return false;

         if ( (target is BaseVendor && ((BaseVendor)target).IsInvulnerable) || target is PlayerVendor || target is TownCrier )
         {
            if ( message )
            {
               if ( target.Title == null )
                  SendMessage( "{0} the vendor cannot be harmed.", target.Name );
               else
                  SendMessage( "{0} {1} cannot be harmed.", target.Name, target.Title );
            }

            return false;
         }

         return base.CanBeHarmful( target, message, ignoreOurBlessedness );
      }

      public override bool CanBeBeneficial( Mobile target, bool message, bool allowDead )
      {
         if ( m_DesignContext != null || (target is PlayerMobile && ((PlayerMobile)target).m_DesignContext != null) )
            return false;

         return base.CanBeBeneficial( target, message, allowDead );
      }

      public override bool CheckContextMenuDisplay( IEntity target )
      {
         return ( m_DesignContext == null );
      }

      public override void OnItemAdded( Item item )
      {
         base.OnItemAdded( item );

         if ( item is BaseArmor || item is BaseWeapon )
         {
            Hits=Hits; Stam=Stam; Mana=Mana;
         }

         InvalidateMyRunUO();
      }

      public override void OnItemRemoved( Item item )
      {
         base.OnItemRemoved( item );

         if ( item is BaseArmor || item is BaseWeapon )
         {
            Hits=Hits; Stam=Stam; Mana=Mana;
         }

         InvalidateMyRunUO();
      }

      public override int HitsMax
      {
         get
         {
            int strBase;
            int strOffs = GetStatOffset( StatType.Str );

            if ( Core.AOS )
            {
               strBase = this.Str;
               strOffs += AosAttributes.GetValue( this, AosAttribute.BonusHits );
            }
            else
            {
               strBase = this.RawStr;
            }

            return (strBase / 2) + 50 + strOffs;
         }
      }

      public override int StamMax
      {
         get{ return base.StamMax + AosAttributes.GetValue( this, AosAttribute.BonusStam ); }
      }

      public override int ManaMax
      {
         get{ return base.ManaMax + AosAttributes.GetValue( this, AosAttribute.BonusMana ); }
      }

      public override bool Move( Direction d )
      {
         NetState ns = this.NetState;

         if ( ns != null )
         {
            Gump[] gumps = ns.Gumps;

            for ( int i = 0; i < gumps.Length; ++i )
            {
               if ( gumps[i] is ResurrectGump )
               {
                  if ( Alive )
                  {
                     CloseGump( typeof( ResurrectGump ) );
                  }
                  else
                  {
                     SendLocalizedMessage( 500111 ); // You are frozen and cannot move.
                     return false;
                  }
               }
            }
         }

         TimeSpan speed = ComputeMovementSpeed( d );

         if ( !base.Move( d ) )
            return false;

         m_NextMovementTime += speed;
         return true;
      }

      public override bool CheckMovement( Direction d, out int newZ )
      {
         DesignContext context = m_DesignContext;

         if ( context == null )
            return base.CheckMovement( d, out newZ );

         HouseFoundation foundation = context.Foundation;

         newZ = foundation.Z + HouseFoundation.GetLevelZ( context.Level );

         int newX = this.X, newY = this.Y;
         Movement.Movement.Offset( d, ref newX, ref newY );

         int startX = foundation.X + foundation.Components.Min.X + 1;
         int startY = foundation.Y + foundation.Components.Min.Y + 1;
         int endX = startX + foundation.Components.Width - 1;
         int endY = startY + foundation.Components.Height - 2;

         return ( newX >= startX && newY >= startY && newX < endX && newY < endY && Map == foundation.Map );
      }

      public override bool AllowItemUse( Item item )
      {
         return DesignContext.Check( this );
      }

      public override bool AllowSkillUse( SkillName skill )
      {
         return DesignContext.Check( this );
      }

      private bool m_LastProtectedMessage;
      private int m_NextProtectionCheck = 10;

      public override void SetLocation( Point3D loc, bool isTeleport )
      {
         base.SetLocation( loc, isTeleport );

         if ( isTeleport || --m_NextProtectionCheck == 0 )
         {
            m_NextProtectionCheck = 10;

            Regions.GuardedRegion reg = this.Region as Regions.GuardedRegion;
            bool isProtected = ( reg != null && !reg.IsDisabled() );

            if ( isProtected != m_LastProtectedMessage )
            {
               if ( isProtected )
                  SendLocalizedMessage( 500112 ); // You are now under the protection of the town guards.
               else
                  SendLocalizedMessage( 500113 ); // You have left the protection of the town guards.

               m_LastProtectedMessage = isProtected;
            }
         }
      }

      public override void GetContextMenuEntries( Mobile from, ArrayList list )
      {
         base.GetContextMenuEntries( from, list );

         if ( from == this )
         {
            if ( InsuranceEnabled )
            {
               list.Add( new CallbackEntry( 6201, new ContextCallback( ToggleItemInsurance ) ) );

               if ( AutoRenewInsurance )
                  list.Add( new CallbackEntry( 6202, new ContextCallback( CancelRenewInventoryInsurance ) ) );
               else
                  list.Add( new CallbackEntry( 6200, new ContextCallback( AutoRenewInventoryInsurance ) ) );
            }

            // TODO: Toggle champ titles

            BaseHouse house = BaseHouse.FindHouseAt( this );

            if ( house != null && house.IsAosRules )
               list.Add( new CallbackEntry( 6207, new ContextCallback( LeaveHouse ) ) );

            if ( m_JusticeProtectors.Count > 0 )
               list.Add( new CallbackEntry( 6157, new ContextCallback( CancelProtection ) ) );
         }
      }

      private void CancelProtection()
      {
         for ( int i = 0; i < m_JusticeProtectors.Count; ++i )
         {
            Mobile prot = (Mobile)m_JusticeProtectors[i];

            string args = String.Format( "{0}\t{1}", this.Name, prot.Name );

            prot.SendLocalizedMessage( 1049371, args ); // The protective relationship between ~1_PLAYER1~ and ~2_PLAYER2~ has been ended.
            this.SendLocalizedMessage( 1049371, args ); // The protective relationship between ~1_PLAYER1~ and ~2_PLAYER2~ has been ended.
         }

         m_JusticeProtectors.Clear();
      }

      private void ToggleItemInsurance()
      {
         BeginTarget( -1, false, TargetFlags.None, new TargetCallback( ToggleItemInsurance_Callback ) );
         SendLocalizedMessage( 1060868 ); // Target the item you wish to toggle insurance status on <ESC> to cancel
      }

      private bool CanInsure( Item item )
      {
         if ( item is Container )
            return false;

         if ( item is Spellbook || item is Runebook || item is PotionKeg )
            return false;

         if ( item.Stackable )
            return false;

         if ( item.LootType == LootType.Cursed )
            return false;

         if ( item.ItemID == 0x204E ) // death shroud
            return false;

         return true;
      }

      private void ToggleItemInsurance_Callback( Mobile from, object obj )
      {
         Item item = obj as Item;

         if ( item == null || !item.IsChildOf( this ) )
         {
            BeginTarget( -1, false, TargetFlags.None, new TargetCallback( ToggleItemInsurance_Callback ) );
            SendLocalizedMessage( 1060871, "", 0x23 ); // You can only insure items that you have equipped or that are in your backpack
         }
         else if ( item.Insured )
         {
            item.Insured = false;

            SendLocalizedMessage( 1060874, "", 0x35 ); // You cancel the insurance on the item

            BeginTarget( -1, false, TargetFlags.None, new TargetCallback( ToggleItemInsurance_Callback ) );
            SendLocalizedMessage( 1060868, "", 0x23 ); // Target the item you wish to toggle insurance status on <ESC> to cancel
         }
         else if ( !CanInsure( item ) )
         {
            BeginTarget( -1, false, TargetFlags.None, new TargetCallback( ToggleItemInsurance_Callback ) );
            SendLocalizedMessage( 1060869, "", 0x23 ); // You cannot insure that
         }
         else if ( item.LootType == LootType.Blessed || item.LootType == LootType.Newbied || item.BlessedFor == from )
         {
            BeginTarget( -1, false, TargetFlags.None, new TargetCallback( ToggleItemInsurance_Callback ) );
            SendLocalizedMessage( 1060870, "", 0x23 ); // That item is blessed and does not need to be insured
            SendLocalizedMessage( 1060869, "", 0x23 ); // You cannot insure that
         }
         else
         {
            if ( !item.PayedInsurance )
            {
               if ( Banker.Withdraw( from, 600 ) )
               {
                  SendLocalizedMessage( 1060398, "600" ); // ~1_AMOUNT~ gold has been withdrawn from your bank box.
                  item.PayedInsurance = true;
               }
               else
               {
                  SendLocalizedMessage( 1061079, "", 0x23 ); // You lack the funds to purchase the insurance
                  return;
               }
            }

            item.Insured = true;

            SendLocalizedMessage( 1060873, "", 0x23 ); // You have insured the item

            BeginTarget( -1, false, TargetFlags.None, new TargetCallback( ToggleItemInsurance_Callback ) );
            SendLocalizedMessage( 1060868, "", 0x23 ); // Target the item you wish to toggle insurance status on <ESC> to cancel
         }
      }

      private void AutoRenewInventoryInsurance()
      {
         SendLocalizedMessage( 1060881, "", 0x23 ); // You have selected to automatically reinsure all insured items upon death
         AutoRenewInsurance = true;
      }

      private void CancelRenewInventoryInsurance()
      {
         SendLocalizedMessage( 1061075, "", 0x23 ); // You have cancelled automatically reinsuring all insured items upon death
         AutoRenewInsurance = false;
      }

      // TODO: Champ titles, toggle

      private void LeaveHouse()
      {
         BaseHouse house = BaseHouse.FindHouseAt( this );

         if ( house != null )
            this.Location = house.BanLocation;
      }

      private delegate void ContextCallback();

      private class CallbackEntry : ContextMenuEntry
      {
         private ContextCallback m_Callback;

         public CallbackEntry( int number, ContextCallback callback ) : this( number, -1, callback )
         {
         }

         public CallbackEntry( int number, int range, ContextCallback callback ) : base( number, range )
         {
            m_Callback = callback;
         }

         public override void OnClick()
         {
            if ( m_Callback != null )
               m_Callback();
         }
      }

      public override void OnDoubleClick( Mobile from )
      {
         if ( this == from && !Warmode )
         {
            IMount mount = Mount;

            if ( mount != null && !DesignContext.Check( this ) )
               return;
         }

         base.OnDoubleClick( from );
      }

      public override void DisplayPaperdollTo( Mobile to )
      {
         if ( DesignContext.Check( this ) )
            base.DisplayPaperdollTo( to );
      }

      private static bool m_NoRecursion;

      protected override void OnLocationChange( Point3D oldLocation )
      {
         CheckLightLevels( false );

         DesignContext context = m_DesignContext;

         if ( context == null || m_NoRecursion )
            return;

         m_NoRecursion = true;

         HouseFoundation foundation = context.Foundation;

         int newX = this.X, newY = this.Y;
         int newZ = foundation.Z + HouseFoundation.GetLevelZ( context.Level );

         int startX = foundation.X + foundation.Components.Min.X + 1;
         int startY = foundation.Y + foundation.Components.Min.Y + 1;
         int endX = startX + foundation.Components.Width - 1;
         int endY = startY + foundation.Components.Height - 2;

         if ( newX >= startX && newY >= startY && newX < endX && newY < endY && Map == foundation.Map )
         {
            if ( Z != newZ )
               Location = new Point3D( X, Y, newZ );

            m_NoRecursion = false;
            return;
         }

         Location = new Point3D( foundation.X, foundation.Y, newZ );
         Map = foundation.Map;

         m_NoRecursion = false;
      }

      protected override void OnMapChange( Map oldMap )
      {
         DesignContext context = m_DesignContext;

         if ( context == null || m_NoRecursion )
            return;

         m_NoRecursion = true;

         HouseFoundation foundation = context.Foundation;

         if ( Map != foundation.Map )
            Map = foundation.Map;

         m_NoRecursion = false;
      }

      public override void OnDamage( int amount, Mobile from, bool willKill )
      {
         if ( amount > 0 )
         {
            BandageContext c = BandageContext.GetContext( this );

            if ( c != null )
               c.Slip();
         }

         WeightOverloading.FatigueOnDamage( this, amount );

         base.OnDamage( amount, from, willKill );
      }

      public static int ComputeSkillTotal( Mobile m )
      {
         int total = 0;

         for ( int i = 0; i < m.Skills.Length; ++i )
            total += m.Skills[i].BaseFixedPoint;

         return ( total / 10 );
      }

      public override void Resurrect()
      {
         bool wasAlive = this.Alive;

         base.Resurrect();

         if ( this.Alive && !wasAlive )
         {
            Item deathRobe = new DeathRobe();

            if ( !EquipItem( deathRobe ) )
               deathRobe.Delete();
         }
      }

      private Mobile m_InsuranceAward;
      private int m_InsuranceCost;
      private int m_InsuranceBonus;

      public override bool OnBeforeDeath()
      {
         m_InsuranceCost = 0;
         m_InsuranceAward = base.FindMostRecentDamager( false );

         if ( m_InsuranceAward != null && !m_InsuranceAward.Player )
            m_InsuranceAward = null;

         if ( m_InsuranceAward is PlayerMobile )
            ((PlayerMobile)m_InsuranceAward).m_InsuranceBonus = 0;

         return base.OnBeforeDeath();
      }

      private bool CheckInsuranceOnDeath( Item item )
      {
         if ( InsuranceEnabled && item.Insured )
         {
            if ( AutoRenewInsurance )
            {
               int cost = ( m_InsuranceAward == null ? 600 : 300 );

               if ( Banker.Withdraw( this, cost ) )
               {
                  m_InsuranceCost += cost;
                  item.PayedInsurance = true;
               }
               else
               {
                  SendLocalizedMessage( 1061079, "", 0x23 ); // You lack the funds to purchase the insurance
                  item.PayedInsurance = false;
                  item.Insured = false;
               }
            }
            else
            {
               item.PayedInsurance = false;
               item.Insured = false;
            }

            if ( m_InsuranceAward != null )
            {
               if ( Banker.Deposit( m_InsuranceAward, 300 ) )
               {
                  if ( m_InsuranceAward is PlayerMobile )
                     ((PlayerMobile)m_InsuranceAward).m_InsuranceBonus += 300;
               }
            }

            return true;
         }

         return false;
      }

      public override DeathMoveResult GetParentMoveResultFor( Item item )
      {
         if ( CheckInsuranceOnDeath( item ) )
            return DeathMoveResult.MoveToBackpack;

         return base.GetParentMoveResultFor( item );
      }

      public override DeathMoveResult GetInventoryMoveResultFor( Item item )
      {
         if ( CheckInsuranceOnDeath( item ) )
            return DeathMoveResult.MoveToBackpack;

         return base.GetInventoryMoveResultFor( item );
      }

      public override void OnDeath( Container c )
      {
         base.OnDeath( c );

         HueMod = -1;
         NameMod = null;
         SavagePaintExpiration = TimeSpan.Zero;

         SetHairMods( -1, -1 );

         PolymorphSpell.StopTimer( this );
         IncognitoSpell.StopTimer( this );
         DisguiseGump.StopTimer( this );

         EndAction( typeof( PolymorphSpell ) );
         EndAction( typeof( IncognitoSpell ) );

         MeerMage.StopEffect( this, false );

         if ( m_PermaFlags.Count > 0 )
         {
            m_PermaFlags.Clear();

            if ( c is Corpse )
               ((Corpse)c).Criminal = true;

            if ( SkillHandlers.Stealing.ClassicMode )
               Criminal = true;
         }

         if ( this.Kills >= 5 && DateTime.Now >= m_NextJustAward )
         {
            Mobile m = FindMostRecentDamager( false );

            if ( m != null && m.Player )
            {
               bool gainedPath = false;

               int theirTotal = ComputeSkillTotal( m );
               int ourTotal = ComputeSkillTotal( this );

               int pointsToGain = 1 + ((theirTotal - ourTotal) / 50);

               if ( pointsToGain < 1 )
                  pointsToGain = 1;
               else if ( pointsToGain > 4 )
                  pointsToGain = 4;

               if ( VirtueHelper.Award( m, VirtueName.Justice, pointsToGain, ref gainedPath ) )
               {
                  if ( gainedPath )
                     m.SendLocalizedMessage( 1049367 ); // You have gained a path in Justice!
                  else
                     m.SendLocalizedMessage( 1049363 ); // You have gained in Justice.

                  m.FixedParticles( 0x375A, 9, 20, 5027, EffectLayer.Waist );
                  m.PlaySound( 0x1F7 );

                  m_NextJustAward = DateTime.Now + TimeSpan.FromMinutes( pointsToGain * 2 );
               }
            }
         }

         if ( m_InsuranceCost > 0 )
            SendLocalizedMessage( 1060398, m_InsuranceCost.ToString() ); // ~1_AMOUNT~ gold has been withdrawn from your bank box.

         if ( m_InsuranceAward is PlayerMobile )
         {
            PlayerMobile pm = (PlayerMobile)m_InsuranceAward;

            if ( pm.m_InsuranceBonus > 0 )
               pm.SendLocalizedMessage( 1060397, pm.m_InsuranceBonus.ToString() ); // ~1_AMOUNT~ gold has been deposited into your bank box.
         }
      }

      private ArrayList m_PermaFlags;
      private ArrayList m_VisList;
      private Hashtable m_AntiMacroTable;
      private TimeSpan m_GameTime;
      private TimeSpan m_ShortTermElapse;
      private TimeSpan m_LongTermElapse;
      private DateTime m_SessionStart;
      private DateTime m_LastEscortTime;
      private DateTime m_NextSmithBulkOrder;
      private DateTime m_NextTailorBulkOrder;
      private DateTime m_SavagePaintExpiration;
      private SkillName m_Learning = (SkillName)(-1);

      public SkillName Learning
      {
         get{ return m_Learning; }
         set{ m_Learning = value; }
      }

      [CommandProperty( AccessLevel.GameMaster )]
      public TimeSpan SavagePaintExpiration
      {
         get
         {
            TimeSpan ts = m_SavagePaintExpiration - DateTime.Now;

            if ( ts < TimeSpan.Zero )
               ts = TimeSpan.Zero;

            return ts;
         }
         set
         {
            m_SavagePaintExpiration = DateTime.Now + value;
         }
      }

      [CommandProperty( AccessLevel.GameMaster )]
      public TimeSpan NextSmithBulkOrder
      {
         get
         {
            TimeSpan ts = m_NextSmithBulkOrder - DateTime.Now;

            if ( ts < TimeSpan.Zero )
               ts = TimeSpan.Zero;

            return ts;
         }
         set
         {
            try{ m_NextSmithBulkOrder = DateTime.Now + value; }
            catch{}
         }
      }

      [CommandProperty( AccessLevel.GameMaster )]
      public TimeSpan NextTailorBulkOrder
      {
         get
         {
            TimeSpan ts = m_NextTailorBulkOrder - DateTime.Now;

            if ( ts < TimeSpan.Zero )
               ts = TimeSpan.Zero;

            return ts;
         }
         set
         {
            try{ m_NextTailorBulkOrder = DateTime.Now + value; }
            catch{}
         }
      }

      public DateTime LastEscortTime
      {
         get{ return m_LastEscortTime; }
         set{ m_LastEscortTime = value; }
      }

      public PlayerMobile()
      {
         m_VisList = new ArrayList();
         m_PermaFlags = new ArrayList();
         m_AntiMacroTable = new Hashtable();

         m_BOBFilter = new Engines.BulkOrders.BOBFilter();

         m_GameTime = TimeSpan.Zero;
         m_ShortTermElapse = TimeSpan.FromHours( 8.0 );
         m_LongTermElapse = TimeSpan.FromHours( 40.0 );

         m_JusticeProtectors = new ArrayList();

         InvalidateMyRunUO();
      }

      public override bool MutateSpeech( ArrayList hears, ref string text, ref object context )
      {
         if ( Alive )
            return false;

         if ( Core.AOS )
         {
            for ( int i = 0; i < hears.Count; ++i )
            {
               object o = hears[i];

               if ( o != this && o is Mobile && ((Mobile)o).Skills[SkillName.SpiritSpeak].Value >= 100.0 )
                  return false;
            }
         }

         return base.MutateSpeech( hears, ref text, ref context );
      }

      public override void Damage( int amount, Mobile from )
      {
         if ( Spells.Necromancy.EvilOmenSpell.CheckEffect( this ) )
            amount = (int)(amount * 1.25);

         Mobile oath = Spells.Necromancy.BloodOathSpell.GetBloodOath( from );

         if ( oath == this )
         {
            amount = (int)(amount * 1.1);
            from.Damage( amount, from );
         }

         base.Damage( amount, from );
      }

      public override ApplyPoisonResult ApplyPoison( Mobile from, Poison poison )
      {
         if ( !Alive )
            return ApplyPoisonResult.Immune;

         if ( Spells.Necromancy.EvilOmenSpell.CheckEffect( this ) )
            return base.ApplyPoison( from, PoisonImpl.IncreaseLevel( poison ) );

         return base.ApplyPoison( from, poison );
      }

      public PlayerMobile( Serial s ) : base( s )
      {
         m_VisList = new ArrayList();
         m_AntiMacroTable = new Hashtable();
         InvalidateMyRunUO();
      }

      public ArrayList VisibilityList
      {
         get{ return m_VisList; }
      }

      public ArrayList PermaFlags
      {
         get{ return m_PermaFlags; }
      }

      public override int Luck{ get{ return AosAttributes.GetValue( this, AosAttribute.Luck ); } }

      public override bool IsHarmfulCriminal( Mobile target )
      {
         if ( SkillHandlers.Stealing.ClassicMode && target is PlayerMobile && ((PlayerMobile)target).m_PermaFlags.Count > 0 )
         {
            int noto = Notoriety.Compute( this, target );

            if ( noto == Notoriety.Innocent )
               target.Delta( MobileDelta.Noto );

            return false;
         }

         if ( target is BaseCreature && ((BaseCreature)target).InitialInnocent )
            return false;

         return base.IsHarmfulCriminal( target );
      }

      public bool AntiMacroCheck( Skill skill, object obj )
      {
         if ( obj == null || m_AntiMacroTable == null || this.AccessLevel != AccessLevel.Player )
            return true;

         Hashtable tbl = (Hashtable)m_AntiMacroTable[skill];
         if ( tbl == null )
            m_AntiMacroTable[skill] = tbl = new Hashtable();

         CountAndTimeStamp count = (CountAndTimeStamp)tbl[obj];
         if ( count != null )
         {
            if ( count.TimeStamp + SkillCheck.AntiMacroExpire <= DateTime.Now )
            {
               count.Count = 1;
               return true;
            }
            else
            {
               ++count.Count;
               if ( count.Count <= SkillCheck.Allowance )
                  return true;
               else
                  return false;
            }
         }
         else
         {
            tbl[obj] = count = new CountAndTimeStamp();
            count.Count = 1;
            
            return true;
         }
      }

      private void RevertHair()
      {
         SetHairMods( -1, -1 );
      }

      private Engines.BulkOrders.BOBFilter m_BOBFilter;

      public Engines.BulkOrders.BOBFilter BOBFilter
      {
         get{ return m_BOBFilter; }
      }
      
      public override void Deserialize( GenericReader reader )
      {
         base.Deserialize( reader );
         int version = reader.ReadInt();

         switch ( version )
         {
            case 14:
            {
               m_CompassionGains = reader.ReadEncodedInt();

               if ( m_CompassionGains > 0 )
                  m_NextCompassionDay = reader.ReadDeltaTime();

               goto case 13;
            }
            case 13: // just removed m_PayedInsurance list
            case 12:
            {
               m_BOBFilter = new Engines.BulkOrders.BOBFilter( reader );
               goto case 11;
            }
            case 11:
            {
               if ( version < 13 )
               {
                  ArrayList payed = reader.ReadItemList();

                  for ( int i = 0; i < payed.Count; ++i )
                     ((Item)payed[i]).PayedInsurance = true;
               }

               goto case 10;
            }
            case 10:
            {
               if ( reader.ReadBool() )
               {
                  m_HairModID = reader.ReadInt();
                  m_HairModHue = reader.ReadInt();
                  m_BeardModID = reader.ReadInt();
                  m_BeardModHue = reader.ReadInt();

                  // We cannot call SetHairMods( -1, -1 ) here because the items have not yet loaded
                  Timer.DelayCall( TimeSpan.Zero, new TimerCallback( RevertHair ) );
               }

               goto case 9;
            }
            case 9:
            {
               SavagePaintExpiration = reader.ReadTimeSpan();

               if ( SavagePaintExpiration > TimeSpan.Zero )
               {
                  BodyMod = ( Female ? 184 : 183 );
                  HueMod = 0;
               }

               goto case 8;
            }
            case 8:
            {
               m_NpcGuild = (NpcGuild)reader.ReadInt();
               m_NpcGuildJoinTime = reader.ReadDateTime();
               m_NpcGuildGameTime = reader.ReadTimeSpan();
               goto case 7;
            }
            case 7:
            {
               m_PermaFlags = reader.ReadMobileList();
               goto case 6;
            }
            case 6:
            {
               NextTailorBulkOrder = reader.ReadTimeSpan();
               goto case 5;
            }
            case 5:
            {
               NextSmithBulkOrder = reader.ReadTimeSpan();
               goto case 4;
            }
            case 4:
            {
               m_LastJusticeLoss = reader.ReadDeltaTime();
               m_JusticeProtectors = reader.ReadMobileList();
               goto case 3;
            }
            case 3:
            {
               m_LastSacrificeGain = reader.ReadDeltaTime();
               m_LastSacrificeLoss = reader.ReadDeltaTime();
               m_AvailableResurrects = reader.ReadInt();
               goto case 2;
            }
            case 2:
            {
               m_Flags = (PlayerFlag)reader.ReadInt();
               goto case 1;
            }
            case 1:
            {
               m_LongTermElapse = reader.ReadTimeSpan();
               m_ShortTermElapse = reader.ReadTimeSpan();
               m_GameTime = reader.ReadTimeSpan();
               goto case 0;
            }
            case 0:
            {
               break;
            }
         }

         if ( m_PermaFlags == null )
            m_PermaFlags = new ArrayList();

         if ( m_JusticeProtectors == null )
            m_JusticeProtectors = new ArrayList();

         if ( m_BOBFilter == null )
            m_BOBFilter = new Engines.BulkOrders.BOBFilter();

         ArrayList list = this.Stabled;

         for ( int i = 0; i < list.Count; ++i )
         {
            BaseCreature bc = list[i] as BaseCreature;

            if ( bc != null )
               bc.IsStabled = true;
         }
      }
      
      public override void Serialize( GenericWriter writer )
      {
         //cleanup our anti-macro table
         foreach ( Hashtable t in m_AntiMacroTable.Values )
         {
            ArrayList remove = new ArrayList();
            foreach ( CountAndTimeStamp time in t.Values )
            {
               if ( time.TimeStamp + SkillCheck.AntiMacroExpire <= DateTime.Now )
                  remove.Add( time );
            }

            for (int i=0;i<remove.Count;++i)
               t.Remove( remove[i] );
         }

         //decay our kills
         if ( m_ShortTermElapse < this.GameTime )
         {
            m_ShortTermElapse += TimeSpan.FromHours( 8 );
            if ( ShortTermMurders > 0 )
               --ShortTermMurders;
         }

         if ( m_LongTermElapse < this.GameTime )
         {
            m_LongTermElapse += TimeSpan.FromHours( 40 );
            if ( Kills > 0 )
               --Kills;
         }

         base.Serialize( writer );
         
         writer.Write( (int) 14 ); // version

         writer.WriteEncodedInt( m_CompassionGains );

         if ( m_CompassionGains > 0 )
            writer.WriteDeltaTime( m_NextCompassionDay );

         m_BOBFilter.Serialize( writer );

         bool useMods = ( m_HairModID != -1 || m_BeardModID != -1 );

         writer.Write( useMods );

         if ( useMods )
         {
            writer.Write( (int) m_HairModID );
            writer.Write( (int) m_HairModHue );
            writer.Write( (int) m_BeardModID );
            writer.Write( (int) m_BeardModHue );
         }

         writer.Write( SavagePaintExpiration );

         writer.Write( (int) m_NpcGuild );
         writer.Write( (DateTime) m_NpcGuildJoinTime );
         writer.Write( (TimeSpan) m_NpcGuildGameTime );

         writer.WriteMobileList( m_PermaFlags, true );

         writer.Write( NextTailorBulkOrder );

         writer.Write( NextSmithBulkOrder );

         writer.WriteDeltaTime( m_LastJusticeLoss );
         writer.WriteMobileList( m_JusticeProtectors, true );

         writer.WriteDeltaTime( m_LastSacrificeGain );
         writer.WriteDeltaTime( m_LastSacrificeLoss );
         writer.Write( m_AvailableResurrects );

         writer.Write( (int) m_Flags );

         writer.Write( m_LongTermElapse );
         writer.Write( m_ShortTermElapse );
         writer.Write( this.GameTime );
      }

      public void ResetKillTime()
      {
         m_ShortTermElapse = this.GameTime + TimeSpan.FromHours( 8 );
         m_LongTermElapse = this.GameTime + TimeSpan.FromHours( 40 );
      }

      [CommandProperty( AccessLevel.GameMaster )]
      public TimeSpan GameTime
      {
         get
         {
            if ( NetState != null )
               return m_GameTime + (DateTime.Now - m_SessionStart);
            else
               return m_GameTime;
         }
      }

      public override bool CanSee( Mobile m )
      {
         if ( m is PlayerMobile && ((PlayerMobile)m).m_VisList.Contains( this ) )
            return true;

         return base.CanSee( m );
      }

      public override bool CanSee( Item item )
      {
         if ( m_DesignContext != null && m_DesignContext.Foundation.IsHiddenToCustomizer( item ) )
            return false;

         return base.CanSee( item );
      }

      #region MyRunUO Invalidation
      private bool m_ChangedMyRunUO;

      public bool ChangedMyRunUO
      {
         get{ return m_ChangedMyRunUO; }
         set{ m_ChangedMyRunUO = value; }
      }

      public void InvalidateMyRunUO()
      {
         if ( !Deleted && !m_ChangedMyRunUO )
         {
            m_ChangedMyRunUO = true;
            Engines.MyRunUO.MyRunUO.QueueMobileUpdate( this );
         }
      }

      public override void OnKillsChange( int oldValue )
      {
         InvalidateMyRunUO();
      }

      public override void OnGenderChanged( bool oldFemale )
      {
         InvalidateMyRunUO();
      }

      public override void OnGuildChange( Server.Guilds.Guild oldGuild )
      {
         InvalidateMyRunUO();
      }

      public override void OnGuildTitleChange( string oldTitle )
      {
         InvalidateMyRunUO();
      }

      public override void OnKarmaChange( int oldValue )
      {
         InvalidateMyRunUO();
      }

      public override void OnFameChange( int oldValue )
      {
         InvalidateMyRunUO();
      }

      public override void OnSkillChange( SkillName skill, double oldBase )
      {
         InvalidateMyRunUO();
      }

      public override void OnAccessLevelChanged( AccessLevel oldLevel )
      {
         InvalidateMyRunUO();
      }

      public override void OnRawStatChange( StatType stat, int oldValue )
      {
         InvalidateMyRunUO();
      }

      public override void OnDelete()
      {
         InvalidateMyRunUO();
      }
      #endregion

      #region Fastwalk Prevention
      private static bool FastwalkPrevention = true; // Is fastwalk prevention enabled?
      private static TimeSpan FastwalkThreshold = TimeSpan.FromSeconds( 0.4 ); // Fastwalk prevention will become active after 0.4 seconds

      private DateTime m_NextMovementTime;

      public virtual bool UsesFastwalkPrevention{ get{ return ( AccessLevel < AccessLevel.GameMaster ); } }

      public virtual TimeSpan ComputeMovementSpeed( Direction dir )
      {
         if ( (dir & Direction.Mask) != (this.Direction & Direction.Mask) )
            return TimeSpan.Zero;

         bool running = ( (dir & Direction.Running) != 0 );

         bool onHorse = ( this.Mount != null );

         if ( onHorse )
            return ( running ? TimeSpan.FromSeconds( 0.1 ) : TimeSpan.FromSeconds( 0.2 ) );

         return ( running ? TimeSpan.FromSeconds( 0.2 ) : TimeSpan.FromSeconds( 0.4 ) );
      }

      public static bool MovementThrottle_Callback( NetState ns )
      {
         PlayerMobile pm = ns.Mobile as PlayerMobile;

         if ( pm == null || !pm.UsesFastwalkPrevention )
            return true;

         if ( pm.m_NextMovementTime == DateTime.MinValue )
         {
            // has not yet moved
            pm.m_NextMovementTime = DateTime.Now;
            return true;
         }

         TimeSpan ts = pm.m_NextMovementTime - DateTime.Now;

         if ( ts < TimeSpan.Zero )
         {
            // been a while since we've last moved
            pm.m_NextMovementTime = DateTime.Now;
            return true;
         }

         return ( ts < FastwalkThreshold );
      }
      #endregion

      #region Enemy of One
      private Type m_EnemyOfOneType;
      private bool m_WaitingForEnemy;

      public Type EnemyOfOneType
      {
         get{ return m_EnemyOfOneType; }
         set
         {
            Type oldType = m_EnemyOfOneType;
            Type newType = value;

            if ( oldType == newType )
               return;

            m_EnemyOfOneType = value;

            DeltaEnemies( oldType, newType );
         }
      }

      public bool WaitingForEnemy
      {
         get{ return m_WaitingForEnemy; }
         set{ m_WaitingForEnemy = value; }
      }

      private void DeltaEnemies( Type oldType, Type newType )
      {
         foreach ( Mobile m in this.GetMobilesInRange( 18 ) )
         {
            Type t = m.GetType();

            if ( t == oldType || t == newType )
               Send( new MobileMoving( m, Notoriety.Compute( this, m ) ) );
         }
      }
      #endregion

      #region Hair and beard mods
      private int m_HairModID = -1, m_HairModHue;
      private int m_BeardModID = -1, m_BeardModHue;

      public void SetHairMods( int hairID, int beardID )
      {
         if ( hairID == -1 )
            InternalRestoreHair( true, ref m_HairModID, ref m_HairModHue );
         else if ( hairID != -2 )
            InternalChangeHair( true, hairID, ref m_HairModID, ref m_HairModHue );

         if ( beardID == -1 )
            InternalRestoreHair( false, ref m_BeardModID, ref m_BeardModHue );
         else if ( beardID != -2 )
            InternalChangeHair( false, beardID, ref m_BeardModID, ref m_BeardModHue );
      }

      private Item CreateHair( bool hair, int id, int hue )
      {
         switch ( id )
         {
            case 0x203B: return new ShortHair( hue );
            case 0x203C: return new LongHair( hue );
            case 0x203D: return new PonyTail( hue );
            case 0x203E: return new LongBeard( hue );
            case 0x203F: return new ShortBeard( hue );
            case 0x2040: return new Goatee( hue );
            case 0x2041: return new Mustache( hue );
            case 0x2044: return new Mohawk( hue );
            case 0x2045: return new PageboyHair( hue );
            case 0x2046: return new BunsHair( hue );
            case 0x2047: return new Afro( hue );
            case 0x2048: return new ReceedingHair( hue );
            case 0x2049: return new TwoPigTails( hue );
            case 0x204A: return new KrisnaHair( hue );
            case 0x204B: return new MediumShortBeard( hue );
            case 0x204C: return new MediumLongBeard( hue );
            case 0x204D: return new Vandyke( hue );
            default:
            {
               Console.WriteLine( "Warning: Unknown hair ID specified: {0}", id );

               if ( hair )
                  return new GenericHair( id );
               else
                  return new GenericBeard( id );
            }
         }
      }

      private void InternalRestoreHair( bool hair, ref int id, ref int hue )
      {
         if ( id == -1 )
            return;

         Item item = FindItemOnLayer( hair ? Layer.Hair : Layer.FacialHair );

         if ( item != null )
            item.Delete();

         if ( id != 0 )
            AddItem( CreateHair( hair, id, hue ) );

         id = -1;
         hue = 0;
      }

      private void InternalChangeHair( bool hair, int id, ref int storeID, ref int storeHue )
      {
         Item item = FindItemOnLayer( hair ? Layer.Hair : Layer.FacialHair );

         if ( item != null )
         {
            if ( storeID == -1 )
            {
               storeID = item.ItemID;
               storeHue = item.Hue;
            }

            item.Delete();
         }
         else if ( storeID == -1 )
         {
            storeID = 0;
            storeHue = 0;
         }

         if ( id == 0 )
            return;

         AddItem( CreateHair( hair, id, 0 ) );
      }
      #endregion

      #region Virtue stuff
      private DateTime m_LastSacrificeGain;
      private DateTime m_LastSacrificeLoss;
      private int m_AvailableResurrects;

      public DateTime LastSacrificeGain{ get{ return m_LastSacrificeGain; } set{ m_LastSacrificeGain = value; } }
      public DateTime LastSacrificeLoss{ get{ return m_LastSacrificeLoss; } set{ m_LastSacrificeLoss = value; } }
      public int AvailableResurrects{ get{ return m_AvailableResurrects; } set{ m_AvailableResurrects = value; } }

      private DateTime m_NextJustAward;
      private DateTime m_LastJusticeLoss;
      private ArrayList m_JusticeProtectors;

      public DateTime LastJusticeLoss{ get{ return m_LastJusticeLoss; } set{ m_LastJusticeLoss = value; } }
      public ArrayList JusticeProtectors{ get{ return m_JusticeProtectors; } set{ m_JusticeProtectors = value; } }

      private DateTime m_LastCompassionLoss;
      private DateTime m_NextCompassionDay;
      private int m_CompassionGains;

      public DateTime LastCompassionLoss{ get{ return m_LastCompassionLoss; } set{ m_LastCompassionLoss = value; } }
      public DateTime NextCompassionDay{ get{ return m_NextCompassionDay; } set{ m_NextCompassionDay = value; } }
      public int CompassionGains{ get{ return m_CompassionGains; } set{ m_CompassionGains = value; } }
      #endregion
   }
}


¤¸¤Ã À§¿¡°ÍÀÌ Á¦ ÄÚµå.
Ç÷¹À̾î¸ð¹ÙÀÏ ½ºÅ©¸³ÀÔ´Ï´Ù.
¡è ¸Ç À§·Î °¡±â ¡è
ȸ¿ø ÇÁ·ÎÇÊ º¸±â ÂÊÁö º¸³»±â
roar
ÀÛ¼º±ÛÁ¦¸ñ : ¾î¶ó =¤µ=   ±Û ÀÛ¼º½Ã°£ : 2004-10-31 ÀÏ 11:32 am ±ÛÀ» ÀοëÇÏ¿© ÀÛ¼ºÇÕ´Ï´Ù.

Eighth Cicle [4]
Eighth Cicle [4]

°¡ÀÔÀÏ: 2004³â 01¿ù 20ÀÏ
°Ô½Ã¹°: 228
ÁÖ ¼Ò: Áö±¸ ¾îµò°¡..

Á¤¸» ¾ø³×¿ä. À¯¹Î¼ö´ÔÀÌ °¡Áö°í °è½Å°Å¿¡´Â¿ä.

Àú°Å ¾îµð¼­ ±¸Çϼ̾î¿ä? ÀÌÀü ¹öÁ¯Àΰ¡....

¾ÆÀÌÅÛÀ» ¹Ù´Ú¿¡ ³õ¾ÒÀ»¶§ ¹æÇâÀÌ ¾È¹Ù²îÁÒ?

¾Æ¸¶ ±¸¹öÁ¯ÀÌ¶ó ±¸ÇöÀ» ¾ÈÇß³ªº¸±º¿ä.

1.0À» ÀüºÎ »ç¿ëÇÏ°í °è½Ç°Å¶ó´Â ÆÇ´ÜÀ» Çß¾ú¾î¿ä.

±×¸®°í È­³­°Å ¾Æ´Ï¿¡¿ä.; Áö±Ý ³Ê¹« ÇǰïÇØ¼­ ±ÛÀÌ Á» ±×·¸°Ô º¸¿´³ª º¸³×¿ä

Àú³á¶§Âë¿¡ °íÃĵ帮²²¿ä. ±×·³ ½¬·¯ ¾± -¤µ-;

_________________
!!!! FareWell !!!!
¡è ¸Ç À§·Î °¡±â ¡è
ȸ¿ø ÇÁ·ÎÇÊ º¸±â ÂÊÁö º¸³»±â E-Mail º¸³»±â
weeea
ÀÛ¼º±ÛÁ¦¸ñ : ÀÌ·Ð. ^^;   ±Û ÀÛ¼º½Ã°£ : 2004-10-31 ÀÏ 11:49 am ±ÛÀ» ÀοëÇÏ¿© ÀÛ¼ºÇÕ´Ï´Ù.

First Cicle [8]
First Cicle [8]

°¡ÀÔÀÏ: 2004³â 10¿ù 30ÀÏ
°Ô½Ã¹°: 16
ÁÖ ¼Ò: /

Àú À¯¹Î¼ö´Ô ¾Æ´Ï¿¹¿ä. ^^;
±×¹®ÀÇ ±Û¹Ø¿¡ ´äº¯À» º¸°í µµ¿òÀ» ¹Þ´Âµ¥,
¾Æ´Ï¶ó¼­ ¹ØÀ¸·Î °è¼Ó ±ÛÀ» ¾´°ÍÀè. ^^;;
¾Æ.. Á¦ ·±À¯¿À°¡ ±¸¹öÀüÀΰ¡¿ä??
Áö±Ý ÀÌ ½ÎÀÌÆ®¿¡¼­ ¹ÞÀº°Çµ¥. ^^;;;
À̰÷¿¡¼­ ·±À¯¿À¿Í ·±À¯¿À36Àΰ¡.. ±× ¿ùµå¹öÁ¯..
µÎ°³ ¹Þ¾Ò°Åµç¿ä. ±Ùµ¥ µÎÂÊ´Ù ±× method ´Â ¾ø°í..
º°·Î ´Ù¸¥°Ô ¾ø¾î¼­ ±×·¸±¸³ª.. Çߴµ¥. ^^;;
½Å¹öÁ¯À̶ó¸é.. Beta 36 À̰ÅÀΰ¡¿ä??
±×·³ À̰ÍÀ̶û ±×³É ·±À¯¿À 1.0À̶ûÀº ´Ù¸¥°Ô ÀÖ³ª¿ä?? Èì..
À̰͵µ ¾Æ´Ô.. ½Å¹öÁ¯Àº ¹¹Áö.. -_-;; (È¥ÀÚ ±Ã½Ã··±Ã½Ã··.. ) ^^;
À̰÷¿¡¼­ ¹ÞÀº 3¹öÁ¯´Ù ¾ø´õ±º¿ä. ^^;;
±×·³.. ½Å¹öÁ¯Àº.. ¹¹Áö!?!?
·Î¾î´Ô ´äº¯ Ç×»ó °¨»çÇÕ´Ï´Ù. ^^
¡è ¸Ç À§·Î °¡±â ¡è
ȸ¿ø ÇÁ·ÎÇÊ º¸±â ÂÊÁö º¸³»±â
yuminsu
ÀÛ¼º±ÛÁ¦¸ñ : ´ñ±Û   ±Û ÀÛ¼º½Ã°£ : 2004-10-31 ÀÏ 2:23 pm ±ÛÀ» ÀοëÇÏ¿© ÀÛ¼ºÇÕ´Ï´Ù.

First Cicle [6]
First Cicle [6]

°¡ÀÔÀÏ: 2004³â 10¿ù 22ÀÏ
°Ô½Ã¹°: 13
ÁÖ ¼Ò: ¼­¿ï ¾çõ±¸ ½Å¿ù3µ¿/40¡­49¹øÁö

¸ð¸£´ÂºÎºÐ ÀÚÁÖ ³»°¡ Áú¹®Çß¼­ Ãʺ¸ºÐµé¿¡°Ô µµ¿ò µå¸±°Å °°Àºµ¥

²¿¿Á Á¦°¡ ÂïÈù°Å °°Àº ´À³¦ÀÌ..

±×¸®°í 36¹öÀüÀ̶õ

1.0¹öÀüÀ̶õ Ʋ¸³´Ï´Ù..

1.0¹öÀüÀº À§ ÇØ³õÀº¹æ½Ä°ú Ʋ¸®°Åµæ¿ä....

36¹öÀü¿¡¼­ Àú »çÇ×´ë·Î ¼Ò½º°¡ ¾øÀ»²®´Ï´Ù..

±×·³.. 1.0¿¡¼­ ´ëÇØ¼­ ¼³¸íÇѰŴϱî 3.6 µû·Î ÇØ¾ßÁÒ ^^;;
¡è ¸Ç À§·Î °¡±â ¡è
ȸ¿ø ÇÁ·ÎÇÊ º¸±â ÂÊÁö º¸³»±â
roar
ÀÛ¼º±ÛÁ¦¸ñ : ´ñ±Û..   ±Û ÀÛ¼º½Ã°£ : 2004-10-31 ÀÏ 7:39 pm ±ÛÀ» ÀοëÇÏ¿© ÀÛ¼ºÇÕ´Ï´Ù.

Eighth Cicle [4]
Eighth Cicle [4]

°¡ÀÔÀÏ: 2004³â 01¿ù 20ÀÏ
°Ô½Ã¹°: 228
ÁÖ ¼Ò: Áö±¸ ¾îµò°¡..

ÀÚ ¾à¼ÓÇÑ Àú³á½Ã°£ÀÌ ¿Ô½À´Ï´Ù.. =¤µ=

ÀÏ´Ü Á¦°¡ ´ÔµéÀÌ °¡Áø ·±À¯¿À¿¡ ¸ð¹ÙÀÏÀÌ ±× ¸Þ¼Òµå¸¦ °¡Áö°í ÀÖ´ÂÁö ¾ø´ÂÁö

¸¦ ¸ð¸£±â ¶§¹®¿¡ ¼²ºÒ¸® Á¦²¬ ºÙ¿© ³Ö±â ÇÒ¼ö°¡ ¾ø³×¿ä.

ÇÏÁö¸¸ ´ç¿¬È÷ ÀÖÀ»²¨¶ó°í ¾ïÁö·Î ¹ÏÀ¸¸é¼­..(¾øÀ¸¸é ¾ÆÀÌÅÛÀ» ¹Ù´Ú¿¡ ¹ö¸®´Â

ÇàÀ§¿¡ ´ëÇÑ Ã³¸®°¡ ºÒ°¡´ÉÇØ¼­ ¾ø´Ù°í »ý°¢Çϱâ Èûµé¾î¿ä)

´ÙÀ½°ú °°ÀÌ °£·«¹öÁ¯À».... ¿ä°Ç Àû´çÇÑ À§Ä¡¿¡ ºÙÀ̼¼¿ä.

´ç¿¬È÷ ¾Æ½Ã°ÚÁö¸¸ ¿ä°Í¸¸ ÇØ¼­´Â ¾ÈµÇ°í À§¿¡ ÀûÈù°Å¿¡¼­ ¿ä°Å¿¡ ÇØ´çÇÏ´Â

ºÎºÐ¸¸ÀÌ¿¡¿ä.
ÄÚµå : 

      public override bool OnDroppedItemToWorld( Item item, Point3D location )
      {
         if ( !base.OnDroppedItemToWorld( item, location ) )
            return false;

         //Custom
         //if( item.Decays == true )
         //{
            StartDecay t = new StartDecay( item );
            t.Start();
            m_DecayTable[ item ] = t;
         //}
         //End of Custom

         return true;
      }

_________________
!!!! FareWell !!!!
¡è ¸Ç À§·Î °¡±â ¡è
ȸ¿ø ÇÁ·ÎÇÊ º¸±â ÂÊÁö º¸³»±â E-Mail º¸³»±â
yjwoo14
ÀÛ¼º±ÛÁ¦¸ñ : µ¡ºÙÀ̱â...   ±Û ÀÛ¼º½Ã°£ : 2004-11-16 È­ 4:24 pm ±ÛÀ» ÀοëÇÏ¿© ÀÛ¼ºÇÕ´Ï´Ù.

Third Cicle [4]
Third Cicle [4]

°¡ÀÔÀÏ: 2004³â 11¿ù 01ÀÏ
°Ô½Ã¹°: 44
ÁÖ ¼Ò: /

·Î¾î´Ô²²¼­ ¸»¾¸ÇϽŵ¥·Î Âß Çß´õ´Ï

Áý¿¡¼­µµ ¾ÆÀÌÅÛÀÌ »ç¶óÁö´Â Çö»óÀ» º¸¿´½À´Ï´Ù.

±×·¡¼­ Àú´Â ÀÌ·¸°Ô ÇØ°áÇß½À´Ï´Ù.

ÄÚµå : 

        HouseRegion reg = this.Region as HouseRegion;
        if ( base.OnDroppedItemToWorld( item, location ) && reg == null )
        {
         //Custom  ±×·¯´Ï±î ¿ä±â¼­
         //if( item.Decays == true )
         //{
            StartDecay t = new StartDecay( item );
            t.Start();
            m_DecayTable[ item ] = t;
         //}
         //End of Custom ¿©±â±îÁö¿ä.
         //this.Say("Here is World");
         }


ÀÌ·¸°Ô ÇϽøé Áý¾È¿¡¼­ »ç¶óÁöÁö ¾Ê³×¿ä ^^; ±×·³! ( _ _)
¡è ¸Ç À§·Î °¡±â ¡è
ȸ¿ø ÇÁ·ÎÇÊ º¸±â ÂÊÁö º¸³»±â
roar
ÀÛ¼º±ÛÁ¦¸ñ : -¤·-!!   ±Û ÀÛ¼º½Ã°£ : 2005-01-13 ¸ñ 12:23 pm ±ÛÀ» ÀοëÇÏ¿© ÀÛ¼ºÇÕ´Ï´Ù.

Eighth Cicle [4]
Eighth Cicle [4]

°¡ÀÔÀÏ: 2004³â 01¿ù 20ÀÏ
°Ô½Ã¹°: 228
ÁÖ ¼Ò: Áö±¸ ¾îµò°¡..

±ÂÀâ!!

±ÞÁ¶Çß´ø°Å¶ó ¿¹¿Ü »óȲ 󸮰¡ »ó´çÈ÷ ¹ÌÈíÇß¾ú´Âµ¥

yjwoo14 ´ÔÀÌ ÇѰ¡Áö¸¦ ¸ÚÁö°Ô °íÄ¡¼Ì³×¿ä

°ÅÀÇ 2´ÞÀÌ Áö³ª¼­ Á¦°¡ µÞºÏÀ» µÕµÕ Ä¡°í ÀÖ´Â°Ô ¾ÈŸ±õÁö¸¸ -¤µ-;

_________________
!!!! FareWell !!!!
¡è ¸Ç À§·Î °¡±â ¡è
ȸ¿ø ÇÁ·ÎÇÊ º¸±â ÂÊÁö º¸³»±â E-Mail º¸³»±â
ÀÌÀü °Ô½Ã¹°º¸±â :
»õ ±ÛÀ» ÀÛ¼ºÇÕ´Ï´Ù.´äº¯±ÛÀ» ÀÛ¼ºÇÕ´Ï´Ù. ÆäÀÌÁöÀ̵¿ 1, 2  ´ÙÀ½ ÇöÀçÆäÀÌÁö : 1/2

RunUo.Korean.Forum ¢º Script Support ¢º ¾ÆÀÌÅÛ ½Ãü ±âŸ »ç¶óÁö´Â½Ã°£¼³Á¤Á» ºÎʵ右´Ï´Ù.
¹Ù·Î°¡±â:


°Ô½Ã¹° ÀÛ¼º : (X)
´äº¯±Û ÀÛ¼º : (X)
°Ô½Ã¹° ¼öÁ¤ : (X)
°Ô½Ã¹° »èÁ¦ : (X)
ÅõÇ¥ Çϱâ : (X)
ÆÄÀÏ ¾÷·Îµå : (X)
ÆÄÀÏ ´Ù¿î·Îµå : (0)



DAJ Glass (1.0.5) template by Dustin Baccetti // template edit by GangPung
EQ graphic based off of a design from www.freeclipart.nu
Powered by phpBB 2001, 2002 phpBB Group, Translated by zzangga

DNS Powered by DNSEver.com