fix: Updates races to properly support gargoyle equipment. (#744)

* Adds `RaceFlag` to the `Race` object. This is `1 << RaceIndex`
* Replaces `RequiredRace`  with `RequiredRaces` for items.
* Adds convenience flags for `RequiredRaces`
  ```cs
  
  public const int AllowAllRaces = 0x7;      // Race.Human.RaceFlag | Race.Elf.RaceFlag | Race.Gargoyle.RaceFlag
  public const int AllowHumanOrElves = 0x3;  // Race.Human.RaceFlag | Race.Elf.RaceFlag
  public const int AllowElvesOnly = 0x2;     // Race.Elf.RaceFlag
  public const int AllowGargoylesOnly = 0x4; // Race.Gargoyle.RaceFlag
  ```
* Example usage on an item:
  ```cs
  public override int RequiredRaces => Race.AllowHumanOrElves;
  ```
* Adds Wood and Stone armor material types
* Updates Woodland armor to Wood
* Adds proper messaging for race restrictions
* Adds gargoyle only for object properties
* Adds `CheckRace` functions for validating if a race or mobile can use the item:
  ```cs
  bool CheckRace(Race race);
  bool CheckRace(Mobile from, bool message = true);
  ```
This commit is contained in:
Kamron Batman 2021-08-29 00:43:55 -07:00 • committed by GitHub
parent bf20800382
commit 8ffd5a5bd0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
58 changed files with 147 additions and 125 deletions

View file

@ -50,7 +50,9 @@ namespace Server.Items
Ringmail,
Chainmail,
Plate,
Dragon // On OSI, Dragon is seen and considered its own type.
Dragon,
Wood,
Stone
}
public enum ArmorMeditationAllowance

View file

@ -564,7 +564,6 @@ namespace Server.Items
public virtual CraftResource DefaultResource => CraftResource.Iron;
public virtual Race RequiredRace => null;
[Hue]
[CommandProperty(AccessLevel.GameMaster)]
@ -988,17 +987,8 @@ namespace Server.Items
if (item is BaseArmor armor)
{
if (armor.RequiredRace != null && m.Race != armor.RequiredRace)
if (!armor.CheckRace(m))
{
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.Female && m.AccessLevel < AccessLevel.GameMaster)
@ -1287,17 +1277,8 @@ namespace Server.Items
if (from.AccessLevel < AccessLevel.GameMaster)
{
if (RequiredRace != null && from.Race != RequiredRace)
if (!CheckRace(from))
{
if (RequiredRace == Race.Elf)
{
from.SendLocalizedMessage(1072203); // Only Elves may use this.
}
else
{
from.SendMessage("Only {0} may use this.", RequiredRace.PluralName);
}
return false;
}
@ -1503,12 +1484,12 @@ namespace Server.Items
list.Add(1041350); // faction item
}
if (RequiredRace == Race.Elf)
if (RequiredRaces == Race.AllowElvesOnly)
{
list.Add(1075086); // Elves Only
}
if (RequiredRace == Race.Gargoyle)
if (RequiredRaces == Race.AllowGargoylesOnly)
{
list.Add(1111709); // Gargoyles Only
}

View file

@ -25,6 +25,6 @@ namespace Server.Items
public override ArmorMeditationAllowance DefMedAllowance => ArmorMeditationAllowance.All;
public override Race RequiredRace => Race.Elf;
public override int RequiredRaces => Race.AllowElvesOnly;
}
}

View file

@ -7,7 +7,7 @@ namespace Server.Items
[Constructible]
public GemmedCirclet() : base(0x2B70) => Weight = 2.0;
public override Race RequiredRace => Race.Elf;
public override int RequiredRaces => Race.AllowElvesOnly;
public override int BasePhysicalResistance => 1;
public override int BaseFireResistance => 5;

View file

@ -7,7 +7,7 @@ namespace Server.Items
[Constructible]
public RavenHelm() : base(0x2B71) => Weight = 5.0;
public override Race RequiredRace => Race.Elf;
public override int RequiredRaces => Race.AllowElvesOnly;
public override int BasePhysicalResistance => 5;
public override int BaseFireResistance => 1;

View file

@ -7,7 +7,7 @@ namespace Server.Items
[Constructible]
public RoyalCirclet() : base(0x2B6F) => Weight = 2.0;
public override Race RequiredRace => Race.Elf;
public override int RequiredRaces => Race.AllowElvesOnly;
public override int BasePhysicalResistance => 1;
public override int BaseFireResistance => 5;

View file

@ -7,7 +7,7 @@ namespace Server.Items
[Constructible]
public VultureHelm() : base(0x2B72) => Weight = 5.0;
public override Race RequiredRace => Race.Elf;
public override int RequiredRaces => Race.AllowElvesOnly;
public override int BasePhysicalResistance => 5;
public override int BaseFireResistance => 1;

View file

@ -7,7 +7,7 @@ namespace Server.Items
[Constructible]
public WingedHelm() : base(0x2B73) => Weight = 5.0;
public override Race RequiredRace => Race.Elf;
public override int RequiredRaces => Race.AllowElvesOnly;
public override int BasePhysicalResistance => 5;
public override int BaseFireResistance => 1;

View file

@ -7,7 +7,7 @@ namespace Server.Items
[Constructible]
public GargishLeatherArmsType1() : base(0x301) => Weight = 4.0;
public override Race RequiredRace => Race.Gargoyle;
public override int RequiredRaces => Race.AllowGargoylesOnly;
public override int BasePhysicalResistance => 5;
public override int BaseFireResistance => 6;
public override int BaseColdResistance => 7;

View file

@ -7,7 +7,7 @@ namespace Server.Items
[Constructible]
public GargishLeatherArmsType2() : base(0x302) => Weight = 4.0;
public override Race RequiredRace => Race.Gargoyle;
public override int RequiredRaces => Race.AllowGargoylesOnly;
public override int BasePhysicalResistance => 5;
public override int BaseFireResistance => 6;
public override int BaseColdResistance => 7;

View file

@ -7,7 +7,7 @@ namespace Server.Items
[Constructible]
public GargishLeatherChestType1() : base(0x0304) => Weight = 4.0;
public override Race RequiredRace => Race.Gargoyle;
public override int RequiredRaces => Race.AllowGargoylesOnly;
public override int BasePhysicalResistance => 5;
public override int BaseFireResistance => 6;
public override int BaseColdResistance => 7;

View file

@ -7,7 +7,7 @@ namespace Server.Items
[Constructible]
public GargishLeatherChestType2() : base(0x303) => Weight = 4.0;
public override Race RequiredRace => Race.Gargoyle;
public override int RequiredRaces => Race.AllowGargoylesOnly;
public override int BasePhysicalResistance => 5;
public override int BaseFireResistance => 6;
public override int BaseColdResistance => 7;

View file

@ -7,7 +7,7 @@ namespace Server.Items
[Constructible]
public GargishLeatherKiltType1() : base(0x311) => Weight = 4.0;
public override Race RequiredRace => Race.Gargoyle;
public override int RequiredRaces => Race.AllowGargoylesOnly;
public override int BasePhysicalResistance => 5;
public override int BaseFireResistance => 6;
public override int BaseColdResistance => 7;

View file

@ -7,7 +7,7 @@ namespace Server.Items
[Constructible]
public GargishLeatherKiltType2() : base(0x310) => Weight = 4.0;
public override Race RequiredRace => Race.Gargoyle;
public override int RequiredRaces => Race.AllowGargoylesOnly;
public override int BasePhysicalResistance => 5;
public override int BaseFireResistance => 6;
public override int BaseColdResistance => 7;

View file

