• Listen to a special audio message from Bill Roper to the Hive Workshop community (Bill is a former Vice President of Blizzard Entertainment, Producer, Designer, Musician, Voice Actor) 🔗Click here to hear his message!
  • Read Evilhog's interview with Gregory Alper, the original composer of the music for WarCraft: Orcs & Humans 🔗Click here to read the full interview.
  • The Hive's 22nd Icon Contest: Creep Abilities is now concluded, time to vote for your favourite set of icons! Click here to vote!
  • ✅ The POLL for Hive's Texturing Contest #34 is OPEN! Vote for the TOP 3 SKINS! 🔗Click here to cast your vote!
  • ✅ The POLL for Hive's Techtree Contest #20 is OPEN! Vote for the TOP 3 FACTIONS! 🔗Click here to cast your vote!

[HD/Modeling] Quest UI Design not satisfied need help with a new one

Level 12
Joined
Apr 27, 2009
Messages
237
Could someone make me a better UI or just a design idea because i am not pleased with mine.
I have already made one an UI with Warcraft 3 Reforged UI Designer (RUID) program for my map Warcraft 3 Reforged: Defense of the Plaguelands
You can see how it looks in my map when picking the first quest near the Villager

I am not as pleased with the design, would like something that suits the Warcraft III Reforged UI design but is more slick, classy then this

Screenshot 2026-01-11 171242.png


An example what I like

Screenshot 2026-01-11 191552.png


I don't know how to make the transparent block like from image above, which type box it is

Code:
-- ============================================
-- SKELETON QUEST SYSTEM WITH 2 QUESTS (CLICKABLE HEADER)
-- ============================================

-- Quest 1 UI Frame references
BackdropVeryBlack014 = nil
BackdropUndeadUnrest = nil
Text05 = nil
Backdrop02Copy = nil
Text08 = nil
Text05Copy = nil
Backdrop02 = nil

-- Quest 5 UI Frame references
BackdropVeryBlack015 = nil
BackdropUndeadSource = nil
Text09 = nil
Backdrop03 = nil
Text06 = nil
Backdrop03Copy = nil
Text06Copy = nil

-- Quest header
questsHeaderButton = nil
Text08Copy = nil

-- Quest UI visibility
local questUIVisible = true

-- Quest 1 tracking variables
local skeletonArcherCurrent = 0
local skeletonArcherTarget = 10
local skeletonMageCurrent = 0
local skeletonMageTarget = 5
local quest1Active = false

-- Quest 5 tracking variables
local ghostCurrent = 0
local ghostTarget = 10
local wraithCurrent = 0
local wraithTarget = 5
local quest5Active = false

-- Death trigger (shared for both quests)
local deathTrigger = nil

