Missing System Message "Your pet looks happier" (regardless of loyalty)

http://www.runuo.com/community/threads/ready-missing-system-message-your-pet-looks-happier.450209/

Not all powerscrolls do drop - Ninjitsu, Bushido etc.
http://www.runuo.com/community/threads/ready-not-all-powerscrolls-do-drop.459974/

Savage Kin Paint Wrong Skill Requirement + Wrong Success Chance
http://www.runuo.com/community/threads/ready-savage-kin-paint-wrong-skill-requirement-wrong-success-chance.455360/

Hag Quest - Stew, can't eat it
http://www.runuo.com/community/threads/ready-hag-quest-stew.454406/

Giant Blue Beetles shouldn't need beating into submission after being tamed once
http://www.runuo.com/community/threads/ready-giant-blue-beetles.450205/

Greater Dragon Fame/Karma Doesn't Match OSI
http://www.runuo.com/community/threads/ready-greater-dragon-fame-karma-doesnt-match-osi.472206/

Resizing Houses, you can resize a house by using a command under the house sign
http://www.runuo.com/community/threads/ready-resizing-houses.414762/

Crafted Shield Resists are wrong on RunUO
http://www.runuo.com/community/threads/ready-crafted-shield-resists.454186/

Yomotsu Mines, you should not be able to recall out of there.
http://www.runuo.com/community/threads/ready-yomotsu-mines.445486/

Missing Necro Icons in the Buff/Debuff Bar
http://www.runuo.com/community/threads/ready-missing-necro-icons-in-the-buff-debuff-bar.450872/

Chivalry Spells, you are allowed to attempt casting of spells outside of your skill range without a system message
http://www.runuo.com/community/threads/ready-chivalry-spells.450757/

Tinker tools use a different graphic on OSI
http://www.runuo.com/community/threads/ready-tinker-tools.460690/

Tinkering should not be required when crafted a Tetsubo
http://www.runuo.com/community/threads/ready-wrong-skill-requirement-carpentry-wrong-success-chances.455342/

Carpentry-Small+Large Beds -Wrong Success Chance
http://www.runuo.com/community/threads/ready-carpentry-small-large-beds-wrong-success-chance.455794/

Telekinesis, various changes to behaviour with items
http://www.runuo.com/community/threads/ready-telekinesis.455250/

Forensic Evaluation Various issues
http://www.runuo.com/community/threads/ready-forensic-evaluation-various-issues-merged.458700/

Animate Dead Corpses, you cannot carve the corpse after it's used
http://www.runuo.com/community/threads/ready-animate-dead-corpses.453823/

You should be able to use begging skill while riding
http://www.runuo.com/community/threads/ready-begging-while-riding.466174/

Crafting Mod Lower Requirements should only appear on shields
http://www.runuo.com/community/threads/ready-crafting-mod-lower-requirements.452112/

You should be revealed While Taking Poison/Strangle Damage
http://www.runuo.com/community/threads/ready-you-never-reveal-while-taking-poison-strangle-damage.456946/

Insurance messages don't do the math!
http://www.runuo.com/community/threads/ready-insurance-messages-dont-do-the-math.454928/

Slayers should work on area of effect spells
http://www.runuo.com/community/threads/ready-slayers-should-work-on-area-of-effect-spells.448774/

You should not be able to use any travel spell in Heartwood
http://www.runuo.com/community/threads/ready-heartwood.457379/

Welcome Back To The House Friend message does not show post-AoS
http://www.runuo.com/community/threads/ready-welcome-back-to-the-house-friend.415924/

Giant Beetle speed should be very fast when magery spells are cast on it
http://www.runuo.com/community/threads/ready-giant-beetle.417848/
This commit is contained in:
xavier 2011-06-25 18:39:14 +00:00
parent 07e45156e5
commit 5c7774b99a
54 changed files with 682 additions and 130 deletions

View file