@ -7,7 +7,7 @@ namespace Server.Items
[Constructible]
public GargishLeatherLegsType1() : base(0x305) => Weight = 4.0;
public override Race RequiredRace => Race.Gargoyle;
public override int RequiredRaces => Race.AllowGargoylesOnly;
public override int BasePhysicalResistance => 5;
public override int BaseFireResistance => 6;
public override int BaseColdResistance => 7;

View file

@ -7,7 +7,7 @@ namespace Server.Items
[Constructible]
public GargishLeatherLegsType2() : base(0x306) => Weight = 4.0;
public override Race RequiredRace => Race.Gargoyle;
public override int RequiredRaces => Race.AllowGargoylesOnly;
public override int BasePhysicalResistance => 5;
public override int BaseFireResistance => 6;
public override int BaseColdResistance => 7;

View file

@ -7,7 +7,7 @@ namespace Server.Items
[Constructible]
public GargishLeatherWingArmor() : base(0x457E) => Weight = 2.0;
public override Race RequiredRace => Race.Gargoyle;
public override int RequiredRaces => Race.AllowGargoylesOnly;
public override int PhysicalResistance => 0;
public override int FireResistance => 0;
public override int ColdResistance => 0;

View file

@ -7,7 +7,7 @@ namespace Server.Items
[Constructible]
public LeafArms() : base(0x2FC8) => Weight = 2.0;
public override Race RequiredRace => Race.Elf;
public override int RequiredRaces => Race.AllowElvesOnly;
public override int BasePhysicalResistance => 2;
public override int BaseFireResistance => 3;
public override int BaseColdResistance => 2;

View file

@ -7,7 +7,7 @@ namespace Server.Items
[Constructible]
public LeafChest() : base(0x2FC5) => Weight = 2.0;
public override Race RequiredRace => Race.Elf;
public override int RequiredRaces => Race.AllowElvesOnly;
public override int BasePhysicalResistance => 2;
public override int BaseFireResistance => 3;
public override int BaseColdResistance => 2;

View file

@ -10,7 +10,7 @@ namespace Server.Items
[Constructible]
public LeafGloves() : base(0x2FC6) => Weight = 2.0;
public override Race RequiredRace => Race.Elf;
public override int RequiredRaces => Race.AllowElvesOnly;
public override int BasePhysicalResistance => 2;
public override int BaseFireResistance => 3;
public override int BaseColdResistance => 2;

View file

@ -6,7 +6,7 @@ namespace Server.Items
[Constructible]
public LeafGorget() : base(0x2FC7) => Weight = 2.0;
public override Race RequiredRace => Race.Elf;
public override int RequiredRaces => Race.AllowElvesOnly;
public override int BasePhysicalResistance => 2;
public override int BaseFireResistance => 3;
public override int BaseColdResistance => 2;

View file

@ -7,7 +7,7 @@ namespace Server.Items
[Constructible]
public LeafLegs() : base(0x2FC9) => Weight = 2.0;
public override Race RequiredRace => Race.Elf;
public override int RequiredRaces => Race.AllowElvesOnly;
public override int BasePhysicalResistance => 2;
public override int BaseFireResistance => 3;

View file

@ -7,7 +7,7 @@ namespace Server.Items
[Constructible]
public LeafTonlet() : base(0x2FCA) => Weight = 2.0;
public override Race RequiredRace => Race.Elf;
public override int RequiredRaces => Race.AllowElvesOnly;
public override int BasePhysicalResistance => 2;
public override int BaseFireResistance => 3;
public override int BaseColdResistance => 2;

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.Wood;
}
}

View file

@ -21,7 +21,7 @@ namespace Server.Items
public override int ArmorBase => 40;
public override ArmorMaterialType MaterialType => ArmorMaterialType.Plate;
public override Race RequiredRace => Race.Elf;
public override ArmorMaterialType MaterialType => ArmorMaterialType.Wood;
public override int RequiredRaces => Race.AllowElvesOnly;
}
}

View file

