branch sync #2

This commit is contained in:
mark 2009-01-31 00:02:21 +00:00
parent 96a37544fd
commit 4e6256b8cd
39 changed files with 415 additions and 137 deletions

View file

@ -101,6 +101,8 @@ namespace Server.Commands
else
newItem.MoveToWorld( from.Location, from.Map );
newItem.InvalidateProperties();
CommandLogging.WriteLine( from, "{0} {1} duped {2} creating {3}", from.AccessLevel, CommandLogging.Format( from ), CommandLogging.Format( targ ), CommandLogging.Format( newItem ) );
}
}
@ -121,7 +123,7 @@ namespace Server.Commands
}
}
private static void CopyProperties( Item dest, Item src )
public static void CopyProperties( Item dest, Item src )
{
PropertyInfo[] props = src.GetType().GetProperties();

View file

@ -3324,8 +3324,13 @@ namespace Server.Mobiles
{
Skills[name].BaseFixedPoint = (int)(val * 10);
if ( Skills[name].Base > Skills[name].Cap )
if ( Skills[name].Base > Skills[name].Cap )
{
if ( Core.SE )
this.SkillsCap += ( Skills[name].BaseFixedPoint - Skills[name].CapFixedPoint );
Skills[name].Cap = Skills[name].Base;
}
}
public void SetSkill( SkillName name, double min, double max )
@ -3335,8 +3340,13 @@ namespace Server.Mobiles
Skills[name].BaseFixedPoint = Utility.RandomMinMax( minFixed, maxFixed );
if ( Skills[name].Base > Skills[name].Cap )
if ( Skills[name].Base > Skills[name].Cap )
{
if ( Core.SE )
this.SkillsCap += ( Skills[name].BaseFixedPoint - Skills[name].CapFixedPoint );
Skills[name].Cap = Skills[name].Base;
}
}
public void SetFameLevel( int level )
@ -3990,6 +4000,11 @@ namespace Server.Mobiles
}
public static List<DamageStore> GetLootingRights( List<DamageEntry> damageEntries, int hitsMax )
{
return GetLootingRights( damageEntries, hitsMax, false );
}
public static List<DamageStore> GetLootingRights( List<DamageEntry> damageEntries, int hitsMax, bool partyAsIndividual )
{
List<DamageStore> rights = new List<DamageStore>();
@ -4664,7 +4679,7 @@ namespace Server.Mobiles
return base.CanBeDamaged();
}
public virtual bool PlayerRangeSensitive{ get{ return true; } }
public virtual bool PlayerRangeSensitive{ get{ return (this.CurrentWayPoint == null); } } //If they are following a waypoint, they'll continue to follow it even if players aren't around
public override void OnSectorDeactivate()
{

View file

@ -313,6 +313,12 @@ namespace Server.Engines.Craft
private static Type[][] m_TypesTable = new Type[][]
{
new Type[]{ typeof( Log ), typeof( Board ) },
new Type[]{ typeof( HeartwoodLog ), typeof( HeartwoodBoard ) },
new Type[]{ typeof( BloodwoodLog ), typeof( BloodwoodBoard ) },
new Type[]{ typeof( FrostwoodLog ), typeof( FrostwoodBoard ) },
new Type[]{ typeof( OakLog ), typeof( OakBoard ) },
new Type[]{ typeof( AshLog ), typeof( YewBoard ) },
new Type[]{ typeof( YewLog ), typeof( YewBoard ) },
new Type[]{ typeof( Leather ), typeof( Hides ) },
new Type[]{ typeof( SpinedLeather ), typeof( SpinedHides ) },
new Type[]{ typeof( HornedLeather ), typeof( HornedHides ) },

View file

@ -352,6 +352,18 @@ namespace Server.Engines.Craft
MarkOption = true;
Repair = Core.AOS;
SetSubRes( typeof( Log ), 1072643 );
// Add every material you want the player to be able to choose from
// This will override the overridable material TODO: Verify the required skill amount
AddSubRes( typeof( Log ), 1072643, 00.0, 1044041, 1072652 );
AddSubRes( typeof( OakLog ), 1072644, 65.0, 1044041, 1072652 );
AddSubRes( typeof( AshLog ), 1072645, 80.0, 1044041, 1072652 );
AddSubRes( typeof( YewLog ), 1072646, 95.0, 1044041, 1072652 );
AddSubRes( typeof( HeartwoodLog ), 1072647, 100.0, 1044041, 1072652 );
AddSubRes( typeof( BloodwoodLog ), 1072648, 100.0, 1044041, 1072652 );
AddSubRes( typeof( FrostwoodLog ), 1072649, 100.0, 1044041, 1072652 );
}
}
}

View file

