RunUO Community

This is a sample guest message. Register a free account today to become a member! Once signed in, you'll be able to participate on this site by adding your own topics and posts, as well as connect with other members through your own private inbox!

[RunUO 2.0 RC1] Daat99 OWLTR Update for 2.0 w/caveat

GhostRiderGrey

Sorceror
OK, did the compare, and it looks like there are 3 files affected. KeyRing.cs (Daat99's version), spell casters key.cs, and deftinkering.cs. I have decided to call the new keyring OnyxKeyRing and did a case sensitive serach and replace in the 3 files names above.

When compiling, I receive the following error:
Code:
Errors:
 + Customs/[042] Daat99OWLTR/Custom Craftables/OnyxKeyRing.cs:
    CS0115: Line 42: 'Server.Items.OnyxKeyRing.Dupe(int)': no suitable method found to override

and am not sure how to correct this. Files attached if needed.

Thoughts?

Thanks,
-GhostRiderGrey
 

Attachments

  • DefTinkering.cs
    30.9 KB · Views: 19
  • OnyxKeyRing.cs
    1.5 KB · Views: 20
  • Spell Casters Key.cs
    28 KB · Views: 22

Lokai

Knight
GhostRiderGrey;759514 said:
OK, did the compare, and it looks like there are 3 files affected. KeyRing.cs (Daat99's version), spell casters key.cs, and deftinkering.cs. I have decided to call the new keyring OnyxKeyRing and did a case sensitive serach and replace in the 3 files names above.

When compiling, I receive the following error:
Code:
Errors:
 + Customs/[042] Daat99OWLTR/Custom Craftables/OnyxKeyRing.cs:
    CS0115: Line 42: 'Server.Items.OnyxKeyRing.Dupe(int)': no suitable method found to override

and am not sure how to correct this. Files attached if needed.

Thoughts?

Thanks,
-GhostRiderGrey

dupe() went out with RunUO 1.0.

All you have to do is remove the dupe method.
 

GhostRiderGrey

Sorceror
Yup, that was it. Thank you Lokai.

Here are my adjusted files if anyone wants them. Replace the DefTinkering.cs and Spell Casters Key.cs from Lokai's package. Add Onyx Keyring.cs to \Scripts\Customs\Daat99OWLTR\Custom Craftables . Make sure you only have 1 KeyRing.cs script in your system (the distro copy)

Onyx Keyring will live in harmony with the distro KeyRing file. Onyx keyrings are used to tinker Customs. Among them: spellcaster, metalworker, stoneworker, woodworker and tailor keys. They can also be stored in the spellcaster keys.

-GhostRiderGrey
 

Attachments

  • DefTinkering.cs
    31 KB · Views: 22
  • Onyx Keyring.cs
    1.9 KB · Views: 23
  • Spell Casters Key.cs
    28 KB · Views: 22

GhostRiderGrey

Sorceror
Woot, my 100th post :D

I have a question about the runics in this system. When I look at the scripts, it looks like they are already set to drop on elementals in the elementals.cs file. However, on my shard, we have set to see any runics drop on any elemental (have killed over 100 in testing, mostly plat elementals).

My questions are: 1) Am I seeing it correcly that the runics are already set up to drop? 2) Is it something that I overlooked that needs to be turned on? 3) Other thoughts about what I could have done wrong?

Thanks,
-GhostRiderGrey
 

daat99

Moderator
Staff member
GhostRiderGrey;762766 said:
Woot, my 100th post :D

I have a question about the runics in this system. When I look at the scripts, it looks like they are already set to drop on elementals in the elementals.cs file. However, on my shard, we have set to see any runics drop on any elemental (have killed over 100 in testing, mostly plat elementals).

My questions are: 1) Am I seeing it correcly that the runics are already set up to drop? 2) Is it something that I overlooked that needs to be turned on? 3) Other thoughts about what I could have done wrong?

Thanks,
-GhostRiderGrey

**assuming you haven't modified anything**

By design the runics will drop only from elementals that were spawned from mining and not from a spawner.

They were never intended to be spawned in the wild but only as a miner advantage (these poor guys never get good loot).

If you don't have high enough mining (or a friend with high enough mining) then you shouldn't even see them in the world.

Considering most shards have skill cap then a simple miner won't be able to fight off the hard elementals and will require a fighter friend to watch his back (unless he want to die and loose everything...).
 

cutter

Wanderer
I'm having the same problem that TalonRhein was having and since I don't see anywhere that it was actually replied to I figured I would ask.

Code:
Errors:
 + Mobiles/Animals/Mounts/Ethereals.cs:
    CS1715: Line 366: 'Server.Mobiles.EtherealMount.EtherealSpell.CastDelayFastS
calar': type must be 'int' to match overridden member 'Server.Spells.Spell.CastD
elayFastScalar'
    CS1715: Line 368: 'Server.Mobiles.EtherealMount.EtherealSpell.CastDelayBase'
: type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBa
se'
 + Spells/Base/MagerySpell.cs:
    CS1715: Line 108: 'Server.Spells.MagerySpell.CastDelayBase': type must be 'i
nt' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Mobiles/Animals/Mounts/LesserHiryu.cs:
    CS0115: Line 119: 'Server.Mobiles.LesserHiryu.GetControlChance(Server.Mobile
, bool)': no suitable method found to override
 + Mobiles/Animals/Mounts/Ridgeback.cs:
    CS0115: Line 48: 'Server.Mobiles.Ridgeback.GetControlChance(Server.Mobile, b
ool)': no suitable method found to override
 + Mobiles/Animals/Mounts/SavageRidgeback.cs:
    CS0115: Line 48: 'Server.Mobiles.SavageRidgeback.GetControlChance(Server.Mob
ile, bool)': no suitable method found to override
 + Mobiles/Animals/Mounts/ScaledSwampDragon.cs:
    CS0115: Line 47: 'Server.Mobiles.ScaledSwampDragon.GetControlChance(Server.M
obile, bool)': no suitable method found to override
 + Mobiles/Animals/Mounts/SwampDragon.cs:
    CS0115: Line 145: 'Server.Mobiles.SwampDragon.GetControlChance(Server.Mobile
, bool)': no suitable method found to override
 + Mobiles/Monsters/Misc/Melee/BladeSpirits.cs:
    CS0115: Line 17: 'Server.Mobiles.BladeSpirits.GetFightModeRanking(Server.Mob
ile, Server.Mobiles.FightMode, bool)': no suitable method found to override
 + Mobiles/Monsters/Misc/Melee/EnergyVortex.cs:
    CS0115: Line 17: 'Server.Mobiles.EnergyVortex.GetFightModeRanking(Server.Mob
ile, Server.Mobiles.FightMode, bool)': no suitable method found to override
 + Mobiles/Monsters/SE/FireBeetle.cs:
    CS0115: Line 80: 'Server.Mobiles.FireBeetle.GetControlChance(Server.Mobile,
bool)': no suitable method found to override
 + Mobiles/Vendors/NPC/Blacksmith.cs:
    CS0115: Line 125: 'Server.Mobiles.Blacksmith.OnSuccessfulBulkOrderReceive(Se
rver.Mobile)': no suitable method found to override
 + Mobiles/Vendors/NPC/Tailor.cs:
    CS0115: Line 74: 'Server.Mobiles.Tailor.OnSuccessfulBulkOrderReceive(Server.
Mobile)': no suitable method found to override
 + Mobiles/Vendors/NPC/Weaponsmith.cs:
    CS0115: Line 92: 'Server.Mobiles.Weaponsmith.OnSuccessfulBulkOrderReceive(Se
rver.Mobile)': no suitable method found to override
 + Mobiles/Vendors/NPC/Weaver.cs:
    CS0115: Line 74: 'Server.Mobiles.Weaver.OnSuccessfulBulkOrderReceive(Server.
Mobile)': no suitable method found to override
 + Mobiles/Vendors/GenericBuy.cs:
    CS0535: Line 9: 'Server.Mobiles.GenericBuyInfo' does not implement interface
 member 'Server.IBuyItemInfo.GetObject()'
 + Skills/SpiritSpeak.cs:
    CS1715: Line 87: 'Server.SkillHandlers.SpiritSpeak.SpiritSpeakSpell.CastDela
yFastScalar': type must be 'int' to match overridden member 'Server.Spells.Spell
.CastDelayFastScalar'
    CS1715: Line 88: 'Server.SkillHandlers.SpiritSpeak.SpiritSpeakSpell.CastDela
yBase': type must be 'int' to match overridden member 'Server.Spells.Spell.CastD
elayBase'
 + Spells/Bushido/SamuraiSpell.cs:
    CS1715: Line 22: 'Server.Spells.Bushido.SamuraiSpell.CastDelayFastScalar': t
ype must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayFastS
calar'
 + Spells/Bushido/Confidence.cs:
    CS1715: Line 17: 'Server.Spells.Bushido.Confidence.CastDelayBase': type must
 be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Bushido/CounterAttack.cs:
    CS1715: Line 18: 'Server.Spells.Bushido.CounterAttack.CastDelayBase': type m
ust be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Bushido/Evasion.cs:
    CS1715: Line 18: 'Server.Spells.Bushido.Evasion.CastDelayBase': type must be
 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Chivalry/CleanseByFire.cs:
    CS1715: Line 17: 'Server.Spells.Chivalry.CleanseByFireSpell.CastDelayBase':
type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase
'
 + Spells/Chivalry/CloseWounds.cs:
    CS1715: Line 18: 'Server.Spells.Chivalry.CloseWoundsSpell.CastDelayBase': ty
pe must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Chivalry/ConsecrateWeapon.cs:
    CS1715: Line 17: 'Server.Spells.Chivalry.ConsecrateWeaponSpell.CastDelayBase
': type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayB
ase'
 + Spells/Chivalry/DispelEvil.cs:
    CS1715: Line 19: 'Server.Spells.Chivalry.DispelEvilSpell.CastDelayBase': typ
e must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Chivalry/DivineFury.cs:
    CS1715: Line 17: 'Server.Spells.Chivalry.DivineFurySpell.CastDelayBase': typ
e must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Chivalry/EnemyOfOne.cs:
    CS1715: Line 19: 'Server.Spells.Chivalry.EnemyOfOneSpell.CastDelayBase': typ
e must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Chivalry/HolyLight.cs:
    CS1715: Line 17: 'Server.Spells.Chivalry.HolyLightSpell.CastDelayBase': type
 must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Chivalry/NobleSacrifice.cs:
    CS1715: Line 23: 'Server.Spells.Chivalry.NobleSacrificeSpell.CastDelayBase':
 type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBas
e'
 + Spells/Chivalry/RemoveCurse.cs:
    CS1715: Line 19: 'Server.Spells.Chivalry.RemoveCurseSpell.CastDelayBase': ty
pe must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Chivalry/SacredJourney.cs:
    CS1715: Line 19: 'Server.Spells.Chivalry.SacredJourneySpell.CastDelayBase':
type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase
'
 + Spells/Fourth/ArchCure.cs:
    CS1715: Line 32: 'Server.Spells.Fourth.ArchCureSpell.CastDelayBase': type mu
st be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Necromancy/NecromancerSpell.cs:
    CS1715: Line 18: 'Server.Spells.Necromancy.NecromancerSpell.CastDelayFastSca
lar': type must be 'int' to match overridden member 'Server.Spells.Spell.CastDel
ayFastScalar'
 + Spells/Necromancy/AnimateDeadSpell.cs:
    CS1715: Line 22: 'Server.Spells.Necromancy.AnimateDeadSpell.CastDelayBase':
type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase
'
 + Spells/Necromancy/BloodOathSpell.cs:
    CS1715: Line 18: 'Server.Spells.Necromancy.BloodOathSpell.CastDelayBase': ty
pe must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Necromancy/CorpseSkin.cs:
    CS1715: Line 19: 'Server.Spells.Necromancy.CorpseSkinSpell.CastDelayBase': t
ype must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'

 + Spells/Necromancy/CurseWeapon.cs:
    CS1715: Line 18: 'Server.Spells.Necromancy.CurseWeaponSpell.CastDelayBase':
type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase
'
 + Spells/Necromancy/EvilOmen.cs:
    CS1715: Line 20: 'Server.Spells.Necromancy.EvilOmenSpell.CastDelayBase': typ
e must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Necromancy/Exorcism.cs:
    CS1715: Line 23: 'Server.Spells.Necromancy.ExorcismSpell.CastDelayBase': typ
e must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Necromancy/HorrificBeast.cs:
    CS1715: Line 19: 'Server.Spells.Necromancy.HorrificBeastSpell.CastDelayBase'
: type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBa
se'
 + Spells/Necromancy/LichForm.cs:
    CS1715: Line 20: 'Server.Spells.Necromancy.LichFormSpell.CastDelayBase': typ
e must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Necromancy/MindRot.cs:
    CS1715: Line 20: 'Server.Spells.Necromancy.MindRotSpell.CastDelayBase': type
 must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Necromancy/PainSpike.cs:
    CS1715: Line 19: 'Server.Spells.Necromancy.PainSpikeSpell.CastDelayBase': ty
