Convert movement, actions (lift/use), combat, and spells to use Core.TickCount and avoid DateTime caveats (performance, system time dependency, etc) Refactor DateTime.Now to DateTime.UtcNow Add LOS check for Iron Maiden addon
281 lines
No EOL
9.3 KiB
C#
281 lines
No EOL
9.3 KiB
C#
using System;
|
|
using Server;
|
|
using Server.Gumps;
|
|
using Server.Mobiles;
|
|
using Server.Multis;
|
|
using Server.Network;
|
|
using Server.Targeting;
|
|
using System.Collections.Generic;
|
|
|
|
namespace Server.Factions
|
|
{
|
|
public class FinanceGump : FactionGump
|
|
{
|
|
private PlayerMobile m_From;
|
|
private Faction m_Faction;
|
|
private Town m_Town;
|
|
|
|
private static int[] m_PriceOffsets = new int[]
|
|
{
|
|
-30, -25, -20, -15, -10, -5,
|
|
+50, +100, +150, +200, +250, +300
|
|
};
|
|
|
|
public override int ButtonTypes{ get{ return 2; } }
|
|
|
|
public FinanceGump( PlayerMobile from, Faction faction, Town town ) : base( 50, 50 )
|
|
{
|
|
m_From = from;
|
|
m_Faction = faction;
|
|
m_Town = town;
|
|
|
|
|
|
AddPage( 0 );
|
|
|
|
AddBackground( 0, 0, 320, 410, 5054 );
|
|
AddBackground( 10, 10, 300, 390, 3000 );
|
|
|
|
#region General
|
|
AddPage( 1 );
|
|
|
|
AddHtmlLocalized( 20, 30, 260, 25, 1011541, false, false ); // FINANCE MINISTER
|
|
|
|
|
|
AddHtmlLocalized( 55, 90, 200, 25, 1011539, false, false ); // CHANGE PRICES
|
|
AddButton( 20, 90, 4005, 4007, 0, GumpButtonType.Page, 2 );
|
|
|
|
AddHtmlLocalized( 55, 120, 200, 25, 1011540, false, false ); // BUY SHOPKEEPERS
|
|
AddButton( 20, 120, 4005, 4007, 0, GumpButtonType.Page, 3 );
|
|
|
|
AddHtmlLocalized( 55, 150, 200, 25, 1011495, false, false ); // VIEW FINANCES
|
|
AddButton( 20, 150, 4005, 4007, 0, GumpButtonType.Page, 4 );
|
|
|
|
AddHtmlLocalized( 55, 360, 200, 25, 1011441, false, false ); // EXIT
|
|
AddButton( 20, 360, 4005, 4007, 0, GumpButtonType.Reply, 0 );
|
|
#endregion
|
|
|
|
#region Change Prices
|
|
AddPage( 2 );
|
|
|
|
AddHtmlLocalized( 20, 30, 200, 25, 1011539, false, false ); // CHANGE PRICES
|
|
|
|
for ( int i = 0; i < m_PriceOffsets.Length; ++i )
|
|
{
|
|
int ofs = m_PriceOffsets[i];
|
|
|
|
int x = 20 + ((i / 6) * 150);
|
|
int y = 90 + ((i % 6) * 30);
|
|
|
|
AddRadio( x, y, 208, 209, ( town.Tax == ofs ), i+1 );
|
|
|
|
if ( ofs < 0 )
|
|
AddLabel( x + 35, y, 0x26, String.Concat( "- ", -ofs, "%" ) );
|
|
else
|
|
AddLabel( x + 35, y, 0x12A, String.Concat( "+ ", ofs, "%" ) );
|
|
}
|
|
|
|
AddRadio( 20, 270, 208, 209, ( town.Tax == 0 ), 0 );
|
|
AddHtmlLocalized( 55, 270, 90, 25, 1011542, false, false ); // normal
|
|
|
|
AddHtmlLocalized( 55, 330, 200, 25, 1011509, false, false ); // Set Prices
|
|
AddButton( 20, 330, 4005, 4007, ToButtonID( 0, 0 ), GumpButtonType.Reply, 0 );
|
|
|
|
AddHtmlLocalized( 55, 360, 200, 25, 1011067, false, false ); // Previous page
|
|
AddButton( 20, 360, 4005, 4007, 0, GumpButtonType.Page, 1 );
|
|
#endregion
|
|
|
|
#region Buy Shopkeepers
|
|
AddPage( 3 );
|
|
|
|
AddHtmlLocalized( 20, 30, 200, 25, 1011540, false, false ); // BUY SHOPKEEPERS
|
|
|
|
List<VendorList> vendorLists = town.VendorLists;
|
|
|
|
for ( int i = 0; i < vendorLists.Count; ++i )
|
|
{
|
|
VendorList list = vendorLists[i];
|
|
|
|
AddButton( 20, 90 + (i * 40), 4005, 4007, 0, GumpButtonType.Page, 5 + i );
|
|
AddItem( 55, 90 + (i * 40), list.Definition.ItemID );
|
|
AddHtmlText( 100, 90 + (i * 40), 200, 25, list.Definition.Label, false, false );
|
|
}
|
|
|
|
AddHtmlLocalized( 55, 360, 200, 25, 1011067, false, false ); // Previous page
|
|
AddButton( 20, 360, 4005, 4007, 0, GumpButtonType.Page, 1 );
|
|
#endregion
|
|
|
|
#region View Finances
|
|
AddPage( 4 );
|
|
|
|
int financeUpkeep = town.FinanceUpkeep;
|
|
int sheriffUpkeep = town.SheriffUpkeep;
|
|
int dailyIncome = town.DailyIncome;
|
|
int netCashFlow = town.NetCashFlow;
|
|
|
|
|
|
AddHtmlLocalized( 20, 30, 300, 25, 1011524, false, false ); // FINANCE STATEMENT
|
|
|
|
AddHtmlLocalized( 20, 80, 300, 25, 1011538, false, false ); // Current total money for town :
|
|
AddLabel( 20, 100, 0x44, town.Silver.ToString() );
|
|
|
|
AddHtmlLocalized( 20, 130, 300, 25, 1011520, false, false ); // Finance Minister Upkeep :
|
|
AddLabel( 20, 150, 0x44, financeUpkeep.ToString( "N0" ) ); // NOTE: Added 'N0'
|
|
|
|
AddHtmlLocalized( 20, 180, 300, 25, 1011521, false, false ); // Sheriff Upkeep :
|
|
AddLabel( 20, 200, 0x44, sheriffUpkeep.ToString( "N0" ) ); // NOTE: Added 'N0'
|
|
|
|
AddHtmlLocalized( 20, 230, 300, 25, 1011522, false, false ); // Town Income :
|
|
AddLabel( 20, 250, 0x44, dailyIncome.ToString( "N0" ) ); // NOTE: Added 'N0'
|
|
|
|
AddHtmlLocalized( 20, 280, 300, 25, 1011523, false, false ); // Net Cash flow per day :
|
|
AddLabel( 20, 300, 0x44, netCashFlow.ToString( "N0" ) ); // NOTE: Added 'N0'
|
|
|
|
AddHtmlLocalized( 55, 360, 200, 25, 1011067, false, false ); // Previous page
|
|
AddButton( 20, 360, 4005, 4007, 0, GumpButtonType.Page, 1 );
|
|
#endregion
|
|
|
|
#region Shopkeeper Pages
|
|
for ( int i = 0; i < vendorLists.Count; ++i )
|
|
{
|
|
VendorList vendorList = vendorLists[i];
|
|
|
|
AddPage( 5 + i );
|
|
|
|
AddHtmlText( 60, 30, 300, 25, vendorList.Definition.Header, false, false );
|
|
AddItem( 20, 30, vendorList.Definition.ItemID );
|
|
|
|
AddHtmlLocalized( 20, 90, 200, 25, 1011514, false, false ); // You have :
|
|
AddLabel( 230, 90, 0x26, vendorList.Vendors.Count.ToString() );
|
|
|
|
AddHtmlLocalized( 20, 120, 200, 25, 1011515, false, false ); // Maximum :
|
|
AddLabel( 230, 120, 0x256, vendorList.Definition.Maximum.ToString() );
|
|
|
|
AddHtmlLocalized( 20, 150, 200, 25, 1011516, false, false ); // Cost :
|
|
AddLabel( 230, 150, 0x44, vendorList.Definition.Price.ToString( "N0" ) ); // NOTE: Added 'N0'
|
|
|
|
AddHtmlLocalized( 20, 180, 200, 25, 1011517, false, false ); // Daily Pay :
|
|
AddLabel( 230, 180, 0x37, vendorList.Definition.Upkeep.ToString( "N0" ) ); // NOTE: Added 'N0'
|
|
|
|
AddHtmlLocalized( 20, 210, 200, 25, 1011518, false, false ); // Current Silver :
|
|
AddLabel( 230, 210, 0x44, town.Silver.ToString( "N0" ) ); // NOTE: Added 'N0'
|
|
|
|
AddHtmlLocalized( 20, 240, 200, 25, 1011519, false, false ); // Current Payroll :
|
|
AddLabel( 230, 240, 0x44, financeUpkeep.ToString( "N0" ) ); // NOTE: Added 'N0'
|
|
|
|
AddHtmlText( 55, 300, 200, 25, vendorList.Definition.Label, false, false );
|
|
if ( town.Silver >= vendorList.Definition.Price )
|
|
AddButton( 20, 300, 4005, 4007, ToButtonID( 1, i ), GumpButtonType.Reply, 0 );
|
|
else
|
|
AddImage( 20, 300, 4020 );
|
|
|
|
AddHtmlLocalized( 55, 360, 200, 25, 1011067, false, false ); // Previous page
|
|
AddButton( 20, 360, 4005, 4007, 0, GumpButtonType.Page, 3 );
|
|
}
|
|
#endregion
|
|
}
|
|
|
|
public override void OnResponse( NetState sender, RelayInfo info )
|
|
{
|
|
if ( !m_Town.IsFinance( m_From ) || m_Town.Owner != m_Faction )
|
|
{
|
|
m_From.SendLocalizedMessage( 1010339 ); // You no longer control this city
|
|
return;
|
|
}
|
|
|
|
int type, index;
|
|
|
|
if ( !FromButtonID( info.ButtonID, out type, out index ) )
|
|
return;
|
|
|
|
switch ( type )
|
|
{
|
|
case 0: // general
|
|
{
|
|
switch ( index )
|
|
{
|
|
case 0: // set price
|
|
{
|
|
int[] switches = info.Switches;
|
|
|
|
if ( switches.Length == 0 )
|
|
break;
|
|
|
|
int opt = switches[0];
|
|
int newTax = 0;
|
|
|
|
if ( opt >= 1 && opt <= m_PriceOffsets.Length )
|
|
newTax = m_PriceOffsets[opt - 1];
|
|
|
|
if ( m_Town.Tax == newTax )
|
|
break;
|
|
|
|
if ( m_From.AccessLevel == AccessLevel.Player && !m_Town.TaxChangeReady )
|
|
{
|
|
TimeSpan remaining = DateTime.UtcNow - ( m_Town.LastTaxChange + Town.TaxChangePeriod );
|
|
|
|
if ( remaining.TotalMinutes < 4 )
|
|
m_From.SendLocalizedMessage( 1042165 ); // You must wait a short while before changing prices again.
|
|
else if ( remaining.TotalMinutes < 10 )
|
|
m_From.SendLocalizedMessage( 1042166 ); // You must wait several minutes before changing prices again.
|
|
else if ( remaining.TotalHours < 1 )
|
|
m_From.SendLocalizedMessage( 1042167 ); // You must wait up to an hour before changing prices again.
|
|
else if ( remaining.TotalHours < 4 )
|
|
m_From.SendLocalizedMessage( 1042168 ); // You must wait a few hours before changing prices again.
|
|
else
|
|
m_From.SendLocalizedMessage( 1042169 ); // You must wait several hours before changing prices again.
|
|
}
|
|
else
|
|
{
|
|
m_Town.Tax = newTax;
|
|
|
|
if ( m_From.AccessLevel == AccessLevel.Player )
|
|
m_Town.LastTaxChange = DateTime.UtcNow;
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
case 1: // make vendor
|
|
{
|
|
List<VendorList> vendorLists = m_Town.VendorLists;
|
|
|
|
if ( index >= 0 && index < vendorLists.Count )
|
|
{
|
|
VendorList vendorList = vendorLists[index];
|
|
|
|
Town town = Town.FromRegion( m_From.Region );
|
|
|
|
if ( Town.FromRegion( m_From.Region ) != m_Town )
|
|
{
|
|
m_From.SendLocalizedMessage( 1010305 ); // You must be in your controlled city to buy Items
|
|
}
|
|
else if ( vendorList.Vendors.Count >= vendorList.Definition.Maximum )
|
|
{
|
|
m_From.SendLocalizedMessage( 1010306 ); // You currently have too many of this enhancement type to place another
|
|
}
|
|
else if ( BaseBoat.FindBoatAt( m_From.Location, m_From.Map ) != null ) {
|
|
m_From.SendMessage( "You cannot place a vendor here" );
|
|
}
|
|
else if ( m_Town.Silver >= vendorList.Definition.Price )
|
|
{
|
|
BaseFactionVendor vendor = vendorList.Construct( m_Town, m_Faction );
|
|
|
|
if ( vendor != null )
|
|
{
|
|
m_Town.Silver -= vendorList.Definition.Price;
|
|
|
|
vendor.MoveToWorld( m_From.Location, m_From.Map );
|
|
vendor.Home = vendor.Location;
|
|
}
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |