using System; using Server.Mobiles; using Server.Targeting; using Server.Gumps; using Server.Engines.VeteranRewards; namespace Server.Items { public class WeaponEngravingTool : Item, IUsesRemaining, IRewardItem { public override int LabelNumber => 1076158; // Weapon Engraving Tool private int m_UsesRemaining; private bool m_IsRewardItem; [CommandProperty( AccessLevel.GameMaster )] public int UsesRemaining { get => m_UsesRemaining; set{ m_UsesRemaining = value; InvalidateProperties(); } } public virtual bool ShowUsesRemaining { get => true; set{} } [CommandProperty( AccessLevel.GameMaster )] public bool IsRewardItem { get => m_IsRewardItem; set{ m_IsRewardItem = value; InvalidateProperties(); } } [Constructible] public WeaponEngravingTool() : this( 10 ) { } [Constructible] public WeaponEngravingTool( int uses ) : base( 0x32F8 ) { LootType = LootType.Blessed; Weight = 1.0; m_UsesRemaining = uses; } public WeaponEngravingTool( Serial serial ) : base( serial ) { } public override void OnDoubleClick( Mobile from ) { if ( m_IsRewardItem && !RewardSystem.CheckIsUsableBy( from, this, null ) ) return; if ( m_UsesRemaining > 0 ) { from.SendLocalizedMessage( 1072357 ); // Select an object to engrave. from.Target = new TargetWeapon( this ); } else { if ( from.Skills.Tinkering.Value == 0 ) { from.SendLocalizedMessage( 1076179 ); // Since you have no tinkering skill, you will need to find an NPC tinkerer to repair this for you. } else if ( from.Skills.Tinkering.Value < 75.0 ) { from.SendLocalizedMessage( 1076178 ); // Your tinkering skill is too low to fix this yourself. An NPC tinkerer can help you repair this for a fee. } else { Item diamond = from.Backpack.FindItemByType( typeof( BlueDiamond ) ); if ( diamond != null ) from.SendGump( new ConfirmGump( this, null ) ); else from.SendLocalizedMessage( 1076166 ); // You do not have a blue diamond needed to recharge the engraving tool. } from.SendLocalizedMessage( 1076163 ); // There are no charges left on this engraving tool. } } public override void GetProperties( ObjectPropertyList list ) { base.GetProperties( list ); if ( m_IsRewardItem ) list.Add( 1076224 ); // 8th Year Veteran Reward if ( ShowUsesRemaining ) list.Add( 1060584, m_UsesRemaining.ToString() ); // uses remaining: ~1_val~ } public override void Serialize( GenericWriter writer ) { base.Serialize( writer ); writer.Write( (int) 0 ); // version writer.Write( (int) m_UsesRemaining ); writer.Write( (bool) m_IsRewardItem ); } public override void Deserialize( GenericReader reader ) { base.Deserialize( reader ); int version = reader.ReadInt(); m_UsesRemaining = reader.ReadInt(); m_IsRewardItem = reader.ReadBool(); } public virtual void Recharge( Mobile from, Mobile guildmaster ) { if ( from.Backpack != null ) { Item diamond = from.Backpack.FindItemByType( typeof( BlueDiamond ) ); if ( guildmaster != null ) { if ( m_UsesRemaining <= 0 ) { if ( diamond != null && Banker.Withdraw( from, 100000 ) ) { diamond.Consume(); UsesRemaining = 10; guildmaster.Say( 1076165 ); // Your weapon engraver should be good as new! } else guildmaster.Say( 1076167 ); // You need a 100,000 gold and a blue diamond to recharge the weapon engraver. } else guildmaster.Say( 1076164 ); // I can only help with this if you are carrying an engraving tool that needs repair. } else { if ( from.Skills.Tinkering.Value == 0 ) { from.SendLocalizedMessage( 1076179 ); // Since you have no tinkering skill, you will need to find an NPC tinkerer to repair this for you. } else if ( from.Skills.Tinkering.Value < 75.0 ) { from.SendLocalizedMessage( 1076178 ); // Your tinkering skill is too low to fix this yourself. An NPC tinkerer can help you repair this for a fee. } else if ( diamond != null ) { diamond.Consume(); if ( Utility.RandomDouble() < from.Skills.Tinkering.Value / 100 ) { UsesRemaining = 10; from.SendLocalizedMessage( 1076165 ); // Your weapon engraver should be good as new! ????? } else from.SendLocalizedMessage( 1076175 ); // You cracked the diamond attempting to fix the weapon engraver. } else from.SendLocalizedMessage( 1076166 ); // You do not have a blue diamond needed to recharge the engraving tool. } } } public static WeaponEngravingTool Find( Mobile from ) { if ( from.Backpack != null ) return from.Backpack.FindItemByType( typeof( WeaponEngravingTool ) ) as WeaponEngravingTool; return null; } private class TargetWeapon : Target { private WeaponEngravingTool m_Tool; public TargetWeapon( WeaponEngravingTool tool ) : base( -1, true, TargetFlags.None ) { m_Tool = tool; } protected override void OnTarget( Mobile from, object targeted ) { if ( m_Tool == null || m_Tool.Deleted ) return; if ( targeted is BaseWeapon item ) { from.CloseGump( typeof( InternalGump ) ); from.SendGump( new InternalGump( m_Tool, item ) ); } else from.SendLocalizedMessage( 1072309 ); // The selected item cannot be engraved by this engraving tool. } } private class InternalGump : Gump { private WeaponEngravingTool m_Tool; private BaseWeapon m_Target; private enum Buttons { Cancel, Okay, Text } public InternalGump( WeaponEngravingTool tool, BaseWeapon target ) : base( 0, 0 ) { m_Tool = tool; m_Target = target; Closable = true; Disposable = true; Dragable = true; Resizable = false; AddBackground( 50, 50, 400, 300, 0xA28 ); AddPage( 0 ); AddHtmlLocalized( 50, 70, 400, 20, 1072359, 0x0, false, false ); //
Engraving Tool
AddHtmlLocalized( 75, 95, 350, 145, 1076229, 0x0, true, true ); // Please enter the text to add to the selected object. Leave the text area blank to remove any existing text. Removing text does not use a charge. AddButton( 125, 300, 0x81A, 0x81B, (int) Buttons.Okay, GumpButtonType.Reply, 0 ); AddButton( 320, 300, 0x819, 0x818, (int) Buttons.Cancel, GumpButtonType.Reply, 0 ); AddImageTiled( 75, 245, 350, 40, 0xDB0 ); AddImageTiled( 76, 245, 350, 2, 0x23C5 ); AddImageTiled( 75, 245, 2, 40, 0x23C3 ); AddImageTiled( 75, 285, 350, 2, 0x23C5 ); AddImageTiled( 425, 245, 2, 42, 0x23C3 ); AddTextEntry( 75, 245, 350, 40, 0x0, (int) Buttons.Text, "" ); } public override void OnResponse( Network.NetState state, RelayInfo info ) { if ( m_Tool == null || m_Tool.Deleted || m_Target == null || m_Target.Deleted ) return; if ( info.ButtonID == (int) Buttons.Okay ) { TextRelay relay = info.GetTextEntry( (int) Buttons.Text ); if ( relay != null ) { if ( string.IsNullOrEmpty( relay.Text ) ) { m_Target.EngravedText = null; state.Mobile.SendLocalizedMessage( 1072362 ); // You remove the engraving from the object. } else { if ( relay.Text.Length > 64 ) m_Target.EngravedText = Utility.FixHtml( relay.Text.Substring( 0, 64 ) ); else m_Target.EngravedText = Utility.FixHtml( relay.Text ); state.Mobile.SendLocalizedMessage( 1072361 ); // You engraved the object. m_Target.InvalidateProperties(); m_Tool.UsesRemaining -= 1; m_Tool.InvalidateProperties(); } } } else state.Mobile.SendLocalizedMessage( 1072363 ); // The object was not engraved. } } public class ConfirmGump : Gump { private WeaponEngravingTool m_Engraver; private Mobile m_Guildmaster; private enum Buttons { Cancel, Confirm } public ConfirmGump( WeaponEngravingTool engraver, Mobile guildmaster ) : base( 200, 200 ) { m_Engraver = engraver; m_Guildmaster = guildmaster; Closable = false; Disposable = true; Dragable = true; Resizable = false; AddPage( 0 ); AddBackground( 0, 0, 291, 133, 0x13BE ); AddImageTiled( 5, 5, 280, 100, 0xA40 ); if ( guildmaster != null ) { AddHtmlLocalized( 9, 9, 272, 100, 1076169, 0x7FFF, false, false ); // It will cost you 100,000 gold and a blue diamond to recharge your weapon engraver with 10 charges. AddHtmlLocalized( 195, 109, 120, 20, 1076172, 0x7FFF, false, false ); // Recharge it } else { AddHtmlLocalized( 9, 9, 272, 100, 1076176, 0x7FFF, false, false ); // You will need a blue diamond to repair the tip of the engraver. A successful repair will give the engraver 10 charges. AddHtmlLocalized( 195, 109, 120, 20, 1076177, 0x7FFF, false, false ); // Replace the tip. } AddButton( 160, 107, 0xFB7, 0xFB8, (int) Buttons.Confirm, GumpButtonType.Reply, 0 ); AddButton( 5, 107, 0xFB1, 0xFB2, (int) Buttons.Cancel, GumpButtonType.Reply, 0 ); AddHtmlLocalized( 40, 109, 100, 20, 1060051, 0x7FFF, false, false ); // CANCEL } public override void OnResponse( Network.NetState state, RelayInfo info ) { if ( m_Engraver == null || m_Engraver.Deleted ) return; if ( info.ButtonID == (int) Buttons.Confirm ) m_Engraver.Recharge( state.Mobile, m_Guildmaster ); } } } }