@ -76,7 +76,7 @@ namespace Server.Engines.Craft
return 1044156; // You create an exceptional quality item and affix your maker's mark.
else if ( quality == 2 )
return 1044155; // You create an exceptional quality item.
else
else
return 1044154; // You create the item.
}
}
@ -118,15 +118,13 @@ namespace Server.Engines.Craft
SetNeededExpansion( index, Expansion.SE );
}
if( Core.AOS ) //Duplicate Entries to preserve ordering depending on era
if( Core.AOS ) //Duplicate Entries to preserve ordering depending on era
{
index = AddCraft( typeof( FishingPole ), 1044294, 1023519, 68.4, 93.4, typeof( Log ), 1044041, 5, 1044351 ); //This is in the categor of Other during AoS
AddSkill( index, SkillName.Tailoring, 40.0, 45.0 );
AddRes( index, typeof( Cloth ), 1044286, 5, 1044287 );
}
// Furniture
AddCraft( typeof( FootStool ), 1044291, 1022910, 11.0, 36.0, typeof( Log ), 1044041, 9, 1044351 );
AddCraft( typeof( Stool ), 1044291, 1022602, 11.0, 36.0, typeof( Log ), 1044041, 9, 1044351 );
@ -159,7 +157,7 @@ namespace Server.Engines.Craft
AddCraft( typeof( WoodenChest ), 1044292, 1023650, 73.6, 98.6, typeof( Log ), 1044041, 20, 1044351 );
AddCraft( typeof( EmptyBookcase ), 1044292, 1022718, 31.5, 56.5, typeof( Log ), 1044041, 25, 1044351 );
AddCraft( typeof( FancyArmoire ), 1044292, 1044312, 84.2, 109.2, typeof( Log ), 1044041, 35, 1044351 );
AddCraft( typeof( Armoire ), 1044292, 1022643, 84.2, 109.2, typeof( Log ), 1044041, 35, 1044351 );
AddCraft( typeof( Armoire ), 1044292, 1022643, 84.2, 109.2, typeof( Log ), 1044041, 35, 1044351 );
if( Core.SE )
{
@ -186,13 +184,13 @@ namespace Server.Engines.Craft
index = AddCraft( typeof( RedArmoire ), 1044292, 1030328, 90.0, 115.0, typeof( Log ), 1044041, 40, 1044351 );
SetNeededExpansion( index, Expansion.SE );
index = AddCraft( typeof( ElegantArmoire ), 1044292, 1030330, 90.0, 115.0, typeof( Log ), 1044041, 40, 1044351 );
SetNeededExpansion( index, Expansion.SE );
index = AddCraft( typeof( MapleArmoire ), 1044292, 1030332, 90.0, 115.0, typeof( Log ), 1044041, 40, 1044351 );
SetNeededExpansion( index, Expansion.SE );
index = AddCraft( typeof( CherryArmoire ), 1044292, 1030334, 90.0, 115.0, typeof( Log ), 1044041, 40, 1044351 );
SetNeededExpansion( index, Expansion.SE );
}
@ -207,7 +205,7 @@ namespace Server.Engines.Craft
AddCraft( typeof( GnarledStaff ), 1044295, 1025112, 78.9, 103.9, typeof( Log ), 1044041, 7, 1044351 );
AddCraft( typeof( WoodenShield ), 1044295, 1027034, 52.6, 77.6, typeof( Log ), 1044041, 9, 1044351 );
if( !Core.AOS ) //Duplicate Entries to preserve ordering depending on era
if( !Core.AOS ) //Duplicate Entries to preserve ordering depending on era
{
index = AddCraft( typeof( FishingPole ), 1044295, 1023519, 68.4, 93.4, typeof( Log ), 1044041, 5, 1044351 ); //This is in the categor of Other during AoS
AddSkill( index, SkillName.Tailoring, 40.0, 45.0 );
@ -222,9 +220,7 @@ namespace Server.Engines.Craft
index = AddCraft( typeof( Fukiya ), 1044295, 1030229, 60.0, 85.0, typeof( Log ), 1044041, 6, 1044351 );
SetNeededExpansion( index, Expansion.SE );
index = AddCraft( typeof( Tetsubo ), 1044295, 1030225, 85.0, 110.0, typeof( Log ), 1044041, 8, 1044351 );
AddSkill( index, SkillName.Tinkering, 40.0, 45.0 );
AddRes( index, typeof( IronIngot ), 1044036, 5, 1044037 );
index = AddCraft( typeof( Tetsubo ), 1044295, 1030225, 80.0, 140.3, typeof( Log ), 1044041, 10, 1044351 );
SetNeededExpansion( index, Expansion.SE );
}
@ -236,22 +232,22 @@ namespace Server.Engines.Craft
index = AddCraft( typeof( Harp ), 1044293, 1023761, 78.9, 103.9, typeof( Log ), 1044041, 35, 1044351 );
AddSkill( index, SkillName.Musicianship, 45.0, 50.0 );
AddRes( index, typeof( Cloth ), 1044286, 15, 1044287 );
index = AddCraft( typeof( Drums ), 1044293, 1023740, 57.8, 82.8, typeof( Log ), 1044041, 20, 1044351 );
AddSkill( index, SkillName.Musicianship, 45.0, 50.0 );
AddRes( index, typeof( Cloth ), 1044286, 10, 1044287 );
index = AddCraft( typeof( Lute ), 1044293, 1023763, 68.4, 93.4, typeof( Log ), 1044041, 25, 1044351 );
AddSkill( index, SkillName.Musicianship, 45.0, 50.0 );
AddRes( index, typeof( Cloth ), 1044286, 10, 1044287 );
index = AddCraft( typeof( Tambourine ), 1044293, 1023741, 57.8, 82.8, typeof( Log ), 1044041, 15, 1044351 );
AddSkill( index, SkillName.Musicianship, 45.0, 50.0 );
AddRes( index, typeof( Cloth ), 1044286, 10, 1044287 );
index = AddCraft( typeof( TambourineTassel ), 1044293, 1044320, 57.8, 82.8, typeof( Log ), 1044041, 15, 1044351 );
AddSkill( index, SkillName.Musicianship, 45.0, 50.0 );
AddRes( index, typeof( Cloth ), 1044286, 15, 1044287 );
AddRes( index, typeof( Cloth ), 1044286, 15, 1044287 );
if( Core.SE )
{
@ -261,16 +257,16 @@ namespace Server.Engines.Craft
}
// Misc
index = AddCraft( typeof( SmallBedSouthDeed ), 1044290, 1044321, 94.7, 113.1, typeof( Log ), 1044041, 100, 1044351 );
index = AddCraft( typeof( SmallBedSouthDeed ), 1044290, 1044321, 94.7, 119.8, typeof( Log ), 1044041, 100, 1044351 );
AddSkill( index, SkillName.Tailoring, 75.0, 80.0 );
AddRes( index, typeof( Cloth ), 1044286, 100, 1044287 );
index = AddCraft( typeof( SmallBedEastDeed ), 1044290, 1044322, 94.7, 113.1, typeof( Log ), 1044041, 100, 1044351 );
index = AddCraft(typeof(SmallBedEastDeed), 1044290, 1044322, 94.7, 119.8, typeof(Log), 1044041, 100, 1044351);
AddSkill( index, SkillName.Tailoring, 75.0, 80.0 );
AddRes( index, typeof( Cloth ), 1044286, 100, 1044287 );
index = AddCraft( typeof( LargeBedSouthDeed ), 1044290,1044323, 94.7, 113.1, typeof( Log ), 1044041, 150, 1044351 );
index = AddCraft(typeof(LargeBedSouthDeed), 1044290, 1044323, 94.7, 119.8, typeof(Log), 1044041, 150, 1044351);
AddSkill( index, SkillName.Tailoring, 75.0, 80.0 );
AddRes( index, typeof( Cloth ), 1044286, 150, 1044287 );
index = AddCraft( typeof( LargeBedEastDeed ), 1044290, 1044324, 94.7, 113.1, typeof( Log ), 1044041, 150, 1044351 );
index = AddCraft(typeof(LargeBedEastDeed), 1044290, 1044324, 94.7, 119.8, typeof(Log), 1044041, 150, 1044351);
AddSkill( index, SkillName.Tailoring, 75.0, 80.0 );
AddRes( index, typeof( Cloth ), 1044286, 150, 1044287 );
AddCraft( typeof( DartBoardSouthDeed ), 1044290, 1044325, 15.7, 40.7, typeof( Log ), 1044041, 5, 1044351 );

View file

@ -145,7 +145,7 @@ namespace Server.Engines.Craft
SetNeededExpansion( index, Expansion.SE );
}
index = AddCraft( typeof( TribalPaint ), 1044496, 1040000, 80.0, 80.0, typeof( SackFlour ), 1044468, 1, 1044253 );
index = AddCraft( typeof( TribalPaint ), 1044496, 1040000, Core.ML? 55.0 : 80.0, Core.ML? 105.0 : 80.0, typeof( SackFlour ), 1044468, 1, 1044253 );
AddRes( index, typeof( TribalBerry ), 1046460, 1, 1044253 );
if ( Core.SE )

View file

