Supersedes #2376 (@jwvalentine). This is a reviewed, corrected, and scoped-down **Phase 1** of Joe Valentine's throwing implementation — his original commits are cherry-picked here with authorship preserved, plus a fix/scoping pass. Phase 1 lands only the **core gargoyle Throwing skill**; the incomplete content is excised for follow-up PRs (see below). ## What's included (core skill) - `BaseThrown` combat mechanics on top of the existing skeleton: close-quarters penalty, below-min-range penalty, shield penalty, STR-scaled range, overthrow damage penalty. - Base weapons: **Boomerang, Cyclone, SoulGlaive** (gargoyle-only), + blacksmith crafting (SA-gated). - Two symmetric hooks on `BaseWeapon` (`ModifyHitChance`, new `ModifyDamage`) that are inert no-ops for every other weapon. ## Fixes over the original - **Overthrow damage**: was dead code (the swing gate already guarantees you're within `MaxRange`, so the old `ComputeDamage` check never fired). Reimplemented as `finalDamage × 0.53` applied *after* all offensive bonuses via a new `ModifyDamage` hook, firing at the outer range ring. - **`DefMaxRange`**: clamped to `[MinThrowRange, MaxThrowRange]` (uncapped before → e.g. range 13 at 200 Str) and guarded against a latent divide-by-zero. - **Close-quarters mitigation** now uses `RawDex` (matches ServUO/OSI; deterministic under stat mods). - **Return-throw timer** guarded against a deleted/unmapped thrower/target. - Reverted the `MovingShot` change (it rebalanced archery — belongs in a separate PR). - Kept only complex-logic tests (hit-chance/range/damage math); dropped property-value assertions. ## Excised for follow-up PRs (Phase 2/3) 7 named artifacts, the Into-the-Void quest + Agralem, GargishOutcast, the Bladeweaver vendor, and the SA loot tables — these were unwired/non-functional (loot never triggered, quest/creature never spawned) and will return properly wired. `StormCaller` also needs its missing Battle Lust, and the quest its correct void-creature target. ## Verification - Build: 0 warnings / 0 errors. - `UOContent.Tests`: **501/501** passing (the `ModifyDamage` hook causes zero regressions across all weapons). - Full whole-branch review completed: no must-fix defects.
24 lines
804 B
C#
24 lines
804 B
C#
using ModernUO.Serialization;
|
|
|
|
namespace Server.Items;
|
|
|
|
[SerializationGenerator(0)]
|
|
public partial class Boomerang : BaseThrown
|
|
{
|
|
[Constructible]
|
|
public Boomerang() : base(0x8FF) => Layer = Layer.OneHanded;
|
|
|
|
public override double DefaultWeight => 4.0;
|
|
public override int MinThrowRange => 4;
|
|
|
|
public override WeaponAbility PrimaryAbility => WeaponAbility.MysticArc;
|
|
public override WeaponAbility SecondaryAbility => WeaponAbility.ConcussionBlow;
|
|
public override int AosStrengthReq => 25;
|
|
public override int AosMinDamage => 11;
|
|
public override int AosMaxDamage => 15;
|
|
public override float MlSpeed => 2.75f;
|
|
public override int InitMinHits => 31;
|
|
public override int InitMaxHits => 60;
|
|
|
|
public override int RequiredRaces => Race.AllowGargoylesOnly;
|
|
}
|