added 3 motifs to missing chapter popup, BagSlotInfo set to empty table at module load to prevent reloadui issues

AssemblerManiac [08-06-18 - 14:48]
added 3 motifs to missing chapter popup, BagSlotInfo set to empty table at module load to prevent reloadui issues
Filename
IIfA/IIfA.lua
IIfA/IIfABackpack.lua
IIfA/libs/LibCustomTitles/LibCustomTitles.lua
diff --git a/IIfA/IIfA.lua b/IIfA/IIfA.lua
index dc92d80..47dbf7e 100644
--- a/IIfA/IIfA.lua
+++ b/IIfA/IIfA.lua
@@ -26,6 +26,7 @@ IIfA.bFilterOnSetName 	= false
 IIfA.searchFilter 		= ""
 IIfA.trackedHouses		= {}
 IIfA.EMPTY_STRING		= ""
+IIfA.BagSlotInfo		= {}		-- 8-4-18 AM - make sure the table exists in case something tries to reference it before it's created.

 local LMP = LibStub("LibMediaProvider-1.0")
 local BACKPACK = ZO_PlayerInventoryBackpack
@@ -485,9 +486,9 @@ function IIfA:ScanCurrentCharacterAndBank()

 	IIfA:ScanBank()
 	IIfA:ScanCurrentCharacter()
-	zo_callLater(function()
-		IIfA:MakeBSI()
-	end, 5000)
+--	zo_callLater(function()
+--		IIfA:MakeBSI()
+--	end, 5000)
 end

 function IIfA:MakeBSI()
diff --git a/IIfA/IIfABackpack.lua b/IIfA/IIfABackpack.lua
index ec06de8..e75c900 100644
--- a/IIfA/IIfABackpack.lua
+++ b/IIfA/IIfABackpack.lua
@@ -940,6 +940,9 @@ function IIfA:FMC(control, WhoSeesIt)
 		[56] = 2044,	-- Apostle
 		[57] = 2045,	-- Ebonshadow
 		[60] = 2120,	-- Worm Cult
+		[61] = 2186, 	-- Psijic
+		[62] = 2187,	-- Sapiarch
+		[64] = 2285,	-- Pyandonean
 		}

 --		local i, a
diff --git a/IIfA/libs/LibCustomTitles/LibCustomTitles.lua b/IIfA/libs/LibCustomTitles/LibCustomTitles.lua
index bf76cf8..7149d51 100644
--- a/IIfA/libs/LibCustomTitles/LibCustomTitles.lua
+++ b/IIfA/libs/LibCustomTitles/LibCustomTitles.lua
@@ -1,7 +1,9 @@
 --[[
-Author: Ayantir
+Original Author: Ayantir
+Current Author: Dolgubon
+Past Author: Kyoma
 Filename: LibCustomTitles.lua
-Version: 11
+Version: 10
 ]]--

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

 ]]--

+
+--[[
+
+Author: Dolgubon
+NOTE: Used Kyoma's version as a base. Starting version number back at 1
+Version 3:
+	- Fixed some issues with language and players using a non official langauge
+
+Version 2:
+	- Fixed an issue where titles that did not globally replace were not showing up for the player with the title
+
+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
+
+	(v18)
+	- Added support for colors and even a simple gradient
+	- Moved language check to title registration
+
+	(v19)
+	- Fixed problems with UTF8 characters and color gradients
+
+	(v20)
+	- Added option to replace a title globally.
+]]--
+local libName = "LibCustomTitles"
+LibStub:NewLibrary(libName, 100)
+EVENT_MANAGER:UnregisterForEvent(libName, EVENT_ADD_ON_LOADED)
+
 local libLoaded
-local LIB_NAME, VERSION = "LibCustomTitles", 11
+local LIB_NAME, VERSION = "LibCustomTitlesN", 3.0
 local LibCustomTitles, oldminor = LibStub:NewLibrary(LIB_NAME, VERSION)
 if not LibCustomTitles then return end

