Runic sewing kits will no longer apply durability

http://www.uodemise.com/forum/showthread.php?t=133757

Vendor Look/Browse/View will now work properly
http://www.uodemise.com/forum/showthread.php?t=135531

Stacked Eggbombs will now unstack correctly
http://www.uodemise.com/forum/showthread.php?t=134321

Unbonded pets should logout too
http://www.uodemise.com/forum/showthread.php?t=119262

Paragon chests placed on player vendors will now behave correctly
http://www.uodemise.com/forum/showthread.php?t=116864

Proper party fame/karma sharing
http://www.uodemise.com/forum/showthread.php?t=122749

Guild Alliance/War update bug fixed
http://www.uodemise.com/forum/showthread.php?t=115236

Fukiya properties updates and loading bug fixed
http://www.uodemise.com/forum/showthread.php?t=136042

Shuriken, same problems as fukiya
http://www.uodemise.com/forum/showthread.php?t=120212

greater mongbats will now be recognised as quest objectives
http://www.uodemise.com/forum/showthread.php?t=128072

divine fury sound tweaks.
http://www.uodemise.com/forum/showthread.php?t=136489

pet stat gains fix
http://www.uodemise.com/forum/showthread.php?t=134820

Pets follow speed corrected
http://www.uodemise.com/forum/showthread.php?t=124774

E-fields no longer block in trammel rulesets.
http://www.uodemise.com/forum/showthread.php?t=116680

Disguise kit timer fix
http://www.uodemise.com/forum/showthread.php?t=133913

Meer Mage special abilities fixes.
http://www.uodemise.com/forum/showthread.php?t=122134

Missing food property if eggs, in animal lore gump
http://www.uodemise.com/forum/showthread.php?t=135258

Pets will follow after an attack is completed.
http://www.uodemise.com/forum/showthread.php?t=135962

Hides should not be scissored whilst still on the corpse
http://www.uodemise.com/forum/showthread.php?t=118799

Pet bonding changed to include jewelry skill adjustments.
http://www.uodemise.com/forum/showthread.php?t=121060

Skinning knife can be used to cut corpses
http://www.uodemise.com/forum/showthread.php?t=115248

PlayerVendors will correctly send update packets to the client when hair is changed
http://www.uodemise.com/forum/showthread.php?t=120216

Corrections to house sign gump
http://www.uodemise.com/forum/showthread.php?t=134406

pet "guarding" system message added
http://www.uodemise.com/forum/showthread.php?t=134091

Giant toads should be aggressive
http://www.uodemise.com/forum/showthread.php?t=133984

bardiche and halberds are axe tools.
http://www.uodemise.com/forum/showthread.php?t=122739
This commit is contained in:
mark 2010-01-17 06:59:32 +00:00
parent d688c9e0f3
commit 208acafd7e
37 changed files with 1058 additions and 226 deletions

View file

