- You can't anymore place castles or keeps in Malas facet

(http://www.runuo.com/bugs/index.php?cmd=view&id=38)

- Unfilled commodity deeds now carry the etching "Unfilled"
(http://www.runuo.com/bugs/index.php?cmd=view&id=40)

- Empty scrolls can be deeded in a commodity deed
(http://www.uodemise.com/discussion/showthread.php?t=127485)

- Dying tubs, if locked down, can allow security level choices
(http://www.uodemise.com/discussion/showthread.php?t=128546)

- Changes in Energy Vortex skills: they'll have 120 wrestling (it was 100) and 100 tactics (it was 90)
(http://www.uodemise.com/discussion/showthread.php?t=122733)

- Wooden Footlockers now show the correct container gump
(http://www.uodemise.com/discussion/showthread.php?t=126452)

- Changes to Interior Decorator (still not includes the fix to turn paragon chests):
--> single item addons can be raised/lowered
--> the gump stays visible until target is cancelled
--> target won't be cancelled automatically when the decorator is used on a target
(http://www.uodemise.com/discussion/showthread.php?t=126668)

- Doom Lever Puzzle item list changed to generics
(http://www.uodemise.com/discussion/showthread.php?t=130396)

- Morphed forms will check now the current skill level: the morph effect is lost if skill level goes under the minimum required.
(http://www.uodemise.com/discussion/showthread.php?t=116542)

- Mage NPC vendors now buy necro scrolls; the price of scrolls got tweaked (= raised) to match OSI
(http://www.runuo.com/bugs/index.php?cmd=view&id=90)
(http://www.runuo.com/bugs/index.php?cmd=view&id=113)

- You can't anymore discord NPC vendors
(http://www.runuo.com/bugs/index.php?cmd=view&id=33)

- Removing a rune from runebook won't change the default rune set
(http://www.runuo.com/bugs/index.php?cmd=view&id=41)

- Various runebook security changes (see link for the list)
(http://www.runuo.com/bugs/index.php?cmd=view&id=39)

- You can't use the Sacrifice virtue while hidden
(http://www.runuo.com/bugs/index.php?cmd=view&id=42)

- Added the Deceit Brazier: doubleclicking it will summon a random "britannian" monster (check [props for delays)
(http://www.uodemise.com/discussion/showthread.php?t=123805)

- Casting spells will raise also the secondary skill associated (example: Necro and SpiritSpeak)
(http://www.runuo.com/bugs/index.php?cmd=view&id=43)

- Word of Death changes:
--> the "pitful damage" is much powerful now
--> you have to bring the target health below (5*arcanefocus)% to strike the powerful blast of 300 chaos damage
--> the damage is influenced by SDI
(http://www.runuo.com/bugs/index.php?cmd=view&id=36)

- Teleporters generated by [telgen got corrected for the Wrong dungeon
(http://www.runuo.com/bugs/index.php?cmd=view&id=34)
This commit is contained in:
daedalus 2009-11-09 19:29:19 +00:00
parent b54bf2c8bb
commit 95de3595cd
23 changed files with 586 additions and 115 deletions

View file

@ -197,9 +197,9 @@ namespace Server.Commands
CreateTeleporter( 5594, 1841, -9, 5467, 1805, 7, map, false );
// Wrong
CreateTeleporter( 5824, 631, 0, 2041, 215, 14, map, true );
CreateTeleporter( 5825, 631, 0, 2042, 215, 14, map, true );
CreateTeleporter( 5826, 631, 0, 2043, 215, 14, map, true );
CreateTeleporter( 5824, 631, 5, 2041, 215, 14, map, true );
CreateTeleporter( 5825, 631, 5, 2042, 215, 14, map, true );
CreateTeleporter( 5825, 631, 5, 2043, 215, 14, map, true );
CreateTeleporter( 5698, 662, 0, 5793, 527, 10, map, false );
DestroyTeleporter( 5863, 525, 15, map );

View file

@ -5,7 +5,6 @@ using Server.Network;
using Server.Mobiles;
using Server.Commands;
using System.Collections.Generic;
using System.Collections;
/*
this is From me to you, Under no terms, Conditions... K? to apply you
@ -22,10 +21,10 @@ namespace Server.Engines.Doom
private UInt16 m_MyKey;
private UInt16 m_TheirKey;
private ArrayList m_Levers;
private ArrayList m_Teles;
private ArrayList m_Statues;
private ArrayList m_Tiles;
private List<Item> m_Levers;
private List<Item> m_Teles;
private List<Item> m_Statues;
private List<LeverPuzzleRegion> m_Tiles;
private Mobile m_Successful;
private LampRoomBox m_Box;
private Region m_LampRoom;
@ -92,19 +91,19 @@ namespace Server.Engines.Doom
installed=true;
int i=0;
m_Levers = new ArrayList(); /* codes are 0x1 shifted left x # of bits, easily handled here */
m_Levers = new List<Item>(); /* codes are 0x1 shifted left x # of bits, easily handled here */
for (; i<4; i++)
m_Levers.Add( AddLeverPuzzlePart( TA[i], new LeverPuzzleLever( (ushort)(1<<i), this )));
m_Tiles = new ArrayList();
m_Tiles = new List<LeverPuzzleRegion>();
for (; i<9; i++)
m_Tiles.Add( new LeverPuzzleRegion( this, TA[i] ));
m_Teles = new ArrayList();
m_Teles = new List<Item>();
for (; i<15; i++)
m_Teles.Add( AddLeverPuzzlePart( TA[i], new LampRoomTelePorter( TA[++i] )));
m_Statues = new ArrayList();
m_Statues = new List<Item>();
for (; i<19; i++)
m_Statues.Add( AddLeverPuzzlePart( TA[i], new LeverPuzzleStatue( TA[++i], this )));
@ -159,7 +158,7 @@ namespace Server.Engines.Doom
}
}
public static void NukeItemList( ArrayList list )
public static void NukeItemList( List<Item> list )
{
if ( list != null && list.Count != 0 )
{
@ -395,16 +394,21 @@ namespace Server.Engines.Doom
{
IEntity m_IEntity = new Entity( Serial.Zero, RandomPointIn( m_Player.Location, 10 ), m_Player.Map );
foreach( Mobile m in m_IEntity.Map.GetMobilesInRange( m_IEntity.Location, 2 ) )
List<Mobile> mobiles = new List<Mobile>();
foreach( Mobile m in m_IEntity.Map.GetMobilesInRange( m_IEntity.Location, 2 ))
{
if( IsValidDamagable( m ) && m != m_Player )
mobiles.Add( m );
}
for( int k=0; k<mobiles.Count; k++ )
{
if( IsValidDamagable( mobiles[k] ) && mobiles[k] != m_Player )
{
PlayEffect( m_Player, m, Rock(), 8, true );
DoDamage( m, 25, 30, false );
PlayEffect( m_Player, mobiles[k], Rock(), 8, true );
DoDamage( mobiles[k], 25, 30, false );
if( m.Player )
if( mobiles[k].Player )
{
POHMessage( m, 2 ); // OUCH!
POHMessage( mobiles[k], 2 ); // OUCH!
}
}
}
@ -510,8 +514,6 @@ namespace Server.Engines.Doom
return true;
}
/* TODO: need to resolve lockup @ basecreature damage
if( m is BaseCreature )
{
BaseCreature bc=(BaseCreature)m;
@ -520,7 +522,6 @@ namespace Server.Engines.Doom
return true;
}
}
*/
}
return false;
}
@ -554,14 +555,10 @@ namespace Server.Engines.Doom
public static void DoDamage( Mobile m, int min, int max, bool poison )
{
int damage = Utility.Random(min,max);
if ( Core.AOS )
if ( m != null && !m.Deleted && m.Alive )
{
AOS.Damage( (m is BaseCreature) ? (BaseCreature)m : m, damage,(poison) ? 0 : 100 , 0, 0,(poison) ? 100 : 0, 0 );
}
else
{
m.Damage( damage );
int damage = Utility.Random(min,max);
AOS.Damage( m, damage,(poison) ? 0 : 100 , 0, 0,(poison) ? 100 : 0, 0 );
}
}
@ -717,13 +714,13 @@ namespace Server.Engines.Doom
int version = reader.ReadInt();
m_Levers = reader.ReadItemList();
m_Statues = reader.ReadItemList();
m_Teles = reader.ReadItemList();
m_Levers = reader.ReadStrongItemList();
m_Statues = reader.ReadStrongItemList();
m_Teles = reader.ReadStrongItemList();
m_Box = reader.ReadItem() as LampRoomBox;
m_Tiles = new ArrayList();
m_Tiles = new List<LeverPuzzleRegion>();
for (int i = 4; i<9; i++)
m_Tiles.Add( new LeverPuzzleRegion( this, TA[i] ));

View file

@ -20,10 +20,15 @@ namespace Server
public static void OnVirtueUsed( Mobile from )
{
if ( from.Alive )
from.Target = new InternalTarget();
else
Resurrect( from );
if ( !from.Hidden )
{
if ( from.Alive )
from.Target = new InternalTarget();
else
Resurrect( from );
}
else
from.SendLocalizedMessage( 1052015 ); // You cannot do that while hidden.
}
public static void CheckAtrophy( Mobile from )

View file

@ -266,14 +266,14 @@ namespace Server.Gumps
if ( buttonID == 1 ) // Rename book
{
if ( m_Book.CheckAccess( from ) )
if ( !m_Book.IsLockedDown || from.AccessLevel >= AccessLevel.GameMaster )
{
from.SendLocalizedMessage( 502414 ); // Please enter a title for the runebook:
from.Prompt = new InternalPrompt( m_Book );
}
else
{
from.SendLocalizedMessage( 502413 ); // That cannot be done while the book is locked down.
from.SendLocalizedMessage( 502413, null, 0x35 ); // That cannot be done while the book is locked down.
}
}
else
@ -319,7 +319,7 @@ namespace Server.Gumps
}
case 1: // Drop rune
{
if ( m_Book.CheckAccess( from ) )
if ( !m_Book.IsLockedDown || from.AccessLevel >= AccessLevel.GameMaster )
{
m_Book.DropRune( from, e, index );
@ -328,7 +328,7 @@ namespace Server.Gumps
}
else
{
from.SendLocalizedMessage( 502413 ); // That cannot be done while the book is locked down.
from.SendLocalizedMessage( 502413, null, 0x35 ); // That cannot be done while the book is locked down.
}
break;
@ -344,10 +344,6 @@ namespace Server.Gumps
from.SendLocalizedMessage( 502417 ); // New default location set.
}
else
{
from.SendLocalizedMessage( 502413 ); // That cannot be done while the book is locked down.
}
break;
}

View file

@ -859,6 +859,7 @@ namespace Server.Items
[Constructable]
public WoodenFootLocker() : base( 0x2811 )
{
GumpID = 0x10B;
}
public WoodenFootLocker( Serial serial ) : base( serial )
@ -869,7 +870,7 @@ namespace Server.Items
{
base.Serialize( writer );
writer.Write( (int) 1 ); // version
writer.Write( (int) 2 ); // version
}
public override void Deserialize( GenericReader reader )
@ -880,6 +881,9 @@ namespace Server.Items
if ( version == 0 && Weight == 15 )
Weight = -1;
if ( version < 2 )
GumpID = 0x10B;
}
}

View file

@ -107,6 +107,8 @@ namespace Server.Items
if ( m_Commodity != null && m_Commodity is ICommodity )
list.Add( 1060658, "#{0}\t{1}", ((ICommodity)m_Commodity).DescriptionNumber, m_Commodity.Amount ); // ~1_val~: ~2_val~
else
list.Add( 1060748 ); // unfilled
}
public override void OnSingleClick( Mobile from )

View file

@ -0,0 +1,299 @@
/***************************************************************************
* DeceitBrazier.cs
* Author : phoenix_smasher7 (ps7)
* Version : 3.0
*
****************************************************************************/
/***************************************************************************
* Description:
*
* Just a little spawning system OSI made and which RunUO lacked.
* DClicking brazier will spawn a random creature listed in m_Creatures.
*
****************************************************************************/
/***************************************************************************
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
***************************************************************************/
/***************************************************************************
* Clilocs used:
*
* 500760 - The brazier fizzes and pops, but nothing seems to happen.
* 500761 - Heed this warning well, and use this brazier at your own peril.
*
***************************************************************************/
/***************************************************************************
* Changelog:
*
* v1.5
* Label was incorrect.Corrected.
* Brazier will now only warn you if brazier can spawn another creature.
* Added many other creatures to spawn list.
* v1.6
* Added missing elementals.
* Removed nonagressive critters.
* v2.0
* Added some other missing creatures.
* Added spawn range so that it will not always spawn on top of the brazier.
* Added the flamestrike effect when creature spawned.
* v2.1
* Removed Jukas from the list since they no longer spawn in Britannia.
* v2.2
* Code cleanup
* v2.3
* Changed cooldown message to display as overhead message.
* v2.4
* Added ability to control usage of the brazier.By returning the value to true
* in game you will be able to use the brazier again without having to wait for 15 minutes.
* v3.0
* Medium code change.
* Made the spawner more customizable so it can fit others needs too.
* Just set the CanTalk true and Delay to anything you want ingame and use it and you are ready to go.
* Also fixed the serialization error.
* It is highly recommended that you remove any trace left by older scripts.
* v3.1
* Removed the delay between warnings.
*
***************************************************************************/
/***************************************************************************
* Notes:
*
* No Matter what I've tried I have failed to create a timer that will queue the effects.In OSI it's like
* FireColumn01 Spawns
* 1 Second passes
* FireColumn02 Spawns along with our creature. // At least this is the Information I got from Erica.
* If someone else could confirm it would remove further doubts.
* Where I couldn't succeed was the coordinates where our second effect and creature spawn.
* Creatures kept spawning at internal with coordinates of x0y0z0.
* If anyone is willing to help out with that one it's more than appreciated.
*
****************************************************************************/
using System;
using Server;
using Server.Misc;
using Server.Network;
using System.Collections;
using Server.Mobiles;
namespace Server.Items
{
public class DeceitBrazier : Item
{
private Timer m_Timer;
private bool m_CanTalk;
private int m_SpawnRange;
private DateTime m_LastUse = DateTime.MinValue;
private TimeSpan m_Delay;
private DateTime m_NextUse;
[CommandProperty( AccessLevel.Counselor, AccessLevel.GameMaster )]
public DateTime LastUse
{
get{ return m_LastUse; }
set{ m_LastUse = value; }
}
[CommandProperty(AccessLevel.GameMaster)]
public DateTime NextUse
{
get { return m_NextUse; }
}
[CommandProperty(AccessLevel.GameMaster)]
public TimeSpan Delay
{
get { return m_Delay; }
set
{
m_NextUse = m_NextUse - m_Delay;
m_Delay = value;
m_NextUse = m_NextUse + m_Delay;
}
}
[CommandProperty(AccessLevel.GameMaster)]
public bool CanTalk
{
get{ return m_CanTalk; }
set
{
m_CanTalk = value;
}
}
private static Type[] m_Creatures = new Type[]
{
#region Animals
typeof( FireSteed ), //Set the tents up people!
#endregion
#region Undead
typeof( Skeleton ), typeof( SkeletalKnight ), typeof( SkeletalMage ), typeof( Mummy ),
typeof( BoneKnight ), typeof( Lich ), typeof( LichLord ), typeof( BoneMagi ),
typeof( Wraith ), typeof( Shade ), typeof( Spectre ), typeof( Zombie ),
typeof( RottingCorpse ), typeof( Ghoul ),
#endregion
#region Demons
typeof( Balron ), typeof( Daemon ), typeof( Imp ), typeof( GreaterMongbat ),
typeof( Mongbat ), typeof( IceFiend ), typeof( Gargoyle ), typeof( StoneGargoyle ),
typeof( FireGargoyle ), typeof( HordeMinion ),
#endregion
#region Gazers
typeof( Gazer ), typeof( ElderGazer ), typeof( GazerLarva ),
#endregion
#region Uncategorized
typeof( Harpy ), typeof( StoneHarpy ), typeof( HeadlessOne ), typeof( HellHound ),
typeof( HellCat ), typeof( Phoenix ), typeof( LavaLizard ), typeof( SandVortex ),
typeof( ShadowWisp ), typeof( SwampTentacle ), typeof( PredatorHellCat ), typeof( Wisp ),
#endregion
#region Arachnid
typeof( GiantSpider ), typeof( DreadSpider ), typeof( FrostSpider ), typeof( Scorpion ),
#endregion
#region Repond
typeof( ArcticOgreLord ), typeof( Cyclops ), typeof( Ettin ), typeof( EvilMage ),
typeof( FrostTroll ), typeof( Ogre ), typeof( OgreLord ), typeof( Orc ),
typeof( OrcishLord ), typeof( OrcishMage ), typeof( OrcBrute ), typeof( Ratman ),
typeof( RatmanMage ), typeof( OrcCaptain ), typeof( Troll ), typeof( Titan ),
typeof( EvilMageLord ), typeof( OrcBomber ), typeof( RatmanArcher ),
#endregion
#region Reptilian
typeof( Dragon ), typeof( Drake ), typeof( Snake ), typeof( GreaterDragon ),
typeof( IceSerpent ), typeof( GiantSerpent ), typeof( IceSnake ), typeof( LavaSerpent ),
typeof( Lizardman ), typeof( Wyvern ), typeof( WhiteWyrm ),
typeof( ShadowWyrm ), typeof( SilverSerpent ), typeof( LavaSnake ),
#endregion
#region Elementals
typeof( EarthElemental ), typeof( PoisonElemental ), typeof( FireElemental ), typeof( SnowElemental ),
typeof( IceElemental ), typeof( ToxicElemental ), typeof( WaterElemental ), typeof( Efreet ),
typeof( AirElemental ), typeof( Golem ),
#endregion
#region Random Critters
typeof( Sewerrat ), typeof( GiantRat ), typeof( DireWolf ), typeof( TimberWolf ),
typeof( Cougar ), typeof( Alligator )
#endregion
};
public static Type[] Creatures { get { return m_Creatures; } }
public override int LabelNumber{ get{ return 1023633; } } // Brazier
[Constructable]
public DeceitBrazier() : base( 0xE31 )
{
Movable = false;
Light = LightType.Circle225;
}
public DeceitBrazier( Serial serial ) : base( serial )
{
}
public override void OnDoubleClick( Mobile from )
{
if ( from.InRange( GetWorldLocation(), 2 ) )
{
Mobile m = null;
try
{
if(m_NextUse <= DateTime.Now)
{
Map map = Map;
m = Activator.CreateInstance( m_Creatures[Utility.Random( m_Creatures.Length )] ) as Mobile;
Point3D loc = ( GetSpawnPosition() );
m.MoveToWorld( loc, map );
Effects.SendLocationParticles( EffectItem.Create( m.Location, m.Map, EffectItem.DefaultDuration ), 0x3709, 10, 30, 5052 );
m_LastUse = DateTime.Now;
m_NextUse = DateTime.Now + m_Delay;
}
else if ( m_NextUse > DateTime.Now )
{
PublicOverheadMessage( MessageType.Regular, 0x3B2, 500760 ); // The brazier fizzes and pops, but nothing seems to happen.
}
}
catch
{ }
}
else
{
from.SendLocalizedMessage( 500446 ); // That is too far away.
}
}
private void TalkAgain()
{
if( m_NextUse <= DateTime.Now )
m_CanTalk = true;
}
public Point3D GetSpawnPosition()
{
m_SpawnRange = 6;
Map map = Map;
int x = Location.X + (Utility.Random( (m_SpawnRange * 2) + 1 ) - m_SpawnRange);
int y = Location.Y + (Utility.Random( (m_SpawnRange * 2) + 1 ) - m_SpawnRange);
return new Point3D( x, y, this.Z );
}
public override bool HandlesOnMovement{ get{ return true; } }
public override void OnMovement(Mobile m, Point3D oldLocation)
{
if ( m.InRange( this, 1 ) && m.Player && m_NextUse <= DateTime.Now && !( m.AccessLevel > AccessLevel.Player && m.Hidden ) && m_CanTalk )
{
PublicOverheadMessage( MessageType.Regular, 0x3B2, 500761 ); // Heed this warning well, and use this brazier at your own peril.
base.OnMovement( m, oldLocation );
m_Timer = Timer.DelayCall( TimeSpan.FromMinutes( 15 ), new TimerCallback( TalkAgain ) );
}
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 ); // version
writer.Write( (bool) m_CanTalk );
writer.Write( (DateTime)m_LastUse );
writer.Write( (DateTime)m_NextUse );
writer.Write( (int)m_SpawnRange );
writer.Write( (TimeSpan)m_Delay );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
m_CanTalk = reader.ReadBool();
m_LastUse = reader.ReadDateTime();
m_NextUse = reader.ReadDateTime();
m_SpawnRange = reader.ReadInt();
m_Delay = reader.ReadTimeSpan();
}
}
}

View file

@ -62,10 +62,11 @@ namespace Server.Items
{
if ( !CheckUse( this, from ) )
return;
if ( m_Command == DecorateCommand.None )
if ( from.FindGump( typeof( InteriorDecorator.InternalGump ) ) == null )
from.SendGump( new InternalGump( this ) );
else
if ( m_Command != DecorateCommand.None )
from.Target = new InternalTarget( this );
}
@ -99,13 +100,13 @@ namespace Server.Items
AddBackground( 0, 0, 200, 200, 2600 );
AddButton( 50, 45, 2152, 2154, 1, GumpButtonType.Reply, 0 );
AddButton( 50, 45, ( decorator.Command == DecorateCommand.Turn ? 2154 : 2152 ), 2154, 1, GumpButtonType.Reply, 0 );
AddHtmlLocalized( 90, 50, 70, 40, 1018323, false, false ); // Turn
AddButton( 50, 95, 2152, 2154, 2, GumpButtonType.Reply, 0 );
AddButton( 50, 95, ( decorator.Command == DecorateCommand.Up ? 2154 : 2152 ), 2154, 2, GumpButtonType.Reply, 0 );
AddHtmlLocalized( 90, 100, 70, 40, 1018324, false, false ); // Up
AddButton( 50, 145, 2152, 2154, 3, GumpButtonType.Reply, 0 );
AddButton( 50, 145, ( decorator.Command == DecorateCommand.Down ? 2154 : 2152 ), 2154, 3, GumpButtonType.Reply, 0 );
AddHtmlLocalized( 90, 150, 70, 40, 1018325, false, false ); // Down
}
@ -123,8 +124,11 @@ namespace Server.Items
if ( command != DecorateCommand.None )
{
m_Decorator.Command = command;
sender.Mobile.SendGump( new InternalGump( m_Decorator ) );
sender.Mobile.Target = new InternalTarget( m_Decorator );
}
else
Target.Cancel( sender.Mobile );
}
}
@ -146,15 +150,16 @@ namespace Server.Items
protected override void OnTarget( Mobile from, object targeted )
{
if ( targeted == m_Decorator )
{
m_Decorator.Command = DecorateCommand.None;
from.SendGump( new InternalGump( m_Decorator ) );
}
else if ( targeted is Item && InteriorDecorator.CheckUse( m_Decorator, from ) )
if ( targeted is Item && InteriorDecorator.CheckUse( m_Decorator, from ) )
{
BaseHouse house = BaseHouse.FindHouseAt( from );
Item item = (Item)targeted;
bool isDecorableComponent = false;
if ( item is AddonComponent )
if ( ((AddonComponent)item).Addon.Components.Count == 1 && Core.SE )
isDecorableComponent = true;
if ( house == null || !house.IsCoOwner( from ) )
{
@ -164,9 +169,14 @@ namespace Server.Items
{
from.SendLocalizedMessage( 1042270 ); // That is not in your house.
}
else if ( !house.IsLockedDown( item ) && !house.IsSecure( item ) )
else if ( !house.IsLockedDown( item ) && !house.IsSecure( item ) && !isDecorableComponent )
{
from.SendLocalizedMessage( 1042271 ); // That is not locked down.
if ( item is AddonComponent && m_Decorator.Command == DecorateCommand.Up )
from.SendLocalizedMessage( 1042274 ); // You cannot raise it up any higher.
else if ( item is AddonComponent && m_Decorator.Command == DecorateCommand.Down )
from.SendLocalizedMessage( 1042275 ); // You cannot lower it down any further.
else
from.SendLocalizedMessage( 1042271 ); // That is not locked down.
}
else if ( item is VendorRentalContract )
{
@ -186,6 +196,14 @@ namespace Server.Items
}
}
}
from.Target = new InternalTarget( m_Decorator );
}
protected override void OnTargetCancel( Mobile from, TargetCancelType cancelType )
{
if ( cancelType == TargetCancelType.Canceled )
from.CloseGump( typeof( InteriorDecorator.InternalGump ) );
}
private static void Turn( Item item, Mobile from )

View file

@ -2,7 +2,7 @@ using System;
namespace Server.Items
{
public class BlankScroll : Item
public class BlankScroll : Item, ICommodity
{
[Constructable]
public BlankScroll() : this( 1 )
@ -17,6 +17,16 @@ namespace Server.Items
Amount = amount;
}
string ICommodity.Description
{
get
{
return String.Format( "blank scroll: {0}", Amount );
}
}
int ICommodity.DescriptionNumber { get { return LabelNumber; } }
public BlankScroll( Serial serial ) : base( serial )
{
}

View file

@ -215,7 +215,9 @@ namespace Server.Items
public void DropRune( Mobile from, RunebookEntry e, int index )
{
if ( m_DefaultIndex == index )
if ( m_DefaultIndex > index )
m_DefaultIndex -= 1;
else if ( m_DefaultIndex == index )
m_DefaultIndex = -1;
m_Entries.RemoveAt( index );
@ -276,7 +278,7 @@ namespace Server.Items
public override void OnDoubleClick( Mobile from )
{
if ( from.InRange( GetWorldLocation(), (Core.ML ? 3 : 1) ) )
if ( from.InRange( GetWorldLocation(), (Core.ML ? 3 : 1) ) && CheckAccess( from ) )
{
if ( DateTime.Now < NextUse )
{
@ -328,9 +330,9 @@ namespace Server.Items
{
if ( dropped is RecallRune )
{
if ( !CheckAccess( from ) )
if ( IsLockedDown && from.AccessLevel < AccessLevel.GameMaster )
{
from.SendLocalizedMessage( 502413 ); // That cannot be done while the book is locked down.
from.SendLocalizedMessage( 502413, null, 0x35 ); // That cannot be done while the book is locked down.
}
else if ( IsOpen( from ) )
{

View file

@ -1,7 +1,10 @@
using System;
using System.Collections.Generic;
using Server;
using Server.Multis;
using Server.Targeting;
using Server.ContextMenus;
using Server.Gumps;
namespace Server.Items
{
@ -10,10 +13,11 @@ namespace Server.Items
bool Dye( Mobile from, DyeTub sender );
}
public class DyeTub : Item
public class DyeTub : Item, ISecurable
{
private bool m_Redyable;
private int m_DyedHue;
private SecureLevel m_SecureLevel;
public virtual CustomHuePicker CustomHuePicker{ get{ return null; } }
@ -46,8 +50,9 @@ namespace Server.Items
{
base.Serialize( writer );
writer.Write( (int) 0 ); // version
writer.Write( (int) 1 ); // version
writer.Write( (int)m_SecureLevel );
writer.Write( (bool) m_Redyable );
writer.Write( (int) m_DyedHue );
}
@ -60,6 +65,11 @@ namespace Server.Items
switch ( version )
{
case 1:
{
m_SecureLevel = (SecureLevel)reader.ReadInt();
goto case 0;
}
case 0:
{
m_Redyable = reader.ReadBool();
@ -99,6 +109,19 @@ namespace Server.Items
}
}
}
[CommandProperty( AccessLevel.GameMaster )]
public SecureLevel Level
{
get
{
return m_SecureLevel;
}
set
{
m_SecureLevel = value;
}
}
[Constructable]
public DyeTub() : base( 0xFAB )
@ -106,6 +129,12 @@ namespace Server.Items
Weight = 10.0;
m_Redyable = true;
}
public override void GetContextMenuEntries( Mobile from, List<ContextMenuEntry> list )
{
base.GetContextMenuEntries( from, list );
SetSecureLevelEntry.AddTo( from, this, list );
}
public DyeTub( Serial serial ) : base( serial )
{

View file

@ -3,8 +3,13 @@ using System.Collections;
using System.Collections.Generic;
using Server;
using Server.Items;
using Server.Misc;
using Server.Mobiles;
using Server.Network;
using Server.Spells;
using Server.Spells.Fifth;
using Server.Spells.Seventh;
using Server.Spells.Ninjitsu;
namespace Server
{
@ -644,9 +649,14 @@ namespace Server
if( m_Mods == null )
return;
for( int i = 0; i < m_Mods.Count; ++i )
for( int i = 0; i < m_Mods.Count; ++i ) {
Mobile m = m_Mods[i].Owner;
m_Mods[i].Remove();
if ( Core.ML )
CheckCancelMorph ( m );
}
m_Mods = null;
}
@ -728,6 +738,53 @@ namespace Server
return "...";
}
public void CheckCancelMorph ( Mobile m )
{
if ( m == null )
return;
double minSkill, maxSkill;
AnimalFormContext acontext = AnimalForm.GetContext( m );
TransformContext context = TransformationSpellHelper.GetContext( m );
if ( context != null ) {
Spell spell = context.Spell as Spell;
spell.GetCastSkills ( out minSkill, out maxSkill );
if ( m.Skills[spell.CastSkill].Value < minSkill )
TransformationSpellHelper.RemoveContext( m, context, true );
}
if ( acontext != null ) {
int i;
for ( i = 0; i < AnimalForm.Entries.Length; ++i )
if ( AnimalForm.Entries[i].Type == acontext.Type )
break;
if ( m.Skills[SkillName.Ninjitsu].Value < AnimalForm.Entries[i].ReqSkill )
AnimalForm.RemoveContext( m, true );
}
if ( !m.CanBeginAction ( typeof ( PolymorphSpell ) ) && m.Skills[SkillName.Magery].Value < 66.1 ) {
m.BodyMod = 0;
m.HueMod = -1;
m.NameMod = null;
m.EndAction( typeof( PolymorphSpell ) );
BaseArmor.ValidateMobile( m );
BaseClothing.ValidateMobile( m );
}
if ( !m.CanBeginAction ( typeof ( IncognitoSpell ) ) && m.Skills[SkillName.Magery].Value < 38.1 ) {
if ( m is PlayerMobile )
((PlayerMobile)m).SetHairMods( -1, -1 );
m.BodyMod = 0;
m.HueMod = -1;
m.NameMod = null;
m.EndAction( typeof( IncognitoSpell ) );
BaseArmor.ValidateMobile( m );
BaseClothing.ValidateMobile( m );
BuffInfo.RemoveBuff( m, BuffIcon.Incognito );
}
return;
}
[CommandProperty( AccessLevel.GameMaster )]
public double Skill_1_Value { get { return GetBonus( 0 ); } set { SetBonus( 0, value ); } }

View file

@ -187,8 +187,8 @@ namespace Server
private static Type[] m_RegularScrollTypes = new Type[]
{
typeof( ClumsyScroll ), typeof( CreateFoodScroll ), typeof( FeeblemindScroll ), typeof( HealScroll ),
typeof( MagicArrowScroll ), typeof( NightSightScroll ), typeof( ReactiveArmorScroll ), typeof( WeakenScroll ),
typeof( ReactiveArmorScroll ), typeof( ClumsyScroll ), typeof( CreateFoodScroll ), typeof( FeeblemindScroll ),
typeof( HealScroll ), typeof( MagicArrowScroll ), typeof( NightSightScroll ), typeof( WeakenScroll ),
typeof( AgilityScroll ), typeof( CunningScroll ), typeof( CureScroll ), typeof( HarmScroll ),
typeof( MagicTrapScroll ), typeof( MagicUnTrapScroll ), typeof( ProtectionScroll ), typeof( StrengthScroll ),
typeof( BlessScroll ), typeof( FireballScroll ), typeof( MagicLockScroll ), typeof( PoisonScroll ),

View file

@ -56,8 +56,8 @@ namespace Server.Mobiles
SetResistance( ResistanceType.Energy, 90, 100 );
SetSkill( SkillName.MagicResist, 99.9 );
SetSkill( SkillName.Tactics, 90.0 );
SetSkill( SkillName.Wrestling, 100.0 );
SetSkill( SkillName.Tactics, 100.0 );
SetSkill( SkillName.Wrestling, 120.0 );
Fame = 0;
Karma = 0;

View file

@ -34,6 +34,8 @@ namespace Server.Mobiles
public override bool CanTeach { get { return true; } }
public override bool BardImmune { get { return true; } }
public override bool PlayerRangeSensitive { get { return true; } }
public virtual bool IsActiveVendor { get { return true; } }

View file

@ -97,8 +97,31 @@ namespace Server.Mobiles
Type[] types = Loot.RegularScrollTypes;
for ( int i = 0; i < types.Length; ++i )
Add( types[i], ((i / 8) + 2) * 5 );
Add(types[i], i + 3 + (i / 4)); // This is NOT 100% OSI accurate. Two spells per circle will be off by 1gp, as OSI's math is slightly different.
if ( Core.SE )
{
Add( typeof( ExorcismScroll ), 1 );
Add( typeof( AnimateDeadScroll ), 26 );
Add( typeof( BloodOathScroll ), 26 );
Add( typeof( CorpseSkinScroll ), 26 );
Add( typeof( CurseWeaponScroll ), 26 );
Add( typeof( EvilOmenScroll ), 26 );
Add( typeof( PainSpikeScroll ), 26 );
Add( typeof( SummonFamiliarScroll ), 26 );
Add( typeof( HorrificBeastScroll ), 27 );
Add( typeof( MindRotScroll ), 39 );
Add( typeof( PoisonStrikeScroll ), 39 );
Add( typeof( WraithFormScroll ), 51 );
Add( typeof( LichFormScroll ), 64 );
Add( typeof( StrangleScroll ), 64 );
Add( typeof( WitherScroll ), 64 );
Add( typeof( VampiricEmbraceScroll ), 101 );
Add( typeof( VengefulSpiritScroll ), 114 );
}
}
}
}
}

View file

@ -19,7 +19,8 @@ namespace Server.Multis
BadItem,
NoSurface,
BadRegionHidden,
BadRegionTemp
BadRegionTemp,
InvalidCastleKeep,
}
public class HousePlacement
@ -63,6 +64,9 @@ namespace Server.Multis
if ( map == Map.Ilshenar || SpellHelper.IsFeluccaT2A( map, center ) )
return HousePlacementResult.BadRegion; // No houses in Ilshenar/T2A
if ( map == Map.Malas && ( multiID == 0x007C || multiID == 0x007E ) )
return HousePlacementResult.InvalidCastleKeep;
NoHousingRegion noHousingRegion = (NoHousingRegion) Region.Find( center, map ).GetRegion( typeof( NoHousingRegion ) );
if ( noHousingRegion != null )

View file

@ -367,45 +367,45 @@ namespace Server.Items
from.SendLocalizedMessage( 501271 ); // You already own a house, you may not place another!
}
else
{
BaseHouse house = ConstructHouse( from );
{
BaseHouse house = ConstructHouse( from );
if ( house == null )
return;
if ( house == null )
return;
house.Price = m_Cost;
house.Price = m_Cost;
if ( from.AccessLevel >= AccessLevel.GameMaster )
{
from.SendMessage( "{0} gold would have been withdrawn from your bank if you were not a GM.", m_Cost.ToString() );
}
else
{
if ( Banker.Withdraw( from, m_Cost ) )
{
from.SendLocalizedMessage( 1060398, m_Cost.ToString() ); // ~1_AMOUNT~ gold has been withdrawn from your bank box.
}
else
{
house.RemoveKeys( from );
house.Delete();
from.SendLocalizedMessage( 1060646 ); // You do not have the funds available in your bank box to purchase this house. Try placing a smaller house, or adding gold or checks to your bank box.
return;
}
}
if ( from.AccessLevel >= AccessLevel.GameMaster )
{
from.SendMessage( "{0} gold would have been withdrawn from your bank if you were not a GM.", m_Cost.ToString() );
}
else
{
if ( Banker.Withdraw( from, m_Cost ) )
{
from.SendLocalizedMessage( 1060398, m_Cost.ToString() ); // ~1_AMOUNT~ gold has been withdrawn from your bank box.
}
else
{
house.RemoveKeys( from );
house.Delete();
from.SendLocalizedMessage( 1060646 ); // You do not have the funds available in your bank box to purchase this house. Try placing a smaller house, or adding gold or checks to your bank box.
return;
}
}
house.MoveToWorld( center, from.Map );
house.MoveToWorld( center, from.Map );
for ( int i = 0; i < toMove.Count; ++i )
{
object o = toMove[i];
for ( int i = 0; i < toMove.Count; ++i )
{
object o = toMove[ i ];
if ( o is Mobile )
( (Mobile)o ).Location = house.BanLocation;
else if ( o is Item )
( (Item)o ).Location = house.BanLocation;
}
}
if ( o is Mobile )
( (Mobile) o ).Location = house.BanLocation;
else if ( o is Item )
( (Item) o ).Location = house.BanLocation;
}
}
break;
}
@ -425,7 +425,12 @@ namespace Server.Items
}
case HousePlacementResult.BadRegionTemp:
{
from.SendLocalizedMessage( 501270 ); //Lord British has decreed a 'no build' period, thus you cannot build this house at this time.
from.SendLocalizedMessage( 501270 ); // Lord British has decreed a 'no build' period, thus you cannot build this house at this time.
break;
}
case HousePlacementResult.InvalidCastleKeep:
{
from.SendLocalizedMessage( 1061122 ); // Castles and keeps cannot be created here.
break;
}
}
@ -521,6 +526,11 @@ namespace Server.Items
from.SendLocalizedMessage( 501270 ); //Lord British has decreed a 'no build' period, thus you cannot build this house at this time.
break;
}
case HousePlacementResult.InvalidCastleKeep:
{
from.SendLocalizedMessage( 1061122 ); // Castles and keeps cannot be created here.
break;
}
}
return false;

View file

@ -260,14 +260,14 @@ namespace Server.Spells
public virtual int GetDamageFixed( Mobile m )
{
m.CheckSkill( DamageSkill, 0.0, m.Skills[DamageSkill].Cap );
//m.CheckSkill( DamageSkill, 0.0, m.Skills[DamageSkill].Cap );
return m.Skills[DamageSkill].Fixed;
}
public virtual double GetDamageSkill( Mobile m )
{
m.CheckSkill( DamageSkill, 0.0, m.Skills[DamageSkill].Cap );
//m.CheckSkill( DamageSkill, 0.0, m.Skills[DamageSkill].Cap );
return m.Skills[DamageSkill].Value;
}
@ -291,7 +291,7 @@ namespace Server.Spells
targetRS = 0;
*/
m_Caster.CheckSkill( DamageSkill, 0.0, 120.0 );
//m_Caster.CheckSkill( DamageSkill, 0.0, 120.0 );
if( casterEI > targetRS )
scalar = (1.0 + ((casterEI - targetRS) / 500.0));
@ -575,6 +575,9 @@ namespace Server.Spells
GetCastSkills( out minSkill, out maxSkill );
if ( DamageSkill != CastSkill )
Caster.CheckSkill( DamageSkill, 0.0, Caster.Skills[ DamageSkill ].Cap );
return Caster.CheckSkill( CastSkill, minSkill, maxSkill );
}

View file

@ -13,6 +13,7 @@ namespace Server.Spells.Bushido
public abstract int RequiredMana{ get; }
public override SkillName CastSkill{ get{ return SkillName.Bushido; } }
public override SkillName DamageSkill{ get{ return SkillName.Bushido; } }
public override bool ClearHandsOnCast{ get{ return false; } }
public override bool BlocksMovement{ get{ return false; } }

View file

@ -13,6 +13,7 @@ namespace Server.Spells.Chivalry
public abstract int MantraNumber{ get; }
public override SkillName CastSkill{ get{ return SkillName.Chivalry; } }
public override SkillName DamageSkill{ get{ return SkillName.Chivalry; } }
public override bool ClearHandsOnCast{ get{ return false; } }

View file

@ -13,6 +13,7 @@ namespace Server.Spells.Ninjitsu
public abstract int RequiredMana{ get; }
public override SkillName CastSkill{ get{ return SkillName.Ninjitsu; } }
public override SkillName DamageSkill{ get{ return SkillName.Ninjitsu; } }
public override bool RevealOnCast{ get{ return false; } }
public override bool ClearHandsOnCast{ get{ return false; } }

View file

@ -41,17 +41,24 @@ namespace Server.Spells.Spellweaving
Effects.SendMovingParticles( new Entity( Serial.Zero, loc, m.Map ), new Entity( Serial.Zero, m.Location, m.Map ), 0xF5F, 1, 0, true, false, 0x21, 0x3F, 0x251D, 0, 0, EffectLayer.Head, 0 );
int percentage = 5 + (5 * FocusLevel);
double percentage = 0.05 * FocusLevel;
int damage;
if( !m.Player && ((m.Hits / m.HitsMax)*100) < percentage )
if( !m.Player && (((double)m.Hits / (double)m.HitsMax) < percentage ))
{
damage = 300;
}
else
{
damage = GetNewAosDamage( (int)Math.Max( Caster.Skills.Spellweaving.Value/24, 1 ) + 4, 1, 4, m );
int minDamage = (int)Caster.Skills.Spellweaving.Value / 5;
int maxDamage = (int)Caster.Skills.Spellweaving.Value / 3;
damage = Utility.RandomMinMax(minDamage, maxDamage);
int damageBonus = AosAttributes.GetValue( Caster, AosAttribute.SpellDamage );
if (m.Player && damageBonus > 15)
damageBonus = 15;
damage *= damageBonus + 100;
damage /= 100;
}
int[] types = new int[4];