pe must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Necromancy/PoisonStrike.cs:
    CS1715: Line 18: 'Server.Spells.Necromancy.PoisonStrikeSpell.CastDelayBase':
 type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBas
e'
 + Spells/Necromancy/Strangle.cs:
    CS1715: Line 19: 'Server.Spells.Necromancy.StrangleSpell.CastDelayBase': typ
e must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Necromancy/SummonFamiliar.cs:
    CS1715: Line 22: 'Server.Spells.Necromancy.SummonFamiliarSpell.CastDelayBase
': type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayB
ase'
 + Spells/Necromancy/VampiricEmbrace.cs:
    CS1715: Line 20: 'Server.Spells.Necromancy.VampiricEmbraceSpell.CastDelayBas
e': type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelay
Base'
 + Spells/Necromancy/VengefulSpirit.cs:
    CS1715: Line 21: 'Server.Spells.Necromancy.VengefulSpiritSpell.CastDelayBase
': type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayB
ase'
 + Spells/Necromancy/Wither.cs:
    CS1715: Line 20: 'Server.Spells.Necromancy.WitherSpell.CastDelayBase': type
must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Necromancy/WraithForm.cs:
    CS1715: Line 19: 'Server.Spells.Necromancy.WraithFormSpell.CastDelayBase': t
ype must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'

 + Spells/Ninjitsu/NinjaSpell.cs:
    CS1715: Line 24: 'Server.Spells.Ninjitsu.NinjaSpell.CastDelayFastScalar': ty
pe must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayFastSc
alar'
 + Spells/Ninjitsu/AnimalForm.cs:
    CS1715: Line 34: 'Server.Spells.Ninjitsu.AnimalForm.CastDelayBase': type mus
t be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Ninjitsu/MirrorImage.cs:
    CS1715: Line 52: 'Server.Spells.Ninjitsu.MirrorImage.CastDelayBase': type mu
st be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Ninjitsu/ShadowJump.cs:
    CS1715: Line 18: 'Server.Spells.Ninjitsu.Shadowjump.CastDelayBase': type mus
t be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Spellweaving/ArcaneCircle.cs:
    CS1715: Line 14: 'Server.Spells.Spellweaving.ArcaneCircleSpell.CastDelayBase
': type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayB
ase'
 + Spells/Spellweaving/AttuneWeapon.cs:
    CS1715: Line 14: 'Server.Spells.Spellweaving.AttuneWeaponSpell.CastDelayBase
': type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayB
ase'
 + Spells/Spellweaving/EssenceOfWind.cs:
    CS1715: Line 14: 'Server.Spells.Spellweaving.EssenceOfWindSpell.CastDelayBas
e': type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelay
Base'
 + Spells/Spellweaving/EtherealVoyage.cs:
    CS1715: Line 12: 'Server.Spells.Spellweaving.EtherealVoyageSpell.CastDelayBa
se': type must be 'int' to match overridden member 'Server.Spells.Spell.CastDela
yBase'
 + Spells/Spellweaving/GiftOfLife.cs:
    CS1715: Line 17: 'Server.Spells.Spellweaving.GiftOfLifeSpell.CastDelayBase':
 type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBas
e'
 + Spells/Spellweaving/GiftOfRenewal.cs:
    CS1715: Line 15: 'Server.Spells.Spellweaving.GiftOfRenewalSpell.CastDelayBas
e': type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelay
Base'
 + Spells/Spellweaving/NatureFury.cs:
    CS1715: Line 15: 'Server.Spells.Spellweaving.NatureFurySpell.CastDelayBase':
 type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBas
e'
 + Spells/Spellweaving/ReaperForm.cs:
    CS1715: Line 13: 'Server.Spells.Spellweaving.ReaperFormSpell.CastDelayBase':
 type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBas
e'
 + Spells/Spellweaving/SummonFey.cs:
    CS1715: Line 13: 'Server.Spells.Spellweaving.SummonFeySpell.CastDelayBase':
type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase
'
 + Spells/Spellweaving/SummonFiend.cs:
    CS1715: Line 13: 'Server.Spells.Spellweaving.SummonFiendSpell.CastDelayBase'
: type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBa
se'
 + Spells/Spellweaving/Thunderstorm.cs:
    CS1715: Line 14: 'Server.Spells.Spellweaving.ThunderstormSpell.CastDelayBase
': type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayB
ase'
 + Spells/Spellweaving/WordOfDeath.cs:
    CS1715: Line 14: 'Server.Spells.Spellweaving.WordOfDeathSpell.CastDelayBase'
: type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBa
se'

Thanks
 

GhostRiderGrey

Sorceror
daat99;764932 said:
**assuming you haven't modified anything**

By design the runics will drop only from elementals that were spawned from mining and not from a spawner.

They were never intended to be spawned in the wild but only as a miner advantage (these poor guys never get good loot).

If you don't have high enough mining (or a friend with high enough mining) then you shouldn't even see them in the world.

Considering most shards have skill cap then a simple miner won't be able to fight off the hard elementals and will require a fighter friend to watch his back (unless he want to die and loose everything...).

Thanks, Daat99, I appreciate the extra information. It makes sense to do it the way you have it set up.

-GhostRiderGrey
 

Lokai

Knight
cutter;765279 said:
I'm having the same problem that TalonRhein was having and since I don't see anywhere that it was actually replied to I figured I would ask.

Code:
Errors:
 + Mobiles/Animals/Mounts/Ethereals.cs:
    CS1715: Line 366: 'Server.Mobiles.EtherealMount.EtherealSpell.CastDelayFastS
calar': type must be 'int' to match overridden member 'Server.Spells.Spell.CastD
elayFastScalar'
    CS1715: Line 368: 'Server.Mobiles.EtherealMount.EtherealSpell.CastDelayBase'
: type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBa
se'
 + Spells/Base/MagerySpell.cs:
    CS1715: Line 108: 'Server.Spells.MagerySpell.CastDelayBase': type must be 'i
nt' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Mobiles/Animals/Mounts/LesserHiryu.cs:
    CS0115: Line 119: 'Server.Mobiles.LesserHiryu.GetControlChance(Server.Mobile
, bool)': no suitable method found to override
 + Mobiles/Animals/Mounts/Ridgeback.cs:
    CS0115: Line 48: 'Server.Mobiles.Ridgeback.GetControlChance(Server.Mobile, b
ool)': no suitable method found to override
 + Mobiles/Animals/Mounts/SavageRidgeback.cs:
    CS0115: Line 48: 'Server.Mobiles.SavageRidgeback.GetControlChance(Server.Mob
ile, bool)': no suitable method found to override
 + Mobiles/Animals/Mounts/ScaledSwampDragon.cs:
    CS0115: Line 47: 'Server.Mobiles.ScaledSwampDragon.GetControlChance(Server.M
obile, bool)': no suitable method found to override
 + Mobiles/Animals/Mounts/SwampDragon.cs:
    CS0115: Line 145: 'Server.Mobiles.SwampDragon.GetControlChance(Server.Mobile
, bool)': no suitable method found to override
 + Mobiles/Monsters/Misc/Melee/BladeSpirits.cs:
    CS0115: Line 17: 'Server.Mobiles.BladeSpirits.GetFightModeRanking(Server.Mob
ile, Server.Mobiles.FightMode, bool)': no suitable method found to override
 + Mobiles/Monsters/Misc/Melee/EnergyVortex.cs:
    CS0115: Line 17: 'Server.Mobiles.EnergyVortex.GetFightModeRanking(Server.Mob
ile, Server.Mobiles.FightMode, bool)': no suitable method found to override
 + Mobiles/Monsters/SE/FireBeetle.cs:
    CS0115: Line 80: 'Server.Mobiles.FireBeetle.GetControlChance(Server.Mobile,
bool)': no suitable method found to override
 + Mobiles/Vendors/NPC/Blacksmith.cs:
    CS0115: Line 125: 'Server.Mobiles.Blacksmith.OnSuccessfulBulkOrderReceive(Se
rver.Mobile)': no suitable method found to override
 + Mobiles/Vendors/NPC/Tailor.cs:
    CS0115: Line 74: 'Server.Mobiles.Tailor.OnSuccessfulBulkOrderReceive(Server.
Mobile)': no suitable method found to override
 + Mobiles/Vendors/NPC/Weaponsmith.cs:
    CS0115: Line 92: 'Server.Mobiles.Weaponsmith.OnSuccessfulBulkOrderReceive(Se
rver.Mobile)': no suitable method found to override
 + Mobiles/Vendors/NPC/Weaver.cs:
    CS0115: Line 74: 'Server.Mobiles.Weaver.OnSuccessfulBulkOrderReceive(Server.
Mobile)': no suitable method found to override
 + Mobiles/Vendors/GenericBuy.cs:
    CS0535: Line 9: 'Server.Mobiles.GenericBuyInfo' does not implement interface
 member 'Server.IBuyItemInfo.GetObject()'
 + Skills/SpiritSpeak.cs:
    CS1715: Line 87: 'Server.SkillHandlers.SpiritSpeak.SpiritSpeakSpell.CastDela
yFastScalar': type must be 'int' to match overridden member 'Server.Spells.Spell
.CastDelayFastScalar'
    CS1715: Line 88: 'Server.SkillHandlers.SpiritSpeak.SpiritSpeakSpell.CastDela
yBase': type must be 'int' to match overridden member 'Server.Spells.Spell.CastD
elayBase'
 + Spells/Bushido/SamuraiSpell.cs:
    CS1715: Line 22: 'Server.Spells.Bushido.SamuraiSpell.CastDelayFastScalar': t
ype must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayFastS
calar'
 + Spells/Bushido/Confidence.cs:
    CS1715: Line 17: 'Server.Spells.Bushido.Confidence.CastDelayBase': type must
 be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Bushido/CounterAttack.cs:
    CS1715: Line 18: 'Server.Spells.Bushido.CounterAttack.CastDelayBase': type m
ust be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Bushido/Evasion.cs:
    CS1715: Line 18: 'Server.Spells.Bushido.Evasion.CastDelayBase': type must be
 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Chivalry/CleanseByFire.cs:
    CS1715: Line 17: 'Server.Spells.Chivalry.CleanseByFireSpell.CastDelayBase':
type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase
'
 + Spells/Chivalry/CloseWounds.cs:
    CS1715: Line 18: 'Server.Spells.Chivalry.CloseWoundsSpell.CastDelayBase': ty
pe must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Chivalry/ConsecrateWeapon.cs:
    CS1715: Line 17: 'Server.Spells.Chivalry.ConsecrateWeaponSpell.CastDelayBase
': type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayB
ase'
 + Spells/Chivalry/DispelEvil.cs:
    CS1715: Line 19: 'Server.Spells.Chivalry.DispelEvilSpell.CastDelayBase': typ
e must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Chivalry/DivineFury.cs:
    CS1715: Line 17: 'Server.Spells.Chivalry.DivineFurySpell.CastDelayBase': typ
e must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Chivalry/EnemyOfOne.cs:
    CS1715: Line 19: 'Server.Spells.Chivalry.EnemyOfOneSpell.CastDelayBase': typ
e must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Chivalry/HolyLight.cs:
    CS1715: Line 17: 'Server.Spells.Chivalry.HolyLightSpell.CastDelayBase': type
 must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Chivalry/NobleSacrifice.cs:
    CS1715: Line 23: 'Server.Spells.Chivalry.NobleSacrificeSpell.CastDelayBase':
 type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBas
e'
 + Spells/Chivalry/RemoveCurse.cs:
    CS1715: Line 19: 'Server.Spells.Chivalry.RemoveCurseSpell.CastDelayBase': ty
pe must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Chivalry/SacredJourney.cs:
    CS1715: Line 19: 'Server.Spells.Chivalry.SacredJourneySpell.CastDelayBase':
type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase
'
 + Spells/Fourth/ArchCure.cs:
    CS1715: Line 32: 'Server.Spells.Fourth.ArchCureSpell.CastDelayBase': type mu
st be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Necromancy/NecromancerSpell.cs:
    CS1715: Line 18: 'Server.Spells.Necromancy.NecromancerSpell.CastDelayFastSca
lar': type must be 'int' to match overridden member 'Server.Spells.Spell.CastDel
ayFastScalar'
 + Spells/Necromancy/AnimateDeadSpell.cs:
    CS1715: Line 22: 'Server.Spells.Necromancy.AnimateDeadSpell.CastDelayBase':
type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase
'
 + Spells/Necromancy/BloodOathSpell.cs:
    CS1715: Line 18: 'Server.Spells.Necromancy.BloodOathSpell.CastDelayBase': ty
pe must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Necromancy/CorpseSkin.cs:
    CS1715: Line 19: 'Server.Spells.Necromancy.CorpseSkinSpell.CastDelayBase': t
ype must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 
 + Spells/Necromancy/CurseWeapon.cs:
    CS1715: Line 18: 'Server.Spells.Necromancy.CurseWeaponSpell.CastDelayBase':
type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase
'
 + Spells/Necromancy/EvilOmen.cs:
    CS1715: Line 20: 'Server.Spells.Necromancy.EvilOmenSpell.CastDelayBase': typ
