From 6d8734097ada09bbbf9ee71091df1fdf1d2f68fe Mon Sep 17 00:00:00 2001 From: cloudbells Date: Sun, 25 Aug 2019 14:33:13 +0200 Subject: [PATCH] Major UI changes - Added title bar (and made only this draggable instead of the entire frame) - Added close button again - Removed scroll bar textures --- Database/Trainers.lua | 9 ++ FieldGuide.lua | 48 ++------ FieldGuide.xml | 152 ++++++++---------------- Media/Scrollbar/ScrollbarHorizontal.tga | Bin 65554 -> 0 bytes Media/Scrollbar/ScrollbarVertical.tga | Bin 65554 -> 0 bytes 5 files changed, 72 insertions(+), 137 deletions(-) delete mode 100644 Media/Scrollbar/ScrollbarHorizontal.tga delete mode 100644 Media/Scrollbar/ScrollbarVertical.tga diff --git a/Database/Trainers.lua b/Database/Trainers.lua index b6503b1..db2f50f 100644 --- a/Database/Trainers.lua +++ b/Database/Trainers.lua @@ -276,6 +276,15 @@ FieldGuide.HUNTER_PET_TRAINERS = { } } +FieldGuide.WARLOCK_PET_TRAINERS = { + ["ALLIANCE"] = { + + }, + ["HORDE"] = { + + } +} + FieldGuide.SPELL_TRAINERS = { ["WARRIOR"] = { ["ALLIANCE"] = { diff --git a/FieldGuide.lua b/FieldGuide.lua index 0f1db80..2e2ea71 100644 --- a/FieldGuide.lua +++ b/FieldGuide.lua @@ -3,7 +3,7 @@ --------------------------------------- 1. Add price for the pinned vendor in the tooltip. 2. Add Warlock trainers. - 3. Add logic for finding closest Warlock/Hunter trainer – refactor so it isn't shit. + 3. Add logic for finding closest Warlock pet trainer – refactor so it isn't shit. 4. Add tomes. 5. Add tutorial (shift+scroll for horizontal scroll/shift+right-click for marking all of the same spells etc) 6. (Add racials.) @@ -113,16 +113,21 @@ local function findPortalTrainer(spell) return trainer end --- Returns the closest spell trainer to the player for the given spell. -local function findClosestSpellTrainer(spell) +-- Returns the closest trainer for the given skill. +local function findClosestTrainer(skill) local tempFaction = faction == "Horde" and selectedClass == "PALADIN" and "ALLIANCE" or faction == "Alliance" and selectedClass == "SHAMAN" and "HORDE" or faction:upper() local backupTrainer = nil -- For if there is no trainer on the same continent as the player. local sameContinentTrainer = nil local shortestDistance = 100000 -- For if there is no trainer on the same continent as the player. local sameContinentDistance = 100000 local instance = select(3, hbd:GetPlayerWorldPosition()) - for _, trainer in ipairs(FieldGuide.SPELL_TRAINERS[selectedClass][tempFaction]) do - if not (spell.level > 6 and trainer.noob) then + local conditional = nil + local trainerTable = nil + for _, trainer in ipairs((selectedClass == "WEAPONS" and FieldGuide.WEAPON_TRAINERS[tempFaction]) + or (selectedClass == "HUNTER_PETS" and FieldGuide.HUNTER_PET_TRAINERS[tempFaction]) + or (selectedClass == "WARLOCK_PETS" and FieldGuide.WARLOCK_PET_TRAINERS[tempFaction]) + or FieldGuide.SPELL_TRAINERS[selectedClass][tempFaction]) do + if selectedClass == "WEAPONS" and trainer[skill.spellId] or skill.level ~= nil and not (skill.level > 6 and trainer.noob) then local distance = getDistance(trainer.x / 100, trainer.y / 100, trainer.map) if FieldGuide.getContinent(trainer.map) == instance and distance < sameContinentDistance then sameContinentDistance = distance @@ -139,31 +144,6 @@ local function findClosestSpellTrainer(spell) return backupTrainer end --- Returns the closest weapon trainer to the player for the given weapon. -local function findClosestWeaponTrainer(weapon) - local backupTrainer = nil -- For if there is no trainer on the same continent as the player. - local sameContinentTrainer = nil - local shortestDistance = 100000 -- For if there is no trainer on the same continent as the player. - local sameContinentDistance = 100000 - local instance = select(3, hbd:GetPlayerWorldPosition()) - for _, trainer in ipairs(FieldGuide.WEAPON_TRAINERS[faction:upper()]) do - if trainer[weapon.spellId] then - local distance = getDistance(trainer.x / 100, trainer.y / 100, trainer.map) - if FieldGuide.getContinent(trainer.map) == instance and distance < sameContinentDistance then - sameContinentDistance = distance - sameContinentTrainer = FieldGuide.copy(trainer) - elseif distance < shortestDistance then - shortestDistance = distance - backupTrainer = FieldGuide.copy(trainer) - end - end - end - backupTrainer = sameContinentTrainer ~= nil and sameContinentTrainer or backupTrainer - backupTrainer.x = backupTrainer.x / 100 - backupTrainer.y = backupTrainer.y / 100 - return backupTrainer -end - -- Checks if the pin exists as a frame and as a saved variable. -- Returns true if it does exist, then the frames, and then the variables. local function doesPinExist(name) @@ -647,7 +627,7 @@ end -- Initializes all frames, level strings, and textures for reuse. local function initFrames() NBR_OF_SPELL_ROWS = floor(FieldGuideFrame:GetHeight() / 100) - Y_SPACING = math.ceil(FieldGuideFrame:GetHeight() / NBR_OF_SPELL_ROWS) / 1.175 + Y_SPACING = math.ceil(FieldGuideFrame:GetHeight() / NBR_OF_SPELL_ROWS) / 1.1625 local nbrOfSpellBtns = floor((FieldGuideFrame:GetWidth() - BUTTON_X_START * 2) / BUTTON_X_SPACING) * NBR_OF_SPELL_ROWS NBR_OF_SPELL_COLUMNS = nbrOfSpellBtns / NBR_OF_SPELL_ROWS -- The number of buttons in x. -- Create spell buttons. @@ -762,12 +742,8 @@ function FieldGuideSpellButton_OnClick(self, button) local trainer = nil if self.name:find("Teleport") or self.name:find("Portal") then trainer = findPortalTrainer(self) - elseif selectedClass == "HUNTER_PETS" then - - elseif selectedClass == "WARLOCK_PETS" then - else - trainer = selectedClass ~= "WEAPONS" and findClosestSpellTrainer(self) or findClosestWeaponTrainer(self) + trainer = findClosestTrainer(self) end if not doesPinExist(trainer.name) and self.spellCost ~= 0 then addMapPin(trainer.map, trainer.x, trainer.y, trainer.name) diff --git a/FieldGuide.xml b/FieldGuide.xml index 218fb08..f4ba0a9 100644 --- a/FieldGuide.xml +++ b/FieldGuide.xml @@ -62,16 +62,7 @@ - - - - - - - - - - + @@ -98,20 +89,43 @@ - - + + - + + + + + + + + + + + + + + + + + + self:GetParent():StartMoving() + + + self:GetParent():StopMovingOrSizing() + + + - - + + @@ -125,7 +139,7 @@ + - + - - - - - @@ -323,12 +279,6 @@ PlaySound(SOUNDKIT.IG_SPELLBOOK_CLOSE) - - self:StartMoving() - - - self:StopMovingOrSizing() - FieldGuide_Scroll(delta) diff --git a/Media/Scrollbar/ScrollbarHorizontal.tga b/Media/Scrollbar/ScrollbarHorizontal.tga deleted file mode 100644 index 6b1969b8153239ea884f04ad9988852f5e4b46f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65554 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 ap#DJ{XU}>4AJZ7R+m65@2(bS39`Jt|`lMa} diff --git a/Media/Scrollbar/ScrollbarVertical.tga b/Media/Scrollbar/ScrollbarVertical.tga deleted file mode 100644 index cfd47cad5e0af923c4ba2340b48822160181f534..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65554 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 N>E9&&@#r7z|Nr)3q+S33