- Code cleaning, consolidation and bugfixing of special scrolls (powerscroll/statscroll/transcendence/alacrity).
--> Fixed a bug preventing SoT not being spawned in Malas champion spawns (i.e. Bedlam Crypt) (http://www.uodemise.com/discussion/showthread.php?t=135520) - Added contextual menu entries to add players in party, and kicking them from house (friends can be kicked if in ML environment). Timeout to accept party invite is increased to 30 seconds as per OSI (http://www.uodemise.com/discussion/showthread.php?t=120724) - Runebeetles can be angered during taming attempts (http://www.uodemise.com/discussion/showthread.php?t=137677) - You can cook near forges (http://www.uodemise.com/discussion/showthread.php?t=137731)
This commit is contained in:
parent
bab1490105
commit
fe6c18a2d4
14 changed files with 644 additions and 1047 deletions
23
Scripts/Context Menus/AddToParty.cs
Normal file
23
Scripts/Context Menus/AddToParty.cs
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
using System;
|
||||
using Server.Mobiles;
|
||||
using Server.Engines.PartySystem;
|
||||
|
||||
namespace Server.ContextMenus
|
||||
{
|
||||
public class AddToPartyEntry : ContextMenuEntry
|
||||
{
|
||||
private Mobile m_From;
|
||||
private Mobile m_Target;
|
||||
|
||||
public AddToPartyEntry( Mobile from, Mobile target ) : base( 0197, 12 )
|
||||
{
|
||||
m_From = from;
|
||||
m_Target = target;
|
||||
}
|
||||
|
||||
public override void OnClick()
|
||||
{
|
||||
Party.Invite( m_From, m_Target );
|
||||
}
|
||||
}
|
||||
}
|
||||
31
Scripts/Context Menus/EjectPlayer.cs
Normal file
31
Scripts/Context Menus/EjectPlayer.cs
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
using System;
|
||||
using Server.Mobiles;
|
||||
using Server.Multis;
|
||||
|
||||
namespace Server.ContextMenus
|
||||
{
|
||||
public class EjectPlayerEntry : ContextMenuEntry
|
||||
{
|
||||
private Mobile m_From;
|
||||
private Mobile m_Target;
|
||||
private BaseHouse m_TargetHouse;
|
||||
|
||||
public EjectPlayerEntry( Mobile from, Mobile target ) : base( 6206, 12 )
|
||||
{
|
||||
m_From = from;
|
||||
m_Target = target;
|
||||
m_TargetHouse = BaseHouse.FindHouseAt( m_Target );
|
||||
}
|
||||
|
||||
public override void OnClick()
|
||||
{
|
||||
if ( !m_From.Alive || m_TargetHouse.Deleted || !m_TargetHouse.IsFriend( m_From ) )
|
||||
return;
|
||||
|
||||
if ( m_Target is Mobile )
|
||||
{
|
||||
m_TargetHouse.Kick( m_From, (Mobile)m_Target );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -388,135 +388,74 @@ namespace Server.Engines.CannedEvil
|
|||
}
|
||||
|
||||
#region Scroll of Transcendence
|
||||
private ScrollofTranscendence CreateRandomTramSoT()
|
||||
private ScrollofTranscendence CreateRandomSoT( bool felucca )
|
||||
{
|
||||
int level;
|
||||
double random = Utility.RandomDouble();
|
||||
|
||||
if (0.2 >= random)
|
||||
level = 5;
|
||||
else if (0.4 >= random)
|
||||
level = 4;
|
||||
else if (0.6 >= random)
|
||||
level = 3;
|
||||
else if (0.8 >= random)
|
||||
level = 2;
|
||||
else
|
||||
level = 1;
|
||||
int level = Utility.RandomMinMax( 1, 5 );
|
||||
|
||||
if ( felucca )
|
||||
level += 5;
|
||||
|
||||
return ScrollofTranscendence.CreateRandom(level, level);
|
||||
}
|
||||
#endregion
|
||||
|
||||
private ScrollofTranscendence CreateRandomFelSoT()
|
||||
public static void GiveScrollTo( Mobile killer, SpecialScroll scroll )
|
||||
{
|
||||
int level;
|
||||
double random = Utility.RandomDouble();
|
||||
|
||||
if (0.2 >= random)
|
||||
level = 10;
|
||||
else if (0.4 >= random)
|
||||
level = 9;
|
||||
else if (0.6 >= random)
|
||||
level = 8;
|
||||
else if (0.8 >= random)
|
||||
level = 7;
|
||||
else
|
||||
level = 6;
|
||||
|
||||
return ScrollofTranscendence.CreateRandom(level, level);
|
||||
}
|
||||
|
||||
private PowerScroll CreateRandomFelPS()
|
||||
{
|
||||
return PowerScroll.CreateRandomNoCraft(5, 5);
|
||||
}
|
||||
|
||||
public static void GiveScrollOfTranscendenceFelTo ( Mobile killer, ScrollofTranscendence SoTF )
|
||||
{
|
||||
if( SoTF == null || killer == null ) //sanity
|
||||
if( scroll == null || killer == null ) //sanity
|
||||
return;
|
||||
|
||||
killer.SendLocalizedMessage( 1094936 ); // You have received a Scroll of Transcendence!
|
||||
if ( scroll is ScrollofTranscendence )
|
||||
killer.SendLocalizedMessage( 1094936 ); // You have received a Scroll of Transcendence!
|
||||
else
|
||||
killer.SendLocalizedMessage( 1049524 ); // You have received a scroll of power!
|
||||
|
||||
if ( killer.Alive )
|
||||
killer.AddToBackpack( SoTF );
|
||||
killer.AddToBackpack( scroll );
|
||||
else
|
||||
{
|
||||
if( killer.Corpse != null && !killer.Corpse.Deleted )
|
||||
killer.Corpse.DropItem( SoTF );
|
||||
killer.Corpse.DropItem( scroll );
|
||||
else
|
||||
killer.AddToBackpack( SoTF );
|
||||
killer.AddToBackpack( scroll );
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Justice reward
|
||||
PlayerMobile pm = (PlayerMobile)killer;
|
||||
for (int j = 0; j < pm.JusticeProtectors.Count; ++j)
|
||||
{
|
||||
Mobile prot = (Mobile)pm.JusticeProtectors[j];
|
||||
if (prot.Map != killer.Map || prot.Kills >= 5 || prot.Criminal || !JusticeVirtue.CheckMapRegion(killer, prot))
|
||||
continue;
|
||||
|
||||
int chance = 0;
|
||||
|
||||
switch (VirtueHelper.GetLevel(prot, VirtueName.Justice))
|
||||
{
|
||||
case VirtueLevel.Seeker: chance = 60; break;
|
||||
case VirtueLevel.Follower: chance = 80; break;
|
||||
case VirtueLevel.Knight: chance = 100; break;
|
||||
}
|
||||
|
||||
if (chance > Utility.Random(100))
|
||||
{
|
||||
prot.SendLocalizedMessage(1049368); // You have been rewarded for your dedication to Justice!
|
||||
ScrollofTranscendence SoTFduplicate = new ScrollofTranscendence ( SoTF.Skill, SoTF.Value );
|
||||
prot.AddToBackpack( SoTFduplicate );
|
||||
}
|
||||
}
|
||||
}
|
||||
public static void GivePowerScrollFelTo ( Mobile killer, PowerScroll PS )
|
||||
{
|
||||
if( PS == null || killer == null ) //sanity
|
||||
return;
|
||||
|
||||
killer.SendLocalizedMessage(1049524); // You have received a scroll of power!
|
||||
|
||||
if ( killer.Alive )
|
||||
killer.AddToBackpack( PS );
|
||||
else
|
||||
{
|
||||
if( killer.Corpse != null && !killer.Corpse.Deleted )
|
||||
killer.Corpse.DropItem( PS );
|
||||
else
|
||||
killer.AddToBackpack( PS );
|
||||
}
|
||||
|
||||
// Justice reward
|
||||
PlayerMobile pm = (PlayerMobile)killer;
|
||||
for (int j = 0; j < pm.JusticeProtectors.Count; ++j)
|
||||
{
|
||||
Mobile prot = (Mobile)pm.JusticeProtectors[j];
|
||||
if (prot.Map != killer.Map || prot.Kills >= 5 || prot.Criminal || !JusticeVirtue.CheckMapRegion(killer, prot))
|
||||
|
||||
if ( prot.Map != killer.Map || prot.Kills >= 5 || prot.Criminal || !JusticeVirtue.CheckMapRegion( killer, prot ) )
|
||||
continue;
|
||||
|
||||
int chance = 0;
|
||||
|
||||
switch (VirtueHelper.GetLevel(prot, VirtueName.Justice))
|
||||
switch ( VirtueHelper.GetLevel( prot, VirtueName.Justice ) )
|
||||
{
|
||||
case VirtueLevel.Seeker: chance = 60; break;
|
||||
case VirtueLevel.Follower: chance = 80; break;
|
||||
case VirtueLevel.Knight: chance = 100; break;
|
||||
}
|
||||
|
||||
if (chance > Utility.Random(100))
|
||||
if ( chance > Utility.Random( 100 ) )
|
||||
{
|
||||
prot.SendLocalizedMessage(1049368); // You have been rewarded for your dedication to Justice!
|
||||
PowerScroll PSduplicate = new PowerScroll ( PS.Skill, PS.Value );
|
||||
prot.AddToBackpack( PSduplicate );
|
||||
try
|
||||
{
|
||||
prot.SendLocalizedMessage( 1049368 ); // You have been rewarded for your dedication to Justice!
|
||||
|
||||
SpecialScroll scrollDupe = Activator.CreateInstance( scroll.GetType() ) as SpecialScroll;
|
||||
|
||||
if ( scrollDupe != null )
|
||||
{
|
||||
scrollDupe.Skill = scroll.Skill;
|
||||
scrollDupe.Value = scroll.Value;
|
||||
prot.AddToBackpack( scrollDupe );
|
||||
}
|
||||
}
|
||||
catch{}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
public void OnSlice()
|
||||
{
|
||||
|
|
@ -588,23 +527,23 @@ namespace Server.Engines.CannedEvil
|
|||
|
||||
if ( random <= 24 )
|
||||
{
|
||||
ScrollofTranscendence SoTF = CreateRandomFelSoT();
|
||||
GiveScrollOfTranscendenceFelTo ( pm, SoTF );
|
||||
ScrollofTranscendence SoTF = CreateRandomSoT( true );
|
||||
GiveScrollTo( pm, (SpecialScroll)SoTF );
|
||||
}
|
||||
else
|
||||
{
|
||||
PowerScroll PS = CreateRandomFelPS();
|
||||
GivePowerScrollFelTo ( pm, PS );
|
||||
PowerScroll PS = PowerScroll.CreateRandomNoCraft(5, 5);
|
||||
GiveScrollTo( pm, (SpecialScroll)PS );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( Map == Map.Ilshenar || Map == Map.Tokuno )
|
||||
if ( Map == Map.Ilshenar || Map == Map.Tokuno || Map == Map.Malas )
|
||||
{
|
||||
if ( Utility.RandomDouble() < 0.0015 )
|
||||
{
|
||||
killer.SendLocalizedMessage( 1094936 ); // You have received a Scroll of Transcendence!
|
||||
ScrollofTranscendence SoTT = CreateRandomTramSoT();
|
||||
ScrollofTranscendence SoTT = CreateRandomSoT( false );
|
||||
killer.AddToBackpack( SoTT );
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -295,7 +295,10 @@ namespace Server.Engines.Craft
|
|||
0x184E, 0x1850, // Heating stand (right)
|
||||
0x398C, 0x399F, // Fire field
|
||||
0x2DDB, 0x2DDC, //Elven stove
|
||||
0x19AA, 0x19BB // Veteran Reward Brazier
|
||||
0x19AA, 0x19BB, // Veteran Reward Brazier
|
||||
0x197A, 0x19A9, // Large Forge
|
||||
0x0FB1, 0x0FB1, // Small Forge
|
||||
0x2DD8, 0x2DD8 // Elven Forge
|
||||
};
|
||||
|
||||
private static int[] m_Ovens = new int[]
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ namespace Server.Engines.PartySystem
|
|||
t.Start();
|
||||
}
|
||||
|
||||
private DeclineTimer( Mobile m, Mobile leader ) : base( TimeSpan.FromSeconds( 10.0 ) )
|
||||
private DeclineTimer( Mobile m, Mobile leader ) : base( TimeSpan.FromSeconds( 30.0 ) )
|
||||
{
|
||||
m_Mobile = m;
|
||||
m_Leader = leader;
|
||||
|
|
|
|||
|
|
@ -2,14 +2,35 @@ using System;
|
|||
using Server;
|
||||
using Server.Gumps;
|
||||
using Server.Network;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Server.Items
|
||||
{
|
||||
public class PowerScroll : Item
|
||||
public class PowerScroll : SpecialScroll
|
||||
{
|
||||
private SkillName m_Skill;
|
||||
private double m_Value;
|
||||
|
||||
public override int Message { get { return 1049469; } } /* Using a scroll increases the maximum amount of a specific skill or your maximum statistics.
|
||||
* When used, the effect is not immediately seen without a gain of points with that skill or statistics.
|
||||
* You can view your maximum skill values in your skills window.
|
||||
* You can view your maximum statistic value in your statistics window. */
|
||||
public override int Title
|
||||
{
|
||||
get
|
||||
{
|
||||
double level = ( Value - 105.0 ) / 5.0;
|
||||
|
||||
if ( level >= 0.0 && level <= 3.0 && Value % 5.0 == 0.0 )
|
||||
return 1049635 + (int)level; /* Wonderous Scroll (105 Skill): OR
|
||||
* Exalted Scroll (110 Skill): OR
|
||||
* Mythical Scroll (115 Skill): OR
|
||||
* Legendary Scroll (120 Skill): */
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
public override string DefaultTitle{ get{ return String.Format( "<basefont color=#FFFFFF>Power Scroll ({0} Skill):</basefont>", Value ); } }
|
||||
|
||||
private static SkillName[] m_Skills = new SkillName[]
|
||||
{
|
||||
SkillName.Blacksmith,
|
||||
|
|
@ -38,28 +59,6 @@ namespace Server.Items
|
|||
|
||||
private static SkillName[] m_AOSSkills = new SkillName[]
|
||||
{
|
||||
SkillName.Blacksmith,
|
||||
SkillName.Tailoring,
|
||||
SkillName.Swords,
|
||||
SkillName.Fencing,
|
||||
SkillName.Macing,
|
||||
SkillName.Archery,
|
||||
SkillName.Wrestling,
|
||||
SkillName.Parry,
|
||||
SkillName.Tactics,
|
||||
SkillName.Anatomy,
|
||||
SkillName.Healing,
|
||||
SkillName.Magery,
|
||||
SkillName.Meditation,
|
||||
SkillName.EvalInt,
|
||||
SkillName.MagicResist,
|
||||
SkillName.AnimalTaming,
|
||||
SkillName.AnimalLore,
|
||||
SkillName.Veterinary,
|
||||
SkillName.Musicianship,
|
||||
SkillName.Provocation,
|
||||
SkillName.Discordance,
|
||||
SkillName.Peacemaking,
|
||||
SkillName.Chivalry,
|
||||
SkillName.Focus,
|
||||
SkillName.Necromancy,
|
||||
|
|
@ -70,242 +69,132 @@ namespace Server.Items
|
|||
|
||||
private static SkillName[] m_SESkills = new SkillName[]
|
||||
{
|
||||
SkillName.Blacksmith,
|
||||
SkillName.Tailoring,
|
||||
SkillName.Swords,
|
||||
SkillName.Fencing,
|
||||
SkillName.Macing,
|
||||
SkillName.Archery,
|
||||
SkillName.Wrestling,
|
||||
SkillName.Parry,
|
||||
SkillName.Tactics,
|
||||
SkillName.Anatomy,
|
||||
SkillName.Healing,
|
||||
SkillName.Magery,
|
||||
SkillName.Meditation,
|
||||
SkillName.EvalInt,
|
||||
SkillName.MagicResist,
|
||||
SkillName.AnimalTaming,
|
||||
SkillName.AnimalLore,
|
||||
SkillName.Veterinary,
|
||||
SkillName.Musicianship,
|
||||
SkillName.Provocation,
|
||||
SkillName.Discordance,
|
||||
SkillName.Peacemaking,
|
||||
SkillName.Chivalry,
|
||||
SkillName.Focus,
|
||||
SkillName.Necromancy,
|
||||
SkillName.Stealing,
|
||||
SkillName.Stealth,
|
||||
SkillName.SpiritSpeak,
|
||||
SkillName.Ninjitsu,
|
||||
SkillName.Bushido
|
||||
};
|
||||
|
||||
private static List<SkillName> _Skills = new List<SkillName>();
|
||||
|
||||
private static SkillName[] m_MLSkills = new SkillName[]
|
||||
public static List<SkillName> Skills
|
||||
{
|
||||
get
|
||||
{
|
||||
SkillName.Blacksmith,
|
||||
SkillName.Tailoring,
|
||||
SkillName.Swords,
|
||||
SkillName.Fencing,
|
||||
SkillName.Macing,
|
||||
SkillName.Archery,
|
||||
SkillName.Wrestling,
|
||||
SkillName.Parry,
|
||||
SkillName.Tactics,
|
||||
SkillName.Anatomy,
|
||||
SkillName.Healing,
|
||||
SkillName.Magery,
|
||||
SkillName.Meditation,
|
||||
SkillName.EvalInt,
|
||||
SkillName.MagicResist,
|
||||
SkillName.AnimalTaming,
|
||||
SkillName.AnimalLore,
|
||||
SkillName.Veterinary,
|
||||
SkillName.Musicianship,
|
||||
SkillName.Provocation,
|
||||
SkillName.Discordance,
|
||||
SkillName.Peacemaking,
|
||||
SkillName.Chivalry,
|
||||
SkillName.Focus,
|
||||
SkillName.Necromancy,
|
||||
SkillName.Stealing,
|
||||
SkillName.Stealth,
|
||||
SkillName.SpiritSpeak,
|
||||
SkillName.Ninjitsu,
|
||||
SkillName.Bushido,
|
||||
SkillName.Spellweaving
|
||||
};
|
||||
|
||||
public static SkillName[] Skills{ get{ return ( Core.ML ? m_MLSkills : Core.SE ? m_SESkills : Core.AOS ? m_AOSSkills : m_Skills ); } }
|
||||
if ( _Skills.Count == 0 )
|
||||
{
|
||||
switch ( Core.Expansion )
|
||||
{
|
||||
case Expansion.ML: _Skills.Add( SkillName.Spellweaving ); goto case Expansion.SE;
|
||||
case Expansion.SE: _Skills.AddRange( m_SESkills ); goto case Expansion.AOS;
|
||||
case Expansion.AOS: _Skills.AddRange( m_AOSSkills ); goto default;
|
||||
default: _Skills.AddRange( m_Skills ); break;
|
||||
}
|
||||
}
|
||||
|
||||
return _Skills;
|
||||
}
|
||||
}
|
||||
|
||||
public static PowerScroll CreateRandom( int min, int max )
|
||||
{
|
||||
min /= 5;
|
||||
max /= 5;
|
||||
|
||||
SkillName[] skills = PowerScroll.Skills;
|
||||
|
||||
return new PowerScroll( skills[Utility.Random( skills.Length )], 100 + (Utility.RandomMinMax( min, max ) * 5));
|
||||
|
||||
return new PowerScroll( Skills[Utility.Random( Skills.Count )], 100 + ( Utility.RandomMinMax( min, max ) * 5 ) );
|
||||
}
|
||||
|
||||
public static PowerScroll CreateRandomNoCraft( int min, int max )
|
||||
{
|
||||
min /= 5;
|
||||
max /= 5;
|
||||
|
||||
SkillName[] skills = PowerScroll.Skills;
|
||||
|
||||
SkillName skillName;
|
||||
|
||||
do
|
||||
{
|
||||
skillName = skills[Utility.Random( skills.Length )];
|
||||
skillName = Skills[Utility.Random( Skills.Count )];
|
||||
} while ( skillName == SkillName.Blacksmith || skillName == SkillName.Tailoring );
|
||||
|
||||
return new PowerScroll( skillName, 100 + (Utility.RandomMinMax( min, max ) * 5));
|
||||
}
|
||||
|
||||
[Constructable]
|
||||
public PowerScroll( SkillName skill, double value ) : base( 0x14F0 )
|
||||
public PowerScroll() : this( SkillName.Alchemy, 0.0 )
|
||||
{
|
||||
base.Hue = 0x481;
|
||||
base.Weight = 1.0;
|
||||
|
||||
m_Skill = skill;
|
||||
m_Value = value;
|
||||
if ( m_Value > 105.0 )
|
||||
LootType = LootType.Cursed;
|
||||
}
|
||||
|
||||
[Constructable]
|
||||
public PowerScroll( SkillName skill, double value ) : base( skill, value )
|
||||
{
|
||||
Hue = 0x481;
|
||||
|
||||
if ( Value == 105.0 )
|
||||
LootType = LootType.Regular;
|
||||
}
|
||||
|
||||
public PowerScroll( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
[CommandProperty( AccessLevel.GameMaster )]
|
||||
public SkillName Skill
|
||||
|
||||
public override void AddNameProperty( ObjectPropertyList list )
|
||||
{
|
||||
get
|
||||
{
|
||||
return m_Skill;
|
||||
}
|
||||
set
|
||||
{
|
||||
m_Skill = value;
|
||||
}
|
||||
}
|
||||
|
||||
[CommandProperty( AccessLevel.GameMaster )]
|
||||
public double Value
|
||||
{
|
||||
get
|
||||
{
|
||||
return m_Value;
|
||||
}
|
||||
set
|
||||
{
|
||||
m_Value = value;
|
||||
}
|
||||
}
|
||||
|
||||
private string GetNameLocalized()
|
||||
{
|
||||
return String.Concat( "#", (1044060 + (int)m_Skill).ToString() );
|
||||
}
|
||||
|
||||
private string GetName()
|
||||
{
|
||||
int index = (int)m_Skill;
|
||||
SkillInfo[] table = SkillInfo.Table;
|
||||
|
||||
if ( index >= 0 && index < table.Length )
|
||||
return table[index].Name.ToLower();
|
||||
double level = ( Value - 105.0 ) / 5.0;
|
||||
|
||||
if ( level >= 0.0 && level <= 3.0 && Value % 5.0 == 0.0 )
|
||||
list.Add( 1049639 + (int)level, GetNameLocalized() ); /* a wonderous scroll of ~1_type~ (105 Skill) OR
|
||||
* an exalted scroll of ~1_type~ (110 Skill) OR
|
||||
* a mythical scroll of ~1_type~ (115 Skill) OR
|
||||
* a legendary scroll of ~1_type~ (120 Skill) */
|
||||
else
|
||||
return "???";
|
||||
}
|
||||
|
||||
public override void AddNameProperty(ObjectPropertyList list)
|
||||
{
|
||||
if ( m_Value == 105.0 )
|
||||
list.Add( 1049639, GetNameLocalized() ); // a wonderous scroll of ~1_type~ (105 Skill)
|
||||
else if ( m_Value == 110.0 )
|
||||
list.Add( 1049640, GetNameLocalized() ); // an exalted scroll of ~1_type~ (110 Skill)
|
||||
else if ( m_Value == 115.0 )
|
||||
list.Add( 1049641, GetNameLocalized() ); // a mythical scroll of ~1_type~ (115 Skill)
|
||||
else if ( m_Value == 120.0 )
|
||||
list.Add( 1049642, GetNameLocalized() ); // a legendary scroll of ~1_type~ (120 Skill)
|
||||
else
|
||||
list.Add( "a power scroll of {0} ({1} Skill)", GetName(), m_Value );
|
||||
list.Add( "a power scroll of {0} ({1} Skill)", GetName(), Value );
|
||||
}
|
||||
|
||||
public override void OnSingleClick( Mobile from )
|
||||
{
|
||||
if ( m_Value == 105.0 )
|
||||
base.LabelTo( from, 1049639, GetNameLocalized() ); // a wonderous scroll of ~1_type~ (105 Skill)
|
||||
else if ( m_Value == 110.0 )
|
||||
base.LabelTo( from, 1049640, GetNameLocalized() ); // an exalted scroll of ~1_type~ (110 Skill)
|
||||
else if ( m_Value == 115.0 )
|
||||
base.LabelTo( from, 1049641, GetNameLocalized() ); // a mythical scroll of ~1_type~ (115 Skill)
|
||||
else if ( m_Value == 120.0 )
|
||||
base.LabelTo( from, 1049642, GetNameLocalized() ); // a legendary scroll of ~1_type~ (120 Skill)
|
||||
double level = ( Value - 105.0 ) / 5.0;
|
||||
|
||||
if ( level >= 0.0 && level <= 3.0 && Value % 5.0 == 0.0 )
|
||||
base.LabelTo( from, 1049639 + (int)level, GetNameLocalized() );
|
||||
else
|
||||
base.LabelTo( from, "a power scroll of {0} ({1} Skill)", GetName(), m_Value );
|
||||
base.LabelTo( from, "a power scroll of {0} ({1} Skill)", GetName(), Value );
|
||||
}
|
||||
|
||||
public override bool CanUse( Mobile from )
|
||||
{
|
||||
if ( !base.CanUse( from ) )
|
||||
return false;
|
||||
|
||||
Skill skill = from.Skills[Skill];
|
||||
|
||||
if ( skill == null )
|
||||
return false;
|
||||
|
||||
if ( skill.Cap >= Value )
|
||||
{
|
||||
from.SendLocalizedMessage( 1049511, GetNameLocalized() ); // Your ~1_type~ is too high for this power scroll.
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void Use( Mobile from, bool firstStage )
|
||||
public override void Use( Mobile from )
|
||||
{
|
||||
if ( Deleted )
|
||||
if ( !CanUse( from ) )
|
||||
return;
|
||||
|
||||
from.SendLocalizedMessage( 1049513, GetNameLocalized() ); // You feel a surge of magic as the scroll enhances your ~1_type~!
|
||||
|
||||
if ( IsChildOf( from.Backpack ) )
|
||||
{
|
||||
Skill skill = from.Skills[m_Skill];
|
||||
from.Skills[Skill].Cap = Value;
|
||||
|
||||
if ( skill != null )
|
||||
{
|
||||
if ( skill.Cap >= m_Value )
|
||||
{
|
||||
from.SendLocalizedMessage( 1049511, GetNameLocalized() ); // Your ~1_type~ is too high for this power scroll.
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( firstStage )
|
||||
{
|
||||
from.CloseGump(typeof(StatCapScroll.InternalGump));
|
||||
from.CloseGump(typeof(PowerScroll.InternalGump));
|
||||
#region Scroll of Alacrity
|
||||
from.CloseGump(typeof(ScrollofAlacrity.InternalGump));
|
||||
#endregion
|
||||
from.SendGump(new InternalGump(from, this));
|
||||
}
|
||||
else
|
||||
{
|
||||
from.SendLocalizedMessage( 1049513, GetNameLocalized() ); // You feel a surge of magic as the scroll enhances your ~1_type~!
|
||||
Effects.SendLocationParticles( EffectItem.Create( from.Location, from.Map, EffectItem.DefaultDuration ), 0, 0, 0, 0, 0, 5060, 0 );
|
||||
Effects.PlaySound( from.Location, from.Map, 0x243 );
|
||||
|
||||
skill.Cap = m_Value;
|
||||
Effects.SendMovingParticles( new Entity( Serial.Zero, new Point3D( from.X - 6, from.Y - 6, from.Z + 15 ), from.Map ), from, 0x36D4, 7, 0, false, true, 0x497, 0, 9502, 1, 0, (EffectLayer)255, 0x100 );
|
||||
Effects.SendMovingParticles( new Entity( Serial.Zero, new Point3D( from.X - 4, from.Y - 6, from.Z + 15 ), from.Map ), from, 0x36D4, 7, 0, false, true, 0x497, 0, 9502, 1, 0, (EffectLayer)255, 0x100 );
|
||||
Effects.SendMovingParticles( new Entity( Serial.Zero, new Point3D( from.X - 6, from.Y - 4, from.Z + 15 ), from.Map ), from, 0x36D4, 7, 0, false, true, 0x497, 0, 9502, 1, 0, (EffectLayer)255, 0x100 );
|
||||
|
||||
Effects.SendLocationParticles( EffectItem.Create( from.Location, from.Map, EffectItem.DefaultDuration ), 0, 0, 0, 0, 0, 5060, 0 );
|
||||
Effects.PlaySound( from.Location, from.Map, 0x243 );
|
||||
Effects.SendTargetParticles( from, 0x375A, 35, 90, 0x00, 0x00, 9502, (EffectLayer)255, 0x100 );
|
||||
|
||||
Effects.SendMovingParticles( new Entity( Serial.Zero, new Point3D( from.X - 6, from.Y - 6, from.Z + 15 ), from.Map ), from, 0x36D4, 7, 0, false, true, 0x497, 0, 9502, 1, 0, (EffectLayer)255, 0x100 );
|
||||
Effects.SendMovingParticles( new Entity( Serial.Zero, new Point3D( from.X - 4, from.Y - 6, from.Z + 15 ), from.Map ), from, 0x36D4, 7, 0, false, true, 0x497, 0, 9502, 1, 0, (EffectLayer)255, 0x100 );
|
||||
Effects.SendMovingParticles( new Entity( Serial.Zero, new Point3D( from.X - 6, from.Y - 4, from.Z + 15 ), from.Map ), from, 0x36D4, 7, 0, false, true, 0x497, 0, 9502, 1, 0, (EffectLayer)255, 0x100 );
|
||||
|
||||
Effects.SendTargetParticles( from, 0x375A, 35, 90, 0x00, 0x00, 9502, (EffectLayer)255, 0x100 );
|
||||
|
||||
Delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
from.SendLocalizedMessage( 1042001 ); // That must be in your pack for you to use it.
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnDoubleClick( Mobile from )
|
||||
{
|
||||
Use( from, true );
|
||||
Delete();
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
|
|
@ -313,92 +202,22 @@ namespace Server.Items
|
|||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
|
||||
writer.Write( (int) m_Skill );
|
||||
writer.Write( (double) m_Value );
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
int version = ( InheritsItem ? 0 : reader.ReadInt() ); //Required for SpecialScroll insertion
|
||||
|
||||
switch ( version )
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
m_Skill = (SkillName)reader.ReadInt();
|
||||
m_Value = reader.ReadDouble();
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( m_Value == 105.0 )
|
||||
if ( Value == 105.0 )
|
||||
{
|
||||
LootType = LootType.Regular;
|
||||
}
|
||||
else
|
||||
{
|
||||
LootType = LootType.Cursed;
|
||||
|
||||
if ( Insured )
|
||||
Insured = false;
|
||||
}
|
||||
}
|
||||
|
||||
public class InternalGump : Gump
|
||||
{
|
||||
private Mobile m_Mobile;
|
||||
private PowerScroll m_Scroll;
|
||||
|
||||
public InternalGump( Mobile mobile, PowerScroll scroll ) : base( 25, 50 )
|
||||
{
|
||||
m_Mobile = mobile;
|
||||
m_Scroll = scroll;
|
||||
|
||||
AddPage( 0 );
|
||||
|
||||
AddBackground( 25, 10, 420, 200, 5054 );
|
||||
|
||||
AddImageTiled( 33, 20, 401, 181, 2624 );
|
||||
AddAlphaRegion( 33, 20, 401, 181 );
|
||||
|
||||
AddHtmlLocalized( 40, 48, 387, 100, 1049469, true, true ); /* Using a scroll increases the maximum amount of a specific skill or your maximum statistics.
|
||||
* When used, the effect is not immediately seen without a gain of points with that skill or statistics.
|
||||
* You can view your maximum skill values in your skills window.
|
||||
* You can view your maximum statistic value in your statistics window.
|
||||
*/
|
||||
|
||||
AddHtmlLocalized( 125, 148, 200, 20, 1049478, 0xFFFFFF, false, false ); // Do you wish to use this scroll?
|
||||
|
||||
AddButton( 100, 172, 4005, 4007, 1, GumpButtonType.Reply, 0 );
|
||||
AddHtmlLocalized( 135, 172, 120, 20, 1046362, 0xFFFFFF, false, false ); // Yes
|
||||
|
||||
AddButton( 275, 172, 4005, 4007, 0, GumpButtonType.Reply, 0 );
|
||||
AddHtmlLocalized( 310, 172, 120, 20, 1046363, 0xFFFFFF, false, false ); // No
|
||||
|
||||
double value = scroll.m_Value;
|
||||
|
||||
if ( value == 105.0 )
|
||||
AddHtmlLocalized( 40, 20, 260, 20, 1049635, 0xFFFFFF, false, false ); // Wonderous Scroll (105 Skill):
|
||||
else if ( value == 110.0 )
|
||||
AddHtmlLocalized( 40, 20, 260, 20, 1049636, 0xFFFFFF, false, false ); // Exalted Scroll (110 Skill):
|
||||
else if ( value == 115.0 )
|
||||
AddHtmlLocalized( 40, 20, 260, 20, 1049637, 0xFFFFFF, false, false ); // Mythical Scroll (115 Skill):
|
||||
else if ( value == 120.0 )
|
||||
AddHtmlLocalized( 40, 20, 260, 20, 1049638, 0xFFFFFF, false, false ); // Legendary Scroll (120 Skill):
|
||||
else
|
||||
AddHtml( 40, 20, 260, 20, String.Format( "<basefont color=#FFFFFF>Power Scroll ({0} Skill):</basefont>", value ), false, false );
|
||||
|
||||
AddHtmlLocalized( 310, 20, 120, 20, 1044060 + (int)scroll.m_Skill, 0xFFFFFF, false, false );
|
||||
}
|
||||
|
||||
public override void OnResponse( NetState state, RelayInfo info )
|
||||
{
|
||||
if ( info.ButtonID == 1 )
|
||||
m_Scroll.Use( m_Mobile, false );
|
||||
Insured = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,136 +29,51 @@ using System.Collections.Generic;
|
|||
|
||||
namespace Server.Items
|
||||
{
|
||||
public class ScrollofAlacrity : Item
|
||||
public class ScrollofAlacrity : SpecialScroll
|
||||
{
|
||||
public override int LabelNumber { get { return 1078604; } } // Scroll of Alacrity
|
||||
|
||||
public override int Message { get { return 1078602; } } /*Using a Scroll of Transcendence for a given skill will permanently increase your current
|
||||
*level in that skill by the amount of points displayed on the scroll.
|
||||
*As you may not gain skills beyond your maximum skill cap, any excess points will be lost.*/
|
||||
|
||||
public override string DefaultTitle { get { return String.Format( "<basefont color=#FFFFFF>Scroll of Alacrity:</basefont>" ); } }
|
||||
|
||||
private SkillName m_Skill;
|
||||
|
||||
private static SkillName[] m_Skills = new SkillName[]
|
||||
{
|
||||
SkillName.Alchemy,
|
||||
SkillName.Anatomy,
|
||||
SkillName.AnimalLore,
|
||||
SkillName.ItemID,
|
||||
SkillName.ArmsLore,
|
||||
SkillName.Parry,
|
||||
SkillName.Begging,
|
||||
SkillName.Blacksmith,
|
||||
SkillName.Fletching,
|
||||
SkillName.Peacemaking,
|
||||
SkillName.Camping,
|
||||
SkillName.Carpentry,
|
||||
SkillName.Cartography,
|
||||
SkillName.Cooking,
|
||||
SkillName.DetectHidden,
|
||||
SkillName.Discordance,
|
||||
SkillName.EvalInt,
|
||||
SkillName.Healing,
|
||||
SkillName.Fishing,
|
||||
SkillName.Forensics,
|
||||
SkillName.Herding,
|
||||
SkillName.Hiding,
|
||||
SkillName.Provocation,
|
||||
SkillName.Inscribe,
|
||||
SkillName.Lockpicking,
|
||||
SkillName.Magery,
|
||||
SkillName.MagicResist,
|
||||
SkillName.Tactics,
|
||||
SkillName.Snooping,
|
||||
SkillName.Musicianship,
|
||||
SkillName.Poisoning,
|
||||
SkillName.Archery,
|
||||
SkillName.SpiritSpeak,
|
||||
SkillName.Stealing,
|
||||
SkillName.Tailoring,
|
||||
SkillName.AnimalTaming,
|
||||
SkillName.TasteID,
|
||||
SkillName.Tinkering,
|
||||
SkillName.Tracking,
|
||||
SkillName.Veterinary,
|
||||
SkillName.Swords,
|
||||
SkillName.Macing,
|
||||
SkillName.Fencing,
|
||||
SkillName.Wrestling,
|
||||
SkillName.Lumberjacking,
|
||||
SkillName.Mining,
|
||||
SkillName.Meditation,
|
||||
SkillName.Stealth,
|
||||
SkillName.RemoveTrap,
|
||||
SkillName.Necromancy,
|
||||
SkillName.Focus,
|
||||
SkillName.Chivalry,
|
||||
SkillName.Bushido,
|
||||
SkillName.Ninjitsu,
|
||||
SkillName.Spellweaving
|
||||
};
|
||||
|
||||
public static SkillName[] Skills { get { return (m_Skills); } }
|
||||
|
||||
public ScrollofAlacrity() : this( SkillName.Alchemy )
|
||||
{
|
||||
}
|
||||
|
||||
[Constructable]
|
||||
public ScrollofAlacrity(SkillName skill)
|
||||
: base(0x14EF)
|
||||
public ScrollofAlacrity( SkillName skill ) : base( skill, 0.0 )
|
||||
{
|
||||
base.Hue = 0x4AB;
|
||||
base.Weight = 1.0;
|
||||
|
||||
LootType = LootType.Cursed;
|
||||
|
||||
m_Skill = skill;
|
||||
ItemID = 0x14EF;
|
||||
Hue = 0x4AB;
|
||||
}
|
||||
|
||||
public ScrollofAlacrity(Serial serial)
|
||||
: base(serial)
|
||||
public ScrollofAlacrity(Serial serial) : base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public SkillName Skill
|
||||
{
|
||||
get
|
||||
{
|
||||
return m_Skill;
|
||||
}
|
||||
set
|
||||
{
|
||||
m_Skill = value;
|
||||
}
|
||||
}
|
||||
|
||||
private string GetNameLocalized()
|
||||
{
|
||||
return String.Concat("#", (1044060 + (int)m_Skill).ToString());
|
||||
}
|
||||
|
||||
private string GetName()
|
||||
{
|
||||
int index = (int)m_Skill;
|
||||
SkillInfo[] table = SkillInfo.Table;
|
||||
|
||||
if (index >= 0 && index < table.Length)
|
||||
return table[index].Name.ToLower();
|
||||
else
|
||||
return "???";
|
||||
}
|
||||
|
||||
public override void GetProperties(ObjectPropertyList list)
|
||||
{
|
||||
base.GetProperties(list);
|
||||
|
||||
list.Add(1071345, "{0} 15 Minutes", GetName());// Skill: ~1_val~
|
||||
list.Add(1071345, "{0} 15 Minutes", GetName()); // Skill: ~1_val~
|
||||
}
|
||||
|
||||
public void Use(Mobile from, bool firstStage)
|
||||
|
||||
public override bool CanUse( Mobile from )
|
||||
{
|
||||
if ( !base.CanUse( from ) )
|
||||
return false;
|
||||
|
||||
PlayerMobile pm = from as PlayerMobile;
|
||||
|
||||
if (Deleted)
|
||||
return;
|
||||
|
||||
/* to add when skillgain quests will be implemented
|
||||
|
||||
if ( pm == null )
|
||||
return false;
|
||||
|
||||
#region Mondain's Legacy
|
||||
/* to add when skillgain quests will be implemented
|
||||
|
||||
for (int i = pm.Quests.Count - 1; i >= 0; i--)
|
||||
{
|
||||
BaseQuest quest = pm.Quests[i];
|
||||
|
|
@ -170,65 +85,59 @@ namespace Server.Items
|
|||
if (objective is ApprenticeObjective)
|
||||
{
|
||||
from.SendMessage("You are already under the effect of an enhanced skillgain quest.");
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
*/
|
||||
|
||||
if (!IsChildOf(from.Backpack))
|
||||
{
|
||||
from.SendLocalizedMessage(1042001); // That must be in your pack for you to use it.
|
||||
}
|
||||
|
||||
else if (pm.AcceleratedStart > DateTime.Now)
|
||||
#endregion
|
||||
|
||||
#region Scroll of Alacrity
|
||||
if (pm.AcceleratedStart > DateTime.Now)
|
||||
{
|
||||
from.SendLocalizedMessage(1077951); // You are already under the effect of an accelerated skillgain scroll.
|
||||
return false;
|
||||
}
|
||||
#endregion
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override void Use( Mobile from )
|
||||
{
|
||||
if ( !CanUse( from ) )
|
||||
return;
|
||||
|
||||
PlayerMobile pm = from as PlayerMobile;
|
||||
|
||||
if ( pm == null )
|
||||
return;
|
||||
|
||||
double tskill = from.Skills[Skill].Base;
|
||||
double tcap = from.Skills[Skill].Cap;
|
||||
|
||||
if ( tskill >= tcap || from.Skills[Skill].Lock != SkillLock.Up )
|
||||
{
|
||||
from.SendLocalizedMessage( 1094935 ); /*You cannot increase this skill at this time. The skill may be locked or set to lower in your skill menu.
|
||||
*If you are at your total skill cap, you must use a Powerscroll to increase your current skill cap.*/
|
||||
return;
|
||||
}
|
||||
|
||||
from.SendLocalizedMessage( 1077956 ); // You are infused with intense energy. You are under the effects of an accelerated skillgain scroll.
|
||||
|
||||
Effects.PlaySound( from.Location, from.Map, 0x1E9 );
|
||||
Effects.SendTargetParticles( from, 0x373A, 35, 45, 0x00, 0x00, 9502, (EffectLayer)255, 0x100 );
|
||||
|
||||
else
|
||||
{
|
||||
if (firstStage)
|
||||
{
|
||||
from.CloseGump(typeof(StatCapScroll.InternalGump));
|
||||
from.CloseGump(typeof(PowerScroll.InternalGump));
|
||||
from.CloseGump(typeof(ScrollofTranscendence.InternalGump));
|
||||
from.CloseGump(typeof(ScrollofAlacrity.InternalGump));
|
||||
from.SendGump(new InternalGump(from, this));
|
||||
}
|
||||
else
|
||||
{
|
||||
double tskill = from.Skills[m_Skill].Base;
|
||||
double tcap = from.Skills[m_Skill].Cap;
|
||||
pm.AcceleratedStart = DateTime.Now + TimeSpan.FromMinutes(15);
|
||||
|
||||
if (tskill >= tcap || from.Skills[m_Skill].Lock == SkillLock.Locked || from.Skills[m_Skill].Lock == SkillLock.Down)
|
||||
{
|
||||
from.SendLocalizedMessage(1094935); /*You cannot increase this skill at this time. The skill may be locked or set to lower in your skill menu.
|
||||
*If you are at your total skill cap, you must use a Powerscroll to increase your current skill cap.*/
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
Effects.PlaySound(from.Location, from.Map, 0x1E9);
|
||||
Timer t = (Timer)m_Table[from];
|
||||
|
||||
Effects.SendTargetParticles(from, 0x373A, 35, 45, 0x00, 0x00, 9502, (EffectLayer)255, 0x100);
|
||||
m_Table[from] = Timer.DelayCall( TimeSpan.FromMinutes( 15 ), new TimerStateCallback( Expire_Callback ), from );
|
||||
|
||||
from.SendLocalizedMessage(1077956); // You are infused with intense energy. You are under the effects of an accelerated skillgain scroll.
|
||||
pm.AcceleratedSkill = Skill;
|
||||
|
||||
pm.AcceleratedStart = DateTime.Now + TimeSpan.FromMinutes(15);
|
||||
|
||||
Timer t = (Timer)m_Table[from];
|
||||
|
||||
m_Table[from] = Timer.DelayCall(TimeSpan.FromMinutes(15), new TimerStateCallback(Expire_Callback), from);
|
||||
|
||||
pm.AcceleratedSkill = m_Skill;
|
||||
|
||||
Delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
Delete();
|
||||
}
|
||||
|
||||
private static Hashtable m_Table = new Hashtable();
|
||||
|
|
@ -244,81 +153,21 @@ namespace Server.Items
|
|||
m.SendLocalizedMessage(1077957);// The intense energy dissipates. You are no longer under the effects of an accelerated skillgain scroll.
|
||||
}
|
||||
|
||||
public override void OnDoubleClick(Mobile from)
|
||||
{
|
||||
Use(from, true);
|
||||
}
|
||||
|
||||
public override void Serialize(GenericWriter writer)
|
||||
{
|
||||
base.Serialize(writer);
|
||||
|
||||
writer.Write((int)0); // version
|
||||
|
||||
writer.Write((int)m_Skill);
|
||||
}
|
||||
|
||||
public override void Deserialize(GenericReader reader)
|
||||
{
|
||||
base.Deserialize(reader);
|
||||
|
||||
int version = reader.ReadInt();
|
||||
|
||||
switch (version)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
m_Skill = (SkillName)reader.ReadInt();
|
||||
break;
|
||||
}
|
||||
}
|
||||
int version = ( InheritsItem ? 0 : reader.ReadInt() ); //Required for SpecialScroll insertion
|
||||
|
||||
LootType = LootType.Cursed;
|
||||
|
||||
if (Insured)
|
||||
Insured = false;
|
||||
}
|
||||
|
||||
public class InternalGump : Gump
|
||||
{
|
||||
private Mobile m_Mobile;
|
||||
private ScrollofAlacrity m_Scroll;
|
||||
|
||||
public InternalGump(Mobile mobile, ScrollofAlacrity scroll)
|
||||
: base(25, 50)
|
||||
{
|
||||
m_Mobile = mobile;
|
||||
m_Scroll = scroll;
|
||||
|
||||
AddPage(0);
|
||||
|
||||
AddBackground(25, 10, 420, 200, 5054);
|
||||
|
||||
AddImageTiled(33, 20, 401, 181, 2624);
|
||||
AddAlphaRegion(33, 20, 401, 181);
|
||||
|
||||
AddHtmlLocalized(40, 48, 387, 100, 1078602, true, true); /* Using a Scroll of Alacrity for a given skill will increase the amount of skillgain
|
||||
* you receive for that skill. Once the Scroll of Alacrity duration has expired,
|
||||
* skillgain will return to normal for that skill. */
|
||||
|
||||
AddHtmlLocalized(125, 148, 200, 20, 1049478, 0xFFFFFF, false, false); // Do you wish to use this scroll?
|
||||
|
||||
AddButton(100, 172, 4005, 4007, 1, GumpButtonType.Reply, 0);
|
||||
AddHtmlLocalized(135, 172, 120, 20, 1046362, 0xFFFFFF, false, false); // Yes
|
||||
|
||||
AddButton(275, 172, 4005, 4007, 0, GumpButtonType.Reply, 0);
|
||||
AddHtmlLocalized(310, 172, 120, 20, 1046363, 0xFFFFFF, false, false); // No
|
||||
|
||||
AddHtml(40, 20, 260, 20, String.Format("<basefont color=#FFFFFF>Scroll of Alacrity:</basefont>"), false, false);
|
||||
|
||||
AddHtmlLocalized(310, 20, 120, 20, 1044060 + (int)scroll.m_Skill, 0xFFFFFF, false, false);
|
||||
}
|
||||
|
||||
public override void OnResponse(NetState state, RelayInfo info)
|
||||
{
|
||||
if (info.ButtonID == 1)
|
||||
m_Scroll.Use(m_Mobile, false);
|
||||
}
|
||||
Insured = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,164 +7,61 @@ using Server.Engines.Quests;
|
|||
|
||||
namespace Server.Items
|
||||
{
|
||||
public class ScrollofTranscendence : Item
|
||||
public class ScrollofTranscendence : SpecialScroll
|
||||
{
|
||||
public override int LabelNumber { get { return 1094934; } } // Scroll of Transcendence
|
||||
|
||||
public override int Message { get { return 1094933; } } /*Using a Scroll of Transcendence for a given skill will permanently increase your current
|
||||
*level in that skill by the amount of points displayed on the scroll.
|
||||
*As you may not gain skills beyond your maximum skill cap, any excess points will be lost.*/
|
||||
|
||||
public override string DefaultTitle { get { return String.Format( "<basefont color=#FFFFFF>Scroll of Transcendence ({0} Skill):</basefont>", Value ); } }
|
||||
|
||||
private SkillName m_Skill;
|
||||
private double m_Value;
|
||||
|
||||
private static SkillName[] m_Skills = new SkillName[]
|
||||
{
|
||||
SkillName.Alchemy,
|
||||
SkillName.Anatomy,
|
||||
SkillName.AnimalLore,
|
||||
SkillName.ItemID,
|
||||
SkillName.ArmsLore,
|
||||
SkillName.Parry,
|
||||
SkillName.Begging,
|
||||
SkillName.Blacksmith,
|
||||
SkillName.Fletching,
|
||||
SkillName.Peacemaking,
|
||||
SkillName.Camping,
|
||||
SkillName.Carpentry,
|
||||
SkillName.Cartography,
|
||||
SkillName.Cooking,
|
||||
SkillName.DetectHidden,
|
||||
SkillName.Discordance,
|
||||
SkillName.EvalInt,
|
||||
SkillName.Healing,
|
||||
SkillName.Fishing,
|
||||
SkillName.Forensics,
|
||||
SkillName.Herding,
|
||||
SkillName.Hiding,
|
||||
SkillName.Provocation,
|
||||
SkillName.Inscribe,
|
||||
SkillName.Lockpicking,
|
||||
SkillName.Magery,
|
||||
SkillName.MagicResist,
|
||||
SkillName.Tactics,
|
||||
SkillName.Snooping,
|
||||
SkillName.Musicianship,
|
||||
SkillName.Poisoning,
|
||||
SkillName.Archery,
|
||||
SkillName.SpiritSpeak,
|
||||
SkillName.Stealing,
|
||||
SkillName.Tailoring,
|
||||
SkillName.AnimalTaming,
|
||||
SkillName.TasteID,
|
||||
SkillName.Tinkering,
|
||||
SkillName.Tracking,
|
||||
SkillName.Veterinary,
|
||||
SkillName.Swords,
|
||||
SkillName.Macing,
|
||||
SkillName.Fencing,
|
||||
SkillName.Wrestling,
|
||||
SkillName.Lumberjacking,
|
||||
SkillName.Mining,
|
||||
SkillName.Meditation,
|
||||
SkillName.Stealth,
|
||||
SkillName.RemoveTrap,
|
||||
SkillName.Necromancy,
|
||||
SkillName.Focus,
|
||||
SkillName.Chivalry,
|
||||
SkillName.Bushido,
|
||||
SkillName.Ninjitsu,
|
||||
SkillName.Spellweaving
|
||||
};
|
||||
|
||||
public static SkillName[] Skills { get { return (m_Skills); } }
|
||||
|
||||
public static ScrollofTranscendence CreateRandom(int min, int max)
|
||||
public static ScrollofTranscendence CreateRandom( int min, int max )
|
||||
{
|
||||
min /= 1;
|
||||
max /= 1;
|
||||
SkillName skill = (SkillName)Utility.Random( SkillInfo.Table.Length );
|
||||
|
||||
SkillName[] skills = ScrollofTranscendence.Skills;
|
||||
|
||||
return new ScrollofTranscendence(skills[Utility.Random(skills.Length)], Utility.RandomMinMax(min, max) * 0.1);
|
||||
return new ScrollofTranscendence(skill, Utility.RandomMinMax(min, max) * 0.1);
|
||||
}
|
||||
|
||||
public ScrollofTranscendence() : this( SkillName.Alchemy, 0.0 )
|
||||
{
|
||||
}
|
||||
|
||||
[Constructable]
|
||||
public ScrollofTranscendence(SkillName skill, double value)
|
||||
: base(0x14EF)
|
||||
public ScrollofTranscendence( SkillName skill, double value ) : base( skill, value )
|
||||
{
|
||||
ItemID = 0x14EF;
|
||||
Hue = 0x490;
|
||||
Weight = 1.0;
|
||||
|
||||
m_Skill = skill;
|
||||
m_Value = value;
|
||||
if (m_Value > 0.0)
|
||||
LootType = LootType.Cursed;
|
||||
}
|
||||
|
||||
public ScrollofTranscendence(Serial serial)
|
||||
: base(serial)
|
||||
public ScrollofTranscendence(Serial serial) : base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public SkillName Skill
|
||||
{
|
||||
get
|
||||
{
|
||||
return m_Skill;
|
||||
}
|
||||
set
|
||||
{
|
||||
m_Skill = value;
|
||||
}
|
||||
}
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public double Value
|
||||
{
|
||||
get
|
||||
{
|
||||
return m_Value;
|
||||
}
|
||||
set
|
||||
{
|
||||
m_Value = value;
|
||||
}
|
||||
}
|
||||
|
||||
private string GetNameLocalized()
|
||||
{
|
||||
return String.Concat("#", (1044060 + (int)m_Skill).ToString());
|
||||
}
|
||||
|
||||
private string GetName()
|
||||
{
|
||||
int index = (int)m_Skill;
|
||||
SkillInfo[] table = SkillInfo.Table;
|
||||
|
||||
if (index >= 0 && index < table.Length)
|
||||
return table[index].Name.ToLower();
|
||||
else
|
||||
return "???";
|
||||
}
|
||||
|
||||
public override void GetProperties(ObjectPropertyList list)
|
||||
public override void GetProperties( ObjectPropertyList list )
|
||||
{
|
||||
base.GetProperties(list);
|
||||
|
||||
if (m_Value == 1)
|
||||
list.Add(1076759, "{0}\t{1}.0 Skill Points", GetName(), m_Value);
|
||||
if ( Value == 1 )
|
||||
list.Add(1076759, "{0}\t{1}.0 Skill Points", GetName(), Value);
|
||||
else
|
||||
list.Add(1076759, "{0}\t{1} Skill Points", GetName(), m_Value);
|
||||
list.Add(1076759, "{0}\t{1} Skill Points", GetName(), Value);
|
||||
}
|
||||
|
||||
public void Use(Mobile from, bool firstStage)
|
||||
|
||||
public override bool CanUse( Mobile from )
|
||||
{
|
||||
if ( !base.CanUse( from ) )
|
||||
return false;
|
||||
|
||||
PlayerMobile pm = from as PlayerMobile;
|
||||
|
||||
if (Deleted)
|
||||
return;
|
||||
|
||||
/* to uncomment when skillgain quests will be implementes
|
||||
|
||||
if ( pm == null )
|
||||
return false;
|
||||
|
||||
#region Mondain's Legacy
|
||||
/* to add when skillgain quests will be implemented
|
||||
|
||||
for (int i = pm.Quests.Count - 1; i >= 0; i--)
|
||||
{
|
||||
BaseQuest quest = pm.Quests[i];
|
||||
|
|
@ -176,177 +73,93 @@ namespace Server.Items
|
|||
if (objective is ApprenticeObjective)
|
||||
{
|
||||
from.SendMessage("You are already under the effect of an enhanced skillgain quest.");
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
*/
|
||||
|
||||
if (!IsChildOf(from.Backpack))
|
||||
{
|
||||
from.SendLocalizedMessage(1042001); // That must be in your pack for you to use it.
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Scroll of Alacrity
|
||||
else if (pm.AcceleratedStart > DateTime.Now)
|
||||
if (pm.AcceleratedStart > DateTime.Now)
|
||||
{
|
||||
from.SendLocalizedMessage(1077951); // You are already under the effect of an accelerated skillgain scroll.
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
#endregion
|
||||
else
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override void Use( Mobile from )
|
||||
{
|
||||
if ( !CanUse( from ) )
|
||||
return;
|
||||
|
||||
double tskill = from.Skills[Skill].Base;
|
||||
double tcap = from.Skills[Skill].Cap;
|
||||
bool canGain = false;
|
||||
|
||||
double newValue = Value;
|
||||
|
||||
if ( ( tskill + newValue ) > tcap )
|
||||
newValue = tcap - tskill;
|
||||
|
||||
if ( tskill < tcap && from.Skills[Skill].Lock == SkillLock.Up )
|
||||
{
|
||||
if (firstStage)
|
||||
if ( ( from.SkillsTotal + newValue * 10 ) > from.SkillsCap )
|
||||
{
|
||||
from.CloseGump(typeof(StatCapScroll.InternalGump));
|
||||
from.CloseGump(typeof(PowerScroll.InternalGump));
|
||||
from.CloseGump(typeof(ScrollofTranscendence.InternalGump));
|
||||
from.CloseGump(typeof(ScrollofAlacrity.InternalGump));
|
||||
from.SendGump(new InternalGump(from, this));
|
||||
for ( int i = 0; i <= 54; i++ )
|
||||
{
|
||||
if ( from.Skills[i].Lock == SkillLock.Down && tskill >= newValue )
|
||||
{
|
||||
from.Skills[i].Base -= newValue;
|
||||
canGain = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
double tskill = from.Skills[m_Skill].Base;
|
||||
double tcap = from.Skills[m_Skill].Cap;
|
||||
bool canGain = true;
|
||||
|
||||
if (tskill >= tcap || from.Skills[m_Skill].Lock == SkillLock.Locked || from.Skills[m_Skill].Lock == SkillLock.Down)
|
||||
{
|
||||
from.SendLocalizedMessage(1094935); /*You cannot increase this skill at this time. The skill may be locked or set to lower in your skill menu.
|
||||
*If you are at your total skill cap, you must use a Powerscroll to increase your current skill cap.*/
|
||||
return;
|
||||
}
|
||||
|
||||
if ((tskill + m_Value) > tcap)
|
||||
m_Value = tcap - tskill;
|
||||
|
||||
if ((from.SkillsTotal + m_Value * 10) > from.SkillsCap)
|
||||
{
|
||||
canGain = false;
|
||||
for (int i = 0; i <= 54; i++)
|
||||
{
|
||||
if (from.Skills[i].Lock == SkillLock.Down && from.Skills[i].Base >= m_Value)
|
||||
{
|
||||
from.Skills[i].Base = from.Skills[i].Base - m_Value;
|
||||
canGain = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!canGain)
|
||||
{
|
||||
from.SendLocalizedMessage(1094935); /*You cannot increase this skill at this time. The skill may be locked or set to lower in your skill menu.
|
||||
*If you are at your total skill cap, you must use a Powerscroll to increase your current skill cap.*/
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (tskill + m_Value > tcap)
|
||||
{
|
||||
from.Skills[m_Skill].Base = tcap;
|
||||
}
|
||||
else
|
||||
{
|
||||
from.Skills[m_Skill].Base = tskill + m_Value;
|
||||
}
|
||||
|
||||
from.SendLocalizedMessage(1049513, GetNameLocalized()); // You feel a surge of magic as the scroll enhances your ~1_type~!
|
||||
|
||||
Effects.PlaySound(from.Location, from.Map, 0x1F7);
|
||||
|
||||
Effects.SendTargetParticles(from, 0x373A, 35, 45, 0x00, 0x00, 9502, (EffectLayer)255, 0x100);
|
||||
Effects.SendTargetParticles(from, 0x376A, 35, 45, 0x00, 0x00, 9502, (EffectLayer)255, 0x100);
|
||||
|
||||
Delete();
|
||||
}
|
||||
canGain = true;
|
||||
}
|
||||
|
||||
if ( !canGain )
|
||||
{
|
||||
from.SendLocalizedMessage( 1094935 ); /*You cannot increase this skill at this time. The skill may be locked or set to lower in your skill menu.
|
||||
*If you are at your total skill cap, you must use a Powerscroll to increase your current skill cap.*/
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnDoubleClick(Mobile from)
|
||||
{
|
||||
Use(from, true);
|
||||
}
|
||||
from.SendLocalizedMessage( 1049513, GetNameLocalized() ); // You feel a surge of magic as the scroll enhances your ~1_type~!
|
||||
|
||||
from.Skills[Skill].Base += newValue;
|
||||
|
||||
public override void Serialize(GenericWriter writer)
|
||||
Effects.PlaySound( from.Location, from.Map, 0x1F7 );
|
||||
Effects.SendTargetParticles( from, 0x373A, 35, 45, 0x00, 0x00, 9502, (EffectLayer)255, 0x100 );
|
||||
Effects.SendTargetParticles( from, 0x376A, 35, 45, 0x00, 0x00, 9502, (EffectLayer)255, 0x100 );
|
||||
|
||||
Delete();
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize(writer);
|
||||
|
||||
writer.Write((int)0); // version
|
||||
|
||||
writer.Write((int)m_Skill);
|
||||
writer.Write((double)m_Value);
|
||||
}
|
||||
|
||||
public override void Deserialize(GenericReader reader)
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize(reader);
|
||||
|
||||
int version = reader.ReadInt();
|
||||
int version = ( InheritsItem ? 0 : reader.ReadInt() ); //Required for SpecialScroll insertion
|
||||
|
||||
switch (version)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
m_Skill = (SkillName)reader.ReadInt();
|
||||
m_Value = reader.ReadDouble();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (m_Value >= 0.1)
|
||||
{
|
||||
LootType = LootType.Cursed;
|
||||
|
||||
if (Insured)
|
||||
Insured = false;
|
||||
}
|
||||
LootType = LootType.Cursed;
|
||||
Insured = false;
|
||||
|
||||
if (Hue == 0x7E)
|
||||
Hue = 0x490;
|
||||
}
|
||||
|
||||
public class InternalGump : Gump
|
||||
{
|
||||
private Mobile m_Mobile;
|
||||
private ScrollofTranscendence m_Scroll;
|
||||
|
||||
public InternalGump(Mobile mobile, ScrollofTranscendence scroll)
|
||||
: base(25, 50)
|
||||
{
|
||||
m_Mobile = mobile;
|
||||
m_Scroll = scroll;
|
||||
|
||||
AddPage(0);
|
||||
|
||||
AddBackground(25, 10, 420, 200, 5054);
|
||||
|
||||
AddImageTiled(33, 20, 401, 181, 2624);
|
||||
AddAlphaRegion(33, 20, 401, 181);
|
||||
|
||||
AddHtmlLocalized(40, 48, 387, 100, 1094933, true, true); /*Using a Scroll of Transcendence for a given skill will permanently increase your current
|
||||
*level in that skill by the amount of points displayed on the scroll.
|
||||
*As you may not gain skills beyond your maximum skill cap, any excess points will be lost.*/
|
||||
|
||||
AddHtmlLocalized(125, 148, 200, 20, 1049478, 0xFFFFFF, false, false); // Do you wish to use this scroll?
|
||||
|
||||
AddButton(100, 172, 4005, 4007, 1, GumpButtonType.Reply, 0);
|
||||
AddHtmlLocalized(135, 172, 120, 20, 1046362, 0xFFFFFF, false, false); // Yes
|
||||
|
||||
AddButton(275, 172, 4005, 4007, 0, GumpButtonType.Reply, 0);
|
||||
AddHtmlLocalized(310, 172, 120, 20, 1046363, 0xFFFFFF, false, false); // No
|
||||
|
||||
double value = scroll.m_Value;
|
||||
|
||||
AddHtml(40, 20, 260, 20, String.Format("<basefont color=#FFFFFF>Scroll of Transcendence ({0} Skill):</basefont>", value), false, false);
|
||||
|
||||
AddHtmlLocalized(310, 20, 120, 20, 1044060 + (int)scroll.m_Skill, 0xFFFFFF, false, false);
|
||||
}
|
||||
|
||||
public override void OnResponse(NetState state, RelayInfo info)
|
||||
{
|
||||
if (info.ButtonID == 1)
|
||||
m_Scroll.Use(m_Mobile, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
187
Scripts/Items/Special/Special Scrolls/SpecialScroll.cs
Normal file
187
Scripts/Items/Special/Special Scrolls/SpecialScroll.cs
Normal file
|
|
@ -0,0 +1,187 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Gumps;
|
||||
using Server.Network;
|
||||
|
||||
namespace Server.Items
|
||||
{
|
||||
public abstract class SpecialScroll : Item
|
||||
{
|
||||
private SkillName m_Skill;
|
||||
private double m_Value;
|
||||
|
||||
#region Old Item Serialization Vars
|
||||
/* DO NOT USE! Only used in serialization of special scrolls that originally derived from Item */
|
||||
private bool m_InheritsItem;
|
||||
|
||||
protected bool InheritsItem
|
||||
{
|
||||
get{ return m_InheritsItem; }
|
||||
}
|
||||
#endregion
|
||||
|
||||
public abstract int Message{ get; }
|
||||
public virtual int Title{ get { return 0; } }
|
||||
public abstract string DefaultTitle{ get; }
|
||||
|
||||
public SpecialScroll( SkillName skill, double value ) : base( 0x14F0 )
|
||||
{
|
||||
LootType = LootType.Cursed;
|
||||
Weight = 1.0;
|
||||
|
||||
m_Skill = skill;
|
||||
m_Value = value;
|
||||
}
|
||||
|
||||
public SpecialScroll( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
[CommandProperty( AccessLevel.GameMaster )]
|
||||
public SkillName Skill
|
||||
{
|
||||
get { return m_Skill; }
|
||||
set { m_Skill = value; }
|
||||
}
|
||||
|
||||
[CommandProperty( AccessLevel.GameMaster )]
|
||||
public double Value
|
||||
{
|
||||
get { return m_Value; }
|
||||
set { m_Value = value; }
|
||||
}
|
||||
|
||||
public virtual string GetNameLocalized()
|
||||
{
|
||||
return String.Concat( "#", (1044060 + (int)m_Skill).ToString() );
|
||||
}
|
||||
|
||||
public virtual string GetName()
|
||||
{
|
||||
int index = (int)m_Skill;
|
||||
SkillInfo[] table = SkillInfo.Table;
|
||||
|
||||
if ( index >= 0 && index < table.Length )
|
||||
return table[index].Name.ToLower();
|
||||
else
|
||||
return "???";
|
||||
}
|
||||
|
||||
public virtual bool CanUse( Mobile from )
|
||||
{
|
||||
if ( Deleted )
|
||||
return false;
|
||||
|
||||
if ( !IsChildOf( from.Backpack ) )
|
||||
{
|
||||
from.SendLocalizedMessage(1042001); // That must be in your pack for you to use it.
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public virtual void Use( Mobile from )
|
||||
{
|
||||
}
|
||||
|
||||
public override void OnDoubleClick( Mobile from )
|
||||
{
|
||||
if ( !CanUse( from ) )
|
||||
return;
|
||||
|
||||
from.CloseGump( typeof( SpecialScroll.InternalGump ) );
|
||||
from.SendGump( new InternalGump( from, this ) );
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 1 ); // version
|
||||
|
||||
writer.Write( (int) m_Skill );
|
||||
writer.Write( (double) m_Value );
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
|
||||
switch ( version )
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
m_Skill = (SkillName)reader.ReadInt();
|
||||
m_Value = reader.ReadDouble();
|
||||
break;
|
||||
}
|
||||
case 0:
|
||||
{
|
||||
m_InheritsItem = true;
|
||||
|
||||
if ( !(this is StatCapScroll) )
|
||||
m_Skill = (SkillName)reader.ReadInt();
|
||||
else
|
||||
m_Skill = SkillName.Alchemy;
|
||||
|
||||
if ( this is ScrollofAlacrity )
|
||||
m_Value = 0.0;
|
||||
else if ( this is StatCapScroll )
|
||||
m_Value = (double)reader.ReadInt();
|
||||
else
|
||||
m_Value = reader.ReadDouble();
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class InternalGump : Gump
|
||||
{
|
||||
private Mobile m_Mobile;
|
||||
private SpecialScroll m_Scroll;
|
||||
|
||||
public InternalGump( Mobile mobile, SpecialScroll scroll ) : base( 25, 50 )
|
||||
{
|
||||
m_Mobile = mobile;
|
||||
m_Scroll = scroll;
|
||||
|
||||
AddPage( 0 );
|
||||
|
||||
AddBackground( 25, 10, 420, 200, 5054 );
|
||||
|
||||
AddImageTiled( 33, 20, 401, 181, 2624 );
|
||||
AddAlphaRegion( 33, 20, 401, 181 );
|
||||
|
||||
AddHtmlLocalized( 40, 48, 387, 100, m_Scroll.Message, true, true );
|
||||
|
||||
AddHtmlLocalized( 125, 148, 200, 20, 1049478, 0xFFFFFF, false, false ); // Do you wish to use this scroll?
|
||||
|
||||
AddButton( 100, 172, 4005, 4007, 1, GumpButtonType.Reply, 0 );
|
||||
AddHtmlLocalized( 135, 172, 120, 20, 1046362, 0xFFFFFF, false, false ); // Yes
|
||||
|
||||
AddButton( 275, 172, 4005, 4007, 0, GumpButtonType.Reply, 0 );
|
||||
AddHtmlLocalized( 310, 172, 120, 20, 1046363, 0xFFFFFF, false, false ); // No
|
||||
|
||||
if ( m_Scroll.Title != 0 )
|
||||
AddHtmlLocalized( 40, 20, 260, 20, m_Scroll.Title, 0xFFFFFF, false, false );
|
||||
else
|
||||
AddHtml( 40, 20, 260, 20, m_Scroll.DefaultTitle, false, false );
|
||||
|
||||
if ( m_Scroll is StatCapScroll )
|
||||
AddHtmlLocalized( 310, 20, 120, 20, 1038019, 0xFFFFFF, false, false ); // Power
|
||||
else
|
||||
AddHtmlLocalized( 310, 20, 120, 20, 1044060 + (int)m_Scroll.Skill, 0xFFFFFF, false, false );
|
||||
}
|
||||
|
||||
public override void OnResponse( NetState state, RelayInfo info )
|
||||
{
|
||||
if ( info.ButtonID == 1 )
|
||||
m_Scroll.Use( m_Mobile );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -6,28 +6,39 @@ using Server.Network;
|
|||
|
||||
namespace Server.Items
|
||||
{
|
||||
public class StatCapScroll : Item
|
||||
public class StatCapScroll : SpecialScroll
|
||||
{
|
||||
private int m_Value;
|
||||
|
||||
[CommandProperty( AccessLevel.GameMaster )]
|
||||
public int Value
|
||||
public override int Message { get { return 1049469; } } /* Using a scroll increases the maximum amount of a specific skill or your maximum statistics.
|
||||
* When used, the effect is not immediately seen without a gain of points with that skill or statistics.
|
||||
* You can view your maximum skill values in your skills window.
|
||||
* You can view your maximum statistic value in your statistics window. */
|
||||
public override int Title
|
||||
{
|
||||
get
|
||||
{
|
||||
return m_Value;
|
||||
int level = ( (int)Value - 230 ) / 5;
|
||||
|
||||
if ( level >= 0 && level <= 4 && Value % 5 == 0 )
|
||||
return 1049458 + level; /* Wonderous Scroll (+5 Maximum Stats): OR
|
||||
* Exalted Scroll (+10 Maximum Stats): OR
|
||||
* Mythical Scroll (+15 Maximum Stats): OR
|
||||
* Legendary Scroll (+20 Maximum Stats): OR
|
||||
* Ultimate Scroll (+25 Maximum Stats): */
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
public override string DefaultTitle { get { return String.Format( "<basefont color=#FFFFFF>Power Scroll ({0}{1} Maximum Stats):</basefont>", ( (int)Value - 225 ) >= 0 ? "+" : "", (int)Value - 225 ); } }
|
||||
|
||||
public StatCapScroll() : this( 105 )
|
||||
{
|
||||
}
|
||||
|
||||
[Constructable]
|
||||
public StatCapScroll( int value ) : base( 0x14F0 )
|
||||
public StatCapScroll( int value ) : base( SkillName.Alchemy, value )
|
||||
{
|
||||
Hue = 0x481;
|
||||
Weight = 1.0;
|
||||
|
||||
LootType = LootType.Cursed;
|
||||
|
||||
m_Value = value;
|
||||
}
|
||||
|
||||
public StatCapScroll( Serial serial ) : base( serial )
|
||||
|
|
@ -36,92 +47,69 @@ namespace Server.Items
|
|||
|
||||
public override void AddNameProperty(ObjectPropertyList list)
|
||||
{
|
||||
if ( m_Value == 230 )
|
||||
list.Add( 1049463, "#1049476" ); // a wonderous scroll of ~1_type~ (+5 Maximum Stats)
|
||||
else if ( m_Value == 235 )
|
||||
list.Add( 1049464, "#1049476" ); // an exalted scroll of ~1_type~ (+10 Maximum Stats)
|
||||
else if ( m_Value == 240 )
|
||||
list.Add( 1049465, "#1049476" ); // a mythical scroll of ~1_type~ (+15 Maximum Stats)
|
||||
else if ( m_Value == 245 )
|
||||
list.Add( 1049466, "#1049476" ); // a legendary scroll of ~1_type~ (+20 Maximum Stats)
|
||||
else if ( m_Value == 250 )
|
||||
list.Add( 1049467, "#1049476" ); // an ultimate scroll of ~1_type~ (+25 Maximum Stats)
|
||||
int level = ( (int)Value - 230 ) / 5;
|
||||
|
||||
if ( level >= 0 && level <= 4 && (int)Value % 5 == 0 )
|
||||
list.Add( 1049463 + level, "#1049476" ); /* a wonderous scroll of ~1_type~ (+5 Maximum Stats) OR
|
||||
* an exalted scroll of ~1_type~ (+10 Maximum Stats) OR
|
||||
* a mythical scroll of ~1_type~ (+15 Maximum Stats) OR
|
||||
* a legendary scroll of ~1_type~ (+20 Maximum Stats) OR
|
||||
* an ultimate scroll of ~1_type~ (+25 Maximum Stats) */
|
||||
else
|
||||
list.Add( "a scroll of power ({0}{1} Maximum Stats)", (m_Value - 225) >= 0 ? "+" : "", m_Value - 225 );
|
||||
list.Add( "a scroll of power ({0}{1} Maximum Stats)", (Value - 225) >= 0 ? "+" : "", Value - 225 );
|
||||
}
|
||||
|
||||
public override void OnSingleClick( Mobile from )
|
||||
{
|
||||
if ( m_Value == 230 )
|
||||
base.LabelTo( from, 1049463, "#1049476" ); // a wonderous scroll of ~1_type~ (+5 Maximum Stats)
|
||||
else if ( m_Value == 235 )
|
||||
base.LabelTo( from, 1049464, "#1049476" ); // an exalted scroll of ~1_type~ (+10 Maximum Stats)
|
||||
else if ( m_Value == 240 )
|
||||
base.LabelTo( from, 1049465, "#1049476" ); // a mythical scroll of ~1_type~ (+15 Maximum Stats)
|
||||
else if ( m_Value == 245 )
|
||||
base.LabelTo( from, 1049466, "#1049476" ); // a legendary scroll of ~1_type~ (+20 Maximum Stats)
|
||||
else if ( m_Value == 250 )
|
||||
base.LabelTo( from, 1049467, "#1049476" ); // an ultimate scroll of ~1_type~ (+25 Maximum Stats)
|
||||
int level = ( (int)Value - 230 ) / 5;
|
||||
|
||||
if ( level >= 0 && level <= 4 && (int)Value % 5 == 0 )
|
||||
base.LabelTo( from, 1049463 + level, "#1049476" );
|
||||
else
|
||||
base.LabelTo( from, "a scroll of power ({0}{1} Maximum Stats)", (m_Value - 225) >= 0 ? "+" : "", m_Value - 225 );
|
||||
base.LabelTo( from, "a scroll of power ({0}{1} Maximum Stats)", (Value - 225) >= 0 ? "+" : "", Value - 225 );
|
||||
}
|
||||
|
||||
public void Use( Mobile from, bool firstStage )
|
||||
|
||||
public override bool CanUse( Mobile from )
|
||||
{
|
||||
if ( Deleted )
|
||||
if ( !base.CanUse( from ) )
|
||||
return false;
|
||||
|
||||
int newValue = (int)Value;
|
||||
|
||||
if ( from is PlayerMobile && ((PlayerMobile)from).HasStatReward )
|
||||
newValue += 5;
|
||||
|
||||
if ( from.StatCap >= newValue )
|
||||
{
|
||||
from.SendLocalizedMessage( 1049510 ); // Your stats are too high for this power scroll.
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override void Use( Mobile from )
|
||||
{
|
||||
if ( !CanUse( from ) )
|
||||
return;
|
||||
|
||||
if ( IsChildOf( from.Backpack ) )
|
||||
{
|
||||
int NewValue = m_Value;
|
||||
if ( from is PlayerMobile && ((PlayerMobile)from).HasStatReward )
|
||||
{
|
||||
NewValue += 5;
|
||||
}
|
||||
from.SendLocalizedMessage( 1049512 ); // You feel a surge of magic as the scroll enhances your powers!
|
||||
|
||||
if ( from.StatCap >= NewValue )
|
||||
{
|
||||
from.SendLocalizedMessage( 1049510 ); // Your stats are too high for this power scroll.
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( firstStage )
|
||||
{
|
||||
from.CloseGump( typeof( StatCapScroll.InternalGump ) );
|
||||
from.CloseGump( typeof( PowerScroll.InternalGump ) );
|
||||
#region Scroll of Alacrity
|
||||
from.CloseGump(typeof( ScrollofAlacrity.InternalGump ) );
|
||||
#endregion
|
||||
from.SendGump( new InternalGump( from, this ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
from.SendLocalizedMessage( 1049512 ); // You feel a surge of magic as the scroll enhances your powers!
|
||||
|
||||
from.StatCap = NewValue;
|
||||
|
||||
Effects.SendLocationParticles( EffectItem.Create( from.Location, from.Map, EffectItem.DefaultDuration ), 0, 0, 0, 0, 0, 5060, 0 );
|
||||
Effects.PlaySound( from.Location, from.Map, 0x243 );
|
||||
|
||||
Effects.SendMovingParticles( new Entity( Serial.Zero, new Point3D( from.X - 6, from.Y - 6, from.Z + 15 ), from.Map ), from, 0x36D4, 7, 0, false, true, 0x497, 0, 9502, 1, 0, (EffectLayer)255, 0x100 );
|
||||
Effects.SendMovingParticles( new Entity( Serial.Zero, new Point3D( from.X - 4, from.Y - 6, from.Z + 15 ), from.Map ), from, 0x36D4, 7, 0, false, true, 0x497, 0, 9502, 1, 0, (EffectLayer)255, 0x100 );
|
||||
Effects.SendMovingParticles( new Entity( Serial.Zero, new Point3D( from.X - 6, from.Y - 4, from.Z + 15 ), from.Map ), from, 0x36D4, 7, 0, false, true, 0x497, 0, 9502, 1, 0, (EffectLayer)255, 0x100 );
|
||||
|
||||
Effects.SendTargetParticles( from, 0x375A, 35, 90, 0x00, 0x00, 9502, (EffectLayer)255, 0x100 );
|
||||
|
||||
Delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( from is PlayerMobile && ((PlayerMobile)from).HasStatReward )
|
||||
from.StatCap = (int)Value + 5;
|
||||
else
|
||||
{
|
||||
from.SendLocalizedMessage( 1042001 ); // That must be in your pack for you to use it.
|
||||
}
|
||||
}
|
||||
from.StatCap = (int)Value;
|
||||
|
||||
public override void OnDoubleClick( Mobile from )
|
||||
{
|
||||
Use( from, true );
|
||||
Effects.SendLocationParticles( EffectItem.Create( from.Location, from.Map, EffectItem.DefaultDuration ), 0, 0, 0, 0, 0, 5060, 0 );
|
||||
Effects.PlaySound( from.Location, from.Map, 0x243 );
|
||||
|
||||
Effects.SendMovingParticles( new Entity( Serial.Zero, new Point3D( from.X - 6, from.Y - 6, from.Z + 15 ), from.Map ), from, 0x36D4, 7, 0, false, true, 0x497, 0, 9502, 1, 0, (EffectLayer)255, 0x100 );
|
||||
Effects.SendMovingParticles( new Entity( Serial.Zero, new Point3D( from.X - 4, from.Y - 6, from.Z + 15 ), from.Map ), from, 0x36D4, 7, 0, false, true, 0x497, 0, 9502, 1, 0, (EffectLayer)255, 0x100 );
|
||||
Effects.SendMovingParticles( new Entity( Serial.Zero, new Point3D( from.X - 6, from.Y - 4, from.Z + 15 ), from.Map ), from, 0x36D4, 7, 0, false, true, 0x497, 0, 9502, 1, 0, (EffectLayer)255, 0x100 );
|
||||
|
||||
Effects.SendTargetParticles( from, 0x375A, 35, 90, 0x00, 0x00, 9502, (EffectLayer)255, 0x100 );
|
||||
|
||||
Delete();
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
|
|
@ -129,86 +117,16 @@ namespace Server.Items
|
|||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
|
||||
writer.Write( (int) m_Value );
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
int version = ( InheritsItem ? 0 : reader.ReadInt() ); //Required for SpecialScroll insertion
|
||||
|
||||
switch ( version )
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
m_Value = reader.ReadInt();
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( LootType != LootType.Cursed )
|
||||
LootType = LootType.Cursed;
|
||||
|
||||
if ( Insured )
|
||||
Insured = false;
|
||||
}
|
||||
|
||||
public class InternalGump : Gump
|
||||
{
|
||||
private Mobile m_Mobile;
|
||||
private StatCapScroll m_Scroll;
|
||||
|
||||
public InternalGump( Mobile mobile, StatCapScroll scroll ) : base( 25, 50 )
|
||||
{
|
||||
m_Mobile = mobile;
|
||||
m_Scroll = scroll;
|
||||
|
||||
AddPage( 0 );
|
||||
|
||||
AddBackground( 25, 10, 420, 200, 5054 );
|
||||
|
||||
AddImageTiled( 33, 20, 401, 181, 2624 );
|
||||
AddAlphaRegion( 33, 20, 401, 181 );
|
||||
|
||||
AddHtmlLocalized( 40, 48, 387, 100, 1049469, true, true ); /* Using a scroll increases the maximum amount of a specific skill or your maximum statistics.
|
||||
* When used, the effect is not immediately seen without a gain of points with that skill or statistics.
|
||||
* You can view your maximum skill values in your skills window.
|
||||
* You can view your maximum statistic value in your statistics window.
|
||||
*/
|
||||
AddHtmlLocalized( 125, 148, 200, 20, 1049478, 0xFFFFFF, false, false ); // Do you wish to use this scroll?
|
||||
|
||||
AddButton( 100, 172, 4005, 4007, 1, GumpButtonType.Reply, 0 );
|
||||
AddHtmlLocalized( 135, 172, 120, 20, 1046362, 0xFFFFFF, false, false ); // Yes
|
||||
|
||||
AddButton( 275, 172, 4005, 4007, 0, GumpButtonType.Reply, 0 );
|
||||
AddHtmlLocalized( 310, 172, 120, 20, 1046363, 0xFFFFFF, false, false ); // No
|
||||
|
||||
int value = scroll.m_Value;
|
||||
|
||||
if ( value == 230 )
|
||||
AddHtmlLocalized( 40, 20, 260, 20, 1049458, 0xFFFFFF, false, false ); // Wonderous Scroll (+5 Maximum Stats):
|
||||
else if ( value == 235 )
|
||||
AddHtmlLocalized( 40, 20, 260, 20, 1049459, 0xFFFFFF, false, false ); // Exalted Scroll (+10 Maximum Stats):
|
||||
else if ( value == 240 )
|
||||
AddHtmlLocalized( 40, 20, 260, 20, 1049460, 0xFFFFFF, false, false ); // Mythical Scroll (+15 Maximum Stats):
|
||||
else if ( value == 245 )
|
||||
AddHtmlLocalized( 40, 20, 260, 20, 1049461, 0xFFFFFF, false, false ); // Legendary Scroll (+20 Maximum Stats):
|
||||
else if ( value == 250 )
|
||||
AddHtmlLocalized( 40, 20, 260, 20, 1049462, 0xFFFFFF, false, false ); // Ultimate Scroll (+25 Maximum Stats):
|
||||
else
|
||||
AddHtml( 40, 20, 260, 20, String.Format( "<basefont color=#FFFFFF>Power Scroll ({0}{1} Maximum Stats):</basefont>", (value - 225) >= 0 ? "+" : "", value - 225), false, false );
|
||||
|
||||
AddHtmlLocalized( 310, 20, 120, 20, 1038019, 0xFFFFFF, false, false ); // Power
|
||||
}
|
||||
|
||||
public override void OnResponse( NetState state, RelayInfo info )
|
||||
{
|
||||
if ( info.ButtonID == 1 )
|
||||
m_Scroll.Use( m_Mobile, false );
|
||||
}
|
||||
LootType = LootType.Cursed;
|
||||
Insured = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -64,7 +64,7 @@ namespace Server.Misc
|
|||
|
||||
// The new AOS bankboxes don't have powerscrolls, they are automatically 'applied':
|
||||
|
||||
for ( int i = 0; i < PowerScroll.Skills.Length; ++i )
|
||||
for ( int i = 0; i < PowerScroll.Skills.Count; ++i )
|
||||
m.Skills[PowerScroll.Skills[ i ]].Cap = 120.0;
|
||||
|
||||
m.StatCap = 250;
|
||||
|
|
@ -532,7 +532,7 @@ namespace Server.Misc
|
|||
{
|
||||
Bag bag = new Bag();
|
||||
|
||||
for ( int i = 0; i < PowerScroll.Skills.Length; ++i )
|
||||
for ( int i = 0; i < PowerScroll.Skills.Count; ++i )
|
||||
bag.DropItem( new PowerScroll( PowerScroll.Skills[i], 120.0 ) );
|
||||
|
||||
bag.DropItem( new StatCapScroll( 250 ) );
|
||||
|
|
|
|||
|
|
@ -106,6 +106,7 @@ namespace Server.Mobiles
|
|||
public override Poison PoisonImmune{ get{ return Poison.Greater; } }
|
||||
public override Poison HitPoison{ get{ return Poison.Greater; } }
|
||||
public override FoodType FavoriteFood{ get{ return FoodType.FruitsAndVegies | FoodType.GrainsAndHay; } }
|
||||
public override bool CanAngerOnTame { get { return true; } }
|
||||
|
||||
public override void OnGaveMeleeAttack( Mobile defender )
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1398,6 +1398,20 @@ namespace Server.Mobiles
|
|||
if( Alive )
|
||||
list.Add( new CallbackEntry( 6210, new ContextCallback( ToggleChampionTitleDisplay ) ) );
|
||||
}
|
||||
if ( from != this )
|
||||
{
|
||||
|
||||
if ( Alive && Core.Expansion >= Expansion.AOS )
|
||||
list.Add( new AddToPartyEntry( from, this ) );
|
||||
|
||||
BaseHouse curhouse = BaseHouse.FindHouseAt( this );
|
||||
|
||||
if( curhouse != null )
|
||||
{
|
||||
if ( Alive && Core.Expansion >= Expansion.AOS && curhouse.IsAosRules && curhouse.IsFriend( from ) )
|
||||
list.Add( new EjectPlayerEntry( from, this ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void CancelProtection()
|
||||
|
|
|
|||
|
|
@ -2011,7 +2011,7 @@ namespace Server.Multis
|
|||
{
|
||||
from.SendLocalizedMessage( 501346 ); // Uh oh...a bigger boot may be required!
|
||||
}
|
||||
else if ( IsFriend( targ ) )
|
||||
else if ( IsFriend( targ ) && !Core.ML )
|
||||
{
|
||||
from.SendLocalizedMessage( 501348 ); // You cannot eject a friend of the house!
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue