feat: Adds leather/metal food, fixes weapons/armors with wrong materials (#1718)

### Summary
- Fixes the name `Vegies` to `Veggies`
- Adds feeding leather to goats
- Adds metal for Lava Lizards
- Fixes Bone Helm being classified as plate instead of bone.
- Fixes wooden shields not classified as wood.

### Note
On OSI, the preferred foods on the animal lore gump doesn't contain all possible favorite food categories. Furthermore, the one listed is not necessarily always the "first" in the list of possible categories. We aren't going to try and fix that since it isn't important.
This commit is contained in:
Kamron Batman 2024-04-04 19:43:02 -07:00 committed by GitHub
parent 29ea813242
commit 974062b0d4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
61 changed files with 266 additions and 128 deletions

View file

@ -48,7 +48,7 @@ namespace Server.Mobiles
public override string CorpseName => "an unholy corpse";
public override bool IsDispellable => false;
public override bool IsBondable => false;
public override FoodType FavoriteFood => FoodType.FruitsAndVegies | FoodType.GrainsAndHay;
public override FoodType FavoriteFood => FoodType.FruitsAndVeggies | FoodType.GrainsAndHay;
private static MonsterAbility[] _abilities = { MonsterAbilities.FireBreath };
public override MonsterAbility[] GetMonsterAbilities() => _abilities;

View file

@ -47,7 +47,7 @@ namespace Server.Mobiles
public override string CorpseName => "a holy corpse";
public override bool IsDispellable => false;
public override bool IsBondable => false;
public override FoodType FavoriteFood => FoodType.FruitsAndVegies | FoodType.GrainsAndHay;
public override FoodType FavoriteFood => FoodType.FruitsAndVeggies | FoodType.GrainsAndHay;
private static MonsterAbility[] _abilities = { MonsterAbilities.FireBreath };
public override MonsterAbility[] GetMonsterAbilities() => _abilities;

View file

@ -65,7 +65,7 @@ namespace Server.Factions
}
}
public override FoodType FavoriteFood => FoodType.FruitsAndVegies | FoodType.GrainsAndHay;
public override FoodType FavoriteFood => FoodType.FruitsAndVeggies | FoodType.GrainsAndHay;
public override void OnDoubleClick(Mobile from)
{

View file

@ -23,6 +23,6 @@ namespace Server.Items
public override int ArmorBase => 30;
public override ArmorMaterialType MaterialType => ArmorMaterialType.Plate;
public override ArmorMaterialType MaterialType => ArmorMaterialType.Bone;
}
}

View file

@ -19,4 +19,6 @@ public partial class GargishWoodenShield : BaseShield
public override int AosStrReq => 20;
public override int RequiredRaces => Race.AllowGargoylesOnly;
}
public override ArmorMaterialType MaterialType => ArmorMaterialType.Wood;
}

View file

@ -20,4 +20,6 @@ public partial class WoodenKiteShield : BaseShield
public override int AosStrReq => 20;
public override int ArmorBase => 12;
public override ArmorMaterialType MaterialType => ArmorMaterialType.Wood;
}

View file

@ -20,4 +20,6 @@ public partial class WoodenShield : BaseShield
public override int AosStrReq => 20;
public override int ArmorBase => 8;
public override ArmorMaterialType MaterialType => ArmorMaterialType.Wood;
}

View file

@ -43,6 +43,7 @@ public abstract partial class BaseWand : BaseBashing
Attributes.SpellChanneling = 1;
Attributes.CastSpeed = -1;
WeaponAttributes.MageWeapon = Utility.RandomMinMax(1, 10);
Resource = CraftResource.None;
}
public override WeaponAbility PrimaryAbility => WeaponAbility.Dismount;

View file

