do
--[[
HEIGHT -> with respect to y-axis
WIDTH -> with respect to x-axis
]]
local tb = getmetatable(CustomRaceSystem)
local internal = {}
CustomRaceUI = setmetatable({}, tb)
CustomRaceUI.toc = "war3mapImported\\CustomRaceTOC.toc"
-- Configure this if you know what you are doing
-- Otherwise, try to leave this as is
local config = {
RACE_MAX_OPTIONS = 4,
MAIN_WIDTH = 0.50,
MAIN_HEIGHT = 0.44,
BACKUP_WIDTH = 0.28,
BACKUP_HEIGHT = 0.196,
UPPER_BOX_HEIGHT = 0.20, -- Must be >= DESC_BOX_HEIGHT
LOWER_BOX_HEIGHT = 0.24, -- Must be < MAIN_HEIGHT
DESC_BOX_WIDTH = 0.28,
DESC_BOX_HEIGHT = 0.14,
ICON_BOX_WIDTH = 0.16,
ICON_BOX_HEIGHT = 0.16,
ICON_DISP_WIDTH = 0.148,
ICON_DISP_HEIGHT = 0.148,
RACE_TEXT_WIDTH = 0.28,
RACE_TEXT_HEIGHT = 0.02,
SELECTION_WIDTH = 0.44,
SELECTION_HEIGHT = 0.18,
SLIDER_WIDTH = 0.01,
CONFIRM_WIDTH = 0.14,
CONFIRM_HEIGHT = 0.04,
SELECTION_TEXT_WIDTH = 0.24,
SELECTION_TEXT_HEIGHT = 0.02,
TEXTFRAME_WIDTH = 0.20,
TEXTFRAME_HEIGHT = 0.04,
WAITTEXT_WIDTH = 0.16,
WAITTEXT_HEIGHT = 0.055,
PCOUNT_WIDTH = 0.166,
PCOUNT_HEIGHT = 0.0275,
margin = {
UPPER_UPPER_MARGIN = 0.02,
UPPER_LOWER_MARGIN = 0.02,
UPPER_LEFT_MARGIN = 0.02,
UPPER_RIGHT_MARGIN = 0.02,
LOWER_UPPER_MARGIN = 0.00,
LOWER_LOWER_MARGIN = 0.02,
LOWER_LEFT_MARGIN = 0.02,
LOWER_RIGHT_MARGIN = 0.02,
RACE_LEFT_MARGIN = 0.005,
SELECTION_LOWER_MARGIN = 0.04,
SELECTION_TEXT_LEFT_MARGIN = 0.02,
WAIT_UPPER_MARGIN = -0.014,
WAIT_LEFT_MARGIN = 0,
PCOUNT_UPPER_MARGIN = -0.008,
PCOUNT_LEFT_MARGIN = 0.017,
},
scale = {
RACE_TEXT = 1.35,
SELECTION_TEXT = 1.25,
WAIT_TEXT = 1.90,
PCOUNT_TEXT = 1.75,
},
framename = {
main = "EscMenuBackdrop",
descMain = "BattleNetTextAreaTemplate",
iconMain = "QuestButtonBaseTemplate",
selectMain = "QuestButtonBaseTemplate",
sliderMain = "QuestMainListScrollBar",
buttonFrame = "ScriptDialogButton",
-- List buttons
listButtons = "EscMenuButtonTemplate",
listHighlight = "QuestButtonMouseOverHighlightTemplate",
-- Backup
backupMain = "EscMenuBackdrop",
},
-- An exception to the above suggestion
-- you can freely configure this (as long as it's not less than 0)
WAIT_DURATION = 15.00,
CRITICAL_DURATION = 5.00,
}
function internal.loadTOC()
if not BlzLoadTOCFile(CustomRaceUI.toc) then
error("CustomRaceSystemUI >> toc file was not loaded.")
end
end
function internal.generateSmallClick()
local snd = CreateSound("Sound\\Interface\\MouseClick1.wav", false, false, false, 10, 10, "")
SetSoundParamsFromLabel( gg_snd_MouseClick1, "InterfaceClick")
SetSoundDuration(snd, 390)
SetSoundVolume(snd, 127)
return snd
end
function internal.generateBigClick()
local snd = CreateSound("Sound\\Interface\\BigButtonClick.wav", false, false,
false, 10, 10, "" )
SetSoundParamsFromLabel(snd, "MouseClick1")
SetSoundDuration(snd, 239)
SetSoundVolume(snd, 127)
return snd
end
function internal.generateCriticalSound()
local snd = CreateSound("Sound\\Interface\\Warning.wav", false, false,
false, 10, 10, "" )
SetSoundParamsFromLabel(snd, "Warning")
SetSoundDuration(snd, 1903)
SetSoundVolume(snd, 127)
return snd
end
function internal.playSound(player, snd)
if GetLocalPlayer() ~= player then
SetSoundVolume(snd, 0)
end
StartSound(snd)
KillSoundWhenDone(snd)
end
config.UPPER_BOX_WIDTH = config.MAIN_WIDTH
config.LOWER_BOX_WIDTH = config.MAIN_WIDTH
config.SLIDER_HEIGHT = config.SELECTION_HEIGHT
function internal.prepareAllFrames()
local world = BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0)
CustomRaceUI.main = BlzCreateFrame(config.framename.main, world, 0, 0)
BlzFrameSetSize(CustomRaceUI.main, config.MAIN_WIDTH, config.MAIN_HEIGHT)
BlzFrameClearAllPoints(CustomRaceUI.main)
BlzFrameSetAbsPoint(CustomRaceUI.main, FRAMEPOINT_TOP,
0.4, 0.80 - config.MAIN_HEIGHT/2)
CustomRaceUI.descMain = BlzCreateFrame(config.framename.descMain, CustomRaceUI.main, 0, 0)
BlzFrameSetSize(CustomRaceUI.descMain, config.DESC_BOX_WIDTH, config.DESC_BOX_HEIGHT)
BlzFrameClearAllPoints(CustomRaceUI.descMain)
BlzFrameSetPoint(CustomRaceUI.descMain, FRAMEPOINT_TOPRIGHT,
CustomRaceUI.main, FRAMEPOINT_TOPRIGHT,
-config.margin.UPPER_RIGHT_MARGIN, -config.margin.UPPER_RIGHT_MARGIN*2)
CustomRaceUI.iconMain = BlzCreateFrame(config.framename.iconMain, CustomRaceUI.main, 0, 0)
BlzFrameSetSize(CustomRaceUI.iconMain, config.ICON_BOX_WIDTH, config.ICON_BOX_HEIGHT)
BlzFrameClearAllPoints(CustomRaceUI.iconMain)
BlzFrameSetPoint(CustomRaceUI.iconMain, FRAMEPOINT_TOPLEFT,
CustomRaceUI.main, FRAMEPOINT_TOPLEFT,
config.margin.UPPER_LEFT_MARGIN, -config.margin.UPPER_UPPER_MARGIN)
CustomRaceUI.raceMain = BlzCreateFrameByType("TEXT", "CustomRaceHeaderText",
CustomRaceUI.main, "", 0)
BlzFrameSetSize(CustomRaceUI.raceMain,
(config.RACE_TEXT_WIDTH-config.margin.RACE_LEFT_MARGIN)/config.scale.RACE_TEXT,
config.RACE_TEXT_HEIGHT/config.scale.RACE_TEXT)
BlzFrameSetScale(CustomRaceUI.raceMain, config.scale.RACE_TEXT)
BlzFrameSetTextAlignment(CustomRaceUI.raceMain, TEXT_JUSTIFY_MIDDLE, TEXT_JUSTIFY_LEFT)
BlzFrameClearAllPoints(CustomRaceUI.raceMain)
BlzFrameSetPoint(CustomRaceUI.raceMain, FRAMEPOINT_BOTTOMLEFT,
CustomRaceUI.descMain, FRAMEPOINT_TOPLEFT,
config.margin.RACE_LEFT_MARGIN, 0)
CustomRaceUI.selectMain = BlzCreateFrame(config.framename.selectMain, CustomRaceUI.main, 0, 0)
BlzFrameSetSize(CustomRaceUI.selectMain, config.SELECTION_WIDTH, config.SELECTION_HEIGHT)
BlzFrameClearAllPoints(CustomRaceUI.selectMain)
BlzFrameSetPoint(CustomRaceUI.selectMain, FRAMEPOINT_BOTTOMLEFT,
CustomRaceUI.main, FRAMEPOINT_BOTTOMLEFT,
config.margin.LOWER_LEFT_MARGIN,
config.margin.LOWER_LOWER_MARGIN + config.margin.SELECTION_LOWER_MARGIN)
CustomRaceUI.sliderMain = BlzCreateFrameByType("SLIDER", "CustomRaceSlider",
CustomRaceUI.main, config.framename.sliderMain, 0)
BlzFrameSetSize(CustomRaceUI.sliderMain, config.SLIDER_WIDTH, config.SLIDER_HEIGHT)
BlzFrameClearAllPoints(CustomRaceUI.sliderMain)
BlzFrameSetPoint(CustomRaceUI.sliderMain, FRAMEPOINT_LEFT,
CustomRaceUI.selectMain, FRAMEPOINT_RIGHT,
0.00, 0.00)
CustomRaceUI.buttonFrame = BlzCreateFrameByType("GLUETEXTBUTTON", "CustomRaceConfirmButton",
CustomRaceUI.main, config.framename.buttonFrame, 0)
BlzFrameSetSize(CustomRaceUI.buttonFrame, config.CONFIRM_WIDTH, config.CONFIRM_HEIGHT)
BlzFrameClearAllPoints(CustomRaceUI.buttonFrame)
BlzFrameSetPoint(CustomRaceUI.buttonFrame, FRAMEPOINT_BOTTOMRIGHT,
CustomRaceUI.main, FRAMEPOINT_BOTTOMRIGHT,
-config.margin.LOWER_RIGHT_MARGIN, config.margin.LOWER_LOWER_MARGIN)
BlzFrameSetText(CustomRaceUI.buttonFrame, "Confirm Race")
end
function internal.prepareBackupFrames()
local world = BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0)
CustomRaceUI.backupMain = BlzCreateFrame(config.framename.backupMain, world, 0, 0)
BlzFrameSetSize(CustomRaceUI.backupMain, config.BACKUP_WIDTH, config.BACKUP_HEIGHT)
BlzFrameClearAllPoints(CustomRaceUI.backupMain)
BlzFrameSetAbsPoint(CustomRaceUI.backupMain, FRAMEPOINT_CENTER,
0.4, 0.4)
CustomRaceUI.waitText = BlzCreateFrameByType("TEXT", "CustomRaceBackupDisplayText",
CustomRaceUI.backupMain, "", 0)
BlzFrameSetSize(CustomRaceUI.waitText, config.WAITTEXT_WIDTH, config.WAITTEXT_HEIGHT)
BlzFrameSetScale(CustomRaceUI.waitText, config.scale.WAIT_TEXT)
BlzFrameSetPoint(CustomRaceUI.waitText, FRAMEPOINT_TOP,
CustomRaceUI.backupMain, FRAMEPOINT_TOP,
config.margin.WAIT_LEFT_MARGIN,
config.margin.WAIT_UPPER_MARGIN)
BlzFrameSetTextAlignment(CustomRaceUI.waitText, TEXT_JUSTIFY_MIDDLE, TEXT_JUSTIFY_CENTER)
BlzFrameSetText(CustomRaceUI.waitText, "|cffffcc00Please wait|r")
CustomRaceUI.pCountText = BlzCreateFrameByType("TEXT", "CustomRaceBackupPlayerText",
CustomRaceUI.backupMain, "", 0)
BlzFrameSetSize(CustomRaceUI.pCountText, config.PCOUNT_WIDTH, config.PCOUNT_HEIGHT)
BlzFrameSetScale(CustomRaceUI.pCountText, config.scale.PCOUNT_TEXT)
BlzFrameSetPoint(CustomRaceUI.pCountText, FRAMEPOINT_TOP,
CustomRaceUI.waitText, FRAMEPOINT_BOTTOM,
config.margin.PCOUNT_LEFT_MARGIN,
config.margin.PCOUNT_UPPER_MARGIN)
BlzFrameSetVisible(CustomRaceUI.backupMain, false)
end
function internal.prepareDispFrame()
local world = BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0)
CustomRaceUI.mainScreen = {
update = 1/60,
fadeout = 1.20,
timer = CreateTimer(),
startScale = 8.50,
endScale = 4.50,
startAlpha = 255,
endAlpha = 0,
}
CustomRaceUI.mainScreen.diffAlpha = CustomRaceUI.mainScreen.endAlpha - CustomRaceUI.mainScreen.startAlpha
CustomRaceUI.mainScreen.diffScale = CustomRaceUI.mainScreen.endScale - CustomRaceUI.mainScreen.startScale
CustomRaceUI.mainScreen.medScale = (CustomRaceUI.mainScreen.startScale + CustomRaceUI.mainScreen.endScale)/2
CustomRaceUI.mainScreen.textFrame = BlzCreateFrameByType("TEXT", "CustomRaceTextDisplay",
world, "", 0)
BlzFrameClearAllPoints(CustomRaceUI.mainScreen.textFrame)
BlzFrameSetSize(CustomRaceUI.mainScreen.textFrame, config.TEXTFRAME_WIDTH, config.TEXTFRAME_HEIGHT)
BlzFrameSetTextAlignment(CustomRaceUI.mainScreen.textFrame, TEXT_JUSTIFY_CENTER, TEXT_JUSTIFY_MIDDLE)
BlzFrameSetAbsPoint(CustomRaceUI.mainScreen.textFrame, FRAMEPOINT_CENTER, 0.40, 0.35)
BlzFrameSetScale(CustomRaceUI.mainScreen.textFrame, CustomRaceUI.mainScreen.medScale)
BlzFrameSetFocus(CustomRaceUI.mainScreen.textFrame, false)
BlzFrameSetEnable(CustomRaceUI.mainScreen.textFrame, false)
BlzFrameSetAlpha(CustomRaceUI.mainScreen.textFrame, CustomRaceUI.mainScreen.endAlpha)
CustomRaceUI.mainScreen._ticksMax = CustomRaceUI.mainScreen.fadeout // CustomRaceUI.mainScreen.update
CustomRaceUI.mainScreen._ticks = 0
CustomRaceUI.mainScreen._frameArt = function()
CustomRaceUI.mainScreen._ticks = CustomRaceUI.mainScreen._ticks - 1
local curAlpha = CustomRaceUI.mainScreen._ticks/CustomRaceUI.mainScreen._ticksMax
curAlpha = curAlpha*CustomRaceUI.mainScreen.diffAlpha
curAlpha = (CustomRaceUI.mainScreen.endAlpha - curAlpha) // 1
local curScale = CustomRaceUI.mainScreen._ticks/CustomRaceUI.mainScreen._ticksMax
curScale = (curScale*CustomRaceUI.mainScreen.diffScale)
curScale = CustomRaceUI.mainScreen.endScale - curScale
BlzFrameSetAlpha(CustomRaceUI.mainScreen.textFrame, math.tointeger(curAlpha))
BlzFrameSetScale(CustomRaceUI.mainScreen.textFrame, curScale)
if CustomRaceUI.mainScreen._ticks <= 0 then
PauseTimer(CustomRaceUI.mainScreen.timer)
end
end
CustomRaceUI.mainScreen.display = function(...)
local tt = {...}
tt.str = ""
if #tt > 0 then
for i = 1, #tt do
tt.str = tt.str .. tostring(tt[i]) .. " "
end
end
BlzFrameSetText(CustomRaceUI.mainScreen.textFrame, tt.str)
BlzFrameSetAlpha(CustomRaceUI.mainScreen.textFrame, CustomRaceUI.mainScreen.startAlpha)
BlzFrameSetScale(CustomRaceUI.mainScreen.textFrame, CustomRaceUI.mainScreen.startScale)
CustomRaceUI.mainScreen._ticks = CustomRaceUI.mainScreen._ticksMax
PauseTimer(CustomRaceUI.mainScreen.timer)
TimerStart(CustomRaceUI.mainScreen.timer, CustomRaceUI.mainScreen.update, true,
CustomRaceUI.mainScreen._frameArt)
end
end
function internal.prepareSubFrames()
CustomRaceUI.icon = BlzCreateFrameByType("BACKDROP", "", CustomRaceUI.iconMain, "", 0)
BlzFrameSetSize(CustomRaceUI.icon, config.ICON_DISP_WIDTH, config.ICON_DISP_HEIGHT)
BlzFrameClearAllPoints(CustomRaceUI.icon)
BlzFrameSetPoint(CustomRaceUI.icon, FRAMEPOINT_CENTER,
CustomRaceUI.iconMain, FRAMEPOINT_CENTER,
0, 0)
BlzFrameSetVisible(CustomRaceUI.icon, false)
CustomRaceUI.selectList = {}
CustomRaceUI.framePosData = {}
CustomRaceUI.playerData = {pointer={}}
for i = 1, config.RACE_MAX_OPTIONS do
local t = {}
t.main = BlzCreateFrameByType("GLUETEXTBUTTON", "CustomRaceSelectOption",
CustomRaceUI.selectMain, config.framename.listButtons,
0)
BlzFrameSetSize(t.main, config.SELECTION_WIDTH,
config.SELECTION_HEIGHT/config.RACE_MAX_OPTIONS)
if i ~= 1 then
BlzFrameSetPoint(t.main, FRAMEPOINT_TOP,
CustomRaceUI.selectList[i-1].main, FRAMEPOINT_BOTTOM,
0, 0)
else
BlzFrameSetPoint(t.main, FRAMEPOINT_TOP,
CustomRaceUI.selectMain, FRAMEPOINT_TOP,
0, 0)
end
t.nameframe = BlzCreateFrameByType("TEXT", "", t.main, "", 0)
t.highlight = BlzCreateFrameByType("HIGHLIGHT", "CustomRaceSelectLight", t.main,
config.framename.listHighlight, i)
BlzFrameSetEnable(t.highlight, false)
BlzFrameSetFocus(t.highlight, false)
BlzFrameSetEnable(t.nameframe, false)
BlzFrameSetFocus(t.nameframe, false)
BlzFrameSetSize(t.nameframe,
config.SELECTION_TEXT_WIDTH/config.scale.SELECTION_TEXT,
config.SELECTION_TEXT_HEIGHT/config.scale.SELECTION_TEXT)
BlzFrameSetScale(t.nameframe, config.scale.SELECTION_TEXT)
BlzFrameClearAllPoints(t.nameframe)
BlzFrameSetPoint(t.nameframe, FRAMEPOINT_LEFT,
t.main, FRAMEPOINT_LEFT,
config.margin.SELECTION_TEXT_LEFT_MARGIN, 0)
BlzFrameClearAllPoints(t.highlight)
BlzFrameSetAllPoints(t.highlight, t.main)
BlzFrameSetVisible(t.highlight, false)
-- Debug text
CustomRaceUI.selectList[i] = t
CustomRaceUI.framePosData[t.main] = i
end
BlzFrameSetVisible(CustomRaceUI.main, false)
end
function internal.addButtonAudioFeedback()
local trig = CreateTrigger()
TriggerAddCondition(trig, Condition(function()
local player = GetTriggerPlayer()
BlzFrameSetEnable(CustomRaceUI.buttonFrame, false)
BlzFrameSetEnable(CustomRaceUI.buttonFrame, true)
internal.playSound(GetTriggerPlayer(), internal.generateBigClick())
local id = CustomRaceUI.playerData.pointer[player]
local data = CustomRaceUI.playerData[id]
if (not data) or
(data.selectPos == 0) then
return
end
-- Feed back the data
CustomRace.faction[data.playerID] = data.selectPos
CustomRaceUI.display(player, false)
CustomRaceUI.removeSelectingPlayer(player)
end))
BlzTriggerRegisterFrameEvent(trig, CustomRaceUI.buttonFrame, FRAMEEVENT_CONTROL_CLICK)
local trig = CreateTrigger()
TriggerAddCondition(trig, Condition(function()
local frame = BlzGetTriggerFrame()
local player = GetTriggerPlayer()
BlzFrameSetEnable(frame, false)
BlzFrameSetEnable(frame, true)
internal.playSound(player, internal.generateSmallClick())
local id = CustomRaceUI.playerData.pointer[player]
local data = CustomRaceUI.playerData[id]
local pos = CustomRaceUI.framePosData[frame]
if not data then
return
end
if (data.selectPos ~= data.hoverOffset + pos) then
local pos2 = data.selectPos - data.hoverOffset
if (pos2 > 0) and (pos2 <= config.RACE_MAX_OPTIONS) and (GetLocalPlayer() == player) then
BlzFrameSetVisible(CustomRaceUI.selectList[pos2].highlight, false)
end
if GetLocalPlayer() == player then
BlzFrameSetVisible(CustomRaceUI.selectList[pos].highlight, true)
end
data.selectPos = data.hoverOffset + pos
else
if GetLocalPlayer() == player then
BlzFrameSetVisible(CustomRaceUI.selectList[pos].highlight, false)
end
data.selectPos = 0
end
CustomRaceUI.updateSelection(player, true)
end))
for i = 1, config.RACE_MAX_OPTIONS do
BlzTriggerRegisterFrameEvent(trig, CustomRaceUI.selectList[i].main, FRAMEEVENT_CONTROL_CLICK)
end
end
function internal.addSelectionProcess()
local trig = {CreateTrigger(), CreateTrigger()}
TriggerAddCondition(trig[1], Condition(function()
local frame = BlzGetTriggerFrame()
local player = GetTriggerPlayer()
local id = CustomRaceUI.playerData.pointer[player]
local data = CustomRaceUI.playerData[id]
local pos = CustomRaceUI.framePosData[frame]
if (not data) then
return
end
-- When a frame is selected, the info will
-- be locked to displaying the details of
-- said frame.
if data.selectPos ~= 0 then
return
end
if data.hoverPos - data.hoverOffset ~= pos then
data.hoverPos = data.hoverOffset + pos
CustomRaceUI.updateSelection(player, false)
end
end))
TriggerAddCondition(trig[2], Condition(function()
local frame = BlzGetTriggerFrame()
local player = GetTriggerPlayer()
local id = CustomRaceUI.playerData.pointer[player]
local data = CustomRaceUI.playerData[id]
local pos = CustomRaceUI.framePosData[frame]
if (not data) or
(GetLocalPlayer() ~= player) then
return
end
if data.selectPos ~= 0 then
return
end
if data.hoverPos - data.hoverOffset == pos then
data.hoverPos = 0
CustomRaceUI.updateSelection(player, false)
end
end))
for i = 1, config.RACE_MAX_OPTIONS do
BlzTriggerRegisterFrameEvent(trig[1], CustomRaceUI.selectList[i].main, FRAMEEVENT_MOUSE_ENTER)
BlzTriggerRegisterFrameEvent(trig[2], CustomRaceUI.selectList[i].main, FRAMEEVENT_MOUSE_LEAVE)
end
end
function internal.addScrollCallback()
local trig = {CreateTrigger(), CreateTrigger()}
-- This trigger is for taking note of changed values
TriggerAddCondition(trig[1], Condition(function()
local player = GetTriggerPlayer()
local id = CustomRaceUI.playerData.pointer[player]
local data = CustomRaceUI.playerData[id]
local value = (BlzGetTriggerFrameValue() + 0.5)//1
if (not data) then
return
end
data.hoverPos = data.hoverPos - data.hoverOffset
data.hoverOffset = data.hoverMax - value
data.hoverPos = data.hoverPos + data.hoverOffset
if data.selectPos ~= 0 then
return
end
CustomRaceUI.updateHoverList(player)
CustomRaceUI.updateSelection(player, false)
end))
TriggerAddCondition(trig[2], Condition(function()
local player = GetTriggerPlayer()
local value = BlzGetTriggerFrameValue()
local incr = 0
if value > 0 then
incr = 1
else
incr = -1
end
if GetLocalPlayer() == player then
BlzFrameSetValue(CustomRaceUI.sliderMain, BlzFrameGetValue(CustomRaceUI.sliderMain) + incr)
end
end))
BlzTriggerRegisterFrameEvent(trig[1], CustomRaceUI.sliderMain, FRAMEEVENT_SLIDER_VALUE_CHANGED)
BlzTriggerRegisterFrameEvent(trig[2], CustomRaceUI.sliderMain, FRAMEEVENT_MOUSE_WHEEL)
end
function CustomRaceUI.updateSelection(player, useSelectedFrame)
local id = CustomRaceUI.playerData.pointer[player]
if not id then
return
end
local data = CustomRaceUI.playerData[id]
local factionID
if useSelectedFrame then
factionID = (data.selectPos ~= 0 and data.selectPos) or data.hoverPos
else
factionID = data.hoverPos
end
-- If factionID is 0, the user didn't select any race.
if factionID == 0 then
if GetLocalPlayer() == player then
BlzFrameSetText(CustomRaceUI.descMain, "")
BlzFrameSetText(CustomRaceUI.raceMain, "")
BlzFrameSetTexture(CustomRaceUI.icon, "", 0, true)
if BlzFrameIsVisible(CustomRaceUI.icon) then
BlzFrameSetVisible(CustomRaceUI.icon, false)
end
end
else
local faction = tb._container[data.playerRace][factionID]
local texture = faction.racePic or "ReplaceableTextures\\CommandButtons\\BTNTemp.blp"
if GetLocalPlayer() == player then
BlzFrameSetText(CustomRaceUI.descMain, faction.description or "")
BlzFrameSetText(CustomRaceUI.raceMain, "|cffffcc00" .. (faction.name or "") .. "|r")
BlzFrameSetTexture(CustomRaceUI.icon, texture, 0, true)
if texture == "" then
if BlzFrameIsVisible(CustomRaceUI.icon) then
BlzFrameSetVisible(CustomRaceUI.icon, false)
end
else
if not BlzFrameIsVisible(CustomRaceUI.icon) then
BlzFrameSetVisible(CustomRaceUI.icon, true)
end
end
end
end
end
function CustomRaceUI.updateHoverList(player)
local id = CustomRaceUI.playerData.pointer[player]
if not id then
return
end
local data = CustomRaceUI.playerData[id]
local j = 1
for i = 1, config.RACE_MAX_OPTIONS do
if i + data.hoverOffset > data.factionChoices then
break
end
local t = CustomRaceUI.selectList[i]
j = j + 1
local faction = tb._container[data.playerRace][i + data.hoverOffset]
if GetLocalPlayer() == player then
if not BlzFrameIsVisible(t.main) then
BlzFrameSetVisible(t.main, true)
end
BlzFrameSetText(t.nameframe, "|cffffcc00" .. (faction.name or "") .. "|r")
end
end
if j > config.RACE_MAX_OPTIONS then
return
end
while j <= config.RACE_MAX_OPTIONS do
local t = CustomRaceUI.selectList[j]
if GetLocalPlayer() == player then
BlzFrameSetText(t.nameframe, "")
if BlzFrameIsVisible(t.main) then
BlzFrameSetVisible(t.main, false)
end
end
j = j + 1
end
end
function CustomRaceUI.defSliderBounds(player)
local id = CustomRaceUI.playerData.pointer[player]
if not id then
return
end
local data = CustomRaceUI.playerData[id]
local j = 1
if data.factionChoices <= config.RACE_MAX_OPTIONS then
if GetLocalPlayer() == player then
BlzFrameSetVisible(CustomRaceUI.sliderMain, false)
end
else
if GetLocalPlayer() == player then
BlzFrameSetMinMaxValue(CustomRaceUI.sliderMain, 0, data.hoverMax)
BlzFrameSetStepSize(CustomRaceUI.sliderMain, 1)
BlzFrameSetValue(CustomRaceUI.sliderMain, data.hoverMax)
end
end
end
-- This just tells the players how many players
-- are still selecting their factions.
function CustomRaceUI.updatePlayerCountText()
BlzFrameSetText(CustomRaceUI.pCountText,
"|cffffcc00Number of players:|r " ..
tostring(CustomRaceUI.selectionCount) .. "/" ..
tostring(CustomRaceUI.selectionTotal))
end
function CustomRaceUI.removeSelectingPlayer(player)
local pos = 1
while pos <= #CustomRaceUI.playerSelectData do
if CustomRaceUI.playerSelectData[pos] == player then
break
end
pos = pos + 1
end
if pos > #CustomRaceUI.playerSelectData then
return
end
table.remove(CustomRaceUI.playerSelectData, pos)
CustomRaceUI.selectionCount = CustomRaceUI.selectionCount - 1
CustomRaceUI.updatePlayerCountText()
if CustomRaceUI.selectionCount <= 0 then
CustomRaceUI.inSelectionStage = false
CustomRaceUI.clearSelectionTrigger()
CustomRace.start()
BlzFrameSetVisible(CustomRaceUI.main, false)
BlzFrameSetVisible(CustomRaceUI.backupMain, false)
if CustomRaceUI.criticalTimer then
PauseTimer(CustomRaceUI.criticalTimer)
DestroyTimer(CustomRaceUI.criticalTimer)
CustomRaceUI.criticalTimer = nil
end
elseif GetLocalPlayer() == player then
BlzFrameSetVisible(CustomRaceUI.backupMain, true)
end
end
function CustomRaceUI.clearSelectionTrigger()
if not CustomRaceUI.playerSelectTrig then
return
end
DisableTrigger(CustomRaceUI.playerSelectTrig)
DestroyTrigger(CustomRaceUI.playerSelectTrig)
CustomRaceUI.playerSelectTrig = nil
end
function CustomRaceUI.startSelectTimer()
CustomRaceUI.selectTimer = CreateTimer()
CustomRaceUI.criticalTimer = CreateTimer()
TimerStart(CustomRaceUI.selectTimer, config.WAIT_DURATION, false, function()
while CustomRaceUI.inSelectionStage do
local player = CustomRaceUI.playerSelectData[CustomRaceUI.selectionCount]
local id = CustomRaceUI.playerData.pointer[player]
local data = CustomRaceUI.playerData[id]
CustomRace.faction[data.playerID] = 1
CustomRaceUI.removeSelectingPlayer(player)
end
DestroyTimer(CustomRaceUI.selectTimer)
CustomRaceUI.selectTimer = nil
end)
TimerStart(CustomRaceUI.criticalTimer, config.WAIT_DURATION - config.CRITICAL_DURATION, false, function()
internal.playSound(GetLocalPlayer(), internal.generateCriticalSound())
DestroyTimer(CustomRaceUI.criticalTimer)
CustomRaceUI.criticalTimer = nil
end)
end
function CustomRaceUI.checkFactionSelection()
CustomRaceUI.inSelectionStage = CustomRaceUI.selectionCount > 0
CustomRaceUI.selectionTotal = CustomRaceUI.selectionCount
CustomRaceUI.updatePlayerCountText()
if not CustomRaceUI.inSelectionStage then
CustomRaceUI.display(GetLocalPlayer(), false)
CustomRace.start()
return
end
local trig = CreateTrigger()
CustomRaceUI.playerSelectData = {}
CustomRaceUI.playerSelectTrig = trig
CustomRaceUI.startSelectTimer()
TriggerAddCondition(trig, Condition(function()
local player = GetTriggerPlayer()
if CustomRaceUI.inSelectionStage then
DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, 20.00,
GetPlayerName(player) .. " has abandoned the game")
end
CustomRaceUI.removeSelectingPlayer(player)
end))
for i = 1, #CustomRaceUI.playerData do
local player = CustomRaceUI.playerData[i].player
CustomRaceUI.display(player, true)
if GetPlayerController(player) == MAP_CONTROL_USER then
table.insert(CustomRaceUI.playerSelectData, player)
CustomRaceUI.updateHoverList(player)
CustomRaceUI.updateSelection(player, false)
TriggerRegisterPlayerEvent(trig, player, EVENT_PLAYER_LEAVE)
end
end
end
function CustomRaceUI.processPlayer(player)
local id = CustomRaceUI.playerData.pointer[player]
local data = CustomRaceUI.playerData[id]
if (not data) then
if (GetLocalPlayer() == player) then
BlzFrameSetVisible(CustomRaceUI.backupMain, true)
end
return
end
if GetPlayerController(player) == MAP_CONTROL_USER then
-- Computer Players will always select default race.
CustomRaceUI.selectionCount = CustomRaceUI.selectionCount + 1
end
end
function CustomRaceUI.feedPlayerData(id, player)
local race = GetPlayerRace(player)
if (#tb._container[race] <= 1) or
(GetPlayerController(player) == MAP_CONTROL_COMPUTER) then
CustomRace.faction[id] = 1
return
end
local data = {
player = player,
playerID = id,
playerRace = race,
factionChoices = 0,
hoverOffset = 0,
hoverPos = 0,
selectPos = 0,
}
data.factionChoices = #tb._container[data.playerRace]
data.hoverMax = math.max(data.factionChoices - config.RACE_MAX_OPTIONS, 0)
CustomRaceUI.playerData[#CustomRaceUI.playerData + 1] = data
CustomRaceUI.playerData.pointer[player] = #CustomRaceUI.playerData
CustomRaceUI.defSliderBounds(player)
end
function CustomRaceUI.display(player, flag)
if GetLocalPlayer() == player then
BlzFrameSetVisible(CustomRaceUI.main, flag)
end
end
function CustomRaceUI.init()
internal.loadTOC()
internal.prepareAllFrames()
internal.prepareBackupFrames()
internal.prepareDispFrame()
internal.prepareSubFrames()
internal.addButtonAudioFeedback()
internal.addSelectionProcess()
internal.addScrollCallback()
CustomRaceUI.selectionCount = 0
end
end