@ -202,7 +202,7 @@ namespace Server.Engines.Craft
AddSpell( typeof( FireballScroll ), Reg.BlackPearl );
AddSpell( typeof( MagicLockScroll ), Reg.Bloodmoss, Reg.Garlic, Reg.SulfurousAsh );
AddSpell( typeof( PoisonScroll ), Reg.Nightshade );
AddSpell( typeof( TelekinisisScroll ), Reg.Garlic, Reg.SpidersSilk, Reg.SulfurousAsh );
AddSpell( typeof( TelekinisisScroll ), Reg.Bloodmoss, Reg.MandrakeRoot );
AddSpell( typeof( TeleportScroll ), Reg.Bloodmoss, Reg.MandrakeRoot );
AddSpell( typeof( UnlockScroll ), Reg.Bloodmoss, Reg.SulfurousAsh );
AddSpell( typeof( WallOfStoneScroll ), Reg.Bloodmoss, Reg.Garlic );

View file

@ -424,7 +424,9 @@ namespace Server.Factions
else if ( !Guild.NewGuildSystem && guild.Type != GuildType.Regular )
pm.SendLocalizedMessage( 1042161 ); // You cannot join a faction because your guild is an Order or Chaos type.
else if ( !Guild.NewGuildSystem && guild.Enemies != null && guild.Enemies.Count > 0 ) //CAN join w/wars in new system
pm.SendLocalizedMessage( 1005056 ); // You cannot join a faction with active Wars
pm.SendLocalizedMessage( 1005056 ); // You cannot join a faction with active Wars
else if ( Guild.NewGuildSystem && guild.Alliance != null )
pm.SendLocalizedMessage( 1080454 ); // Your guild cannot join a faction while in alliance with non-factioned guilds.
else if ( !CanHandleInflux( guild.Members.Count ) )
pm.SendLocalizedMessage( 1018031 ); // In the interest of faction stability, this faction declines to accept new members for now.
else

View file

