- house commit has inappropiate cost for certain parts
          http://www.uodemise.com/forum/showthread.php?t=136453

        - houses should not be placable on roads
          http://www.uodemise.com/forum/showthread.php?t=139597

Bushido

        - lightning strike should consume extra mana if player walks
          http://www.uodemise.com/forum/showthread.php?t=127699

Weapons

        - frenzied whirlwind should properly flag combatants.
          http://www.uodemise.com/forum/showthread.php?t=138625

Magery

        - PolyMorph should not turn the caster grey/criminal
          http://www.uodemise.com/forum/showthread.php?t=116438

        - Paralyze should interfere in casting paladin spells.
          http://www.uodemise.com/forum/showthread.php?t=120742

Spellweaving

        - Ethereal Voyage should not break when attempting to tame dragons, nightmares, etc.
          http://www.uodemise.com/forum/showthread.php?t=135349

Misc
        - refactor DrawRessource() to DrawResource()
          http://www.uodemise.com/forum/showthread.php?t=127202

        - random blood "spatter" itemid during combat: more visible blood.
          http://www.uodemise.com/forum/showthread.php?t=140092

Taming

        - Animal lore should check for skill modifiers when using lore on mobiles.
          http://www.uodemise.com/forum/showthread.php?t=140658

Necromany

        - Wraithform should allow push-through without stam loss always.
          http://www.uodemise.com/forum/showthread.php?t=117126

        - Wraithform mana leech should not lower the victim's mana + small cleanup to spellhelper.doleech()
          http://www.uodemise.com/forum/showthread.php?t=120238

Chivalry

        - Noble Sacrifice should work in houses.  RunUO's does not.
          http://www.uodemise.com/forum/showthread.php?t=122819

NCP Vendors

        - Add necro regs for vendors to buy from players.
          http://www.uodemise.com/forum/showthread.php?t=136435
This commit is contained in:
xavier 2010-03-15 15:28:44 +00:00
parent d3e95b7e53
commit 1d74d05af4
16 changed files with 175 additions and 69 deletions

View file

@ -85,7 +85,7 @@ namespace Server.Engines.Craft
DrawItem();
DrawSkill();
DrawRessource();
DrawResource();
/*
if( craftItem.RequiresSE )
@ -180,7 +180,7 @@ namespace Server.Engines.Craft
private static Type typeofBlankScroll = typeof( BlankScroll );
private static Type typeofSpellScroll = typeof( SpellScroll );
public void DrawRessource()
public void DrawResource()
{
bool retainedColor = false;

View file

@ -187,18 +187,18 @@ namespace Server.Engines.Craft
{
/*
Synthax for a SIMPLE craft item
AddCraft( ObjectType, Group, MinSkill, MaxSkill, RessourceType, Amount, Message )
AddCraft( ObjectType, Group, MinSkill, MaxSkill, ResourceType, Amount, Message )
ObjectType : The type of the object you want to add to the build list.
Group : The group in wich the object will be showed in the craft menu.
MinSkill : The minimum of skill value
MaxSkill : The maximum of skill value
RessourceType : The type of the ressource the mobile need to create the item
Amount : The amount of the RessourceType it need to create the item
Message : String or Int for Localized. The message that will be sent to the mobile, if the specified ressource is missing.
ResourceType : The type of the resource the mobile need to create the item
Amount : The amount of the ResourceType it need to create the item
Message : String or Int for Localized. The message that will be sent to the mobile, if the specified resource is missing.
Synthax for a COMPLEXE craft item. A complexe item is an item that need either more than
only one skill, or more than only one ressource.
only one skill, or more than only one resource.
Coming soon....
*/

View file