@ -21,7 +21,7 @@ namespace Server.Items
public override int ArmorBase => 40;
public override ArmorMaterialType MaterialType => ArmorMaterialType.Plate;
public override Race RequiredRace => Race.Elf;
public override ArmorMaterialType MaterialType => ArmorMaterialType.Wood;
public override int RequiredRaces => Race.AllowElvesOnly;
}
}

View file

@ -21,7 +21,7 @@ namespace Server.Items
public override int ArmorBase => 40;
public override ArmorMaterialType MaterialType => ArmorMaterialType.Plate;
public override Race RequiredRace => Race.Elf;
public override ArmorMaterialType MaterialType => ArmorMaterialType.Wood;
public override int RequiredRaces => Race.AllowElvesOnly;
}
}

View file

@ -23,7 +23,7 @@ namespace Server.Items
public override int ArmorBase => 40;
public override ArmorMaterialType MaterialType => ArmorMaterialType.Plate;
public override Race RequiredRace => Race.Elf;
public override ArmorMaterialType MaterialType => ArmorMaterialType.Wood;
public override int RequiredRaces => Race.AllowElvesOnly;
}
}

View file

@ -21,7 +21,7 @@ namespace Server.Items
public override int ArmorBase => 40;
public override ArmorMaterialType MaterialType => ArmorMaterialType.Plate;
public override Race RequiredRace => Race.Elf;
public override ArmorMaterialType MaterialType => ArmorMaterialType.Wood;
public override int RequiredRaces => Race.AllowElvesOnly;
}
}

View file

@ -7,7 +7,7 @@ namespace Server.Items
[Constructible]
public GargishStuddedArmsType1() : base(0x284) => Weight = 10.0;
public override Race RequiredRace => Race.Gargoyle;
public override int RequiredRaces => Race.AllowGargoylesOnly;
public override int BasePhysicalResistance => 6;
public override int BaseFireResistance => 6;
public override int BaseColdResistance => 4;

View file

@ -7,7 +7,7 @@ namespace Server.Items
[Constructible]
public GargishStuddedArmsType2() : base(0x283) => Weight = 10.0;
public override Race RequiredRace => Race.Gargoyle;
public override int RequiredRaces => Race.AllowGargoylesOnly;
public override int BasePhysicalResistance => 6;
public override int BaseFireResistance => 6;
public override int BaseColdResistance => 4;

View file

@ -7,7 +7,7 @@ namespace Server.Items
[Constructible]
public GargishStuddedChestType1() : base(0x286) => Weight = 15.0;
public override Race RequiredRace => Race.Gargoyle;
public override int RequiredRaces => Race.AllowGargoylesOnly;
public override int BasePhysicalResistance => 6;
public override int BaseFireResistance => 6;
public override int BaseColdResistance => 4;

View file

@ -7,7 +7,7 @@ namespace Server.Items
[Constructible]
public GargishStuddedChestType2() : base(0x285) => Weight = 15.0;
public override Race RequiredRace => Race.Gargoyle;
public override int RequiredRaces => Race.AllowGargoylesOnly;
public override int BasePhysicalResistance => 6;
public override int BaseFireResistance => 6;
public override int BaseColdResistance => 4;

View file

@ -7,7 +7,7 @@ namespace Server.Items
[Constructible]
public GargishStuddedKiltType1() : base(0x288) => Weight = 10.0;
public override Race RequiredRace => Race.Gargoyle;
public override int RequiredRaces => Race.AllowGargoylesOnly;
public override int BasePhysicalResistance => 6;
public override int BaseFireResistance => 6;
public override int BaseColdResistance => 4;

View file

@ -7,7 +7,7 @@ namespace Server.Items
[Constructible]
public GargishStuddedKiltType2() : base(0x287) => Weight = 10.0;
public override Race RequiredRace => Race.Gargoyle;
public override int RequiredRaces => Race.AllowGargoylesOnly;
public override int BasePhysicalResistance => 6;
public override int BaseFireResistance => 6;
public override int BaseColdResistance => 4;