@ -0,0 +1,40 @@
using System;
using Server;
namespace Server.Items
{
public class HagCauldron : BaseAddon
{
[Constructable]
public HagCauldron()
{
AddonComponent pot;
pot = new AddonComponent(2420);
AddComponent(pot, 0, 0, 0); //pot w/ support
AddonComponent fire;
fire = new AddonComponent(4012); //fire pit
fire.Light = LightType.Circle150;
AddComponent(fire, 0, 0, 0);
}
public HagCauldron( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 ); // version
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,76 @@
using System;
using Server;
namespace Server.Items
{
public class HagStew : BaseAddon
{
[Constructable]
public HagStew()
{
AddonComponent stew;
stew = new AddonComponent(2416);
stew.Name = "stew";
stew.Visible = true;
AddComponent(stew, 0, 0, -7); //stew
}
public override void OnComponentUsed(AddonComponent stew, Mobile from)
{
if (!from.InRange(GetWorldLocation(), 2))
from.SendMessage("You are too far away.");
else
{
{
stew.Visible = false;
BreadLoaf hagstew = new BreadLoaf(); //this decides your fillrate
hagstew.Eat(from);
Timer m_timer = new ShowStew(stew);
m_timer.Start();
}
}
}
public class ShowStew : Timer
{
private AddonComponent stew;
public ShowStew(AddonComponent ac) : base(TimeSpan.FromSeconds(30))
{
stew = ac;
Priority = TimerPriority.OneSecond;
}
protected override void OnTick()
{
if ( stew.Visible == false )
{
Stop();
stew.Visible = true;
return;
}
}
}
public HagStew( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 ); // version
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,154 @@
using System;
using Server;
using Server.Items;
using Server.Multis;
using Server.Multis.Deeds;
using Server.Network;
using Server.Mobiles;
namespace Server.Gumps
{
public class ConfirmHouseResize : Gump
{
private Mobile m_Mobile;
private BaseHouse m_House;
private TempNoHousingRegion m_Temp;
public ConfirmHouseResize( Mobile mobile, BaseHouse house ) : base( 110, 100 )
{
m_Mobile = mobile;
m_House = house;
mobile.CloseGump( typeof( ConfirmHouseResize ) );
Closable = false;
AddPage( 0 );
AddBackground( 0, 0, 420, 280, 0x13BE );
AddImageTiled( 10, 10, 400, 20, 0xA40 );
AddAlphaRegion( 10, 10, 400, 20 );
AddHtmlLocalized( 10, 10, 400, 20, 1060635, 0x7800, false, false ); // <CENTER>WARNING</CENTER>
AddImageTiled( 10, 40, 400, 200, 0xA40 );
AddAlphaRegion( 10, 40, 400, 200 );
/* You are attempting to resize your house. You will be refunded the house's
value directly to your bank box. All items in the house will *remain behind*
and can be *freely picked up by anyone*. Once the house is demolished, however,
only this account will be able to place on the land for one hour. This *will*
circumvent the normal 7-day waiting period (if it applies to you). This action
will not un-condemn any other houses on your account. If you have other,
grandfathered houses, this action *WILL* condemn them. Are you sure you wish
to continue?*/
AddHtmlLocalized( 10, 40, 400, 200, 1080196, 0x7F00, false, true );
AddImageTiled( 10, 250, 400, 20, 0xA40 );
AddAlphaRegion( 10, 250, 400, 20 );
AddButton( 10, 250, 0xFA5, 0xFA7, 1, GumpButtonType.Reply, 0 );
AddButton( 210, 250, 0xFA5, 0xFA7, 0, GumpButtonType.Reply, 0 );
AddHtmlLocalized( 40, 250, 170, 20, 1011036, 0x7FFF, false, false ); // OKAY
AddHtmlLocalized( 240, 250, 170, 20, 1011012, 0x7FFF, false, false ); // CANCEL
}
public override void OnResponse( NetState state, RelayInfo info )
{
if ( info.ButtonID == 1 && !m_House.Deleted )
{
if ( m_House.IsOwner( m_Mobile ) )
{
if ( m_House.MovingCrate != null || m_House.InternalizedVendors.Count > 0 )
{
m_Mobile.SendLocalizedMessage( 1080455 ); // You can not resize your house at this time. Please remove all items fom the moving crate and try again.
return;
}
else if( !Guilds.Guild.NewGuildSystem && m_House.FindGuildstone() != null )
{
m_Mobile.SendLocalizedMessage( 501389 ); // You cannot redeed a house with a guildstone inside.
return;
}
/*else if ( m_House.PlayerVendors.Count > 0 )
{
m_Mobile.SendLocalizedMessage( 503236 ); // You need to collect your vendor's belongings before moving.
return;
}*/
else if ( m_House.HasRentedVendors && m_House.VendorInventories.Count > 0 )
{
m_Mobile.SendLocalizedMessage( 1062679 ); // You cannot do that that while you still have contract vendors or unclaimed contract vendor inventory in your house.
return;
}
else if ( m_House.HasRentedVendors )
{
m_Mobile.SendLocalizedMessage( 1062680 ); // You cannot do that that while you still have contract vendors in your house.
return;
}
else if ( m_House.VendorInventories.Count > 0 )
{
m_Mobile.SendLocalizedMessage( 1062681 ); // You cannot do that that while you still have unclaimed contract vendor inventory in your house.
return;
}
if ( m_Mobile.AccessLevel >= AccessLevel.GameMaster )
{
m_Mobile.SendMessage( "You do not get a refund for your house as you are not a player" );
m_House.RemoveKeys(m_Mobile);
m_House.Delete();
}
else
{
Item toGive = null;
if ( m_House.IsAosRules )
{
if ( m_House.Price > 0 )
toGive = new BankCheck( m_House.Price );
else
toGive = m_House.GetDeed();
}
else
{
toGive = m_House.GetDeed();
if ( toGive == null && m_House.Price > 0 )
toGive = new BankCheck( m_House.Price );
}
if ( toGive != null )
{
BankBox box = m_Mobile.BankBox;
if ( box.TryDropItem( m_Mobile, toGive, false ) )
{
if ( toGive is BankCheck )
m_Mobile.SendLocalizedMessage( 1060397, ( (BankCheck)toGive ).Worth.ToString() ); // ~1_AMOUNT~ gold has been deposited into your bank box.
m_House.RemoveKeys( m_Mobile );
new TempNoHousingRegion( m_House, m_Mobile );
m_House.Delete();
}
else
{
toGive.Delete();
m_Mobile.SendLocalizedMessage( 500390 ); // Your bank box is full.
}
}
else
{
m_Mobile.SendMessage( "Unable to refund house." );
}
}
}
else
{
m_Mobile.SendLocalizedMessage( 501320 ); // Only the house owner may do this.
}
}
else if ( info.ButtonID == 0 )
{
m_Mobile.CloseGump( typeof( ConfirmHouseResize ) );
m_Mobile.SendGump( new HouseGumpAOS( HouseGumpPageAOS.Customize, m_Mobile, m_House ) );
}
}
}
}

View file

@ -1220,10 +1220,16 @@ namespace Server.Gumps
{
if ( isOwner && m_House.MovingCrate == null && m_House.InternalizedVendors.Count == 0 )
{
if( !Guilds.Guild.NewGuildSystem && m_House.FindGuildstone() != null ) {
if( !Guilds.Guild.NewGuildSystem && m_House.FindGuildstone() != null )
{
from.SendLocalizedMessage( 501389 ); // You cannot redeed a house with a guildstone inside.
}
else {
else if ( Core.ML && from.AccessLevel < AccessLevel.GameMaster && DateTime.Now <= m_House.BuiltOn.AddHours ( 1 ) )
{
from.SendLocalizedMessage( 1080178 ); // You must wait one hour between each house demolition.
}
else
{
from.CloseGump( typeof( HouseDemolishGump ) );
from.SendGump( new HouseDemolishGump( from, m_House ) );
}

View file

@ -1614,7 +1614,8 @@ namespace Server.Items
if( Quality == ArmorQuality.Exceptional )
{
DistributeBonuses( (tool is BaseRunicTool ? 6 : Core.SE ? 15 : 14) ); // Not sure since when, but right now 15 points are added, not 14.
if ( !( Core.ML && this is BaseShield )) // Guessed Core.ML removed exceptional resist bonuses from crafted shields
DistributeBonuses( (tool is BaseRunicTool ? 6 : Core.SE ? 15 : 14) ); // Not sure since when, but right now 15 points are added, not 14.
if( Core.ML && !(this is BaseShield) )
{

View file

@ -207,8 +207,10 @@ namespace Server.Items
Effects.SendLocationParticles( EffectItem.Create( Location, Map, EffectItem.DefaultDuration ), 0x376A, 9, 32, 5022 );
Effects.PlaySound( Location, Map, 0x1F5 );
if ( !this.TrapOnOpen || !ExecuteTrap( from ) )
base.DisplayTo( from );
if( this.TrapOnOpen )
{
ExecuteTrap( from );
}
}
public override void Open( Mobile from )

View file

@ -4,7 +4,7 @@ using Server.Network;
namespace Server.Items
{
public class Dices : Item
public class Dices : Item, ITelekinesisable
{
[Constructable]
public Dices() : base( 0xFA7 )
@ -21,6 +21,19 @@ namespace Server.Items
if ( !from.InRange( this.GetWorldLocation(), 2 ) )
return;
Roll( from );
}
public void OnTelekinesis( Mobile from )
{
Effects.SendLocationParticles( EffectItem.Create( Location, Map, EffectItem.DefaultDuration ), 0x376A, 9, 32, 5022 );
Effects.PlaySound( Location, Map, 0x1F5 );
Roll( from );
}
public void Roll( Mobile from )
{
this.PublicOverheadMessage( MessageType.Regular, 0, false, string.Format( "*{0} rolls {1}, {2}*", from.Name, Utility.Random( 1, 6 ), Utility.Random( 1, 6 ) ) );
}

View file

@ -53,6 +53,11 @@ namespace Server.Items
/// Was the owner criminal when he died?
/// </summary>
Criminal = 0x00000020,
/// <summary>
/// Has this corpse been animated?
/// </summary>
Animated = 0x00000040,
}
public class Corpse : Container, ICarvable
@ -78,6 +83,9 @@ namespace Server.Items
private HairInfo m_Hair; // This contains the hair of the owner
private FacialHairInfo m_FacialHair; // This contains the facial hair of the owner
// For Forensics Evaluation
public string m_Forensicist; // Name of the first PlayerMobile who used Forensic Evaluation on the corpse
public static readonly TimeSpan MonsterLootRightSacrifice = TimeSpan.FromMinutes( 2.0 );
public static readonly TimeSpan InstancedCorpseTime = TimeSpan.FromMinutes( 3.0 );
@ -289,6 +297,13 @@ namespace Server.Items
set { SetFlag( CorpseFlag.Channeled, value ); }
}
[CommandProperty( AccessLevel.GameMaster )]
public bool Animated
{
get { return GetFlag( CorpseFlag.Animated ); }
set { SetFlag( CorpseFlag.Animated, value ); }
}
[CommandProperty( AccessLevel.GameMaster )]
public AccessLevel AccessLevel
{

View file

@ -268,13 +268,14 @@ namespace Server.Items
AosWeaponAttributes secondary = weapon.WeaponAttributes;
m_Props.SetAll( false );
m_Props.Set(0, true); // no lower stat requirements for weapons
if ( weapon is BaseRanged )
m_Props.Set( 2, true ); // ranged weapons cannot be ubws or mageweapon
for ( int i = 0; i < attributeCount; ++i )
{
int random = GetUniqueRandom( 25 );
int random = GetUniqueRandom( 24 );
if ( random == -1 )
break;
@ -329,15 +330,14 @@ namespace Server.Items
case 13: ApplyAttribute( secondary, min, max, AosWeaponAttribute.HitLowerDefend, 2, 50, 2 ); break;
case 14: ApplyAttribute( secondary, min, max, AosWeaponAttribute.HitLeechMana, 2, 50, 2 ); break;
case 15: ApplyAttribute( secondary, min, max, AosWeaponAttribute.HitLeechStam, 2, 50, 2 ); break;
case 16: ApplyAttribute( secondary, min, max, AosWeaponAttribute.LowerStatReq, 10, 100, 10 ); break;
case 17: ApplyAttribute( secondary, min, max, AosWeaponAttribute.ResistPhysicalBonus, 1, 15 ); break;
case 18: ApplyAttribute( secondary, min, max, AosWeaponAttribute.ResistFireBonus, 1, 15 ); break;
case 19: ApplyAttribute( secondary, min, max, AosWeaponAttribute.ResistColdBonus, 1, 15 ); break;
case 20: ApplyAttribute( secondary, min, max, AosWeaponAttribute.ResistPoisonBonus, 1, 15 ); break;
case 21: ApplyAttribute( secondary, min, max, AosWeaponAttribute.ResistEnergyBonus, 1, 15 ); break;
case 22: ApplyAttribute( secondary, min, max, AosWeaponAttribute.DurabilityBonus, 10, 100, 10 ); break;
case 23: weapon.Slayer = GetRandomSlayer(); break;
case 24: GetElementalDamages( weapon ); break;
case 16: ApplyAttribute( secondary, min, max, AosWeaponAttribute.ResistPhysicalBonus, 1, 15 ); break;
case 17: ApplyAttribute( secondary, min, max, AosWeaponAttribute.ResistFireBonus, 1, 15 ); break;
case 18: ApplyAttribute( secondary, min, max, AosWeaponAttribute.ResistColdBonus, 1, 15 ); break;
case 19: ApplyAttribute( secondary, min, max, AosWeaponAttribute.ResistPoisonBonus, 1, 15 ); break;
case 20: ApplyAttribute( secondary, min, max, AosWeaponAttribute.ResistEnergyBonus, 1, 15 ); break;
case 21: ApplyAttribute( secondary, min, max, AosWeaponAttribute.DurabilityBonus, 10, 100, 10 ); break;
case 22: weapon.Slayer = GetRandomSlayer(); break;
case 23: GetElementalDamages( weapon ); break;
}
}
}
@ -473,13 +473,16 @@ namespace Server.Items
int baseCount = ( isShield ? 7 : 20 );
int baseOffset = ( isShield ? 0 : 4 );
if ( !isShield && armor.MeditationAllowance == ArmorMeditationAllowance.All )
m_Props.Set( 3, true ); // remove mage armor from possible properties
if ( armor.Resource >= CraftResource.RegularLeather && armor.Resource <= CraftResource.BarbedLeather )
{
m_Props.Set( 0, true ); // remove lower requirements from possible properties for leather armor
m_Props.Set( 2, true ); // remove durability bonus from possible properties
if ( !isShield ) {
if (armor.MeditationAllowance == ArmorMeditationAllowance.All ) {
m_Props.Set( 3, true ); // remove mage armor from possible properties
}
m_Props.Set(0, true); // no lower stat requirements for any armor but shields
}
if ( armor.Resource >= CraftResource.RegularLeather && armor.Resource <= CraftResource.BarbedLeather )
m_Props.Set( 2, true ); // remove durability bonus from possible properties
if ( armor.RequiredRace == Race.Elf )
m_Props.Set( 7, true ); // elves inherently have night sight and elf only armor doesn't get night sight as a mod
@ -547,10 +550,11 @@ namespace Server.Items
AosElementAttributes resists = hat.Resistances;
m_Props.SetAll( false );
m_Props.Set(0, true); // no lower stat requirements for hats
for ( int i = 0; i < attributeCount; ++i )
{
int random = GetUniqueRandom( 19 );
int random = GetUniqueRandom( 18 );
if ( random == -1 )
break;
@ -568,14 +572,13 @@ namespace Server.Items
case 8: ApplyAttribute( primary, min, max, AosAttribute.LowerManaCost, 1, 8 ); break;
case 9: ApplyAttribute( primary, min, max, AosAttribute.LowerRegCost, 1, 20 ); break;
case 10: ApplyAttribute( primary, min, max, AosAttribute.Luck, 1, 100 ); break;
case 11: ApplyAttribute( secondary, min, max, AosArmorAttribute.LowerStatReq, 10, 100, 10 ); break;
case 12: ApplyAttribute( secondary, min, max, AosArmorAttribute.SelfRepair, 1, 5 ); break;
case 13: ApplyAttribute( secondary, min, max, AosArmorAttribute.DurabilityBonus, 10, 100, 10 ); break;
case 14: ApplyAttribute( resists, min, max, AosElementAttribute.Physical, 1, 15 ); break;
case 15: ApplyAttribute( resists, min, max, AosElementAttribute.Fire, 1, 15 ); break;
case 16: ApplyAttribute( resists, min, max, AosElementAttribute.Cold, 1, 15 ); break;
case 17: ApplyAttribute( resists, min, max, AosElementAttribute.Poison, 1, 15 ); break;
case 18: ApplyAttribute( resists, min, max, AosElementAttribute.Energy, 1, 15 ); break;
case 11: ApplyAttribute( secondary, min, max, AosArmorAttribute.SelfRepair, 1, 5 ); break;
case 12: ApplyAttribute( secondary, min, max, AosArmorAttribute.DurabilityBonus, 10, 100, 10 ); break;
case 13: ApplyAttribute( resists, min, max, AosElementAttribute.Physical, 1, 15 ); break;
case 14: ApplyAttribute( resists, min, max, AosElementAttribute.Fire, 1, 15 ); break;
case 15: ApplyAttribute( resists, min, max, AosElementAttribute.Cold, 1, 15 ); break;
case 16: ApplyAttribute( resists, min, max, AosElementAttribute.Poison, 1, 15 ); break;
case 17: ApplyAttribute( resists, min, max, AosElementAttribute.Energy, 1, 15 ); break;
}
}
}
@ -595,6 +598,7 @@ namespace Server.Items
AosSkillBonuses skills = jewelry.SkillBonuses;
m_Props.SetAll( false );
m_Props.Set(0, true); // no lower stat requirements for weapons
for ( int i = 0; i < attributeCount; ++i )
{
@ -647,6 +651,7 @@ namespace Server.Items
AosSkillBonuses skills = spellbook.SkillBonuses;
m_Props.SetAll( false );
m_Props.Set(0, true); // no lower stat requirements for weapons
for ( int i = 0; i < attributeCount; ++i )
{

View file

@ -39,4 +39,42 @@ namespace Server.Items
int version = reader.ReadInt();
}
}
public class TinkersTools : BaseTool
{
public override CraftSystem CraftSystem { get { return DefTinkering.CraftSystem; } }
[Constructable]
public TinkersTools()
: base(0x1EBC)
{
Weight = 1.0;
}
[Constructable]
public TinkersTools(int uses)
: base(uses, 0x1EBC)
{
Weight = 1.0;
}
public TinkersTools(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -81,15 +81,18 @@ namespace Server.Items
{
if ( _Skills.Count == 0 )
{
switch ( Core.Expansion )
_Skills.AddRange( m_Skills );
if (Core.AOS)
{
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;
_Skills.AddRange( m_AOSSkills );
if (Core.SE)
{
_Skills.AddRange( m_SESkills );
if (Core.ML)
_Skills.Add( SkillName.Spellweaving );
}
}
}
return _Skills;
}
}

View file

@ -140,6 +140,9 @@ namespace Server
AOS.Damage( m_Mobile, m_From, damage, 0, 0, 0, 100, 0 );
if ( 0.60 <= Utility.RandomDouble() ) // OSI: randomly revealed between first and third damage tick, guessing 60% chance
m_Mobile.RevealingAction();
if ( (m_Index % m_Poison.m_MessageInterval) == 0 )
m_Mobile.OnPoisoned( m_From, m_Poison, m_Poison );
}

View file

@ -1956,16 +1956,19 @@ namespace Server.Mobiles
delay -= 0.075;
}
double offset = (double)m_Mobile.Hits / m_Mobile.HitsMax;
if ( m_Mobile.ReduceSpeedWithDamage || m_Mobile.IsSubdued )
{
double offset = (double) m_Mobile.Hits / m_Mobile.HitsMax;
if( offset < 0.0 )
offset = 0.0;
else if( offset > 1.0 )
offset = 1.0;
if ( offset < 0.0 )
offset = 0.0;
else if ( offset > 1.0 )
offset = 1.0;
offset = 1.0 - offset;
offset = 1.0 - offset;
delay += (offset * 0.8);
delay += ( offset * 0.8 );
}
if( delay < 0.0 )
delay = 0.0;

View file

@ -125,13 +125,13 @@ namespace Server
{
typeof( Barracoon ), typeof( Mephitis ), typeof( Neira ),
typeof( Rikktor ), typeof( Semidar ), typeof( EnergyVortex ),
typeof( Beetle ), typeof( Pixie ), typeof( SilverSerpent ),
typeof( EliteNinja ), typeof( Pixie ), typeof( SilverSerpent ),
typeof( VorpalBunny ), typeof( FleshRenderer ), typeof( KhaldunRevenant ),
typeof( FactionDragoon ), typeof( FactionKnight ), typeof( FactionPaladin ),
typeof( FactionHenchman ), typeof( FactionMercenary ), typeof( FactionNecromancer ),
typeof( FactionSorceress ), typeof( FactionWizard ), typeof( FactionBerserker ),
typeof( FactionPaladin ), typeof( Leviathan ), typeof( FireBeetle ),
typeof( FanDancer ), typeof( EliteNinja )
typeof( FanDancer )
} ),
/* Medium */
new SpeedInfo( 0.25, 0.5, new Type[]
@ -206,7 +206,7 @@ namespace Server
typeof( Kappa ), typeof( KazeKemono ), typeof( DeathwatchBeetle ),
typeof( TsukiWolf ), typeof( YomotsuElder ), typeof( YomotsuPriest ),
typeof( YomotsuWarrior ), typeof( RevenantLion ), typeof( Oni ),
typeof( Gaman ), typeof( Crane )
typeof( Gaman ), typeof( Crane ), typeof( Beetle )
} )
};
}

View file

@ -11,15 +11,18 @@ namespace Server.Mobiles
[CorpseName( "a giant beetle corpse" )]
public class Beetle : BaseMount
{
public virtual double BoostedSpeed{ get{ return 0.1; } }
[Constructable]
public Beetle() : this( "a giant beetle" )
{
}
public override bool SubdueBeforeTame{ get{ return true; } } // Must be beaten into submission
public override bool ReduceSpeedWithDamage{ get{ return false; } }
[Constructable]
public Beetle( string name ) : base( name, 0x317, 0x3EBC, AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
public Beetle( string name ) : base( name, 0x317, 0x3EBC, AIType.AI_Melee, FightMode.Closest, 10, 1, 0.25, 0.5 )
{
SetStr( 300 );
SetDex( 100 );
@ -86,12 +89,22 @@ namespace Server.Mobiles
public override FoodType FavoriteFood{ get{ return FoodType.Meat; } }
// TODO: Speed boost when hit by magic.
public Beetle( Serial serial ) : base( serial )
{
}
public override void OnHarmfulSpell( Mobile from )
{
if ( !Controlled && ControlMaster == null )
CurrentSpeed = BoostedSpeed;
}
public override void OnCombatantChange()
{
if ( Combatant == null && !Controlled && ControlMaster == null )
CurrentSpeed = PassiveSpeed;
}
#region Pack Animal Methods
public override bool OnBeforeDeath()
{

View file

@ -466,6 +466,8 @@ namespace Server.Mobiles
public virtual bool AllowFemaleTamer{ get{ return true; } }
public virtual bool SubdueBeforeTame{ get{ return false; } }
public virtual bool StatLossAfterTame{ get{ return SubdueBeforeTame; } }
public virtual bool ReduceSpeedWithDamage{ get{ return true; } }
public virtual bool IsSubdued{ get{ return SubdueBeforeTame && ( Hits < ( HitsMax / 10 ) ); } }
public virtual bool Commandable{ get{ return true; } }
@ -1301,6 +1303,10 @@ namespace Server.Mobiles
{
}
public virtual void OnHarmfulSpell( Mobile from )
{
}
#region Alter[...]Damage From/To
public virtual void AlterDamageScalarFrom( Mobile caster, ref double scalar )
@ -1341,8 +1347,11 @@ namespace Server.Mobiles
int hides = Hides;
int scales = Scales;
if ( (feathers == 0 && wool == 0 && meat == 0 && hides == 0 && scales == 0) || Summoned || IsBonded )
if ( (feathers == 0 && wool == 0 && meat == 0 && hides == 0 && scales == 0) || Summoned || IsBonded || corpse.Animated )
{
if ( corpse.Animated )
corpse.SendLocalizedMessageTo( from, 500464 ); // Use this on corpses to carve away meat and hide
else
from.SendLocalizedMessage( 500485 ); // You see nothing useful to carve from the corpse.
}
else
@ -2067,7 +2076,7 @@ namespace Server.Mobiles
}
}
if ( happier )
/* if ( happier )*/ // looks like in OSI pets say they are happier even if they are at maximum loyalty
SayTo( from, 502060 ); // Your pet looks happier.
if ( Body.IsAnimal )

View file

@ -42,8 +42,8 @@ namespace Server.Mobiles
SetSkill( SkillName.Tactics, 110.0, 140.0 );
SetSkill( SkillName.Wrestling, 115.0, 145.0 );
Fame = 55000;
Karma = -55000;
Fame = 22000;
Karma = -15000;
VirtualArmor = 60;

View file

@ -10,6 +10,8 @@ namespace Server.Mobiles
{
public override bool SubdueBeforeTame{ get{ return true; } } // Must be beaten into submission
public override bool StatLossAfterTame{ get{ return true; } }
public virtual double BoostedSpeed{ get{ return 0.1; } }
public override bool ReduceSpeedWithDamage{ get{ return false; } }
[Constructable]
public FireBeetle() : base( "a fire beetle", 0xA9, 0x3E95, AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
@ -48,6 +50,18 @@ namespace Server.Mobiles
Hue = 0x489;
}
public override void OnHarmfulSpell( Mobile from )
{
if ( !Controlled && ControlMaster == null )
CurrentSpeed = BoostedSpeed;
}
public override void OnCombatantChange()
{
if ( Combatant == null && !Controlled && ControlMaster == null )
CurrentSpeed = PassiveSpeed;
}
public override bool OverrideBondingReqs()
{
return true;

View file

@ -2291,9 +2291,6 @@ namespace Server.Mobiles
}
}
if ( m_InsuranceCost > 0 )
SendLocalizedMessage( 1060398, m_InsuranceCost.ToString() ); // ~1_AMOUNT~ gold has been withdrawn from your bank box.
if ( m_InsuranceAward is PlayerMobile )
{
PlayerMobile pm = (PlayerMobile)m_InsuranceAward;

View file

@ -39,7 +39,7 @@ namespace Server.Mobiles
Add( new GenericBuyInfo( typeof( KeyRing ), 8, 20, 0x1010, 0 ) );
Add( new GenericBuyInfo( typeof( Lockpick ), 12, 20, 0x14FC, 0 ) );
Add( new GenericBuyInfo( typeof( TinkerTools ), 7, 20, 0x1EB8, 0 ) );
Add( new GenericBuyInfo( typeof( TinkersTools ), 7, 20, 0x1EBC, 0 ) );
Add( new GenericBuyInfo( typeof( Board ), 3, 20, 0x1BD7, 0 ) );
Add( new GenericBuyInfo( typeof( IronIngot ), 5, 16, 0x1BF2, 0 ) );
Add( new GenericBuyInfo( typeof( SewingKit ), 3, 20, 0xF9D, 0 ) );

View file

@ -201,7 +201,7 @@ namespace Server.Multis
return;
if ( Core.ML )
new TempNoHousingRegion( this );
new TempNoHousingRegion( this, null );
KillVendors();
Delete();
@ -3760,17 +3760,43 @@ namespace Server.Multis
public class TempNoHousingRegion : BaseRegion
{
public TempNoHousingRegion( BaseHouse house )
private Mobile m_RegionOwner;
public TempNoHousingRegion( BaseHouse house, Mobile regionowner )
: base( null, house.Map, Region.DefaultPriority, house.Region.Area )
{
Register();
m_RegionOwner = regionowner;
Timer.DelayCall( house.RestrictedPlacingTime, Unregister );
}
public bool CheckAccount( Mobile mobCheck, Mobile accCheck )
{
if ( accCheck != null )
{
Account a = accCheck.Account as Account;
if ( a != null )
{
for ( int i = 0; i < a.Length; ++i )
{
if ( a[i] == mobCheck )
return true;
}
}
}
return false;
}
public override bool AllowHousing( Mobile from, Point3D p )
{
return false;
if ( from == m_RegionOwner || CheckAccount( from, m_RegionOwner ) )
return true;
else
return false;
}
}
}

View file

@ -127,8 +127,12 @@ namespace Server.Multis
{
if ( m_Owner.IsFriend( m ) && m.AccessLevel < AccessLevel.GameMaster )
{
m_Owner.RefreshDecay();
m.SendLocalizedMessage( 501293 ); // Welcome back to the house, friend!
#region Mondain's Legacy
if ( ( Core.ML && m_Owner.IsOwner( m ) ) || !Core.ML )
m_Owner.RefreshDecay();
#endregion
if ( !Core.AOS )
m.SendLocalizedMessage( 501293 ); // Welcome back to the house, friend!
}
if ( m_Owner.IsAosRules )

View file

@ -222,9 +222,7 @@ namespace Server.Regions
base.OnSpeech( e );
Mobile from = e.Mobile;
if ( !from.Alive || !m_House.IsInside( from ) || !m_House.IsActive )
return;
Item sign = m_House.Sign;
bool isOwner = m_House.IsOwner( from );
bool isCoOwner = isOwner || m_House.IsCoOwner( from );
@ -232,8 +230,36 @@ namespace Server.Regions
if ( !isFriend )
return;
if ( !from.Alive )
return;
if ( Core.ML && Insensitive.Equals( e.Speech, "I wish to resize my house" ) )
{
if ( from.Map != sign.Map || !from.InRange( sign, 0 ) )
{
from.SendLocalizedMessage( 500295 ); // you are too far away to do that.
}
else if ( DateTime.Now <= m_House.BuiltOn.AddHours ( 1 ) )
{
from.SendLocalizedMessage( 1080178 ); // You must wait one hour between each house demolition.
}
else if ( isOwner )
{
from.CloseGump( typeof( ConfirmHouseResize ) );
from.CloseGump( typeof( HouseGumpAOS ) );
from.SendGump( new ConfirmHouseResize( from, m_House ) );
}
else
{
from.SendLocalizedMessage( 501320 ); // Only the house owner may do this.
}
}
if ( !m_House.IsInside( from ) || !m_House.IsActive )
return;
if ( e.HasKeyword( 0x33 ) ) // remove thyself
else if ( e.HasKeyword( 0x33 ) ) // remove thyself
{
if ( isFriend )
{

View file

@ -55,6 +55,7 @@ namespace Server.SkillHandlers
public static bool MustBeSubdued( BaseCreature bc )
{
if (bc.Owners.Count > 0) { return false; } //Checks to see if the animal has been tamed before
return bc.SubdueBeforeTame && (bc.Hits > (bc.HitsMax / 10));
}

View file

@ -65,7 +65,7 @@ namespace Server.SkillHandlers
else
number = 500402; // You are too far away to beg from her.
}
else if ( from.Mounted ) // If we're on a mount, who would give us money?
else if (!( Core.ML ) && from.Mounted ) // If we're on a mount, who would give us money? TODO: guessed it's removed since ML
{
number = 500404; // They seem unwilling to give you any money.
}

View file

@ -20,7 +20,7 @@ namespace Server.SkillHandlers
m.Target = new ForensicTarget();
m.RevealingAction();
m.SendLocalizedMessage( 500906 ); // What would you like to evaluate?
m.SendLocalizedMessage( 501000 ); // Show me the crime.
return TimeSpan.FromSeconds( 1.0 );
}
@ -53,8 +53,13 @@ namespace Server.SkillHandlers
{
Corpse c = (Corpse)target;
if ( c.m_Forensicist != null )
from.SendLocalizedMessage( 1042750, c.m_Forensicist ) ; // The forensicist ~1_NAME~ has already discovered that:
else
c.m_Forensicist = from.Name;
if ( ((Body)c.Amount).IsHuman )
c.LabelTo( from, 1042751, ( c.Killer == null ? "no one" : c.Killer.Name ) );//This person was killed by ~1_KILLER_NAME~
from.SendLocalizedMessage( 1042751, ( c.Killer == null ? "no one" : c.Killer.Name ) );//This person was killed by ~1_KILLER_NAME~
if ( c.Looters.Count > 0 )
{
@ -66,11 +71,11 @@ namespace Server.SkillHandlers
sb.Append( ((Mobile)c.Looters[i]).Name );
}
c.LabelTo( from, 1042752, sb.ToString() );//This body has been distrubed by ~1_PLAYER_NAMES~
from.SendLocalizedMessage( 1042752, sb.ToString() );//This body has been distrubed by ~1_PLAYER_NAMES~
}
else
{
c.LabelTo( from, 501002 );//The corpse has not be desecrated.
from.SendLocalizedMessage( 501002 );//The corpse has not be desecrated.
}
}
else

View file

@ -97,6 +97,12 @@ namespace Server.Spells
contexts.Remove( m );
}
public void HarmfulSpell( Mobile m )
{
if ( m is BaseCreature )
((BaseCreature)m).OnHarmfulSpell( m_Caster );
}
public Spell( Mobile caster, Item scroll, SpellInfo info )
{
m_Caster = caster;

View file

@ -555,18 +555,19 @@ namespace Server.Spells
new TravelValidator( IsTokunoDungeon ),
new TravelValidator( IsLampRoom ),
new TravelValidator( IsGuardianRoom ),
new TravelValidator( IsHeartwood ),
};
private static bool[,] m_Rules = new bool[,]
{
/*T2A(Fel) Ilshenar Wind(Tram), Wind(Fel), Dungeons(Fel), Solen(Tram), Solen(Fel), CrystalCave(Malas), Gauntlet(Malas), Gauntlet(Ferry), Stronghold, ChampionSpawn, Dungeons(Tokuno[Malas]), LampRoom(Doom), GuardianRoom(Doom) */
/* Recall From */ { false, true, true, false, false, true, false, false, false, false, true, false, true, false, false },
/* Recall To */ { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false },
/* Gate From */ { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false },
/* Gate To */ { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false },
/* Mark In */ { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false },
/* Tele From */ { true, true, true, true, true, true, true, false, true, true, false, true, true, true, true },
/* Tele To */ { true, true, true, true, true, true, true, false, true, false, false, true, true, true, true },
/*T2A(Fel) Ilshenar Wind(Tram), Wind(Fel), Dungeons(Fel), Solen(Tram), Solen(Fel), CrystalCave(Malas), Gauntlet(Malas), Gauntlet(Ferry), Stronghold, ChampionSpawn, Dungeons(Tokuno[Malas]), LampRoom(Doom), GuardianRoom(Doom), Heartwood */
/* Recall From */ { false, true, true, false, false, true, false, false, false, false, true, false, true, false, false, false },
/* Recall To */ { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false },
/* Gate From */ { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false },
/* Gate To */ { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false },
/* Mark In */ { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false },
/* Tele From */ { true, true, true, true, true, true, true, false, true, true, false, true, true, true, true, false },
/* Tele To */ { true, true, true, true, true, true, true, false, true, false, false, true, true, true, true, false },
};
public static bool CheckTravel( Mobile caster, TravelCheckType type )
@ -778,6 +779,13 @@ namespace Server.Spells
return ( x >= 356 && y >= 5 && x < 375 && y < 25 );
}
public static bool IsHeartwood( Map map, Point3D loc )
{
int x = loc.X, y = loc.Y;
return (map == Map.Trammel || map == Map.Felucca) && (x >= 6911 && y >= 254 && x < 7167 && y < 511);
}
public static bool IsInvalid( Map map, Point3D loc )
{
if( map == null || map == Map.Internal )
@ -918,7 +926,12 @@ namespace Server.Spells
}
if( target is BaseCreature && from != null && delay == TimeSpan.Zero )
((BaseCreature)target).OnDamagedBySpell( from );
{
BaseCreature c = (BaseCreature) target;
c.OnHarmfulSpell( from );
c.OnDamagedBySpell( from );
}
}
public static void Damage( Spell spell, Mobile target, double damage, int phys, int fire, int cold, int pois, int nrgy )
@ -979,7 +992,12 @@ namespace Server.Spells
}
if( target is BaseCreature && from != null && delay == TimeSpan.Zero )
((BaseCreature)target).OnDamagedBySpell( from );
{
BaseCreature c = (BaseCreature) target;
c.OnHarmfulSpell( from );
c.OnDamagedBySpell( from );
}
}
public static void DoLeech( int damageGiven, Mobile from, Mobile target )
@ -1097,7 +1115,12 @@ namespace Server.Spells
WeightOverloading.DFA = DFAlgorithm.Standard;
if( m_Target is BaseCreature && m_From != null )
((BaseCreature)m_Target).OnDamagedBySpell( m_From );
{
BaseCreature c = (BaseCreature) m_Target;
c.OnHarmfulSpell( m_From );
c.OnDamagedBySpell( m_From );
}
if( m_Spell != null )
m_Spell.RemoveDelayedDamageContext( m_Target );