-- Initialize the UI
REFORGEDUIMAKER = {}
REFORGEDUIMAKER.Initialize = function()
    -- ========== QUEST 1: UNDEAD UNREST ==========
 
    -- Main quest panel
    BackdropVeryBlack014 = BlzCreateFrame("QuestButtonBaseTemplate", BlzGetFrameByName("ConsoleUIBackdrop", 0), 0, 0)
    BlzFrameSetAbsPoint(BackdropVeryBlack014, FRAMEPOINT_TOPLEFT, 0.770520, 0.425287)
    BlzFrameSetAbsPoint(BackdropVeryBlack014, FRAMEPOINT_BOTTOMRIGHT, 0.876800, 0.308537)
 
    -- "Quests" header BUTTON (CLICKABLE)
    questsHeaderButton = BlzCreateFrame("ScriptDialogButton", BlzGetFrameByName("ConsoleUIBackdrop", 0), 0, 0)
    BlzFrameSetAbsPoint(questsHeaderButton, FRAMEPOINT_TOPLEFT, 0.796520, 0.475297)
    BlzFrameSetAbsPoint(questsHeaderButton, FRAMEPOINT_BOTTOMRIGHT, 0.850800, 0.444597)
 
    -- "Quests" header text (properly centered with slight left nudge)
    Text08Copy = BlzCreateFrameByType("TEXT", "Text08Copy", questsHeaderButton, "", 0)
    BlzFrameSetPoint(Text08Copy, FRAMEPOINT_CENTER, questsHeaderButton, FRAMEPOINT_CENTER, -0.0012, 0.0)
    BlzFrameSetText(Text08Copy, "|cffFFCC00Quests|r")
    BlzFrameSetEnable(Text08Copy, false)
    BlzFrameSetScale(Text08Copy, 1.00)
    BlzFrameSetTextAlignment(Text08Copy, TEXT_JUSTIFY_CENTER, TEXT_JUSTIFY_MIDDLE)

 
    -- "Undead Unrest" title background
    BackdropUndeadUnrest = BlzCreateFrame("QuestButtonDisabledBackdropTemplate", BlzGetFrameByName("ConsoleUIBackdrop", 0), 0, 0)
    BlzFrameSetAbsPoint(BackdropUndeadUnrest, FRAMEPOINT_TOPLEFT, 0.774000, 0.434777)
    BlzFrameSetAbsPoint(BackdropUndeadUnrest, FRAMEPOINT_BOTTOMRIGHT, 0.873000, 0.404397)
 
    -- Quest 1 title "Undead Unrest"
    Text08 = BlzCreateFrameByType("TEXT", "Text08", BlzGetFrameByName("ConsoleUIBackdrop", 0), "", 0)
    BlzFrameSetAbsPoint(Text08, FRAMEPOINT_TOPLEFT, 0.774000, 0.429777)
    BlzFrameSetAbsPoint(Text08, FRAMEPOINT_BOTTOMRIGHT, 0.873000, 0.409397)
    BlzFrameSetText(Text08, "|cffFFCC00Undead Unrest|r")
    BlzFrameSetEnable(Text08, false)
    BlzFrameSetScale(Text08, 1.15)
    BlzFrameSetTextAlignment(Text08, TEXT_JUSTIFY_CENTER, TEXT_JUSTIFY_MIDDLE)
 
    -- Skeleton Archer icon
    Backdrop02 = BlzCreateFrameByType("BACKDROP", "Backdrop02", BlzGetFrameByName("ConsoleUIBackdrop", 0), "", 1)
    BlzFrameSetAbsPoint(Backdrop02, FRAMEPOINT_TOPLEFT, 0.783660, 0.398897)
    BlzFrameSetAbsPoint(Backdrop02, FRAMEPOINT_BOTTOMRIGHT, 0.823660, 0.358897)
    BlzFrameSetTexture(Backdrop02, "ReplaceableTextures\\CommandButtons\\BTNSkeletonArcher.blp", 0, true)
 
    -- Skeleton Archer counter
    Text05 = BlzCreateFrameByType("TEXT", "Text05", BlzGetFrameByName("ConsoleUIBackdrop", 0), "", 0)
    BlzFrameSetAbsPoint(Text05, FRAMEPOINT_TOPLEFT, 0.828660, 0.383347)
    BlzFrameSetAbsPoint(Text05, FRAMEPOINT_BOTTOMRIGHT, 0.868660, 0.372227)
    BlzFrameSetText(Text05, "|cffffffff0 / 10|r")
    BlzFrameSetEnable(Text05, false)
    BlzFrameSetScale(Text05, 1.00)
    BlzFrameSetTextAlignment(Text05, TEXT_JUSTIFY_LEFT, TEXT_JUSTIFY_MIDDLE)
 
    -- Skeleton Mage icon
    Backdrop02Copy = BlzCreateFrameByType("BACKDROP", "Backdrop02Copy", BlzGetFrameByName("ConsoleUIBackdrop", 0), "", 1)
    BlzFrameSetAbsPoint(Backdrop02Copy, FRAMEPOINT_TOPLEFT, 0.783660, 0.358187)
    BlzFrameSetAbsPoint(Backdrop02Copy, FRAMEPOINT_BOTTOMRIGHT, 0.823660, 0.318187)
    BlzFrameSetTexture(Backdrop02Copy, "ReplaceableTextures\\CommandButtons\\BTNSkeletonMage.blp", 0, true)
 
    -- Skeleton Mage counter
    Text05Copy = BlzCreateFrameByType("TEXT", "Text05Copy", BlzGetFrameByName("ConsoleUIBackdrop", 0), "", 0)
    BlzFrameSetAbsPoint(Text05Copy, FRAMEPOINT_TOPLEFT, 0.828660, 0.342807)
    BlzFrameSetAbsPoint(Text05Copy, FRAMEPOINT_BOTTOMRIGHT, 0.868660, 0.331687)
    BlzFrameSetText(Text05Copy, "|cffffffff0 / 5|r")
    BlzFrameSetEnable(Text05Copy, false)
    BlzFrameSetScale(Text05Copy, 1.00)
    BlzFrameSetTextAlignment(Text05Copy, TEXT_JUSTIFY_LEFT, TEXT_JUSTIFY_MIDDLE)
 
    -- ========== QUEST 5: UNDEAD SOURCE (SAME POSITION AS QUEST 1) ==========
 
    -- Quest 5 panel (SAME POSITION AS QUEST 1)
    BackdropVeryBlack015 = BlzCreateFrame("QuestButtonBaseTemplate", BlzGetFrameByName("ConsoleUIBackdrop", 0), 0, 0)
    BlzFrameSetAbsPoint(BackdropVeryBlack015, FRAMEPOINT_TOPLEFT, 0.770520, 0.425287)
    BlzFrameSetAbsPoint(BackdropVeryBlack015, FRAMEPOINT_BOTTOMRIGHT, 0.876800, 0.308537)
 
    -- "Undead Source" title background (SAME POSITION AS UNDEAD UNREST)
    BackdropUndeadSource = BlzCreateFrame("QuestButtonDisabledBackdropTemplate", BlzGetFrameByName("ConsoleUIBackdrop", 0), 0, 0)
    BlzFrameSetAbsPoint(BackdropUndeadSource, FRAMEPOINT_TOPLEFT, 0.774000, 0.434777)
    BlzFrameSetAbsPoint(BackdropUndeadSource, FRAMEPOINT_BOTTOMRIGHT, 0.873000, 0.404397)
 
    -- Quest 5 title "Undead Source" (SAME POSITION AS UNDEAD UNREST)
    Text09 = BlzCreateFrameByType("TEXT", "Text09", BlzGetFrameByName("ConsoleUIBackdrop", 0), "", 0)
    BlzFrameSetAbsPoint(Text09, FRAMEPOINT_TOPLEFT, 0.774000, 0.429777)
    BlzFrameSetAbsPoint(Text09, FRAMEPOINT_BOTTOMRIGHT, 0.873000, 0.409397)
    BlzFrameSetText(Text09, "|cffFFCC00Undead Source|r")
    BlzFrameSetEnable(Text09, false)
    BlzFrameSetScale(Text09, 1.15)
    BlzFrameSetTextAlignment(Text09, TEXT_JUSTIFY_CENTER, TEXT_JUSTIFY_MIDDLE)
 
    -- Ghost icon (SAME POSITION AS SKELETON ARCHER)
    Backdrop03 = BlzCreateFrameByType("BACKDROP", "Backdrop03", BlzGetFrameByName("ConsoleUIBackdrop", 0), "", 1)
    BlzFrameSetAbsPoint(Backdrop03, FRAMEPOINT_TOPLEFT, 0.783660, 0.398897)
    BlzFrameSetAbsPoint(Backdrop03, FRAMEPOINT_BOTTOMRIGHT, 0.823660, 0.358897)
    BlzFrameSetTexture(Backdrop03, "ReplaceableTextures\\CommandButtons\\BTNGhost.blp", 0, true)
 
    -- Ghost counter (SAME POSITION AS SKELETON ARCHER COUNTER)
    Text06 = BlzCreateFrameByType("TEXT", "Text06", BlzGetFrameByName("ConsoleUIBackdrop", 0), "", 0)
    BlzFrameSetAbsPoint(Text06, FRAMEPOINT_TOPLEFT, 0.828660, 0.383347)
    BlzFrameSetAbsPoint(Text06, FRAMEPOINT_BOTTOMRIGHT, 0.868660, 0.372227)
    BlzFrameSetText(Text06, "|cffffffff0 / 10|r")
    BlzFrameSetEnable(Text06, false)
    BlzFrameSetScale(Text06, 1.00)
    BlzFrameSetTextAlignment(Text06, TEXT_JUSTIFY_LEFT, TEXT_JUSTIFY_MIDDLE)
 
    -- Wraith icon (SAME POSITION AS SKELETON MAGE)
    Backdrop03Copy = BlzCreateFrameByType("BACKDROP", "Backdrop03Copy", BlzGetFrameByName("ConsoleUIBackdrop", 0), "", 1)
    BlzFrameSetAbsPoint(Backdrop03Copy, FRAMEPOINT_TOPLEFT, 0.783660, 0.358187)
    BlzFrameSetAbsPoint(Backdrop03Copy, FRAMEPOINT_BOTTOMRIGHT, 0.823660, 0.318187)
    BlzFrameSetTexture(Backdrop03Copy, "ReplaceableTextures\\CommandButtons\\BTNWraith.blp", 0, true)
 
    -- Wraith counter (SAME POSITION AS SKELETON MAGE COUNTER)
    Text06Copy = BlzCreateFrameByType("TEXT", "Text06Copy", BlzGetFrameByName("ConsoleUIBackdrop", 0), "", 0)
    BlzFrameSetAbsPoint(Text06Copy, FRAMEPOINT_TOPLEFT, 0.828660, 0.342807)
    BlzFrameSetAbsPoint(Text06Copy, FRAMEPOINT_BOTTOMRIGHT, 0.868660, 0.331687)
    BlzFrameSetText(Text06Copy, "|cffffffff0 / 5|r")
    BlzFrameSetEnable(Text06Copy, false)
    BlzFrameSetScale(Text06Copy, 1.00)
    BlzFrameSetTextAlignment(Text06Copy, TEXT_JUSTIFY_LEFT, TEXT_JUSTIFY_MIDDLE)
 
    -- Hide all UI initially
    HideQuest1UI()
    HideQuest5UI()
    BlzFrameSetVisible(questsHeaderButton, false)
    BlzFrameSetVisible(Text08Copy, false)
 
    -- Initialize the quest header button click
    InitializeQuestHeaderButton()