@ -6,7 +6,7 @@ namespace Server.Items
public class Blood : Item
{
[Constructable]
public Blood() : this( 0x1645 )
public Blood() : this( Utility.RandomList( 0x1645, 0x122A, 0x122B, 0x122C, 0x122D, 0x122E, 0x122F ))
{
}

View file

@ -86,6 +86,7 @@ namespace Server.Items
for( int i = 0; i < targets.Count; ++i )
{
Mobile m = (Mobile)targets[i];
attacker.DoHarmful( m, true );
Timer t = Registry[m] as Timer;

View file

@ -329,7 +329,7 @@ namespace Server.Misc
if( !(target is BaseCreature && ((BaseCreature)target).InitialInnocent) )
{
if( !target.Body.IsHuman && !target.Body.IsGhost && !IsPet( target as BaseCreature ) && !TransformationSpellHelper.UnderTransformation( target ) && !AnimalForm.UnderTransformation( target ) )
if( !target.Body.IsHuman && !target.Body.IsGhost && !IsPet( target as BaseCreature ) && !(target is PlayerMobile) || !Core.ML && !target.CanBeginAction( typeof( Server.Spells.Seventh.PolymorphSpell ) ) )
return Notoriety.CanBeAttacked;
}

View file

@ -105,7 +105,14 @@ namespace Server.Mobiles
private int m_StepsTaken;
private int m_Profession;
private bool m_IsStealthing; // IsStealthing should be moved to Server.Mobiles
private bool m_IgnoreMobiles; // IgnoreMobiles should be moved to Server.Mobiles
/*
* a value of zero means, that the mobile is not executing the spell. Otherwise,
* the value should match the BaseMana required
*/
private int m_ExecutesLightningStrike; // move to Server.Mobiles??
private DateTime m_LastOnline;
private Server.Guilds.RankDefinition m_GuildRank;
@ -173,6 +180,23 @@ namespace Server.Mobiles
set { m_IsStealthing = value; }
}
[CommandProperty( AccessLevel.GameMaster )]
public bool IgnoreMobiles // IgnoreMobiles should be moved to Server.Mobiles
{
get
{
return m_IgnoreMobiles;
}
set
{
if( m_IgnoreMobiles != value )
{
m_IgnoreMobiles = value;
Delta( MobileDelta.Flags );
}
}
}
[CommandProperty( AccessLevel.GameMaster )]
public NpcGuild NpcGuild
{
@ -219,6 +243,12 @@ namespace Server.Mobiles
set { m_ToTTotalMonsterFame = value; }
}
public int ExecutesLightningStrike
{
get { return m_ExecutesLightningStrike; }
set { m_ExecutesLightningStrike = value; }
}
#endregion
#region PlayerFlags
@ -506,6 +536,26 @@ namespace Server.Mobiles
return true;
}
public override int GetPacketFlags()
{
int flags = base.GetPacketFlags();
if ( m_IgnoreMobiles )
flags |= 0x10;
return flags;
}
public override int GetOldPacketFlags()
{
int flags = base.GetOldPacketFlags();
if ( m_IgnoreMobiles )
flags |= 0x10;
return flags;
}
public bool GetFlag( PlayerFlag flag )
{
@ -632,6 +682,18 @@ namespace Server.Mobiles
return min;
}
public override void OnManaChange(int oldValue)
{
base.OnManaChange(oldValue);
if (m_ExecutesLightningStrike > 0)
{
if (Mana < m_ExecutesLightningStrike)
{
LightningStrike.ClearCurrentMove(this);
}
}
}
private static void OnLogin( LoginEventArgs e )
{
Mobile from = e.Mobile;
@ -1860,7 +1922,7 @@ namespace Server.Mobiles
public override bool CheckShove( Mobile shoved )
{
if( TransformationSpellHelper.UnderTransformation( this, typeof( WraithFormSpell ) ) )
if( m_IgnoreMobiles || TransformationSpellHelper.UnderTransformation( shoved, typeof( WraithFormSpell ) ) )
return true;
else
return base.CheckShove( shoved );
@ -2762,6 +2824,9 @@ namespace Server.Mobiles
if( m_ChampionTitles == null )
m_ChampionTitles = new ChampionTitleInfo();
if ( AccessLevel > AccessLevel.Player )
m_IgnoreMobiles = true;
List<Mobile> list = this.Stabled;
@ -3247,6 +3312,11 @@ namespace Server.Mobiles
public override void OnAccessLevelChanged( AccessLevel oldLevel )
{
if ( AccessLevel == AccessLevel.Player )
IgnoreMobiles = false;
else
IgnoreMobiles = true;
InvalidateMyRunUO();
}

View file

@ -91,6 +91,16 @@ namespace Server.Mobiles
Add( typeof( Nightshade ), 2 );
Add( typeof( SpidersSilk ), 2 );
Add( typeof( SulfurousAsh ), 2 );
if ( Core.AOS )
{
Add( typeof( BatWing ), 1 );
Add( typeof( DaemonBlood ), 3 );
Add( typeof( PigIron ), 2 );
Add( typeof( NoxCrystal ), 3 );
Add( typeof( GraveDust ), 1 );
}
Add( typeof( RecallRune ), 13 );
Add( typeof( Spellbook ), 25 );

View file

@ -890,7 +890,7 @@ namespace Server.Multis
public void EndConfirmCommit( Mobile from )
{
int oldPrice = Price;
int newPrice = oldPrice + CustomizationCost + ((DesignState.Components.List.Length - CurrentState.Components.List.Length) * 500);
int newPrice = oldPrice + CustomizationCost + ((DesignState.Components.List.Length - ( CurrentState.Components.List.Length + CurrentState.Fixtures.Length )) * 500);
int cost = newPrice - oldPrice;
if ( !this.Deleted ) { // Temporary Fix. We should be booting a client out of customization mode in the delete handler.
@ -991,7 +991,7 @@ namespace Server.Multis
if( context != null )
{
int oldPrice = context.Foundation.Price;
int newPrice = oldPrice + context.Foundation.CustomizationCost + ((context.Foundation.DesignState.Components.List.Length - context.Foundation.CurrentState.Components.List.Length) * 500);
int newPrice = oldPrice + context.Foundation.CustomizationCost + ((context.Foundation.DesignState.Components.List.Length - ( context.Foundation.CurrentState.Components.List.Length + context.Foundation.Fixtures.Count) ) * 500);
int bankBalance = Banker.GetBalance( from );
from.SendGump( new ConfirmCommitGump( from, context.Foundation, bankBalance, oldPrice, newPrice ) );
@ -1936,8 +1936,16 @@ namespace Server.Multis
AddHtmlLocalized( 10, 235, 150, 20, 1061900, 1023, false, false ); // Cost To Commit:
AddLabel( 170, 235, 90, newPrice.ToString() );
AddHtmlLocalized( 10, 260, 150, 20, 1061901, 31744, false, false ); // Your Cost:
AddLabel( 170, 260, 40, (newPrice - oldPrice).ToString() );
if ( newPrice - oldPrice < 0 )
{
AddHtmlLocalized( 10, 260, 150, 20, 1062059, 992, false, false ); // Your Refund:
AddLabel( 170, 260, 70, (oldPrice - newPrice).ToString() );
}
else
{
AddHtmlLocalized( 10, 260, 150, 20, 1061901, 31744, false, false ); // Your Cost:
AddLabel( 170, 260, 40, (newPrice - oldPrice).ToString() );
}
AddButton( 10, 290, 4005, 4007, 1, GumpButtonType.Reply, 0 );
AddHtmlLocalized( 45, 290, 55, 20, 1011036, 32767, false, false ); // OKAY

View file

@ -30,22 +30,15 @@ namespace Server.Multis
// Any land tile which matches one of these ID numbers is considered a road and cannot be placed over.
private static int[] m_RoadIDs = new int[]
{
0x071, 0x08C,
0x0E8, 0x0EB,
0x14C, 0x14F,
0x161, 0x174,
0x1F0, 0x1F3,
0x26E, 0x279,
0x27E, 0x281,
0x324, 0x3AC,
0x547, 0x556,
0x597, 0x5A6,
0x637, 0x63A,
0x7AE, 0x7B1,
0x442, 0x479, // Sand stones
0x501, 0x510, // Sand stones
0x009, 0x015, // Furrows
0x150, 0x15C // Furrows
0x0071, 0x0078,
0x00E8, 0x00EB,
0x07AE, 0x07B1,
0x3FF4, 0x3FF4,
0x3FF8, 0x3FFB,
0x0442, 0x0479, // Sand stones
0x0501, 0x0510, // Sand stones
0x0009, 0x0015, // Furrows
0x0150, 0x015C // Furrows
};
public static HousePlacementResult Check( Mobile from, int multiID, Point3D center, out ArrayList toMove )

View file

@ -42,11 +42,11 @@ namespace Server.SkillHandlers
{
if ( c.Body.IsAnimal || c.Body.IsMonster || c.Body.IsSea )
{
if ( (!c.Controlled || !c.Tamable) && from.Skills[SkillName.AnimalLore].Base < 100.0 )
if ( (!c.Controlled || !c.Tamable) && from.Skills[SkillName.AnimalLore].Value < 100.0 )
{
from.SendLocalizedMessage( 1049674 ); // At your skill level, you can only lore tamed creatures.
}
else if ( !c.Tamable && from.Skills[SkillName.AnimalLore].Base < 110.0 )
else if ( !c.Tamable && from.Skills[SkillName.AnimalLore].Value < 110.0 )
{
from.SendLocalizedMessage( 1049675 ); // At your skill level, you can only lore tamed or tameable creatures.
}

View file

@ -5,6 +5,8 @@ using Server.Targeting;
using Server.Network;
using Server.Mobiles;
using Server.Factions;
using Server.Spells;
using Server.Spells.Spellweaving;
namespace Server.SkillHandlers
{
@ -180,7 +182,7 @@ namespace Server.SkillHandlers
creature.PrivateOverheadMessage( MessageType.Regular, 0x3B2, 502805, from.NetState ); // You seem to anger the beast!
creature.PlaySound( creature.GetAngerSound() );
creature.Direction = creature.GetDirectionTo( from );
if ( from is PlayerMobile && !( (PlayerMobile)from ).HonorActive )
if ( from is PlayerMobile && !(( (PlayerMobile)from ).HonorActive || TransformationSpellHelper.UnderTransformation( from, typeof( EtherealVoyageSpell ))))
creature.Combatant = from;
}
else

View file

@ -974,23 +974,24 @@ namespace Server.Spells
public static void DoLeech( int damageGiven, Mobile from, Mobile target )
{
TransformContext context = TransformationSpellHelper.GetContext( from );
if ( context != null && context.Type == typeof( WraithFormSpell ) )
if ( context != null ) /* cleanup */
{
int wraithLeech = ( 5 + (int)( ( 15 * from.Skills.SpiritSpeak.Value ) / 100 ) ); // Wraith form gives 5-20% mana leech
int manaLeech = AOS.Scale( damageGiven, wraithLeech );
if ( manaLeech != 0 )
if ( context.Type == typeof( WraithFormSpell ) )
{
// Mana leeched by the Wraith Form spell is actually stolen, not just leeched.
target.Mana -= manaLeech;
from.Mana += manaLeech;
from.PlaySound( 0x44D );
//from.SendMessage(String.Format("You Leeched {0} Mana", manaLeech));
int wraithLeech = ( 5 + (int)( ( 15 * from.Skills.SpiritSpeak.Value ) / 100 ) ); // Wraith form gives 5-20% mana leech
int manaLeech = AOS.Scale( damageGiven, wraithLeech );
if ( manaLeech != 0 )
{
from.Mana += manaLeech;
from.PlaySound( 0x44D );
}
}
else if ( context.Type == typeof( VampiricEmbraceSpell ) )
{
from.Hits += AOS.Scale( damageGiven, 20 );
from.PlaySound( 0x44D );
}
}
if ( context != null && context.Type == typeof( VampiricEmbraceSpell ) )
{
from.Hits += AOS.Scale( damageGiven, 20 );
from.PlaySound( 0x44D );
}
}

View file

@ -25,44 +25,57 @@ namespace Server.Spells.Bushido
return 50;
}
public override bool Validate(Mobile from)
{
bool isValid=base.Validate(from);
if (isValid)
{
PlayerMobile ThePlayer = from as PlayerMobile;
ThePlayer.ExecutesLightningStrike = BaseMana;
}
return isValid;
}
public override bool IgnoreArmor( Mobile attacker )
{
double bushido = attacker.Skills[SkillName.Bushido].Value;
double criticalChance = (bushido * bushido) / 72000.0;
return ( criticalChance >= Utility.RandomDouble() );
}
public override bool OnBeforeSwing( Mobile attacker, Mobile defender )
{
return Validate( attacker ) && CheckMana( attacker, true );
/* no mana drain before actual hit */
bool enoughMana = CheckMana(attacker, false);
return Validate(attacker);
}
public override bool ValidatesDuringHit { get { return false; } }
public override void OnHit( Mobile attacker, Mobile defender, int damage )
{
//Validation in OnBeforeSwing
ClearCurrentMove( attacker );
attacker.SendLocalizedMessage( 1063168 ); // You attack with lightning precision!
defender.SendLocalizedMessage( 1063169 ); // Your opponent's quick strike causes extra damage!
defender.FixedParticles( 0x3818, 1, 11, 0x13A8, 0, 0, EffectLayer.Waist );
defender.PlaySound( 0x51D );
CheckGain( attacker );
SetContext( attacker );
ClearCurrentMove(attacker);
if (CheckMana(attacker, true))
{
attacker.SendLocalizedMessage(1063168); // You attack with lightning precision!
defender.SendLocalizedMessage(1063169); // Your opponent's quick strike causes extra damage!
defender.FixedParticles(0x3818, 1, 11, 0x13A8, 0, 0, EffectLayer.Waist);
defender.PlaySound(0x51D);
CheckGain(attacker);
SetContext(attacker);
}
}
public override void OnMiss( Mobile attacker, Mobile defender )
{
ClearCurrentMove( attacker );
SetContext( attacker );
}
public override void OnClearMove( Mobile attacker )
{
PlayerMobile ThePlayer = attacker as PlayerMobile; // this can be deletet if the PlayerMobile parts are moved to Server.Mobile
ThePlayer.ExecutesLightningStrike = 0;
}
}
}

View file

@ -43,7 +43,7 @@ namespace Server.Spells.Chivalry
if ( m is BaseCreature && ((BaseCreature)m).IsAnimatedDead )
continue;
if ( Caster != m && Caster.CanBeBeneficial( m, false, true ) && !(m is Golem) )
if ( Caster != m && m.InLOS( Caster ) && Caster.CanBeBeneficial( m, false, true ) && !(m is Golem) )
targets.Add( m );
}
@ -72,9 +72,6 @@ namespace Server.Spells.Chivalry
{
Caster.SendLocalizedMessage( 1010395 ); // The veil of death in this area is too strong and resists thy efforts to restore life.
}
else if( Core.ML && m.Region != null && m.Region.IsPartOf( typeof( HouseRegion ) ) )
{
}
else if( resChance > Utility.RandomDouble() )
{
m.FixedParticles( 0x375A, 1, 15, 5005, 5, 3, EffectLayer.Head );

View file

@ -2,6 +2,7 @@ using System;
using Server.Mobiles;
using Server.Targeting;
using Server.Network;
using Server.Spells.Chivalry;
namespace Server.Spells.Fifth
{
@ -33,7 +34,7 @@ namespace Server.Spells.Fifth
{
Caster.SendLocalizedMessage( 500237 ); // Target can not be seen.
}
else if ( Core.AOS && (m.Frozen || m.Paralyzed || (m.Spell != null && m.Spell.IsCasting)) )
else if ( Core.AOS && (m.Frozen || m.Paralyzed || (m.Spell != null && m.Spell.IsCasting && !(m.Spell is PaladinSpell))) )
{
Caster.SendLocalizedMessage( 1061923 ); // The target is already frozen.
}

View file

@ -3,6 +3,7 @@ using System.Collections;
using Server.Network;
using Server.Items;
using Server.Targeting;
using Server.Mobiles;
namespace Server.Spells.Necromancy
{
@ -36,8 +37,17 @@ namespace Server.Spells.Necromancy
public override void DoEffect( Mobile m )
{
if ( m is PlayerMobile )
((PlayerMobile)m).IgnoreMobiles = true;
m.PlaySound( 0x17F );
m.FixedParticles( 0x374A, 1, 15, 9902, 1108, 4, EffectLayer.Waist );
}
public override void RemoveEffect( Mobile m )
{
if ( m is PlayerMobile && m.AccessLevel == AccessLevel.Player )
((PlayerMobile)m).IgnoreMobiles = false;
}
}
}