@ -8,7 +8,11 @@ namespace Server.Items
public partial class ElvenCompositeLongbow : BaseRanged
{
[Constructible]
public ElvenCompositeLongbow() : base(0x2D1E) => Weight = 8.0;
public ElvenCompositeLongbow() : base(0x2D1E)
{
Weight = 8.0;
Resource = CraftResource.RegularWood;
}
public override int EffectID => 0xF42;
public override Type AmmoType => typeof(Arrow);

View file

@ -8,7 +8,11 @@ namespace Server.Items
public partial class MagicalShortbow : BaseRanged
{
[Constructible]
public MagicalShortbow() : base(0x2D2B) => Weight = 6.0;
public MagicalShortbow() : base(0x2D2B)
{
Weight = 6.0;
Resource = CraftResource.RegularWood;
}
public override int EffectID => 0xF42;
public override Type AmmoType => typeof(Arrow);

View file

@ -7,7 +7,11 @@ namespace Server.Items
public partial class WildStaff : BaseStaff
{
[Constructible]
public WildStaff() : base(0x2D25) => Weight = 8.0;
public WildStaff() : base(0x2D25)
{
Weight = 8.0;
Resource = CraftResource.RegularWood;
}
public override WeaponAbility PrimaryAbility => WeaponAbility.Block;
public override WeaponAbility SecondaryAbility => WeaponAbility.ForceOfNature;

View file

@ -12,6 +12,7 @@ namespace Server.Items
{
Weight = 6.0;
Layer = Layer.TwoHanded;
Resource = CraftResource.RegularWood;
}
public override int EffectID => 0xF42;

View file

@ -8,7 +8,11 @@ namespace Server.Items
public partial class CompositeBow : BaseRanged
{
[Constructible]
public CompositeBow() : base(0x26C2) => Weight = 5.0;
public CompositeBow() : base(0x26C2)
{
Weight = 5.0;
Resource = CraftResource.RegularWood;
}
public override int EffectID => 0xF42;
public override Type AmmoType => typeof(Arrow);

View file

@ -12,6 +12,7 @@ namespace Server.Items
{
Weight = 7.0;
Layer = Layer.TwoHanded;
Resource = CraftResource.RegularWood;
}
public override int EffectID => 0x1BFE;

View file

@ -12,6 +12,7 @@ namespace Server.Items
{
Weight = 9.0;
Layer = Layer.TwoHanded;
Resource = CraftResource.RegularWood;
}
public override int EffectID => 0x1BFE;

View file

@ -10,6 +10,7 @@ namespace Server.Items
[Constructible]
public JukaBow()
{
Resource = CraftResource.RegularWood;
}
public override int AosStrengthReq => 80;

View file

@ -8,7 +8,11 @@ namespace Server.Items
public partial class RepeatingCrossbow : BaseRanged
{
[Constructible]
public RepeatingCrossbow() : base(0x26C3) => Weight = 6.0;
public RepeatingCrossbow() : base(0x26C3)
{
Weight = 6.0;
Resource = CraftResource.RegularWood;
}
public override int EffectID => 0x1BFE;
public override Type AmmoType => typeof(Bolt);

View file

@ -12,6 +12,7 @@ namespace Server.Items
{
Weight = 9.0;
Layer = Layer.TwoHanded;
Resource = CraftResource.RegularWood;
}
public override int EffectID => 0xF42;

View file

@ -7,8 +7,11 @@ namespace Server.Items
public partial class GlassStaff : BaseStaff
{
[Constructible]
public GlassStaff() : base(0x905) =>
public GlassStaff() : base(0x905)
{
Weight = 4.0;
Resource = CraftResource.None;
}
public override WeaponAbility PrimaryAbility => WeaponAbility.DoubleStrike;
public override WeaponAbility SecondaryAbility => WeaponAbility.MortalStrike;

View file

@ -7,7 +7,11 @@ namespace Server.Items
public partial class GnarledStaff : BaseStaff
{
[Constructible]
public GnarledStaff() : base(0x13F8) => Weight = 3.0;
public GnarledStaff() : base(0x13F8)
{
Weight = 3.0;
Resource = CraftResource.RegularWood;
}
public override WeaponAbility PrimaryAbility => WeaponAbility.ConcussionBlow;
public override WeaponAbility SecondaryAbility => WeaponAbility.ForceOfNature;

View file

@ -7,7 +7,11 @@ namespace Server.Items
public partial class QuarterStaff : BaseStaff
{
[Constructible]
public QuarterStaff() : base(0xE89) => Weight = 4.0;
public QuarterStaff() : base(0xE89)
{
Weight = 4.0;
Resource = CraftResource.RegularWood;
}
public override WeaponAbility PrimaryAbility => WeaponAbility.DoubleStrike;
public override WeaponAbility SecondaryAbility => WeaponAbility.ConcussionBlow;

View file

@ -10,6 +10,7 @@ namespace Server.Items
[Constructible]
public SerpentstoneStaff() : base(0x906)
{
Resource = CraftResource.RegularWood;
}
public override WeaponAbility PrimaryAbility => WeaponAbility.CrushingBlow;

View file

@ -11,7 +11,11 @@ namespace Server.Items
public partial class ShepherdsCrook : BaseStaff
{
[Constructible]
public ShepherdsCrook() : base(0xE81) => Weight = 4.0;
public ShepherdsCrook() : base(0xE81)
{
Weight = 4.0;
Resource = CraftResource.RegularWood;
}
public override WeaponAbility PrimaryAbility => WeaponAbility.CrushingBlow;
public override WeaponAbility SecondaryAbility => WeaponAbility.Disarm;

View file

@ -46,7 +46,7 @@ namespace Server.Mobiles
public override int Meat => 1;
public override int Hides => 12;
public override FoodType FavoriteFood => FoodType.Fish | FoodType.Meat | FoodType.FruitsAndVegies;
public override FoodType FavoriteFood => FoodType.Fish | FoodType.Meat | FoodType.FruitsAndVeggies;
public override PackInstinct PackInstinct => PackInstinct.Bear;
}
}

View file

@ -45,7 +45,7 @@ namespace Server.Mobiles
public override int Meat => 1;
public override int Hides => 12;
public override FoodType FavoriteFood => FoodType.Fish | FoodType.FruitsAndVegies | FoodType.Meat;
public override FoodType FavoriteFood => FoodType.Fish | FoodType.FruitsAndVeggies | FoodType.Meat;
public override PackInstinct PackInstinct => PackInstinct.Bear;
}
}

View file

@ -47,7 +47,7 @@ namespace Server.Mobiles
public override int Meat => 2;
public override int Hides => 16;
public override FoodType FavoriteFood => FoodType.Fish | FoodType.FruitsAndVegies | FoodType.Meat;
public override FoodType FavoriteFood => FoodType.Fish | FoodType.FruitsAndVeggies | FoodType.Meat;
public override PackInstinct PackInstinct => PackInstinct.Bear;
}
}

View file

@ -47,7 +47,7 @@ namespace Server.Mobiles
public override int Meat => 2;
public override int Hides => 16;
public override FoodType FavoriteFood => FoodType.Fish | FoodType.FruitsAndVegies | FoodType.Meat;
public override FoodType FavoriteFood => FoodType.Fish | FoodType.FruitsAndVeggies | FoodType.Meat;
public override PackInstinct PackInstinct => PackInstinct.Bear;
}
}

View file

@ -60,7 +60,7 @@ namespace Server.Mobiles
public override int Meat => 8;
public override int Hides => 12;
public override FoodType FavoriteFood => FoodType.FruitsAndVegies | FoodType.GrainsAndHay;
public override FoodType FavoriteFood => FoodType.FruitsAndVeggies | FoodType.GrainsAndHay;
public override void OnDoubleClick(Mobile from)
{

View file

@ -44,6 +44,6 @@ namespace Server.Mobiles
public override string DefaultName => "a boar";
public override int Meat => 2;
public override FoodType FavoriteFood => FoodType.FruitsAndVegies | FoodType.GrainsAndHay;
public override FoodType FavoriteFood => FoodType.FruitsAndVeggies | FoodType.GrainsAndHay;
}
}

