- Incognito spell won't change gender anymore
(http://www.uodemise.com/discussion/showthread.php?t=117148) - Abyss Champion spawn has Greater Mongbats in tier 1 instead of Mongbats (http://www.uodemise.com/discussion/showthread.php?t=125248) - BOD books won't return to page 1 anymore when picking or dropping BODs (http://www.uodemise.com/discussion/showthread.php?t=115354) - Added Plague Beast Lords with relative puzzle; Plague Beasts release healty glands (http://www.uodemise.com/discussion/showthread.php?t=116548) - Arch Cure area effect will follow OSI rules in Felucca facet (http://www.uodemise.com/discussion/showthread.php?t=115600) - Solen Ants Holes can spawn randomly in forest (http://www.uodemise.com/discussion/showthread.php?t=123899) - Death Robes will decay after 60 seconds from dropping on the ground (http://www.uodemise.com/discussion/showthread.php?t=121188) - Weapon speeds are indicated in seconds of delay (http://www.uodemise.com/discussion/showthread.php?t=123707)
This commit is contained in:
parent
207be3f720
commit
123af436f9
99 changed files with 2341 additions and 75 deletions
|
|
@ -139,6 +139,66 @@ namespace Server.Engines.BulkOrders
|
|||
return count;
|
||||
}
|
||||
|
||||
public int GetPageForIndex(int index, int sizeDropped)
|
||||
{
|
||||
if (index <= 0)
|
||||
return 0;
|
||||
|
||||
int count = 0;
|
||||
int add = 0;
|
||||
int page = 0;
|
||||
ArrayList list = m_List;
|
||||
int i;
|
||||
object obj;
|
||||
|
||||
for (i=0; (i < index) && (i < list.Count); i++)
|
||||
{
|
||||
obj = list[i];
|
||||
if (CheckFilter(obj))
|
||||
{
|
||||
if (obj is BOBLargeEntry)
|
||||
add = ((BOBLargeEntry)obj).Entries.Length;
|
||||
else
|
||||
add = 1;
|
||||
count += add;
|
||||
if (count > 10)
|
||||
{
|
||||
page++;
|
||||
count = add;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* now we are on the page of the bod preceeding the dropped one.
|
||||
* next step: checking whether we have to remain where we are.
|
||||
* The counter i needs to be incremented as the bod to this very moment
|
||||
* has not yet been removed from m_List */
|
||||
i++;
|
||||
|
||||
/* if, for instance, a big bod of size 6 has been removed, smaller bods
|
||||
* might fall back into this page. Depending on their sizes, the page eeds
|
||||
* to be adjusted accordingly. This is done now.
|
||||
*/
|
||||
if (count + sizeDropped > 10)
|
||||
{
|
||||
while ((i < list.Count) && (count <= 10))
|
||||
{
|
||||
obj = list[i];
|
||||
if (CheckFilter(obj))
|
||||
{
|
||||
if (obj is BOBLargeEntry)
|
||||
count += ((BOBLargeEntry)obj).Entries.Length;
|
||||
else
|
||||
count += 1;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if (count > 10)
|
||||
page++;
|
||||
}
|
||||
return page;
|
||||
}
|
||||
|
||||
|
||||
public object GetMaterialName( BulkMaterialType mat, BODType type, Type itemType )
|
||||
{
|
||||
switch ( type )
|
||||
|
|
@ -256,16 +316,35 @@ namespace Server.Engines.BulkOrders
|
|||
|
||||
if ( item != null )
|
||||
{
|
||||
m_From.AddToBackpack( item );
|
||||
m_From.SendLocalizedMessage( 1045152 ); // The bulk order deed has been placed in your backpack.
|
||||
|
||||
m_Book.Entries.Remove( obj );
|
||||
m_Book.InvalidateProperties();
|
||||
|
||||
if ( m_Book.Entries.Count > 0 )
|
||||
m_From.SendGump( new BOBGump( m_From, m_Book, 0, null ) );
|
||||
Container pack = m_From.Backpack;
|
||||
if ((pack == null) || ((pack != null) && (!pack.CheckHold(m_From, item, true, true, 0, item.PileWeight + item.TotalWeight))))
|
||||
{
|
||||
m_From.SendLocalizedMessage(503204); // You do not have room in your backpack for this
|
||||
m_From.SendGump(new BOBGump(m_From, m_Book, m_Page, null));
|
||||
}
|
||||
else
|
||||
m_From.SendLocalizedMessage( 1062381 ); // The book is empty.
|
||||
{
|
||||
if (m_Book.IsChildOf(m_From.Backpack))
|
||||
{
|
||||
int sizeOfDroppedBod;
|
||||
if (obj is BOBLargeEntry)
|
||||
sizeOfDroppedBod = ((BOBLargeEntry)obj).Entries.Length;
|
||||
else
|
||||
sizeOfDroppedBod = 1;
|
||||
|
||||
m_From.AddToBackpack(item);
|
||||
m_From.SendLocalizedMessage(1045152); // The bulk order deed has been placed in your backpack.
|
||||
m_Book.Entries.Remove(obj);
|
||||
m_Book.InvalidateProperties();
|
||||
if (m_Book.Entries.Count > 0)
|
||||
{
|
||||
m_Page = GetPageForIndex(index, sizeOfDroppedBod);
|
||||
m_From.SendGump(new BOBGump(m_From, m_Book, m_Page, null));
|
||||
}
|
||||
else
|
||||
m_From.SendLocalizedMessage(1062381); // The book is empty.
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -283,26 +362,37 @@ namespace Server.Engines.BulkOrders
|
|||
else if ( m_Book.RootParent is PlayerVendor )
|
||||
{
|
||||
PlayerVendor pv = (PlayerVendor)m_Book.RootParent;
|
||||
|
||||
VendorItem vi = pv.GetVendorItem( m_Book );
|
||||
|
||||
int price = 0;
|
||||
|
||||
if ( vi != null && !vi.IsForSale )
|
||||
if (vi != null && !vi.IsForSale)
|
||||
{
|
||||
if ( obj is BOBLargeEntry )
|
||||
int sizeOfDroppedBod;
|
||||
int price = 0;
|
||||
if (obj is BOBLargeEntry)
|
||||
{
|
||||
price = ((BOBLargeEntry)obj).Price;
|
||||
else if ( obj is BOBSmallEntry )
|
||||
sizeOfDroppedBod = ((BOBLargeEntry)obj).Entries.Length;
|
||||
}
|
||||
else
|
||||
{
|
||||
price = ((BOBSmallEntry)obj).Price;
|
||||
sizeOfDroppedBod = 1;
|
||||
}
|
||||
if (price == 0)
|
||||
m_From.SendLocalizedMessage(1062382); // The deed selected is not available.
|
||||
else
|
||||
{
|
||||
if (m_Book.Entries.Count > 0)
|
||||
{
|
||||
m_Page = GetPageForIndex(index, sizeOfDroppedBod);
|
||||
m_From.SendGump(new BODBuyGump(m_From, m_Book, obj, m_Page, price));
|
||||
}
|
||||
else
|
||||
m_From.SendLocalizedMessage(1062381); // The book is emptz
|
||||
}
|
||||
}
|
||||
|
||||
if ( price == 0 )
|
||||
m_From.SendLocalizedMessage( 1062382 ); // The deed selected is not available.
|
||||
else
|
||||
m_From.SendGump( new BODBuyGump( m_From, m_Book, obj, price ) );
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ namespace Server.Engines.BulkOrders
|
|||
private BulkOrderBook m_Book;
|
||||
private object m_Object;
|
||||
private int m_Price;
|
||||
private int m_Page;
|
||||
|
||||
public override void OnResponse( Server.Network.NetState sender, RelayInfo info )
|
||||
{
|
||||
|
|
@ -60,27 +61,31 @@ namespace Server.Engines.BulkOrders
|
|||
|
||||
Container pack = m_From.Backpack;
|
||||
|
||||
if ( (pack != null && pack.ConsumeTotal( typeof( Gold ), price )) || Banker.Withdraw( m_From, price ) )
|
||||
if ( (pack == null) || ((pack != null) && (!pack.CheckHold(m_From, item, true, true, 0, item.PileWeight + item.TotalWeight)) ) )
|
||||
{
|
||||
m_Book.Entries.Remove( m_Object );
|
||||
m_Book.InvalidateProperties();
|
||||
|
||||
pv.HoldGold += price;
|
||||
|
||||
if ( m_From.AddToBackpack( item ) )
|
||||
m_From.SendLocalizedMessage( 1045152 ); // The bulk order deed has been placed in your backpack.
|
||||
else
|
||||
pv.SayTo( m_From, 503204 ); // You do not have room in your backpack for this.
|
||||
|
||||
if ( m_Book.Entries.Count > 0 )
|
||||
m_From.SendGump( new BOBGump( m_From, m_Book ) );
|
||||
else
|
||||
m_From.SendLocalizedMessage( 1062381 ); // The book is empty.
|
||||
pv.SayTo(m_From, 503204); // You do not have room in your backpack for this
|
||||
m_From.SendGump(new BOBGump(m_From, m_Book, m_Page, null));
|
||||
}
|
||||
else
|
||||
{
|
||||
pv.SayTo( m_From, 503205 ); // You cannot afford this item.
|
||||
item.Delete();
|
||||
if ((pack != null && pack.ConsumeTotal( typeof( Gold ), price )) || Banker.Withdraw( m_From, price ) )
|
||||
{
|
||||
m_Book.Entries.Remove( m_Object );
|
||||
m_Book.InvalidateProperties();
|
||||
pv.HoldGold += price;
|
||||
m_From.AddToBackpack( item );
|
||||
m_From.SendLocalizedMessage( 1045152 ); // The bulk order deed has been placed in your backpack.
|
||||
|
||||
if ( m_Book.Entries.Count > 0 )
|
||||
m_From.SendGump( new BOBGump( m_From, m_Book, m_Page, null ) );
|
||||
else
|
||||
m_From.SendLocalizedMessage( 1062381 ); // The book is empty.
|
||||
}
|
||||
else
|
||||
{
|
||||
pv.SayTo( m_From, 503205 ); // You cannot afford this item.
|
||||
item.Delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -99,12 +104,13 @@ namespace Server.Engines.BulkOrders
|
|||
}
|
||||
}
|
||||
|
||||
public BODBuyGump( PlayerMobile from, BulkOrderBook book, object obj, int price ) : base( 100, 200 )
|
||||
public BODBuyGump( PlayerMobile from, BulkOrderBook book, object obj, int page, int price ) : base( 100, 200 )
|
||||
{
|
||||
m_From = from;
|
||||
m_Book = book;
|
||||
m_Object = obj;
|
||||
m_Price = price;
|
||||
m_Page = page;
|
||||
|
||||
AddPage( 0 );
|
||||
|
||||
|
|
|
|||
|
|
@ -106,6 +106,7 @@ namespace Server.Engines.BulkOrders
|
|||
m_Entries.Add( new BOBLargeEntry( (LargeBOD)dropped ) );
|
||||
InvalidateProperties();
|
||||
|
||||
from.PlaySound(0x42);
|
||||
from.SendLocalizedMessage( 1062386 ); // Deed added to book.
|
||||
|
||||
if ( from is PlayerMobile )
|
||||
|
|
@ -132,6 +133,7 @@ namespace Server.Engines.BulkOrders
|
|||
m_Entries.Add( new BOBSmallEntry( (SmallBOD)dropped ) );
|
||||
InvalidateProperties();
|
||||
|
||||
from.PlaySound(0x42);
|
||||
from.SendLocalizedMessage( 1062386 ); // Deed added to book.
|
||||
|
||||
if ( from is PlayerMobile )
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ namespace Server.Engines.CannedEvil
|
|||
{
|
||||
new ChampionSpawnInfo( "Abyss", typeof( Semidar ), new string[]{ "Foe", "Assassin", "Conqueror" }, new Type[][] // Abyss
|
||||
{ // Abyss
|
||||
new Type[]{ typeof( StrongMongbat ), typeof( Imp ) }, // Level 1
|
||||
new Type[]{ typeof( GreaterMongbat ), typeof( Imp ) }, // Level 1
|
||||
new Type[]{ typeof( Gargoyle ), typeof( Harpy ) }, // Level 2
|
||||
new Type[]{ typeof( FireGargoyle ), typeof( StoneGargoyle ) }, // Level 3
|
||||
new Type[]{ typeof( Daemon ), typeof( Succubus ) } // Level 4
|
||||
|
|
|
|||
170
Scripts/Items/Addons/SolenAntHole.cs
Normal file
170
Scripts/Items/Addons/SolenAntHole.cs
Normal file
|
|
@ -0,0 +1,170 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Server;
|
||||
using Server.Network;
|
||||
using Server.Mobiles;
|
||||
using Server.Spells;
|
||||
|
||||
namespace Server.Items
|
||||
{
|
||||
public class SolenAntHoleComponent : AddonComponent
|
||||
{
|
||||
public SolenAntHoleComponent( int itemID ) : base( itemID )
|
||||
{
|
||||
}
|
||||
|
||||
public override void OnDoubleClick( Mobile from )
|
||||
{
|
||||
if ( from.InRange( this, 2 ) )
|
||||
{
|
||||
Map map = Map;
|
||||
|
||||
if ( map == Map.Trammel || map == Map.Felucca )
|
||||
{
|
||||
from.MoveToWorld( new Point3D( 5922, 2024, 0 ), map );
|
||||
PublicOverheadMessage( MessageType.Regular, 0x3B2, true, String.Format( "* {0} dives into the hole and disappears!*", from.Name ) );
|
||||
}
|
||||
}
|
||||
else
|
||||
from.LocalOverheadMessage( MessageType.Regular, 0x3B2, 1019045 ); // I can't reach that.
|
||||
}
|
||||
|
||||
public SolenAntHoleComponent( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.WriteEncodedInt( 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadEncodedInt();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public class SolenAntHole : BaseAddon
|
||||
{
|
||||
public override bool ShareHue { get { return false; } }
|
||||
public override bool HandlesOnMovement { get { return true; } }
|
||||
|
||||
private List<Mobile> m_Spawned;
|
||||
|
||||
[Constructable]
|
||||
public SolenAntHole() : base()
|
||||
{
|
||||
m_Spawned = new List<Mobile>();
|
||||
|
||||
AddComponent( new AddonComponent( 0x914 ), "dirt", 0, 0, 0, 0 );
|
||||
AddComponent( new SolenAntHoleComponent( 0x122A ), "a hole", 0x1, 0, 0, 0 );
|
||||
AddComponent( new AddonComponent( 0x1B23 ), "dirt", 0x970, 1, 1, 0 );
|
||||
AddComponent( new AddonComponent( 0xEE0 ), "dirt", 0, 1, 0, 0 );
|
||||
AddComponent( new AddonComponent( 0x1B24 ), "dirt", 0x970, 1, -1, 0 );
|
||||
AddComponent( new AddonComponent( 0xEE1 ), "dirt", 0, 0, -1, 0 );
|
||||
AddComponent( new AddonComponent( 0x1B25 ), "dirt", 0x970, -1, -1, 0 );
|
||||
AddComponent( new AddonComponent( 0xEE2 ), "dirt", 0, -1, 0, 0 );
|
||||
AddComponent( new AddonComponent( 0x1B26 ), "dirt", 0x970, -1, 1, 0 );
|
||||
AddComponent( new AddonComponent( 0xED3 ), "dirt", 0, 0, 1, 0 );
|
||||
}
|
||||
|
||||
public override void OnMovement( Mobile m, Point3D oldLocation )
|
||||
{
|
||||
if ( !m.Player || !m.Alive || m.Hidden || !SpawnKilled() )
|
||||
return;
|
||||
|
||||
if ( Utility.InRange( Location, m.Location, 3 ) && !Utility.InRange( Location, oldLocation, 3 ) )
|
||||
{
|
||||
int count = 1 + Utility.Random( 4 );
|
||||
|
||||
for ( int i = 0; i < count; i++ )
|
||||
SpawnAnt();
|
||||
|
||||
if ( 0.05 > Utility.RandomDouble() )
|
||||
SpawnAnt( new Beetle() );
|
||||
}
|
||||
}
|
||||
|
||||
public void AddComponent( AddonComponent c, string name, int hue, int x, int y, int z )
|
||||
{
|
||||
c.Hue = hue;
|
||||
c.Name = name;
|
||||
AddComponent( c, x, y, z );
|
||||
}
|
||||
|
||||
public void SpawnAnt()
|
||||
{
|
||||
int random = Utility.Random( 3 );
|
||||
Map map = Map;
|
||||
|
||||
if ( map == Map.Trammel )
|
||||
{
|
||||
if ( random < 2 )
|
||||
SpawnAnt( new RedSolenWorker() );
|
||||
else
|
||||
SpawnAnt( new RedSolenWarrior() );
|
||||
}
|
||||
else if ( map == Map.Felucca )
|
||||
{
|
||||
if ( random < 2 )
|
||||
SpawnAnt( new BlackSolenWorker() );
|
||||
else
|
||||
SpawnAnt( new BlackSolenWarrior() );
|
||||
}
|
||||
}
|
||||
|
||||
public void SpawnAnt( BaseCreature ant )
|
||||
{
|
||||
m_Spawned.Add( ant );
|
||||
|
||||
Map map = Map;
|
||||
Point3D p = Location;
|
||||
|
||||
for ( int i = 0; i < 5; i++ )
|
||||
if ( SpellHelper.FindValidSpawnLocation( map, ref p, false ) )
|
||||
break;
|
||||
|
||||
ant.MoveToWorld( p, map );
|
||||
ant.Home = Location;
|
||||
ant.RangeHome = 10;
|
||||
}
|
||||
|
||||
public bool SpawnKilled()
|
||||
{
|
||||
for ( int i = m_Spawned.Count - 1; i >= 0; i-- )
|
||||
{
|
||||
if ( !m_Spawned[ i ].Alive || m_Spawned[ i ].Deleted )
|
||||
m_Spawned.RemoveAt( i );
|
||||
}
|
||||
|
||||
return m_Spawned.Count < 2;
|
||||
}
|
||||
|
||||
public SolenAntHole( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.WriteEncodedInt( 0 ); // version
|
||||
|
||||
writer.WriteMobileList<Mobile>( m_Spawned );
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadEncodedInt();
|
||||
|
||||
m_Spawned = reader.ReadStrongMobileList<Mobile>();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -100,6 +100,11 @@ namespace Server.Items
|
|||
|
||||
public class DeathRobe : Robe
|
||||
{
|
||||
private Timer m_DecayTimer;
|
||||
private DateTime m_DecayTime;
|
||||
|
||||
private static TimeSpan m_DefaultDecayTime = TimeSpan.FromMinutes(1.0);
|
||||
|
||||
public override bool DisplayLootType
|
||||
{
|
||||
get{ return false; }
|
||||
|
|
@ -110,6 +115,7 @@ namespace Server.Items
|
|||
{
|
||||
LootType = LootType.Newbied;
|
||||
Hue = 2301;
|
||||
BeginDecay( m_DefaultDecayTime );
|
||||
}
|
||||
|
||||
public new bool Scissor( Mobile from, Scissors scissors )
|
||||
|
|
@ -117,6 +123,62 @@ namespace Server.Items
|
|||
from.SendLocalizedMessage( 502440 ); // Scissors can not be used on that to produce anything.
|
||||
return false;
|
||||
}
|
||||
|
||||
public void BeginDecay( TimeSpan delay )
|
||||
{
|
||||
if ( m_DecayTimer != null )
|
||||
m_DecayTimer.Stop();
|
||||
|
||||
m_DecayTime = DateTime.Now + delay;
|
||||
|
||||
m_DecayTimer = new InternalTimer( this, delay );
|
||||
m_DecayTimer.Start();
|
||||
}
|
||||
|
||||
public override bool OnDroppedToWorld( Mobile from, Point3D p )
|
||||
{
|
||||
BeginDecay( m_DefaultDecayTime );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override bool OnDroppedToMobile( Mobile from, Mobile target )
|
||||
{
|
||||
if (m_DecayTimer != null )
|
||||
{
|
||||
m_DecayTimer.Stop();
|
||||
m_DecayTimer = null;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override void OnAfterDelete()
|
||||
{
|
||||
if ( m_DecayTimer != null )
|
||||
m_DecayTimer.Stop();
|
||||
|
||||
m_DecayTimer = null;
|
||||
}
|
||||
|
||||
private class InternalTimer : Timer
|
||||
{
|
||||
private DeathRobe m_Robe;
|
||||
|
||||
public InternalTimer( DeathRobe c, TimeSpan delay ) : base( delay )
|
||||
{
|
||||
m_Robe = c;
|
||||
Priority = TimerPriority.FiveSeconds;
|
||||
}
|
||||
|
||||
protected override void OnTick()
|
||||
{
|
||||
if ( m_Robe.Parent != null || m_Robe.IsLockedDown )
|
||||
Stop();
|
||||
else
|
||||
m_Robe.Delete();
|
||||
}
|
||||
}
|
||||
|
||||
public DeathRobe( Serial serial ) : base( serial )
|
||||
{
|
||||
|
|
@ -126,7 +188,12 @@ namespace Server.Items
|
|||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 1 ); // version
|
||||
writer.Write( (int) 2 ); // version
|
||||
|
||||
writer.Write( m_DecayTimer != null );
|
||||
|
||||
if( m_DecayTimer != null )
|
||||
writer.WriteDeltaTime( m_DecayTime );
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
|
|
@ -134,6 +201,26 @@ namespace Server.Items
|
|||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
|
||||
switch ( version )
|
||||
{
|
||||
case 2:
|
||||
{
|
||||
if( reader.ReadBool() )
|
||||
{
|
||||
m_DecayTime = reader.ReadDeltaTime();
|
||||
BeginDecay( m_DecayTime - DateTime.Now );
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 1:
|
||||
case 0:
|
||||
{
|
||||
if ( Parent == null )
|
||||
BeginDecay( m_DefaultDecayTime );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( version < 1 && Hue == 0 )
|
||||
Hue = 2301;
|
||||
|
|
|
|||
|
|
@ -102,11 +102,27 @@ namespace Server.Items
|
|||
from.SendLocalizedMessage( 500295 ); // You are too far away to do that.
|
||||
}
|
||||
}
|
||||
else if ( targeted is PlagueBeastInnard )
|
||||
{
|
||||
if ( ((PlagueBeastInnard) targeted).OnBandage( from ) )
|
||||
m_Bandage.Consume();
|
||||
}
|
||||
else
|
||||
{
|
||||
from.SendLocalizedMessage( 500970 ); // Bandages can not be used on that.
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnNonlocalTarget( Mobile from, object targeted )
|
||||
{
|
||||
if ( targeted is PlagueBeastInnard )
|
||||
{
|
||||
if ( ((PlagueBeastInnard) targeted).OnBandage( from ) )
|
||||
m_Bandage.Consume();
|
||||
}
|
||||
else
|
||||
base.OnNonlocalTarget( from, targeted );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ namespace Server.Items
|
|||
{
|
||||
private Scissors m_Item;
|
||||
|
||||
public InternalTarget( Scissors item ) : base( 1, false, TargetFlags.None )
|
||||
public InternalTarget( Scissors item ) : base( 2, false, TargetFlags.None )
|
||||
{
|
||||
m_Item = item;
|
||||
}
|
||||
|
|
@ -71,8 +71,15 @@ namespace Server.Items
|
|||
{
|
||||
from.SendLocalizedMessage( 1063305 ); // Didn't your parents ever tell you not to run with scissors in your hand?!
|
||||
}
|
||||
else if ( targeted is Item && !((Item)targeted).Movable ) {
|
||||
return;
|
||||
else if( targeted is Item && !((Item)targeted).Movable )
|
||||
{
|
||||
if( targeted is IScissorable && ( targeted is PlagueBeastInnard || targeted is PlagueBeastMutationCore ) )
|
||||
{
|
||||
IScissorable obj = (IScissorable) targeted;
|
||||
|
||||
if( obj.Scissor( from, m_Item ) )
|
||||
from.PlaySound( 0x248 );
|
||||
}
|
||||
}
|
||||
else if( targeted is IScissorable )
|
||||
{
|
||||
|
|
@ -86,6 +93,19 @@ namespace Server.Items
|
|||
from.SendLocalizedMessage( 502440 ); // Scissors can not be used on that to produce anything.
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnNonlocalTarget( Mobile from, object targeted )
|
||||
{
|
||||
if ( targeted is IScissorable && ( targeted is PlagueBeastInnard || targeted is PlagueBeastMutationCore ) )
|
||||
{
|
||||
IScissorable obj = (IScissorable) targeted;
|
||||
|
||||
if ( obj.Scissor( from, m_Item ) )
|
||||
from.PlaySound( 0x248 );
|
||||
}
|
||||
else
|
||||
base.OnNonlocalTarget( from, targeted );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
186
Scripts/Items/Special/Mutation Core/PlagueBeastBackpack.cs
Normal file
186
Scripts/Items/Special/Mutation Core/PlagueBeastBackpack.cs
Normal file
|
|
@ -0,0 +1,186 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Server;
|
||||
|
||||
namespace Server.Items
|
||||
{
|
||||
public class PlagueBeastBackpack : BaseContainer
|
||||
{
|
||||
public override int DefaultMaxWeight { get { return 0; } }
|
||||
public override int DefaultMaxItems { get { return 0; } }
|
||||
public override int DefaultGumpID { get { return 0x2A63; } }
|
||||
public override int DefaultDropSound { get { return 0x23F; } }
|
||||
|
||||
private static int[,,] m_Positions = new int[,,]
|
||||
{
|
||||
{ { 275, 85 }, { 360, 111 }, { 375, 184 }, { 332, 228 }, { 141, 105 }, { 189, 75 } },
|
||||
{ { 274, 34 }, { 327, 89 }, { 354, 168 }, { 304, 225 }, { 113, 86 }, { 189, 75 } },
|
||||
{ { 276, 79 }, { 369, 117 }, { 372, 192 }, { 336, 230 }, { 141, 116 }, { 189, 75 } },
|
||||
};
|
||||
|
||||
private static int[] m_BrainHues = new int[]
|
||||
{
|
||||
0x2B, 0x42, 0x54, 0x60
|
||||
};
|
||||
|
||||
public PlagueBeastBackpack() : base( 0x261B )
|
||||
{
|
||||
Layer = Layer.Backpack;
|
||||
}
|
||||
|
||||
public void Initialize()
|
||||
{
|
||||
AddInnard( 0x1CF6, 0x0, 227, 128 );
|
||||
AddInnard( 0x1D10, 0x0, 251, 128 );
|
||||
AddInnard( 0x1FBE, 0x21, 240, 83 );
|
||||
|
||||
AddInnard( new PlagueBeastHeart(), 229, 104 );
|
||||
|
||||
AddInnard( 0x1D06, 0x0, 283, 91 );
|
||||
AddInnard( 0x1FAF, 0x21, 315, 107 );
|
||||
AddInnard( 0x1FB9, 0x21, 289, 87 );
|
||||
AddInnard( 0x9E7, 0x21, 304, 96 );
|
||||
AddInnard( 0x1B1A, 0x66D, 335, 102 );
|
||||
AddInnard( 0x1D10, 0x0, 338, 146 );
|
||||
AddInnard( 0x1FB3, 0x21, 358, 167 );
|
||||
AddInnard( 0x1D0B, 0x0, 357, 155 );
|
||||
AddInnard( 0x9E7, 0x21, 339, 184 );
|
||||
AddInnard( 0x1B1A, 0x66D, 157, 172 );
|
||||
AddInnard( 0x1D11, 0x0, 147, 157 );
|
||||
AddInnard( 0x1FB9, 0x21, 121, 131 );
|
||||
AddInnard( 0x9E7, 0x21, 166, 176 );
|
||||
AddInnard( 0x1D0B, 0x0, 122, 138 );
|
||||
AddInnard( 0x1D0D, 0x0, 118, 150 );
|
||||
AddInnard( 0x1FB3, 0x21, 97, 123 );
|
||||
AddInnard( 0x1D08, 0x0, 115, 113 );
|
||||
AddInnard( 0x9E7, 0x21, 109, 109 );
|
||||
AddInnard( 0x9E7, 0x21, 91, 122 );
|
||||
AddInnard( 0x9E7, 0x21, 94, 160 );
|
||||
AddInnard( 0x1B19, 0x66D, 170, 121 );
|
||||
AddInnard( 0x1FAF, 0x21, 161, 111 );
|
||||
AddInnard( 0x1D0B, 0x0, 158, 112 );
|
||||
AddInnard( 0x9E7, 0x21, 159, 101 );
|
||||
AddInnard( 0x1D10, 0x0, 132, 177 );
|
||||
AddInnard( 0x1D0E, 0x0, 110, 178 );
|
||||
AddInnard( 0x1FB3, 0x21, 95, 194 );
|
||||
AddInnard( 0x1FAF, 0x21, 154, 203 );
|
||||
AddInnard( 0x1B1A, 0x66D, 110, 237 );
|
||||
AddInnard( 0x9E7, 0x21, 111, 171 );
|
||||
AddInnard( 0x9E7, 0x21, 90, 197 );
|
||||
AddInnard( 0x9E7, 0x21, 166, 205 );
|
||||
AddInnard( 0x9E7, 0x21, 96, 242 );
|
||||
AddInnard( 0x1D10, 0x0, 334, 196 );
|
||||
AddInnard( 0x1D0B, 0x0, 322, 270 );
|
||||
|
||||
List<PlagueBeastOrgan> organs = new List<PlagueBeastOrgan>();
|
||||
PlagueBeastOrgan organ;
|
||||
|
||||
for ( int i = 0; i < 6; i++ )
|
||||
{
|
||||
int random = Utility.Random( 3 );
|
||||
|
||||
if ( i == 5 )
|
||||
random = 0;
|
||||
|
||||
switch ( random )
|
||||
{
|
||||
default:
|
||||
case 0: organ = new PlagueBeastRockOrgan(); break;
|
||||
case 1: organ = new PlagueBeastMaidenOrgan(); break;
|
||||
case 2: organ = new PlagueBeastRubbleOrgan(); break;
|
||||
}
|
||||
|
||||
organs.Add( organ );
|
||||
AddInnard( organ, m_Positions[ random, i, 0 ], m_Positions[ random, i, 1 ] );
|
||||
}
|
||||
|
||||
organ = new PlagueBeastBackupOrgan();
|
||||
organs.Add( organ );
|
||||
AddInnard( organ, 129, 214 );
|
||||
|
||||
for ( int i = 0; i < m_BrainHues.Length; i++ )
|
||||
{
|
||||
int random = Utility.Random( organs.Count );
|
||||
organ = organs[ random ];
|
||||
organ.BrainHue = m_BrainHues[ i ];
|
||||
organs.RemoveAt( random );
|
||||
}
|
||||
|
||||
organs.Clear();
|
||||
|
||||
AddInnard( new PlagueBeastMainOrgan(), 240, 161 );
|
||||
}
|
||||
|
||||
public override bool TryDropItem( Mobile from, Item dropped, bool sendFullMessage )
|
||||
{
|
||||
if ( dropped is PlagueBeastInnard || dropped is PlagueBeastGland )
|
||||
return base.TryDropItem( from, dropped, sendFullMessage );
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public override bool OnDragDropInto( Mobile from, Item item, Point3D p )
|
||||
{
|
||||
if ( IsAccessibleTo( from ) && ( item is PlagueBeastInnard || item is PlagueBeastGland ) )
|
||||
{
|
||||
Rectangle2D ir = ItemBounds.Table[ item.ItemID ];
|
||||
int x, y;
|
||||
int cx = p.X + ir.X + ir.Width / 2;
|
||||
int cy = p.Y + ir.Y + ir.Height / 2;
|
||||
|
||||
for ( int i = Items.Count - 1; i >= 0; i-- )
|
||||
{
|
||||
PlagueBeastComponent innard = Items[ i ] as PlagueBeastComponent;
|
||||
|
||||
if ( innard != null )
|
||||
{
|
||||
Rectangle2D r = ItemBounds.Table[ innard.ItemID ];
|
||||
|
||||
x = innard.X + r.X;
|
||||
y = innard.Y + r.Y;
|
||||
|
||||
if ( cx >= x && cx <= x + r.Width && cy >= y && cy <= y + r.Height )
|
||||
{
|
||||
innard.OnDragDrop( from, item );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return base.OnDragDropInto( from, item, p );
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public void AddInnard( int itemID, int hue, int x, int y )
|
||||
{
|
||||
AddInnard( new PlagueBeastInnard( itemID, hue ), x, y );
|
||||
}
|
||||
|
||||
public void AddInnard( PlagueBeastInnard innard, int x, int y )
|
||||
{
|
||||
AddItem( innard );
|
||||
innard.Location = new Point3D( x, y, 0 );
|
||||
innard.Map = Map;
|
||||
}
|
||||
|
||||
public PlagueBeastBackpack( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.WriteEncodedInt( 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadEncodedInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
127
Scripts/Items/Special/Mutation Core/PlagueBeastBlood.cs
Normal file
127
Scripts/Items/Special/Mutation Core/PlagueBeastBlood.cs
Normal file
|
|
@ -0,0 +1,127 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Network;
|
||||
|
||||
namespace Server.Items
|
||||
{
|
||||
public class PlagueBeastBlood : PlagueBeastComponent
|
||||
{
|
||||
public bool Patched
|
||||
{
|
||||
get { return ItemID == 0x1765; }
|
||||
}
|
||||
|
||||
public bool Starting
|
||||
{
|
||||
get { return ItemID == 0x122C; }
|
||||
}
|
||||
|
||||
private Timer m_Timer;
|
||||
|
||||
public PlagueBeastBlood() : base( 0x122C, 0 )
|
||||
{
|
||||
m_Timer = Timer.DelayCall( TimeSpan.FromSeconds( 1.5 ), TimeSpan.FromSeconds( 1.5 ), 3, new TimerCallback( Hemorrhage ) );
|
||||
}
|
||||
|
||||
public override void OnAfterDelete()
|
||||
{
|
||||
if ( m_Timer != null && m_Timer.Running )
|
||||
m_Timer.Stop();
|
||||
}
|
||||
|
||||
public override bool OnBandage( Mobile from )
|
||||
{
|
||||
if ( IsAccessibleTo( from ) && !Patched )
|
||||
{
|
||||
if ( m_Timer != null && m_Timer.Running )
|
||||
m_Timer.Stop();
|
||||
|
||||
if ( Starting )
|
||||
{
|
||||
X += 2;
|
||||
Y -= 9;
|
||||
|
||||
if ( Organ is PlagueBeastRubbleOrgan )
|
||||
Y -= 5;
|
||||
else if ( Organ is PlagueBeastBackupOrgan )
|
||||
X += 7;
|
||||
}
|
||||
else
|
||||
{
|
||||
X -= 4;
|
||||
Y -= 2;
|
||||
}
|
||||
|
||||
ItemID = 0x1765;
|
||||
|
||||
if ( Owner != null )
|
||||
{
|
||||
Container pack = Owner.Backpack;
|
||||
|
||||
if ( pack != null )
|
||||
{
|
||||
for ( int i = 0; i < pack.Items.Count; i++ )
|
||||
{
|
||||
PlagueBeastMainOrgan main = pack.Items[ i ] as PlagueBeastMainOrgan;
|
||||
|
||||
if ( main != null && main.Complete )
|
||||
main.FinishOpening( from );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PublicOverheadMessage( MessageType.Regular, 0x3B2, 1071916 ); // * You patch up the wound with a bandage *
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private void Hemorrhage()
|
||||
{
|
||||
if ( Patched )
|
||||
return;
|
||||
|
||||
if ( Owner != null )
|
||||
Owner.PlaySound( 0x25 );
|
||||
|
||||
if ( ItemID == 0x122A )
|
||||
{
|
||||
if ( Owner != null )
|
||||
{
|
||||
Owner.Unfreeze();
|
||||
Owner.Kill();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( Starting )
|
||||
{
|
||||
X += 8;
|
||||
Y -= 10;
|
||||
}
|
||||
|
||||
ItemID--;
|
||||
}
|
||||
}
|
||||
|
||||
public PlagueBeastBlood( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.WriteEncodedInt( 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadEncodedInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
34
Scripts/Items/Special/Mutation Core/PlagueBeastGland.cs
Normal file
34
Scripts/Items/Special/Mutation Core/PlagueBeastGland.cs
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
using System;
|
||||
using Server;
|
||||
|
||||
namespace Server.Items
|
||||
{
|
||||
public class PlagueBeastGland : Item
|
||||
{
|
||||
[Constructable]
|
||||
public PlagueBeastGland() : base( 0x1CEF )
|
||||
{
|
||||
Name = "A Healthy Gland";
|
||||
Weight = 1.0;
|
||||
Hue = 0x6;
|
||||
}
|
||||
|
||||
public PlagueBeastGland( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.WriteEncodedInt( 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadEncodedInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
80
Scripts/Items/Special/Mutation Core/PlagueBeastHeart.cs
Normal file
80
Scripts/Items/Special/Mutation Core/PlagueBeastHeart.cs
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
using System;
|
||||
using Server;
|
||||
|
||||
namespace Server.Items
|
||||
{
|
||||
public class PlagueBeastHeart : PlagueBeastInnard
|
||||
{
|
||||
private Timer m_Timer;
|
||||
|
||||
public PlagueBeastHeart() : base( 0x1363, 0x21 )
|
||||
{
|
||||
m_Timer = new InternalTimer( this );
|
||||
m_Timer.Start();
|
||||
}
|
||||
|
||||
public override void OnAfterDelete()
|
||||
{
|
||||
if ( m_Timer != null && m_Timer.Running )
|
||||
m_Timer.Stop();
|
||||
}
|
||||
|
||||
public PlagueBeastHeart( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.WriteEncodedInt( 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadEncodedInt();
|
||||
|
||||
m_Timer = new InternalTimer( this );
|
||||
m_Timer.Start();
|
||||
}
|
||||
|
||||
private class InternalTimer : Timer
|
||||
{
|
||||
private PlagueBeastHeart m_Heart;
|
||||
private bool m_Delay;
|
||||
|
||||
public InternalTimer( PlagueBeastHeart heart ) : base( TimeSpan.FromSeconds( 0.5 ), TimeSpan.FromSeconds( 0.5 ) )
|
||||
{
|
||||
m_Heart = heart;
|
||||
}
|
||||
|
||||
protected override void OnTick()
|
||||
{
|
||||
if ( m_Heart == null || m_Heart.Deleted || m_Heart.Owner == null || !m_Heart.Owner.Alive )
|
||||
{
|
||||
Stop();
|
||||
return;
|
||||
}
|
||||
|
||||
if ( m_Heart.ItemID == 0x1363 )
|
||||
{
|
||||
if ( m_Delay )
|
||||
{
|
||||
m_Heart.ItemID = 0x1367;
|
||||
m_Heart.Owner.PlaySound( 0x11F );
|
||||
}
|
||||
|
||||
m_Delay = !m_Delay;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_Heart.ItemID = 0x1363;
|
||||
m_Heart.Owner.PlaySound( 0x120 );
|
||||
m_Delay = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
192
Scripts/Items/Special/Mutation Core/PlagueBeastInnard.cs
Normal file
192
Scripts/Items/Special/Mutation Core/PlagueBeastInnard.cs
Normal file
|
|
@ -0,0 +1,192 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Mobiles;
|
||||
using Server.Network;
|
||||
|
||||
namespace Server.Items
|
||||
{
|
||||
public class PlagueBeastInnard : Item, IScissorable, ICarvable
|
||||
{
|
||||
public PlagueBeastLord Owner
|
||||
{
|
||||
get { return RootParent as PlagueBeastLord; }
|
||||
}
|
||||
|
||||
public PlagueBeastInnard( int itemID, int hue ) : base( itemID )
|
||||
{
|
||||
Name = "plague beast innards";
|
||||
Hue = hue;
|
||||
Movable = false;
|
||||
Weight = 1.0;
|
||||
}
|
||||
|
||||
public virtual bool Scissor( Mobile from, Scissors scissors )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public virtual void Carve( Mobile from, Item with )
|
||||
{
|
||||
}
|
||||
|
||||
public virtual bool OnBandage( Mobile from )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public override bool IsAccessibleTo( Mobile check )
|
||||
{
|
||||
if ( (int) check.AccessLevel >= (int) AccessLevel.GameMaster )
|
||||
return true;
|
||||
|
||||
PlagueBeastLord owner = Owner;
|
||||
|
||||
if ( owner == null )
|
||||
return false;
|
||||
|
||||
if ( !owner.InRange( check, 2 ) )
|
||||
owner.PrivateOverheadMessage( MessageType.Label, 0x3B2, 500446, check.NetState ); // That is too far away.
|
||||
else if ( owner.OpenedBy != null && owner.OpenedBy != check ) // TODO check
|
||||
owner.PrivateOverheadMessage( MessageType.Label, 0x3B2, 500365, check.NetState ); // That is being used by someone else
|
||||
else if ( owner.Frozen )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public PlagueBeastInnard( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.WriteEncodedInt( 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadEncodedInt();
|
||||
|
||||
PlagueBeastLord owner = Owner;
|
||||
|
||||
if ( owner == null || !owner.Alive )
|
||||
Delete();
|
||||
}
|
||||
}
|
||||
|
||||
public class PlagueBeastComponent : PlagueBeastInnard
|
||||
{
|
||||
private PlagueBeastOrgan m_Organ;
|
||||
|
||||
public PlagueBeastOrgan Organ
|
||||
{
|
||||
get { return m_Organ; }
|
||||
set { m_Organ = value; }
|
||||
}
|
||||
|
||||
public bool IsBrain
|
||||
{
|
||||
get { return ItemID == 0x1CF0; }
|
||||
}
|
||||
|
||||
public bool IsGland
|
||||
{
|
||||
get { return ItemID == 0x1CEF; }
|
||||
}
|
||||
|
||||
public bool IsReceptacle
|
||||
{
|
||||
get { return ItemID == 0x9DF; }
|
||||
}
|
||||
|
||||
public PlagueBeastComponent( int itemID, int hue ) : this( itemID, hue, false )
|
||||
{
|
||||
}
|
||||
|
||||
public PlagueBeastComponent( int itemID, int hue, bool movable ) : base( itemID, hue )
|
||||
{
|
||||
Movable = movable;
|
||||
}
|
||||
|
||||
public override bool DropToItem( Mobile from, Item target, Point3D p )
|
||||
{
|
||||
if ( target is PlagueBeastBackpack )
|
||||
return base.DropToItem( from, target, p );
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public override bool AllowSecureTrade( Mobile from, Mobile to, Mobile newOwner, bool accepted )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public override bool DropToMobile( Mobile from, Mobile target, Point3D p )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public override bool DropToWorld( Mobile from, Point3D p )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public override bool OnDragDrop( Mobile from, Item dropped )
|
||||
{
|
||||
if ( m_Organ != null && m_Organ.OnDropped( from, dropped, this ) )
|
||||
{
|
||||
if ( dropped is PlagueBeastComponent )
|
||||
m_Organ.Components.Add( (PlagueBeastComponent) dropped );
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override bool OnDragLift( Mobile from )
|
||||
{
|
||||
if ( IsAccessibleTo( from ) )
|
||||
{
|
||||
if ( m_Organ != null && m_Organ.OnLifted( from, this ) )
|
||||
{
|
||||
from.SendLocalizedMessage( IsGland ? 1071895 : 1071914, null, 0x3B2 ); // * You rip the organ out of the plague beast's flesh *
|
||||
|
||||
if ( m_Organ.Components.Contains( this ) )
|
||||
m_Organ.Components.Remove( this );
|
||||
|
||||
m_Organ = null;
|
||||
from.PlaySound( 0x1CA );
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public PlagueBeastComponent( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.WriteEncodedInt( 0 ); // version
|
||||
|
||||
writer.WriteItem<PlagueBeastOrgan>( m_Organ );
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadEncodedInt();
|
||||
|
||||
m_Organ = reader.ReadItem<PlagueBeastOrgan>();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,78 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Mobiles;
|
||||
using Server.Network;
|
||||
|
||||
namespace Server.Items
|
||||
{
|
||||
public class PlagueBeastMutationCore : Item, IScissorable
|
||||
{
|
||||
private bool m_Cut;
|
||||
|
||||
[CommandProperty( AccessLevel.GameMaster )]
|
||||
public bool Cut
|
||||
{
|
||||
get { return m_Cut; }
|
||||
set { m_Cut = value; }
|
||||
}
|
||||
|
||||
[Constructable]
|
||||
public PlagueBeastMutationCore() : base( 0x1CF0 )
|
||||
{
|
||||
m_Cut = true;
|
||||
|
||||
Name = "a plague beast mutation core";
|
||||
Weight = 1.0;
|
||||
Hue = 0x480;
|
||||
}
|
||||
|
||||
public virtual bool Scissor( Mobile from, Scissors scissors )
|
||||
{
|
||||
if ( !m_Cut )
|
||||
{
|
||||
PlagueBeastLord owner = RootParent as PlagueBeastLord;
|
||||
|
||||
m_Cut = true;
|
||||
Movable = true;
|
||||
|
||||
from.AddToBackpack( this );
|
||||
from.LocalOverheadMessage( MessageType.Regular, 0x34, 1071906 ); // * You remove the plague mutation core from the plague beast, causing it to dissolve into a pile of goo *
|
||||
|
||||
if ( owner != null )
|
||||
Timer.DelayCall<PlagueBeastLord>( TimeSpan.FromSeconds( 1 ), new TimerStateCallback<PlagueBeastLord>( KillParent ), owner );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private void KillParent( PlagueBeastLord parent )
|
||||
{
|
||||
parent.Unfreeze();
|
||||
parent.Kill();
|
||||
}
|
||||
|
||||
public PlagueBeastMutationCore( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.WriteEncodedInt( 0 ); // version
|
||||
|
||||
writer.Write( (bool) m_Cut );
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadEncodedInt();
|
||||
|
||||
m_Cut = reader.ReadBool();
|
||||
}
|
||||
}
|
||||
}
|
||||
586
Scripts/Items/Special/Mutation Core/PlagueBeastOrgans.cs
Normal file
586
Scripts/Items/Special/Mutation Core/PlagueBeastOrgans.cs
Normal file
|
|
@ -0,0 +1,586 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Server;
|
||||
using Server.Network;
|
||||
|
||||
namespace Server.Items
|
||||
{
|
||||
public class PlagueBeastOrgan : PlagueBeastInnard
|
||||
{
|
||||
public virtual bool IsCuttable { get { return false; } }
|
||||
|
||||
private List<PlagueBeastComponent> m_Components;
|
||||
|
||||
public List<PlagueBeastComponent> Components
|
||||
{
|
||||
get { return m_Components; }
|
||||
}
|
||||
|
||||
private int m_BrainHue;
|
||||
|
||||
public int BrainHue
|
||||
{
|
||||
get { return m_BrainHue; }
|
||||
set { m_BrainHue = value; }
|
||||
}
|
||||
|
||||
private bool m_Opened;
|
||||
|
||||
public bool Opened
|
||||
{
|
||||
get { return m_Opened; }
|
||||
set { m_Opened = value; }
|
||||
}
|
||||
|
||||
private Timer m_Timer;
|
||||
|
||||
public PlagueBeastOrgan() : this( 1, 0 )
|
||||
{
|
||||
Visible = false;
|
||||
}
|
||||
|
||||
public PlagueBeastOrgan( int itemID, int hue ) : base( itemID, hue )
|
||||
{
|
||||
m_Components = new List<PlagueBeastComponent>();
|
||||
m_Opened = false;
|
||||
|
||||
Movable = false;
|
||||
|
||||
Timer.DelayCall( TimeSpan.Zero, new TimerCallback( Initialize ) );
|
||||
}
|
||||
|
||||
public virtual void Initialize()
|
||||
{
|
||||
}
|
||||
|
||||
public void AddComponent( PlagueBeastComponent c, int x, int y )
|
||||
{
|
||||
Container pack = Parent as Container;
|
||||
|
||||
if ( pack != null )
|
||||
pack.DropItem( c );
|
||||
|
||||
c.Organ = this;
|
||||
c.Location = new Point3D( X + x, Y + y, Z );
|
||||
c.Map = Map;
|
||||
|
||||
m_Components.Add( c );
|
||||
}
|
||||
|
||||
public override bool Scissor( Mobile from, Scissors scissors )
|
||||
{
|
||||
if ( IsCuttable && IsAccessibleTo( from ) )
|
||||
{
|
||||
if ( !m_Opened && m_Timer == null )
|
||||
{
|
||||
m_Timer = Timer.DelayCall<Mobile>( TimeSpan.FromSeconds( 3 ), new TimerStateCallback<Mobile>( FinishOpening ), from );
|
||||
scissors.PublicOverheadMessage( MessageType.Regular, 0x3B2, 1071897 ); // You carefully cut into the organ.
|
||||
return true;
|
||||
}
|
||||
else
|
||||
scissors.PublicOverheadMessage( MessageType.Regular, 0x3B2, 1071898 ); // You have already cut this organ open.
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public override void OnAfterDelete()
|
||||
{
|
||||
if ( m_Timer != null && m_Timer.Running )
|
||||
m_Timer.Stop();
|
||||
}
|
||||
|
||||
public virtual bool OnLifted( Mobile from, PlagueBeastComponent c )
|
||||
{
|
||||
return c.IsGland || c.IsBrain;
|
||||
}
|
||||
|
||||
public virtual bool OnDropped( Mobile from, Item item, PlagueBeastComponent to )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public virtual void FinishOpening( Mobile from )
|
||||
{
|
||||
m_Opened = true;
|
||||
|
||||
if ( Owner != null )
|
||||
Owner.PlaySound( 0x50 );
|
||||
}
|
||||
|
||||
public PlagueBeastOrgan( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.WriteEncodedInt( 0 ); // version
|
||||
|
||||
writer.WriteItemList<PlagueBeastComponent>( m_Components );
|
||||
writer.Write( (int) m_BrainHue );
|
||||
writer.Write( (bool) m_Opened );
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadEncodedInt();
|
||||
|
||||
m_Components = reader.ReadStrongItemList<PlagueBeastComponent>();
|
||||
m_BrainHue = reader.ReadInt();
|
||||
m_Opened = reader.ReadBool();
|
||||
}
|
||||
}
|
||||
|
||||
public class PlagueBeastMaidenOrgan : PlagueBeastOrgan
|
||||
{
|
||||
public PlagueBeastMaidenOrgan() : base( 0x124D, 0x0 )
|
||||
{
|
||||
}
|
||||
|
||||
public override void OnDoubleClick( Mobile from )
|
||||
{
|
||||
if ( !Opened )
|
||||
FinishOpening( from );
|
||||
}
|
||||
|
||||
public override void FinishOpening( Mobile from )
|
||||
{
|
||||
ItemID = 0x1249;
|
||||
|
||||
if ( Owner != null )
|
||||
Owner.PlaySound( 0x187 );
|
||||
|
||||
AddComponent( new PlagueBeastComponent( 0x1D0D, 0x0 ), 22, 3 );
|
||||
AddComponent( new PlagueBeastComponent( 0x1D12, 0x0 ), 15, 18 );
|
||||
AddComponent( new PlagueBeastComponent( 0x1DA3, 0x21 ), 26, 46 );
|
||||
|
||||
if ( BrainHue > 0 )
|
||||
AddComponent( new PlagueBeastComponent( 0x1CF0, BrainHue, true ), 22, 29 );
|
||||
|
||||
Opened = true;
|
||||
}
|
||||
|
||||
public PlagueBeastMaidenOrgan( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.WriteEncodedInt( 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadEncodedInt();
|
||||
}
|
||||
}
|
||||
|
||||
public class PlagueBeastRockOrgan : PlagueBeastOrgan
|
||||
{
|
||||
public override bool IsCuttable { get { return true; } }
|
||||
|
||||
public PlagueBeastRockOrgan() : base( 0x177A, 0x60 )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Carve( Mobile from, Item with )
|
||||
{
|
||||
if ( IsAccessibleTo( from ) )
|
||||
with.PublicOverheadMessage( MessageType.Regular, 0x3B2, 1071896 ); // This is too crude an implement for such a procedure.
|
||||
}
|
||||
|
||||
public override bool OnLifted( Mobile from, PlagueBeastComponent c )
|
||||
{
|
||||
base.OnLifted( from, c );
|
||||
|
||||
if ( c.IsBrain )
|
||||
{
|
||||
AddComponent( new PlagueBeastBlood(), -7, 24 );
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public override void FinishOpening( Mobile from )
|
||||
{
|
||||
base.FinishOpening( from );
|
||||
|
||||
AddComponent( new PlagueBeastComponent( 0x1775, 0x60 ), 3, 5 );
|
||||
AddComponent( new PlagueBeastComponent( 0x1777, 0x1 ), 10, 14 );
|
||||
|
||||
if ( BrainHue > 0 )
|
||||
AddComponent( new PlagueBeastComponent( 0x1CF0, BrainHue, true ), 1, 24 ); // 22, 29
|
||||
else
|
||||
AddComponent( new PlagueBeastBlood(), -7, 24 );
|
||||
}
|
||||
|
||||
public PlagueBeastRockOrgan( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.WriteEncodedInt( 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadEncodedInt();
|
||||
}
|
||||
}
|
||||
|
||||
public class PlagueBeastRubbleOrgan : PlagueBeastOrgan
|
||||
{
|
||||
private int m_Veins;
|
||||
|
||||
public PlagueBeastRubbleOrgan() : base()
|
||||
{
|
||||
m_Veins = 3;
|
||||
}
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
Hue = Utility.RandomList( m_Hues );
|
||||
|
||||
AddComponent( new PlagueBeastComponent( 0x3BB, Hue ), 0, 0 );
|
||||
AddComponent( new PlagueBeastComponent( 0x3BA, Hue ), 4, 6 );
|
||||
AddComponent( new PlagueBeastComponent( 0x3BA, Hue ), -6, 17 );
|
||||
|
||||
int v = Utility.Random( 4 );
|
||||
|
||||
AddComponent( new PlagueBeastVein( 0x1B1B, v == 0 ? Hue : RandomHue( Hue ) ), -23, -3 );
|
||||
AddComponent( new PlagueBeastVein( 0x1B1C, v == 1 ? Hue : RandomHue( Hue ) ), 19, 4 );
|
||||
AddComponent( new PlagueBeastVein( 0x1B1B, v == 2 ? Hue : RandomHue( Hue ) ), 21, 27 );
|
||||
AddComponent( new PlagueBeastVein( 0x1B1B, v == 3 ? Hue : RandomHue( Hue ) ), 10, 40 );
|
||||
}
|
||||
|
||||
public override bool OnLifted( Mobile from, PlagueBeastComponent c )
|
||||
{
|
||||
if ( c.IsBrain )
|
||||
{
|
||||
AddComponent( new PlagueBeastBlood(), -13, 25 );
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public override void FinishOpening( Mobile from )
|
||||
{
|
||||
AddComponent( new PlagueBeastComponent( 0x1777, 0x1 ), 5, 14 );
|
||||
|
||||
if ( BrainHue > 0 )
|
||||
AddComponent( new PlagueBeastComponent( 0x1CF0, BrainHue, true ), -5, 22 );
|
||||
else
|
||||
AddComponent( new PlagueBeastBlood(), -13, 25 );
|
||||
|
||||
Opened = true;
|
||||
}
|
||||
|
||||
private static int[] m_Hues = new int[]
|
||||
{
|
||||
0xD, 0x17, 0x2B, 0x42, 0x54, 0x5D
|
||||
};
|
||||
|
||||
private static int RandomHue( int exculde )
|
||||
{
|
||||
for ( int i = 0; i < 20; i++ )
|
||||
{
|
||||
int hue = Utility.RandomList( m_Hues );
|
||||
|
||||
if ( hue != exculde )
|
||||
return hue;
|
||||
}
|
||||
|
||||
return 0xD;
|
||||
}
|
||||
|
||||
public virtual void OnVeinCut( Mobile from, PlagueBeastVein vein )
|
||||
{
|
||||
if ( vein.Hue != Hue )
|
||||
{
|
||||
if ( !Opened && m_Veins > 0 && --m_Veins == 0 )
|
||||
FinishOpening( from );
|
||||
}
|
||||
else
|
||||
{
|
||||
from.LocalOverheadMessage( MessageType.Regular, 0x3B2, 1071901 ); // * As you cut the vein, a cloud of poison is expelled from the plague beast's organ, and the plague beast dissolves into a puddle of goo *
|
||||
from.ApplyPoison( from, Poison.Greater );
|
||||
from.PlaySound( 0x22F );
|
||||
|
||||
if ( Owner != null )
|
||||
{
|
||||
Owner.Unfreeze();
|
||||
Owner.Kill();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public PlagueBeastRubbleOrgan( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.WriteEncodedInt( 0 ); // version
|
||||
|
||||
writer.Write( (int) m_Veins );
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadEncodedInt();
|
||||
|
||||
m_Veins = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
|
||||
public class PlagueBeastBackupOrgan : PlagueBeastOrgan
|
||||
{
|
||||
public override bool IsCuttable { get { return true; } }
|
||||
|
||||
private Timer m_Timer;
|
||||
private Item m_Gland;
|
||||
|
||||
public PlagueBeastBackupOrgan() : base( 0x1362, 0x6 )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
AddComponent( new PlagueBeastComponent( 0x1B1B, 0x42 ), 16, 39 );
|
||||
AddComponent( new PlagueBeastComponent( 0x1B1B, 0x42 ), 39, 49 );
|
||||
AddComponent( new PlagueBeastComponent( 0x1B1B, 0x42 ), 39, 48 );
|
||||
AddComponent( new PlagueBeastComponent( 0x1B1B, 0x42 ), 44, 42 );
|
||||
AddComponent( new PlagueBeastComponent( 0x1CF2, 0x42 ), 20, 34 );
|
||||
AddComponent( new PlagueBeastComponent( 0x135F, 0x42 ), 47, 58 );
|
||||
AddComponent( new PlagueBeastComponent( 0x1360, 0x42 ), 70, 68 );
|
||||
}
|
||||
|
||||
public override void Carve( Mobile from, Item with )
|
||||
{
|
||||
if ( IsAccessibleTo( from ) )
|
||||
with.PublicOverheadMessage( MessageType.Regular, 0x3B2, 1071896 ); // This is too crude an implement for such a procedure.
|
||||
}
|
||||
|
||||
public override bool OnLifted( Mobile from, PlagueBeastComponent c )
|
||||
{
|
||||
if ( c.IsBrain )
|
||||
{
|
||||
AddComponent( new PlagueBeastBlood(), 47, 72 );
|
||||
return true;
|
||||
}
|
||||
else if ( c.IsGland )
|
||||
{
|
||||
m_Gland = null;
|
||||
return true;
|
||||
}
|
||||
|
||||
return c.IsGland;
|
||||
}
|
||||
|
||||
public override bool OnDropped( Mobile from, Item item, PlagueBeastComponent to )
|
||||
{
|
||||
if ( to.Hue == 0x1 && m_Gland == null && item is PlagueBeastGland )
|
||||
{
|
||||
m_Gland = item;
|
||||
m_Timer = Timer.DelayCall( TimeSpan.FromSeconds( 3 ), new TimerCallback( FinishHealing ) );
|
||||
from.SendAsciiMessage( 0x3B2, "* You place the healthy gland inside the organ sac *" );
|
||||
item.Movable = false;
|
||||
|
||||
if ( Owner != null )
|
||||
Owner.PlaySound( 0x20 );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public override void FinishOpening( Mobile from )
|
||||
{
|
||||
base.FinishOpening( from );
|
||||
|
||||
AddComponent( new PlagueBeastComponent( 0x1363, 0xF ), -3, 3 );
|
||||
AddComponent( new PlagueBeastComponent( 0x1365, 0x1 ), -3, 10 );
|
||||
|
||||
m_Gland = new PlagueBeastComponent( 0x1CEF, 0x3F, true );
|
||||
AddComponent( (PlagueBeastComponent) m_Gland, -4, 16 );
|
||||
}
|
||||
|
||||
public void FinishHealing()
|
||||
{
|
||||
for ( int i = 0; i < 7 && i < Components.Count; i++ )
|
||||
Components[ i ].Hue = 0x6;
|
||||
|
||||
m_Timer = Timer.DelayCall( TimeSpan.FromSeconds( 2 ), new TimerCallback( OpenOrgan ) );
|
||||
}
|
||||
|
||||
public void OpenOrgan()
|
||||
{
|
||||
AddComponent( new PlagueBeastComponent( 0x1367, 0xF ), 55, 61 );
|
||||
AddComponent( new PlagueBeastComponent( 0x1366, 0x1 ), 57, 66 );
|
||||
|
||||
if ( BrainHue > 0 )
|
||||
AddComponent( new PlagueBeastComponent( 0x1CF0, BrainHue, true ), 55, 69 );
|
||||
}
|
||||
|
||||
public PlagueBeastBackupOrgan( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.WriteEncodedInt( 0 ); // version
|
||||
|
||||
writer.Write( (Item) m_Gland );
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadEncodedInt();
|
||||
|
||||
m_Gland = reader.ReadItem();
|
||||
}
|
||||
}
|
||||
|
||||
public class PlagueBeastMainOrgan : PlagueBeastOrgan
|
||||
{
|
||||
private int m_Brains;
|
||||
|
||||
public bool Complete
|
||||
{
|
||||
get { return m_Brains >= 4; }
|
||||
}
|
||||
|
||||
public PlagueBeastMainOrgan() : base()
|
||||
{
|
||||
m_Brains = 0;
|
||||
}
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
// receptacles
|
||||
AddComponent( new PlagueBeastComponent( 0x1B1B, 0x42 ), -36, -2 );
|
||||
AddComponent( new PlagueBeastComponent( 0x1FB3, 0x42 ), -42, 0 );
|
||||
AddComponent( new PlagueBeastComponent( 0x9DF, 0x42 ), -53, -7 );
|
||||
|
||||
AddComponent( new PlagueBeastComponent( 0x1B1C, 0x54 ), 29, 9 );
|
||||
AddComponent( new PlagueBeastComponent( 0x1D06, 0x54 ), 18, -2 );
|
||||
AddComponent( new PlagueBeastComponent( 0x9DF, 0x54 ), 36, -1 );
|
||||
|
||||
AddComponent( new PlagueBeastComponent( 0x1D10, 0x2B ), -36, 47 );
|
||||
AddComponent( new PlagueBeastComponent( 0x1B1C, 0x2B ), -24, 62 );
|
||||
AddComponent( new PlagueBeastComponent( 0x9DF, 0x2B ), -41, 74 );
|
||||
|
||||
AddComponent( new PlagueBeastComponent( 0x1B1B, 0x60 ), 39, 56 );
|
||||
AddComponent( new PlagueBeastComponent( 0x1FB4, 0x60 ), 34, 52 );
|
||||
AddComponent( new PlagueBeastComponent( 0x9DF, 0x60 ), 45, 71 );
|
||||
|
||||
// main part
|
||||
AddComponent( new PlagueBeastComponent( 0x1351, 0x15 ), 23, 0 );
|
||||
AddComponent( new PlagueBeastComponent( 0x134F, 0x15 ), -22, 0 );
|
||||
AddComponent( new PlagueBeastComponent( 0x1350, 0x15 ), 0, 0 );
|
||||
}
|
||||
|
||||
public override bool OnLifted( Mobile from, PlagueBeastComponent c )
|
||||
{
|
||||
if ( c.IsBrain )
|
||||
m_Brains--;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override bool OnDropped( Mobile from, Item item, PlagueBeastComponent to )
|
||||
{
|
||||
if ( !Opened && to.IsReceptacle && item.Hue == to.Hue )
|
||||
{
|
||||
to.Organ = this;
|
||||
m_Brains++;
|
||||
from.LocalOverheadMessage( MessageType.Regular, 0x34, 1071913 ); // You place the organ in the fleshy receptacle near the core.
|
||||
|
||||
if ( Owner != null )
|
||||
{
|
||||
Owner.PlaySound( 0x1BA );
|
||||
|
||||
if ( Owner.IsBleeding )
|
||||
{
|
||||
from.LocalOverheadMessage( MessageType.Regular, 0x34, 1071922 ); // The plague beast is still bleeding from open wounds. You must seal any bleeding wounds before the core will open!
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if ( m_Brains == 4 )
|
||||
FinishOpening( from );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public override void FinishOpening( Mobile from )
|
||||
{
|
||||
AddComponent( new PlagueBeastComponent( 0x1363, 0x1 ), 0, 22 );
|
||||
AddComponent( new PlagueBeastComponent( 0x1D04, 0xD ), 0, 22 );
|
||||
|
||||
if ( Owner != null && Owner.Backpack != null )
|
||||
{
|
||||
PlagueBeastMutationCore core = new PlagueBeastMutationCore();
|
||||
Owner.Backpack.AddItem( core );
|
||||
core.Movable = false;
|
||||
core.Cut = false;
|
||||
core.X = X;
|
||||
core.Y = Y + 34;
|
||||
|
||||
Owner.PlaySound( 0x21 );
|
||||
Owner.PlaySound( 0x166 );
|
||||
}
|
||||
|
||||
Opened = true;
|
||||
}
|
||||
|
||||
public PlagueBeastMainOrgan( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.WriteEncodedInt( 0 ); // version
|
||||
|
||||
writer.Write( (int) m_Brains );
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadEncodedInt();
|
||||
|
||||
m_Brains = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
87
Scripts/Items/Special/Mutation Core/PlagueBeastVein.cs
Normal file
87
Scripts/Items/Special/Mutation Core/PlagueBeastVein.cs
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Mobiles;
|
||||
using Server.Network;
|
||||
|
||||
namespace Server.Items
|
||||
{
|
||||
public class PlagueBeastVein : PlagueBeastComponent
|
||||
{
|
||||
private bool m_Cut;
|
||||
|
||||
public bool Cut
|
||||
{
|
||||
get { return m_Cut; }
|
||||
}
|
||||
|
||||
private Timer m_Timer;
|
||||
|
||||
public PlagueBeastVein( int itemID, int hue ) : base( itemID, hue )
|
||||
{
|
||||
m_Cut = false;
|
||||
}
|
||||
|
||||
public override bool Scissor( Mobile from, Scissors scissors )
|
||||
{
|
||||
if ( IsAccessibleTo( from ) )
|
||||
{
|
||||
if ( !m_Cut && m_Timer == null )
|
||||
{
|
||||
m_Timer = Timer.DelayCall<Mobile>( TimeSpan.FromSeconds( 3 ), new TimerStateCallback<Mobile>( CuttingDone ), from );
|
||||
scissors.PublicOverheadMessage( MessageType.Regular, 0x3B2, 1071899 ); // You begin cutting through the vein.
|
||||
return true;
|
||||
}
|
||||
else
|
||||
scissors.PublicOverheadMessage( MessageType.Regular, 0x3B2, 1071900 ); // // This vein has already been cut.
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public override void OnAfterDelete()
|
||||
{
|
||||
if ( m_Timer != null && m_Timer.Running )
|
||||
m_Timer.Stop();
|
||||
}
|
||||
|
||||
private void CuttingDone( Mobile from )
|
||||
{
|
||||
m_Cut = true;
|
||||
|
||||
if ( ItemID == 0x1B1C )
|
||||
ItemID = 0x1B1B;
|
||||
else
|
||||
ItemID = 0x1B1C;
|
||||
|
||||
if ( Owner != null )
|
||||
Owner.PlaySound( 0x199 );
|
||||
|
||||
PlagueBeastRubbleOrgan organ = Organ as PlagueBeastRubbleOrgan;
|
||||
|
||||
if ( organ != null )
|
||||
organ.OnVeinCut( from, this );
|
||||
}
|
||||
|
||||
public PlagueBeastVein( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.WriteEncodedInt( 0 ); // version
|
||||
|
||||
writer.Write( (bool) m_Cut );
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadEncodedInt();
|
||||
|
||||
m_Cut = reader.ReadBool();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 14; } }
|
||||
public override int AosMaxDamage{ get{ return 16; } }
|
||||
public override int AosSpeed{ get{ return 37; } }
|
||||
public override float MlSpeed{ get{ return 3.00f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 35; } }
|
||||
public override int OldMinDamage{ get{ return 6; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 15; } }
|
||||
public override int AosMaxDamage{ get{ return 17; } }
|
||||
public override int AosSpeed{ get{ return 31; } }
|
||||
public override float MlSpeed{ get{ return 3.50f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 40; } }
|
||||
public override int OldMinDamage{ get{ return 6; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 15; } }
|
||||
public override int AosMaxDamage{ get{ return 17; } }
|
||||
public override int AosSpeed{ get{ return 33; } }
|
||||
public override float MlSpeed{ get{ return 3.25f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 45; } }
|
||||
public override int OldMinDamage{ get{ return 5; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 15; } }
|
||||
public override int AosMaxDamage{ get{ return 17; } }
|
||||
public override int AosSpeed{ get{ return 33; } }
|
||||
public override float MlSpeed{ get{ return 3.25f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 35; } }
|
||||
public override int OldMinDamage{ get{ return 6; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 13; } }
|
||||
public override int AosMaxDamage{ get{ return 15; } }
|
||||
public override int AosSpeed{ get{ return 41; } }
|
||||
public override float MlSpeed{ get{ return 2.75f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 15; } }
|
||||
public override int OldMinDamage{ get{ return 2; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 16; } }
|
||||
public override int AosMaxDamage{ get{ return 17; } }
|
||||
public override int AosSpeed{ get{ return 29; } }
|
||||
public override float MlSpeed{ get{ return 3.75f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 40; } }
|
||||
public override int OldMinDamage{ get{ return 6; } }
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 13; } }
|
||||
public override int AosMaxDamage{ get{ return 15; } }
|
||||
public override int AosSpeed{ get{ return 35; } }
|
||||
public override float MlSpeed{ get{ return 3.00f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 25; } }
|
||||
public override int OldMinDamage{ get{ return 1; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 16; } }
|
||||
public override int AosMaxDamage{ get{ return 17; } }
|
||||
public override int AosSpeed{ get{ return 31; } }
|
||||
public override float MlSpeed{ get{ return 3.50f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 35; } }
|
||||
public override int OldMinDamage{ get{ return 5; } }
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 14; } }
|
||||
public override int AosMaxDamage{ get{ return 15; } }
|
||||
public override int AosSpeed{ get{ return 33; } }
|
||||
public override float MlSpeed{ get{ return 3.25f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 35; } }
|
||||
public override int OldMinDamage{ get{ return 9; } }
|
||||
|
|
|
|||
|
|
@ -97,7 +97,7 @@ namespace Server.Items
|
|||
private int m_StrReq, m_DexReq, m_IntReq;
|
||||
private int m_MinDamage, m_MaxDamage;
|
||||
private int m_HitSound, m_MissSound;
|
||||
private int m_Speed;
|
||||
private float m_Speed;
|
||||
private int m_MaxRange;
|
||||
private SkillName m_Skill;
|
||||
private WeaponType m_Type;
|
||||
|
|
@ -121,6 +121,7 @@ namespace Server.Items
|
|||
public virtual int AosMinDamage{ get{ return 0; } }
|
||||
public virtual int AosMaxDamage{ get{ return 0; } }
|
||||
public virtual int AosSpeed{ get{ return 0; } }
|
||||
public virtual float MlSpeed{ get{ return 0.0f; } }
|
||||
public virtual int AosMaxRange{ get{ return DefMaxRange; } }
|
||||
public virtual int AosHitSound{ get{ return DefHitSound; } }
|
||||
public virtual int AosMissSound{ get{ return DefMissSound; } }
|
||||
|
|
@ -357,9 +358,20 @@ namespace Server.Items
|
|||
}
|
||||
|
||||
[CommandProperty( AccessLevel.GameMaster )]
|
||||
public int Speed
|
||||
public float Speed
|
||||
{
|
||||
get{ return ( m_Speed == -1 ? Core.AOS ? AosSpeed : OldSpeed : m_Speed ); }
|
||||
get
|
||||
{
|
||||
if ( m_Speed != -1 )
|
||||
return m_Speed;
|
||||
|
||||
if ( Core.ML )
|
||||
return MlSpeed;
|
||||
else if ( Core.AOS )
|
||||
return AosSpeed;
|
||||
|
||||
return m_Speed;
|
||||
}
|
||||
set{ m_Speed = value; InvalidateProperties(); }
|
||||
}
|
||||
|
||||
|
|
@ -856,7 +868,7 @@ namespace Server.Items
|
|||
|
||||
public virtual TimeSpan GetDelay( Mobile m )
|
||||
{
|
||||
int speed = this.Speed;
|
||||
double speed = this.Speed;
|
||||
|
||||
if ( speed == 0 )
|
||||
return TimeSpan.FromHours( 1.0 );
|
||||
|
|
@ -901,14 +913,26 @@ namespace Server.Items
|
|||
|
||||
if ( bonus > 60 )
|
||||
bonus = 60;
|
||||
|
||||
double ticks;
|
||||
|
||||
speed = (int)Math.Floor( speed * (bonus + 100.0) / 100.0 );
|
||||
if ( Core.ML )
|
||||
{
|
||||
int stamTicks = m.Stam / 30;
|
||||
|
||||
if ( speed <= 0 )
|
||||
speed = 1;
|
||||
ticks = speed * 4;
|
||||
ticks = Math.Floor( ( ticks - stamTicks ) * ( 100.0 / ( 100 + bonus ) ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
speed = Math.Floor( speed * ( bonus + 100.0 ) / 100.0 );
|
||||
|
||||
int ticks = (int)Math.Floor( (80000.0 / ((m.Stam + 100) * speed)) - 2 );
|
||||
if ( speed <= 0 )
|
||||
speed = 1;
|
||||
|
||||
ticks = Math.Floor( ( 80000.0 / ( ( m.Stam + 100 ) * speed ) ) - 2 );
|
||||
}
|
||||
|
||||
// Swing speed currently capped at one swing every 1.25 seconds (5 ticks).
|
||||
if ( ticks < 5 )
|
||||
ticks = 5;
|
||||
|
|
@ -917,7 +941,7 @@ namespace Server.Items
|
|||
}
|
||||
else if ( Core.AOS )
|
||||
{
|
||||
int v = (m.Stam + 100) * speed;
|
||||
int v = (m.Stam + 100) * (int) speed;
|
||||
|
||||
int bonus = AosAttributes.GetValue( m, AosAttribute.WeaponSpeed );
|
||||
|
||||
|
|
@ -944,7 +968,7 @@ namespace Server.Items
|
|||
}
|
||||
else
|
||||
{
|
||||
int v = (m.Stam + 100) * speed;
|
||||
int v = (m.Stam + 100) * (int) speed;
|
||||
|
||||
if ( v <= 0 )
|
||||
v = 1;
|
||||
|
|
@ -2412,7 +2436,7 @@ namespace Server.Items
|
|||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 8 ); // version
|
||||
writer.Write( (int) 9 ); // version
|
||||
|
||||
SaveFlag flags = SaveFlag.None;
|
||||
|
||||
|
|
@ -2502,7 +2526,7 @@ namespace Server.Items
|
|||
writer.Write( (int) m_MissSound );
|
||||
|
||||
if ( GetSaveFlag( flags, SaveFlag.Speed ) )
|
||||
writer.Write( (int) m_Speed );
|
||||
writer.Write( (float) m_Speed );
|
||||
|
||||
if ( GetSaveFlag( flags, SaveFlag.MaxRange ) )
|
||||
writer.Write( (int) m_MaxRange );
|
||||
|
|
@ -2583,6 +2607,7 @@ namespace Server.Items
|
|||
|
||||
switch ( version )
|
||||
{
|
||||
case 9:
|
||||
case 8:
|
||||
case 7:
|
||||
case 6:
|
||||
|
|
@ -2676,7 +2701,12 @@ namespace Server.Items
|
|||
m_MissSound = -1;
|
||||
|
||||
if ( GetSaveFlag( flags, SaveFlag.Speed ) )
|
||||
m_Speed = reader.ReadInt();
|
||||
{
|
||||
if ( version < 9 )
|
||||
m_Speed = reader.ReadInt();
|
||||
else
|
||||
m_Speed = reader.ReadFloat();
|
||||
}
|
||||
else
|
||||
m_Speed = -1;
|
||||
|
||||
|
|
@ -3239,7 +3269,11 @@ namespace Server.Items
|
|||
list.Add( 1060407, nrgy.ToString() ); // energy damage ~1_val~%
|
||||
|
||||
list.Add( 1061168, "{0}\t{1}", MinDamage.ToString(), MaxDamage.ToString() ); // weapon damage ~1_val~ - ~2_val~
|
||||
list.Add( 1061167, Speed.ToString() ); // weapon speed ~1_val~
|
||||
|
||||
if ( Core.ML )
|
||||
list.Add( 1061167, String.Format( "{0}s", Speed ) ); // weapon speed ~1_val~
|
||||
else
|
||||
list.Add( 1061167, Speed.ToString() );
|
||||
|
||||
if ( MaxRange > 1 )
|
||||
list.Add( 1061169, MaxRange.ToString() ); // range ~1_val~
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 1; } }
|
||||
public override int AosMaxDamage{ get{ return 4; } }
|
||||
public override int AosSpeed{ get{ return 50; } }
|
||||
public override float MlSpeed{ get{ return 2.50f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 0; } }
|
||||
public override int OldMinDamage{ get{ return 1; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 9; } }
|
||||
public override int AosMaxDamage{ get{ return 11; } }
|
||||
public override int AosSpeed{ get{ return 49; } }
|
||||
public override float MlSpeed{ get{ return 2.25f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 5; } }
|
||||
public override int OldMinDamage{ get{ return 2; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 11; } }
|
||||
public override int AosMaxDamage{ get{ return 13; } }
|
||||
public override int AosSpeed{ get{ return 46; } }
|
||||
public override float MlSpeed{ get{ return 2.50f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 10; } }
|
||||
public override int OldMinDamage{ get{ return 2; } }
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 10; } }
|
||||
public override int AosMaxDamage{ get{ return 11; } }
|
||||
public override int AosSpeed{ get{ return 56; } }
|
||||
public override float MlSpeed{ get{ return 2.00f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 1; } }
|
||||
public override int OldMinDamage{ get{ return 3; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 9; } }
|
||||
public override int AosMaxDamage{ get{ return 11; } }
|
||||
public override int AosSpeed{ get{ return 49; } }
|
||||
public override float MlSpeed{ get{ return 2.25f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 5; } }
|
||||
public override int OldMinDamage{ get{ return 1; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 10; } }
|
||||
public override int AosMaxDamage{ get{ return 12; } }
|
||||
public override int AosSpeed{ get{ return 50; } }
|
||||
public override float MlSpeed{ get{ return 2.00f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 15; } }
|
||||
public override int OldMinDamage{ get{ return 10; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 14; } }
|
||||
public override int AosMaxDamage{ get{ return 17; } }
|
||||
public override int AosSpeed{ get{ return 37; } }
|
||||
public override float MlSpeed{ get{ return 3.00f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 35; } }
|
||||
public override int OldMinDamage{ get{ return 14; } }
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 12; } }
|
||||
public override int AosMaxDamage{ get{ return 16; } }
|
||||
public override int AosSpeed{ get{ return 27; } }
|
||||
public override float MlSpeed{ get{ return 4.00f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 45; } }
|
||||
public override int OldMinDamage{ get{ return 12; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 13; } }
|
||||
public override int AosMaxDamage{ get{ return 15; } }
|
||||
public override int AosSpeed{ get{ return 41; } }
|
||||
public override float MlSpeed{ get{ return 2.75f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 20; } }
|
||||
public override int OldMinDamage{ get{ return 13; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 12; } }
|
||||
public override int AosMaxDamage{ get{ return 14; } }
|
||||
public override int AosSpeed{ get{ return 44; } }
|
||||
public override float MlSpeed{ get{ return 2.50f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 35; } }
|
||||
public override int OldMinDamage{ get{ return 12; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 13; } }
|
||||
public override int AosMaxDamage{ get{ return 15; } }
|
||||
public override int AosSpeed{ get{ return 42; } }
|
||||
public override float MlSpeed{ get{ return 2.75f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 20; } }
|
||||
public override int OldMinDamage{ get{ return 13; } }
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 9; } }
|
||||
public override int AosMaxDamage{ get{ return 13; } }
|
||||
public override int AosSpeed{ get{ return 38; } }
|
||||
public override float MlSpeed{ get{ return 3.00f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 45; } }
|
||||
public override int OldMinDamage{ get{ return 9; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 18; } }
|
||||
public override int AosMaxDamage{ get{ return 20; } }
|
||||
public override int AosSpeed{ get{ return 26; } }
|
||||
public override float MlSpeed{ get{ return 3.50f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 45; } }
|
||||
public override int OldMinDamage{ get{ return 18; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 12; } }
|
||||
public override int AosMaxDamage{ get{ return 14; } }
|
||||
public override int AosSpeed{ get{ return 43; } }
|
||||
public override float MlSpeed{ get{ return 2.50f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 20; } }
|
||||
public override int OldMinDamage{ get{ return 12; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 15; } }
|
||||
public override int AosMaxDamage{ get{ return 17; } }
|
||||
public override int AosSpeed{ get{ return 35; } }
|
||||
public override float MlSpeed{ get{ return 3.00f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 30; } }
|
||||
public override int OldMinDamage{ get{ return 15; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 9; } }
|
||||
public override int AosMaxDamage{ get{ return 11; } }
|
||||
public override int AosSpeed{ get{ return 48; } }
|
||||
public override float MlSpeed{ get{ return 2.25f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 15; } }
|
||||
public override int OldMinDamage{ get{ return 9; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 10; } }
|
||||
public override int AosMaxDamage{ get{ return 12; } }
|
||||
public override int AosSpeed{ get{ return 48; } }
|
||||
public override float MlSpeed{ get{ return 2.25f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 15; } }
|
||||
public override int OldMinDamage{ get{ return 10; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 11; } }
|
||||
public override int AosMaxDamage{ get{ return 13; } }
|
||||
public override int AosSpeed{ get{ return 44; } }
|
||||
public override float MlSpeed{ get{ return 2.50f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 10; } }
|
||||
public override int OldMinDamage{ get{ return 8; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 15; } }
|
||||
public override int AosMaxDamage{ get{ return 17; } }
|
||||
public override int AosSpeed{ get{ return 28; } }
|
||||
public override float MlSpeed{ get{ return 3.75f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 35; } }
|
||||
public override int OldMinDamage{ get{ return 6; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 12; } }
|
||||
public override int AosMaxDamage{ get{ return 14; } }
|
||||
public override int AosSpeed{ get{ return 40; } }
|
||||
public override float MlSpeed{ get{ return 2.75f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 20; } }
|
||||
public override int OldMinDamage{ get{ return 8; } }
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 9; } }
|
||||
public override int AosMaxDamage{ get{ return 11; } }
|
||||
public override int AosSpeed{ get{ return 40; } }
|
||||
public override float MlSpeed{ get{ return 2.75f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 0; } }
|
||||
public override int OldMinDamage{ get{ return 2; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 14; } }
|
||||
public override int AosMaxDamage{ get{ return 16; } }
|
||||
public override int AosSpeed{ get{ return 32; } }
|
||||
public override float MlSpeed{ get{ return 3.50f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 20; } }
|
||||
public override int OldMinDamage{ get{ return 10; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 14; } }
|
||||
public override int AosMaxDamage{ get{ return 17; } }
|
||||
public override int AosSpeed{ get{ return 30; } }
|
||||
public override float MlSpeed{ get{ return 3.50f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 40; } }
|
||||
public override int OldMinDamage{ get{ return 14; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 17; } }
|
||||
public override int AosMaxDamage{ get{ return 18; } }
|
||||
public override int AosSpeed{ get{ return 28; } }
|
||||
public override float MlSpeed{ get{ return 3.75f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 40; } }
|
||||
public override int OldMinDamage{ get{ return 8; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 16; } }
|
||||
public override int AosMaxDamage{ get{ return 17; } }
|
||||
public override int AosSpeed{ get{ return 26; } }
|
||||
public override float MlSpeed{ get{ return 4.00f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 30; } }
|
||||
public override int OldMinDamage{ get{ return 10; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 17; } }
|
||||
public override int AosMaxDamage{ get{ return 18; } }
|
||||
public override int AosSpeed{ get{ return 28; } }
|
||||
public override float MlSpeed{ get{ return 3.75f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 40; } }
|
||||
public override int OldMinDamage{ get{ return 5; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 18; } }
|
||||
public override int AosMaxDamage{ get{ return 19; } }
|
||||
public override int AosSpeed{ get{ return 25; } }
|
||||
public override float MlSpeed{ get{ return 4.25f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 45; } }
|
||||
public override int OldMinDamage{ get{ return 5; } }
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 15; } }
|
||||
public override int AosMaxDamage{ get{ return 18; } }
|
||||
public override int AosSpeed{ get{ return 32; } }
|
||||
public override float MlSpeed{ get{ return 3.50f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 45; } }
|
||||
public override int OldMinDamage{ get{ return 15; } }
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return Core.ML ? 15 : 16; } }
|
||||
public override int AosMaxDamage{ get{ return Core.ML ? 19 : 18; } }
|
||||
public override int AosSpeed{ get{ return 25; } }
|
||||
public override float MlSpeed{ get{ return 4.25f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 20; } }
|
||||
public override int OldMinDamage{ get{ return 9; } }
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return Core.ML ? 13 : 15; } }
|
||||
public override int AosMaxDamage{ get{ return 17; } }
|
||||
public override int AosSpeed{ get{ return 25; } }
|
||||
public override float MlSpeed{ get{ return 4.00f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 45; } }
|
||||
public override int OldMinDamage{ get{ return 15; } }
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 18; } }
|
||||
public override int AosMaxDamage{ get{ return Core.ML ? 22 : 20; } }
|
||||
public override int AosSpeed{ get{ return 24; } }
|
||||
public override float MlSpeed{ get{ return 4.50f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 30; } }
|
||||
public override int OldMinDamage{ get{ return 8; } }
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return Core.ML ? 20 : 19; } }
|
||||
public override int AosMaxDamage{ get{ return Core.ML ? 24 : 20; } }
|
||||
public override int AosSpeed{ get{ return 22; } }
|
||||
public override float MlSpeed{ get{ return 5.00f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 40; } }
|
||||
public override int OldMinDamage{ get{ return 11; } }
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return Core.ML ? 8 : 10; } }
|
||||
public override int AosMaxDamage{ get{ return 12; } }
|
||||
public override int AosSpeed{ get{ return 41; } }
|
||||
public override float MlSpeed{ get{ return 2.75f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 30; } }
|
||||
public override int OldMinDamage{ get{ return 10; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 9; } }
|
||||
public override int AosMaxDamage{ get{ return 11; } }
|
||||
public override int AosSpeed{ get{ return 53; } }
|
||||
public override float MlSpeed{ get{ return 2.00f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 20; } }
|
||||
public override int OldMinDamage{ get{ return 9; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 13; } }
|
||||
public override int AosMaxDamage{ get{ return 15; } }
|
||||
public override int AosSpeed{ get{ return 40; } }
|
||||
public override float MlSpeed{ get{ return 2.75f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 40; } }
|
||||
public override int OldMinDamage{ get{ return 13; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 9; } }
|
||||
public override int AosMaxDamage{ get{ return 11; } }
|
||||
public override int AosSpeed{ get{ return 55; } }
|
||||
public override float MlSpeed{ get{ return 2.00f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 15; } }
|
||||
public override int OldMinDamage{ get{ return 9; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 16; } }
|
||||
public override int AosMaxDamage{ get{ return 18; } }
|
||||
public override int AosSpeed{ get{ return 32; } }
|
||||
public override float MlSpeed{ get{ return 3.50f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 65; } }
|
||||
public override int OldMinDamage{ get{ return 16; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 16; } }
|
||||
public override int AosMaxDamage{ get{ return 18; } }
|
||||
public override int AosSpeed{ get{ return 35; } }
|
||||
public override float MlSpeed{ get{ return 3.50f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 40; } }
|
||||
public override int OldMinDamage{ get{ return 16; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 11; } }
|
||||
public override int AosMaxDamage{ get{ return 13; } }
|
||||
public override int AosSpeed{ get{ return 47; } }
|
||||
public override float MlSpeed{ get{ return 2.50f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 15; } }
|
||||
public override int OldMinDamage{ get{ return 11; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 9; } }
|
||||
public override int AosMaxDamage{ get{ return 11; } }
|
||||
public override int AosSpeed{ get{ return 55; } }
|
||||
public override float MlSpeed{ get{ return 2.00f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 15; } }
|
||||
public override int OldMinDamage{ get{ return 9; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 10; } }
|
||||
public override int AosMaxDamage{ get{ return 12; } }
|
||||
public override int AosSpeed{ get{ return 53; } }
|
||||
public override float MlSpeed{ get{ return 2.00f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 10; } }
|
||||
public override int OldMinDamage{ get{ return 10; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 10; } }
|
||||
public override int AosMaxDamage{ get{ return 12; } }
|
||||
public override int AosSpeed{ get{ return 50; } }
|
||||
public override float MlSpeed{ get{ return 2.00f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 10; } }
|
||||
public override int OldMinDamage{ get{ return 10; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 12; } }
|
||||
public override int AosMaxDamage{ get{ return 14; } }
|
||||
public override int AosSpeed{ get{ return 45; } }
|
||||
public override float MlSpeed{ get{ return 2.50f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 35; } }
|
||||
public override int OldMinDamage{ get{ return 12; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 11; } }
|
||||
public override int AosMaxDamage{ get{ return 13; } }
|
||||
public override int AosSpeed{ get{ return 44; } }
|
||||
public override float MlSpeed{ get{ return 2.50f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 20; } }
|
||||
public override int OldMinDamage{ get{ return 11; } }
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return Core.ML ? 16 : 18; } }
|
||||
public override int AosMaxDamage{ get{ return 20; } }
|
||||
public override int AosSpeed{ get{ return 25; } }
|
||||
public override float MlSpeed{ get{ return 4.5f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 35; } }
|
||||
public override int OldMinDamage{ get{ return 18; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 14; } }
|
||||
public override int AosMaxDamage{ get{ return 16; } }
|
||||
public override int AosSpeed{ get{ return 37; } }
|
||||
public override float MlSpeed{ get{ return 3.00f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 40; } }
|
||||
public override int OldMinDamage{ get{ return 14; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 12; } }
|
||||
public override int AosMaxDamage{ get{ return 13; } }
|
||||
public override int AosSpeed{ get{ return 49; } }
|
||||
public override float MlSpeed{ get{ return 2.25f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 50; } }
|
||||
public override int OldMinDamage{ get{ return 12; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 14; } }
|
||||
public override int AosMaxDamage{ get{ return 16; } }
|
||||
public override int AosSpeed{ get{ return 37; } }
|
||||
public override float MlSpeed{ get{ return 3.00f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 50; } }
|
||||
public override int OldMinDamage{ get{ return 14; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 13; } }
|
||||
public override int AosMaxDamage{ get{ return 14; } }
|
||||
public override int AosSpeed{ get{ return 43; } }
|
||||
public override float MlSpeed{ get{ return 2.50f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 15; } }
|
||||
public override int OldMinDamage{ get{ return 4; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 10; } }
|
||||
public override int AosMaxDamage{ get{ return 13; } }
|
||||
public override int AosSpeed{ get{ return 55; } }
|
||||
public override float MlSpeed{ get{ return 2.00f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 15; } }
|
||||
public override int OldMinDamage{ get{ return 4; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 13; } }
|
||||
public override int AosMaxDamage{ get{ return 15; } }
|
||||
public override int AosSpeed{ get{ return 42; } }
|
||||
public override float MlSpeed{ get{ return 2.75f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 30; } }
|
||||
public override int OldMinDamage{ get{ return 2; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 13; } }
|
||||
public override int AosMaxDamage{ get{ return 15; } }
|
||||
public override int AosSpeed{ get{ return 42; } }
|
||||
public override float MlSpeed{ get{ return 2.75f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 30; } }
|
||||
public override int OldMinDamage{ get{ return 2; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 12; } }
|
||||
public override int AosMaxDamage{ get{ return 13; } }
|
||||
public override int AosSpeed{ get{ return 43; } }
|
||||
public override float MlSpeed{ get{ return 2.50f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 35; } }
|
||||
public override int OldMinDamage{ get{ return 4; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 13; } }
|
||||
public override int AosMaxDamage{ get{ return 16; } }
|
||||
public override int AosSpeed{ get{ return 39; } }
|
||||
public override float MlSpeed{ get{ return 2.75f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 35; } }
|
||||
public override int OldMinDamage{ get{ return 8; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 15; } }
|
||||
public override int AosMaxDamage{ get{ return 17; } }
|
||||
public override int AosSpeed{ get{ return 33; } }
|
||||
public override float MlSpeed{ get{ return 3.25f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 20; } }
|
||||
public override int OldMinDamage{ get{ return 10; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 11; } }
|
||||
public override int AosMaxDamage{ get{ return 14; } }
|
||||
public override int AosSpeed{ get{ return 48; } }
|
||||
public override float MlSpeed{ get{ return 2.25f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 30; } }
|
||||
public override int OldMinDamage{ get{ return 8; } }
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 13; } }
|
||||
public override int AosMaxDamage{ get{ return 15; } }
|
||||
public override int AosSpeed{ get{ return 40; } }
|
||||
public override float MlSpeed{ get{ return 2.75f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 10; } }
|
||||
public override int OldMinDamage{ get{ return 3; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 13; } }
|
||||
public override int AosMaxDamage{ get{ return 15; } }
|
||||
public override int AosSpeed{ get{ return 36; } }
|
||||
public override float MlSpeed{ get{ return 3.00f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 25; } }
|
||||
public override int OldMinDamage{ get{ return 13; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 14; } }
|
||||
public override int AosMaxDamage{ get{ return 15; } }
|
||||
public override int AosSpeed{ get{ return 33; } }
|
||||
public override float MlSpeed{ get{ return 3.25f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 25; } }
|
||||
public override int OldMinDamage{ get{ return 5; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 11; } }
|
||||
public override int AosMaxDamage{ get{ return 14; } }
|
||||
public override int AosSpeed{ get{ return 47; } }
|
||||
public override float MlSpeed{ get{ return 2.50f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 55; } }
|
||||
public override int OldMinDamage{ get{ return 11; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 11; } }
|
||||
public override int AosMaxDamage{ get{ return 13; } }
|
||||
public override int AosSpeed{ get{ return 44; } }
|
||||
public override float MlSpeed{ get{ return 2.50f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 10; } }
|
||||
public override int OldMinDamage{ get{ return 6; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 11; } }
|
||||
public override int AosMaxDamage{ get{ return 13; } }
|
||||
public override int AosSpeed{ get{ return 46; } }
|
||||
public override float MlSpeed{ get{ return 2.50f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 10; } }
|
||||
public override int OldMinDamage{ get{ return 5; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 10; } }
|
||||
public override int AosMaxDamage{ get{ return 12; } }
|
||||
public override int AosSpeed{ get{ return 53; } }
|
||||
public override float MlSpeed{ get{ return 2.00f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 10; } }
|
||||
public override int OldMinDamage{ get{ return 3; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 17; } }
|
||||
public override int AosMaxDamage{ get{ return 18; } }
|
||||
public override int AosSpeed{ get{ return 24; } }
|
||||
public override float MlSpeed{ get{ return 4.50f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 95; } }
|
||||
public override int OldMinDamage{ get{ return 17; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 15; } }
|
||||
public override int AosMaxDamage{ get{ return 16; } }
|
||||
public override int AosSpeed{ get{ return 30; } }
|
||||
public override float MlSpeed{ get{ return 3.50f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 25; } }
|
||||
public override int OldMinDamage{ get{ return 5; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 13; } }
|
||||
public override int AosMaxDamage{ get{ return 15; } }
|
||||
public override int AosSpeed{ get{ return 37; } }
|
||||
public override float MlSpeed{ get{ return 3.00f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 10; } }
|
||||
public override int OldMinDamage{ get{ return 4; } }
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 15; } }
|
||||
public override int AosMaxDamage{ get{ return 16; } }
|
||||
public override int AosSpeed{ get{ return 30; } }
|
||||
public override float MlSpeed{ get{ return 3.50f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 25; } }
|
||||
public override int OldMinDamage{ get{ return 5; } }
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace Server.Items
|
|||
public override int AosMinDamage{ get{ return 15; } }
|
||||
public override int AosMaxDamage{ get{ return 17; } }
|
||||
public override int AosSpeed{ get{ return 28; } }
|
||||
public override float MlSpeed{ get{ return 3.75f; } }
|
||||
|
||||
public override int OldStrengthReq{ get{ return 40; } }
|
||||
public override int OldMinDamage{ get{ return 6; } }
|
||||
|
|
|
|||
|
|
@ -40,9 +40,12 @@ namespace Server.Mobiles
|
|||
|
||||
VirtualArmor = 30;
|
||||
PackArmor( 1, 5 );
|
||||
if ( Utility.RandomDouble() < 0.80 )
|
||||
PackItem( new PlagueBeastGland() );
|
||||
|
||||
if ( Core.ML && Utility.RandomDouble() < .33 )
|
||||
PackItem( Engines.Plants.Seed.RandomPeculiarSeed(4) );
|
||||
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
|
|
|
|||
365
Scripts/Mobiles/Monsters/Misc/Melee/PlagueBeastLord.cs
Normal file
365
Scripts/Mobiles/Monsters/Misc/Melee/PlagueBeastLord.cs
Normal file
|
|
@ -0,0 +1,365 @@
|
|||
using System;
|
||||
using Server.Items;
|
||||
using Server.Network;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a plague beast lord corpse" )]
|
||||
public class PlagueBeastLord : BaseCreature, ICarvable, IScissorable
|
||||
{
|
||||
public override Poison PoisonImmune { get { return Poison.Lethal; } }
|
||||
|
||||
private Mobile m_OpenedBy;
|
||||
|
||||
[CommandProperty( AccessLevel.GameMaster )]
|
||||
public Mobile OpenedBy
|
||||
{
|
||||
get { return m_OpenedBy; }
|
||||
set { m_OpenedBy = value; }
|
||||
}
|
||||
|
||||
[CommandProperty( AccessLevel.GameMaster )]
|
||||
public bool IsBleeding
|
||||
{
|
||||
get
|
||||
{
|
||||
Container pack = Backpack;
|
||||
|
||||
if ( pack != null )
|
||||
{
|
||||
for ( int i = 0; i < pack.Items.Count; i++ )
|
||||
{
|
||||
PlagueBeastBlood blood = pack.Items[ i ] as PlagueBeastBlood;
|
||||
|
||||
if ( blood != null && !blood.Patched )
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private DecayTimer m_Timer;
|
||||
|
||||
[Constructable]
|
||||
public PlagueBeastLord() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a plague beast lord";
|
||||
Body = 775;
|
||||
BaseSoundID = 679;
|
||||
SpeechHue = 0x3B2;
|
||||
|
||||
SetStr( 500 );
|
||||
SetDex( 100 );
|
||||
SetInt( 30 );
|
||||
|
||||
SetHits( 1800 );
|
||||
|
||||
SetDamage( 20, 25 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 50 );
|
||||
SetDamageType( ResistanceType.Fire, 25 );
|
||||
SetDamageType( ResistanceType.Poison, 25 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 45, 55 );
|
||||
SetResistance( ResistanceType.Fire, 40, 50 );
|
||||
SetResistance( ResistanceType.Cold, 25, 35 );
|
||||
SetResistance( ResistanceType.Poison, 75, 85 );
|
||||
SetResistance( ResistanceType.Energy, 25, 35 );
|
||||
|
||||
SetSkill( SkillName.Tactics, 100 );
|
||||
SetSkill( SkillName.Wrestling, 100 );
|
||||
|
||||
Fame = 2000;
|
||||
Karma = -2000;
|
||||
|
||||
VirtualArmor = 50;
|
||||
}
|
||||
|
||||
public override void OnDoubleClick( Mobile from )
|
||||
{
|
||||
if ( IsAccessibleTo( from ) )
|
||||
{
|
||||
if ( m_OpenedBy != null && Backpack != null )
|
||||
Backpack.DisplayTo( from );
|
||||
else
|
||||
PrivateOverheadMessage( MessageType.Regular, 0x3B2, 1071917, from.NetState ); // * You attempt to tear open the amorphous flesh, but it resists *
|
||||
}
|
||||
}
|
||||
|
||||
public override bool OnDragDrop( Mobile from, Item dropped )
|
||||
{
|
||||
if ( IsAccessibleTo( from ) && ( dropped is PlagueBeastInnard || dropped is PlagueBeastGland ) )
|
||||
return base.OnDragDrop( from, dropped );
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
for ( int i = c.Items.Count - 1; i >= 0; i-- )
|
||||
c.Items[ i ].Delete();
|
||||
}
|
||||
|
||||
public override void OnDelete()
|
||||
{
|
||||
if ( m_OpenedBy != null && m_OpenedBy.Holding is PlagueBeastInnard )
|
||||
m_OpenedBy.Holding.Delete();
|
||||
|
||||
if ( Backpack != null )
|
||||
{
|
||||
for ( int i = Backpack.Items.Count - 1; i >= 0; i-- )
|
||||
Backpack.Items[ i ].Delete();
|
||||
|
||||
Backpack.Delete();
|
||||
}
|
||||
|
||||
base.OnDelete();
|
||||
}
|
||||
|
||||
public override void OnMovement( Mobile m, Point3D oldLocation )
|
||||
{
|
||||
base.OnMovement( m, oldLocation );
|
||||
|
||||
if ( Backpack != null && IsAccessibleTo( m ) && m.InRange( oldLocation, 3 ) && !m.InRange( this, 3 ) )
|
||||
Backpack.SendRemovePacket();
|
||||
}
|
||||
|
||||
public override bool CheckNonlocalLift( Mobile from, Item item )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public override bool CheckNonlocalDrop( Mobile from, Item item, Item target )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public override bool IsSnoop( Mobile from )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public override int GetIdleSound()
|
||||
{
|
||||
return 0x1BF;
|
||||
}
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 0x1C0;
|
||||
}
|
||||
|
||||
public override int GetHurtSound()
|
||||
{
|
||||
return 0x1C1;
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 0x1C2;
|
||||
}
|
||||
|
||||
public virtual void OnParalyzed( Mobile from )
|
||||
{
|
||||
FightMode = FightMode.None;
|
||||
Frozen = true;
|
||||
Blessed = true;
|
||||
Combatant = null;
|
||||
Hue = 0x480;
|
||||
from.Combatant = null;
|
||||
from.Warmode = false;
|
||||
|
||||
m_Timer = new DecayTimer( this );
|
||||
m_Timer.Start();
|
||||
|
||||
Timer.DelayCall( TimeSpan.Zero, new TimerCallback( BroadcastMessage ) );
|
||||
}
|
||||
|
||||
private void BroadcastMessage()
|
||||
{
|
||||
PublicOverheadMessage( MessageType.Regular, 0x3B2, 1071920 ); // * The plague beast's amorphous flesh hardens and becomes immobilized *
|
||||
}
|
||||
|
||||
public virtual bool IsAccessibleTo( Mobile check )
|
||||
{
|
||||
if ( check.AccessLevel >= AccessLevel.GameMaster )
|
||||
return true;
|
||||
|
||||
if ( !InRange( check, 2 ) )
|
||||
PrivateOverheadMessage( MessageType.Label, 0x3B2, 500446, check.NetState ); // That is too far away.
|
||||
else if ( m_OpenedBy != null && m_OpenedBy != check )
|
||||
PrivateOverheadMessage( MessageType.Label, 0x3B2, 500365, check.NetState ); // That is being used by someone else
|
||||
else if ( Frozen )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public virtual void Carve( Mobile from, Item item )
|
||||
{
|
||||
if ( m_OpenedBy == null && IsAccessibleTo( from ) )
|
||||
{
|
||||
m_OpenedBy = from;
|
||||
|
||||
if ( m_Timer == null )
|
||||
m_Timer = new DecayTimer( this );
|
||||
|
||||
if ( !m_Timer.Running )
|
||||
m_Timer.Start();
|
||||
|
||||
m_Timer.StartDissolving();
|
||||
|
||||
PlagueBeastBackpack pack = new PlagueBeastBackpack();
|
||||
AddItem( pack );
|
||||
pack.Initialize();
|
||||
|
||||
foreach ( NetState state in GetClientsInRange( 12 ) )
|
||||
{
|
||||
Mobile m = state.Mobile;
|
||||
|
||||
if ( m != null && m.Player && m != from )
|
||||
PrivateOverheadMessage( MessageType.Regular, 0x3B2, 1071919, from.Name, m.NetState ); // * ~1_VAL~ slices through the plague beast's amorphous tissue *
|
||||
}
|
||||
|
||||
from.LocalOverheadMessage( MessageType.Regular, 0x21, 1071904 ); // * You slice through the plague beast's amorphous tissue *
|
||||
Timer.DelayCall<Mobile>( TimeSpan.Zero, new TimerStateCallback<Mobile>( pack.Open ), from );
|
||||
}
|
||||
}
|
||||
|
||||
public virtual bool Scissor( Mobile from, Scissors scissors )
|
||||
{
|
||||
if ( IsAccessibleTo( from ) )
|
||||
scissors.PublicOverheadMessage( MessageType.Regular, 0x3B2, 1071918 ); // You can't cut through the plague beast's amorphous skin with scissors!
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public void Unfreeze()
|
||||
{
|
||||
FightMode = FightMode.Closest;
|
||||
Frozen = false;
|
||||
Blessed = false;
|
||||
|
||||
if ( m_OpenedBy == null )
|
||||
Hue = 0;
|
||||
}
|
||||
|
||||
public PlagueBeastLord( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.WriteEncodedInt( 0 ); // version
|
||||
|
||||
writer.Write( m_OpenedBy );
|
||||
|
||||
if ( m_Timer != null )
|
||||
{
|
||||
writer.Write( (bool) true );
|
||||
writer.Write( (int) m_Timer.Count );
|
||||
writer.Write( (int) m_Timer.Deadline );
|
||||
}
|
||||
else
|
||||
writer.Write( (bool) false );
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadEncodedInt();
|
||||
|
||||
m_OpenedBy = reader.ReadMobile();
|
||||
|
||||
if ( reader.ReadBool() )
|
||||
{
|
||||
int count = reader.ReadInt();
|
||||
int deadline = reader.ReadInt();
|
||||
|
||||
m_Timer = new DecayTimer( this, count, deadline );
|
||||
m_Timer.Start();
|
||||
}
|
||||
|
||||
if ( FightMode == FightMode.None )
|
||||
Frozen = true;
|
||||
}
|
||||
|
||||
private class DecayTimer : Timer
|
||||
{
|
||||
private PlagueBeastLord m_Lord;
|
||||
private int m_Count;
|
||||
private int m_Deadline;
|
||||
|
||||
public int Count
|
||||
{
|
||||
get { return m_Count; }
|
||||
}
|
||||
|
||||
public int Deadline
|
||||
{
|
||||
get { return m_Deadline; }
|
||||
}
|
||||
|
||||
public DecayTimer( PlagueBeastLord lord ) : this( lord, 0, 120 )
|
||||
{
|
||||
}
|
||||
|
||||
public DecayTimer( PlagueBeastLord lord, int count, int deadline ) : base( TimeSpan.Zero, TimeSpan.FromSeconds( 1 ) )
|
||||
{
|
||||
m_Lord = lord;
|
||||
m_Count = count;
|
||||
m_Deadline = deadline;
|
||||
}
|
||||
|
||||
protected override void OnTick()
|
||||
{
|
||||
if ( m_Lord == null || m_Lord.Deleted )
|
||||
{
|
||||
Stop();
|
||||
return;
|
||||
}
|
||||
|
||||
if ( m_Count + 15 == m_Deadline )
|
||||
{
|
||||
if ( m_Lord.OpenedBy != null )
|
||||
m_Lord.PublicOverheadMessage( MessageType.Regular, 0x3B2, 1071921 ); // * The plague beast begins to bubble and dissolve! *
|
||||
|
||||
m_Lord.PlaySound( 0x103 );
|
||||
}
|
||||
else if ( m_Count + 10 == m_Deadline )
|
||||
{
|
||||
m_Lord.PlaySound( 0x21 );
|
||||
}
|
||||
else if ( m_Count + 5 == m_Deadline )
|
||||
{
|
||||
m_Lord.PlaySound( 0x1C2 );
|
||||
}
|
||||
else if ( m_Count == m_Deadline )
|
||||
{
|
||||
m_Lord.Unfreeze();
|
||||
|
||||
if ( m_Lord.OpenedBy != null )
|
||||
m_Lord.Kill();
|
||||
|
||||
Stop();
|
||||
}
|
||||
else if ( m_Count % 15 == 0 )
|
||||
m_Lord.PlaySound( 0x1BF );
|
||||
|
||||
m_Count++;
|
||||
}
|
||||
|
||||
public void StartDissolving()
|
||||
{
|
||||
m_Deadline = Math.Min( m_Count + 60, m_Deadline );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -72,21 +72,16 @@ namespace Server.Spells.Fifth
|
|||
{
|
||||
DisguiseGump.StopTimer( Caster );
|
||||
|
||||
Caster.BodyMod = Utility.RandomList( 400, 401 );
|
||||
Caster.HueMod = Utility.RandomSkinHue();
|
||||
Caster.NameMod = Caster.Body.IsFemale ? NameList.RandomName( "female" ) : NameList.RandomName( "male" );
|
||||
Caster.HueMod = Caster.Race.RandomSkinHue();
|
||||
Caster.NameMod = Caster.Female ? NameList.RandomName( "female" ) : NameList.RandomName( "male" );
|
||||
|
||||
PlayerMobile pm = Caster as PlayerMobile;
|
||||
|
||||
if ( pm != null )
|
||||
if ( pm != null && pm.Race != null )
|
||||
{
|
||||
if ( pm.Body.IsFemale )
|
||||
pm.SetHairMods( Utility.RandomList( m_HairIDs ), 0 );
|
||||
else
|
||||
pm.SetHairMods( Utility.RandomList( m_HairIDs ), Utility.RandomList( m_BeardIDs ) );
|
||||
|
||||
pm.HairHue = Utility.RandomHairHue();
|
||||
pm.FacialHairHue = Utility.RandomHairHue();
|
||||
pm.SetHairMods( pm.Race.RandomHair( pm.Female ), pm.Race.RandomFacialHair( pm.Female ) );
|
||||
pm.HairHue = pm.Race.RandomHairHue();
|
||||
pm.FacialHairHue = pm.Race.RandomHairHue();
|
||||
}
|
||||
|
||||
Caster.FixedParticles( 0x373A, 10, 15, 5036, EffectLayer.Head );
|
||||
|
|
@ -117,7 +112,7 @@ namespace Server.Spells.Fifth
|
|||
}
|
||||
else
|
||||
{
|
||||
Caster.SendLocalizedMessage( 1005559 ); // This spell is already in effect.
|
||||
Caster.SendLocalizedMessage( 1079022 ); // You're already incognitoed!
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
using System;
|
||||
using Server.Mobiles;
|
||||
using Server.Targeting;
|
||||
using Server.Network;
|
||||
|
||||
|
|
@ -69,10 +70,16 @@ namespace Server.Spells.Fifth
|
|||
duration *= 0.75;
|
||||
}
|
||||
|
||||
m.Paralyze( TimeSpan.FromSeconds( duration ) );
|
||||
if ( m is PlagueBeastLord )
|
||||
{
|
||||
( (PlagueBeastLord) m ).OnParalyzed( Caster );
|
||||
duration = 120;
|
||||
}
|
||||
|
||||
m.Paralyze( TimeSpan.FromSeconds( duration ) );
|
||||
|
||||
m.PlaySound( 0x204 );
|
||||
m.FixedEffect( 0x376A, 6, 1 );
|
||||
m.PlaySound( 0x204 );
|
||||
m.FixedEffect( 0x376A, 6, 1 );
|
||||
}
|
||||
|
||||
FinishSequence();
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ using System.Collections.Generic;
|
|||
using Server.Network;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
using Server.Mobiles;
|
||||
|
||||
namespace Server.Spells.Fourth
|
||||
{
|
||||
|
|
@ -46,15 +47,28 @@ namespace Server.Spells.Fourth
|
|||
List<Mobile> targets = new List<Mobile>();
|
||||
|
||||
Map map = Caster.Map;
|
||||
Mobile m_directtarget = p as Mobile;
|
||||
|
||||
if ( map != null )
|
||||
{
|
||||
//you can target directly someone/something and become criminal if it's a criminal action
|
||||
if ( m_directtarget != null )
|
||||
targets.Add ( m_directtarget );
|
||||
|
||||
IPooledEnumerable eable = map.GetMobilesInRange( new Point3D( p ), 2 );
|
||||
|
||||
foreach ( Mobile m in eable )
|
||||
{
|
||||
// Archcure doesn't cure aggressors or victims
|
||||
if ( Caster.CanBeBeneficial( m, false ) && (!Core.AOS || !IsAggressor( m ) && !IsAggressed( m )) )
|
||||
// Archcure area effect won't cure aggressors or victims, nor murderers, criminals or monsters
|
||||
// plus Arch Cure Area will NEVER work on summons/pets if you are in Felucca facet
|
||||
// red players can cure only themselves and guildies with arch cure area.
|
||||
|
||||
if ( map.Rules == MapRules.FeluccaRules )
|
||||
{
|
||||
if ( Caster.CanBeBeneficial( m, false ) && ( !Core.AOS || !IsAggressor( m ) && !IsAggressed( m ) && (( IsInnocentTo ( Caster, m ) && IsInnocentTo ( m, Caster ) ) || ( IsAllyTo ( Caster, m ) )) && m != m_directtarget && m is PlayerMobile || m == Caster && m != m_directtarget ))
|
||||
targets.Add( m );
|
||||
}
|
||||
else if ( Caster.CanBeBeneficial( m, false ) && ( !Core.AOS || !IsAggressor( m ) && !IsAggressed( m ) && (( IsInnocentTo ( Caster, m ) && IsInnocentTo ( m, Caster ) ) || ( IsAllyTo ( Caster, m ) )) && m != m_directtarget || m == Caster && m != m_directtarget ))
|
||||
targets.Add( m );
|
||||
}
|
||||
|
||||
|
|
@ -119,6 +133,16 @@ namespace Server.Spells.Fourth
|
|||
return false;
|
||||
}
|
||||
|
||||
private static bool IsInnocentTo( Mobile from, Mobile to )
|
||||
{
|
||||
return ( Notoriety.Compute( from, (Mobile)to ) == Notoriety.Innocent );
|
||||
}
|
||||
|
||||
private static bool IsAllyTo( Mobile from, Mobile to )
|
||||
{
|
||||
return ( Notoriety.Compute( from, (Mobile)to ) == Notoriety.Ally );
|
||||
}
|
||||
|
||||
private class InternalTarget : Target
|
||||
{
|
||||
private ArchCureSpell m_Owner;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue