4.1 KiB
Spell Processing System
Comprehensive spell casting engine managing all aspects of spell processing including timers, targeting, resource management, and heroic opportunities.
Components
SpellProcess - Core engine managing active spells, cast/recast timers, interrupt queues, spell queues, and heroic opportunities SpellTargeting - Target selection for all spell types (self, single, group, AOE, PBAE) with validation SpellResourceChecker - Resource validation/consumption for power, health, concentration, savagery, dissonance SpellManager - High-level coordinator integrating all systems with comprehensive casting API
Key Data Structures
// Active spell instance
type LuaSpell struct {
Spell *Spell // Spell definition
CasterID int32 // Casting entity
Targets []int32 // Target list
Timer SpellTimer // Duration/tick timing
NumCalls int32 // Tick count
Interrupted bool // Interrupt state
}
// Cast timing
type CastTimer struct {
CasterID int32 // Casting entity
SpellID int32 // Spell being cast
StartTime time.Time // Cast start
Duration time.Duration // Cast time
}
// Cooldown timing
type RecastTimer struct {
CasterID int32 // Entity with cooldown
SpellID int32 // Spell on cooldown
Duration time.Duration // Cooldown time
LinkedTimer int32 // Shared cooldown group
}
Usage
// Main spell processing loop (50ms intervals)
spellManager.ProcessSpells()
// Cast spell with full validation
err := spellManager.CastSpell(casterID, targetID, spellID)
// Interrupt casting
spellManager.InterruptSpell(entityID, spellID, errorCode, canceled, fromMovement)
// Queue management
spellManager.AddSpellToQueue(spellID, casterID, targetID, priority)
spellManager.RemoveSpellFromQueue(spellID, casterID)
// Status checks
ready := spellManager.IsSpellReady(spellID, casterID)
recastTime := spellManager.GetSpellRecastTime(spellID, casterID)
canCast, reason := spellManager.CanCastSpell(casterID, targetID, spellID)
// Resource checking
resourceChecker := spellManager.GetResourceChecker()
powerResult := resourceChecker.CheckPower(luaSpell, customPowerReq)
allResults := resourceChecker.CheckAllResources(luaSpell, 0, 0)
success := resourceChecker.ConsumeAllResources(luaSpell, 0, 0)
// Targeting
targeting := spellManager.GetTargeting()
targetResult := targeting.GetSpellTargets(luaSpell, options)
Effect Types (80+)
Stat Modifications: Health, power, stats (STR/AGI/STA/INT/WIS), resistances, attack, mitigation Spell Modifications: Cast time, power req, range, duration, resistibility, crit chance Actions: Damage, healing, DOT/HOT, resurrect, summon, mount, invisibility Control: Stun, root, mez, fear, charm, blind, kill Special: Change race/size/title, faction, exp, tradeskill bonuses
Target Types
TargetTypeSelf (0) - Self-only spells TargetTypeSingle (1) - Single target with validation TargetTypeGroup (2) - Group members TargetTypeGroupAE (3) - Group area effect TargetTypeAE (4) - True area effect TargetTypePBAE (5) - Point blank area effect
Interrupt System
Causes: Movement, damage, stun, mesmerize, fear, manual cancellation, out of range Processing: Queued interrupts processed every cycle with proper cleanup Error Codes: Match client expectations for proper UI feedback
Performance
- 50ms Processing: Matches client update expectations
- Efficient Indexing: Fast lookups by caster, spell, target
- Thread Safety: Concurrent access with proper locking
- Memory Management: Cleanup of expired timers and effects
- Batch Operations: Multiple resource checks/targeting in single calls
Integration Points
Entity System: Caster/target info, position data, combat state Zone System: Position validation, line-of-sight, spawn management Group System: Group member targeting and coordination Database: Persistent spell data, character spell books Packet System: Client communication for spell states LUA System: Custom spell scripting (future)