View file

@ -32,12 +32,7 @@ namespace Server.Spells.Chivalry
if ( !base.CheckCast() )
return false;
if ( Caster.Skills[SkillName.Chivalry].Value < RequiredSkill )
{
Caster.SendLocalizedMessage( 1060172, RequiredSkill.ToString( "F1" ) ); // You must have at least ~1_SKILL_REQUIREMENT~ Chivalry to use this ability,
return false;
}
else if ( Caster.TithingPoints < RequiredTithing )
if ( Caster.TithingPoints < RequiredTithing )
{
Caster.SendLocalizedMessage( 1060173, RequiredTithing.ToString() ); // You must have at least ~1_TITHE_REQUIREMENT~ Tithing Points to use this ability,
return false;
@ -60,12 +55,7 @@ namespace Server.Spells.Chivalry
int mana = ScaleMana( RequiredMana );
if ( Caster.Skills[SkillName.Chivalry].Value < RequiredSkill )
{
Caster.SendLocalizedMessage( 1060172, RequiredSkill.ToString( "F1" ) ); // You must have at least ~1_SKILL_REQUIREMENT~ Chivalry to use this ability,
return false;
}
else if ( Caster.TithingPoints < requiredTithing )
if ( Caster.TithingPoints < requiredTithing )
{
Caster.SendLocalizedMessage( 1060173, RequiredTithing.ToString() ); // You must have at least ~1_TITHE_REQUIREMENT~ Tithing Points to use this ability,
return false;

View file

@ -65,7 +65,7 @@ namespace Server.Spells.Fifth
SpellHelper.CheckReflect( (int)this.Circle, ref from, ref target );
int damage = (int)((Caster.Skills[SkillName.Magery].Value + Caster.Int) / 5);
if ( damage > 60 )
damage = 60;
@ -104,8 +104,8 @@ namespace Server.Spells.Fifth
if ( lowestStat > 150 )
lowestStat = 150;
int damage = (highestStat - lowestStat) / 4;//less damage
double damage = GetDamageScalar(m)*(highestStat - lowestStat) / 4;//less damage
if ( damage > 45 )
damage = 45;

View file

@ -78,9 +78,11 @@ namespace Server.Spells.Fifth
}
m.Paralyze( TimeSpan.FromSeconds( duration ) );
m.PlaySound( 0x204 );
m.FixedEffect( 0x376A, 6, 1 );
HarmfulSpell( m );
}
FinishSequence();

