partial psz patch

This commit is contained in:
mark 2009-06-21 05:43:18 +00:00
parent d03acbffaf
commit 869f68488d
23 changed files with 15471 additions and 19 deletions

File diff suppressed because it is too large Load diff

View file

@ -59,7 +59,7 @@ namespace Server.Engines.Craft
public override bool RetainsColorFrom( CraftItem item, Type type )
{
if ( !( type == typeof( Cloth ) ) )
if ( type != typeof( Cloth ) && type != typeof( UncutCloth ) )
return false;
type = item.ItemType;

View file

@ -84,9 +84,11 @@ namespace Server.Items
to.Damage( 1, from );
IMount mt = to.Mount;
if ( to is ChaosDragoon || to is ChaosDragoonElite )
from.SendLocalizedMessage( 1042047 ); // You fail to knock the rider from its mount.
if ( mt != null )
IMount mt = to.Mount;
if ( mt != null && !( to is ChaosDragoon || to is ChaosDragoonElite ) )
mt.Rider = null;
to.SendLocalizedMessage( 1040023 ); // You have been knocked off of your mount!

View file

@ -39,6 +39,9 @@ namespace Server.Items
if ( !Validate( attacker ) )
return;
if ( defender is ChaosDragoon || defender is ChaosDragoonElite )
return;
if ( attacker.Mounted && !(defender.Weapon is Lance) ) // TODO: Should there be a message here?
return;

View file

@ -0,0 +1,49 @@
using System;
namespace Server.Items
{
/// <summary>
/// This attack allows you to disrobe your foe.
/// </summary>
public class Disrobe : WeaponAbility
{
public Disrobe()
{
}
public override int BaseMana{ get{ return 20; } } // Not Sure what amount of mana a creature uses.
public static readonly TimeSpan BlockEquipDuration = TimeSpan.FromSeconds( 5.0 );
public override void OnHit( Mobile attacker, Mobile defender, int damage )
{
if ( !Validate( attacker ) )
return;
ClearCurrentAbility( attacker );
Item toDisrobe = defender.FindItemOnLayer(Layer.InnerTorso);
if ( toDisrobe == null || !toDisrobe.Movable )
toDisrobe = defender.FindItemOnLayer( Layer.OuterTorso );
Container pack = defender.Backpack;
if ( pack == null || toDisrobe == null || !toDisrobe.Movable )
{
attacker.SendLocalizedMessage(1004001); // You cannot disarm your opponent.
}
else if ( CheckMana( attacker, true ) )
{
//attacker.SendLocalizedMessage( 1060092 ); // You disarm their weapon!
defender.SendLocalizedMessage(1062002); // You can no longer wear your ~1_ARMOR~
defender.PlaySound( 0x3B9 );
//defender.FixedParticles( 0x37BE, 232, 25, 9948, EffectLayer.InnerTorso );
pack.DropItem( toDisrobe );
BaseWeapon.BlockEquip( defender, BlockEquipDuration );
}
}
}
}

View file

@ -164,7 +164,7 @@ namespace Server.Items
return CheckSkills( from ) && CheckMana( from, false );
}
private static WeaponAbility[] m_Abilities = new WeaponAbility[30]
private static WeaponAbility[] m_Abilities = new WeaponAbility[31]
{
null,
new ArmorIgnore(),
@ -185,18 +185,19 @@ namespace Server.Items
new FrenziedWhirlwind(),
new Block(),
new DefenseMastery(),
new NerveStrike(),
new TalonStrike(),
new Feint(),
new DualWield(),
new DoubleShot(),
new ArmorPierce(),
null,
null,
null,
null,
null,
null
new NerveStrike(),
new TalonStrike(),
new Feint(),
new DualWield(),
new DoubleShot(),
new ArmorPierce(),
null,
null,
null,
null,
null,
null,
new Disrobe()
};
public static WeaponAbility[] Abilities{ get{ return m_Abilities; } }
@ -237,6 +238,8 @@ namespace Server.Items
public static readonly WeaponAbility SerpentArrow = m_Abilities[28];
public static readonly WeaponAbility ForceOfNature = m_Abilities[29];
public static readonly WeaponAbility Disrobe = m_Abilities[30];
public static bool IsWeaponAbility( Mobile m, WeaponAbility a )
{
if ( a == null )

View file

@ -0,0 +1,71 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "a mongbat corpse" )]
public class GreaterMongbat : BaseCreature
{
[Constructable]
public GreaterMongbat() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a greater mongbat";
Body = 39;
BaseSoundID = 422;
SetStr( 56, 80 );
SetDex( 61, 80 );
SetInt( 26, 50 );
SetHits( 34, 48 );
SetStam( 61, 80);
SetMana( 26, 50 );
SetDamage( 5, 7 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 15, 25 );
SetSkill( SkillName.MagicResist, 15.1, 30.0 );
SetSkill( SkillName.Tactics, 35.1, 50.0 );
SetSkill( SkillName.Wrestling, 20.1, 35.0 );
Fame = 450;
Karma = -450;
VirtualArmor = 10;
Tamable = true;
ControlSlots = 1;
MinTameSkill = 71.1;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Poor );
}
public override int Meat{ get{ return 1; } }
public override int Hides{ get{ return 6; } }
public override FoodType FavoriteFood{ get{ return FoodType.Meat; } }
public GreaterMongbat( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,184 @@
using System;
using Server;
using Server.Misc;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a chaos dragoon corpse" )]
public class ChaosDragoon : BaseCreature
{
[Constructable]
public ChaosDragoon() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.15, 0.4 )
{
Name = "a chaos dragoon";
Body = 0x190;
Hue = Utility.RandomSkinHue();
SetStr( 176, 225 );
SetDex( 81, 95 );
SetInt( 61, 85 );
SetHits( 176, 225 );
SetDamage( 24, 26 );
SetDamageType( ResistanceType.Physical, 25 );
SetDamageType( ResistanceType.Fire, 25 );
SetDamageType( ResistanceType.Cold, 25 );
SetDamageType( ResistanceType.Energy, 25 );
//SetResistance( ResistanceType.Physical, 25, 38 );
//SetResistance( ResistanceType.Fire, 25, 38 );
//SetResistance( ResistanceType.Cold, 25, 38 );
//SetResistance( ResistanceType.Poison, 25, 38 );
//SetResistance( ResistanceType.Energy, 25, 38 );
SetSkill( SkillName.Fencing, 77.6, 92.5 );
SetSkill( SkillName.Healing, 60.3, 90.0 );
SetSkill( SkillName.Macing, 77.6, 92.5 );
SetSkill( SkillName.Anatomy, 77.6, 87.5 );
SetSkill( SkillName.MagicResist, 77.6, 97.5 );
SetSkill( SkillName.Swords, 77.6, 92.5 );
SetSkill( SkillName.Tactics, 77.6, 87.5 );
Fame = 5000;
Karma = -5000;
CraftResource res;
switch (Utility.Random( 6 ))
{
case 0: res = CraftResource.BlackScales; break;
case 1: res = CraftResource.RedScales; break;
case 2: res = CraftResource.BlueScales; break;
case 3: res = CraftResource.YellowScales; break;
case 4: res = CraftResource.GreenScales; break;
case 5: res = CraftResource.WhiteScales; break;
}
BaseWeapon melee = null;
switch (Utility.Random( 3 ))
{
case 0: melee = new Kryss(); break;
case 1: melee = new Broadsword(); break;
case 2: melee = new Katana(); break;
}
melee.Movable = false;
AddItem( melee );
DragonHelm helm = new DragonHelm();
helm.Resource = res;
helm.Movable = false;
AddItem( helm );
DragonChest chest = new DragonChest();
chest.Resource = res;
chest.Movable = false;
AddItem( chest );
DragonArms arms = new DragonArms();
arms.Resource = res;
arms.Movable = false;
AddItem( arms );
DragonGloves gloves = new DragonGloves();
gloves.Resource = res;
gloves.Movable = false;
AddItem( gloves );
DragonLegs legs = new DragonLegs();
legs.Resource = res;
legs.Movable = false;
AddItem( legs );
ChaosShield shield = new ChaosShield();
shield.Movable = false;
AddItem( shield );
AddItem( new Shirt() );
AddItem( new Boots() );
int amount = Utility.RandomMinMax( 1, 3 );
switch ( res )
{
case CraftResource.BlackScales: AddItem( new BlackScales( amount ) ); break;
case CraftResource.RedScales: AddItem( new RedScales( amount ) ); break;
case CraftResource.BlueScales: AddItem( new BlueScales( amount ) ); break;
case CraftResource.YellowScales: AddItem( new YellowScales( amount ) ); break;
case CraftResource.GreenScales: AddItem( new GreenScales( amount ) ); break;
case CraftResource.WhiteScales: AddItem( new WhiteScales( amount ) ); break;
}
new SwampDragon().Rider = this;
}
public override int GetIdleSound()
{
return 0x2CE;
}
public override int GetDeathSound()
{
return 0x2CC;
}
public override int GetHurtSound()
{
return 0x2D1;
}
public override int GetAttackSound()
{
return 0x2C8;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Rich );
//AddLoot( LootPack.Gems );
}
public override bool HasBreath{ get{ return true; } }
public override bool AutoDispel{ get{ return true; } }
public override bool BardImmune{ get{ return !Core.AOS; } }
public override bool CanRummageCorpses{ get{ return true; } }
public override bool AlwaysMurderer{ get{ return true; } }
public override bool ShowFameTitle{ get{ return false; } }
public override bool OnBeforeDeath()
{
IMount mount = this.Mount;
if ( mount != null )
mount.Rider = null;
return base.OnBeforeDeath();
}
public override void AlterMeleeDamageTo( Mobile to, ref int damage )
{
if ( to is Dragon || to is WhiteWyrm || to is SwampDragon || to is Drake || to is Nightmare || to is Hiryu || to is LesserHiryu || to is Daemon )
damage *= 3;
}
public ChaosDragoon( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,206 @@
using System;
using Server;
using Server.Misc;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName("a chaos dragoon elite corpse")]
public class ChaosDragoonElite : BaseCreature
{
[Constructable]
public ChaosDragoonElite()
: base(AIType.AI_Mage, FightMode.Closest, 10, 1, 0.15, 0.4)
{
Name = "a chaos dragoon elite";
Body = 0x190;
Hue = Utility.RandomSkinHue();
SetStr(276, 350);
SetDex(66, 90);
SetInt(126, 150);
SetHits(276, 350);
SetDamage(29, 34);
SetDamageType(ResistanceType.Physical, 100);
/*SetResistance(ResistanceType.Physical, 45, 55);
SetResistance(ResistanceType.Fire, 15, 25);
SetResistance(ResistanceType.Cold, 50);
SetResistance(ResistanceType.Poison, 25, 35);
SetResistance(ResistanceType.Energy, 25, 35);*/
SetSkill(SkillName.Tactics, 80.1, 100.0);
SetSkill(SkillName.MagicResist, 100.1, 110.0);
SetSkill(SkillName.Anatomy, 80.1, 100.0);
SetSkill(SkillName.Magery, 85.1, 100.0);
SetSkill(SkillName.EvalInt, 85.1, 100.0);
SetSkill(SkillName.Swords, 72.5, 95.0);
SetSkill(SkillName.Fencing, 85.1, 100);
SetSkill(SkillName.Macing, 85.1, 100);
Fame = 8000;
Karma = -8000;
CraftResource res;
switch (Utility.Random(6))
{
case 0: res = CraftResource.BlackScales; break;
case 1: res = CraftResource.RedScales; break;
case 2: res = CraftResource.BlueScales; break;
case 3: res = CraftResource.YellowScales; break;
case 4: res = CraftResource.GreenScales; break;
case 5: res = CraftResource.WhiteScales; break;
}
BaseWeapon melee = null;
switch (Utility.Random(3))
{
case 0: melee = new Kryss(); break;
case 1: melee = new Broadsword(); break;
case 2: melee = new Katana(); break;
}
melee.Movable = false;
AddItem(melee);
DragonChest Tunic = new DragonChest();
Tunic.Resource = res;
Tunic.Movable = false;
AddItem(Tunic);
DragonLegs Legs = new DragonLegs();
Legs.Resource = res;
Legs.Movable = false;
AddItem(Legs);
DragonArms Arms = new DragonArms();
Arms.Resource = res;
Arms.Movable = false;
AddItem(Arms);
DragonGloves Gloves = new DragonGloves();
Gloves.Resource = res;
Gloves.Movable = false;
AddItem(Gloves);
DragonHelm Helm = new DragonHelm();
Helm.Resource = res;
Helm.Movable = false;
AddItem(Helm);
ChaosShield shield = new ChaosShield();
shield.Movable = false;
AddItem(shield);
AddItem(new Boots(0x455));
AddItem(new Shirt(Utility.RandomMetalHue()));
int amount = Utility.RandomMinMax(1, 3);
switch (res)
{
case CraftResource.BlackScales: AddItem(new BlackScales(amount)); break;
case CraftResource.RedScales: AddItem(new RedScales(amount)); break;
case CraftResource.BlueScales: AddItem(new BlueScales(amount)); break;
case CraftResource.YellowScales: AddItem(new YellowScales(amount)); break;
case CraftResource.GreenScales: AddItem(new GreenScales(amount)); break;
case CraftResource.WhiteScales: AddItem(new WhiteScales(amount)); break;
}
switch (Utility.Random(9))
{
case 0: res = CraftResource.DullCopper; break;
case 1: res = CraftResource.ShadowIron; break;
case 2: res = CraftResource.Copper; break;
case 3: res = CraftResource.Bronze; break;
case 4: res = CraftResource.Gold; break;
case 5: res = CraftResource.Agapite; break;
case 6: res = CraftResource.Verite; break;
case 7: res = CraftResource.Valorite; break;
case 8: res = CraftResource.Iron; break;
}
SwampDragon mt = new SwampDragon();
mt.HasBarding = true;
mt.BardingResource = res;
mt.BardingHP = mt.BardingMaxHP;
mt.Rider = this;
}
public override int GetIdleSound()
{
return 0x2CE;
}
public override int GetDeathSound()
{
return 0x2CC;
}
public override int GetHurtSound()
{
return 0x2D1;
}
public override int GetAttackSound()
{
return 0x2C8;
}
public override void GenerateLoot()
{
AddLoot(LootPack.Rich);
AddLoot(LootPack.Gems);
}
public override bool HasBreath { get { return true; } }
public override bool AutoDispel { get { return true; } }
public override bool BardImmune { get { return !Core.AOS; } }
public override bool CanRummageCorpses { get { return true; } }
public override bool AlwaysMurderer { get { return true; } }
public override bool ShowFameTitle { get { return false; } }
public override bool OnBeforeDeath()
{
IMount mount = this.Mount;
if ( mount != null )
{
if ( mount is SwampDragon )
((SwampDragon)mount).HasBarding = false;
mount.Rider = null;
}
return base.OnBeforeDeath();
}
public override void AlterMeleeDamageTo(Mobile to, ref int damage)
{
if ( to is Dragon || to is WhiteWyrm || to is SwampDragon || to is Drake || to is Nightmare || to is Hiryu || to is LesserHiryu || to is Daemon )
damage *= 3;
}
public ChaosDragoonElite(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,128 @@
using Server;
using System;
using Server.Items;
using Server.Gumps;
namespace Server.Mobiles
{
[CorpseName( "a Cu Sidhe corpse" )]
public class CuSidhe : BaseMount
{
[Constructable]
public CuSidhe() : this( "a Cu Sidhe" )
{
}
[Constructable]
public CuSidhe( string name ) : base( name, 277, 0x3E91, AIType.AI_Animal, FightMode.Aggressor, 10, 1, 0.2, 0.4 )
{
double chance = Utility.RandomDouble() * 23301;
if ( chance <= 1 )
Hue = 0x489;
else if ( chance < 50 )
Hue = Utility.RandomList( 0x657, 0x515, 0x4B1, 0x481, 0x480, 0x455 );
else if ( chance < 500 )
Hue = Utility.RandomList( 0x97A, 0x978, 0x901, 0x8AC, 0x5A7, 0x527 );
SetStr( 1201, 1225 );
SetDex( 151, 170 );
SetInt( 251, 282 );
SetDamage( 4, 5 );
SetDamageType( ResistanceType.Physical, 0 );
SetDamageType( ResistanceType.Cold, 50 );
SetDamageType( ResistanceType.Energy, 50 );
SetResistance( ResistanceType.Physical, 55, 65 );
SetResistance( ResistanceType.Fire, 30, 45 );
SetResistance( ResistanceType.Cold, 70, 85 );
SetResistance( ResistanceType.Poison, 30, 50 );
SetResistance( ResistanceType.Energy, 70, 85 );
SetSkill( SkillName.Wrestling, 90.1, 96.8 );
SetSkill( SkillName.Tactics, 90.3, 99.3 );
SetSkill( SkillName.MagicResist, 75.3, 90.0 );
SetSkill( SkillName.Anatomy, 65.5, 69.4 );
SetSkill( SkillName.Healing, 72.2, 98.9 );
Fame = 5000; //Guessing here
Karma = 5000; //Guessing here
Tamable = true;
ControlSlots = 4;
MinTameSkill = 101.1;
if ( Utility.RandomDouble() < 0.2 )
PackItem( new TreasureMap( 5, Map.Trammel ) );
//if ( Utility.RandomDouble() < 0.1 )
//PackItem( new ParrotItem() );
PackGold( 500, 800 );
// TODO 0-2 spellweaving scroll
}
public override void GenerateLoot()
{
AddLoot( LootPack.AosFilthyRich, 5 );
}
public override void OnDoubleClick( Mobile from )
{
if ( from.Race != Race.Elf && from == ControlMaster && from.AccessLevel == AccessLevel.Player )
{
Item pads = from.FindItemOnLayer( Layer.Shoes );
if ( pads is PadsOfTheCuSidhe )
from.SendMessage( "Your boots allow you to mount the Cu Sidhe", null, 0x3B2 );
else
{
from.SendLocalizedMessage( 1072203 ); // Only Elves may use this.
return;
}
}
base.OnDoubleClick( from );
}
public override bool CanHeal{ get{ return true; } }
public override bool CanHealOwner{ get{ return true; } }
public override FoodType FavoriteFood{ get{ return FoodType.FruitsAndVegies; } }
public override bool CanAngerOnTame{ get { return true; } }
public override bool StatLossAfterTame{ get{ return true; } }
public override int Hides{ get{ return 10; } }
public override int Meat{ get{ return 3; } }
public override WeaponAbility GetWeaponAbility()
{
return WeaponAbility.BleedAttack;
}
public CuSidhe( Serial serial ) : base( serial )
{
}
public override int GetIdleSound() { return 0x577; }
public override int GetAttackSound() { return 0x576; }
public override int GetAngerSound() { return 0x578; }
public override int GetHurtSound() { return 0x576; }
public override int GetDeathSound() { return 0x579; }
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 ); // version
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,64 @@
using System;
using Server.Mobiles;
namespace Server.Mobiles
{
[CorpseName( "a grizzly bear corpse" )]
[TypeAlias( "Server.Mobiles.Grizzlybear" )]
public class RagingGrizzlyBear : BaseCreature
{
[Constructable]
public RagingGrizzlyBear() : base( AIType.AI_Animal, FightMode.Aggressor, 10, 1, 0.2, 0.4 )
{
Name = "a raging grizzly bear";
Body = 212;
BaseSoundID = 0xA3;
SetStr( 1251, 1550 );
SetDex( 801, 1050 );
SetInt( 151, 400 );
SetHits( 751, 930 );
SetMana( 0 );
SetDamage( 6, 7 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 50, 70 );
SetResistance( ResistanceType.Cold, 30, 50 );
SetResistance( ResistanceType.Poison, 10, 20 );
SetResistance( ResistanceType.Energy, 10, 20 );
Fame = 5000; //Guessing here
Karma = -5000; //Guessing here
VirtualArmor = 24;
Tamable = false;
}
public override int Meat{ get{ return 2; } }
public override int Hides{ get{ return 16; } }
public override PackInstinct PackInstinct{ get{ return PackInstinct.Bear; } }
public RagingGrizzlyBear( Serial serial ) : base( serial )
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,109 @@
using System;
using System.Collections;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName("a fetid essence corpse")]
public class FetidEssence : BaseCreature
{
[Constructable]
public FetidEssence () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a fetid essence";
Body = 273;
SetStr( 101, 150 );
SetDex( 210, 250 );
SetInt( 451, 550 );
SetHits( 551, 650 );
SetDamage( 11, 13 );
SetDamageType( ResistanceType.Physical, 30 );
SetDamageType( ResistanceType.Poison, 70 );
SetResistance( ResistanceType.Physical, 40, 50 );
SetResistance( ResistanceType.Fire, 40, 50 );
SetResistance( ResistanceType.Cold, 40, 50 );
SetResistance( ResistanceType.Poison, 70, 90 );
SetResistance( ResistanceType.Energy, 75, 80 );
SetSkill(SkillName.Meditation, 91.4, 99.4 );
SetSkill(SkillName.EvalInt, 88.5, 92.3 );
SetSkill(SkillName.Magery, 97.9, 101.7 );
SetSkill(SkillName.Poisoning, 100 );
SetSkill(SkillName.Anatomy, 0, 4.5 );
SetSkill( SkillName.MagicResist, 103.5, 108.8 );
SetSkill( SkillName.Tactics, 81.0, 84.6 );
SetSkill( SkillName.Wrestling, 81.3, 83.9 );
Fame = 3700; // Guessed
Karma = -3700; // Guessed
}
/*public override void GenerateLoot() -- Need to verify
{
AddLoot( LootPack.Meager );
AddLoot( LootPack.Average );
}*/
public override int GetAngerSound()
{
return 0x56d;
}
public override int GetIdleSound()
{
return 0x56b;
}
public override int GetAttackSound()
{
return 0x56c;
}
public override int GetHurtSound()
{
return 0x56c;
}
public override int GetDeathSound()
{
return 0x56e;
}
public FetidEssence ( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
/*private class InternalTimer : Timer
{
private Mobile m_From;
private Mobile m_Mobile;
private int m_Count;
public InternalTimer( Mobile from, Mobile m ) : base( TimeSpan.FromSeconds( 1.0 ), TimeSpan.FromSeconds( 1.0 ) )
{
m_From = from;
m_Mobile = m;
Priority = TimerPriority.TwoFiftyMS;
}
}*/
}
}

View file

@ -0,0 +1,127 @@
using System;
using System.Collections;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName("an interred grizzle corpse")]
public class InterredGrizzle : BaseCreature
{
[Constructable]
public InterredGrizzle () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "an interred grizzle";
Body = 259;
SetStr( 451, 500 );
SetDex( 201, 250 );
SetInt( 801, 850 );
SetHits( 1500 );
SetStam( 150 );
SetDamage( 5, 6 );
SetDamageType( ResistanceType.Physical, 30 );
SetDamageType( ResistanceType.Fire, 70 );
SetResistance( ResistanceType.Physical, 35, 55 );
SetResistance( ResistanceType.Fire, 20, 65 );
SetResistance( ResistanceType.Cold, 55, 80 );
SetResistance( ResistanceType.Poison, 20, 35 );
SetResistance( ResistanceType.Energy, 60, 80 );
SetSkill(SkillName.Meditation, 77.7, 84.0 );
SetSkill(SkillName.EvalInt, 72.2, 79.6 );
SetSkill(SkillName.Magery, 83.7, 89.6);
SetSkill(SkillName.Poisoning, 0 );
SetSkill(SkillName.Anatomy, 0 );
SetSkill( SkillName.MagicResist, 80.2, 87.3 );
SetSkill( SkillName.Tactics, 104.5, 105.1 );
SetSkill( SkillName.Wrestling, 105.1, 109.4 );
Fame = 3700; // Guessed
Karma = -3700; // Guessed
}
/*public override void GenerateLoot() -- Need to verify
{
AddLoot( LootPack.Meager );
AddLoot( LootPack.Average );
}*/
// TODO: Acid Blood
/*
* Message: 1070820
* Spits pool of acid (blood, hue 0x3F), hits lost 6-10 per second/step
* Damage is resistable (physical)
* Acid last 10 seconds
*/
public override int GetAngerSound()
{
return 0x581;
}
public override int GetIdleSound()
{
return 0x582;
}
public override int GetAttackSound()
{
return 0x580;
}
public override int GetHurtSound()
{
return 0x583;
}
public override int GetDeathSound()
{
return 0x584;
}
/*
public override bool OnBeforeDeath()
{
SpillAcid( 1, 4, 10, 6, 10 );
return base.OnBeforeDeath();
}
*/
public InterredGrizzle ( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
private class InternalTimer : Timer
{
private Mobile m_From;
private Mobile m_Mobile;
private int m_Count;
public InternalTimer( Mobile from, Mobile m ) : base( TimeSpan.FromSeconds( 1.0 ), TimeSpan.FromSeconds( 1.0 ) )
{
m_From = from;
m_Mobile = m;
Priority = TimerPriority.TwoFiftyMS;
}
}
}
}

View file

@ -0,0 +1,84 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
using Server.Misc;
namespace Server.Mobiles
{
[CorpseName("a dryad corpse")]
public class MLDryad : BaseCreature
{
public override bool InitialInnocent { get { return true; } }
/* VULNERABLE TO FEY SLAYER!
* These creatures should be able to cast Area Peace as
* well as cause Players' armor to drop into their backpack*/
public override WeaponAbility GetWeaponAbility()
{
return WeaponAbility.Disrobe;
}
[Constructable]
public MLDryad()
: base(AIType.AI_Mage, FightMode.Aggressor, 10, 1, 0.2, 0.4) // NEED TO CHECK
{
Name = "a dryad";
Body = 266;
BaseSoundID = 0x57B;
SetStr(132, 149);
SetDex(152, 168);
SetInt(251, 280);
SetHits(304, 321);
SetDamage(6, 11);
SetDamageType(ResistanceType.Physical, 100);
SetResistance(ResistanceType.Physical, 40, 50);
SetResistance(ResistanceType.Fire, 15, 25);
SetResistance(ResistanceType.Cold, 40, 45);
SetResistance(ResistanceType.Poison, 30, 40);
SetResistance(ResistanceType.Energy, 25, 35);
SetSkill(SkillName.Meditation, 80.9, 89.9);
SetSkill(SkillName.EvalInt, 70.3, 78.7);
SetSkill(SkillName.Magery, 70.7, 75.7);
SetSkill(SkillName.Anatomy, 0);
SetSkill(SkillName.MagicResist, 101.7, 117.1);
SetSkill(SkillName.Tactics, 71.7, 79.8);
SetSkill(SkillName.Wrestling, 72.5, 79.5);
Fame = 5000;
Karma = 5000;
VirtualArmor = 28; // Don't know what it should be
}
public override void GenerateLoot()
{
AddLoot(LootPack.Rich); // Need to verify
}
public override int Meat { get { return 1; } }
public MLDryad(Serial serial) : base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,84 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
using Server.Misc;
namespace Server.Mobiles
{
[CorpseName("a satyr corpse")]
public class Satyr : BaseCreature
{
/* These creatures should be able to cast Area Peace as
* well as cause Players' armor to drop into their backpack
*/
public override WeaponAbility GetWeaponAbility()
{
return WeaponAbility.Disrobe;
}
[Constructable]
public Satyr()
: base(AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4) // NEED TO CHECK
{
Name = "a satyr";
Body = 271;
BaseSoundID = 0x586;
SetStr(177, 195);
SetDex(251, 269);
SetInt(153, 170);
SetHits(353, 399);
SetDamage(6, 11);
SetDamageType(ResistanceType.Physical, 100);
SetResistance(ResistanceType.Physical, 55, 60);
SetResistance(ResistanceType.Fire, 26, 35);
SetResistance(ResistanceType.Cold, 30, 40);
SetResistance(ResistanceType.Poison, 30, 40);
SetResistance(ResistanceType.Energy, 30, 40);
SetSkill(SkillName.Poisoning, 0);
SetSkill(SkillName.Meditation, 0);
SetSkill(SkillName.EvalInt, 0);
SetSkill(SkillName.Magery, 0);
SetSkill(SkillName.Anatomy, 0);
SetSkill(SkillName.MagicResist, 55.3, 64.3);
SetSkill(SkillName.Tactics, 80.1, 99.3);
SetSkill(SkillName.Wrestling, 80.6, 100.0);
Fame = 5000;
Karma = -5000;
VirtualArmor = 28; // Don't know what it should be
}
public override void GenerateLoot()
{
AddLoot(LootPack.Rich); // Need to verify
}
public override int Meat { get { return 1; } }
public Satyr(Serial serial) : base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,90 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a treefellow corpse" )]
public class FerelTreefellow : BaseCreature
{
public override WeaponAbility GetWeaponAbility()
{
return WeaponAbility.Dismount;
}
[Constructable]
public FerelTreefellow() : base( AIType.AI_Melee, FightMode.Evil, 10, 1, 0.2, 0.4 )
{
Name = "a ferel treefellow";
Body = 301;
SetStr( 1351, 1600 );
SetDex( 301, 550 );
SetInt( 651, 900 );
SetHits( 1170, 1320 );
SetDamage( 3, 4 ); // Estimate until Anat/Tactics is verified
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 60, 70 );
SetResistance( ResistanceType.Cold, 70, 80 );
SetResistance( ResistanceType.Poison, 60, 70 );
SetResistance( ResistanceType.Energy, 40, 60 );
SetSkill( SkillName.MagicResist, 40.1, 55.0 );// Unknown
SetSkill( SkillName.Tactics, 65.1, 90.0 );// Unknown
SetSkill( SkillName.Wrestling, 65.1, 85.0 );// Unknown
Fame = 1000; //Unknown
Karma = -3000; //Unknown
VirtualArmor = 24;
PackItem( new Log( Utility.RandomMinMax( 23, 34 ) ) );
}
public override OppositionGroup OppositionGroup
{
get{ return OppositionGroup.FeyAndUndead; }
}
public override int GetIdleSound()
{
return 443;
}
public override int GetDeathSound()
{
return 31;
}
public override int GetAttackSound()
{
return 672;
}
public override bool BleedImmune{ get{ return true; } }
public override void GenerateLoot()
{
AddLoot( LootPack.Average ); //Unknown
}
public FerelTreefellow( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,77 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "a slimey corpse" )]
public class CorrosiveSlime : BaseCreature
{
[Constructable]
public CorrosiveSlime() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a corrosive slime";
Body = 51;
BaseSoundID = 456;
Hue = Utility.RandomSlimeHue();
SetStr( 22, 34 );
SetDex( 16, 21 );
SetInt( 16, 20 );
SetHits( 15, 19 );
SetDamage( 1, 5 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 5, 10 );
SetResistance( ResistanceType.Poison, 15, 20 );
SetSkill( SkillName.Poisoning, 36.0, 49.1 );
SetSkill(SkillName.Anatomy, 0);
SetSkill( SkillName.MagicResist, 15.9, 18.9 );
SetSkill( SkillName.Tactics, 24.6, 26.1 );
SetSkill( SkillName.Wrestling, 24.9, 26.1 );
Fame = 300;
Karma = -300;
VirtualArmor = 8;
Tamable = true;
ControlSlots = 1;
MinTameSkill = 23.1;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Poor );
AddLoot( LootPack.Gems );
}
public override Poison PoisonImmune { get { return Poison.Regular; } }
public override Poison HitPoison { get { return Poison.Regular; } }
public override FoodType FavoriteFood{ get{ return FoodType.Fish; } }
//TODO: Damage weapon via acid
public CorrosiveSlime( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,104 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName("corpse of Ilhenir")]
public class Ilhenir : BaseCreature
{
// Based off of the Bone Demon, since Stratics and UOGuide are lacking in info. Many things guessed for now.
[Constructable]
public Ilhenir()
: base(AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4)
{
Name = "Ilhenir";
Title = "the Stained";
Body = 259;
SetStr( 1105, 1350 );
SetDex( 82, 160 );
SetInt( 505, 750 );
SetHits( 9000 );
SetDamage(4, 6);
SetDamageType(ResistanceType.Physical, 60);
SetDamageType(ResistanceType.Fire, 20);
SetDamageType(ResistanceType.Poison, 20);
SetResistance(ResistanceType.Physical, 55, 65);
SetResistance(ResistanceType.Fire, 50, 60);
SetResistance(ResistanceType.Cold, 55, 65);
SetResistance(ResistanceType.Poison, 70, 90);
SetResistance(ResistanceType.Energy, 65, 75);
SetSkill(SkillName.EvalInt, 100);
SetSkill(SkillName.Magery, 100);
SetSkill(SkillName.Meditation, 0);
SetSkill(SkillName.Poisoning, 5.4);
SetSkill(SkillName.Anatomy, 117.5);
SetSkill(SkillName.MagicResist, 120.0);
SetSkill(SkillName.Tactics, 119.9);
SetSkill(SkillName.Wrestling, 119.9);
Fame = 50000;
Karma = -50000;
VirtualArmor = 44;
}
public override void GenerateLoot()
{
AddLoot(LootPack.FilthyRich, 8);
}
public override bool Unprovokable { get { return true; } }
public override bool Uncalmable { get { return true; } }
public override Poison PoisonImmune { get { return Poison.Lethal; } }
public override int TreasureMapLevel { get { return 1; } }
public override int GetAngerSound()
{
return 0x581;
}
public override int GetIdleSound()
{
return 0x582;
}
public override int GetAttackSound()
{
return 0x580;
}
public override int GetHurtSound()
{
return 0x583;
}
public override int GetDeathSound()
{
return 0x584;
}
public Ilhenir(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,100 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
using Server.Misc;
namespace Server.Mobiles
{
[CorpseName( "a minotaur corpse" )]
public class Meraktus : BaseCreature
{
[Constructable]
public Meraktus() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 ) // NEED TO CHECK
{
Name = "Meraktus";
Title = "the Tormented";
Body = 262;
SetStr( 1419, 1438 );
SetDex( 309, 413 );
SetInt( 129, 131 );
SetHits( 4100, 4200 );
SetDamage( 3, 5 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 65, 90 );
SetResistance( ResistanceType.Fire, 65, 70 );
SetResistance( ResistanceType.Cold, 50, 60 );
SetResistance( ResistanceType.Poison, 40, 60 );
SetResistance( ResistanceType.Energy, 50, 55 );
//SetSkill( SkillName.Meditation, Unknown );
//SetSkill( SkillName.EvalInt, Unknown );
//SetSkill( SkillName.Magery, Unknown );
//SetSkill( SkillName.Poisoning, Unknown );
SetSkill( SkillName.Anatomy, 0);
SetSkill( SkillName.MagicResist, 107.0, 111.3 );
SetSkill( SkillName.Tactics, 107.0, 117.0 );
SetSkill( SkillName.Wrestling, 100.0, 105.0 );
Fame = 70000;
Karma = -70000;
VirtualArmor = 28; // Don't know what it should be
// TODO: Area Ground Stomp: Damage + Dismount
}
public override void GenerateLoot()
{
AddLoot( LootPack.Rich ); // Need to verify
AddLoot(LootPack.Rich); // Need to verify
}
public override int GetAngerSound()
{
return 0x597;
}
public override int GetIdleSound()
{
return 0x596;
}
public override int GetAttackSound()
{
return 0x599;
}
public override int GetHurtSound()
{
return 0x59a;
}
public override int GetDeathSound()
{
return 0x59c;
}
public Meraktus( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,144 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
public class Twaulo : BaseCreature
{
// COMPLETELY guessed beyond stats. Stats/skills come from Stratics and UOGuide. No idea what the special attacks should be.
// Based on Silvani, due to them both using Blue creatures.
[Constructable]
public Twaulo()
: base(AIType.AI_Archer, FightMode.Evil, 18, 1, 0.1, 0.2)
{
Name = "Twaulo";
Title = "of the Glade";
Body = 101;
BaseSoundID = 679;
SetStr( 1751, 1950 );
SetDex( 251, 450 );
SetInt( 801, 1000 );
SetHits( 7500 );
SetDamage( 3, 4 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 65, 75 );
SetResistance( ResistanceType.Fire, 45, 55 );
SetResistance( ResistanceType.Cold, 50, 60 );
SetResistance( ResistanceType.Poison, 50, 60 );
SetResistance( ResistanceType.Energy, 50, 60 );
SetSkill( SkillName.Archery, 85.0, 100 ); // Guestimate
SetSkill( SkillName.EvalInt, 0 ); // Per Stratics?!?
SetSkill( SkillName.Magery, 0 ); // Per Stratics?!?
SetSkill( SkillName.Meditation, 0 ); // Per Stratics?!?
SetSkill( SkillName.MagicResist, 0 ); // Per Stratics?!?
SetSkill( SkillName.Tactics, 85.0, 100 ); // Stratics says 0?!?
SetSkill( SkillName.Wrestling, 0 ); // Per Stratics?!?
Fame = 50000;
Karma = 50000;
VirtualArmor = 50;
AddItem(new Bow());
PackItem(new Arrow(Utility.RandomMinMax(500, 700)));
}
public override void GenerateLoot()
{
AddLoot( LootPack.UltraRich, 2 );
}
public override OppositionGroup OppositionGroup
{
get{ return OppositionGroup.FeyAndUndead; }
}
public override bool Unprovokable{ get{ return true; } }
public override Poison PoisonImmune{ get{ return Poison.Regular; } }
public override int TreasureMapLevel{ get{ return 5; } }
public void SpawnPixies( Mobile target )
{
Map map = this.Map;
if ( map == null )
return;
int newPixies = Utility.RandomMinMax( 3, 6 );
for ( int i = 0; i < newPixies; ++i )
{
Pixie pixie = new Pixie();
pixie.Team = this.Team;
pixie.FightMode = FightMode.Closest;
bool validLocation = false;
Point3D loc = this.Location;
for ( int j = 0; !validLocation && j < 10; ++j )
{
int x = X + Utility.Random( 3 ) - 1;
int y = Y + Utility.Random( 3 ) - 1;
int z = map.GetAverageZ( x, y );
if ( validLocation = map.CanFit( x, y, this.Z, 16, false, false ) )
loc = new Point3D( x, y, Z );
else if ( validLocation = map.CanFit( x, y, z, 16, false, false ) )
loc = new Point3D( x, y, z );
}
pixie.MoveToWorld( loc, map );
pixie.Combatant = target;
}
}
public override void AlterDamageScalarFrom( Mobile caster, ref double scalar )
{
if ( 0.1 >= Utility.RandomDouble() )
SpawnPixies( caster );
}
public override void OnGaveMeleeAttack( Mobile defender )
{
base.OnGaveMeleeAttack( defender );
defender.Damage( Utility.Random( 20, 10 ), this );
defender.Stam -= Utility.Random( 20, 10 );
defender.Mana -= Utility.Random( 20, 10 );
}
public override void OnGotMeleeAttack( Mobile attacker )
{
base.OnGotMeleeAttack( attacker );
if ( 0.1 >= Utility.RandomDouble() )
SpawnPixies( attacker );
}
public Twaulo( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 ); // version
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}