View file

@ -7,7 +7,7 @@ namespace Server.Items
[Constructible]
public GargishStuddedLegsType1() : base(0x28A) => Weight = 15.0;
public override Race RequiredRace => Race.Gargoyle;
public override int RequiredRaces => Race.AllowGargoylesOnly;
public override int BasePhysicalResistance => 6;
public override int BaseFireResistance => 6;
public override int BaseColdResistance => 4;

View file

@ -7,7 +7,7 @@ namespace Server.Items
[Constructible]
public GargishStuddedLegsType2() : base(0x289) => Weight = 15.0;
public override Race RequiredRace => Race.Gargoyle;
public override int RequiredRaces => Race.AllowGargoylesOnly;
public override int BasePhysicalResistance => 6;
public override int BaseFireResistance => 6;
public override int BaseColdResistance => 4;

View file

@ -7,7 +7,7 @@ namespace Server.Items
[Constructible]
public HideChest() : base(0x2B74) => Weight = 6.0;
public override Race RequiredRace => Race.Elf;
public override int RequiredRaces => Race.AllowElvesOnly;
public override int BasePhysicalResistance => 3;
public override int BaseFireResistance => 3;

View file

@ -7,7 +7,7 @@ namespace Server.Items
[Constructible]
public HideFemaleChest() : base(0x2B79) => Weight = 6.0;
public override Race RequiredRace => Race.Elf;
public override int RequiredRaces => Race.AllowElvesOnly;
public override int BasePhysicalResistance => 3;
public override int BaseFireResistance => 3;

View file

@ -7,7 +7,7 @@ namespace Server.Items
[Constructible]
public HideGloves() : base(0x2B75) => Weight = 2.0;
public override Race RequiredRace => Race.Elf;
public override int RequiredRaces => Race.AllowElvesOnly;
public override int BasePhysicalResistance => 3;
public override int BaseFireResistance => 3;

View file

@ -7,7 +7,7 @@ namespace Server.Items
[Constructible]
public HideGorget() : base(0x2B76) => Weight = 3.0;
public override Race RequiredRace => Race.Elf;
public override int RequiredRaces => Race.AllowElvesOnly;
public override int BasePhysicalResistance => 3;
public override int BaseFireResistance => 3;

View file

@ -7,7 +7,7 @@ namespace Server.Items
[Constructible]
public HidePants() : base(0x2B78) => Weight = 5.0;
public override Race RequiredRace => Race.Elf;
public override int RequiredRaces => Race.AllowElvesOnly;
public override int BasePhysicalResistance => 3;
public override int BaseFireResistance => 3;

View file

@ -7,7 +7,7 @@ namespace Server.Items
[Constructible]
public HidePauldrons() : base(0x2B77) => Weight = 4.0;
public override Race RequiredRace => Race.Elf;
public override int RequiredRaces => Race.AllowElvesOnly;
public override int BasePhysicalResistance => 3;
public override int BaseFireResistance => 3;

View file

@ -713,11 +713,16 @@ namespace Server.Items
list.Add(1060636); // exceptional
}
if (RequiredRace == Race.Elf)
if (RequiredRaces == Race.AllowElvesOnly)
{
list.Add(1075086); // Elves Only
}
if (RequiredRaces == Race.AllowGargoylesOnly)
{
list.Add(1111709); // Gargoyles Only
}
SkillBonuses?.GetProperties(list);
int prop;

View file

@ -479,7 +479,7 @@ namespace Server.Items
[Constructible]
public FemaleElvenRobe(int hue = 0) : base(0x2FBA, hue) => Weight = 2.0;
public override Race RequiredRace => Race.Elf;
public override int RequiredRaces => Race.AllowElvesOnly;
public override bool AllowMaleWearer => false;
}

View file

