ForeverSafari-v1.0.3.zip
What's new
[v1.0.3] — 2026-10-18
🐛 Critical Bug Fixes & System Improvements
1. 3D Model Pedestal Arena Rendering & Viewport Synchronization
- Fixed Blank Battle Arena Pedestals: Resolved a critical issue where neither the player's companion nor the opposing trainer's beast appeared on the 3D model pedestals upon initiating battle.
- Asynchronous Viewport Layout Synchronization: Identified and resolved modern Retail client engine (
_classic_beta_/dataEnv: 16) viewport layout race conditions where invoking:SetDisplayInfo()synchronously in the same call stack asframe:Show()failed due to uninitialized 0×0 native Direct3D/OpenGL canvas dimensions. - Multi-Pass Deferred Render Ticks: Added deferred synchronization ticks via
C_Timer.After(0.05)andC_Timer.After(0.2)inBF:ShowBattle(), combined with anOnShowframe script hook onForeverSafariBattleFramein UI/BattleFrame.lua. - Eliminated Asynchronous
ClearModel()Race Condition: Replaced unconditionalClearModel()calls with display ID caching (_currentDisplayId), preventing the engine's asynchronous unmount queue from destroying newly requested model display meshes. - Asynchronous
OnModelLoadedScript Hook: RegisteredOnModelLoadedevent handlers onPlayerModelwidgets to ensure rotation, camera distance scale (1.0), and idle animation (0) are cleanly applied after CASC streaming completes. - Corrected Player Model Initialization Facing: Fixed the initial player companion rotation in
BF:Initialize()frommath.rad(145)to the canonicalmath.rad(45)facing diagonally forward toward the opponent. - Dynamic Turn Desync Auto-Recovery: Added automatic state verification in
BF:UpdateUI()so that if 3D model frames ever lose attachment, they immediately re-mount without requiring UI reloads. - Type-Safe Display ID Parsing: Wrapped display IDs with
tonumber()to guard against stringified SavedVariables causing Lua 5.1 comparison errors.
2. Moonkin / Wildkin Humanoid Rival Battler & AI Trainer Archetype
- Humanoid Mob Rule Enforcement: Ensured all Moonkin, Wildkin, and Owlbeast mobs (such as Young Moonkin, Moonkin, and Raging Moonkin in Darkshore near Auberdine) are strictly recognized as Humanoid NPC Trainers fielding their own companion rosters, never as catchable wild beasts.
- Dedicated
"Moonkin"Archetype: Added theWildkin Moon-Watcherarchetype to Data/TrainerDB.lua with authentic lore quotes:- Intro: "Hoooot! The sacred forest spirits answer the moon's call!"
- Defeat: "Hoo-oo... Elune watches over your journey..."
- Bounty: +12 Safari Tokens base reward.
- Thematic Companion Beast Roster: Configured an authentic nature/druidic companion squad for Wildkin trainers:
- Sprite Darter (Dragonkin, Display ID: 2769, Moves: 901, 902)
- Darkshore Thistle Bear (Beast, Display ID: 742, Moves: 101, 102)
- Moonstalker Cub (Beast, Display ID: 775, Moves: 103, 107)
- Darkshore Strider (Tallstrider, Display ID: 1068, Moves: 101, 202)
- Robust Name & Creature Type Resolution: Extended
TrainerDB:GetArchetypeForUnitandTE:IsHumanoidTrainer(Core/TrainerEngine.lua) with fallback string matching for"moonkin","wildkin", and"owlbeast".
[v1.0.2] — 2026-10-17
🐛 Critical Bug Fixes
1. Turn-Based Battle Engine & Combat Log Stability
- Fixed Combat Start UI Crash: Resolved a fatal Lua runtime error (
UI/BattleFrame.lua:301: attempt to call a nil value) triggered during battle initialization. Replaced non-existent legacy method:IsAtBottom()with the canonical modern Retail ScrollingMessageFrame API method:AtBottom(). - Battle Log Auto-Scroll: Messages now cleanly auto-scroll down to the latest round resolution without locking or interrupting turn sequencing.
2. SavedVariables Persistence & Session Reload Integrity
- Fixed
/reloadState Wipe: Resolved an issue where newly unboxed starter companions, captured wildlife, and inventory items were wiped upon UI reload or logout. - Removed Destructive Logout Hook: Purged
ForeverSafariDB = nilfromForeverSafari.lua(PLAYER_LOGOUT), ensuringForeverSafariDBremains persistent, encrypted, and authoritative across all client sessions.
3. 3D Paperdoll Model Framing & Camera Lock Overhaul
- Purged Legacy Portrait Camera Lock: Removed hardcoded
SetCustomCamera(0)andSetPortraitZoom(0)fromUI/BattleFrame.lua,UI/JournalFrame.lua,UI/InspectorFrame.lua, andUI/Views/JournalRosterView.lua. - Full Bounding-Box Perspective Rendering: Modern Retail
PlayerModelnow relies on canonical:SetDisplayInfo()engine framing, cleanly centering the full creature body on its arena or journal pedestal without cropping or macro-zooming into teeth or skull bones. - Corrected Arena Facing Angles: Player companion faces diagonally forward-right toward the quarry (
math.rad(45)), and wild enemy faces diagonally forward-left toward the player (math.rad(-35)). - Smooth Spotlight Rotation & Zoom: Unified rotation state in
UI/Views/JournalRosterView.luaacross mouse dragging and the◄/►buttons using:SetRotation().
4. Field Directives & Observation Quest Progression
- Reverted Dispatch #2 to Field Observation: Corrected
Dispatch #2: Field Observation 101(Data/BountyDB.lua) from an unintended capture requirement (CAPTURE_TOTAL) back to pure field observation (OBSERVE). - Objective: Study 3 wild creatures in their natural habitat using the field research lens / binoculars.
- Progress Tracking Hook: Connected
CaptureEngine:CompleteSnareChannel()directly toDB:UpdateQuestProgress("OBSERVE", 1). - Verified Mailbox Reward Claiming: Validated turn-in at town mailboxes to claim +20 Safari Tokens, 3x Iron Cages, and 2x Safari Treats, cleanly unlocking Dispatch #3 (The Wild Nourishment).
[v1.0.1] — 2026-10-15
- Initial public release of the modular Junior Safari League addon.
- Turn-based 2.5D Battle Arena, Virtual Safari Bag, Kennel Vault, and Field Guide Journal.
This mod has no additional files

