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 protection: 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 ); } } } }