e must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Necromancy/Exorcism.cs:
    CS1715: Line 23: 'Server.Spells.Necromancy.ExorcismSpell.CastDelayBase': typ
e must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Necromancy/HorrificBeast.cs:
    CS1715: Line 19: 'Server.Spells.Necromancy.HorrificBeastSpell.CastDelayBase'
: type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBa
se'
 + Spells/Necromancy/LichForm.cs:
    CS1715: Line 20: 'Server.Spells.Necromancy.LichFormSpell.CastDelayBase': typ
e must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Necromancy/MindRot.cs:
    CS1715: Line 20: 'Server.Spells.Necromancy.MindRotSpell.CastDelayBase': type
 must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Necromancy/PainSpike.cs:
    CS1715: Line 19: 'Server.Spells.Necromancy.PainSpikeSpell.CastDelayBase': ty
pe must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Necromancy/PoisonStrike.cs:
    CS1715: Line 18: 'Server.Spells.Necromancy.PoisonStrikeSpell.CastDelayBase':
 type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBas
e'
 + Spells/Necromancy/Strangle.cs:
    CS1715: Line 19: 'Server.Spells.Necromancy.StrangleSpell.CastDelayBase': typ
e must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Necromancy/SummonFamiliar.cs:
    CS1715: Line 22: 'Server.Spells.Necromancy.SummonFamiliarSpell.CastDelayBase
': type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayB
ase'
 + Spells/Necromancy/VampiricEmbrace.cs:
    CS1715: Line 20: 'Server.Spells.Necromancy.VampiricEmbraceSpell.CastDelayBas
e': type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelay
Base'
 + Spells/Necromancy/VengefulSpirit.cs:
    CS1715: Line 21: 'Server.Spells.Necromancy.VengefulSpiritSpell.CastDelayBase
': type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayB
ase'
 + Spells/Necromancy/Wither.cs:
    CS1715: Line 20: 'Server.Spells.Necromancy.WitherSpell.CastDelayBase': type
must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Necromancy/WraithForm.cs:
    CS1715: Line 19: 'Server.Spells.Necromancy.WraithFormSpell.CastDelayBase': t
ype must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 
 + Spells/Ninjitsu/NinjaSpell.cs:
    CS1715: Line 24: 'Server.Spells.Ninjitsu.NinjaSpell.CastDelayFastScalar': ty
pe must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayFastSc
alar'
 + Spells/Ninjitsu/AnimalForm.cs:
    CS1715: Line 34: 'Server.Spells.Ninjitsu.AnimalForm.CastDelayBase': type mus
t be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Ninjitsu/MirrorImage.cs:
    CS1715: Line 52: 'Server.Spells.Ninjitsu.MirrorImage.CastDelayBase': type mu
st be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Ninjitsu/ShadowJump.cs:
    CS1715: Line 18: 'Server.Spells.Ninjitsu.Shadowjump.CastDelayBase': type mus
t be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase'
 + Spells/Spellweaving/ArcaneCircle.cs:
    CS1715: Line 14: 'Server.Spells.Spellweaving.ArcaneCircleSpell.CastDelayBase
': type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayB
ase'
 + Spells/Spellweaving/AttuneWeapon.cs:
    CS1715: Line 14: 'Server.Spells.Spellweaving.AttuneWeaponSpell.CastDelayBase
': type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayB
ase'
 + Spells/Spellweaving/EssenceOfWind.cs:
    CS1715: Line 14: 'Server.Spells.Spellweaving.EssenceOfWindSpell.CastDelayBas
e': type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelay
Base'
 + Spells/Spellweaving/EtherealVoyage.cs:
    CS1715: Line 12: 'Server.Spells.Spellweaving.EtherealVoyageSpell.CastDelayBa
se': type must be 'int' to match overridden member 'Server.Spells.Spell.CastDela
yBase'
 + Spells/Spellweaving/GiftOfLife.cs:
    CS1715: Line 17: 'Server.Spells.Spellweaving.GiftOfLifeSpell.CastDelayBase':
 type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBas
e'
 + Spells/Spellweaving/GiftOfRenewal.cs:
    CS1715: Line 15: 'Server.Spells.Spellweaving.GiftOfRenewalSpell.CastDelayBas
e': type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelay
Base'
 + Spells/Spellweaving/NatureFury.cs:
    CS1715: Line 15: 'Server.Spells.Spellweaving.NatureFurySpell.CastDelayBase':
 type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBas
e'
 + Spells/Spellweaving/ReaperForm.cs:
    CS1715: Line 13: 'Server.Spells.Spellweaving.ReaperFormSpell.CastDelayBase':
 type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBas
e'
 + Spells/Spellweaving/SummonFey.cs:
    CS1715: Line 13: 'Server.Spells.Spellweaving.SummonFeySpell.CastDelayBase':
type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBase
'
 + Spells/Spellweaving/SummonFiend.cs:
    CS1715: Line 13: 'Server.Spells.Spellweaving.SummonFiendSpell.CastDelayBase'
: type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBa
se'
 + Spells/Spellweaving/Thunderstorm.cs:
    CS1715: Line 14: 'Server.Spells.Spellweaving.ThunderstormSpell.CastDelayBase
': type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayB
ase'
 + Spells/Spellweaving/WordOfDeath.cs:
    CS1715: Line 14: 'Server.Spells.Spellweaving.WordOfDeathSpell.CastDelayBase'
: type must be 'int' to match overridden member 'Server.Spells.Spell.CastDelayBa
se'

Thanks

Your "Spell.cs" file is not right. You have Spellweaving, so you must not be using RunUO 2.0 RC1. This release is only compatible with RC1, not SVN or RC2.
 

dadnlad

Wanderer
ok, I got past the keyring error, and the champspawn.cs error, but now I have a new problem.

The server starts up fine, new ores and such seem to exist (at least I can make them, I don't know about getting them by mining yet). But, My champ areas seem to have messed up. There is spawn there, but no alter.

What do I need to do to fix this?
 

GhostRiderGrey

Sorceror
dadnlad, is the "plaque" there for the champ (the sign which lists the level the champ is at)? If so, type this command and target the sign
Code:
 [inc z 20
This will elevate the champ as I suspect its there, just below the ground at the moment.

Hope that helps you.

-GhostRiderGrey
 
im using RC2 with SVN 297

can you possibly help with this error ?

+ Commands/HelpInfo.cs:
CS0122: Line 11: 'Server.Commands.Docs.DocCommandEntry' is inaccessible due
to its protection level
CS0122: Line 12: 'Server.Commands.Docs.CommandEntrySorter' is inaccessible d
ue to its protection level
CS0051: Line 239: Inconsistent accessibility: parameter type 'System.Collect
ions.Generic.List<Server.Commands.Docs.DocCommandEntry>' is less accessible than
method 'Server.Commands.HelpInfo.CommandListGump.CommandListGump(int, Server.Mo
bile, System.Collections.Generic.List<Server.Commands.Docs.DocCommandEntry>)'
CS0051: Line 364: Inconsistent accessibility: parameter type 'Server.Command
s.Docs.DocCommandEntry' is less accessible than method 'Server.Commands.HelpInfo
.CommandInfoGump.CommandInfoGump(Server.Commands.Docs.DocCommandEntry)'
CS0051: Line 369: Inconsistent accessibility: parameter type 'Server.Command
s.Docs.DocCommandEntry' is less accessible than method 'Server.Commands.HelpInfo
.CommandInfoGump.CommandInfoGump(Server.Commands.Docs.DocCommandEntry, int, int)
'
CS0053: Line 22: Inconsistent accessibility: property type 'System.Collectio
ns.Generic.Dictionary<string,Server.Commands.Docs.DocCommandEntry>' is less acce
ssible than property 'Server.Commands.HelpInfo.HelpInfos'
CS0053: Line 23: Inconsistent accessibility: property type 'System.Collectio
ns.Generic.List<Server.Commands.Docs.DocCommandEntry>' is less accessible than p
roperty 'Server.Commands.HelpInfo.SortedHelpInfo'
 

stryder

Wanderer
Kinslayer1964;785662 said:
can you possibly help with this error ?

+ Commands/HelpInfo.cs:
CS0122: Line 11: 'Server.Commands.Docs.DocCommandEntry' is inaccessible due
to its protection level
CS0122: Line 12: 'Server.Commands.Docs.CommandEntrySorter' is inaccessible d
ue to its protection level
CS0051: Line 239: Inconsistent accessibility: parameter type 'System.Collect
ions.Generic.List<Server.Commands.Docs.DocCommandEntry>' is less accessible than
method 'Server.Commands.HelpInfo.CommandListGump.CommandListGump(int, Server.Mo
bile, System.Collections.Generic.List<Server.Commands.Docs.DocCommandEntry>)'
CS0051: Line 364: Inconsistent accessibility: parameter type 'Server.Command
s.Docs.DocCommandEntry' is less accessible than method 'Server.Commands.HelpInfo
.CommandInfoGump.CommandInfoGump(Server.Commands.Docs.DocCommandEntry)'
CS0051: Line 369: Inconsistent accessibility: parameter type 'Server.Command
s.Docs.DocCommandEntry' is less accessible than method 'Server.Commands.HelpInfo
.CommandInfoGump.CommandInfoGump(Server.Commands.Docs.DocCommandEntry, int, int)
'
CS0053: Line 22: Inconsistent accessibility: property type 'System.Collectio
ns.Generic.Dictionary<string,Server.Commands.Docs.DocCommandEntry>' is less acce
ssible than property 'Server.Commands.HelpInfo.HelpInfos'
CS0053: Line 23: Inconsistent accessibility: property type 'System.Collectio
ns.Generic.List<Server.Commands.Docs.DocCommandEntry>' is less accessible than p
roperty 'Server.Commands.HelpInfo.SortedHelpInfo'

Getting same error with fresh install on latest server any help would be greatly appreciated?
 

daredenkol

Wanderer
I dig much place,dont find elemental!!

Hello,I install OWLR in my server.I dig much place with GargoylePixa,But ı dont find one PlatElementals..How can ı set up ?Thank you Very Much ,(Sory For My badly english)
 

Drake24

Wanderer
How do they really work?

Hi, I was reading thru the post and I saw you talking about these recipe items such as blue diamond etc. How do they work. Do I need something else than daat owtrl? Thank you, awesome package!
 

beeger

Sorceror
Errors:
+ Engines/AI/AI/BaseAI.cs:
CS0117: Line 1492: 'Server.Mobiles.BaseCreature' does not contain a definiti
on for 'GetFightModeRanking'
CS0103: Line 2491: The name 'TransformationSpellHelper' does not exist in th
e current context
CS0246: Line 2491: The type or namespace name 'EtherealVoyageSpell' could no
t be found (are you missing a using directive or an assembly reference?)
CS0117: Line 2526: 'Server.Mobiles.BaseCreature' does not contain a definiti
on for 'GetFightModeRanking'


this is the only error i am stuck on now
 

Dreadfull

Sorceror
Code:
Errors:
 + Custom/Systems/DaatCoreEdit/BaseArmor.cs:
    CS1502: Line 1742: The best overloaded method match for 'Server.Network.Equi
pmentInfo.EquipmentInfo(int, Server.Mobile, bool, Server.Network.EquipInfoAttrib
ute[])' has some invalid arguments
    CS1503: Line 1742: Argument '4': cannot convert from 'object[]' to 'Server.N
etwork.EquipInfoAttribute[]'

Script as follows.

Code:
using System;
using System.Collections;
using System.Collections.Generic;
using Server.Network;
using Server.Engines.XmlSpawner2;
using Server.Engines.Craft;
using Server.Factions;
using AMA = Server.Items.ArmorMeditationAllowance;
using AMT = Server.Items.ArmorMaterialType;
using ABT = Server.Items.ArmorBodyType;

namespace Server.Items
{
	public abstract class BaseArmor : Item, IScissorable, IFactionItem, ICraftable, IWearableDurability
	{
		#region Factions
		private FactionItem m_FactionState;

		public FactionItem FactionItemState
		{
			get{ return m_FactionState; }
			set
			{
				m_FactionState = value;

				if ( m_FactionState == null )
					Hue = CraftResources.GetHue( Resource );

				LootType = ( m_FactionState == null ? LootType.Regular : LootType.Blessed );
			}
		}
		#endregion



		/* Armor internals work differently now (Jun 19 2003)
		 * 
		 * The attributes defined below default to -1.
		 * If the value is -1, the corresponding virtual 'Aos/Old' property is used.
		 * If not, the attribute value itself is used. Here's the list:
		 *  - ArmorBase
		 *  - StrBonus
		 *  - DexBonus
		 *  - IntBonus
		 *  - StrReq
		 *  - DexReq
		 *  - IntReq
		 *  - MeditationAllowance
		 */

		// Instance values. These values must are unique to each armor piece.
		private int m_MaxHitPoints;
		private int m_HitPoints;
		private Mobile m_Crafter;
		private ArmorQuality m_Quality;
		private ArmorDurabilityLevel m_Durability;
		private ArmorProtectionLevel m_Protection;
		private CraftResource m_Resource;
		private bool m_Identified, m_PlayerConstructed;
		private int m_PhysicalBonus, m_FireBonus, m_ColdBonus, m_PoisonBonus, m_EnergyBonus;

