ModernUO/Scripts/Items/Special/Veteran Rewards/WeaponEngravingTool.cs
2018-09-14 13:22:16 -07:00

327 lines
9.6 KiB
C#

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 ); // <CENTER>Engraving Tool</CENTER>
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 );
}
}
}
}