@ -1059,6 +1059,8 @@ namespace Server.Mobiles
m_Mobile.PlaySound( m_Mobile.GetIdleSound() );
m_Mobile.Warmode = true;
m_Mobile.Combatant = null;
string petname = String.Format( "{0}", m_Mobile.Name );
m_Mobile.ControlMaster.SendLocalizedMessage ( 1049671, petname ); //~1_PETNAME~ is now guarding you.
break;
case OrderType.Attack:
@ -1285,6 +1287,7 @@ namespace Server.Mobiles
else
{
m_Mobile.Warmode = false;
m_Mobile.CurrentSpeed = 0.1;
}
}
}
@ -1453,6 +1456,7 @@ namespace Server.Mobiles
m_Mobile.DebugSay( "Nothing to guard from" );
m_Mobile.Warmode = false;
m_Mobile.CurrentSpeed = 0.1;
WalkMobileRange( controlMaster, 1, false, 0, 1 );
}
@ -1469,8 +1473,8 @@ namespace Server.Mobiles
{
m_Mobile.DebugSay( "I think he might be dead. He's not anywhere around here at least. That's cool. I'm glad he's dead." );
m_Mobile.ControlTarget = null;
m_Mobile.ControlOrder = OrderType.None;
m_Mobile.ControlTarget = m_Mobile.ControlMaster;
m_Mobile.ControlOrder = OrderType.Follow;
if( m_Mobile.FightMode == FightMode.Closest || m_Mobile.FightMode == FightMode.Aggressor )
{

View file

@ -11,6 +11,7 @@ using Server.Items;
using Server.Mobiles;
using Server.ContextMenus;
using Server.Engines.Quests;
using Server.Engines.PartySystem;
using Server.Factions;
using Server.Spells.Bushido;
using Server.Spells.Spellweaving;
@ -1264,7 +1265,7 @@ namespace Server.Mobiles
{
}
public virtual void OnCarve( Mobile from, Corpse corpse )
public virtual void OnCarve( Mobile from, Corpse corpse, Item with )
{
int feathers = Feathers;
int wool = Wool;
@ -1318,16 +1319,43 @@ namespace Server.Mobiles
if ( hides != 0 )
{
if ( HideType == HideType.Regular )
corpse.DropItem( new Hides( hides ) );
else if ( HideType == HideType.Spined )
corpse.DropItem( new SpinedHides( hides ) );
else if ( HideType == HideType.Horned )
corpse.DropItem( new HornedHides( hides ) );
else if ( HideType == HideType.Barbed )
corpse.DropItem( new BarbedHides( hides ) );
Item holding = from.Weapon as Item;
if ( Core.AOS && ( holding is SkinningKnife /* TODO: || holding is ButcherWarCleaver || with is ButcherWarCleaver */ ) )
{
Item leather = null;
from.SendLocalizedMessage( 500471 ); // You skin it, and the hides are now in the corpse.
switch ( HideType )
{
case HideType.Regular: leather = new Leather( hides ); break;
case HideType.Spined: leather = new SpinedLeather( hides ); break;
case HideType.Horned: leather = new HornedLeather( hides ); break;
case HideType.Barbed: leather = new BarbedLeather( hides ); break;
}
if ( leather != null )
{
if ( !from.PlaceInBackpack( leather ) )
{
corpse.DropItem( leather );
from.SendLocalizedMessage( 500471 ); // You skin it, and the hides are now in the corpse.
}
else
from.SendLocalizedMessage( 1073555 ); // You skin it and place the cut-up hides in your backpack.
}
}
else
{
if ( HideType == HideType.Regular )
corpse.DropItem( new Hides( hides ) );
else if ( HideType == HideType.Spined )
corpse.DropItem( new SpinedHides( hides ) );
else if ( HideType == HideType.Horned )
corpse.DropItem( new HornedHides( hides ) );
else if ( HideType == HideType.Barbed )
corpse.DropItem( new BarbedHides( hides ) );
from.SendLocalizedMessage( 500471 ); // You skin it, and the hides are now in the corpse.
}
}
if ( scales != 0 )
@ -1959,7 +1987,7 @@ namespace Server.Mobiles
if ( master != null && master == from ) //So friends can't start the bonding process
{
if ( m_dMinTameSkill <= 29.1 || master.Skills[SkillName.AnimalTaming].Base >= m_dMinTameSkill || OverrideBondingReqs() )
if ( m_dMinTameSkill <= 29.1 || master.Skills[SkillName.AnimalTaming].Base >= m_dMinTameSkill || OverrideBondingReqs() || (Core.ML && master.Skills[SkillName.AnimalTaming].Value >= m_dMinTameSkill) )
{
if ( BondingBegin == DateTime.MinValue )
{
@ -4325,7 +4353,10 @@ namespace Server.Mobiles
int totalKarma = -Karma / 100;
List<DamageStore> list = GetLootingRights( this.DamageEntries, this.HitsMax );
List<Mobile> titles = new List<Mobile>();
List<int> fame = new List<int>();
List<int> karma = new List<int>();
bool givenQuestKill = false;
bool givenFactionKill = false;
bool givenToTKill = false;
@ -4337,8 +4368,41 @@ namespace Server.Mobiles
if ( !ds.m_HasRight )
continue;
Titles.AwardFame( ds.m_Mobile, totalFame, true );
Titles.AwardKarma( ds.m_Mobile, totalKarma, true );
Party party = Engines.PartySystem.Party.Get( ds.m_Mobile );
if ( party != null )
{
int divedFame = totalFame / party.Members.Count;
int divedKarma = totalKarma / party.Members.Count;
for ( int j = 0; j < party.Members.Count; ++j )
{
PartyMemberInfo info = party.Members[ j ] as PartyMemberInfo;
if ( info != null && info.Mobile != null )
{
int index = titles.IndexOf( info.Mobile );
if ( index == -1 )
{
titles.Add( info.Mobile );
fame.Add( divedFame );
karma.Add( divedKarma );
}
else
{
fame[ index ] += divedFame;
karma[ index ] += divedKarma;
}
}
}
}
else
{
titles.Add( ds.m_Mobile );
fame.Add( totalFame );
karma.Add( totalKarma );
}
OnKilledBy( ds.m_Mobile );
@ -4370,6 +4434,11 @@ namespace Server.Mobiles
}
}
}
for ( int i = 0; i < titles.Count; ++i )
{
Titles.AwardFame( titles[ i ], fame[ i ], true );
Titles.AwardKarma( titles[ i ], karma[ i ], true );
}
}
base.OnDeath( c );

View file

@ -8,7 +8,7 @@ namespace Server.Mobiles
public class GiantToad : BaseCreature
{
[Constructable]
public GiantToad() : base( AIType.AI_Animal, FightMode.Aggressor, 10, 1, 0.2, 0.4 )
public GiantToad() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a giant toad";
Body = 80;
@ -60,7 +60,7 @@ namespace Server.Mobiles
{
base.Serialize(writer);
writer.Write((int) 0);
writer.Write((int) 1);
}
public override void Deserialize(GenericReader reader)
@ -68,6 +68,11 @@ namespace Server.Mobiles
base.Deserialize(reader);
int version = reader.ReadInt();
if ( version < 1 )
{
AI = AIType.AI_Melee;
FightMode = FightMode.Closest;
}
}
}
}