		private AosAttributes m_AosAttributes;
		private AosArmorAttributes m_AosArmorAttributes;
		private AosSkillBonuses m_AosSkillBonuses;

		// Overridable values. These values are provided to override the defaults which get defined in the individual armor scripts.
		private int m_ArmorBase = -1;
		private int m_StrBonus = -1, m_DexBonus = -1, m_IntBonus = -1;
		private int m_StrReq = -1, m_DexReq = -1, m_IntReq = -1;
		private AMA m_Meditate = (AMA)(-1);


		public virtual bool AllowMaleWearer{ get{ return true; } }
		public virtual bool AllowFemaleWearer{ get{ return true; } }

		public abstract AMT MaterialType{ get; }

		public virtual int RevertArmorBase{ get{ return ArmorBase; } }
		public virtual int ArmorBase{ get{ return 0; } }

		public virtual AMA DefMedAllowance{ get{ return AMA.None; } }
		public virtual AMA AosMedAllowance{ get{ return DefMedAllowance; } }
		public virtual AMA OldMedAllowance{ get{ return DefMedAllowance; } }


		public virtual int AosStrBonus{ get{ return 0; } }
		public virtual int AosDexBonus{ get{ return 0; } }
		public virtual int AosIntBonus{ get{ return 0; } }
		public virtual int AosStrReq{ get{ return 0; } }
		public virtual int AosDexReq{ get{ return 0; } }
		public virtual int AosIntReq{ get{ return 0; } }


		public virtual int OldStrBonus{ get{ return 0; } }
		public virtual int OldDexBonus{ get{ return 0; } }
		public virtual int OldIntBonus{ get{ return 0; } }
		public virtual int OldStrReq{ get{ return 0; } }
		public virtual int OldDexReq{ get{ return 0; } }
		public virtual int OldIntReq{ get{ return 0; } }

		[CommandProperty( AccessLevel.GameMaster )]
		public AMA MeditationAllowance
		{
			get{ return ( m_Meditate == (AMA)(-1) ? Core.AOS ? AosMedAllowance : OldMedAllowance : m_Meditate ); }
			set{ m_Meditate = value; }
		}

		[CommandProperty( AccessLevel.GameMaster )]
		public int BaseArmorRating
		{
			get
			{
				if ( m_ArmorBase == -1 )
					return ArmorBase;
				else
					return m_ArmorBase;
			}
			set
			{ 
				m_ArmorBase = value; Invalidate(); 
			}
		}

		public double BaseArmorRatingScaled
		{
			get
			{
				return ( BaseArmorRating * ArmorScalar );
			}
		}

		public virtual double ArmorRating
		{
			get
			{
				int ar = BaseArmorRating;

				if ( m_Protection != ArmorProtectionLevel.Regular )
					ar += 10 + (5 * (int)m_Protection);

				switch ( m_Resource )
				{
					case CraftResource.DullCopper:			ar += 2; break;
					case CraftResource.ShadowIron:			ar += 4; break;
					case CraftResource.Copper:				ar += 6; break;
					case CraftResource.Bronze:				ar += 8; break;
					case CraftResource.Gold:				ar += 10; break;
					case CraftResource.Agapite:				ar += 12; break;
					case CraftResource.Verite:				ar += 14; break;
					case CraftResource.Valorite:			ar += 16; break;
					case CraftResource.Blaze:				ar += 20; break;
					case CraftResource.Ice:					ar += 24; break;
					case CraftResource.Toxic:				ar += 28; break;
					case CraftResource.Electrum:			ar += 32; break;
					case CraftResource.Platinum:			ar += 36; break;
					case CraftResource.SpinedLeather:		ar += 10; break;
					case CraftResource.HornedLeather:		ar += 13; break;
					case CraftResource.BarbedLeather:		ar += 16; break;
					case CraftResource.PolarLeather:		ar += 18; break;
					case CraftResource.SyntheticLeather:	ar += 20; break;
					case CraftResource.BlazeLeather:		ar += 22; break;
					case CraftResource.DaemonicLeather:		ar += 24; break;
					case CraftResource.ShadowLeather:		ar += 26; break;
					case CraftResource.FrostLeather:		ar += 28; break;
					case CraftResource.EtherealLeather:		ar += 30; break;
				}

				ar += -8 + (8 * (int)m_Quality);
				return ScaleArmorByDurability( ar );
			}
		}

		public double ArmorRatingScaled
		{
			get
			{
				return ( ArmorRating * ArmorScalar );
			}
		}

		[CommandProperty( AccessLevel.GameMaster )]
		public int StrBonus
		{
			get{ return ( m_StrBonus == -1 ? Core.AOS ? AosStrBonus : OldStrBonus : m_StrBonus ); }
			set{ m_StrBonus = value; InvalidateProperties(); }
		}

		[CommandProperty( AccessLevel.GameMaster )]
		public int DexBonus
		{
			get{ return ( m_DexBonus == -1 ? Core.AOS ? AosDexBonus : OldDexBonus : m_DexBonus ); }
			set{ m_DexBonus = value; InvalidateProperties(); }
		}

		[CommandProperty( AccessLevel.GameMaster )]
		public int IntBonus
		{
			get{ return ( m_IntBonus == -1 ? Core.AOS ? AosIntBonus : OldIntBonus : m_IntBonus ); }
			set{ m_IntBonus = value; InvalidateProperties(); }
		}

		[CommandProperty( AccessLevel.GameMaster )]
		public int StrRequirement
		{
			get{ return ( m_StrReq == -1 ? Core.AOS ? AosStrReq : OldStrReq : m_StrReq ); }
			set{ m_StrReq = value; InvalidateProperties(); }
		}

		[CommandProperty( AccessLevel.GameMaster )]
		public int DexRequirement
		{
			get{ return ( m_DexReq == -1 ? Core.AOS ? AosDexReq : OldDexReq : m_DexReq ); }
			set{ m_DexReq = value; InvalidateProperties(); }
		}

		[CommandProperty( AccessLevel.GameMaster )]
		public int IntRequirement
		{
			get{ return ( m_IntReq == -1 ? Core.AOS ? AosIntReq : OldIntReq : m_IntReq ); }
			set{ m_IntReq = value; InvalidateProperties(); }
		}

		[CommandProperty( AccessLevel.GameMaster )]
		public bool Identified
		{
			get{ return m_Identified; }
			set{ m_Identified = value; InvalidateProperties(); }
		}

		[CommandProperty( AccessLevel.GameMaster )]
		public bool PlayerConstructed
		{
			get{ return m_PlayerConstructed; }
			set{ m_PlayerConstructed = value; }
		}

		[CommandProperty( AccessLevel.GameMaster )]
		public CraftResource Resource
		{
			get
			{
				return m_Resource;
			}
			set
			{
				if ( m_Resource != value )
				{
					UnscaleDurability();

					m_Resource = value;
					Hue = CraftResources.GetHue( m_Resource );

					Invalidate();
					InvalidateProperties();

					if ( Parent is Mobile )
						((Mobile)Parent).UpdateResistances();

					ScaleDurability();
				}
			}
		}

		public virtual double ArmorScalar
		{
			get
			{
				int pos = (int)BodyPosition;

				if ( pos >= 0 && pos < m_ArmorScalars.Length )
					return m_ArmorScalars[pos];

				return 1.0;
			}
		}

		[CommandProperty( AccessLevel.GameMaster )]
		public int MaxHitPoints
		{
			get{ return m_MaxHitPoints; }
			set{ m_MaxHitPoints = value; InvalidateProperties(); }
		}

		[CommandProperty( AccessLevel.GameMaster )]
		public int HitPoints
		{
			get 
			{
				return m_HitPoints;
			}
			set 
			{
				if ( value != m_HitPoints && MaxHitPoints > 0 )
				{
					m_HitPoints = value;

					if ( m_HitPoints < 0 )
						Delete();
					else if ( m_HitPoints > MaxHitPoints )
						m_HitPoints = MaxHitPoints;

					InvalidateProperties();
				}
			}
		}


		[CommandProperty( AccessLevel.GameMaster )]
		public Mobile Crafter
		{
			get{ return m_Crafter; }
			set{ m_Crafter = value; InvalidateProperties(); }
		}

		
		[CommandProperty( AccessLevel.GameMaster )]
		public ArmorQuality Quality
		{
			get{ return m_Quality; }
			set{ UnscaleDurability(); m_Quality = value; Invalidate(); InvalidateProperties(); ScaleDurability(); }
		}

		[CommandProperty( AccessLevel.GameMaster )]
		public ArmorDurabilityLevel Durability
		{
			get{ return m_Durability; }
			set{ UnscaleDurability(); m_Durability = value; ScaleDurability(); InvalidateProperties(); }
		}

		public virtual int ArtifactRarity
		{
			get{ return 0; }
		}

		[CommandProperty( AccessLevel.GameMaster )]
		public ArmorProtectionLevel ProtectionLevel
		{
			get
			{
				return m_Protection;
			}
			set
			{
				if ( m_Protection != value )
				{
					m_Protection = value;

					Invalidate();
					InvalidateProperties();

					if ( Parent is Mobile )
						((Mobile)Parent).UpdateResistances();
				}
			}
		}

		[CommandProperty( AccessLevel.GameMaster )]
		public AosAttributes Attributes
		{
			get{ return m_AosAttributes; }
			set{}
		}

		[CommandProperty( AccessLevel.GameMaster )]
		public AosArmorAttributes ArmorAttributes
		{
			get{ return m_AosArmorAttributes; }
			set{}
		}

		[CommandProperty( AccessLevel.GameMaster )]
		public AosSkillBonuses SkillBonuses
		{
			get{ return m_AosSkillBonuses; }
			set{}
		}

		public int ComputeStatReq( StatType type )
		{
			int v;

			if ( type == StatType.Str )
				v = StrRequirement;
			else if ( type == StatType.Dex )
				v = DexRequirement;
			else
				v = IntRequirement;

			return AOS.Scale( v, 100 - GetLowerStatReq() );
		}

		public int ComputeStatBonus( StatType type )
		{
			if ( type == StatType.Str )
				return StrBonus + Attributes.BonusStr;
			else if ( type == StatType.Dex )
				return DexBonus + Attributes.BonusDex;
			else
				return IntBonus + Attributes.BonusInt;
		}

		[CommandProperty( AccessLevel.GameMaster )]
		public int PhysicalBonus{ get{ return m_PhysicalBonus; } set{ m_PhysicalBonus = value; InvalidateProperties(); } }

		[CommandProperty( AccessLevel.GameMaster )]
		public int FireBonus{ get{ return m_FireBonus; } set{ m_FireBonus = value; InvalidateProperties(); } }

		[CommandProperty( AccessLevel.GameMaster )]
		public int ColdBonus{ get{ return m_ColdBonus; } set{ m_ColdBonus = value; InvalidateProperties(); } }

		[CommandProperty( AccessLevel.GameMaster )]
		public int PoisonBonus{ get{ return m_PoisonBonus; } set{ m_PoisonBonus = value; InvalidateProperties(); } }

		[CommandProperty( AccessLevel.GameMaster )]
		public int EnergyBonus{ get{ return m_EnergyBonus; } set{ m_EnergyBonus = value; InvalidateProperties(); } }

		public virtual int BasePhysicalResistance{ get{ return 0; } }
		public virtual int BaseFireResistance{ get{ return 0; } }
		public virtual int BaseColdResistance{ get{ return 0; } }
		public virtual int BasePoisonResistance{ get{ return 0; } }
		public virtual int BaseEnergyResistance{ get{ return 0; } }

		//daat99 make resistances to save
		private int m_PhysicalResistance, m_FireResistance, m_ColdResistance, m_PoisonResistance, m_EnergyResistance;

		public override int PhysicalResistance
		{ 
			get
			{ 
				if (m_PhysicalResistance != 0)
					return m_PhysicalResistance;
				else
					return BasePhysicalResistance + GetProtOffset() + GetResourceAttrs().ArmorPhysicalResist + m_PhysicalBonus; 
			} 
		}
		
		public override int FireResistance
		{ 
			get
			{
				if (m_FireResistance != 0)
					return m_FireResistance;
				else
					return BaseFireResistance + GetProtOffset() + GetResourceAttrs().ArmorFireResist + m_FireBonus; 
			} 
		}
		
		public override int ColdResistance
		{ 
			get
			{ 
				if (m_ColdResistance != 0)
					return m_ColdResistance;
				else
					return BaseColdResistance + GetProtOffset() + GetResourceAttrs().ArmorColdResist + m_ColdBonus; 
			} 
		}
		
		public override int PoisonResistance
		{ 
			get
			{ 
				if (m_PoisonResistance != 0)
					return m_PoisonResistance;
				else
					return BasePoisonResistance + GetProtOffset() + GetResourceAttrs().ArmorPoisonResist + m_PoisonBonus; 
			} 
		}
		
		public override int EnergyResistance
		{ 
			get
			{ 
				if (m_EnergyResistance != 0)
					return m_EnergyResistance;
				else
					return BaseEnergyResistance + GetProtOffset() + GetResourceAttrs().ArmorEnergyResist + m_EnergyBonus; 
			} 
		}