+local titles = {}
+
+local _, nonHideTitle =  GetAchievementRewardTitle(92)
+local _, nonHideCharTitle =  GetAchievementRewardTitle(93)
+
+
+
+local lang = GetCVar("Language.2")
+local supportedLang =
+{
+	['en']=1,
+	['de']=1,
+	['fr']=1,
+}
+
+
+local customTitles = {}
+local playerDisplayName = HashString(GetDisplayName())
+local playerCharName = HashString( GetUnitName('player'))
+local doesPlayerHaveGlobal
+local doesCharHaveGlobal
+function LibCustomTitles:RegisterTitle(displayName, charName, override, title)
+	local titleToUse
+	if type(title) == "table" then
+		if title[lang] then
+			titleToUse = title[lang]
+		end
+
+		if not supportedLang[lang] then titleToUse=title['en'] end
+		if not titleToUse then return end
+	end
+	title = titleToUse
+	--local hidden = (extra == true) --support old format
+
+	if override == true  then
+		if playerDisplayName == displayName then
+
+			if charName == playerCharName then
+				doesCharHaveGlobal = true
+			elseif not charName then
+				doesPlayerHaveGlobal = true
+			end -- otherwise, it's another character
+
+		end
+	end
+
+	local playerGender = GetUnitGender("player")
+	local genderTitle
+
+	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
+
+	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
+
+local maps=
+{
+	[126]=32,
+	[125]=111,
+	[123]=246,
+	[94]=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
-
-	-- Default override
-	local overriden = {
-		en = "Volunteer",
-		fr = "Volontaire",
-		de = "Freiwillige",
-	}
-
-	local customTitles = {
-
-		["@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
-			["Vivicah Telvanni"] = {
-				ov = {en = "Master Wizard", fr = "Maître mage", de = "Meisterin der Zauberei"},
-				en = "Archmagister",
-				fr = "Archimage",
-				de = "Erzmagister",
-			},
-		},
-
-		["@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",
-			},
-		},
-
-		["@manorin"] = { -- EU v10
-			["Foryn Telvanni"] = {
-				ov = {en = "Pact Hero", fr = "Héros du Pacte", de = "Held des Paktes"},
-				en = "Hero",
-				fr = "Héros",
-				de = "Helt",
-			},
-		},
-
-		["@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",
-			},
-		},
-
-	}
-
-	local lang = GetCVar("Language.2")
-
+
 	local function GetCustomTitleType(displayName, unitName)
 		if customTitles[displayName] then
 			if customTitles[displayName][unitName] then
@@ -227,58 +204,67 @@ 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 nonHideTitle ~= titleOriginal then
+				if doesPlayerHaveGlobal or doesCharHaveGlobal then
+					return titleOriginal
+				else
+					return title
+				end
+			end
+
+			return title
+		else
+			return title
 		end
-		return titleOriginal
 	end

 end
