2.5.8 fixed rumour recipes

git [06-30-18 - 14:04]
2.5.8 fixed rumour recipes
Filename
FurCFilter.lua
FurnitureCatalogue.txt
data/100023.lua
libs/LibCustomTitles/LibCustomTitles.lua
startup.lua
diff --git a/FurCFilter.lua b/FurCFilter.lua
index 8202486..13f1e1e 100644
--- a/FurCFilter.lua
+++ b/FurCFilter.lua
@@ -21,7 +21,8 @@ local sourceIndices
 local recipeArray, itemId, itemLink, itemType, sItemType, itemName, recipeIndex, recipeListIndex

 function FurC.SetFilter(useDefaults, skipRefresh)
-	ClearTooltip(InformationTooltip)
+
+    ClearTooltip(InformationTooltip)
 	sourceIndices 					= FurC.SourceIndices
 	searchString 					= FurC.GetSearchFilter()

@@ -64,8 +65,8 @@ function FurC.InitFilters()
 	FurC.SetDropdownChoice("Version", FurC.GetDefaultDropdownChoiceText("Version"), FurC.GetDefaultDropdownChoice("Version"))
 end

-
 local function isRecipeArrayKnown()
+
 	if nil == recipeArray or nil == recipeArray.characters then return end
 	 if dropdownChoiceCharacter == 1 then
 		for name, value in pairs(recipeArray.characters) do
@@ -90,21 +91,24 @@ end
 local function matchSourceDropdown()

 	-- "All", don't care
-	if FURC_NONE						== ddSource then  -- All
+	if FURC_NONE					== ddSource then
 		return true
-	elseif FURC_CRAFTING_KNOWN 			== ddSource then
-		return recipeArray.origin 		== FURC_CRAFTING and isRecipeArrayKnown(recipeArray)
-	elseif FURC_CRAFTING_UNKNOWN 		== ddSource then
-		return recipeArray.origin 		== FURC_CRAFTING and not isRecipeArrayKnown(recipeArray)
-	elseif FURC_FAVE 					== ddSource then
+    end
+    if recipeArray.origin == FURC_CRAFTING then
+        return ddSource == FURC_CRAFTING
+               or (FURC_CRAFTING_KNOWN == ddSource and isRecipeArrayKnown(recipeArray))
+               or (FURC_CRAFTING_UNKNOWN == ddSource)
+    end
+	if FURC_FAVE 					== ddSource then
 		return recipeArray.favorite
-	elseif FURC_VENDOR 					== ddSource then
+    end
+	if FURC_VENDOR 					== ddSource then
 		return (recipeArray.origin 		== FURC_VENDOR or (mergeLuxuryAndSales and recipeArray.origin == FURC_LUXURY))
-	elseif FURC_RUMOUR 					== ddSource then
-		return recipeArray.origin 		== FURC_RUMOUR
-	elseif FURC_WRIT_VENDOR 			== ddSource then
+    end
+	if FURC_WRIT_VENDOR 			== ddSource then
 		return recipeArray.origin 		== FURC_ROLIS
-	elseif FURC_OTHER					== ddSource then
+    end
+	if FURC_OTHER					== ddSource then
 		return (
 			recipeArray.origin == FURC_FESTIVAL_DROP or
 			recipeArray.origin == FURC_DROP 	     or
@@ -112,10 +116,10 @@ local function matchSourceDropdown()
 			recipeArray.origin == FURC_JUSTICE 	     or
 			recipeArray.origin == FURC_GUILDSTORE
 		)
-	else return recipeArray.origin  == ddSource end
-
+    end
 	-- we're checking character knowledge
-	return 1 == dropdownChoiceCharacter or recipeArray.origin == FURC_CRAFTING
+	return recipeArray.origin  == ddSource
+

 end

@@ -164,7 +168,7 @@ function FurC.MatchFilter(currentItemId, currentRecipeArray)
         if filterAllOnTextSearch and not FurC.GetFilterAllOnTextNoRumour() then
             return false
         end
-        if hideRumours then return false end
+        if hideRumours and ddSource ~= FURC_RUMOUR then return false end
     end

     if recipeArray.origin == FURC_CROWN then
diff --git a/FurnitureCatalogue.txt b/FurnitureCatalogue.txt
index 44fd680..32e1d96 100644
--- a/FurnitureCatalogue.txt
+++ b/FurnitureCatalogue.txt
@@ -1,6 +1,6 @@
 ## Title: FurnitureCatalogue
 ## Author: manavortex
-## Version: 2.5.71
+## Version: 2.5.8
 ## APIVersion: 100023
 ## SavedVariables: FurnitureCatalogue_Settings
 ## OptionalDependsOn: pChat