		public virtual int InitMinHits{ get{ return 0; } }
		public virtual int InitMaxHits{ get{ return 0; } }

		[CommandProperty( AccessLevel.GameMaster )]
		public ArmorBodyType BodyPosition
		{
			get
			{
				switch ( this.Layer )
				{
					default:
					case Layer.Neck:		return ArmorBodyType.Gorget;
					case Layer.TwoHanded:	return ArmorBodyType.Shield;
					case Layer.Gloves:		return ArmorBodyType.Gloves;
					case Layer.Helm:		return ArmorBodyType.Helmet;
					case Layer.Arms:		return ArmorBodyType.Arms;

					case Layer.InnerLegs:
					case Layer.OuterLegs:
					case Layer.Pants:		return ArmorBodyType.Legs;

					case Layer.InnerTorso:
					case Layer.OuterTorso:
					case Layer.Shirt:		return ArmorBodyType.Chest;
				}
			}
		}

		public void DistributeBonuses( int amount )
		{
			for ( int i = 0; i < amount; ++i )
			{
				switch ( Utility.Random( 5 ) )
				{
					case 0: ++m_PhysicalBonus; break;
					case 1: ++m_FireBonus; break;
					case 2: ++m_ColdBonus; break;
					case 3: ++m_PoisonBonus; break;
					case 4: ++m_EnergyBonus; break;
				}
			}

			InvalidateProperties();
		}

		public CraftAttributeInfo GetResourceAttrs()
		{
			CraftResourceInfo info = CraftResources.GetInfo( m_Resource );

			if ( info == null )
				return CraftAttributeInfo.Blank;

			return info.AttributeInfo;
		}

		public int GetProtOffset()
		{
			switch ( m_Protection )
			{
				case ArmorProtectionLevel.Guarding: return 1;
				case ArmorProtectionLevel.Hardening: return 2;
				case ArmorProtectionLevel.Fortification: return 3;
				case ArmorProtectionLevel.Invulnerability: return 4;
			}

			return 0;
		}

		public void UnscaleDurability()
		{
			int scale = 100 + GetDurabilityBonus();

			m_HitPoints = ((m_HitPoints * 100) + (scale - 1)) / scale;
			m_MaxHitPoints = ((m_MaxHitPoints * 100) + (scale - 1)) / scale;
			InvalidateProperties();
		}

		public void ScaleDurability()
		{
			int scale = 100 + GetDurabilityBonus();

			m_HitPoints = ((m_HitPoints * scale) + 99) / 100;
			m_MaxHitPoints = ((m_MaxHitPoints * scale) + 99) / 100;
			InvalidateProperties();
		}

		public int GetDurabilityBonus()
		{
			int bonus = 0;

			if ( m_Quality == ArmorQuality.Exceptional )
				bonus += 20;

			switch ( m_Durability )
			{
				case ArmorDurabilityLevel.Durable: bonus += 20; break;
				case ArmorDurabilityLevel.Substantial: bonus += 50; break;
				case ArmorDurabilityLevel.Massive: bonus += 70; break;
				case ArmorDurabilityLevel.Fortified: bonus += 100; break;
				case ArmorDurabilityLevel.Indestructible: bonus += 120; break;
			}

			if ( Core.AOS )
			{
				bonus += m_AosArmorAttributes.DurabilityBonus;

				CraftResourceInfo resInfo = CraftResources.GetInfo( m_Resource );
				CraftAttributeInfo attrInfo = null;

				if ( resInfo != null )
					attrInfo = resInfo.AttributeInfo;

				if ( attrInfo != null )
					bonus += attrInfo.ArmorDurability;
			}

			return bonus;
		}

		public bool Scissor( Mobile from, Scissors scissors )
		{
			if ( !IsChildOf( from.Backpack ) )
			{
				from.SendLocalizedMessage( 502437 ); // Items you wish to cut must be in your backpack.
				return false;
			}

			CraftSystem system = DefTailoring.CraftSystem;

			CraftItem item = system.CraftItems.SearchFor( GetType() );

			if ( item != null && item.Ressources.Count == 1 && item.Ressources.GetAt( 0 ).Amount >= 2 )
			{
				try
				{
					Item res = (Item)Activator.CreateInstance( CraftResources.GetInfo( m_Resource ).ResourceTypes[0] );

					int amount = 1;
					amount = m_PlayerConstructed ? (item.Ressources.GetAt( 0 ).Amount / 2) : 1;
					if (scissors is ColoredScissors)
					{
						amount *= 2;
						ColoredScissors cs = scissors as ColoredScissors;
						cs.UsesRemaining -= 1;
					}
					ScissorHelper( from, res, amount );
					return true;
				}
				catch
				{
				}
			}

			from.SendLocalizedMessage( 502440 ); // Scissors can not be used on that to produce anything.
			return false;
		}

		private static double[] m_ArmorScalars = { 0.07, 0.07, 0.14, 0.15, 0.22, 0.35 };

		public static double[] ArmorScalars
		{
			get
			{
				return m_ArmorScalars;
			}
			set
			{
				m_ArmorScalars = value;
			}
		}

		public static void ValidateMobile( Mobile m )
		{
			for ( int i = m.Items.Count - 1; i >= 0; --i )
			{
				if ( i >= m.Items.Count )
					continue;

				Item item = (Item)m.Items[i];

				if ( item is BaseArmor )
				{
					BaseArmor armor = (BaseArmor)item;

					if( armor.RequiredRace != null && m.Race != armor.RequiredRace )
					{
						if( armor.RequiredRace == Race.Elf )
							m.SendLocalizedMessage( 1072203 ); // Only Elves may use this.
						else
							m.SendMessage( "Only {0} may use this.", armor.RequiredRace.PluralName );

						m.AddToBackpack( armor );
					}
					else if ( !armor.AllowMaleWearer && m.Body.IsMale && m.AccessLevel < AccessLevel.GameMaster )
					{
						if ( armor.AllowFemaleWearer )
							m.SendLocalizedMessage( 1010388 ); // Only females can wear this.
						else
							m.SendMessage( "You may not wear this." );

						m.AddToBackpack( armor );
					}
					else if ( !armor.AllowFemaleWearer && m.Body.IsFemale && m.AccessLevel < AccessLevel.GameMaster )
					{
						if ( armor.AllowMaleWearer )
							m.SendMessage( "Only males can wear this." );
						else
							m.SendMessage( "You may not wear this." );

						m.AddToBackpack( armor );
					}
				}
			}
		}

		public int GetLowerStatReq()
		{
			if ( !Core.AOS )
				return 0;

			int v = m_AosArmorAttributes.LowerStatReq;

			CraftResourceInfo info = CraftResources.GetInfo( m_Resource );

			if ( info != null )
			{
				CraftAttributeInfo attrInfo = info.AttributeInfo;

				if ( attrInfo != null )
					v += attrInfo.ArmorLowerRequirements;
			}

			if ( v > 100 )
				v = 100;

			return v;
		}

		public override void OnAdded( object parent )
		{
			if ( parent is Mobile )
			{
				Mobile from = (Mobile)parent;

				if ( Core.AOS )
					m_AosSkillBonuses.AddTo( from );

				from.Delta( MobileDelta.Armor ); // Tell them armor rating has changed
			}
		}

		public virtual double ScaleArmorByDurability( double armor )
		{
			int scale = 100;

			if ( m_MaxHitPoints > 0 && m_HitPoints < m_MaxHitPoints )
				scale = 50 + ((50 * m_HitPoints) / m_MaxHitPoints);

			return ( armor * scale ) / 100;
		}

		protected void Invalidate()
		{
			if ( Parent is Mobile )
				((Mobile)Parent).Delta( MobileDelta.Armor ); // Tell them armor rating has changed
		}

		public BaseArmor( Serial serial ) :  base( serial )
		{
		}

		private static void SetSaveFlag( ref SaveFlag flags, SaveFlag toSet, bool setIf )
		{
			if ( setIf )
				flags |= toSet;
		}

		private static bool GetSaveFlag( SaveFlag flags, SaveFlag toGet )
		{
			return ( (flags & toGet) != 0 );
		}

		[Flags]
		private enum SaveFlag
		{
			None				= 0x00000000,
			Attributes			= 0x00000001,
			ArmorAttributes		= 0x00000002,
			PhysicalBonus		= 0x00000004,
			FireBonus			= 0x00000008,
			ColdBonus			= 0x00000010,
			PoisonBonus			= 0x00000020,
			EnergyBonus			= 0x00000040,
			Identified			= 0x00000080,
			MaxHitPoints		= 0x00000100,
			HitPoints			= 0x00000200,
			Crafter				= 0x00000400,
			Quality				= 0x00000800,
			Durability			= 0x00001000,
			Protection			= 0x00002000,
			Resource			= 0x00004000,
			BaseArmor			= 0x00008000,
			StrBonus			= 0x00010000,
			DexBonus			= 0x00020000,
			IntBonus			= 0x00040000,
			StrReq				= 0x00080000,
			DexReq				= 0x00100000,
			IntReq				= 0x00200000,
			MedAllowance		= 0x00400000,
			SkillBonuses		= 0x00800000,
			PlayerConstructed	= 0x01000000
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 8 ); // version

			//version 8
			writer.WriteEncodedInt( (int) PhysicalResistance );
			writer.WriteEncodedInt( (int) FireResistance );
			writer.WriteEncodedInt( (int) ColdResistance );
			writer.WriteEncodedInt( (int) PoisonResistance );
			writer.WriteEncodedInt( (int) EnergyResistance );
			//end version 8
			
			//version 7
			SaveFlag flags = SaveFlag.None;

			SetSaveFlag( ref flags, SaveFlag.Attributes,		!m_AosAttributes.IsEmpty );
			SetSaveFlag( ref flags, SaveFlag.ArmorAttributes,	!m_AosArmorAttributes.IsEmpty );
			SetSaveFlag( ref flags, SaveFlag.PhysicalBonus,		m_PhysicalBonus != 0 );
			SetSaveFlag( ref flags, SaveFlag.FireBonus,			m_FireBonus != 0 );
			SetSaveFlag( ref flags, SaveFlag.ColdBonus,			m_ColdBonus != 0 );
			SetSaveFlag( ref flags, SaveFlag.PoisonBonus,		m_PoisonBonus != 0 );
			SetSaveFlag( ref flags, SaveFlag.EnergyBonus,		m_EnergyBonus != 0 );
			SetSaveFlag( ref flags, SaveFlag.Identified,		m_Identified != false );
			SetSaveFlag( ref flags, SaveFlag.MaxHitPoints,		m_MaxHitPoints != 0 );
			SetSaveFlag( ref flags, SaveFlag.HitPoints,			m_HitPoints != 0 );
			SetSaveFlag( ref flags, SaveFlag.Crafter,			m_Crafter != null );
			SetSaveFlag( ref flags, SaveFlag.Quality,			m_Quality != ArmorQuality.Regular );
			SetSaveFlag( ref flags, SaveFlag.Durability,		m_Durability != ArmorDurabilityLevel.Regular );
			SetSaveFlag( ref flags, SaveFlag.Protection,		m_Protection != ArmorProtectionLevel.Regular );
			SetSaveFlag( ref flags, SaveFlag.Resource,			m_Resource != DefaultResource );
			SetSaveFlag( ref flags, SaveFlag.BaseArmor,			m_ArmorBase != -1 );
			SetSaveFlag( ref flags, SaveFlag.StrBonus,			m_StrBonus != -1 );
			SetSaveFlag( ref flags, SaveFlag.DexBonus,			m_DexBonus != -1 );
			SetSaveFlag( ref flags, SaveFlag.IntBonus,			m_IntBonus != -1 );
			SetSaveFlag( ref flags, SaveFlag.StrReq,			m_StrReq != -1 );
			SetSaveFlag( ref flags, SaveFlag.DexReq,			m_DexReq != -1 );
			SetSaveFlag( ref flags, SaveFlag.IntReq,			m_IntReq != -1 );
			SetSaveFlag( ref flags, SaveFlag.MedAllowance,		m_Meditate != (AMA)(-1) );
			SetSaveFlag( ref flags, SaveFlag.SkillBonuses,		!m_AosSkillBonuses.IsEmpty );
			SetSaveFlag( ref flags, SaveFlag.PlayerConstructed,	m_PlayerConstructed != false );

			writer.WriteEncodedInt( (int) flags );

			if ( GetSaveFlag( flags, SaveFlag.Attributes ) )
				m_AosAttributes.Serialize( writer );

			if ( GetSaveFlag( flags, SaveFlag.ArmorAttributes ) )
				m_AosArmorAttributes.Serialize( writer );

			if ( GetSaveFlag( flags, SaveFlag.PhysicalBonus ) )
				writer.WriteEncodedInt( (int) m_PhysicalBonus );

			if ( GetSaveFlag( flags, SaveFlag.FireBonus ) )
				writer.WriteEncodedInt( (int) m_FireBonus );

			if ( GetSaveFlag( flags, SaveFlag.ColdBonus ) )
				writer.WriteEncodedInt( (int) m_ColdBonus );

			if ( GetSaveFlag( flags, SaveFlag.PoisonBonus ) )
				writer.WriteEncodedInt( (int) m_PoisonBonus );