end

-- Initialize quest header button click functionality
function InitializeQuestHeaderButton()
    local clickTrigger = CreateTrigger()
    BlzTriggerRegisterFrameEvent(clickTrigger, questsHeaderButton, FRAMEEVENT_CONTROL_CLICK)
    TriggerAddAction(clickTrigger, ToggleQuestUI)
end

-- Toggle quest visibility
function ToggleQuestUI()
    questUIVisible = not questUIVisible
 
    if questUIVisible then
        -- Show active quests
        if quest1Active then
            ShowQuest1UIInternal()
        end
        if quest5Active then
            ShowQuest5UIInternal()
        end
    else
        -- Hide all quest UI (but keep them active in background)
        BlzFrameSetVisible(BackdropVeryBlack014, false)
        BlzFrameSetVisible(BackdropUndeadUnrest, false)
        BlzFrameSetVisible(Text08, false)
        BlzFrameSetVisible(Backdrop02, false)
        BlzFrameSetVisible(Backdrop02Copy, false)
        BlzFrameSetVisible(Text05, false)
        BlzFrameSetVisible(Text05Copy, false)
     
        BlzFrameSetVisible(BackdropVeryBlack015, false)
        BlzFrameSetVisible(BackdropUndeadSource, false)
        BlzFrameSetVisible(Text09, false)
        BlzFrameSetVisible(Backdrop03, false)
        BlzFrameSetVisible(Backdrop03Copy, false)
        BlzFrameSetVisible(Text06, false)
        BlzFrameSetVisible(Text06Copy, false)
    end