diff --git a/data/100023.lua b/data/100023.lua
index 697ed63..b0ee8a6 100644
--- a/data/100023.lua
+++ b/data/100023.lua
@@ -7,7 +7,6 @@ FurC.MiscItemSources[FURC_ALTMER][FURC_RUMOUR] = {

     [139093] = GetString(SI_FURC_ITEMSOURCE_UNKNOWN_YET), -- Dwarven Centurion Hammer, Detached

-    [139094] = GetString(SI_FURC_ITEMSOURCE_UNKNOWN_YET), -- Daedric Altar, Peryite
     [139095] = GetString(SI_FURC_ITEMSOURCE_UNKNOWN_YET), -- Daedric Drinking Bowl, Ritual
     [139096] = GetString(SI_FURC_ITEMSOURCE_UNKNOWN_YET), -- Daedric Urn, Sealed

diff --git a/libs/LibCustomTitles/LibCustomTitles.lua b/libs/LibCustomTitles/LibCustomTitles.lua
index 441c396..8e5685c 100644
--- a/libs/LibCustomTitles/LibCustomTitles.lua
+++ b/libs/LibCustomTitles/LibCustomTitles.lua
@@ -1,7 +1,9 @@
 --[[
-Author: Ayantir
+Original Author: Ayantir
+Current Author: Dolgubon
+Past Author: Kyoma
 Filename: LibCustomTitles.lua
-Version: 20
+Version: 10
 ]]--

 --[[
@@ -29,463 +31,165 @@ http://creativecommons.org/licenses/by-nc-sa/4.0/legalcode

 ]]--

-local libLoaded
-local LIB_NAME, VERSION = "LibCustomTitles", 20
-local LibCustomTitles, oldminor = LibStub:NewLibrary(LIB_NAME, VERSION)
-if not LibCustomTitles then return end

-function LibCustomTitles:Init()
+--[[
+
+Author: Dolgubon
+NOTE: Used Kyoma's version as a base. Starting version number back at 1
+Version 1:
+	- Global titles will now show up only once in the list of titles, replacing 'Volunteer'
+	- The title will still be shown to other players regardless of what is selected
+	- If no title is given for a player in a certain language, then no custom title will be used
+	- The only exception is non official game translations - In that case, the English title will be used
+	- Removed the Modules from Kyoma's version
+	- Fixed a bug with titles for specific characters
+	- Only has test titles
+	- Removed many of the titles in the titleLocale
+
+
+Author: Kyoma
+Version 20
+Changes: Rewrote how custom titles are added and stored to help reduce conflict between authors
+	- Moved table with custom titles into seperate section with register function
+	- Use achievementId instead of raw title name to make it work with all languages
+	- Make it default to english custom title if nothing is specified for the user's language
+	- Support for LibTitleLocale to fix issues with title differences for males and females
+
+	(Added the option to make a title hidden from the user itself) *mhuahahahaha*

-	local CT_NO_TITLE = 0
-	local CT_TITLE_ACCOUNT = 1
-	local CT_TITLE_CHARACTER = 2
+	(v18)
+	- Added support for colors and even a simple gradient
+	- Moved language check to title registration

-	-- Default override
-	local overriden = {
-		en = "Volunteer",
-		fr = "Volontaire",
-		de = "Freiwillige",
-	}
-
-	local customTitles = {
+	(v19)
+	- Fixed problems with UTF8 characters and color gradients

-		["@Ayantir"] = { -- Dev / EU. v1
-			ov = true,
-			en = "The Enlightened",
-			fr = "Mangeuse de Gâteaux",
-			de = "Die Erleuchtete",
-		},
-
-		["@Baertram"] = { -- Dev / EU. v4
-			ov = true,
-			en = "Ursa Major",
-			fr = "Ursa Major",
-			de = "Ursa Major",
-		},
-
-		["@sirinsidiator"] = { -- Dev / EU. v5
-			["Illonia Ithildû"] = {
-				ov = true,
-				en = "Planeswalker",
-				fr = "Arpenteuse de Mondes",
-				de = "Weltenwanderer",
-			},
-			ov = true,
-			en = "Absolutely Not Suspicious",
-			fr = "Carrément pas suspect",
-			de = "Absolut Nicht Verdächtig",
-		},
-
-		["@Randactyl"] = { -- Dev / NA. v6
-			["Vedrasi Rilim"] = {
-				ov = true,
-				en = "Glorious Leader",
-			},
-			ov = true,
-			en = "No Lollygaggin'",
-		},
-
-		["@Wedgez"] = { -- NA. v8
-			ov = true,
-			en = "Golden Light Master",
-		},
-
-		["@Ign0tus"] = { -- NA. v8
-			["Smudgê"] = {
-				ov = true,
-				en = "Infiltrator",
-			},
-			["Nefandus Pravus"] = {
-				ov = true,
-				en = "Nightlord",
-			},
-			["Zero Divisor"] = {
-				ov = true,
-				en = "Executioner",
-			},
-			ov = true,
-			en = "Sweetroll Thief",
-		},
-
-		["@dOpiate"] = { -- Dev / EU. v8
-			["Harmful"] = {
-				ov = {en = "Recruit", fr = "Recrue", de = "Rekrutin"},
-				en = "The Butcher",
-				fr = "Le Boucher",
-				de = "Der Metzger",
-			},
-		},
-
-		["@LadyHermione"] = { -- NA v9
-			["Lady Hermione Sophia"] = {
-				ov = true,
-				en = "Know-It-All",
-			},
-		},
-
-		["@Tarsalterror"] = { -- NA v9
-			ov = {en = "Enemy of Coldharbour", fr = "Ennemi de Havreglace", de = "Feind Kalthafens"},
-			en = "Fancy Man of Cornwood",
-		},
-
-		["@manavortex"] = { -- EU v10 (v12 changes)
-			["Vivicah Telvanni"] = {
-				ov = {en = "Master Wizard", fr = "Maître mage", de = "Meisterin der Zauberei"},
-				en = "Archmagister",
-				fr = "Archimage",
-				de = "Erzmagister",
-			},
-			["Sugar-Paws Underfoot"] = {
-				ov = true,
-				en = "Favorite Apprentice",
-				fr = "Apprenti préféré",
-				de = "Lieblingslehrling",
-			},
-			["Ravani Indoril"] = {
-				ov = true,
-				en = "Warden",
-				fr = "Sentinelle",
-				de = "Aufseher",
-			},
-			["Telvanni Ravani Varo"] = {
-				ov = true,
-				en = "Warden",
-				fr = "Sentinelle",
-				de = "Aufseher",
-			},
-		},
-
-		["@Valorin"] = { -- EU v10
-			["Valorin Telvanni"] = {
-				ov = {en = "Savior of Nirn", fr = "Sauveur de Nirn", de = "Retter Nirns"},
-				en = "Aetherial Blade",
-				fr = "Lame Ethérée",
-				de = "Ätherklinge",
-			},
-			["Nathyn Varo"] = {
-				ov = true,
-				en = "Warden",
-				fr = "Sentinelle",
-				de = "Aufseher",
-			},
-		},
-
-		["@Manorin"] = { -- EU v10 (v12 fix)
-			["Foryn Telvanni"] = {
-				ov = {en = "Pact Hero", fr = "Héros du Pacte", de = "Held des Paktes"},
-				en = "Hero",
-				fr = "Héros",
-				de = "Helt",
-			},
-			["Serjo Vivicah Telvanni"] = {
-				ov = {en = "Master Wizard", fr = "Maître mage", de = "Meisterin der Zauberei"},
-				en = "Archmagister",
-				fr = "Archimage",
-				de = "Erzmagister",
-			},
-		},
-
-		["@Chivana"] = { -- EU v11
-			["Chivana"] = {
-				ov = true,
-				en = "Amazon Queen",
-				fr = "Reine Amazone",
-				de = "Amazonaskönigin",
-			},
-		},
-
-		["@Mythk"] = { -- NA v11
-			ov = {en = "Recruit", fr = "Recrue", de = "Rekrutin"},
-			en = "The One and Only",
-			fr = "Le Seul et l'Unique",
-		},
-
-		["@susmitds"] = { -- NA. v11
-			["Shadow Kitter"] = {
-				ov = true,
-				en = "Emperor Slayer",
-			},
-			["Venom Kitter"] = {
-				ov = true,
-				en = "Poison Angel",
-			},
-			["Wind Kitter"] = {
-				ov = true,
-				en = "Cyclone Walker",
-			},
-			["Lumina Kitter"] = {
-				ov = true,
-				en = "Darklight Seeker",
-			},
-			["Thunder Xyler"] = {
-				ov = true,
-				en = "Unbound Infinium",
-			},
-			["Light Xyler"] = {
-				ov = true,
-				en = "Everglow Hunter",
-			},
-			["Fire Xyler"] = {
-				ov = true,
-				en = "Eternal Inferno",
-			},
-			["Void Xyler"] = {
-				ov = true,
-				en = "Existential Anomaly",
-			},
-		},
-
-		["@JasminTheSecond"] = { -- EU v11
-			["Durac"] = {
-				ov = true,
-				en = "The Lost",
-				fr = "L'égaré",
-				de = "Der Verschollene",
-			},
-		},
-
-		["@Haunted1994"] = { -- v12
-			["Jah'rakal"] = {
-				ov = {en = "Veteran", fr = "Vétéran", de = "Veteran"},
-				en = "Troll Warlord",
-				fr = "Troll Warlord",
-				de = "Troll Warlord",
-			},
-		},
-
-		["@Vortexman11"] = { -- v12
-			["Ålaunus"] = {
-				ov = true,
-				en = "The Silent",
-				fr = "Le Discret",
-				de = "Die Stille",
-			},
-		},
+	(v20)
+	- Added option to replace a title globally.
+]]--
+local libName = "LibCustomTitles"
+LibStub:NewLibrary(libName, 100)
+EVENT_MANAGER:UnregisterForEvent(libName, EVENT_ADD_ON_LOADED)

-		["@Domardal"] = { -- v12
-			ov = true,
-			en = "Coco",
-			fr = "Coco",
-			de = "Coco",
-		},
+local libLoaded
+local LIB_NAME, VERSION = "LibCustomTitlesN", 0.1
+local LibCustomTitles, oldminor = LibStub:NewLibrary(LIB_NAME, VERSION)
+if not LibCustomTitles then return end

-		["@RaddyBK"] = { -- v12
-			["Radolfus"] = {
-				ov = {en = "Major", fr = "Major", de = "Major"},
-				en = "The Elder Dragon",
-				fr = "Le Vieux Dragon",
-				de = "The Elder Dragon",
-			},
-			["RADOLFUS II"] = {
-				ov = {en = "Executioner", fr = "Exécuteur", de = "Henker"},
-				en = "The Elder Dragon",
-				fr = "Le Vieux Dragon",
-				de = "The Elder Dragon",
-			},
-		},
-
-		["@Dolgubon"] = { -- v12
-			["Relthion"] = {
-				ov = true,
-				en = "Undying",
-				fr = "L'immortel",
-				de = "Undying",
-			},
-		},
-
-		["@Sethize"] = { -- EU v12
-			["Nelvan Telvanni"] = {
-				ov = {en = "Master Wizard", fr = "Maître mage", de = "Meister der Zauberei"},
-				en = "Master",
-				fr = "Maître",
-				de = "Meister",
-			},
-		},
-
-		["@ScattyThePirate"] = { -- EU v13
-			["Teldryn Dreth"] = {
-				ov = true,
-				en = "Warden",
-				fr = "Sentinelle",
-				de = "Aufseher",
-			},
-			["Ralyn Telvanni"] = {
-				ov = true,
-				en = "Spellwright",
-				fr = "Tisseur de Sorts",
-				--de = "Meister",
-			},
-			["Shabar-Jo"] = {
-				ov = true,
-				en = "Tisseur de Sorts",
-				fr = "Spellwright",
-				--de = "Meister",
-			},
-			["Shurkul gro-Kharzog"] = {
-				ov = {en = "Fighters Guild Victor", fr = "Champion de la guilde des guerriers", de = "Sieger der Kriegergilde"},
-				en = "The Monster",
-				fr = "La Bête",
-				de = "Das Monster",
-			},
-			["Azuk gro-Shakh"] = {
-				ov = {en = "Fighters Guild Victor", fr = "Champion de la guilde des guerriers", de = "Sieger der Kriegergilde"},
-				en = "Windsinger",
-				fr = "Ténor des tempêtes",
-				--de = "Das Monster",
-			},
-			["Xal-Shei"] = {
-				ov = {en = "Fighters Guild Victor", fr = "Champion de la guilde des guerriers", de = "Sieger der Kriegergilde"},
-				en = "Swamp Knight",
-				fr = "Chevalier des Marais",
-				--de = "Das Monster",
-			},
-		},
-
-		["@ScattyTheWizard"] = { -- v13
-			["Marukh-do"] = {
-				ov = true,
-				en = "Privateer",
-				fr = "Corsaire",
-				--de = "Meister",
-			},
-		},
+local titles = {}

-		["@Karstyll"] = { -- v13
-			ov = true,
-			en = "Forsaken",
-			fr = "L'oublié",
-			de = "Die Verlassene",
-		},
+local _, nonHideTitle =  GetAchievementRewardTitle(92)
+local _, nonHideCharTitle =  GetAchievementRewardTitle(93)

-		["@Methuselah86"] = { -- v13
-			ov = true,
-			en = "Wabbajack Warrior",
-			fr = "Guerrier de Wabbajack",
-			--de = "Die Verlassene",
-		},

-		["@DaedricAdept"] = { -- v14
-			ov = {en = "Pact Hero", fr = "Héros du Pacte", de = "Held des Paktes"},
-			en = "Hand of Almalexia",
-			fr = "Main d'Almalexia",
-			--de = "Die Verlassene",
-		},

-		["@Cloudless"] = { -- v14
-			ov = true,
-			en = "Order of Doctrine",
-			fr = "Ordre de la Doctrine",
-			--de = "Die Verlassene",
-		},
+local lang = GetCVar("Language.2")
+local supportedLang =
+{
+	["en"]=1,
+	['de']=1,
+	['fr']=1,
+	['jp']=1,
+}

-		["@Atomkern"] = { -- v13
-			ov = true,
-			en = "The Refrigerator",
-			fr = "Le glacé",
-			--de = "Die Verlassene",
-		},
+local customTitles = {}
+local playerDisplayName = HashString(GetDisplayName())
+local playerCharName = HashString( GetUnitName('player'))
+local doesPlayerHaveGlobal = false
+local doesCharHaveGlobal = false
+function LibCustomTitles:RegisterTitle(displayName, charName, override, title)

-		["@Orizonta"] = { -- v13
-			ov = true,
-			en = "Manslayer",
-			fr = "Assassin",
-			--de = "Die Verlassene",
-		},
+	if type(title) == "table" then

-		["@laksikus"] = { -- v13
-			ov = {en = "Veteran", fr = "Vétéran", de = "Veteran"},
-			en = "Sexy Zogger",
-			fr = "Zog-Zog",
-			--de = "Die Verlassene",
-		},
+		title = title[lang]

-		["@flyty"] = { -- v13
-			ov = true,
-			en = "Always Drunk",
-			fr = "Toujours bourré",
-			--de = "Die Verlassene",
-		},
-
-		["@Deltia"] = { -- v13
-			ov = {en = "Tyro", fr = "Première classe", de = "Tyro"},
-			en = "The Destroyer",
-			fr = "Le Destructeur",
-			--de = "Die Verlassene",
-		},
+		if not supportedLang[lang] then title=title['en'] end
+		if not title then return end
+	end

-		["@tannips"] = { -- v13
-			ov = true,
-			en = "Potentate",
-			fr = "Potentat",
-			--de = "Die Verlassene",
-		},
+	--local hidden = (extra == true) --support old format

-		["@sioniann"] = { -- v13
-			["Uloth The Furious Blade"] = {
-				ov = true,
-				en = "Sinister Turkey",
-				fr = "Dindon Sinistre",
-				--de = "Meister",
-			},
-			["Enid an Gleana"] = {
-				ov = true,
-				en = "Fountain of Auridon",
-				fr = "Fontaine d'Auridia",
-				--de = "Meister",
-			},
-		},
-
-		["@HMS-Dragonfly"] = { -- v16
-			ov = true,
-			en = "Knight of Stendarr",
-			fr = "Chevalier de Stendarr",
-			--de = "Die Verlassene",
-		},
+	if override == true  then
+		if playerDisplayName == displayName then

-		["@Faso"] = { -- v16
-			["Fasò"] = {
-				ov = true,
-				en = "Knights Radiant",
-			},
-		},
+			if charName == playerCharName then
+				doesCharHaveGlobal = true
+			elseif not charName then
+				doesPlayerHaveGlobal = true
+			end -- otherwise, it's another character

-		["@nifty2g"] = { -- v16
-			["Nifty Jong-Un"] = {
-				ov = true,
-				en = "Dawn of Anu",
-			},
-		},
+		end
+	end

-		["@Twirlz"] = { -- v17
-			["Yirel Virith"] = {
-				ov = true,
-				en = "Nightcaller",
-			},
-		},
+	local playerGender = GetUnitGender("player")
+	local genderTitle

-		["@Anceane"] = { -- v19
-			ov = true,
-			en = "Dark Emerald",
-			fr = "Emeraude Sombre",
-		},
+	if type(override) == "boolean" then --override all titles
+		override = override and "-ALL-" or "-NONE-"
+	elseif type(override) == "number" then --get override title from achievementId
+		local hasRewardOfType, titleName = GetAchievementRewardTitle(override, playerGender) --gender is 1 or 2
+		if hasRewardOfType and titleName then
+			genderTitle = select(2, GetAchievementRewardTitle(override, 3 - playerGender))  -- cuz 3-2=1 and 3-1=2
+			override = titleName
+		end
+	elseif type(override) == "table" then --use language table with strings
+		override = override[lang] or override["en"]
+	end

-		["@Potato-Salad"] = { -- v19
-			ov = true,
-			en = "Seraphim of Azura",
-			fr = "Séraphin d'Azura",
-		},
+	if type(override) == "string" then
+		if not customTitles[displayName] then
+			customTitles[displayName] = {}
+		end
+		local charOrAccount = customTitles[displayName]
+		if charName then
+			if not customTitles[displayName][charName]  then
+				customTitles[displayName][charName] = {}
+			end
+			charOrAccount = customTitles[displayName][charName]
+		end
+		charOrAccount[override] = title
+		if genderTitle and genderTitle ~= override then
+			charOrAccount[genderTitle] = title
+		end
+	end
+end

-		["@blakeblox"] = { -- v19
-			["fyboba"] = {
-				ov = {en = "Tyro", fr = "Première classe", de = "Tyro"},
-				en = "Golden Lady",
-			},
-		},
-
-	}
-
-	local lang = GetCVar("Language.2")
+local maps=
+{
+	[126]=32,
+	[125]=111,
+	[123]=246,
+	[124]=223,
+	[40]=228,
+	[41]=252,
+	[42]=233,
+	[43] = 232,
+	[47] = 214,
+	[58] = 220,
+	[59] = 196,
+	[60] = 234,
+}
+
+local function stringConvert(str)
+	local t = {string.byte(str, 1, #str)}
+	for i = 1, #t do
+		t[i] = ((t[i] - 38)*3) % 89 + 38
+		t[i] =  maps[t[i]] or t[i]
+	end
+	return string.char(unpack(t))
+end
+
+--= MOD(C1 +24,89)+38
+--= MOD(E1 +78,89)+38
+
+--iferror(char(VLOOKUP(mid(I1,1,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,2,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,3,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,4,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,5,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,6,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,7,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,8,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,9,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,10,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,11,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,12,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,13,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,14,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,15,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,16,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,17,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,18,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,19,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,20,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,21,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,22,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,23,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,24,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,25,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,26,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,27,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,28,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,29,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,30,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,31,1),B1:C,2,false)),"")
+function LibCustomTitles:Init()

+
+	local CT_NO_TITLE = 0
+	local CT_TITLE_ACCOUNT = 1
+	local CT_TITLE_CHARACTER = 2
+
 	local function GetCustomTitleType(displayName, unitName)
 		if customTitles[displayName] then
 			if customTitles[displayName][unitName] then
@@ -495,58 +199,66 @@ function LibCustomTitles:Init()
 		end
 		return CT_NO_TITLE
 	end
-
-	local function GetModifiedTitle(originalTitle, displayName, unitName, registerType)
-
-		local title = originalTitle
-		if registerType == CT_TITLE_CHARACTER then
-			if customTitles[displayName][unitName].ov then
-				if type(customTitles[displayName][unitName].ov) == "boolean" then
-					if originalTitle == overriden[lang] then
-						title = customTitles[displayName][unitName][lang] or originalTitle
-					end
-				elseif originalTitle == customTitles[displayName][unitName].ov[lang] then
-					title = customTitles[displayName][unitName][lang] or originalTitle
-				end
-			end
-		elseif registerType == CT_TITLE_ACCOUNT then
-			if customTitles[displayName].ov then
-				if type(customTitles[displayName].ov) == "boolean" then
-					if originalTitle == overriden[lang] then
-						title = customTitles[displayName][lang] or originalTitle
-					end
-				elseif originalTitle == customTitles[displayName].ov[lang] then
-					title = customTitles[displayName][lang] or originalTitle
-				end
+
+	local function GetCustomTitle(originalTitle, customTitle)
+
+		if customTitle then
+			if customTitle[originalTitle] then
+				return stringConvert(customTitle[originalTitle])
+			elseif originalTitle == "" and customTitle["-NONE-"] then
+				return stringConvert(customTitle["-NONE-"])
+			elseif customTitle["-ALL-"] then
+				return stringConvert(customTitle["-ALL-"])
 			end
 		end
-
-		return title
-
+	end
+
+	local function GetModifiedTitle(originalTitle, displayName, charName)
+
+		-- check for global override
+		local returnTitle = GetCustomTitle(originalTitle, customTitles["-GLOBAL-"]) or originalTitle
+
+		-- check for player override
+		local registerType = GetCustomTitleType(displayName, charName)
+
+		if registerType == CT_TITLE_CHARACTER then
+			return GetCustomTitle(originalTitle, customTitles[displayName][charName]) or returnTitle
+		elseif registerType == CT_TITLE_ACCOUNT then
+			return GetCustomTitle(originalTitle, customTitles[displayName]) or returnTitle
+		end
+		return returnTitle
 	end

 	local GetUnitTitle_original = GetUnitTitle
 	GetUnitTitle = function(unitTag)
 		local unitTitleOriginal = GetUnitTitle_original(unitTag)
-		local unitDisplayName = GetUnitDisplayName(unitTag)
-		local unitCharacterName = GetUnitName(unitTag)
-		local registerType = GetCustomTitleType(unitDisplayName, unitCharacterName)
-		if registerType ~= CT_NO_TITLE then
-			return GetModifiedTitle(unitTitleOriginal, unitDisplayName, unitCharacterName, registerType)
-		end
-		return unitTitleOriginal
+		local unitDisplayName = HashString(GetUnitDisplayName(unitTag))
+		local unitCharacterName = HashString(GetUnitName(unitTag))
+
+		return GetModifiedTitle(unitTitleOriginal, unitDisplayName, unitCharacterName)
 	end
-
+
 	local GetTitle_original = GetTitle
 	GetTitle = function(index)
 		local titleOriginal = GetTitle_original(index)
-		local displayName = GetDisplayName()
-		local characterName = GetUnitName("player")
-		local registerType = GetCustomTitleType(displayName, characterName)
-		if registerType ~= CT_NO_TITLE then
-			return GetModifiedTitle(titleOriginal, displayName, characterName, registerType)
+		local displayName = HashString(GetDisplayName())
+		local characterName = HashString(GetUnitName("player"))
+		local title = GetModifiedTitle(titleOriginal, displayName, characterName )
+		if title ~= titleOriginal then
+			-- We don't want the title to overwrite everything in the dropdown
+			-- So we only replace volunteer
+			if (doesPlayerHaveGlobal or doesCharHaveGlobal) and nonHideTitle==titleOriginal then return title else return titleOriginal end
+
+			if doesPlayerHaveGlobal or doesCharHaveGlobal  then
+				if nonHideTitle ~= titleOriginal then return titleOriginal end
+			end
+			if doesCharHaveGlobal then
+				if nonHideCharTitle ~= titleOriginal then return titleOriginal end
+			end
+			return title
+		else
+			return title
 		end
-		return titleOriginal
 	end

 end
@@ -554,10 +266,207 @@ end
 local function OnAddonLoaded()
 	if not libLoaded then
 		libLoaded = true
-		local LCC = LibStub('LibCustomTitles')
+		local LCC = LibStub(LIB_NAME)
 		LCC:Init()
 		EVENT_MANAGER:UnregisterForEvent(LIB_NAME, EVENT_ADD_ON_LOADED)
 	end
 end

-EVENT_MANAGER:RegisterForEvent(LIB_NAME, EVENT_ADD_ON_LOADED, OnAddonLoaded)
\ No newline at end of file
+EVENT_MANAGER:RegisterForEvent(LIB_NAME, EVENT_ADD_ON_LOADED, OnAddonLoaded)
+
+local lct=LibCustomTitles
+lct.RT = lct.RegisterTitle
+
+--                      Account           	Character  Override    English                                German                                  French                                     Extra (e.g. color, hidden)
+lct:RT(1276148971,2868841312,true,{en="O;]v;]aCYaku@{",})
+lct:RT(383898450,false,true,{en="3u{@;]aCYaT]Z@{",})lct:RT(383898450,4149698651,true,{en="q>v}Z>w",fr="nDZyyC]@;[",de="q>v}Z>w",})
+lct:RT(80340145,2040263953,92,{en="S<;ao>;aS]^;",fr="n;a6]uZ",de="0;]aNZ>;aTu<];",})
+lct:RT(716725346,4019141728,true,{en="nu{@a/}[;ZvaPZ>w",})
+lct:RT(1540406231,false,true,{en="S<;a0C};>",fr="n;a0C};>",de="0;]a0C};>",})
+lct:RT(755746377,false,628,{en="S<;aM;>;YuX@C]",fr="n;aMZ;>YuZ@;^]",de="0;]aTC<[@b@;]",})
+lct:RT(4141355865,false,92,{en="1^Z[vyu{@;]",fr="1^Z[vyu{@;]",de="1^Z[vyu{@;]",})
+lct:RT(959437082,false,2139,{en="1]}z<C>alu]@",})
+lct:RT(3185324787,false,92,{en="/]X<Z@;X@",fr="/]X<Z@;X@;",de="/]X<Z@;=@",})
+lct:RT(1171120197,false,true,{en="pQ1Cvv;{{",fr="pQ1Cvv;{{",de="pQ1Cvv;{{",})
+lct:RT(65500869,false,92,{en="p;CaMCZ",fr="p;CaMCZ",de="p;CaMCZ",})lct:RT(65500869,75627323,92,{en="m[a0^X;",})
+lct:RT(4198689717,1143482591,92,{en="/]X<yuwZ{@;]",})
+lct:RT(2074654098,false,92,{en="/:{C[^@;[}aQC@a5^{zZXZC^{",fr="ku]]Ey;>@azu{a5^{z;X@",de="/:{C[^@aQZX<@a6;]vbX<@Zw",})lct:RT(2074654098,4247615100,92,{en="4[u>;{Au[=;]",fr="/]z;>@;^{;av;a3C>v;{",de="T;[@;>Au>v;];]",})
+lct:RT(1134753014,false,92,{en="q]{ua3uxC]",fr="q]{ua3uxC]",de="q]{ua3uxC]",})
+lct:RT(3966971491,false,92,{en="n1ka/]wC>Zu>anC|;]",fr="n1ka/]wC>Zu>anC|;]",de="n1ka/]wC>Zu>anC|;]",})
+lct:RT(3820965258,false,92,{en="M[CCv@<Z]{@}",fr="M[CCv@<Z]{@}",de="M[CCv@<Z]{@}",})lct:RT(3820965258,1047795165,92,{en="1]u:{a4CzXC]>",fr="1]u:{a4CzXC]>",de="1]u:{a4CzXC]>",})
+
+lct:RT(1419169535,false,1330,{en="R^u]@;]yu{@;]",})
+lct:RT(3580024219,false,92,{en="5@C]y<C[va3;]X;>u]}",fr="3;]X;>uZ];av;alC]@FS;yzK@;",de="5@^]yY;{@;a5`[v>;]",})
+lct:RT(347320517,false,92,{en="4C@u@Ca3u{<;]",fr="3u{<;]av;a4Cyy;{av;aS;]];",de="Pu]@CYY;[{@uyzY;]",})
+lct:RT(87490740,false,92,{en="5u>w^Z>;apC{;",de="5u>w^Z>;{apC{;",})
+lct:RT(2550321801,false,92,{en="l[^YY}a4uA{alZw<@}ak[uA{",fr="l[^YY}a4uA{alZw<@}ak[uA{",})lct:RT(2550321801,1979421257,1810,{en="Su>=Z@@}Fku@",fr="Su>=Z@@}Fku@",})
+lct:RT(3995154142,false,92,{en="N@;]>u[ak<uyzZC>",fr="k<uyzZC>aa@;]>;[",de="NAZw;]ak<uyzZC>",})
+lct:RT(874548877,false,92,{en="3^v:u[[a3u|;>",fr="3^v:u[[a3u|;>",de="5X<[uyy:u[[a3u|;>",})
+lct:RT(416224960,false,92,{en="6;]}a/>w]}",fr="S]c{a;>aXC[c];",de="5;<]aA'@;>v",})
+lct:RT(2740299925,3886364242,92,{en="0]uwC>a5zZ]Z@",fr="0]uwC>a5zZ]Z@",de="0]uwC>a5zZ]Z@",})
+lct:RT(3196471767,false,92,{en="1u][ZXakC>>CZ{{;^]",fr="kC>>CZ{{;^]aaa[DuZ[",de="P>C:[u^X<FP;>>;]",})
+lct:RT(1731359458,false,92,{en="5u>v:uwa3u{@;]",})
+
+lct:RT(2402295877,false,92,{en="1];u@a5uw;(aN?^u[aCYaO;u|;>",fr="1]u>va5uZ>@aawu[av^akZ;[",de="1]C~;]aO;Z[Zw;]aOZyy;[",})
+lct:RT(2762805744,false,1391,{en="5@C>;X^@@;]",})lct:RT(2762805744,435253680,1391,{en="5@C>;X^@@;]",})
+lct:RT(1069428601,false,92,{en="O;u[;]aCYa@<;aT;u=a",fr="1^E]Z{{;^]av;{aluZ:[;{",de="O;Z[;]av;]a5X<AuX<;>",})
+lct:RT(2511359942,false,92,{en="S<;aU;]wakC>v^X@C]",fr="n;ak<;YaU;]w",de="0;]aU;]wa0Z]Zw;>@",})
+lct:RT(2037837684,false,92,{en="5;]|u>@aCYawCvv;{{a1[Z@@;]",})
+
+lct:RT(1904732837,false,true,{en="/vv;]aCYao>{",fr="/vvZ@ZC>>;^]av;ao>{",de="/vvZ;];]a|C>ao>{",})
+lct:RT(2787550069,453923765,true,{en="p;{@CFZ>F0Z{w^Z{;",fr="p;{@CFZ>F0Z{w^Z{;",de="p;{@CFZ>F0Z{w^Z{;",})
+lct:RT(1987214583,false,92,{en="S<;aN[v;]a0]uwC>",fr="S<;aN[v;]a0]uwC>",de="S<;aN[v;]a0]uwC>",})lct:RT(1987214583,3107977549,628,{en="S<;a3u{@;]yZ>v",fr="S<;a3u{@;]yZ>v",de="S<;a3u{@;]yZ>v",})
+lct:RT(2193066671,false,92,{en="pCX=;@;;]",})lct:RT(2193066671,2274919616,1810,{en="PC{yC>u^@aPZ@@}",})
+lct:RT(3600512696,false,92,{en="1];u@;{@aCYau[[aSZy;",fr="3;Z[[;^]av;aSC^{a[;{aS;yz{",de="1]`~@;]a/[[;]aU;Z@;>",})
+lct:RT(1024520674,false,92,{en="4;uX;=;;z;]",fr="5C[vu@av;a[ua4uZ_",de="l]Z;v;>{AbX<@;]",})
+lct:RT(4257573713,false,92,{en="oyu;aTua3C^a5<Z>v;Z]^",fr="oyu;aTua3C^a5<Z>v;Z]^",de="oyu;aTua3C^a5<Z>v;Z]^",})
+
+lct:RT(3316406928,false,92,{en="5C>wA;u|;]",fr="SZ{{;^]av;ak<u>{C>",de="nZ;vA;:;]",})lct:RT(3316406928,331729979,1391,{en="nZ@;]u]}an;w;>v",fr="nEw;>v;anZ@@E]uZ];",de="nZ@;]u]Z{X<;an;w;>v;",})
+lct:RT(653129646,false,92,{en="S<;a1C[v;>a5uZ>@",fr="n;a5uZ>@avDo]",de="av;]awC[v;>;aO;Z[Zw;",})lct:RT(653129646,1618900846,92,{en="S<;a0]^Zv",fr="n;a0]^Zv;",de="0;]a0]^Zv;",})
+lct:RT(2514190522,false,92,{en="myz;]Zu[aMu@@[;yuw;",fr="Mu@@[;yuw;amyzE]Zu[",de="amyz;]Zu[;]aPuyzYyuwZ;]",})lct:RT(2514190522,2080803584,1810,{en="5z;u]aCYa5@;>vu]]",fr="nu>X;av;a5@;>vu]]",de="5z;;]a|C>a5@;>vu]]",})
+lct:RT(2224225614,false,92,{en="5z;u=;]aYC]a@<;a0;uv",})
+lct:RT(2455827257,false,92,{en="S<;a5@ZX=a4]Z>X;{{",de="0Z;a5@CX=a4]Z>B;{{Z>",})
+--[[
+Author: Kyoma
+Filename: LibTitleLocale.lua
+Version: 3 (Horns of the Reach)
+Total: 95 titles
+]]--
+
+local LocaleTitles =
+{
+	["de"] =
+	{
+		[2] =
+		{
+			[1810] = "Divayth Fyrs Gehilfe",
+			[1838] = "Der Tick-Tack-Peiniger",
+			[1330] = "makelloser Eroberer",
+			[51] = "Monsterjäger",
+			[705] = "Großfeldherr",
+			[92] = "Freiwilliger",
+			[494] = "Meisterangler",
+			[1391] = "dro-m'Athra-Zerstörer",
+			[628] = "Held Tamriels",
+			[1910] = "Held der Eroberung",
+			[1913] = "Großchampion",
+			[2139] = "Greifenherz",
+			[2079] = "Stimme der Vernunft",
+			[2136] = "Lichtbringer",
+			[2075] = "Unsterblicher Erlöser",
+		},
+		[1] =
+		{
+			[1810] = "Divayth Fyrs Gehilfin",
+			[1838] = "Die Tick-Tack-Peinigerin",
+			[1330] = "makellose Eroberin",
+			[51] = "Monsterjägerin",
+			[705] = "Großfeldherrin",
+			[92] = "Freiwillige",
+			[494] = "Meisteranglerin",
+			[1391] = "dro-m'Athra-Zerstörerin",
+			[628] = "Heldin Tamriels",
+			[1910] = "Heldin der Eroberung",
+			[1913] = "Großchampion",
+		},
+	},
+	["en"] =
+	{
+		[2] =
+		{
+			[1810] = "Divayth Fyr's Coadjutor",
+			[1838] = "Tick-Tock Tormentor",
+			[1330] = "The Flawless Conqueror",
+			[51] = "Monster Hunter",
+			[705] = "Grand Overlord",
+			[628] = "Tamriel Hero",
+			[1391] = "Dro-m'Athra Destroyer",
+			[494] = "Master Angler",
+			[92] = "Volunteer",
+			[1910] = "Conquering Hero",
+			[1913] = "Grand Champion",
+			[2079] = "Voice of Reason",
+			[2075] = "Immortal Redeemer",
+			[2139] = "Gryphon Heart",
+			[2136] = "Bringer of Light",
+		},
+		[1] =
+		{
+			[1810] = "Divayth Fyr's Coadjutor",
+			[1838] = "Tick-Tock Tormentor",
+			[1330] = "The Flawless Conqueror",
+			[51] = "Monster Hunter",
+			[705] = "Grand Overlord",
+			[628] = "Tamriel Hero",
+			[1391] = "Dro-m'Athra Destroyer",
+			[494] = "Master Angler",
+			[92] = "Volunteer",
+			[1910] = "Conquering Hero",
+			[1913] = "Grand Champion",
+
+		},
+	},
+	["fr"] =
+	{
+		[2] =
+		{
+			[1810] = "Coadjuteur de Divayth Fyr",
+			[1838] = "Tourmenteur des Tic-tac",
+			[1330] = "Le conquérant implacable",
+			[51] = "Chasseur de monstres",
+			[705] = "Grand maréchal",
+			[628] = "Héros de Tamriel",
+			[1391] = "Destructeur des dro-m'Athra",
+			[494] = "Maître de pêche",
+			[92] = "Volontaire",
+			[1910] = "Héros conquérant",
+			[1913] = "Grand champion",
+			[2075] = "Rédempteur immortel",
+			[2139] = "Cœur-de-griffon",
+			[2136] = "Porteur de lumière",
+			[2079] = "Voix de la raison",
+
+
+		},
+		[1] =
+		{
+
+			[1810] = "Coadjutrice de Divayth Fyr",
+			[1838] = "Tourmenteuse des Tic-tac",
+			[1330] = "La conquérante implacable",
+			[51] = "Chasseuse de monstres",
+			[1391] = "Destructrice des dro-m'Athra",
+			[494] = "Maîtresse de pêche",
+			[705] = "Grand maréchal",
+			[628] = "Héroïne de Tamriel",
+			[92] = "Volontaire",
+			[1910] = "Héroïne conquérante",
+			[1913] = "Grande championne",
+		},
+	},
+}
+
+local GetAchievementRewardTitle_original
+
+local function Unload()
+	GetAchievementRewardTitle = GetAchievementRewardTitle_original
+end
+
+local function Load()
+
+	GetAchievementRewardTitle_original = GetAchievementRewardTitle
+	GetAchievementRewardTitle = function(achievementId, gender)
+		local hasTitle, title = GetAchievementRewardTitle_original(achievementId, gender)
+		if (hasTitle and gender) then
+			if (LocaleTitles[lang] and LocaleTitles[lang][gender] and LocaleTitles[lang][gender][achievementId]) then
+				title = LocaleTitles[lang][gender][achievementId]
+			end
+		end
+		return hasTitle, title
+	end
+
+	LibCustomTitles.Unload = Unload
+end
+
+if(LibCustomTitles.Unload) then LibCustomTitles.Unload() end
+Load()
diff --git a/startup.lua b/startup.lua
index 0b83030..7b3e2ab 100644
--- a/startup.lua
+++ b/startup.lua
@@ -1,7 +1,7 @@
 FurnitureCatalogue 					= {}
 FurnitureCatalogue.name				= "FurnitureCatalogue"
 FurnitureCatalogue.author			= "manavortex"
-FurnitureCatalogue.version          = "2.5.71"
+FurnitureCatalogue.version          = "2.5.8"
 FurnitureCatalogue.CharacterName	= nil
 FurnitureCatalogue.settings			= {}