			if ( GetSaveFlag( flags, SaveFlag.EnergyBonus ) )
				writer.WriteEncodedInt( (int) m_EnergyBonus );

			if ( GetSaveFlag( flags, SaveFlag.MaxHitPoints ) )
				writer.WriteEncodedInt( (int) m_MaxHitPoints );

			if ( GetSaveFlag( flags, SaveFlag.HitPoints ) )
				writer.WriteEncodedInt( (int) m_HitPoints );

			if ( GetSaveFlag( flags, SaveFlag.Crafter ) )
				writer.Write( (Mobile) m_Crafter );

			if ( GetSaveFlag( flags, SaveFlag.Quality ) )
				writer.WriteEncodedInt( (int) m_Quality );

			if ( GetSaveFlag( flags, SaveFlag.Durability ) )
				writer.WriteEncodedInt( (int) m_Durability );

			if ( GetSaveFlag( flags, SaveFlag.Protection ) )
				writer.WriteEncodedInt( (int) m_Protection );

			if ( GetSaveFlag( flags, SaveFlag.Resource ) )
				writer.WriteEncodedInt( (int) m_Resource );

			if ( GetSaveFlag( flags, SaveFlag.BaseArmor ) )
				writer.WriteEncodedInt( (int) m_ArmorBase );

			if ( GetSaveFlag( flags, SaveFlag.StrBonus ) )
				writer.WriteEncodedInt( (int) m_StrBonus );

			if ( GetSaveFlag( flags, SaveFlag.DexBonus ) )
				writer.WriteEncodedInt( (int) m_DexBonus );

			if ( GetSaveFlag( flags, SaveFlag.IntBonus ) )
				writer.WriteEncodedInt( (int) m_IntBonus );

			if ( GetSaveFlag( flags, SaveFlag.StrReq ) )
				writer.WriteEncodedInt( (int) m_StrReq );

			if ( GetSaveFlag( flags, SaveFlag.DexReq ) )
				writer.WriteEncodedInt( (int) m_DexReq );

			if ( GetSaveFlag( flags, SaveFlag.IntReq ) )
				writer.WriteEncodedInt( (int) m_IntReq );

			if ( GetSaveFlag( flags, SaveFlag.MedAllowance ) )
				writer.WriteEncodedInt( (int) m_Meditate );

			if ( GetSaveFlag( flags, SaveFlag.SkillBonuses ) )
				m_AosSkillBonuses.Serialize( writer );
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();

			switch ( version )
			{
				case 8:
				{
					m_PhysicalResistance = reader.ReadEncodedInt();
					m_FireResistance = reader.ReadEncodedInt();
					m_ColdResistance = reader.ReadEncodedInt();
					m_PoisonResistance = reader.ReadEncodedInt();
					m_EnergyResistance = reader.ReadEncodedInt();
					goto case 7;
				}
				case 7:
				case 6:
				case 5:
				{
					SaveFlag flags = (SaveFlag)reader.ReadEncodedInt();

					if ( GetSaveFlag( flags, SaveFlag.Attributes ) )
						m_AosAttributes = new AosAttributes( this, reader );
					else
						m_AosAttributes = new AosAttributes( this );

					if ( GetSaveFlag( flags, SaveFlag.ArmorAttributes ) )
						m_AosArmorAttributes = new AosArmorAttributes( this, reader );
					else
						m_AosArmorAttributes = new AosArmorAttributes( this );

					if ( GetSaveFlag( flags, SaveFlag.PhysicalBonus ) )
						m_PhysicalBonus = reader.ReadEncodedInt();

					if ( GetSaveFlag( flags, SaveFlag.FireBonus ) )
						m_FireBonus = reader.ReadEncodedInt();

					if ( GetSaveFlag( flags, SaveFlag.ColdBonus ) )
						m_ColdBonus = reader.ReadEncodedInt();

					if ( GetSaveFlag( flags, SaveFlag.PoisonBonus ) )
						m_PoisonBonus = reader.ReadEncodedInt();

					if ( GetSaveFlag( flags, SaveFlag.EnergyBonus ) )
						m_EnergyBonus = reader.ReadEncodedInt();

					if ( GetSaveFlag( flags, SaveFlag.Identified ) )
						m_Identified = ( version >= 7 || reader.ReadBool() );

					if ( GetSaveFlag( flags, SaveFlag.MaxHitPoints ) )
						m_MaxHitPoints = reader.ReadEncodedInt();

					if ( GetSaveFlag( flags, SaveFlag.HitPoints ) )
						m_HitPoints = reader.ReadEncodedInt();

					if ( GetSaveFlag( flags, SaveFlag.Crafter ) )
						m_Crafter = reader.ReadMobile();

					if ( GetSaveFlag( flags, SaveFlag.Quality ) )
						m_Quality = (ArmorQuality)reader.ReadEncodedInt();
					else
						m_Quality = ArmorQuality.Regular;

					if ( version == 5 && m_Quality == ArmorQuality.Low )
						m_Quality = ArmorQuality.Regular;

					if ( GetSaveFlag( flags, SaveFlag.Durability ) )
					{
						m_Durability = (ArmorDurabilityLevel)reader.ReadEncodedInt();

						if ( m_Durability > ArmorDurabilityLevel.Indestructible )
							m_Durability = ArmorDurabilityLevel.Durable;
					}

					if ( GetSaveFlag( flags, SaveFlag.Protection ) )
					{
						m_Protection = (ArmorProtectionLevel)reader.ReadEncodedInt();

						if ( m_Protection > ArmorProtectionLevel.Invulnerability )
							m_Protection = ArmorProtectionLevel.Defense;
					}

					if ( GetSaveFlag( flags, SaveFlag.Resource ) )
						m_Resource = (CraftResource)reader.ReadEncodedInt();
					else
						m_Resource = DefaultResource;

					if ( m_Resource == CraftResource.None )
						m_Resource = DefaultResource;

					if ( GetSaveFlag( flags, SaveFlag.BaseArmor ) )
						m_ArmorBase = reader.ReadEncodedInt();
					else
						m_ArmorBase = -1;

					if ( GetSaveFlag( flags, SaveFlag.StrBonus ) )
						m_StrBonus = reader.ReadEncodedInt();
					else
						m_StrBonus = -1;

					if ( GetSaveFlag( flags, SaveFlag.DexBonus ) )
						m_DexBonus = reader.ReadEncodedInt();
					else
						m_DexBonus = -1;

					if ( GetSaveFlag( flags, SaveFlag.IntBonus ) )
						m_IntBonus = reader.ReadEncodedInt();
					else
						m_IntBonus = -1;

					if ( GetSaveFlag( flags, SaveFlag.StrReq ) )
						m_StrReq = reader.ReadEncodedInt();
					else
						m_StrReq = -1;

					if ( GetSaveFlag( flags, SaveFlag.DexReq ) )
						m_DexReq = reader.ReadEncodedInt();
					else
						m_DexReq = -1;

					if ( GetSaveFlag( flags, SaveFlag.IntReq ) )
						m_IntReq = reader.ReadEncodedInt();
					else
						m_IntReq = -1;

					if ( GetSaveFlag( flags, SaveFlag.MedAllowance ) )
						m_Meditate = (AMA)reader.ReadEncodedInt();
					else
						m_Meditate = (AMA)(-1);

					if ( GetSaveFlag( flags, SaveFlag.SkillBonuses ) )
						m_AosSkillBonuses = new AosSkillBonuses( this, reader );

					if ( GetSaveFlag( flags, SaveFlag.PlayerConstructed ) )
						m_PlayerConstructed = true;

					break;
				}
				case 4:
				{
					m_AosAttributes = new AosAttributes( this, reader );
					m_AosArmorAttributes = new AosArmorAttributes( this, reader );
					goto case 3;
				}
				case 3:
				{
					m_PhysicalBonus = reader.ReadInt();
					m_FireBonus = reader.ReadInt();
					m_ColdBonus = reader.ReadInt();
					m_PoisonBonus = reader.ReadInt();
					m_EnergyBonus = reader.ReadInt();
					goto case 2;
				}
				case 2:
				case 1:
				{
					m_Identified = reader.ReadBool();
					goto case 0;
				}
				case 0:
				{
					m_ArmorBase = reader.ReadInt();
					m_MaxHitPoints = reader.ReadInt();
					m_HitPoints = reader.ReadInt();
					m_Crafter = reader.ReadMobile();
					m_Quality = (ArmorQuality)reader.ReadInt();
					m_Durability = (ArmorDurabilityLevel)reader.ReadInt();
					m_Protection = (ArmorProtectionLevel)reader.ReadInt();

					AMT mat = (AMT)reader.ReadInt();

					if ( m_ArmorBase == RevertArmorBase )
						m_ArmorBase = -1;

					/*m_BodyPos = (ArmorBodyType)*/reader.ReadInt();

					if ( version < 4 )
					{
						m_AosAttributes = new AosAttributes( this );
						m_AosArmorAttributes = new AosArmorAttributes( this );
					}

					if ( version < 3 && m_Quality == ArmorQuality.Exceptional )
						DistributeBonuses( 6 );

					if ( version >= 2 )
					{
						m_Resource = (CraftResource)reader.ReadInt();
					}
					else
					{
						OreInfo info;

						switch ( reader.ReadInt() )
						{
							default:
							case 0: info = OreInfo.Iron; break;
							case 1: info = OreInfo.DullCopper; break;
							case 2: info = OreInfo.ShadowIron; break;
							case 3: info = OreInfo.Copper; break;
							case 4: info = OreInfo.Bronze; break;
							case 5: info = OreInfo.Gold; break;
							case 6: info = OreInfo.Agapite; break;
							case 7: info = OreInfo.Verite; break;
							case 8: info = OreInfo.Valorite; break;
							case 9: info = OreInfo.Blaze; break;
							case 10: info = OreInfo.Ice; break;
							case 11: info = OreInfo.Toxic; break;
							case 12: info = OreInfo.Electrum; break;
							case 13: info = OreInfo.Platinum; break;
						}

						m_Resource = CraftResources.GetFromOreInfo( info, mat );
					}

					m_StrBonus = reader.ReadInt();
					m_DexBonus = reader.ReadInt();
					m_IntBonus = reader.ReadInt();
					m_StrReq = reader.ReadInt();
					m_DexReq = reader.ReadInt();
					m_IntReq = reader.ReadInt();

					if ( m_StrBonus == OldStrBonus )
						m_StrBonus = -1;

					if ( m_DexBonus == OldDexBonus )
						m_DexBonus = -1;

					if ( m_IntBonus == OldIntBonus )
						m_IntBonus = -1;

					if ( m_StrReq == OldStrReq )
						m_StrReq = -1;

					if ( m_DexReq == OldDexReq )
						m_DexReq = -1;

					if ( m_IntReq == OldIntReq )
						m_IntReq = -1;

					m_Meditate = (AMA)reader.ReadInt();

					if ( m_Meditate == OldMedAllowance )
						m_Meditate = (AMA)(-1);

					if ( m_Resource == CraftResource.None )
					{
						if ( mat == ArmorMaterialType.Studded || mat == ArmorMaterialType.Leather )
							m_Resource = CraftResource.RegularLeather;
						else if ( mat == ArmorMaterialType.Spined )
							m_Resource = CraftResource.SpinedLeather;
						else if ( mat == ArmorMaterialType.Horned )
							m_Resource = CraftResource.HornedLeather;
						else if ( mat == ArmorMaterialType.Barbed )
							m_Resource = CraftResource.BarbedLeather;
						else if ( mat == ArmorMaterialType.Polar )
							m_Resource = CraftResource.PolarLeather;
						else if ( mat == ArmorMaterialType.Synthetic )
							m_Resource = CraftResource.SyntheticLeather;
						else if ( mat == ArmorMaterialType.BlazeL )
							m_Resource = CraftResource.BlazeLeather;
						else if ( mat == ArmorMaterialType.Daemonic )
							m_Resource = CraftResource.DaemonicLeather;
						else if ( mat == ArmorMaterialType.Shadow )
							m_Resource = CraftResource.ShadowLeather;
						else if ( mat == ArmorMaterialType.Frost )
							m_Resource = CraftResource.FrostLeather;
						else if ( mat == ArmorMaterialType.Ethereal )
							m_Resource = CraftResource.EtherealLeather;
						else
							m_Resource = CraftResource.Iron;
					}

					if ( m_MaxHitPoints == 0 && m_HitPoints == 0 )
						m_HitPoints = m_MaxHitPoints = Utility.RandomMinMax( InitMinHits, InitMaxHits );

					break;
				}
			}

			if ( m_AosSkillBonuses == null )
				m_AosSkillBonuses = new AosSkillBonuses( this );

			if ( Core.AOS && Parent is Mobile )
				m_AosSkillBonuses.AddTo( (Mobile)Parent );

			int strBonus = ComputeStatBonus( StatType.Str );
			int dexBonus = ComputeStatBonus( StatType.Dex );
			int intBonus = ComputeStatBonus( StatType.Int );

