Files
Fractured/modules/mod-paragon/conf/mod_paragon.conf.dist
T
Docker Build 4d2a80ddb8 Paragon: server-authoritative CP/rune sync + cascade-spell revoke hardening
mod-paragon Paragon_Essence.cpp:
- Broaden SkillLinesLinkedToSpell: collect every SkillLineAbility row for
  an anchor spell regardless of AcquireMethod, so anchor spells whose
  primary SLA uses AcquireMethod 0 (e.g. Blood Strike) correctly identify
  their skill lines and let the dependent classifier do its job.
- IsSpellSkillLineCascadeDependent / RevokeUnwantedCascadeSpellsForPlayer
  use the broadened helper. HandleCommit calls the post-purchase sweep
  immediately so the spellbook never carries lingering cascade dependents
  (Blood Presence / Forceful Deflection / Death Coil / Death Grip).
- New character_paragon_panel_spell_revoked table tracks which active
  dependents we've revoked per (guid, parent) so OnPlayerLogin can
  re-revoke them after AC's _LoadSkills -> learnSkillRewardedSpells
  silently re-grants them.
- OnPlayerLogin opens the client SILENCE window via SendSilenceOpenForCommit
  with an empty allow list and intentionally omits the matching
  SendSilenceClose: the chat frame buffers CHAT_MSG_SYSTEM during the
  loading screen and only flushes after PLAYER_ENTERING_WORLD, so a paired
  CLOSE would shut the filter before the buffered "you have unlearned X"
  toasts hit it. The addon's 8s fail-open closes the window after the flush.
- New `.paragon hat` chat command for diagnosing Honor Among Thieves
  triggers (talent rank, learned spell, applied aura, proc table entry).

mod-paragon Paragon_SC.cpp:
- OnPlayerUpdate pushes server-authoritative combo points to the client
  via PARAA "R CP <n>" whenever the count changes. The client-side
  ComboFrame Paragon simulator listens for this and updates the target
  frame, fixing HAT-generated CP not displaying (HAT's trigger casts
  with a null target, which the combat-log inference path can't see).
- OnPlayerUpdate also pushes "R RUNES <cd0..cd5>" (ms remaining per
  rune slot) on rune mask changes, so the client RuneFrame simulator
  stays in lock-step with Spell::TakeRunePower instead of drifting
  through combat-log latency.

mod-paragon SQL:
- New updates/2026_05_09_00.sql migration creates
  character_paragon_panel_spell_revoked for AC's auto-DBUpdater so a
  fresh checkout can stand up an existing characters DB without
  manual intervention. Matching CREATE TABLE IF NOT EXISTS in
  base/character_paragon_panel_learned.sql for fresh installs.

mod-paragon conf:
- New Paragon.Diag.PanelLearn flag traces every PanelLearnSpellChain
  commit (chain ids, before/after spell-map sizes, side-spell
  classification) for diagnosing "spell reappears on relog" bugs.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-09 11:22:57 -04:00

50 lines
2.4 KiB
Plaintext

# mod-paragon — Paragon (class 12) server options
#
# Copy to mod_paragon.conf in the same directory to override defaults.
[worldserver]
# Sticky combo points (server-side): CP pool is per-player; switching targets
# does not reset points. Implemented in core Unit::AddComboPoints / GetComboPoints.
Paragon.StickyComboPoints = 1
# When enabled, Paragon answers HasActivePowerType() for mana/rage/energy/focus
# in addition to runes/runic power. Required for the patch-enUS-5.MPQ player
# frame to populate Mana/Rage/Energy bars - otherwise the server treats those
# powers as inactive and never sends max values, leaving the bars empty.
Paragon.MultiResource.HasActivePowers = 1
# Ability / Talent Essence (AE/TE) — Ascension-inspired currency
Paragon.Currency.Enabled = 1
Paragon.Currency.AE.Start = 9
Paragon.Currency.TE.Start = 0
# From this character level onward, each level-up grants both essences once.
Paragon.Currency.GrantLevelMin = 10
Paragon.Currency.AE.PerLevel = 1
Paragon.Currency.TE.PerLevel = 1
# Flat TE cost per successful talent rank learn (hook runs once per LearnTalent).
# Applies to passive / aura-only talents (addToSpellBook == 0).
Paragon.Currency.TE.TalentLearnCost = 1
# AE cost per rank for addToSpellBook talents (Starfall, Bladestorm, …).
# Those talents also charge TE.TalentLearnCost per rank — each rank costs
# both essences at the configured amounts.
Paragon.Currency.AE.TalentLearnCost = 1
# Default AE cost when spell is not listed in world.paragon_spell_ae_cost.
# (Phase 3a: every learnable spell baked into the Character Advancement panel
# has an explicit row of value 1 in that table, so this default only kicks in
# for spells learned via .paragon learn that aren't in the panel's bake.)
Paragon.Currency.AE.DefaultSpellCost = 1
# Diagnostics ----------------------------------------------------------------
# When enabled, dumps every Paragon's rune cooldown state to the server log
# every 5 seconds (channel "module"). Use with `.paragon runes` for in-game
# verification. Leave at 0 in production — it's noisy.
Paragon.Diag.RuneTrace = 0
# When enabled, traces every PanelLearnSpellChain commit: chain ids, before/
# after spell-map sizes for each rank learn, and the classification of every
# auto-granted side spell (chain rank / passive dep / active dep revoked).
# Use to diagnose "spell X reappears in spellbook on relog" style bugs.
# Leave at 0 in production.
Paragon.Diag.PanelLearn = 0