View file

@ -43,6 +43,6 @@ namespace Server.Mobiles
public override int Meat => 2;
public override int Hides => 8;
public override FoodType FavoriteFood => FoodType.GrainsAndHay | FoodType.FruitsAndVegies;
public override FoodType FavoriteFood => FoodType.GrainsAndHay | FoodType.FruitsAndVeggies | FoodType.Leather;
}
}

View file

@ -45,6 +45,6 @@ namespace Server.Mobiles
public override int Meat => 1;
public override int Hides => 6;
public override FoodType FavoriteFood => FoodType.FruitsAndVegies | FoodType.GrainsAndHay;
public override FoodType FavoriteFood => FoodType.FruitsAndVeggies | FoodType.GrainsAndHay;
}
}

View file

@ -44,7 +44,7 @@ namespace Server.Mobiles
public override int Meat => 6;
public override int Hides => 15;
public override FoodType FavoriteFood => FoodType.FruitsAndVegies | FoodType.GrainsAndHay;
public override FoodType FavoriteFood => FoodType.FruitsAndVeggies | FoodType.GrainsAndHay;
public override int GetAttackSound() => 0x82;

View file

@ -43,7 +43,7 @@ namespace Server.Mobiles
public override int Meat => 5;
public override int Hides => 8;
public override FoodType FavoriteFood => FoodType.FruitsAndVegies | FoodType.GrainsAndHay;
public override FoodType FavoriteFood => FoodType.FruitsAndVeggies | FoodType.GrainsAndHay;
public override int GetAttackSound() => 0x82;

View file

@ -43,6 +43,6 @@ namespace Server.Mobiles
public override int Meat => 1;
public override int Hides => 12;
public override FoodType FavoriteFood => FoodType.FruitsAndVegies | FoodType.GrainsAndHay;
public override FoodType FavoriteFood => FoodType.FruitsAndVeggies | FoodType.GrainsAndHay;
}
}

View file

@ -47,6 +47,6 @@ namespace Server.Mobiles
public override int Meat => 2;
public override int Hides => 12;
public override FoodType FavoriteFood => FoodType.GrainsAndHay | FoodType.FruitsAndVegies;
public override FoodType FavoriteFood => FoodType.GrainsAndHay | FoodType.FruitsAndVeggies;
}
}

View file

@ -60,7 +60,7 @@ namespace Server.Mobiles
public override int Meat => 3;
public override int Hides => 10;
public override FoodType FavoriteFood => FoodType.FruitsAndVegies | FoodType.GrainsAndHay;
public override FoodType FavoriteFood => FoodType.FruitsAndVeggies | FoodType.GrainsAndHay;
public override bool OnBeforeDeath()
{

View file

@ -59,7 +59,7 @@ namespace Server.Mobiles
public override string DefaultName => "a pack llama";
public override int Meat => 1;
public override FoodType FavoriteFood => FoodType.FruitsAndVegies | FoodType.GrainsAndHay;
public override FoodType FavoriteFood => FoodType.FruitsAndVeggies | FoodType.GrainsAndHay;
public override bool OnBeforeDeath()
{

View file

@ -42,6 +42,6 @@ namespace Server.Mobiles
public override string DefaultName => "a pig";
public override int Meat => 1;
public override FoodType FavoriteFood => FoodType.FruitsAndVegies | FoodType.GrainsAndHay;
public override FoodType FavoriteFood => FoodType.FruitsAndVeggies | FoodType.GrainsAndHay;
}
}