@ -16,6 +16,7 @@ namespace Server.Factions
private string m_FriendlyName;
private string m_Keyword;
private string m_Abbreviation;
private TextDefinition m_Name;
private TextDefinition m_PropName;
@ -46,6 +47,7 @@ namespace Server.Factions
public string FriendlyName{ get{ return m_FriendlyName; } }
public string Keyword{ get{ return m_Keyword; } }
public string Abbreviation{ get { return m_Abbreviation; } }
public TextDefinition Name{ get{ return m_Name; } }
public TextDefinition PropName{ get{ return m_PropName; } }
@ -66,7 +68,7 @@ namespace Server.Factions
public RankDefinition[] Ranks{ get{ return m_Ranks; } }
public GuardDefinition[] Guards{ get{ return m_Guards; } }
public FactionDefinition( int sort, int huePrimary, int hueSecondary, int hueJoin, int hueBroadcast, int warHorseBody, int warHorseItem, string friendlyName, string keyword, TextDefinition name, TextDefinition propName, TextDefinition header, TextDefinition about, TextDefinition cityControl, TextDefinition sigilControl, TextDefinition signupName, TextDefinition factionStoneName, TextDefinition ownerLabel, TextDefinition guardIgnore, TextDefinition guardWarn, TextDefinition guardAttack, StrongholdDefinition stronghold, RankDefinition[] ranks, GuardDefinition[] guards )
public FactionDefinition( int sort, int huePrimary, int hueSecondary, int hueJoin, int hueBroadcast, int warHorseBody, int warHorseItem, string friendlyName, string keyword, string abbreviation, TextDefinition name, TextDefinition propName, TextDefinition header, TextDefinition about, TextDefinition cityControl, TextDefinition sigilControl, TextDefinition signupName, TextDefinition factionStoneName, TextDefinition ownerLabel, TextDefinition guardIgnore, TextDefinition guardWarn, TextDefinition guardAttack, StrongholdDefinition stronghold, RankDefinition[] ranks, GuardDefinition[] guards )
{
m_Sort = sort;
m_HuePrimary = huePrimary;
@ -77,6 +79,7 @@ namespace Server.Factions
m_WarHorseItem = warHorseItem;
m_FriendlyName = friendlyName;
m_Keyword = keyword;
m_Abbreviation = abbreviation;
m_Name = name;
m_PropName = propName;
m_Header = header;

View file

@ -21,7 +21,7 @@ namespace Server.Factions
1325, // join stone : blue
1325, // broadcast : blue
0x77, 0x3EB1, // war horse
"Council of Mages", "council",
"Council of Mages", "council", "CoM",
new TextDefinition( 1011535, "COUNCIL OF MAGES" ),
new TextDefinition( 1060770, "Council of Mages faction" ),
new TextDefinition( 1011422, "<center>COUNCIL OF MAGES</center>" ),

View file

@ -21,7 +21,7 @@ namespace Server.Factions
1645, // join stone : dark red
1645, // broadcast : dark red
0x78, 0x3EAF, // war horse
"Minax", "minax",
"Minax", "minax", "Min",
new TextDefinition( 1011534, "MINAX" ),
new TextDefinition( 1060769, "Minax faction" ),
new TextDefinition( 1011421, "<center>FOLLOWERS OF MINAX</center>" ),

View file

@ -21,7 +21,7 @@ namespace Server.Factions
1109, // join stone : shadow
2211, // broadcast : green
0x79, 0x3EB0, // war horse
"Shadowlords", "shadow",
"Shadowlords", "shadow", "SL",
new TextDefinition( 1011537, "SHADOWLORDS" ),
new TextDefinition( 1060772, "Shadowlords faction" ),
new TextDefinition( 1011424, "<center>SHADES OF DARKNESS</center>" ),

View file

@ -21,7 +21,7 @@ namespace Server.Factions
2214, // join stone : gold
2125, // broadcast : gold
0x76, 0x3EB2, // war horse
"True Britannians", "true",
"True Britannians", "true", "TB",
new TextDefinition( 1011536, "LORD BRITISH" ),
new TextDefinition( 1060771, "True Britannians faction" ),
new TextDefinition( 1011423, "<center>TRUE BRITANNIANS</center>" ),

View file

@ -30,6 +30,14 @@ namespace Server.Factions
m_Town.RegisterVendor( this );
}
public override bool OnMoveOver( Mobile m )
{
if ( Core.ML )
return true;
return base.OnMoveOver( m );
}
public void Unregister()
{
if ( m_Town != null )

View file

@ -88,13 +88,13 @@ namespace Server.Engines.Harvest
veins = new HarvestVein[]
{
new HarvestVein( 58.4, 0.0, res[0], null ), // Ordinary Logs
new HarvestVein( 49.0, 0.0, res[0], null ), // Ordinary Logs
new HarvestVein( 30.0, 0.5, res[1], res[0] ), // Oak
new HarvestVein( 10.0, 0.5, res[2], res[0] ), // Ash
new HarvestVein( 01.0, 0.5, res[3], res[0] ), // Yew
new HarvestVein( 00.3, 0.5, res[4], res[0] ), // Heartwood
new HarvestVein( 00.2, 0.5, res[5], res[0] ), // Bloodwood
new HarvestVein( 00.1, 0.5, res[6], res[0] ), // Frostwood
new HarvestVein( 05.0, 0.5, res[3], res[0] ), // Yew
new HarvestVein( 03.0, 0.5, res[4], res[0] ), // Heartwood
new HarvestVein( 02.0, 0.5, res[5], res[0] ), // Bloodwood
new HarvestVein( 01.0, 0.5, res[6], res[0] ), // Frostwood
};
lumber.BonusResources = new BonusHarvestResource[]

View file

@ -38,6 +38,8 @@ namespace Server.Mobiles
}
}
public virtual int CreaturesNameCount { get { return m_CreaturesName.Count; } }
public override void OnAfterDuped( Item newItem )
{
Spawner s = newItem as Spawner;
@ -244,7 +246,7 @@ namespace Server.Mobiles
{
if ( !m_Running )
{
if ( m_CreaturesName.Count > 0 )
if ( CreaturesNameCount > 0 )
{
m_Running = true;
DoTimer();
@ -346,8 +348,8 @@ namespace Server.Mobiles
public void Spawn()
{
if ( m_CreaturesName.Count > 0 )
Spawn( Utility.Random( m_CreaturesName.Count ) );
if ( CreaturesNameCount > 0 )
Spawn( Utility.Random( CreaturesNameCount ) );
}
public void Spawn( string creatureName )
@ -362,17 +364,11 @@ namespace Server.Mobiles
}
}
public void Spawn( int index )
protected virtual IEntity CreateSpawnedObject( int index )
{
Map map = Map;
if ( index >= m_CreaturesName.Count )
return null;
if ( map == null || map == Map.Internal || m_CreaturesName.Count == 0 || index >= m_CreaturesName.Count || Parent != null )
return;
Defrag();
if ( m_Creatures.Count >= m_Count )
return;
Type type = SpawnerType.GetType( m_CreaturesName[index] );
@ -382,60 +378,81 @@ namespace Server.Mobiles
{
object o = Activator.CreateInstance( type );
if ( o is Mobile )
{
Mobile m = (Mobile)o;
m_Creatures.Add( m );
Point3D loc = ( m is BaseVendor ? this.Location : GetSpawnPosition() );
m.OnBeforeSpawn( loc, map );
InvalidateProperties();
m.MoveToWorld( loc, map );
if ( m is BaseCreature )
{
BaseCreature c = (BaseCreature)m;
if( m_WalkingRange >= 0 )
c.RangeHome = m_WalkingRange;
else
c.RangeHome = m_HomeRange;
c.CurrentWayPoint = m_WayPoint;
if ( m_Team > 0 )
c.Team = m_Team;
c.Home = this.Location;
}
m.OnAfterSpawn();
}
else if ( o is Item )
{
Item item = (Item)o;
m_Creatures.Add( item );
Point3D loc = GetSpawnPosition();
item.OnBeforeSpawn( loc, map );
InvalidateProperties();
item.MoveToWorld( loc, map );
item.OnAfterSpawn();
}
return ( o as IEntity );
}
catch
{
}
}
return null;
}
public void Spawn( int index )
{
Map map = Map;
if ( map == null || map == Map.Internal || CreaturesNameCount == 0 || index >= CreaturesNameCount || Parent != null )
return;
Defrag();
if ( m_Creatures.Count >= m_Count )
return;
IEntity ent = CreateSpawnedObject( index );
if ( ent is Mobile )
{
Mobile m = (Mobile)ent;
m_Creatures.Add( m );
Point3D loc = ( m is BaseVendor ? this.Location : GetSpawnPosition() );
m.OnBeforeSpawn( loc, map );
InvalidateProperties();
m.MoveToWorld( loc, map );
if ( m is BaseCreature )
{
BaseCreature c = (BaseCreature)m;
if( m_WalkingRange >= 0 )
c.RangeHome = m_WalkingRange;
else
c.RangeHome = m_HomeRange;
c.CurrentWayPoint = m_WayPoint;
if ( m_Team > 0 )
c.Team = m_Team;
c.Home = this.Location;
}
m.OnAfterSpawn();
}
else if ( ent is Item )
{
Item item = (Item)ent;
m_Creatures.Add( item );
Point3D loc = GetSpawnPosition();
item.OnBeforeSpawn( loc, map );
InvalidateProperties();
item.MoveToWorld( loc, map );
item.OnAfterSpawn();
}
}
public Point3D GetSpawnPosition()

View file

@ -490,7 +490,8 @@ namespace Server.Gumps
SkillName.Necromancy,
SkillName.SpiritSpeak,
SkillName.Ninjitsu,
SkillName.Bushido
SkillName.Bushido,
SkillName.Spellweaving
} ),
new SkillsGumpGroup( "Miscellaneous", new SkillName[]
{

View file

@ -97,6 +97,18 @@ namespace Server.Items
public virtual int OldDexReq{ get{ return 0; } }
public virtual int OldIntReq{ get{ return 0; } }
public override void OnAfterDuped( Item newItem )
{
BaseArmor armor = newItem as BaseArmor;
if ( armor == null )
return;
armor.m_AosAttributes = new AosAttributes( newItem, m_AosAttributes );
armor.m_AosArmorAttributes = new AosArmorAttributes( newItem, m_AosArmorAttributes );
armor.m_AosSkillBonuses = new AosSkillBonuses( newItem, m_AosSkillBonuses );
}
[CommandProperty( AccessLevel.GameMaster )]
public AMA MeditationAllowance
{

View file

@ -5,8 +5,9 @@ namespace Server.Items
{
public class BlueBook : BaseBook
{
[Constructable]
public BlueBook() : base( 0xFF2 )
public BlueBook() : base( 0xFF2, 40, true )
{
}
@ -43,4 +44,4 @@ namespace Server.Items
writer.Write( (int)0 ); // version
}
}
}
}

View file

@ -449,6 +449,19 @@ namespace Server.Items
m_AosResistances = new AosElementAttributes( this );
}
public override void OnAfterDuped( Item newItem )
{
BaseClothing clothing = newItem as BaseClothing;
if ( clothing == null )
return;
clothing.m_AosAttributes = new AosAttributes( newItem, m_AosAttributes );
clothing.m_AosResistances = new AosElementAttributes( newItem, m_AosResistances );
clothing.m_AosSkillBonuses = new AosSkillBonuses( newItem, m_AosSkillBonuses );
clothing.m_AosClothingAttributes = new AosArmorAttributes( newItem, m_AosClothingAttributes );
}
public BaseClothing( Serial serial ) : base( serial )
{
}