View file

@ -15,12 +15,12 @@ namespace Server.Mobiles
public static Type[] ArtifactRarity11 { get { return m_ArtifactRarity11; } }
private static Type[] m_ArtifactRarity10 = new Type[]
{
typeof( LegacyOfTheDreadLord ),
typeof( TheTaskmaster )
};
private static Type[] m_ArtifactRarity11 = new Type[]
{
typeof( LegacyOfTheDreadLord ),
typeof( TheDragonSlayer ),
typeof( ArmorOfFortune ),
typeof( GauntletsOfNobility ),

View file

@ -0,0 +1,296 @@
using System;
using Server;
using Server.Network;
namespace Server.Mobiles
{
[CorpseName( "a hare corpse" )]
public class EnragedRabbit : BaseEnraged
{
public EnragedRabbit( Mobile summoner ) : base( summoner )
{
Name = "a rabbit";
Body = 0xcd;
}
public override int GetAttackSound()
{
return 0xC9;
}
public override int GetHurtSound()
{
return 0xCA;
}
public override int GetDeathSound()
{
return 0xCB;
}
public EnragedRabbit( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
[CorpseName( "a deer corpse" )]
public class EnragedHart : BaseEnraged
{
public EnragedHart( Mobile summoner ) : base( summoner )
{
Name = "a great hart";
Body = 0xea;
}
public override int GetAttackSound()
{
return 0x82;
}
public override int GetHurtSound()
{
return 0x83;
}
public override int GetDeathSound()
{
return 0x84;
}
public EnragedHart( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
[CorpseName( "a deer corpse" )]
public class EnragedHind : BaseEnraged
{
public EnragedHind( Mobile summoner ) : base( summoner )
{
Name = "a hind";
Body = 0xed;
}
public override int GetAttackSound()
{
return 0x82;
}
public override int GetHurtSound()
{
return 0x83;
}
public override int GetDeathSound()
{
return 0x84;
}
public EnragedHind( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
[CorpseName( "a bear corpse" )]
public class EnragedBlackBear : BaseEnraged
{
public EnragedBlackBear( Mobile summoner ) : base( summoner )
{
Name = "a black bear";
Body = 0xd3;
BaseSoundID = 0xa3;
}
public EnragedBlackBear( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
[CorpseName( "an eagle corpse" )]
public class EnragedEagle : BaseEnraged
{
public EnragedEagle( Mobile summoner ) : base( summoner )
{
Name = "an eagle";
Body = 0x5;
BaseSoundID = 0x2ee;
}
public EnragedEagle( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
public class BaseEnraged : BaseCreature
{
public BaseEnraged( Mobile summoner )
: base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
SetStr( 50, 200 );
SetDex( 50, 200 );
SetHits( 50, 200 );
SetStam( 50, 200 );
/*
On OSI, all stats are random 50-200, but
str is never less than hits, and dex is never
less than stam.
*/
if( Str < Hits )
Str = Hits;
if( Dex < Stam )
Dex = Stam;
Karma = -1000;
Tamable = false;
SummonMaster = summoner;
}
public override void OnThink()
{
if( SummonMaster == null || SummonMaster.Deleted )
{
Delete();
}
/*
On OSI, without combatant, they behave as if they have been
given "come" command, ie they wander towards their summoner,
but never actually "follow".
*/
else if( !Combat( this ))
{
if( AIObject != null )
{
AIObject.MoveTo( SummonMaster, false , 5 );
}
}
/*
On OSI, if the summon attacks a mobile, the summoner meer also
attacks them, regardless of karma, etc. as long as the combatant
is a player or controlled/summoned, and the summoner is not already
engaged in combat.
*/
else if( !Combat( SummonMaster ))
{
BaseCreature bc = null;
if( Combatant is BaseCreature )
{
bc = (BaseCreature)Combatant;
}
if( Combatant.Player || ( bc != null && ( bc.Controlled || bc.SummonMaster != null )))
{
SummonMaster.Combatant = Combatant;
}
}
else
{
base.OnThink();
}
}
private bool Combat( Mobile mobile )
{
Mobile combatant = mobile.Combatant;
if( combatant == null || combatant.Deleted )
{
return false;
}
else if ( combatant.IsDeadBondedPet || !combatant.Alive )
{
return false;
}
return true;
}
public override void OnSingleClick( Mobile from )
{
base.OnSingleClick( from );
PrivateOverheadMessage( MessageType.Regular, 0x3B2, 1060768, from.NetState ); // enraged
}
public override void AddNameProperties( ObjectPropertyList list )
{
base.AddNameProperties( list );
list.Add( 1060768 ); // enraged
}
public BaseEnraged( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}

View file

@ -88,11 +88,64 @@ namespace Server.Mobiles
{
m_NextAbilityTime = DateTime.Now + TimeSpan.FromSeconds( Utility.RandomMinMax( 20, 30 ) );
// TODO: Forest summon ability
if( combatant is BaseCreature )
{
BaseCreature bc = (BaseCreature)combatant;
this.Say( true, "I call a plague of insects to sting your flesh!" );
if( bc.Controlled )
{
combatant = bc.ControlMaster;
}
}
m_Table[combatant] = Timer.DelayCall( TimeSpan.FromSeconds( 0.5 ), TimeSpan.FromSeconds( 7.0 ), new TimerStateCallback( DoEffect ), new object[]{ combatant, 0 } );
if( Utility.RandomDouble() < .1 )
{
int[][] coord =
{
new int[]{-4,-6}, new int[]{4,-6}, new int[]{0,-8}, new int[]{-5,5}, new int[]{5,5}
};
BaseCreature rabid;
for( int i=0; i<5; i++ )
{
switch( i )
{
case 0: rabid = new EnragedRabbit( this ); break;
case 1: rabid = new EnragedHind( this ); break;
case 2: rabid = new EnragedHart( this ); break;
case 3: rabid = new EnragedBlackBear( this ); break;
default: rabid = new EnragedEagle( this ); break;
}
rabid.FocusMob = combatant;
int x = combatant.X + coord[i][0];
int y = combatant.Y + coord[i][1];
/*
Once in a while OSI's dont spawn all 5, and
I can only attribute this to a bad spawn location
so I will do this.
*/
Point3D loc = new Point3D( x, y, combatant.Map.GetAverageZ( x, y ));
if ( combatant.Map.CanSpawnMobile( loc ) )
{
rabid.MoveToWorld( loc, combatant.Map ) ;
}
else
{
rabid.Delete();
}
}
this.Say( 1071932 ); //Creatures of the forest, I call to thee! Aid me in the fight against all that is evil!
}
else
{
this.Say( true, "I call a plague of insects to sting your flesh!" );
m_Table[combatant] = Timer.DelayCall( TimeSpan.FromSeconds( 0.5 ), TimeSpan.FromSeconds( 7.0 ), new TimerStateCallback( DoEffect ), new object[]{ combatant, 0 } );
}
}
}

View file

@ -377,6 +377,12 @@ namespace Server.Mobiles
get{ return m_AnkhNextUse; }
set{ m_AnkhNextUse = value; }
}
[CommandProperty( AccessLevel.GameMaster )]
public TimeSpan DisguiseTimeLeft
{
get{ return DisguiseTimers.TimeRemaining( this ); }
}
private DateTime m_PeacedUntil;
@ -928,6 +934,8 @@ namespace Server.Mobiles
pm.BedrollLogout = false;
pm.LastOnline = DateTime.Now;
}
DisguiseTimers.StartTimer( e.Mobile );
Timer.DelayCall( TimeSpan.Zero, new TimerStateCallback( ClearSpecialMovesCallback ), e.Mobile );
}
@ -980,6 +988,8 @@ namespace Server.Mobiles
pm.m_SpeechLog = null;
pm.LastOnline = DateTime.Now;
}
DisguiseTimers.StopTimer( from );
}
public override void RevealingAction()
@ -2047,7 +2057,7 @@ namespace Server.Mobiles
PolymorphSpell.StopTimer( this );
IncognitoSpell.StopTimer( this );
DisguiseGump.StopTimer( this );
DisguiseTimers.RemoveTimer( this );
EndAction( typeof( PolymorphSpell ) );
EndAction( typeof( IncognitoSpell ) );
@ -2643,9 +2653,6 @@ namespace Server.Mobiles
m_HairModHue = reader.ReadInt();
m_BeardModID = reader.ReadInt();
m_BeardModHue = reader.ReadInt();
// We cannot call SetHairMods( -1, -1 ) here because the items have not yet loaded
Timer.DelayCall( TimeSpan.Zero, new TimerCallback( RevertHair ) );
}
goto case 9;
@ -2963,6 +2970,8 @@ namespace Server.Mobiles
faction.RemoveMember( this );
BaseHouse.HandleDeletion( this );
DisguiseTimers.RemoveTimer( this );
}
public override bool NewGuildDisplay { get { return Server.Guilds.Guild.NewGuildSystem; } }
@ -4083,7 +4092,7 @@ namespace Server.Mobiles
{
if ( Core.SE && AllFollowers.Count > 0 )
{
for ( int i = 0; i < m_AllFollowers.Count; ++i )
for ( int i = m_AllFollowers.Count - 1; i >= 0; --i )
{
BaseCreature pet = AllFollowers[i] as BaseCreature;
@ -4096,7 +4105,7 @@ namespace Server.Mobiles
if ( (pet is PackLlama || pet is PackHorse || pet is Beetle || pet is HordeMinionFamiliar) && (pet.Backpack != null && pet.Backpack.Items.Count > 0) )
continue;
if ( !pet.Summoned && !pet.IsBonded )
if ( pet is BaseEscortable )
continue;
pet.ControlTarget = null;
@ -4112,41 +4121,37 @@ namespace Server.Mobiles
Stabled.Add( pet );
m_AutoStabled.Add( pet );
--i;
}
}
}
public void ClaimAutoStabledPets()
{
if( !Core.SE || m_AutoStabled.Count <= 0 )
if ( !Core.SE || m_AutoStabled.Count <= 0 )
return;
if( !Alive )
if ( !Alive )
{
SendLocalizedMessage( 1076251 ); // Your pet was unable to join you while you are a ghost. Please re-login once you have ressurected to claim your pets.
return;
}
for ( int i = 0; i < m_AutoStabled.Count; ++i )
for ( int i = m_AutoStabled.Count - 1; i >= 0; --i )
{
BaseCreature pet = m_AutoStabled[i] as BaseCreature;
if ( pet == null || pet.Deleted )
{
pet.IsStabled = false;
m_AutoStabled.RemoveAt( i );
if( Stabled.Contains( pet ) )
if ( Stabled.Contains( pet ) )
Stabled.Remove( pet );
--i;
continue;
}
if ( (Followers + pet.ControlSlots) <= FollowersMax )
{
m_AutoStabled.RemoveAt( i );
--i;
pet.SetControlMaster( this );
if ( pet.Summoned )
@ -4161,7 +4166,7 @@ namespace Server.Mobiles
pet.Loyalty = BaseCreature.MaxLoyalty; // Wonderfully Happy
if( Stabled.Contains( pet ) )
if ( Stabled.Contains( pet ) )
Stabled.Remove( pet );
}
else

View file

@ -1305,8 +1305,19 @@ namespace Server.Mobiles
}
else
{
OpenBackpack( from );
if ( WasNamed( e.Speech ) )
OpenBackpack( from );
else
{
IPooledEnumerable mobiles = e.Mobile.GetMobilesInRange( 2 );
foreach ( Mobile m in mobiles )
if ( m is PlayerVendor && m.CanSee( e.Mobile ) && m.InLOS( e.Mobile ) )
((PlayerVendor)m).OpenBackpack( from );
mobiles.Free();
}
e.Handled = true;
}
}