View file

@ -64,7 +64,7 @@ namespace Server.Mobiles
public override int Meat => 3;
public override MeatType MeatType => MeatType.LambLeg;
public override FoodType FavoriteFood => FoodType.FruitsAndVegies | FoodType.GrainsAndHay;
public override FoodType FavoriteFood => FoodType.FruitsAndVeggies | FoodType.GrainsAndHay;
public override int Wool => Body == 0xCF ? 3 : 0;

View file

@ -41,7 +41,7 @@ namespace Server.Mobiles
public override string CorpseName => "an ostard corpse";
public override int Meat => 3;
public override FoodType FavoriteFood => FoodType.FruitsAndVegies | FoodType.GrainsAndHay;
public override FoodType FavoriteFood => FoodType.FruitsAndVeggies | FoodType.GrainsAndHay;
public override PackInstinct PackInstinct => PackInstinct.Ostard;
}
}

View file

@ -42,7 +42,7 @@ namespace Server.Mobiles
public override string CorpseName => "an ostard corpse";
public override int Meat => 3;
public override FoodType FavoriteFood => FoodType.FruitsAndVegies | FoodType.GrainsAndHay;
public override FoodType FavoriteFood => FoodType.FruitsAndVeggies | FoodType.GrainsAndHay;
public override PackInstinct PackInstinct => PackInstinct.Ostard;
}
}

View file

@ -46,7 +46,7 @@ namespace Server.Mobiles
public override string CorpseName => "an ostard corpse";
public override int Meat => 3;
public override FoodType FavoriteFood => FoodType.Meat | FoodType.Fish | FoodType.Eggs | FoodType.FruitsAndVegies;
public override FoodType FavoriteFood => FoodType.Meat | FoodType.Fish | FoodType.Eggs | FoodType.FruitsAndVeggies;
public override PackInstinct PackInstinct => PackInstinct.Ostard;
}
}

View file

@ -59,6 +59,6 @@ namespace Server.Mobiles
public override int Meat => 3;
public override int Hides => 10;
public override FoodType FavoriteFood => FoodType.FruitsAndVegies | FoodType.GrainsAndHay;
public override FoodType FavoriteFood => FoodType.FruitsAndVeggies | FoodType.GrainsAndHay;
}
}

View file

@ -62,7 +62,7 @@ namespace Server.Mobiles
public override int Meat => 3;
public override int Hides => 10;
public override HideType HideType => HideType.Horned;
public override FoodType FavoriteFood => FoodType.FruitsAndVegies | FoodType.GrainsAndHay;
public override FoodType FavoriteFood => FoodType.FruitsAndVeggies | FoodType.GrainsAndHay;
public override void OnDisallowedRider(Mobile m)
{

View file

@ -47,6 +47,6 @@ namespace Server.Mobiles
public override int Meat => 1;
public override int Hides => 12;
public override FoodType FavoriteFood => FoodType.FruitsAndVegies | FoodType.GrainsAndHay;
public override FoodType FavoriteFood => FoodType.FruitsAndVeggies | FoodType.GrainsAndHay;
}
}

View file

@ -47,7 +47,7 @@ namespace Server.Mobiles
public override int Meat => 1;
public override int Hides => 12;
public override HideType HideType => HideType.Spined;
public override FoodType FavoriteFood => FoodType.FruitsAndVegies | FoodType.GrainsAndHay;
public override FoodType FavoriteFood => FoodType.FruitsAndVeggies | FoodType.GrainsAndHay;
public override bool OverrideBondingReqs() => true;

View file

@ -47,7 +47,7 @@ namespace Server.Mobiles
public override int Meat => 1;
public override int Hides => 12;
public override HideType HideType => HideType.Spined;
public override FoodType FavoriteFood => FoodType.FruitsAndVegies | FoodType.GrainsAndHay;
public override FoodType FavoriteFood => FoodType.FruitsAndVeggies | FoodType.GrainsAndHay;
public override bool OverrideBondingReqs() => true;

View file

@ -61,7 +61,7 @@ namespace Server.Mobiles
public override int Meat => 3;
public override int Hides => 10;
public override HideType HideType => HideType.Horned;
public override FoodType FavoriteFood => FoodType.FruitsAndVegies | FoodType.GrainsAndHay;
public override FoodType FavoriteFood => FoodType.FruitsAndVeggies | FoodType.GrainsAndHay;
public override void OnDisallowedRider(Mobile m)
{

View file

@ -55,6 +55,6 @@ namespace Server.Mobiles
public override int StepsMax => 6400;
public override string CorpseName => "a war horse corpse";
public override FoodType FavoriteFood => FoodType.FruitsAndVegies | FoodType.GrainsAndHay;
public override FoodType FavoriteFood => FoodType.FruitsAndVeggies | FoodType.GrainsAndHay;
}
}