			if ( Parent is Mobile && (strBonus != 0 || dexBonus != 0 || intBonus != 0) )
			{
				Mobile m = (Mobile)Parent;

				string modName = Serial.ToString();

				if ( strBonus != 0 )
					m.AddStatMod( new StatMod( StatType.Str, modName + "Str", strBonus, TimeSpan.Zero ) );

				if ( dexBonus != 0 )
					m.AddStatMod( new StatMod( StatType.Dex, modName + "Dex", dexBonus, TimeSpan.Zero ) );

				if ( intBonus != 0 )
					m.AddStatMod( new StatMod( StatType.Int, modName + "Int", intBonus, TimeSpan.Zero ) );
			}

			if ( Parent is Mobile )
				((Mobile)Parent).CheckStatTimers();

			if ( version < 7 )
				m_PlayerConstructed = true; // we don't know, so, assume it's crafted
		}

		public virtual CraftResource DefaultResource{ get{ return CraftResource.Iron; } }

		public BaseArmor( int itemID ) :  base( itemID )
		{
			m_Quality = ArmorQuality.Regular;
			m_Durability = ArmorDurabilityLevel.Regular;
			m_Crafter = null;

			m_Resource = DefaultResource;
			Hue = CraftResources.GetHue( m_Resource );

			m_HitPoints = m_MaxHitPoints = Utility.RandomMinMax( InitMinHits, InitMaxHits );

			this.Layer = (Layer)ItemData.Quality;

			m_AosAttributes = new AosAttributes( this );
			m_AosArmorAttributes = new AosArmorAttributes( this );
            m_AosSkillBonuses = new AosSkillBonuses(this);

            // mod to randomly add sockets and socketability features to armor. These settings will yield
            // 2% drop rate of socketed/socketable items
            // 0.1% chance of 5 sockets
            // 0.5% of 4 sockets
            // 3% chance of 3 sockets
            // 15% chance of 2 sockets
            // 50% chance of 1 socket
            // the remainder will be 0 socket (31.4% in this case)
            // uncomment the next line to prevent artifacts from being socketed
            // if(ArtifactRarity == 0)
            XmlSockets.ConfigureRandom(this, 2.0, 0.1, 0.5, 3.0, 15.0, 50.0);
		}

		public override bool AllowSecureTrade( Mobile from, Mobile to, Mobile newOwner, bool accepted )
		{
			if ( !Ethics.Ethic.CheckTrade( from, to, newOwner, this ) )
				return false;

			return base.AllowSecureTrade( from, to, newOwner, accepted );
		}

		public virtual Race RequiredRace { get { return null; } }

		public override bool CanEquip( Mobile from )
		{
			if( !Ethics.Ethic.CheckEquip( from, this ) )
				return false;

			if( from.AccessLevel < AccessLevel.GameMaster )
			{
				if( RequiredRace != null && from.Race != RequiredRace )
				{
					if( RequiredRace == Race.Elf )
						from.SendLocalizedMessage( 1072203 ); // Only Elves may use this.
					else
						from.SendMessage( "Only {0} may use this.", RequiredRace.PluralName );

					return false;
				}
				else if( !AllowMaleWearer && !from.Female )
				{
					if( AllowFemaleWearer )
						from.SendLocalizedMessage( 1010388 ); // Only females can wear this.
					else
						from.SendMessage( "You may not wear this." );

					return false;
				}
				else if( !AllowFemaleWearer && from.Female )
				{
					if( AllowMaleWearer )
						from.SendLocalizedMessage( 1063343 ); // Only males can wear this.
					else
						from.SendMessage( "You may not wear this." );

					return false;
				}
				else
				{
					int strBonus = ComputeStatBonus( StatType.Str ), strReq = ComputeStatReq( StatType.Str );
					int dexBonus = ComputeStatBonus( StatType.Dex ), dexReq = ComputeStatReq( StatType.Dex );
					int intBonus = ComputeStatBonus( StatType.Int ), intReq = ComputeStatReq( StatType.Int );

					if( from.Dex < dexReq || (from.Dex + dexBonus) < 1 )
					{
						from.SendLocalizedMessage( 502077 ); // You do not have enough dexterity to equip this item.
						return false;
					}
					else if( from.Str < strReq || (from.Str + strBonus) < 1 )
					{
						from.SendLocalizedMessage( 500213 ); // You are not strong enough to equip that.
						return false;
					}
					else if( from.Int < intReq || (from.Int + intBonus) < 1 )
					{
						from.SendMessage( "You are not smart enough to equip that." );
						return false;
					}
				}
			}

				// XmlAttachment check for CanEquip
	if(!Server.Engines.XmlSpawner2.XmlAttach.CheckCanEquip(this, from))
	{
        	return false;
	} else
	{

		return base.CanEquip( from );
	}
		}

		public override bool CheckPropertyConfliction( Mobile m )
		{
			if ( base.CheckPropertyConfliction( m ) )
				return true;

			if ( Layer == Layer.Pants )
				return ( m.FindItemOnLayer( Layer.InnerLegs ) != null );

			if ( Layer == Layer.Shirt )
				return ( m.FindItemOnLayer( Layer.InnerTorso ) != null );

			return false;
		}

		public override bool OnEquip( Mobile from )
		{
			from.CheckStatTimers();

			int strBonus = ComputeStatBonus( StatType.Str );
			int dexBonus = ComputeStatBonus( StatType.Dex );
			int intBonus = ComputeStatBonus( StatType.Int );

			if ( strBonus != 0 || dexBonus != 0 || intBonus != 0 )
			{
				string modName = this.Serial.ToString();

				if ( strBonus != 0 )
					from.AddStatMod( new StatMod( StatType.Str, modName + "Str", strBonus, TimeSpan.Zero ) );

				if ( dexBonus != 0 )
					from.AddStatMod( new StatMod( StatType.Dex, modName + "Dex", dexBonus, TimeSpan.Zero ) );

				if ( intBonus != 0 )
					from.AddStatMod( new StatMod( StatType.Int, modName + "Int", intBonus, TimeSpan.Zero ) );
			}

				// XmlAttachment check for OnEquip
        Server.Engines.XmlSpawner2.XmlAttach.CheckOnEquip(this, from);

	return base.OnEquip( from );
		}

		public override void OnRemoved( object parent )
		{
			if ( parent is Mobile )
			{
				Mobile m = (Mobile)parent;
				string modName = this.Serial.ToString();

				m.RemoveStatMod( modName + "Str" );
				m.RemoveStatMod( modName + "Dex" );
				m.RemoveStatMod( modName + "Int" );

				if ( Core.AOS )
					m_AosSkillBonuses.Remove();

				((Mobile)parent).Delta( MobileDelta.Armor ); // Tell them armor rating has changed
				m.CheckStatTimers();
			}

			// XmlAttachment check for OnRemoved
	Server.Engines.XmlSpawner2.XmlAttach.CheckOnRemoved(this, parent);

	base.OnRemoved( parent );
		}

		public virtual int OnHit( BaseWeapon weapon, int damageTaken )
		{
			double HalfAr = ArmorRating / 2.0;
			int Absorbed = (int)(HalfAr + HalfAr*Utility.RandomDouble());

			damageTaken -= Absorbed;
			if ( damageTaken < 0 ) 
				damageTaken = 0;

			if ( Absorbed < 2 )
				Absorbed = 2;

			if ( 25 > Utility.Random( 100 ) ) // 25% chance to lower durability
			{
				if ( Core.AOS && m_AosArmorAttributes.SelfRepair > Utility.Random( 10 ) )
				{
					HitPoints += 2;
				}
				else
				{
					int wear;

					if ( weapon.Type == WeaponType.Bashing )
						wear = Absorbed / 2;
					else
						wear = Utility.Random( 2 );

					if ( wear > 0 && m_MaxHitPoints > 0 )
					{
						if ( m_HitPoints >= wear )
						{
							HitPoints -= wear;
							wear = 0;
						}
						else
						{
							wear -= HitPoints;
							HitPoints = 0;
						}

						if ( wear > 0 )
						{
							if ( m_MaxHitPoints > wear )
							{
								MaxHitPoints -= wear;

								if ( Parent is Mobile )
									((Mobile)Parent).LocalOverheadMessage( MessageType.Regular, 0x3B2, 1061121 ); // Your equipment is severely damaged.
							}
							else
							{
								Delete();
							}
						}
					}
				}
			}

			return damageTaken;
		}

		private string GetNameString()
		{
			string name = this.Name;

			if ( name == null )
				name = String.Format( "#{0}", LabelNumber );

			return name;
		}

		[Hue, CommandProperty( AccessLevel.GameMaster )]
		public override int Hue
		{
			get{ return base.Hue; }
			set{ base.Hue = value; InvalidateProperties(); }
		}

		public override void AddNameProperty( ObjectPropertyList list )
		{
			string oreType;

			if ( Hue == 0 )
			{
				oreType = "";
			}
			else
			{
				switch ( m_Resource )
				{
					case CraftResource.DullCopper:			oreType = "Dull Copper"; break; // Dull Copper
					case CraftResource.ShadowIron:			oreType = "Shadow Iron"; break; // Shadow Iron
					case CraftResource.Copper:				oreType = "Copper"; break; // Copper
					case CraftResource.Bronze:				oreType = "Bronze"; break; // Bronze
					case CraftResource.Gold:				oreType = "Gold"; break; // Gold
					case CraftResource.Agapite:				oreType = "Agapite"; break; // Agapite
					case CraftResource.Verite:				oreType = "Verite"; break; // Verite
					case CraftResource.Valorite:			oreType = "Valorite"; break; // valorite
					case CraftResource.Blaze:				oreType = "Blaze"; break; // Blaze
					case CraftResource.Ice:					oreType = "Ice"; break; // Ice
					case CraftResource.Toxic:				oreType = "Toxic"; break; // Toxic
					case CraftResource.Electrum:			oreType = "Electrum"; break; // Electrum
					case CraftResource.Platinum:			oreType = "Platinum"; break; // Platinum
					case CraftResource.SpinedLeather:		oreType = "Spined"; break; // Spined
					case CraftResource.HornedLeather:		oreType = "Horned"; break; // Horned
					case CraftResource.BarbedLeather:		oreType = "Barbed"; break; // Barbed
					case CraftResource.PolarLeather:		oreType = "Polar"; break; // Polar
					case CraftResource.SyntheticLeather:	oreType = "Synthetic"; break; // Synthetic
					case CraftResource.BlazeLeather:		oreType = "Blaze"; break; // Blaze
					case CraftResource.DaemonicLeather:		oreType = "Daemonic"; break; // Daemonic
					case CraftResource.ShadowLeather:		oreType = "Shadow"; break; // Shadow
					case CraftResource.FrostLeather:		oreType = "Frost"; break; // Frost
					case CraftResource.EtherealLeather:		oreType = "Ethereal"; break; // Ethereal
					case CraftResource.RedScales:			oreType = "Red Scales"; break; // Red
					case CraftResource.YellowScales:		oreType = "Yellow Scales"; break; // Yellow
					case CraftResource.BlackScales:			oreType = "Black Scales"; break; // Black
					case CraftResource.GreenScales:			oreType = "Green Scales"; break; // Green
					case CraftResource.WhiteScales:			oreType = "White Scales"; break; // White
					case CraftResource.BlueScales:			oreType = "Blue Scales"; break; // Blue
					case CraftResource.CopperScales:		oreType = "Copper Scales"; break; // Copper
					case CraftResource.SilverScales:		oreType = "Silver Scales"; break; // Silver
					case CraftResource.GoldScales:			oreType = "Gold Scales"; break; // Gold
					case CraftResource.Pine:				oreType = "Pine"; break; 		// Pine
					case CraftResource.Ash:					oreType = "Ash"; break; 		// Ash
					case CraftResource.Mohogany:			oreType = "Mohogany"; break; 	// Mohogany
					case CraftResource.Yew:					oreType = "Yew"; break; 		// Yew
					case CraftResource.Oak:					oreType = "Oak"; break; 		// Oak
					case CraftResource.Zircote:				oreType = "Zircote"; break; 	// Zircote
					case CraftResource.Ebony:				oreType = "Ebony";  break; 		// Ebony
					case CraftResource.Bamboo:				oreType = "Bamboo"; break; 		// Bamboo
					case CraftResource.PurpleHeart:			oreType = "Purpleheart"; break; // Purple Heart
					case CraftResource.Redwood:				oreType = "Redwood"; break;		// Redwood
					case CraftResource.Petrified:			oreType = "Petrified"; break;	// Petrified
					default: oreType = ""; break;
				}
			}

			if ( m_Quality == ArmorQuality.Exceptional )
			{
				//if ( oreType != 0 )
					list.Add( 1053100, "{0}\t{1}", oreType, GetNameString() ); // exceptional ~1_oretype~ ~2_armortype~
				/*else
					list.Add( 1050040, GetNameString() ); // exceptional ~1_ITEMNAME~*/
			}
			else
			{
				//if ( oreType != 0 )
					list.Add( 1053099, "{0}\t{1}", oreType, GetNameString() ); // ~1_oretype~ ~2_armortype~
				/*else if ( Name == null )
					list.Add( LabelNumber );
				else
					list.Add( Name );*/
			}
		}