View file

@ -78,6 +78,18 @@ namespace Server.Items
}
}
public override void OnAfterDuped( Item newItem )
{
BaseJewel jewel = newItem as BaseJewel;
if ( jewel == null )
return;
jewel.m_AosAttributes = new AosAttributes( newItem, m_AosAttributes );
jewel.m_AosResistances = new AosElementAttributes( newItem, m_AosResistances );
jewel.m_AosSkillBonuses = new AosSkillBonuses( newItem, m_AosSkillBonuses );
}
public virtual int ArtifactRarity{ get{ return 0; } }
public BaseJewel( int itemID, Layer layer ) : base( itemID )

View file

@ -43,11 +43,27 @@ namespace Server.Items
public static readonly TimeSpan MonsterLootRightSacrifice = TimeSpan.FromMinutes( 2.0 );
public static readonly TimeSpan InstancedCorpseTime = TimeSpan.FromMinutes( 3.0 );
[CommandProperty( AccessLevel.GameMaster )]
public virtual bool InstancedCorpse
{
get
{
if ( !Core.SE )
return false;
return ( DateTime.Now > m_TimeOfDeath + InstancedCorpseTime );
}
}
public override bool IsDecoContainer
{
get{ return false; }
}
private Dictionary<Mobile, List<Item>> m_InstancedItems;
[CommandProperty( AccessLevel.GameMaster )]
public DateTime TimeOfDeath
{
@ -268,6 +284,7 @@ namespace Server.Items
public Corpse( Mobile owner, List<Item> equipItems ) : this( owner, null, null, equipItems )
{
}
public Corpse( Mobile owner, HairInfo hair, FacialHairInfo facialhair, List<Item> equipItems )
: base( 0x2006 )
{
@ -356,6 +373,12 @@ namespace Server.Items
BeginDecay( m_DefaultDecayTime );
}
private void AssignInstancedLoot()
{
if ( m_InstancedItems == null )
m_InstancedItems = new Dictionary<Mobile, List<Item>>();
}
public Corpse( Serial serial ) : base( serial )
{
}

View file

@ -238,7 +238,7 @@ namespace Server.Items
new PMEntry( new Point3D( 1828, 2948,-20), 1012008 ), // Trinsic
new PMEntry( new Point3D( 643, 2067, 5 ), 1012009 ), // Skara Brae
new PMEntry( new Point3D( 3563, 2139, 34), 1012010 ), // Magincia
new PMEntry( new Point3D( 3763, 2771, 50), 1078098 ) // New Haven
new PMEntry( new Point3D( 3450, 2677, 25), 1078098 ) // New Haven
} );
public static readonly PMList Felucca =