View file

@ -50,6 +50,7 @@ namespace Server.Mobiles
public override string DefaultName => "a lava lizard";
public override int Hides => 12;
public override HideType HideType => HideType.Spined;
public override FoodType FavoriteFood => FoodType.Metal | FoodType.Gold;
private static MonsterAbility[] _abilities = { MonsterAbilities.FireBreath };
public override MonsterAbility[] GetMonsterAbilities() => _abilities;

View file

@ -46,7 +46,7 @@ namespace Server.Mobiles
public override int Meat => 1;
public override int Hides => 6;
public override FoodType FavoriteFood => FoodType.Fish | FoodType.Meat | FoodType.FruitsAndVegies | FoodType.Eggs;
public override FoodType FavoriteFood => FoodType.Fish | FoodType.Meat | FoodType.FruitsAndVeggies | FoodType.Eggs;
public override void GenerateLoot()
{

View file

@ -44,7 +44,7 @@ namespace Server.Mobiles
public override int Meat => 1;
public override int Hides => 1;
public override FoodType FavoriteFood => FoodType.FruitsAndVegies;
public override FoodType FavoriteFood => FoodType.FruitsAndVeggies;
public override int GetAttackSound() => 0xC9;

View file

@ -47,7 +47,7 @@ namespace Server.Mobiles
public override int Meat => 1;
public override int Hides => 1;
public override FoodType FavoriteFood => FoodType.FruitsAndVegies;
public override FoodType FavoriteFood => FoodType.FruitsAndVeggies;
public override int GetAttackSound() => 0xC9;

View file

@ -45,7 +45,7 @@ namespace Server.Mobiles
public override string DefaultName => "a sewer rat";
public override int Meat => 1;
public override FoodType FavoriteFood => FoodType.Meat | FoodType.Eggs | FoodType.FruitsAndVegies;
public override FoodType FavoriteFood => FoodType.Meat | FoodType.Eggs | FoodType.FruitsAndVeggies;
public override void GenerateLoot()
{

View file

@ -56,7 +56,7 @@ namespace Server.Mobiles
public override MeatType MeatType => MeatType.Bird;
public override int Meat => 1;
public override int Feathers => 25;
public override FoodType FavoriteFood => FoodType.FruitsAndVegies | FoodType.GrainsAndHay;
public override FoodType FavoriteFood => FoodType.FruitsAndVeggies | FoodType.GrainsAndHay;
}
[SerializationGenerator(0, false)]
@ -98,6 +98,6 @@ namespace Server.Mobiles
public override MeatType MeatType => MeatType.Bird;
public override int Meat => 1;
public override int Feathers => 25;
public override FoodType FavoriteFood => FoodType.FruitsAndVegies | FoodType.GrainsAndHay;
public override FoodType FavoriteFood => FoodType.FruitsAndVeggies | FoodType.GrainsAndHay;
}
}

View file