View file

@ -187,6 +187,9 @@ namespace Server.Spells.Fifth
if ( m.ApplyPoison( m_Caster, p ) == ApplyPoisonResult.Poisoned )
if ( SpellHelper.CanRevealCaster( m ) )
m_Caster.RevealingAction();
if ( m is BaseCreature )
( (BaseCreature) m ).OnHarmfulSpell( m_Caster );
}
public override bool OnMoveOver( Mobile m )

View file

@ -51,6 +51,8 @@ namespace Server.Spells.First
TimeSpan length = SpellHelper.GetDuration( Caster, m );
BuffInfo.AddBuff( m, new BuffInfo( BuffIcon.Clumsy, 1075831, length, m, percentage.ToString() ) );
HarmfulSpell( m );
}
FinishSequence();

View file

@ -51,6 +51,8 @@ namespace Server.Spells.First
TimeSpan length = SpellHelper.GetDuration( Caster, m );
BuffInfo.AddBuff( m, new BuffInfo( BuffIcon.FeebleMind, 1075833, length, m, percentage.ToString() ) );
HarmfulSpell( m );
}
FinishSequence();

View file

@ -51,6 +51,8 @@ namespace Server.Spells.First
TimeSpan length = SpellHelper.GetDuration( Caster, m );
BuffInfo.AddBuff( m, new BuffInfo( BuffIcon.Weaken, 1075837, length, m, percentage.ToString() ) );
HarmfulSpell( m );
}
FinishSequence();

