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
138 lines
No EOL
3.5 KiB
C#
138 lines
No EOL
3.5 KiB
C#
using System;
|
|
using System.Collections;
|
|
using Server;
|
|
using Server.Items;
|
|
using Server.Gumps;
|
|
using Server.Mobiles;
|
|
using Server.Targeting;
|
|
using Server.Engines.CannedEvil;
|
|
|
|
namespace Server
|
|
{
|
|
public class ValorVirtue
|
|
{
|
|
private static TimeSpan LossDelay = TimeSpan.FromDays( 7.0 );
|
|
private const int LossAmount = 250;
|
|
|
|
public static void Initialize()
|
|
{
|
|
VirtueGump.Register( 112, new OnVirtueUsed( OnVirtueUsed ) );
|
|
}
|
|
|
|
public static void OnVirtueUsed( Mobile from )
|
|
{
|
|
if( from.Alive )
|
|
{
|
|
from.SendLocalizedMessage( 1054034 ); // Target the Champion Idol of the Champion you wish to challenge!.
|
|
from.Target = new InternalTarget();
|
|
}
|
|
}
|
|
|
|
public static void CheckAtrophy( Mobile from )
|
|
{
|
|
PlayerMobile pm = from as PlayerMobile;
|
|
|
|
if( pm == null )
|
|
return;
|
|
|
|
try
|
|
{
|
|
if( (pm.LastValorLoss + LossDelay) < DateTime.UtcNow )
|
|
{
|
|
if( VirtueHelper.Atrophy( from, VirtueName.Valor, LossAmount ) )
|
|
from.SendLocalizedMessage( 1054040 ); // You have lost some Valor.
|
|
|
|
pm.LastValorLoss = DateTime.UtcNow;
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
}
|
|
|
|
public static void Valor( Mobile from, object targ )
|
|
{
|
|
IdolOfTheChampion idol = targ as IdolOfTheChampion;
|
|
|
|
if( idol == null || idol.Deleted || idol.Spawn == null || idol.Spawn.Deleted )
|
|
from.SendLocalizedMessage( 1054035 ); // You must target a Champion Idol to challenge the Champion's spawn!
|
|
else if( from.Hidden )
|
|
from.SendLocalizedMessage( 1052015 ); // You cannot do that while hidden.
|
|
else if( idol.Spawn.HasBeenAdvanced )
|
|
from.SendLocalizedMessage( 1054038 ); // The Champion of this region has already been challenged!
|
|
else
|
|
{
|
|
VirtueLevel vl = VirtueHelper.GetLevel( from, VirtueName.Valor );
|
|
if( idol.Spawn.Active )
|
|
{
|
|
if( idol.Spawn.Champion != null ) //TODO: Message?
|
|
return;
|
|
|
|
int needed, consumed;
|
|
switch( idol.Spawn.GetSubLevel() )
|
|
{
|
|
case 0:
|
|
{
|
|
needed = consumed = 2500;
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
needed = consumed = 5000;
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
needed = 10000;
|
|
consumed = 7500;
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
needed = 20000;
|
|
consumed = 10000;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if( from.Virtues.GetValue( (int)VirtueName.Valor ) >= needed )
|
|
{
|
|
VirtueHelper.Atrophy( from, VirtueName.Valor, consumed );
|
|
from.SendLocalizedMessage( 1054037 ); // Your challenge is heard by the Champion of this region! Beware its wrath!
|
|
idol.Spawn.HasBeenAdvanced = true;
|
|
idol.Spawn.AdvanceLevel();
|
|
}
|
|
else
|
|
from.SendLocalizedMessage( 1054039 ); // The Champion of this region ignores your challenge. You must further prove your valor.
|
|
}
|
|
else
|
|
{
|
|
if( vl == VirtueLevel.Knight )
|
|
{
|
|
VirtueHelper.Atrophy( from, VirtueName.Valor, 11000 );
|
|
from.SendLocalizedMessage( 1054037 ); // Your challenge is heard by the Champion of this region! Beware its wrath!
|
|
idol.Spawn.EndRestart();
|
|
idol.Spawn.HasBeenAdvanced = true;
|
|
}
|
|
else
|
|
{
|
|
from.SendLocalizedMessage( 1054036 ); // You must be a Knight of Valor to summon the champion's spawn in this manner!
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
private class InternalTarget : Target
|
|
{
|
|
public InternalTarget() : base( 14, false, TargetFlags.None )
|
|
{
|
|
}
|
|
|
|
protected override void OnTarget( Mobile from, object targeted )
|
|
{
|
|
Valor( from, targeted );
|
|
}
|
|
}
|
|
}
|
|
} |