@ -67,11 +67,13 @@ namespace Server.Mobiles
{
None = 0x0000,
Meat = 0x0001,
FruitsAndVegies = 0x0002,
FruitsAndVeggies = 0x0002,
GrainsAndHay = 0x0004,
Fish = 0x0008,
Eggs = 0x0010,
Gold = 0x0020
Gold = 0x0020,
Leather = 0x0040,
Metal = 0x0080
}
[Flags]
@ -205,22 +207,22 @@ namespace Server.Mobiles
private static readonly bool EnableRummaging = true;
public static readonly TimeSpan ShoutDelay = TimeSpan.FromMinutes(1);
private static readonly Type[] m_Eggs =
private static readonly Type[] _eggs =
{
typeof(FriedEggs), typeof(Eggs)
};
private static readonly Type[] m_Fish =
private static readonly Type[] _fish =
{
typeof(FishSteak), typeof(RawFishSteak)
};
private static readonly Type[] m_GrainsAndHay =
private static readonly Type[] _grainsAndHay =
{
typeof(BreadLoaf), typeof(FrenchBread), typeof(SheafOfHay)
};
private static readonly Type[] m_Meat =
private static readonly Type[] _meat =
{
/* Cooked */
typeof(Bacon), typeof(CookedBird), typeof(Sausage),
@ -236,7 +238,7 @@ namespace Server.Mobiles
typeof(Torso), typeof(RightArm), typeof(RightLeg)
};
private static readonly Type[] m_FruitsAndVegies =
private static readonly Type[] _fruitsAndVeggies =
{
typeof(HoneydewMelon), typeof(YellowGourd), typeof(GreenGourd),
typeof(Banana), typeof(Bananas), typeof(Lemon), typeof(Lime),
@ -246,12 +248,31 @@ namespace Server.Mobiles
typeof(Onion), typeof(Lettuce), typeof(Pumpkin)
};
private static readonly Type[] m_Gold =
private static readonly Type[] _gold =
{
// white wyrms eat gold..
typeof(Gold)
};
private static readonly Type[] _metal =
{
// Materials
typeof(BaseIngot), typeof(BaseOre),
// Containers
typeof(MetalChest), typeof(MetalGoldenChest), typeof(MetalBox),
// Crafting
typeof(Gears), typeof(Saw), typeof(Axle), typeof(AxleGears),
typeof(ClockParts), typeof(Hinge), typeof(Springs), typeof(Spyglass),
typeof(Fork), typeof(ForkLeft), typeof(ForkRight), typeof(Spoon),
typeof(SpoonLeft), typeof(SpoonRight), typeof(Knife), typeof(KnifeLeft),
typeof(KnifeRight), typeof(DrawKnife), typeof(Hammer), typeof(Froe), typeof(Inshave),
typeof(Nails), typeof(RunicDovetailSaw), typeof(RunicHammer), typeof(Skillet),
typeof(SledgeHammer), typeof(Tongs), typeof(TinkerTools), typeof(SmithHammer),
typeof(AncientSmithyHammer), typeof(Scorp)
};
private bool _summoned;
private bool m_bTamable;
@ -4155,40 +4176,107 @@ namespace Server.Mobiles
}
public virtual bool CheckFoodPreference(Item f) =>
CheckFoodPreference(f, FoodType.Eggs, m_Eggs) ||
CheckFoodPreference(f, FoodType.Fish, m_Fish) ||
CheckFoodPreference(f, FoodType.GrainsAndHay, m_GrainsAndHay) ||
CheckFoodPreference(f, FoodType.Meat, m_Meat) ||
CheckFoodPreference(f, FoodType.FruitsAndVegies, m_FruitsAndVegies) ||
CheckFoodPreference(f, FoodType.Gold, m_Gold);
CheckFoodPreference(f, FoodType.Eggs) ||
CheckFoodPreference(f, FoodType.Fish) ||
CheckFoodPreference(f, FoodType.GrainsAndHay) ||
CheckFoodPreference(f, FoodType.Meat) ||
CheckFoodPreference(f, FoodType.FruitsAndVeggies) ||
CheckFoodPreference(f, FoodType.Gold) ||
CheckFoodPreference(f, FoodType.Metal) ||
CheckFoodPreference(f, FoodType.Leather);
public virtual bool CheckFoodPreference(Item fed, FoodType type, Type[] types)
private bool CheckFoodPreference(Item fed, FoodType type)
{
if ((FavoriteFood & type) == 0)
{
return false;
}
var fedType = fed.GetType();
var contains = false;
for (var i = 0; !contains && i < types.Length; ++i)
// Goat special case
if (type == FoodType.Leather)
{
contains = fedType == types[i];
if (fed is BaseLeather or Bag or Pouch or Server.Items.Backpack or StrongBackpack)
{
return true;
}
if (fed is BaseArmor armor)
{
return armor.MaterialType
is ArmorMaterialType.Leather
or ArmorMaterialType.Studded
or ArmorMaterialType.Spined
or ArmorMaterialType.Horned
or ArmorMaterialType.Barbed;
}
CraftResource craftResource;
if (fed is BaseWeapon weapon)
{
craftResource = weapon.Resource;
}
else if (fed is BaseClothing clothing)
{
craftResource = clothing.Resource;
}
else
{
return false;
}
return CraftResources.GetType(craftResource) == CraftResourceType.Leather;
}
return contains;
if (type == FoodType.Metal)
{
if (fed is BaseArmor armor)
{
return armor.MaterialType
is ArmorMaterialType.Ringmail
or ArmorMaterialType.Chainmail
or ArmorMaterialType.Plate;
}
CraftResource craftResource;
if (fed is BaseWeapon weapon)
{
craftResource = weapon.Resource;
}
else if (fed is BaseClothing clothing)
{
craftResource = clothing.Resource;
}
else
{
return fed.GetType().InTypeList(_metal);
}
return CraftResources.GetType(craftResource) == CraftResourceType.Metal;
}
var types = type switch
{
FoodType.Eggs => _eggs,
FoodType.Fish => _fish,
FoodType.GrainsAndHay => _grainsAndHay,
FoodType.Meat => _meat,
FoodType.FruitsAndVeggies => _fruitsAndVeggies,
FoodType.Gold => _gold,
};
return fed.GetType().InTypeList(types);
}
public virtual bool CheckFeed(Mobile from, Item dropped)
{
if (IsDeadPet || !Controlled || (ControlMaster != from && !IsPetFriend(from)))
if (IsDeadPet || !Controlled || ControlMaster != from && !IsPetFriend(from))
{
return false;
}
if (!CheckFoodPreference(dropped))
{
PrivateOverheadMessage(MessageType.Regular, 0x3B2, 1043257, from.NetState); // The animal shies away.
return false;
}
@ -4219,7 +4307,6 @@ namespace Server.Mobiles
m_Loyalty = Math.Min(MaxLoyalty, Utility.CoinFlips(amount, MaxLoyaltyIncrease) * 10);
}
/* if (happier )*/
// looks like in OSI pets say they are happier even if they are at maximum loyalty
SayTo(from, 502060); // Your pet looks happier.