View file

@ -81,7 +81,9 @@ namespace Server.Spells.Fourth
string args = String.Format("{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}", percentage, percentage, percentage, 10, 10, 10, 10);
BuffInfo.AddBuff(m, new BuffInfo(BuffIcon.Curse, 1075835, 1075836, length, m, args.ToString()));
BuffInfo.AddBuff( m, new BuffInfo( BuffIcon.Curse, 1075835, 1075836, length, m, args.ToString() ) );
HarmfulSpell( m );
}
FinishSequence();

View file

@ -201,6 +201,9 @@ namespace Server.Spells.Fourth
AOS.Damage( m, m_Caster, damage, 0, 100, 0, 0, 0 );
m.PlaySound( 0x208 );
if ( m is BaseCreature )
((BaseCreature) m).OnHarmfulSpell( m_Caster );
}
return true;
@ -278,6 +281,9 @@ namespace Server.Spells.Fourth
AOS.Damage( m, caster, damage, 0, 100, 0, 0, 0 );
m.PlaySound( 0x208 );
if ( m is BaseCreature )
((BaseCreature) m).OnHarmfulSpell( caster );
}
}
}

View file

@ -98,6 +98,8 @@ namespace Server.Spells.Fourth
m.FixedParticles( 0x374A, 10, 15, 5032, EffectLayer.Head );
m.PlaySound( 0x1F8 );
}
HarmfulSpell( m );
}
FinishSequence();

