1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

HomeStone 1.2

Works like the hearthstone in World of Warcraft. Can also be set to player's house.

  1. Ixtabay
    Offline

    Ixtabay Member

    Joined:
    Mar 30, 2015
    Messages:
    65
    Likes Received:
    11
    Ixtabay submitted a new resource:

    HomeStone - Works like the hearthstone in World of Warcraft. Can also be set to player's house.

    Read more about this resource...
     
    • Two Thumbs Up Two Thumbs Up x 1
  2. Ixtabay
    Offline

    Ixtabay Member

    Joined:
    Mar 30, 2015
    Messages:
    65
    Likes Received:
    11
  3. Greystar
    Offline

    Greystar Member

    Joined:
    Feb 20, 2014
    Messages:
    67
    Likes Received:
    3
    Will never cast the spell, it will constantly remark the location if you doubleclick it. So I suggest you change the "Mark" routine to a ContextMenu of some kind and then use the OnDoubleClick method to actually cast the spell.
     
  4. Greystar
    Offline

    Greystar Member

    Joined:
    Feb 20, 2014
    Messages:
    67
    Likes Received:
    3
    I may have fixed it (not tested yet)

    Spoiler
    Code (C#):
    1.  
    2. // Created by Dunhill, based on the original idea of Murzin
    3. // Version 1.1, released in runuo.com forums
    4. // Version 1.2, fixed for ServUO by Ixtabay
    5. // Version 1.3, Actually fixed for ServUO by Greystar
    6. using System;
    7. using System.Collections.Generic;
    8. using Server;
    9. using Server.Mobiles;
    10. using Server.Items;
    11. using Server.Regions;
    12. using Server.Spells;
    13. using Server.Network;
    14. using Server.Multis;
    15. using Server.ContextMenus;
    16.  
    17. namespace Server.Items
    18. {
    19.     public class HomeStone : Item
    20.     {
    21.         private static readonly TimeSpan delay = TimeSpan.FromMinutes( 15.0 );
    22.         private static readonly bool oneStonePerMobile = true;
    23.         private static readonly TimeSpan totalDelay = TimeSpan.FromMinutes( 15.0 );
    24.      
    25.         private static List<HomeStoneUse> useRegistry = new List<HomeStoneUse>();
    26.      
    27.         private bool noWaitTime;
    28.         private DateTime lastUsed;
    29.         private DateTime lastMarked;
    30.         private Point3D home;
    31.         private Map homeMap;      
    32.         private Mobile owner;
    33.      
    34.  
    35.         #region Commands
    36.         [CommandProperty( AccessLevel.GameMaster )]
    37.         public bool NoWaitTime
    38.         {
    39.             get{ return (owner.AccessLevel >= AccessLevel.GameMaster ? true : noWaitTime); }
    40.             set{ noWaitTime = value; }
    41.         }
    42.      
    43.         [CommandProperty( AccessLevel.GameMaster )]
    44.         public DateTime LastUsed
    45.         {
    46.             get{ return lastUsed; }
    47.             set{ lastUsed = value; }
    48.         }
    49.  
    50.         [CommandProperty( AccessLevel.GameMaster )]
    51.         public Point3D Home
    52.         {
    53.             get{ return home; }
    54.             set{ home = value; }
    55.         }
    56.  
    57.         [CommandProperty( AccessLevel.GameMaster )]
    58.         public Map HomeMap
    59.         {
    60.             get{ return homeMap; }
    61.             set{ homeMap = value; }
    62.         }
    63.      
    64.         [CommandProperty( AccessLevel.GameMaster )]
    65.         public Mobile Owner
    66.         {
    67.             get{ return owner; }
    68.             set{ owner = value; }
    69.         }
    70.  
    71. // ------------------------------------------------------------------------------------------------------- added per zerodowned    
    72.         /* public override TimeSpan CastDelayBase
    73.          {
    74.              get
    75.              {
    76.                  return TimeSpan.FromSeconds(1.5);
    77.              }
    78.          } */
    79.  
    80.        
    81.         #endregion
    82.      
    83.         #region constructors
    84.         [Constructable]
    85.         public HomeStone() : this( null )
    86.         {
    87.         }
    88.      
    89.         [Constructable]
    90.         public HomeStone(Mobile from) : base( 0x1726) //2AAA )
    91.         {
    92.             this.owner = from;        
    93.             Weight = 0.0;
    94.             LootType = LootType.Blessed;                      
    95.             RenameThisStone();
    96.         }
    97.         #endregion
    98.      
    99.         public static void RegisterUse( Mobile from )
    100.         {
    101.             useRegistry.Add(new HomeStoneUse( from ));
    102.         }
    103.      
    104.         public static TimeSpan GetRemainingTimeToUseForMobile( Mobile from )
    105.         {
    106.             List<HomeStoneUse> innerUseRegistry = useRegistry.FindAll(delegate( HomeStoneUse hsu ) { return hsu.User == from
    107.                                       && hsu.UseTime > DateTime.Now - totalDelay; });
    108.          
    109.             if ( innerUseRegistry.Count > 0 )
    110.             {
    111.                 foreach( HomeStoneUse hsu in innerUseRegistry) // TODO: Better way to solve this?
    112.                 {
    113.                     // delay - ( now - used )
    114.                     return  totalDelay -  (DateTime.Now - hsu.UseTime) ;
    115.                 }
    116.             }
    117.                  
    118.             return TimeSpan.Zero;
    119.         }
    120.      
    121.         public static void cleanUseList()
    122.         {
    123.             useRegistry.RemoveAll(delegate(HomeStoneUse hsu) { return hsu.UseTime < DateTime.Now - totalDelay; });
    124.         }
    125.  
    126.         public static void GetContextMenuEntries(Mobile from, Item item, List<ContextMenuEntry> list)
    127.         {
    128.             list.Add(new GoHomeEntry(from, item));
    129.             list.Add(new SetHomeEntry(from, item));
    130.         }
    131.  
    132.         public override void GetContextMenuEntries(Mobile from, List<ContextMenuEntry> list)
    133.         {
    134.             if (owner == null)
    135.             {
    136.                 return;
    137.             }
    138.             else
    139.             {
    140.                 if (owner != from)
    141.                 {
    142.                     from.SendMessage("This is not yours to use.");
    143.                     return;
    144.                 }
    145.                 else
    146.                 {
    147.                     base.GetContextMenuEntries(from, list);
    148.                     HomeStone.GetContextMenuEntries(from, this, list);
    149.                 }
    150.             }
    151.         }
    152.        
    153.         public override void OnDoubleClick( Mobile from )
    154.         {        
    155.          
    156.             if ( !IsChildOf( from.Backpack ) )
    157.             {
    158.                 from.SendMessage( "This must be in your backpack to use." );
    159.                 return;
    160.             }
    161.          
    162.             if ( owner == null  )
    163.             {
    164.                 SwitchOwner(from);
    165.                 return;
    166.             }    
    167.          
    168.             if ( Validate( from ) )
    169.             {
    170.                 new HomeStoneSpell( this, from ).Cast();
    171.             }
    172.  
    173.         }
    174.  
    175.         public override void OnSingleClick( Mobile from )
    176.         {
    177.             // why not base? we dont like to see the [blessed] tag, just like on runebooks,spellbooks etc
    178.             // + we dont want it to be called coconut or whatever
    179.             //base.OnSingleClick( from );
    180.          
    181.             LabelTo( from, this.Name );
    182.                      
    183.             string label;
    184.          
    185.             TimeSpan timetouse = GetRemainingTimeToUse();
    186.             //TimeSpan timetouseTotal = GetRemainingTimeToUseForMobile( from );
    187.          
    188.             if ( owner == null )
    189.                 return;
    190.          
    191.          
    192.             if ( timetouse.TotalSeconds <= 0.0)
    193.                 label = "[ready]";            
    194.             else
    195.                 label = "[" + timetouse.Minutes + " minutes]";                
    196.  
    197.  
    198.          
    199.             if ( this.homeMap != null )
    200.                 LabelTo( from, label );
    201.             else
    202.                 LabelTo( from, "[unmarked]" );
    203.  
    204.         }
    205.  
    206.         private class SetHomeEntry : ContextMenuEntry
    207.         {
    208.             private readonly HomeStone m_Item;
    209.             private readonly Mobile m_Mobile;
    210.             public SetHomeEntry(Mobile from, Item item)
    211.                 : base(2055)// uses "Mark" entry
    212.             {
    213.                 m_Item = (HomeStone)item;
    214.                 m_Mobile = from;
    215.             }
    216.  
    217.             public override void OnClick()
    218.             {
    219.                 if ( m_Item.IsInMarkAbleRegion( m_Mobile ))
    220.                 {
    221.                     m_Item.Mark( m_Mobile );
    222.                 }
    223.             }
    224.         }
    225.        
    226.         private void Mark( Mobile from )
    227.         {        
    228.             if ( this.lastMarked > DateTime.Now - TimeSpan.FromSeconds(5))
    229.             {
    230.                 from.SendMessage("You have to wait until you can mark your stone again.");
    231.             }
    232.             else
    233.             {
    234.                 this.home = from.Location;
    235.                 this.homeMap = from.Map;
    236.                 this.lastMarked = DateTime.Now;
    237.                 from.PlaySound( 0x1E9 );      
    238.                 from.FixedParticles( 0x375A, 10, 15, 5037, EffectLayer.Waist );
    239.                 from.SendMessage( "You have marked this as your home." );
    240.             }        
    241.         }
    242.  
    243.         private class GoHomeEntry : ContextMenuEntry
    244.         {
    245.             private readonly HomeStone m_Item;
    246.             private readonly Mobile m_Mobile;
    247.             public GoHomeEntry(Mobile from, Item item)
    248.                 : base(5134)// uses "Goto Loc" entry
    249.             {
    250.                 m_Item = (HomeStone)item;
    251.                 m_Mobile = from;
    252.             }
    253.  
    254.             public override void OnClick()
    255.             {
    256.                 if ( m_Item.Validate( m_Mobile ) )
    257.                 {
    258.                     new HomeStoneSpell( m_Item, m_Mobile ).Cast();
    259.                 }
    260.             }
    261.         }
    262.        
    263.         private void SwitchOwner(Mobile from)
    264.         {
    265.             if ( owner == null ) // double check..
    266.             {                
    267.                 owner = from;
    268.                 from.SendMessage("You take possession of this hearthstone!");
    269.                 RenameThisStone();
    270.             }
    271.             else
    272.                 from.SendMessage( "This is not your homestone!" );
    273.         }
    274.      
    275.         private void RenameThisStone()
    276.         {
    277.             if ( owner != null )
    278.             {
    279.                 this.Name = owner.Name + "s homestone";
    280.                 this.Hue = 0x501;
    281.             }
    282.             else
    283.             {
    284.                 this.Name = "a homestone with no owner";
    285.                 this.Hue = 0;
    286.             }    
    287.         }
    288.  
    289.         private bool Validate( Mobile from )
    290.         {
    291.  
    292.             if ( from != owner )
    293.             {
    294.                 from.SendMessage( "This is not your homestone!" );
    295.                 return false;
    296.             }
    297.          
    298.             else if ( this.homeMap == null )
    299.             {
    300.                 from.SendMessage( "This homestone is not yet marked anywhere!" );
    301.                 return false;
    302.             }
    303.             //else if ( from.Criminal )
    304.             //{
    305.             //    from.SendLocalizedMessage( 1005561, "", 0x22 ); // your criminal and cannot escape so easily
    306.             //    return false;
    307.             //}
    308.             else if ( Server.Spells.SpellHelper.CheckCombat( from ) )
    309.             {
    310.                 from.SendLocalizedMessage( 1005564, "", 0x22 ); // Wouldst thou flee during the heat of battle??
    311.                 return false;
    312.             }
    313.             else if ( Server.Factions.Sigil.ExistsOn( from ) )
    314.             {
    315.                 from.SendLocalizedMessage( 1061632 ); // You can't do that while carrying the sigil.
    316.                 return false;
    317.             }
    318.             else if ( Server.Misc.WeightOverloading.IsOverloaded( from ) )
    319.             {
    320.                 from.SendLocalizedMessage( 502359, "", 0x22 ); // Thou art too encumbered to move.
    321.                 return false;
    322.             }
    323.             else if ( GetRemainingTimeToUse() > TimeSpan.Zero && !noWaitTime )
    324.             {
    325.                 from.SendMessage( "Your homestone will be ready again in {0} minutes!", (int)HomeStone.GetRemainingTimeToUseForMobile( from ).TotalMinutes );
    326.                 return false;
    327.             }
    328.             else if ( HomeStone.GetRemainingTimeToUseForMobile( from ) > TimeSpan.Zero && oneStonePerMobile )
    329.             {
    330.                 from.SendMessage( "You must wait {0} minutes before using another homestone.", (int)HomeStone.GetRemainingTimeToUseForMobile( from ).TotalMinutes );
    331.                 return false;
    332.             }        
    333.             else
    334.             {
    335.                 return true;
    336.             }
    337.  
    338.         }
    339.      
    340.         private bool IsInMarkAbleRegion(Mobile from)
    341.         {
    342.             bool house = false;
    343.             if ( from.Region is HouseRegion )
    344.                 if (((HouseRegion)from.Region).House.IsOwner(from))
    345.                     house = true;
    346.          
    347.             if ( from.Region.GetLogoutDelay( from ) == TimeSpan.Zero || house )
    348.                 return true;
    349.  
    350.             return false;
    351.         }
    352.      
    353.         private TimeSpan GetRemainingTimeToUse()
    354.         {
    355.             return lastUsed + delay - DateTime.Now;
    356.         }
    357.      
    358.         public HomeStone( Serial serial ) : base( serial )
    359.         {
    360.         }
    361.      
    362.         public override void Serialize( GenericWriter writer )
    363.         {
    364.             base.Serialize( writer );
    365.             writer.Write( (int) 0 );
    366.             writer.Write( (Mobile)owner);
    367.             writer.Write( (Point3D) home );
    368.             writer.Write( (DateTime) lastUsed );
    369.             writer.Write( (Map) homeMap );
    370.             RenameThisStone();
    371.             cleanUseList();
    372.         }
    373.      
    374.         public override void Deserialize(GenericReader reader)
    375.         {
    376.             base.Deserialize( reader );
    377.             int version = reader.ReadInt();
    378.             owner = reader.ReadMobile();
    379.             home = reader.ReadPoint3D();
    380.             lastUsed = reader.ReadDateTime();
    381.             homeMap = reader.ReadMap();
    382.             RenameThisStone();
    383.             cleanUseList();
    384.         }
    385.      
    386.         public class HomeStoneSpell : Spell
    387.         {
    388.             private static SpellInfo m_Info = new SpellInfo( "Home Stone", "", 230 );
    389.             public override TimeSpan CastDelayBase { get { return TimeSpan.FromSeconds( 2.5 ); } }
    390.             private HomeStone m_homeStone;
    391.  
    392.             public HomeStoneSpell( HomeStone homeStone, Mobile caster ) : base( caster, null, m_Info )
    393.             {
    394.                 m_homeStone = homeStone;
    395.              
    396. //          Effects.SendLocationEffect( new Point3D( caster.X + 1, caster.Y, caster.Z + 4 ), caster.Map, 0x3709, 30, 1281, 2 );
    397. //          Effects.SendLocationEffect( new Point3D( caster.X + 1, caster.Y, caster.Z ), caster.Map, 0x3709, 30, 1281, 2 );
    398. //          Effects.SendLocationEffect( new Point3D( caster.X + 1, caster.Y, caster.Z - 4 ), caster.Map, 0x3709, 30, 1281, 2 );
    399. //          Effects.SendLocationEffect( new Point3D( caster.X, caster.Y + 1, caster.Z + 4 ), caster.Map, 0x3709, 30, 1281, 2 );
    400. //          Effects.SendLocationEffect( new Point3D( caster.X, caster.Y + 1, caster.Z ), caster.Map, 0x3709, 30, 1281, 2 );
    401. //          Effects.SendLocationEffect( new Point3D( caster.X, caster.Y + 1, caster.Z - 4 ), caster.Map, 0x3709, 30, 1281, 2 );
    402. //
    403. //          Effects.SendLocationEffect( new Point3D( caster.X + 1, caster.Y + 1, caster.Z + 11 ), caster.Map, 0x3709, 30, 1281, 2 );
    404. //          Effects.SendLocationEffect( new Point3D( caster.X + 1, caster.Y + 1, caster.Z + 7 ), caster.Map, 0x3709, 30, 1281, 2 );
    405. //          Effects.SendLocationEffect( new Point3D( caster.X + 1, caster.Y + 1, caster.Z + 3 ), caster.Map, 0x3709, 30, 1281, 2 );
    406. //          Effects.SendLocationEffect( new Point3D( caster.X + 1, caster.Y + 1, caster.Z - 1 ), caster.Map, 0x3709, 30, 1281, 2 );
    407.             caster.FixedParticles( 0x3709, 10, 30 ,1281,1, 5037, EffectLayer.Waist );
    408.             }
    409.  
    410.             public override bool ClearHandsOnCast{ get{ return false; } }
    411.             public override bool RevealOnCast{ get{ return false; } }
    412.             public override TimeSpan GetCastRecovery()
    413.             {
    414.                 return TimeSpan.Zero;
    415.             }
    416.  
    417.             public override TimeSpan GetCastDelay()
    418.             {
    419.                 return TimeSpan.FromSeconds(3);//( (m_Mount.IsDonationItem && RewardSystem.GetRewardLevel( m_Rider ) < 3 )? 12.5 : 5.0 ) );
    420.             }
    421.  
    422.             public override int GetMana()
    423.             {
    424.                 return 10;
    425.             }
    426.  
    427.             public override bool ConsumeReagents()
    428.             {
    429.                 return false;
    430.             }
    431.  
    432.             public override bool CheckFizzle()
    433.             {
    434.                 return true;
    435.             }
    436.  
    437.             private bool m_Stop;
    438.  
    439.             public void Stop()
    440.             {
    441.                 m_Stop = true;
    442.                 Disturb( DisturbType.Hurt, false, false );
    443.             }
    444.  
    445.             public override bool CheckDisturb( DisturbType type, bool checkFirst, bool resistable )
    446.             {
    447.                 //if ( type == DisturbType.EquipRequest || type == DisturbType.UseRequest/* || type == DisturbType.Hurt*/ )
    448.                 //  return false;
    449.                 if ( type == DisturbType.Hurt )
    450.                     return false;
    451.                 else
    452.                     return true;
    453.             }
    454.  
    455.             public override void DoHurtFizzle()
    456.             {
    457.                 if ( !m_Stop )
    458.                     base.DoHurtFizzle();
    459.             }
    460.  
    461.             public override void DoFizzle()
    462.             {
    463.                 if ( !m_Stop )
    464.                     base.DoFizzle();
    465.             }
    466.  
    467.             public override void OnDisturb( DisturbType type, bool message )
    468.             {
    469.                 if ( message && !m_Stop )
    470.                     Caster.SendMessage( "You have been disrupted while attempting to use your homestone" );
    471.  
    472.                 //m_Mount.UnmountMe();
    473.             }
    474.  
    475.             public override void OnCast()
    476.             {        
    477.              
    478.                 HomeStoneTeleport();
    479.                 FinishSequence();
    480.             }
    481.          
    482.             private void HomeStoneTeleport( )
    483.             {
    484.                 if ( m_homeStone.Validate( Caster ) )
    485.                 {        
    486.                     HomeStone.RegisterUse( Caster);
    487.                     BaseCreature.TeleportPets( Caster, m_homeStone.home, m_homeStone.homeMap, true );
    488.                     Caster.Location = new Point3D( m_homeStone.home );
    489.                     Caster.Map = m_homeStone.homeMap;                
    490.                     m_homeStone.LastUsed = DateTime.Now;  
    491.                     Caster.PlaySound( 0x1FC );
    492.                     Caster.FixedParticles( 0x3709, 10, 30 ,1281,1, 5037, EffectLayer.Waist );
    493.                 }
    494.              
    495.             }
    496.         }    
    497.  
    498.         private class HomeStoneUse
    499.         {
    500.             private DateTime useTime;
    501.             private Mobile user;
    502.             public DateTime UseTime{get{return this.useTime;}}
    503.             public Mobile User{get{return this.user;}}
    504.          
    505.             public HomeStoneUse( Mobile from )
    506.             {
    507.                 useTime = DateTime.Now;
    508.                 user = from;
    509.             }
    510.         }
    511.     }
    512. }
    513.  
    514.  


    And yes there is a reason why I didn't upload the file.
     
    • Thanks! Thanks! x 1
Similar Threads: HomeStone
Forum Title Date
Script Support HomeStone question Feb 4, 2018
Script Support HomeStone.cs Dec 21, 2016