View file

@ -73,7 +73,7 @@ namespace Server.Mobiles
public override bool CanHeal => true;
public override bool CanHealOwner => true;
public override FoodType FavoriteFood => FoodType.FruitsAndVegies;
public override FoodType FavoriteFood => FoodType.FruitsAndVeggies;
public override bool CanAngerOnTame => true;
public override bool StatLossAfterTame => true;
public override int Hides => 10;

View file

@ -39,6 +39,6 @@ namespace Server.Mobiles
public override string DefaultName => "a squirrell";
public override int Meat => 1;
public override FoodType FavoriteFood => FoodType.FruitsAndVegies;
public override FoodType FavoriteFood => FoodType.FruitsAndVeggies;
}
}

View file

@ -47,7 +47,7 @@ namespace Server.Mobiles
public override Poison PoisonImmune => Poison.Lesser;
public override Poison HitPoison => Poison.Lesser;
public override FoodType FavoriteFood => FoodType.Meat | FoodType.Fish | FoodType.FruitsAndVegies |
public override FoodType FavoriteFood => FoodType.Meat | FoodType.Fish | FoodType.FruitsAndVeggies |
FoodType.GrainsAndHay | FoodType.Eggs;
public override void GenerateLoot()

View file

@ -68,7 +68,7 @@ namespace Server.Mobiles
public override Poison PoisonImmune => Poison.Greater;
public override Poison HitPoison => Poison.Greater;
public override FoodType FavoriteFood => FoodType.FruitsAndVegies | FoodType.GrainsAndHay;
public override FoodType FavoriteFood => FoodType.FruitsAndVeggies | FoodType.GrainsAndHay;
public override bool CanAngerOnTame => true;
public override WeaponAbility GetWeaponAbility() => WeaponAbility.BleedAttack;

View file