		public override bool AllowEquipedCast( Mobile from )
		{
			if ( base.AllowEquipedCast( from ) )
				return true;

			return ( m_AosAttributes.SpellChanneling != 0 );
		}

		public virtual int GetLuckBonus()
		{
			CraftResourceInfo resInfo = CraftResources.GetInfo( m_Resource );

			if ( resInfo == null )
				return 0;

			CraftAttributeInfo attrInfo = resInfo.AttributeInfo;

			if ( attrInfo == null )
				return 0;

			return attrInfo.ArmorLuck;
		}

		public override void GetProperties( ObjectPropertyList list )
		{
			base.GetProperties( list );

			if ( m_Crafter != null )
				list.Add( 1050043, m_Crafter.Name ); // crafted by ~1_NAME~

			#region Factions
			if ( m_FactionState != null )
				list.Add( 1041350 ); // faction item
			#endregion

			if( RequiredRace == Race.Elf )
				list.Add( 1075086 ); // Elves Only

			m_AosSkillBonuses.GetProperties( list );

			int prop;

			if ( (prop = ArtifactRarity) > 0 )
				list.Add( 1061078, prop.ToString() ); // artifact rarity ~1_val~

			if ( (prop = m_AosAttributes.WeaponDamage) != 0 )
				list.Add( 1060401, prop.ToString() ); // damage increase ~1_val~%

			if ( (prop = m_AosAttributes.DefendChance) != 0 )
				list.Add( 1060408, prop.ToString() ); // defense chance increase ~1_val~%

			if ( (prop = m_AosAttributes.BonusDex) != 0 )
				list.Add( 1060409, prop.ToString() ); // dexterity bonus ~1_val~

			if ( (prop = m_AosAttributes.EnhancePotions) != 0 )
				list.Add( 1060411, prop.ToString() ); // enhance potions ~1_val~%

			if ( (prop = m_AosAttributes.CastRecovery) != 0 )
				list.Add( 1060412, prop.ToString() ); // faster cast recovery ~1_val~

			if ( (prop = m_AosAttributes.CastSpeed) != 0 )
				list.Add( 1060413, prop.ToString() ); // faster casting ~1_val~

			if ( (prop = m_AosAttributes.AttackChance) != 0 )
				list.Add( 1060415, prop.ToString() ); // hit chance increase ~1_val~%

			if ( (prop = m_AosAttributes.BonusHits) != 0 )
				list.Add( 1060431, prop.ToString() ); // hit point increase ~1_val~

			if ( (prop = m_AosAttributes.BonusInt) != 0 )
				list.Add( 1060432, prop.ToString() ); // intelligence bonus ~1_val~

			if ( (prop = m_AosAttributes.LowerManaCost) != 0 )
				list.Add( 1060433, prop.ToString() ); // lower mana cost ~1_val~%

			if ( (prop = m_AosAttributes.LowerRegCost) != 0 )
				list.Add( 1060434, prop.ToString() ); // lower reagent cost ~1_val~%

			if ( (prop = GetLowerStatReq()) != 0 )
				list.Add( 1060435, prop.ToString() ); // lower requirements ~1_val~%

			if ( (prop = (GetLuckBonus() + m_AosAttributes.Luck)) != 0 )
				list.Add( 1060436, prop.ToString() ); // luck ~1_val~

			if ( (prop = m_AosArmorAttributes.MageArmor) != 0 )
				list.Add( 1060437 ); // mage armor

			if ( (prop = m_AosAttributes.BonusMana) != 0 )
				list.Add( 1060439, prop.ToString() ); // mana increase ~1_val~

			if ( (prop = m_AosAttributes.RegenMana) != 0 )
				list.Add( 1060440, prop.ToString() ); // mana regeneration ~1_val~

			if ( (prop = m_AosAttributes.NightSight) != 0 )
				list.Add( 1060441 ); // night sight

			if ( (prop = m_AosAttributes.ReflectPhysical) != 0 )
				list.Add( 1060442, prop.ToString() ); // reflect physical damage ~1_val~%

			if ( (prop = m_AosAttributes.RegenStam) != 0 )
				list.Add( 1060443, prop.ToString() ); // stamina regeneration ~1_val~

			if ( (prop = m_AosAttributes.RegenHits) != 0 )
				list.Add( 1060444, prop.ToString() ); // hit point regeneration ~1_val~

			if ( (prop = m_AosArmorAttributes.SelfRepair) != 0 )
				list.Add( 1060450, prop.ToString() ); // self repair ~1_val~

			if ( (prop = m_AosAttributes.SpellChanneling) != 0 )
				list.Add( 1060482 ); // spell channeling

			if ( (prop = m_AosAttributes.SpellDamage) != 0 )
				list.Add( 1060483, prop.ToString() ); // spell damage increase ~1_val~%

			if ( (prop = m_AosAttributes.BonusStam) != 0 )
				list.Add( 1060484, prop.ToString() ); // stamina increase ~1_val~

			if ( (prop = m_AosAttributes.BonusStr) != 0 )
				list.Add( 1060485, prop.ToString() ); // strength bonus ~1_val~

			if ( (prop = m_AosAttributes.WeaponSpeed) != 0 )
				list.Add( 1060486, prop.ToString() ); // swing speed increase ~1_val~%

			base.AddResistanceProperties( list );

			if ( (prop = GetDurabilityBonus()) > 0 )
				list.Add( 1060410, prop.ToString() ); // durability ~1_val~%

			if ( (prop = ComputeStatReq( StatType.Str )) > 0 )
				list.Add( 1061170, prop.ToString() ); // strength requirement ~1_val~

				if ( m_HitPoints > 0 && m_MaxHitPoints > 0 )
		list.Add( 1060639, "{0}\t{1}", m_HitPoints, m_MaxHitPoints ); // durability ~1_val~ / ~2_val~
			
	// mod to display attachment properties
	Server.Engines.XmlSpawner2.XmlAttach.AddAttachmentProperties(this, list);
		}

		public override void OnSingleClick( Mobile from )
		{
			ArrayList attrs = new ArrayList();

			if ( DisplayLootType )
			{
				if ( LootType == LootType.Blessed )
					attrs.Add( new EquipInfoAttribute( 1038021 ) ); // blessed
				else if ( LootType == LootType.Cursed )
					attrs.Add( new EquipInfoAttribute( 1049643 ) ); // cursed
			}

			#region Factions
			if ( m_FactionState != null )
				attrs.Add( new EquipInfoAttribute( 1041350 ) ); // faction item
			#endregion

			if ( m_Quality == ArmorQuality.Exceptional )
				attrs.Add( new EquipInfoAttribute( 1018305 - (int)m_Quality ) );

			if ( m_Identified )
			{
				if ( m_Durability != ArmorDurabilityLevel.Regular )
					attrs.Add( new EquipInfoAttribute( 1038000 + (int)m_Durability ) );

				if ( m_Protection > ArmorProtectionLevel.Regular && m_Protection <= ArmorProtectionLevel.Invulnerability )
					attrs.Add( new EquipInfoAttribute( 1038005 + (int)m_Protection ) );
			}
			else if ( m_Durability != ArmorDurabilityLevel.Regular || (m_Protection > ArmorProtectionLevel.Regular && m_Protection <= ArmorProtectionLevel.Invulnerability) )
			{
				attrs.Add( new EquipInfoAttribute( 1038000 ) ); // Unidentified
			}

			int number;

			if ( Name == null )
			{
				number = LabelNumber;
			}
			else
			{
				this.LabelTo( from, Name );
				number = 1041000;
			}

			if ( attrs.Count == 0 && Crafter == null && Name != null )
				return;

			EquipmentInfo eqInfo = new EquipmentInfo( number, m_Crafter, false, attrs.ToArray() );

			from.Send( new DisplayEquipmentInfo( this, eqInfo ) );
		}
		#region ICraftable Members

		public int OnCraft( int quality, bool makersMark, Mobile from, CraftSystem craftSystem, Type typeRes, BaseTool tool, CraftItem craftItem, int resHue )
		{
			Quality = (ArmorQuality)quality;

			if ( makersMark )
				Crafter = from;

			Type resourceType = typeRes;

			if ( resourceType == null )
				resourceType = craftItem.Ressources.GetAt( 0 ).ItemType;

			Resource = CraftResources.GetFromType( resourceType );
			PlayerConstructed = true;

			CraftContext context = craftSystem.GetContext( from );

			if ( context != null && context.DoNotColor )
				Hue = 0;

			if ( quality == 2 )
				DistributeBonuses( (tool is BaseRunicTool ? 6 : Core.SE ? 15 : 14) ); // Not sure since when, but right now 15 points are added, not 14.

			if ( Core.AOS && tool is BaseRunicTool )
				((BaseRunicTool)tool).ApplyAttributesTo( this );

			return quality;
		}

		#endregion
	}
}
Seems I may have fixed that issue. But now I get a server crash.

Here is the crashlog.

Code:
RunUO - [www.runuo.com] Version 2.0, Build 2357.32527
Core: Running on .NET Framework Version 2.0.50727
Core: Optimizing for 2 processors
Scripts: Compiling C# scripts...done (cached)
Scripts: Compiling VB.NET scripts...no files found.
Scripts: Verifying...done (4098 items, 871 mobiles)
ACC Registered: Server.ACC.CM.CentralMemory
-- // P // -- Configuring Skill Replacement. Custom Skill Gump will not be used.

 -//P//- File not found, or invalid.
 -//P//- No Custom Skills Found.
Loading SuperProfile Default Profile
Regions: Loading...done
World: Loading...done (126524 items, 5694 mobiles) (3.99 seconds)
Error:
System.Reflection.TargetInvocationException: Exception has been thrown by the ta
rget of an invocation. ---> System.Reflection.TargetInvocationException: Excepti
on has been thrown by the target of an invocation. ---> System.NullReferenceExce
ption: Object reference not set to an instance of an object.
   at Server.Mobiles.BaseCreature.PackGold(Int32 amount)
   at Server.Mobiles.BlackSolenWorker..ctor()
   --- End of inner exception stack trace ---
   at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOn
ly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& b
NeedSecurityCheck)
   at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCach
e)
   at System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisi
bilityChecks, Boolean fillCache)
   at System.Activator.CreateInstance(Type type, Boolean nonPublic)
   at Server.Bestiary.MobileEntry..ctor(Type type)
   at Server.Bestiary.Bestiary.Generate()
   at Server.Bestiary.Bestiary.Initialize()
   --- End of inner exception stack trace ---
   at System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] argum
ents, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle
 typeOwner)
   at System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] argume
nts, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwn
er)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invoke
Attr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisib
ilityChecks)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invoke
Attr, Binder binder, Object[] parameters, CultureInfo culture)
   at Server.ScriptCompiler.Compile(Boolean debug)
   at Server.Core.Main(String[] args)
This exception is fatal, press return to exit
 

KnitePrince

Sorceror
I am currently struggling to find a way to enable Tokens for harvesting, WITHOUT enabling random ores..

Is it possible to do this, or would I be better off to add a random bool in the harvest system file similar to where it adds the random ML resource?



Edit; I found this in the Mining.cs
if (i_Level > 0 && Daat99OWLTR.Ops[15].Setting)
GiveTokens.RewardTokens(from, i_Level*10);
would it be possible to remove the &&Daat99 (etc) and enable the reward tokens bypassing the control center?

Nothing that I tried that way seemed to work, so ive fudged a fix by adding a loottokencheck into the resources found while mining;
Code:
				else if ( random > 29 )
				{
					resource = new PerfectEmerald();
					item = "a Perfect Emerald";
				}
                else if (random > 20)
                {
                    resource = new Turquoise();
                    item = "a peice of Turquoise";
                }
               [COLOR="Red"] else
                {
                    resource = new LootTokenCheck();
                    item = "a Token Check";
                }[/COLOR]
				if ( Give( from, resource, true ) ) from.SendMessage( "You found {0}!", item );

It Works, but id prefer a better way if anyone has an idea :)
 

daat99

Moderator
Staff member
KnitePrince;798659 said:
I am currently struggling to find a way to enable Tokens for harvesting, WITHOUT enabling random ores..

Is it possible to do this, or would I be better off to add a random bool in the harvest system file similar to where it adds the random ML resource?



Edit; I found this in the Mining.cs
if (i_Level > 0 && Daat99OWLTR.Ops[15].Setting)
GiveTokens.RewardTokens(from, i_Level*10);
would it be possible to remove the &&Daat99 (etc) and enable the reward tokens bypassing the control center?

Nothing that I tried that way seemed to work, so ive fudged a fix by adding a loottokencheck into the resources found while mining;
Code:
				else if ( random > 29 )
				{
					resource = new PerfectEmerald();
					item = "a Perfect Emerald";
				}
                else if (random > 20)
                {
                    resource = new Turquoise();
                    item = "a peice of Turquoise";
                }
               [COLOR="Red"] else
                {
                    resource = new LootTokenCheck();
                    item = "a Token Check";
                }[/COLOR]
				if ( Give( from, resource, true ) ) from.SendMessage( "You found {0}!", item );

It Works, but id prefer a better way if anyone has an idea :)
Why don't you post in the script support forum (along with the relevant section of mining.cs)?

P.S.
If nobody will reply there send me a pm.
 
Top