View file

@ -380,6 +380,7 @@ namespace Server.Spells.Necromancy
corpse.ItemID = Utility.Random( 0xECA, 9 ); // bone graphic
corpse.Hue = 0;
corpse.ProcessDelta();
corpse.Animated = true;
Register( caster, summoned );
}

View file

@ -86,7 +86,7 @@ namespace Server.Spells.Necromancy
BuffInfo.AddBuff ( m, new BuffInfo ( BuffIcon.BloodOathCurse, 1075661, duration, m, Caster.Name.ToString () ) );
m_Table[m] = timer;
HarmfulSpell( m );
}
FinishSequence();

View file

@ -84,6 +84,8 @@ namespace Server.Spells.Necromancy
for ( int i = 0; i < mods.Length; ++i )
m.AddResistanceMod( mods[i] );
HarmfulSpell( m );
}
FinishSequence();

View file

@ -68,6 +68,11 @@ namespace Server.Spells.Necromancy
TimeSpan duration = TimeSpan.FromSeconds((Caster.Skills[SkillName.SpiritSpeak].Value / 12) + 1.0);
Timer.DelayCall(duration, new TimerStateCallback(EffectExpire_Callback), m);
HarmfulSpell( m );
BuffInfo.AddBuff(m, new BuffInfo(BuffIcon.EvilOmen, 1075647, 1075648, duration, m));
}
FinishSequence();