@ -34,47 +34,36 @@ namespace Server.SkillHandlers
{
from.SendLocalizedMessage(500331); // The spirits of the dead are not the province of animal lore.
}
else if (targeted is BaseCreature c)
else if (targeted is not BaseCreature c)
{
if (!c.IsDeadPet)
{
if (c.Body.IsAnimal || c.Body.IsMonster || c.Body.IsSea)
{
if (!c.Controlled && from.Skills.AnimalLore.Value < 100.0)
{
from.SendLocalizedMessage(
1049674
); // At your skill level, you can only lore tamed creatures.
}
else if (!c.Controlled && !c.Tamable && from.Skills.AnimalLore.Value < 110.0)
{
from.SendLocalizedMessage(
1049675
); // At your skill level, you can only lore tamed or tameable creatures.
}
else if (!from.CheckTargetSkill(SkillName.AnimalLore, c, 0.0, 120.0))
{
from.SendLocalizedMessage(500334); // You can't think of anything you know offhand.
}
else
{
from.CloseGump<AnimalLoreGump>();
from.SendGump(new AnimalLoreGump(c));
}
}
else
{
from.SendLocalizedMessage(500329); // That's not an animal!
}
}
else
{
from.SendLocalizedMessage(500331); // The spirits of the dead are not the province of animal lore.
}
from.SendLocalizedMessage(500329); // That's not an animal!
}
else if (c.IsDeadPet)
{
from.SendLocalizedMessage(500331); // The spirits of the dead are not the province of animal lore.
}
else if (!c.Body.IsAnimal && c.Body is { IsMonster: false, IsSea: false })
{
from.SendLocalizedMessage(500329); // That's not an animal!
}
else if (!c.Controlled && from.Skills.AnimalLore.Value < 100.0)
{
// At your skill level, you can only lore tamed creatures.
from.SendLocalizedMessage(1049674);
}
else if (!c.Controlled && !c.Tamable && from.Skills.AnimalLore.Value < 110.0)
{
// At your skill level, you can only lore tamed or tameable creatures.
from.SendLocalizedMessage(1049675);
}
else if (!from.CheckTargetSkill(SkillName.AnimalLore, c, 0.0, 120.0))
{
from.SendLocalizedMessage(500334); // You can't think of anything you know offhand.
}
else
{
from.SendLocalizedMessage(500329); // That's not an animal!
from.CloseGump<AnimalLoreGump>();
from.SendGump(new AnimalLoreGump(c));
}
}
}
@ -181,23 +170,20 @@ namespace Server.SkillHandlers
AddHtml(320, 168, 35, 18, FormatElement(c.PhysicalResistance));
AddHtmlLocalized(153, 186, 160, 18, 1061647, LabelColor); // Fire
AddHtml(320, 186, 35, 18, FormatElement(c.FireResistance));
AddHtml(320, 186, 35, 18, FormatElement(c.FireResistance, "#FF0000"));
AddHtmlLocalized(153, 204, 160, 18, 1061648, LabelColor); // Cold
AddHtml(320, 204, 35, 18, FormatElement(c.ColdResistance));
AddHtml(320, 204, 35, 18, FormatElement(c.ColdResistance, "#000080"));
AddHtmlLocalized(153, 222, 160, 18, 1061649, LabelColor); // Poison
AddHtml(320, 222, 35, 18, FormatElement(c.PoisonResistance));
AddHtml(320, 222, 35, 18, FormatElement(c.PoisonResistance, "#008000"));
AddHtmlLocalized(153, 240, 160, 18, 1061650, LabelColor); // Energy
AddHtml(320, 240, 35, 18, FormatElement(c.EnergyResistance));
AddHtml(320, 240, 35, 18, FormatElement(c.EnergyResistance, "#BF80FF"));
AddButton(340, 358, 5601, 5605, 0, GumpButtonType.Page, page + 1);
AddButton(317, 358, 5603, 5607, 0, GumpButtonType.Page, page - 1);
}
if (Core.AOS)
{
AddPage(++page);
AddImage(128, 152, 2086);
@ -207,16 +193,16 @@ namespace Server.SkillHandlers
AddHtml(320, 168, 35, 18, FormatElement(c.PhysicalDamage));
AddHtmlLocalized(153, 186, 160, 18, 1061647, LabelColor); // Fire
AddHtml(320, 186, 35, 18, FormatElement(c.FireDamage));
AddHtml(320, 186, 35, 18, FormatElement(c.FireDamage, "#FF0000"));
AddHtmlLocalized(153, 204, 160, 18, 1061648, LabelColor); // Cold
AddHtml(320, 204, 35, 18, FormatElement(c.ColdDamage));
AddHtml(320, 204, 35, 18, FormatElement(c.ColdDamage, "#000080"));
AddHtmlLocalized(153, 222, 160, 18, 1061649, LabelColor); // Poison
AddHtml(320, 222, 35, 18, FormatElement(c.PoisonDamage));
AddHtml(320, 222, 35, 18, FormatElement(c.PoisonDamage, "#008000"));
AddHtmlLocalized(153, 240, 160, 18, 1061650, LabelColor); // Energy
AddHtml(320, 240, 35, 18, FormatElement(c.EnergyDamage));
AddHtml(320, 240, 35, 18, FormatElement(c.EnergyDamage, "#BF80FF"));
if (Core.ML)
{
@ -256,6 +242,8 @@ namespace Server.SkillHandlers
AddHtml(320, 240, 35, 18, FormatSkill(c, SkillName.Poisoning));
}
// TODO: Add remaining combat skills
AddImage(128, 260, 2086);
AddHtmlLocalized(147, 258, 160, 18, 3001032, 200); // Lore & Knowledge
@ -268,6 +256,8 @@ namespace Server.SkillHandlers
AddHtmlLocalized(153, 312, 160, 18, 1044106, LabelColor); // Meditation
AddHtml(320, 312, 35, 18, FormatSkill(c, SkillName.Meditation));
// TODO: Add remaining skills
AddButton(340, 358, 5601, 5605, 0, GumpButtonType.Page, page + 1);
AddButton(317, 358, 5603, 5607, 0, GumpButtonType.Page, page - 1);
@ -278,7 +268,11 @@ namespace Server.SkillHandlers
var foodPref = 3000340;
if ((c.FavoriteFood & FoodType.FruitsAndVegies) != 0)
if ((c.FavoriteFood & FoodType.Meat) != 0)
{
foodPref = 1049564; // Meat
}
else if ((c.FavoriteFood & FoodType.FruitsAndVeggies) != 0)
{
foodPref = 1049565; // Fruits and Vegetables
}
@ -290,15 +284,17 @@ namespace Server.SkillHandlers
{
foodPref = 1049568; // Fish
}
else if ((c.FavoriteFood & FoodType.Meat) != 0)
else if ((c.FavoriteFood & FoodType.Metal) != 0)
{
foodPref = 1049564; // Meat
foodPref = 1049567; // Metal
}
else if ((c.FavoriteFood & FoodType.Eggs) != 0)
{
foodPref = 1044477; // Eggs
}
// TODO: Add 1115752 "Blackrock Stew" as a food type
AddHtmlLocalized(153, 168, 160, 18, foodPref, LabelColor);
AddImage(128, 188, 2086);
@ -341,6 +337,10 @@ namespace Server.SkillHandlers
AddHtmlLocalized(153, 204, 160, 18, packInstinct, LabelColor);
// TODO: Add Pet Slots
// TODO: Add Abilities
if (!Core.AOS)
{
AddImage(128, 224, 2086);
@ -402,14 +402,16 @@ namespace Server.SkillHandlers
return $"<div align=right>{val:F1}</div>";
}
private static string FormatElement(int val)
private static string FormatElement(int val, string color = null)
{
if (val <= 0)
if (color == null)
{
return "<div align=right>---</div>";
return val == 0 ? "<div align=right>---</div>" : $"<div align=right>{val}%</div>";
}
return $"<div align=right>{val}%</div>";
return val == 0
? $"<BASEFONT COLOR={color}><div align=right>---</div>"
: $"<BASEFONT COLOR={color}><div align=right>{val}%</div>";
}
private static string FormatDamage(int min, int max)