View file

@ -6,6 +6,7 @@ using Server.Gumps;
namespace Server.Items
{
[FlipableAttribute( 0xA57, 0xA58, 0xA59 )]
public class Bedroll : Item
{
[Constructable]

View file

@ -412,6 +412,17 @@ namespace Server.Items
Content = content;
}
public override void OnAfterDuped( Item newItem )
{
Spellbook book = newItem as Spellbook;
if ( book == null )
return;
book.m_AosAttributes = new AosAttributes( newItem, m_AosAttributes );
book.m_AosSkillBonuses = new AosSkillBonuses( newItem, m_AosSkillBonuses );
}
public override void OnAdded( object parent )
{
if ( Core.AOS && parent is Mobile )

View file

@ -59,7 +59,7 @@ namespace Server.Items
AOS.Damage( defender, attacker, (int)(15.0 * (attacker.Skills[SkillName.Bushido].Value - 50.0) / 70.0 + 10), 100, 0, 0, 0, 0 ); //10-25
defender.Paralyze( TimeSpan.FromSeconds( 3.0 ) );
defender.Freeze( TimeSpan.FromSeconds( 2.0 ) );
Server.Items.ParalyzingBlow.BeginImmunity( defender, Server.Items.ParalyzingBlow.FreezeDelayDuration );
}
}

View file