View file

@ -60,6 +60,8 @@ namespace Server.Spells.Necromancy
SetMindRotScalar( Caster, m, 1.25, duration );
else
SetMindRotScalar( Caster, m, 2.00, duration );
HarmfulSpell( m );
}
FinishSequence();

View file

@ -82,6 +82,7 @@ namespace Server.Spells.Necromancy
Misc.WeightOverloading.DFA = Misc.DFAlgorithm.Standard;
//SpellHelper.Damage( this, m, damage, 100, 0, 0, 0, 0, Misc.DFAlgorithm.PainSpike );
HarmfulSpell( m );
}
FinishSequence();

View file

@ -66,8 +66,47 @@ namespace Server.Spells.Necromancy
m_Table[m] = t;
}
HarmfulSpell( m );
}
//Calculations for the buff bar
double spiritlevel = Caster.Skills[SkillName.SpiritSpeak].Value / 10;
if (spiritlevel < 4)
spiritlevel = 4;
int d_MinDamage = 4;
int d_MaxDamage = ((int)spiritlevel + 1) * 3;
string args = String.Format("{0}\t{1}", d_MinDamage, d_MaxDamage);
int i_Count = (int)spiritlevel;
int i_MaxCount = i_Count;
int i_HitDelay = 5;
int i_Length = i_HitDelay;
while (i_Count > 1)
{
--i_Count;
if (i_HitDelay > 1)
{
if (i_MaxCount < 5)
{
--i_HitDelay;
}
else
{
int delay = (int)(Math.Ceiling((1.0 + (5 * i_Count)) / i_MaxCount));
if (delay <= 5)
i_HitDelay = delay;
else
i_HitDelay = 5;
}
}
i_Length += i_HitDelay;
}
TimeSpan t_Duration = TimeSpan.FromSeconds(i_Length);
BuffInfo.AddBuff(m, new BuffInfo(BuffIcon.Strangle, 1075794, 1075795, t_Duration, m, args.ToString()));
FinishSequence();
}
@ -171,6 +210,9 @@ namespace Server.Spells.Necromancy
damage *= 1.75;
AOS.Damage( m_Target, m_From, (int)damage, 0, 0, 0, 100, 0 );
if ( 0.60 <= Utility.RandomDouble() ) // OSI: randomly revealed between first and third damage tick, guessing 60% chance
m_Target.RevealingAction();
}
}
}

View file

@ -89,19 +89,19 @@ namespace Server.Spells.Seventh
else if ( !Core.AOS )
damage /= targets.Count;
double toDeal;
for ( int i = 0; i < targets.Count; ++i )
{
toDeal = damage;
Mobile m = targets[i];
double toDeal = damage;
if ( !Core.AOS && CheckResisted( m ) )
{
toDeal *= 0.5;
m.SendLocalizedMessage( 501783 ); // You feel yourself resisting magical energy.
}
toDeal *= GetDamageScalar( m );
Caster.DoHarmful( m );
SpellHelper.Damage( this, m, toDeal, 0, 0, 0, 0, 100 );

View file

@ -84,6 +84,8 @@ namespace Server.Spells.Seventh
m.FixedParticles( 0x374A, 10, 15, 5054, EffectLayer.Head );
m.PlaySound( 0x1F9 );
}
HarmfulSpell( m );
}
FinishSequence();

View file

@ -87,20 +87,21 @@ namespace Server.Spells.Seventh
damage = (damage * 2) / targets.Count;
else if ( !Core.AOS )
damage /= targets.Count;
double toDeal;
for ( int i = 0; i < targets.Count; ++i )
{
Mobile m = targets[i];
double toDeal = damage;
toDeal = damage;
if ( !Core.AOS && CheckResisted( m ) )
{
toDeal *= 0.5;
damage *= 0.5;
m.SendLocalizedMessage( 501783 ); // You feel yourself resisting magical energy.
}
toDeal *= GetDamageScalar( m );
Caster.DoHarmful( m );
SpellHelper.Damage( this, m, toDeal, 0, 100, 0, 0, 0 );

View file

@ -75,6 +75,8 @@ namespace Server.Spells.Sixth
m.FixedParticles( 0x374A, 10, 15, 5028, EffectLayer.Waist );
m.PlaySound( 0x1FB );
HarmfulSpell( m );
}
}

View file

@ -188,6 +188,9 @@ namespace Server.Spells.Sixth
m.PlaySound( 0x204 );
m.FixedEffect( 0x376A, 10, 16 );
if ( m is BaseCreature )
((BaseCreature) m).OnHarmfulSpell( m_Caster );
}
return true;

View file

@ -93,6 +93,8 @@ namespace Server.Spells.Third
m.FixedParticles( 0x374A, 10, 15, 5021, EffectLayer.Waist );
m.PlaySound( 0x205 );
HarmfulSpell( m );
}
FinishSequence();

View file

@ -66,7 +66,6 @@ namespace Server.Spells.Third
Effects.SendLocationParticles( EffectItem.Create( item.Location, item.Map, EffectItem.DefaultDuration ), 0x376A, 9, 32, 5022 );
Effects.PlaySound( item.Location, item.Map, 0x1F5 );
item.DisplayTo( Caster );
item.OnItemUsed( Caster, item );
}
}