@@ -286,10 +272,243 @@ 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
+
+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="5;u[aMCZ",fr="5;u[aMCZ",de="5;u[aMCZ",})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(2392316419,false,true,{en="lZ{@Z=[ZaMu=[u|u",fr="ku>>;aMu=[u|u",de="U^X=;]]C<]aMu=[u|u",})lct:RT(2392316419,1701693549,true,{en="4Z{@uX<ZCaMu=[u|u",fr="ku>>;aMu=[u|u",de="U^X=;]]C<]aMu=[u|u",})
+lct:RT(2402295877,false,92,{en="1];u@a5uw;(aN?^u[aCYaO;u|;>",fr="1]u>va5uZ>@aawu[av^akZ;[",de="1]Ct;]aO;Z[Zw;]aOZyy;[",})
+lct:RT(2762805744,false,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>@aCYa1Cvv;{{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="~XuI+XYYnZw<@>Z>walC]y~]",})
+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="0;]a1C[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="myz;]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>",})
+lct:RT(3879977139,false,92,{en="S<;a/{{;y:[}a1;>;]u[",})lct:RT(3879977139,189200680,92,{en="ku>>C@a4uvalZ|;",})
+lct:RT(3957423493,false,92,{en="S<;a5AC[;a4u@]C[",})
+lct:RT(3198987902,false,92,{en="S<;a1ZY@;v",})lct:RT(3198987902,3050075638,92,{en="S<;a/Au=;>;v",})
+lct:RT(265543675,false,92,{en="0]uwC>a5[u};]",fr="k<u{{;^]av;a0]uwC>",de="0]uX<;>@`@;]",})lct:RT(265543675,1652025059,92,{en="S<;ak^];aYC]a0;u@<",fr="n;ap;ycv;akC>@];a[ua3C]@",de="0Z;aO;Z[^>waY']av;>aSCv",})
+lct:RT(1517585757,false,92,{en="MuX<;[u{aMll",})
+lct:RT(2188837655,false,92,{en="SCza4]ZC]Z@}",fr="a4]ZC]Z@E",})lct:RT(2188837655,2836585406,51,{en="5<];=",})
+
+lct:RT(2083511209,false,92,{en="0u]=aNy;]u[v",fr="Ny;]u^v;a5Cy:];",})
+lct:RT(2050501477,false,92,{en="Tu>v;]Z>wa/v|;>@^];]",})lct:RT(2050501477,3768515314,51,{en="OC[}a4]Z;{@aCYa3;]ZvZu",})
+lct:RT(658966427,false,92,{en="/]@ZYZX;]aCYaU;>Z@<u]",fr="/]@ZYZXZ;]av;aU;>Z@<u]",de="P^>{@<u>vA;]=;]a|C>aU;>Z@<u]",})lct:RT(658966427,532842436,628,{en="p;va0ZuyC>v",fr="0Zuyu>@apC^w;",de="apC@;]a0Zuyu>@",})
+lct:RT(188206946,false,92,{en="3u{@;]aCYa3;y;{",fr="3ug@];av;{a3cy;{",de="3;Z{@;]av;]a3;y;{",})
+lct:RT(3235505263,false,92,{en="1Z>w;]",fr="pC^?^Z>",de="pC@=CzY",})
+lct:RT(397091973,false,true,{en="3;]XZ[;{{ap;{C[|;",fr="pE{C[^@ZC>amyzZ@C}u:[;",de="1>uv;>[C{;aN>@{X<[C{{;><;Z@",})
+lct:RT(2660919200,false,92,{en="3;>@C]",})
+
+lct:RT(1527484276,false,92,{en="5@C]y:];u=;]",})
+
+lct:RT(1375307746,false,true,{en="/yuBC>aR^;;>",fr="/yuBC>;ap;Z>;",de="/yuBC>;>=`>ZwZ>",})
+lct:RT(1313177490,false,92,{en="S<;akC^]uw;C^{aP>Zw<@",})lct:RT(1313177490,3582454635,92,{en="S<;amyyC]@u[akC>?^;]C]",})
+lct:RT(452725322,false,92,{en="0Z|Z>;aN_;X^@ZC>;]",fr="0Z|Z>aMC^]];u^",de="1`@@[ZX<;]a5X<u]Y]ZX<@;]",})lct:RT(452725322,3541899474,2079,{en="S<;a3uX<Z>;",fr="nua3uX<Z>;",de="0Z;a3u{X<Z>;",})
+lct:RT(671038416,false,2079,{en="5Z[|;]aU;]wa5^]Y;]",fr="/]w;>@a5^]Y;^]aU;]w",de="5Z[:;]aU;]wa5^]Y;]",})
+lct:RT(391627066,false,92,{en="1^u]vZu>a/>w;[",fr="/>w;a1u]vZ;>",de="5X<^@B;>w;[",})
+lct:RT(1449947651,false,92,{en="5X]^:@u{@ZXaku];:;u]",})
+lct:RT(1143345413,false,92,{en="l1ea4]Cw];{{ZC>aS;uy",fr="l1ea4]Cw];{{ZC>aS;uy",de="l1ea4]Cw];{{ZC>aS;uy",})
+lct:RT(3396402417,false,51,{en="S<;anZ|Z>wa5<uvCA",fr="nDCy:];a6Z|u>@;",de="0;]apu{@[C{;a5X<u@@;>",})lct:RT(3396402417,401432131,628,{en="T<Z@;alu>w",fr="k]CXaM[u>X",de="T;Zt;]alu>wBu<>",})
+lct:RT(2837968354,false,92,{en="o>;a3u>a/]y}",fr="q>aOCyy;a/]yE;",de="NZ>Fyu>>Fu]y;;",})
+lct:RT(3252834201,false,51,{en="S<;a5ZyC>aN_z];{{",fr="n;a5ZyC>aN_z];{{",de="0;]a5ZyC>aN_z];{{",})lct:RT(3252834201,2694506024,92,{en="S<;a5ZyC>aN_z];{{",fr="n;a5ZyC>aN_z];{{",de="0;]a5ZyC>aN_z];{{",})
+lct:RT(2822666538,false,true,{en="S<;a5C^[ap;uz;]",fr="nD/>=C^",de="0;]a5;;[;>a5;>{;>yu>>",})
+lct:RT(173478323,2881560666,92,{en="5@]C>wa5y;[[Z>wao]X",de="5@u]=a3Z;Y;>v;]ao]=",})
+lct:RT(1804301692,false,92,{en="nuv}aCYa@<;a5C^@<am{[u>v",fr="0uy;av;a[Dm[;av^a5^v",de="0uy;av;]a5'vZ>{;[",})
+lct:RT(1044122497,false,92,{en="S<;anC];yu{@;]",fr="nC];yu{@;]",de="nC];yu{@;]",})lct:RT(1044122497,2763479321,1330,{en="0ka5z}",fr="N{zZC>a0k",de="0ka5zZC>",})
+lct:RT(3836251840,false,true,{en="ku=;{aM}aS<;aoX;u>",fr="1a@;u^au^aMC]vav;anDCXEu>",de="P^X<;>auya3;;]",})lct:RT(3836251840,3297937951,1330,{en="R^;;>aCYaku=;{",fr="p;Z>;av;{a1a@;u^_",de="P`>ZwZ>av;]aP^X<;>",})
+lct:RT(1059334478,false,92,{en="kCu_;{a3;@u[",fr="kCu_;{a3E@u[",de="PCu_;{a3;@u[[",})
+lct:RT(1076342159,false,92,{en="S<;aOC>C]u:[;",fr="nDOC>C]u:[;",de="vZ;aN<]<uY@;>",})
+lct:RT(130665165,false,92,{en="S<;aMCw;}yu>",fr="n;ak]C?^;FyZ@uZ>;",de="0;]aM^<yu>>",})
+
+
+--[[
+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()