@ -413,6 +413,19 @@ namespace Server.Items
#endregion
public override void OnAfterDuped( Item newItem )
{
BaseWeapon weap = newItem as BaseWeapon;
if ( weap == null )
return;
weap.m_AosAttributes = new AosAttributes( newItem, m_AosAttributes );
weap.m_AosElementDamages = new AosElementAttributes( newItem, m_AosElementDamages );
weap.m_AosSkillBonuses = new AosSkillBonuses( newItem, m_AosSkillBonuses );
weap.m_AosWeaponAttributes = new AosWeaponAttributes( newItem, m_AosWeaponAttributes );
}
public virtual void UnscaleDurability()
{
int scale = 100 + GetDurabilityBonus();

View file

@ -196,6 +196,11 @@ namespace Server
{
}
public AosAttributes( Item owner, AosAttributes other )
: base( owner, other )
{
}
public AosAttributes( Item owner, GenericReader reader )
: base( owner, reader )
{
@ -377,6 +382,11 @@ namespace Server
{
}
public AosWeaponAttributes( Item owner, AosWeaponAttributes other )
: base( owner, other )
{
}
public AosWeaponAttributes( Item owner, GenericReader reader )
: base( owner, reader )
{
@ -514,6 +524,11 @@ namespace Server
{
}
public AosArmorAttributes( Item owner, AosArmorAttributes other )
: base( owner, other )
{
}
public static int GetValue( Mobile m, AosArmorAttribute attribute )
{
if( !Core.AOS )
@ -571,7 +586,7 @@ namespace Server
public sealed class AosSkillBonuses : BaseAttributes
{
private ArrayList m_Mods;
private List<SkillMod> m_Mods;
public AosSkillBonuses( Item owner )
: base( owner )
@ -583,6 +598,11 @@ namespace Server
{
}
public AosSkillBonuses( Item owner, AosSkillBonuses other )
: base( owner, other )
{
}
public void GetProperties( ObjectPropertyList list )
{
for( int i = 0; i < 5; ++i )
@ -610,7 +630,7 @@ namespace Server
continue;
if( m_Mods == null )
m_Mods = new ArrayList();
m_Mods = new List<SkillMod>();
SkillMod sk = new DefaultSkillMod( skill, true, bonus );
sk.ObeyCap = true;
@ -625,7 +645,7 @@ namespace Server
return;
for( int i = 0; i < m_Mods.Count; ++i )
((SkillMod)m_Mods[i]).Remove();
m_Mods[i].Remove();
m_Mods = null;
}
@ -756,6 +776,11 @@ namespace Server
{
}
public AosElementAttributes( Item owner, AosElementAttributes other )
: base( owner, other )
{
}
public AosElementAttributes( Item owner, GenericReader reader )
: base( owner, reader )
{
@ -806,6 +831,14 @@ namespace Server
m_Values = m_Empty;
}
public BaseAttributes( Item owner, BaseAttributes other )
{
m_Owner = owner;
m_Values = new int[other.m_Values.Length];
other.m_Values.CopyTo( m_Values, 0 );
m_Names = other.m_Names;
}
public BaseAttributes( Item owner, GenericReader reader )
{
m_Owner = owner;

View file

@ -65,17 +65,18 @@ namespace Server.Misc
if( from == null || target == null || from.AccessLevel > AccessLevel.Player || target.AccessLevel > AccessLevel.Player )
return true;
Map map = from.Map;
#region Factions
Faction targetFaction = Faction.Find( target, true );
if( targetFaction != null )
if( (!Core.ML || map == Faction.Facet) && targetFaction != null )
{
if( Faction.Find( from, true ) != targetFaction )
return false;
}
#endregion
Map map = from.Map;
if( map != null && (map.Rules & MapRules.BeneficialRestrictions) == 0 )
return true; // In felucca, anything goes

View file

@ -3250,6 +3250,20 @@ namespace Server.Mobiles
}
#endregion
if ( Core.ML && this.Map == Faction.Facet )
{
Faction faction = Faction.Find( this );
if ( faction != null )
{
string adjunct = String.Format( "[{0}]", faction.Definition.Abbreviation );
if ( suffix.Length == 0 )
suffix = adjunct;
else
suffix = String.Concat( suffix, " ", adjunct );
}
}
return base.ApplyNameSuffix( suffix );
}

View file

@ -200,10 +200,15 @@ namespace Server.Multis
if ( Deleted )
return;
if ( Core.ML )
new TempNoHousingRegion( this );
KillVendors();
Delete();
}
public virtual TimeSpan RestrictedPlacingTime { get { return TimeSpan.FromHours( 1.0 ); } }
[CommandProperty( AccessLevel.GameMaster )]
public virtual double BonusStorageScalar { get { return (Core.ML ? 1.2 : 1.0); } }
@ -3384,6 +3389,8 @@ namespace Server.Multis
}
}
#region Targets
public class LockdownTarget : Target
{
private bool m_Release;
@ -3648,6 +3655,8 @@ namespace Server.Multis
}
}
#endregion
public class SetSecureLevelEntry : ContextMenuEntry
{
private Item m_Item;
@ -3713,4 +3722,20 @@ namespace Server.Multis
Owner.From.SendGump( new SetSecureLevelGump( Owner.From, sec, BaseHouse.FindHouseAt( m_Item ) ) );
}
}
public class TempNoHousingRegion : BaseRegion
{
public TempNoHousingRegion( BaseHouse house )
: base( null, house.Map, Region.DefaultPriority, house.Region.Area )
{
Register();
Timer.DelayCall( house.RestrictedPlacingTime, Unregister );
}
public override bool AllowHousing( Mobile from, Point3D p )
{
return false;
}
}
}

View file

@ -200,6 +200,11 @@ namespace Server.Multis.Deeds
from.SendLocalizedMessage( 501265 ); // Housing cannot be created in this area.
break;
}
case HousePlacementResult.BadRegionTemp:
{
from.SendLocalizedMessage( 501270 ); //Lord British has decreed a 'no build' period, thus you cannot build this house at this time.
break;
}
}
}
}

View file