@ -39,6 +39,6 @@ namespace Server.Items
[Constructible]
public ElvenPants(int hue = 0) : base(0x2FC3, hue) => Weight = 2.0;
public override Race RequiredRace => Race.Elf;
public override int RequiredRaces => Race.AllowElvesOnly;
}
}

View file

@ -42,7 +42,7 @@ namespace Server.Items
[Constructible]
public ElvenShirt(int hue = 0) : base(0x3175, hue) => Weight = 2.0;
public override Race RequiredRace => Race.Elf;
public override int RequiredRaces => Race.AllowElvesOnly;
}
[Serializable(0)]

View file

@ -194,7 +194,7 @@ namespace Server.Items
public override CraftResource DefaultResource => CraftResource.RegularLeather;
public override Race RequiredRace => Race.Elf;
public override int RequiredRaces => Race.AllowElvesOnly;
public override bool Dye(Mobile from, DyeTub sender) => false;
}

View file

@ -31,7 +31,7 @@ namespace Server.Items
[Constructible]
public WoodlandBelt(int hue = 0) : base(0x2B68, hue) => Weight = 4.0;
public override Race RequiredRace => Race.Elf;
public override int RequiredRaces => Race.AllowElvesOnly;
public override bool Dye(Mobile from, DyeTub sender)
{

View file

@ -30,7 +30,7 @@ namespace Server.Items
public override int InitMinHits => 255;
public override int InitMaxHits => 255;
public override Race RequiredRace => Race.Elf;
public override int RequiredRaces => Race.AllowElvesOnly;
public override void Serialize(IGenericWriter writer)
{

View file

@ -26,7 +26,7 @@ namespace Server.Items
public override int InitMinHits => 255;
public override int InitMaxHits => 255;
public override Race RequiredRace => Race.Elf;
public override int RequiredRaces => Race.AllowElvesOnly;
public override void Serialize(IGenericWriter writer)
{

View file

@ -607,12 +607,10 @@ namespace Server.Items
m_Props.Set(2, true); // remove durability bonus from possible properties
}
if (armor.RequiredRace == Race.Elf)
if (armor.RequiredRaces == Race.AllowElvesOnly)
{
m_Props.Set(
7,
true
); // elves inherently have night sight and elf only armor doesn't get night sight as a mod
// elves inherently have night sight and elf only armor doesn't get night sight as a mod
m_Props.Set(7, true);
}
for (var i = 0; i < attributeCount; ++i)
@ -628,7 +626,7 @@ namespace Server.Items
switch (random)
{
/* Begin Sheilds */
/* Begin Shields */
case 0:
ApplyAttribute(primary, min, max, AosAttribute.SpellChanneling, 1, 1);
break;

View file

@ -114,9 +114,6 @@ namespace Server.Items
}
}
public virtual Race RequiredRace =>
null; // On OSI, there are no weapons with race requirements, this is for custom stuff
public virtual bool UseSkillMod => !Core.AOS;
public static bool InDoubleStrike { get; set; }
@ -915,17 +912,8 @@ namespace Server.Items
return false;
}
if (RequiredRace != null && from.Race != RequiredRace)
if (!CheckRace(from))
{
if (RequiredRace == Race.Elf)
{
from.SendLocalizedMessage(1072203); // Only Elves may use this.
}
else
{
from.SendMessage("Only {0} may use this.", RequiredRace.PluralName);
}
return false;
}
@ -2945,11 +2933,16 @@ namespace Server.Items
list.Add(1060636); // exceptional
}
if (RequiredRace == Race.Elf)
if (RequiredRaces == Race.AllowElvesOnly)
{
list.Add(1075086); // Elves Only
}
if (RequiredRaces == Race.AllowGargoylesOnly)
{
list.Add(1111709); // Gargoyles Only
}
if (ArtifactRarity > 0)
{
list.Add(1061078, ArtifactRarity.ToString()); // artifact rarity ~1_val~