end

-- Internal show functions (don't check visibility state)
function ShowQuest1UIInternal()
    BlzFrameSetVisible(BackdropVeryBlack014, true)
    BlzFrameSetVisible(questsHeaderButton, true)
    BlzFrameSetVisible(BackdropUndeadUnrest, true)
    BlzFrameSetVisible(Text08, true)
    BlzFrameSetVisible(Text08Copy, true)
    BlzFrameSetVisible(Backdrop02, true)
    BlzFrameSetVisible(Backdrop02Copy, true)
    BlzFrameSetVisible(Text05, true)
    BlzFrameSetVisible(Text05Copy, true)
end

function ShowQuest5UIInternal()
    BlzFrameSetVisible(BackdropVeryBlack015, true)
    BlzFrameSetVisible(questsHeaderButton, true)
    BlzFrameSetVisible(BackdropUndeadSource, true)
    BlzFrameSetVisible(Text09, true)
    BlzFrameSetVisible(Text08Copy, true)
    BlzFrameSetVisible(Backdrop03, true)
    BlzFrameSetVisible(Backdrop03Copy, true)
    BlzFrameSetVisible(Text06, true)
    BlzFrameSetVisible(Text06Copy, true)
end

-- Show/Hide Quest 1 UI (respect visibility toggle)
function ShowQuest1UI()
    if not questUIVisible then return end
    ShowQuest1UIInternal()
end

function HideQuest1UI()
    BlzFrameSetVisible(BackdropVeryBlack014, false)
    BlzFrameSetVisible(BackdropUndeadUnrest, false)
    BlzFrameSetVisible(Text08, false)
    BlzFrameSetVisible(Backdrop02, false)
    BlzFrameSetVisible(Backdrop02Copy, false)
    BlzFrameSetVisible(Text05, false)
    BlzFrameSetVisible(Text05Copy, false)
end

-- Show/Hide Quest 5 UI (respect visibility toggle)
function ShowQuest5UI()
    if not questUIVisible then return end
    ShowQuest5UIInternal()
end

function HideQuest5UI()
    BlzFrameSetVisible(BackdropVeryBlack015, false)
    BlzFrameSetVisible(BackdropUndeadSource, false)
    BlzFrameSetVisible(Text09, false)
    BlzFrameSetVisible(Backdrop03, false)
    BlzFrameSetVisible(Backdrop03Copy, false)
    BlzFrameSetVisible(Text06, false)
    BlzFrameSetVisible(Text06Copy, false)
end

-- Create or update the death detection trigger
function CreateDeathTrigger()
    if not deathTrigger then
        deathTrigger = CreateTrigger()
        TriggerRegisterPlayerUnitEvent(deathTrigger, Player(PLAYER_NEUTRAL_AGGRESSIVE), EVENT_PLAYER_UNIT_DEATH, nil)
        TriggerAddAction(deathTrigger, function()
            local dyingUnit = GetTriggerUnit()
            local unitType = GetUnitTypeId(dyingUnit)
         
            -- Quest 1: Skeleton kills
            if unitType == FourCC('n003') then -- Skeleton Archer
                OnSkeletonArcherKilled()
            elseif unitType == FourCC('uskm') then -- Skeleton Mage
                OnSkeletonMageKilled()
            end
         
            -- Quest 5: Ghost/Wraith kills
            if unitType == FourCC('ugho') then -- Ghost (replace with your ID)
                OnGhostKilled()
            elseif unitType == FourCC('nwrg') then -- Wraith (replace with your ID)
                OnWraithKilled()
            end
        end)
    end
end

-- Destroy death trigger if no quests are active
function CheckDestroyDeathTrigger()
    if not quest1Active and not quest5Active and deathTrigger then
        DestroyTrigger(deathTrigger)
        deathTrigger = nil
    end
end

-- ========== QUEST 1: UNDEAD UNREST ==========

function StartSkeletonQuest()
    if quest1Active then
        DisplayTextToPlayer(GetLocalPlayer(), 0, 0, "|cffff0000Quest 1 already active!|r")
        return
    end
 
    quest1Active = true
    skeletonArcherCurrent = 0
    skeletonMageCurrent = 0
 
    ShowQuest1UI()
    UpdateSkeletonArcherCount(0, skeletonArcherTarget)
    UpdateSkeletonMageCount(0, skeletonMageTarget)
    CreateDeathTrigger()
 
    DisplayTextToPlayer(GetLocalPlayer(), 0, 0, "|cffffcc00New Quest:|r Undead Unrest - Kill 10 Skeleton Archers and 5 Skeleton Mages")
end

function UpdateSkeletonArcherCount(current, target)
    skeletonArcherCurrent = current
    if Text05 then
        if current >= target then
            BlzFrameSetText(Text05, "|cff00ff00" .. current .. " / " .. target .. "|r")
        else
            BlzFrameSetText(Text05, "|cffffffff" .. current .. " / " .. target .. "|r")
        end
    end
end

function UpdateSkeletonMageCount(current, target)
    skeletonMageCurrent = current
    if Text05Copy then
        if current >= target then
            BlzFrameSetText(Text05Copy, "|cff00ff00" .. current .. " / " .. target .. "|r")
        else
            BlzFrameSetText(Text05Copy, "|cffffffff" .. current .. " / " .. target .. "|r")
        end
    end
end

function OnSkeletonArcherKilled()
    if not quest1Active then return end
 
    if skeletonArcherCurrent < skeletonArcherTarget then
        skeletonArcherCurrent = skeletonArcherCurrent + 1
        UpdateSkeletonArcherCount(skeletonArcherCurrent, skeletonArcherTarget)
        CheckQuest1Completion()
    end
end

function OnSkeletonMageKilled()
    if not quest1Active then return end
 
    if skeletonMageCurrent < skeletonMageTarget then
        skeletonMageCurrent = skeletonMageCurrent + 1
        UpdateSkeletonMageCount(skeletonMageCurrent, skeletonMageTarget)
        CheckQuest1Completion()
    end
end

function CheckQuest1Completion()
    if skeletonArcherCurrent >= skeletonArcherTarget and skeletonMageCurrent >= skeletonMageTarget then
        CompleteQuest1()
    end
end

function CompleteQuest1()
    if not quest1Active then return end
 
    quest1Active = false
    DisplayTextToPlayer(GetLocalPlayer(), 0, 0, "|cff00ff00Quest Complete!|r Undead Unrest")
 
    HideQuest1UI()
    CheckDestroyDeathTrigger()
 
    -- Hide "Quests" header if no quests active
    if not quest5Active then
        BlzFrameSetVisible(questsHeaderButton, false)
        BlzFrameSetVisible(Text08Copy, false)
    end
end

-- ========== QUEST 5: UNDEAD SOURCE ==========

function StartUndeadSourceQuest()
    if quest5Active then
        DisplayTextToPlayer(GetLocalPlayer(), 0, 0, "|cffff0000Quest 5 already active!|r")
        return
    end
 
    quest5Active = true
    ghostCurrent = 0
    wraithCurrent = 0
 
    ShowQuest5UI()
    UpdateGhostCount(0, ghostTarget)
    UpdateWraithCount(0, wraithTarget)
    CreateDeathTrigger()
 
    DisplayTextToPlayer(GetLocalPlayer(), 0, 0, "|cffffcc00New Quest:|r Undead Source - Kill 10 Ghosts and 5 Wraiths")
end

function UpdateGhostCount(current, target)
    ghostCurrent = current
    if Text06 then
        if current >= target then
            BlzFrameSetText(Text06, "|cff00ff00" .. current .. " / " .. target .. "|r")
        else
            BlzFrameSetText(Text06, "|cffffffff" .. current .. " / " .. target .. "|r")
        end
    end
end

function UpdateWraithCount(current, target)
    wraithCurrent = current
    if Text06Copy then
        if current >= target then
            BlzFrameSetText(Text06Copy, "|cff00ff00" .. current .. " / " .. target .. "|r")
        else
            BlzFrameSetText(Text06Copy, "|cffffffff" .. current .. " / " .. target .. "|r")
        end
    end
end

function OnGhostKilled()
    if not quest5Active then return end
 
    if ghostCurrent < ghostTarget then
        ghostCurrent = ghostCurrent + 1
        UpdateGhostCount(ghostCurrent, ghostTarget)
        CheckQuest5Completion()
    end
end

function OnWraithKilled()
    if not quest5Active then return end
 
    if wraithCurrent < wraithTarget then
        wraithCurrent = wraithCurrent + 1
        UpdateWraithCount(wraithCurrent, wraithTarget)
        CheckQuest5Completion()
    end
end

function CheckQuest5Completion()
    if ghostCurrent >= ghostTarget and wraithCurrent >= wraithTarget then
        CompleteQuest5()
    end
end

function CompleteQuest5()
    if not quest5Active then return end
 
    quest5Active = false
    DisplayTextToPlayer(GetLocalPlayer(), 0, 0, "|cff00ff00Quest Complete!|r Undead Source")
 
    HideQuest5UI()
    CheckDestroyDeathTrigger()
 
    -- Hide "Quests" header if no quests active
    if not quest1Active then
        BlzFrameSetVisible(questsHeaderButton, false)
        BlzFrameSetVisible(Text08Copy, false)
    end
end

--[[
====================================
NEW FEATURES:
====================================

✅ "Quests" header is now a CLICKABLE BUTTON
✅ Click the "Quests" button to HIDE all quest UI
✅ Click again to SHOW the quest UI
✅ Quests continue tracking in the background even when hidden
✅ Both quests occupy the same position on screen
✅ When Quest 1 is active, only Quest 1 UI shows
✅ When Quest 5 is active, only Quest 5 UI shows

UNIT IDs TO REPLACE:
- Ghost: 'ugho' (replace with your Ghost unit ID)
- Wraith: 'nwrg' (replace with your Wraith unit ID)
]]
 
Last edited:
Back
Top