@ -894,32 +894,32 @@ namespace Server.Multis
int cost = newPrice - oldPrice;
if ( !this.Deleted ) { // Temporary Fix. We should be booting a client out of customization mode in the delete handler.
if ( from.AccessLevel >= AccessLevel.GameMaster && cost != 0 )
{
from.SendMessage( "{0} gold would have been {1} your bank if you were not a GM.", cost.ToString(), ((cost > 0 )? "withdrawn from" : "deposited into" ) );
}
else
{
if ( cost > 0 )
{
if ( Banker.Withdraw( from, cost ) )
{
from.SendLocalizedMessage( 1060398, cost.ToString() ); // ~1_AMOUNT~ gold has been withdrawn from your bank box.
}
else
{
from.SendLocalizedMessage( 1061903 ); // You cannot commit this house design, because you do not have the necessary funds in your bank box to pay for the upgrade. Please back up your design, obtain the required funds, and commit your design again.
return;
}
}
else if ( cost < 0 )
{
if ( from.AccessLevel >= AccessLevel.GameMaster && cost != 0 )
{
from.SendMessage( "{0} gold would have been {1} your bank if you were not a GM.", cost.ToString(), ((cost > 0 )? "withdrawn from" : "deposited into" ) );
}
else
{
if ( cost > 0 )
{
if ( Banker.Withdraw( from, cost ) )
{
from.SendLocalizedMessage( 1060398, cost.ToString() ); // ~1_AMOUNT~ gold has been withdrawn from your bank box.
}
else
{
from.SendLocalizedMessage( 1061903 ); // You cannot commit this house design, because you do not have the necessary funds in your bank box to pay for the upgrade. Please back up your design, obtain the required funds, and commit your design again.
return;
}
}
else if ( cost < 0 )
{
if ( Banker.Deposit( from, -cost ) )
from.SendLocalizedMessage( 1060397, ( -cost ).ToString() ); // ~1_AMOUNT~ gold has been deposited into your bank box.
else
return;
}
}
from.SendLocalizedMessage( 1060397, ( -cost ).ToString() ); // ~1_AMOUNT~ gold has been deposited into your bank box.
else
return;
}
}
}
/* Client chose to commit current design state

View file

@ -14,7 +14,8 @@ namespace Server.Multis
BadStatic,
BadItem,
NoSurface,
BadRegionHidden
BadRegionHidden,
BadRegionTemp
}
public class HousePlacement
@ -106,6 +107,9 @@ namespace Server.Multis
if ( !reg.AllowHousing( from, testPoint ) ) // Cannot place houses in dungeons, towns, treasure map areas etc
{
if ( reg.IsPartOf( typeof( TempNoHousingRegion ) ) )
return HousePlacementResult.BadRegionTemp;
if ( reg.IsPartOf( typeof( TreasureRegion ) ) )
return HousePlacementResult.BadRegionHidden;

View file

@ -423,6 +423,11 @@ namespace Server.Items
from.SendLocalizedMessage( 501265 ); // Housing cannot be created in this area.
break;
}
case HousePlacementResult.BadRegionTemp:
{
from.SendLocalizedMessage( 501270 ); //Lord British has decreed a 'no build' period, thus you cannot build this house at this time.
break;
}
}
}
@ -511,6 +516,11 @@ namespace Server.Items
from.SendLocalizedMessage( 501265 ); // Housing cannot be created in this area.
break;
}
case HousePlacementResult.BadRegionTemp:
{
from.SendLocalizedMessage( 501270 ); //Lord British has decreed a 'no build' period, thus you cannot build this house at this time.
break;
}
}
return false;

View file

@ -82,12 +82,22 @@ namespace Server.SkillHandlers
public static void ScaleSkills( BaseCreature bc, double scalar )
{
int totalCapIncrease = 0;
for ( int i = 0; i < bc.Skills.Length; ++i )
{
bc.Skills[i].Base *= scalar;
if ( bc.Skills[i].Base > 100.0 )
if ( bc.Skills[i].Base > bc.Skills[i].Cap )
{
if( Core.SE )
totalCapIncrease += ( bc.Skills[i].BaseFixedPoint - bc.Skills[i].CapFixedPoint );
bc.Skills[i].Cap = bc.Skills[i].Base;
}
}
bc.SkillsCap += totalCapIncrease; //increase will be 0 if not .SE per above
}
private class InternalTarget : Target
@ -195,21 +205,6 @@ namespace Server.SkillHandlers
from.SendLocalizedMessage( 502801 ); // You can't tame that!
}
}
public static void AdjustSkillCaps( BaseCreature bc )
{
int totalCapIncrease = 0;
for ( int i = 0; i < bc.Skills.Length; ++i )
{
if( bc.Skills[i].Base > bc.Skills[i].Cap )
{
totalCapIncrease += (bc.Skills[i].BaseFixedPoint - bc.Skills[i].CapFixedPoint);
bc.Skills[i].Cap = bc.Skills[i].Base;
}
}
bc.SkillsCap += totalCapIncrease;
}
private class InternalTimer : Timer
{
@ -340,9 +335,6 @@ namespace Server.SkillHandlers
if ( m_Creature.StatLossAfterTame )
ScaleStats( m_Creature, 0.50 );
if( Core.SE )
AdjustSkillCaps( m_Creature );
}
if ( alreadyOwned )

View file

@ -94,7 +94,7 @@ namespace Server.SkillHandlers
}
else
{
if ( from.CheckTargetSkill( SkillName.RemoveTrap, trap, 80.0, 100.0 ) && from.CheckTargetSkill( SkillName.Tinkering, trap, 80.0, 100.0 ) )
if ( (Core.ML && isOwner) || (from.CheckTargetSkill( SkillName.RemoveTrap, trap, 80.0, 100.0 ) && from.CheckTargetSkill( SkillName.Tinkering, trap, 80.0, 100.0 )) )
{
from.PrivateOverheadMessage( MessageType.Regular, trap.MessageHue, trap.DisarmMessage, from.NetState );

View file

@ -9,6 +9,7 @@ using Server.Targeting;
using Server.Engines.PartySystem;
using Server.Misc;
using Server.Spells.Bushido;
using Server.Spells.Necromancy;
using Server.Spells.Ninjitsu;
using System.Collections.Generic;
using Server.Spells.Seventh;
@ -920,7 +921,10 @@ namespace Server.Spells
((BaseCreature)target).AlterSpellDamageFrom( from, ref iDamage );
WeightOverloading.DFA = dfa;
AOS.Damage( target, from, iDamage, phys, fire, cold, pois, nrgy );
int damageGiven = AOS.Damage( target, from, iDamage, phys, fire, cold, pois, nrgy );
DoLeech( damageGiven, from, target );
WeightOverloading.DFA = DFAlgorithm.Standard;
}
else
@ -932,6 +936,24 @@ namespace Server.Spells
((BaseCreature)target).OnDamagedBySpell( from );
}
public static void DoLeech( int damageGiven, Mobile from, Mobile target )
{
TransformContext context = TransformationSpellHelper.GetContext( from );
if ( context != null && context.Type == typeof( WraithFormSpell ) )
{
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 )
{
// 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));
}
}
}
public static void Heal( int amount, Mobile target, Mobile from )
{
Heal( amount, target, from, true );
@ -1012,7 +1034,10 @@ namespace Server.Spells
((BaseCreature)m_Target).AlterSpellDamageFrom( m_From, ref m_Damage );
WeightOverloading.DFA = m_DFA;
AOS.Damage( m_Target, m_From, m_Damage, m_Phys, m_Fire, m_Cold, m_Pois, m_Nrgy );
int damageGiven = AOS.Damage( m_Target, m_From, m_Damage, m_Phys, m_Fire, m_Cold, m_Pois, m_Nrgy );
DoLeech( damageGiven, m_From, m_Target );
WeightOverloading.DFA = DFAlgorithm.Standard;
if( m_Target is BaseCreature && m_From != null )

View file

@ -54,6 +54,12 @@ namespace Server.Spells.Bushido
return false;
}
if ( !Caster.CanBeginAction( typeof( Evasion ) ) )
{
Caster.SendLocalizedMessage( 501789 ); // You must wait before trying again.
return false;
}
return true;
}
@ -98,6 +104,9 @@ namespace Server.Spells.Bushido
OnCastSuccessful( Caster );
BeginEvasion( Caster );
Caster.BeginAction( typeof( Evasion ) );
Timer.DelayCall( TimeSpan.FromSeconds( 20.0 ), delegate { Caster.EndAction( typeof( Evasion ) ); } );
}
FinishSequence();

View file

@ -80,6 +80,7 @@ namespace Server.Spells.Necromancy
Misc.WeightOverloading.DFA = Misc.DFAlgorithm.PainSpike;
m.Damage( (int) damage, Caster );
SpellHelper.DoLeech( (int)damage, Caster, m );
Misc.WeightOverloading.DFA = Misc.DFAlgorithm.Standard;
//SpellHelper.Damage( this, m, damage, 100, 0, 0, 0, 0, Misc.DFAlgorithm.PainSpike );

View file

@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using Server.Items;
using Server.Mobiles;
namespace Server.Spells.Spellweaving
{
@ -29,6 +30,12 @@ namespace Server.Spells.Spellweaving
return false;
}
if ( GetArcanists().Count < 2 )
{
Caster.SendLocalizedMessage( 1080452 ); //There are not enough spellweavers present to create an Arcane Focus.
return false;
}
return base.CheckCast();
}
@ -111,7 +118,7 @@ namespace Server.Spells.Spellweaving
//OSI Verified: Even enemies/combatants count
foreach( Mobile m in Caster.GetMobilesInRange( 1 ) ) //Range verified as 1
{
if( m != Caster && Caster.CanBeBeneficial( m, false ) && Math.Abs( Caster.Skills.Spellweaving.Value - m.Skills.Spellweaving.Value ) <= 20 ) //TODO: OSI check, aggressor/agressed? Visibility?
if ( m != Caster && Caster.CanBeBeneficial( m, false ) && Math.Abs( Caster.Skills.Spellweaving.Value - m.Skills.Spellweaving.Value ) <= 20 && !(m is Clone) )
{
weavers.Add( m );
}