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
250 lines
No EOL
8.1 KiB
C#
250 lines
No EOL
8.1 KiB
C#
using System;
|
|
using System.Collections;
|
|
using Server;
|
|
using Server.Items;
|
|
using Server.Gumps;
|
|
using Server.Mobiles;
|
|
using Server.Targeting;
|
|
|
|
namespace Server
|
|
{
|
|
public class JusticeVirtue
|
|
{
|
|
private static TimeSpan LossDelay = TimeSpan.FromDays( 7.0 );
|
|
private const int LossAmount = 950;
|
|
|
|
public static void Initialize()
|
|
{
|
|
VirtueGump.Register( 109, new OnVirtueUsed( OnVirtueUsed ) );
|
|
}
|
|
|
|
public static bool CheckMapRegion( Mobile first, Mobile second )
|
|
{
|
|
Map map = first.Map;
|
|
|
|
if ( second.Map != map )
|
|
return false;
|
|
|
|
return GetMapRegion( map, first.Location ) == GetMapRegion( map, second.Location );
|
|
}
|
|
|
|
public static int GetMapRegion( Map map, Point3D loc )
|
|
{
|
|
if ( map == null || map.MapID >= 2 )
|
|
return 0;
|
|
|
|
if ( loc.X < 5120 )
|
|
return 0;
|
|
|
|
if ( loc.Y < 2304 )
|
|
return 1;
|
|
|
|
return 2;
|
|
}
|
|
|
|
public static void OnVirtueUsed( Mobile from )
|
|
{
|
|
if ( !from.CheckAlive() )
|
|
return;
|
|
|
|
PlayerMobile protector = from as PlayerMobile;
|
|
|
|
if ( protector == null )
|
|
return;
|
|
|
|
if ( !VirtueHelper.IsSeeker( protector, VirtueName.Justice ) )
|
|
{
|
|
protector.SendLocalizedMessage( 1049610 ); // You must reach the first path in this virtue to invoke it.
|
|
}
|
|
else if ( !protector.CanBeginAction( typeof( JusticeVirtue ) ) )
|
|
{
|
|
protector.SendLocalizedMessage( 1049370 ); // You must wait a while before offering your protection again.
|
|
}
|
|
else if ( protector.JusticeProtectors.Count > 0 )
|
|
{
|
|
protector.SendLocalizedMessage( 1049542 ); // You cannot protect someone while being protected.
|
|
}
|
|
else if ( protector.Map != Map.Felucca )
|
|
{
|
|
protector.SendLocalizedMessage( 1049372 ); // You cannot use this ability here.
|
|
}
|
|
else
|
|
{
|
|
protector.BeginTarget( 14, false, TargetFlags.None, new TargetCallback( OnVirtueTargeted ) );
|
|
protector.SendLocalizedMessage( 1049366 ); // Choose the player you wish to protect.
|
|
}
|
|
}
|
|
|
|
public static void OnVirtueTargeted( Mobile from, object obj )
|
|
{
|
|
PlayerMobile protector = from as PlayerMobile;
|
|
PlayerMobile pm = obj as PlayerMobile;
|
|
|
|
if ( protector == null )
|
|
return;
|
|
|
|
if ( !VirtueHelper.IsSeeker( protector, VirtueName.Justice ) )
|
|
protector.SendLocalizedMessage( 1049610 ); // You must reach the first path in this virtue to invoke it.
|
|
else if ( !protector.CanBeginAction( typeof( JusticeVirtue ) ) )
|
|
protector.SendLocalizedMessage( 1049370 ); // You must wait a while before offering your protection again.
|
|
else if ( protector.JusticeProtectors.Count > 0 )
|
|
protector.SendLocalizedMessage( 1049542 ); // You cannot protect someone while being protected.
|
|
else if ( protector.Map != Map.Felucca )
|
|
protector.SendLocalizedMessage( 1049372 ); // You cannot use this ability here.
|
|
else if ( pm == null )
|
|
protector.SendLocalizedMessage( 1049678 ); // Only players can be protected.
|
|
else if ( pm.Map != Map.Felucca )
|
|
protector.SendLocalizedMessage( 1049372 ); // You cannot use this ability here.
|
|
else if ( pm == protector || pm.Criminal || pm.Kills >= 5 )
|
|
protector.SendLocalizedMessage( 1049436 ); // That player cannot be protected.
|
|
else if ( pm.JusticeProtectors.Count > 0 )
|
|
protector.SendLocalizedMessage( 1049369 ); // You cannot protect that player right now.
|
|
else if ( pm.HasGump( typeof( AcceptProtectorGump ) ) )
|
|
protector.SendLocalizedMessage( 1049369 ); // You cannot protect that player right now.
|
|
else
|
|
pm.SendGump( new AcceptProtectorGump( protector, pm ) );
|
|
}
|
|
|
|
public static void OnVirtueAccepted( PlayerMobile protector, PlayerMobile protectee )
|
|
{
|
|
if ( !VirtueHelper.IsSeeker( protector, VirtueName.Justice ) )
|
|
{
|
|
protector.SendLocalizedMessage( 1049610 ); // You must reach the first path in this virtue to invoke it.
|
|
}
|
|
else if ( !protector.CanBeginAction( typeof( JusticeVirtue ) ) )
|
|
{
|
|
protector.SendLocalizedMessage( 1049370 ); // You must wait a while before offering your protection again.
|
|
}
|
|
else if ( protector.JusticeProtectors.Count > 0 )
|
|
{
|
|
protector.SendLocalizedMessage( 1049542 ); // You cannot protect someone while being protected.
|
|
}
|
|
else if ( protector.Map != Map.Felucca )
|
|
{
|
|
protector.SendLocalizedMessage( 1049372 ); // You cannot use this ability here.
|
|
}
|
|
else if ( protectee.Map != Map.Felucca )
|
|
{
|
|
protector.SendLocalizedMessage( 1049372 ); // You cannot use this ability here.
|
|
}
|
|
else if ( protectee == protector || protectee.Criminal || protectee.Kills >= 5 )
|
|
{
|
|
protector.SendLocalizedMessage( 1049436 ); // That player cannot be protected.
|
|
}
|
|
else if ( protectee.JusticeProtectors.Count > 0 )
|
|
{
|
|
protector.SendLocalizedMessage( 1049369 ); // You cannot protect that player right now.
|
|
}
|
|
else
|
|
{
|
|
protectee.JusticeProtectors.Add( protector );
|
|
|
|
string args = String.Format( "{0}\t{1}", protector.Name, protectee.Name );
|
|
|
|
protectee.SendLocalizedMessage( 1049451, args ); // You are now being protected by ~1_NAME~.
|
|
protector.SendLocalizedMessage( 1049452, args ); // You are now protecting ~2_NAME~.
|
|
}
|
|
}
|
|
|
|
public static void OnVirtueRejected( PlayerMobile protector, PlayerMobile protectee )
|
|
{
|
|
string args = String.Format( "{0}\t{1}", protector.Name, protectee.Name );
|
|
|
|
protectee.SendLocalizedMessage( 1049453, args ); // You have declined protection from ~1_NAME~.
|
|
protector.SendLocalizedMessage( 1049454, args ); // ~2_NAME~ has declined your protection.
|
|
|
|
if ( protector.BeginAction( typeof( JusticeVirtue ) ) )
|
|
Timer.DelayCall( TimeSpan.FromMinutes( 15.0 ), new TimerStateCallback( RejectDelay_Callback ), protector );
|
|
}
|
|
|
|
public static void RejectDelay_Callback( object state )
|
|
{
|
|
Mobile m = state as Mobile;
|
|
|
|
if ( m != null )
|
|
m.EndAction( typeof( JusticeVirtue ) );
|
|
}
|
|
|
|
public static void CheckAtrophy( Mobile from )
|
|
{
|
|
PlayerMobile pm = from as PlayerMobile;
|
|
|
|
if ( pm == null )
|
|
return;
|
|
|
|
try
|
|
{
|
|
if ( (pm.LastJusticeLoss + LossDelay) < DateTime.UtcNow )
|
|
{
|
|
if ( VirtueHelper.Atrophy( from, VirtueName.Justice, LossAmount ) )
|
|
from.SendLocalizedMessage( 1049373 ); // You have lost some Justice.
|
|
|
|
pm.LastJusticeLoss = DateTime.UtcNow;
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
}
|
|
}
|
|
|
|
public class AcceptProtectorGump : Gump
|
|
{
|
|
private PlayerMobile m_Protector;
|
|
private PlayerMobile m_Protectee;
|
|
|
|
public AcceptProtectorGump( PlayerMobile protector, PlayerMobile protectee ) : base( 150, 50 )
|
|
{
|
|
m_Protector = protector;
|
|
m_Protectee = protectee;
|
|
|
|
Closable = false;
|
|
|
|
AddPage( 0 );
|
|
|
|
AddBackground( 0, 0, 396, 218, 3600 );
|
|
|
|
AddImageTiled( 15, 15, 365, 190, 2624 );
|
|
AddAlphaRegion( 15, 15, 365, 190 );
|
|
|
|
AddHtmlLocalized( 30, 20, 360, 25, 1049365, 0x7FFF, false, false ); // Another player is offering you their <a href="?ForceTopic88">protection</a>:
|
|
AddLabel( 90, 55, 1153, protector.Name );
|
|
|
|
AddImage( 50, 45, 9005 );
|
|
AddImageTiled( 80, 80, 200, 1, 9107 );
|
|
AddImageTiled( 95, 82, 200, 1, 9157 );
|
|
|
|
AddRadio( 30, 110, 9727, 9730, true, 1 );
|
|
AddHtmlLocalized( 65, 115, 300, 25, 1049444, 0x7FFF, false, false ); // Yes, I would like their protection.
|
|
|
|
AddRadio( 30, 145, 9727, 9730, false, 0 );
|
|
AddHtmlLocalized( 65, 148, 300, 25, 1049445, 0x7FFF, false, false ); // No thanks, I can take care of myself.
|
|
|
|
AddButton( 160, 175, 247, 248, 2, GumpButtonType.Reply, 0 );
|
|
|
|
AddImage( 215, 0, 50581 );
|
|
|
|
AddImageTiled( 15, 14, 365, 1, 9107 );
|
|
AddImageTiled( 380, 14, 1, 190, 9105 );
|
|
AddImageTiled( 15, 205, 365, 1, 9107 );
|
|
AddImageTiled( 15, 14, 1, 190, 9105 );
|
|
AddImageTiled( 0, 0, 395, 1, 9157 );
|
|
AddImageTiled( 394, 0, 1, 217, 9155 );
|
|
AddImageTiled( 0, 216, 395, 1, 9157 );
|
|
AddImageTiled( 0, 0, 1, 217, 9155 );
|
|
}
|
|
|
|
public override void OnResponse( Server.Network.NetState sender, RelayInfo info )
|
|
{
|
|
if ( info.ButtonID == 2 )
|
|
{
|
|
bool okay = info.IsSwitched( 1 );
|
|
|
|
if ( okay )
|
|
JusticeVirtue.OnVirtueAccepted( m_Protector, m_Protectee );
|
|
else
|
|
JusticeVirtue.OnVirtueRejected( m_Protector, m_Protectee );
|
|
}
|
|
}
|
|
}
|
|
} |