Advertisement
kim121

NSCT (한글축약)

Nov 17th, 2018
555
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 51.66 KB | None | 0 0
  1. ---------------
  2. -- LIBRARIES --
  3. ---------------
  4. local AceAddon = LibStub("AceAddon-3.0");
  5. local LibEasing = LibStub("LibEasing-1.0");
  6. local SharedMedia = LibStub("LibSharedMedia-3.0");
  7.  
  8. NameplateSCT = AceAddon:NewAddon("NameplateSCT", "AceConsole-3.0", "AceEvent-3.0");
  9. NameplateSCT.frame = CreateFrame("Frame", nil, UIParent);
  10.  
  11.  
  12. ------------
  13. -- LOCALS --
  14. ------------
  15. local _;
  16. local animating = {};
  17.  
  18. local playerGUID;
  19. local unitToGuid = {};
  20. local guidToUnit = {};
  21.  
  22. local targetFrames = {};
  23. for level = 1, 3 do
  24. targetFrames[level] = CreateFrame("Frame", nil, UIParent);
  25. end
  26.  
  27. local offTargetFrames = {};
  28. for level = 1, 3 do
  29. offTargetFrames[level] = CreateFrame("Frame", nil, UIParent);
  30. end
  31.  
  32.  
  33. --------
  34. -- DB --
  35. --------
  36. local defaultFont = "Friz Quadrata TT";
  37. if (SharedMedia:IsValid("font", "Bazooka")) then
  38. defaultFont = "Bazooka";
  39. end
  40.  
  41. local defaults = {
  42. global = {
  43. enabled = true,
  44. xOffset = 0,
  45. yOffset = 0,
  46. xOffsetPersonal = 0,
  47. yOffsetPersonal = -100,
  48.  
  49. font = defaultFont,
  50. fontFlag = "OUTLINE",
  51. fontShadow = false,
  52. damageColor = true,
  53. defaultColor = "ffff00",
  54.  
  55. truncate = true,
  56. truncateLetter = true,
  57. commaSeperate = true,
  58.  
  59. sizing = {
  60. crits = true,
  61. critsScale = 1.5,
  62.  
  63. miss = false,
  64. missScale = 1.5,
  65.  
  66. smallHits = true,
  67. smallHitsScale = 0.66,
  68. },
  69.  
  70. animations = {
  71. normal = "fountain",
  72. crit = "verticalUp",
  73. miss = "verticalUp",
  74. },
  75.  
  76. animationsPersonal = {
  77. normal = "rainfall",
  78. crit = "verticalUp",
  79. miss = "verticalUp",
  80. },
  81.  
  82. formatting = {
  83. size = 20,
  84. icon = "right",
  85. alpha = 1,
  86. },
  87.  
  88. useOffTarget = true,
  89. offTargetFormatting = {
  90. size = 15,
  91. icon = "right",
  92. alpha = 0.5,
  93. },
  94. },
  95. };
  96.  
  97.  
  98. ---------------------
  99. -- LOCAL CONSTANTS --
  100. ---------------------
  101. local SMALL_HIT_EXPIRY_WINDOW = 30;
  102. local SMALL_HIT_MULTIPIER = 0.5;
  103.  
  104. local ANIMATION_VERTICAL_DISTANCE = 75;
  105.  
  106. local ANIMATION_ARC_X_MIN = 50;
  107. local ANIMATION_ARC_X_MAX = 150;
  108. local ANIMATION_ARC_Y_TOP_MIN = 10;
  109. local ANIMATION_ARC_Y_TOP_MAX = 50;
  110. local ANIMATION_ARC_Y_BOTTOM_MIN = 10;
  111. local ANIMATION_ARC_Y_BOTTOM_MAX = 50;
  112.  
  113. -- local ANIMATION_SHAKE_DEFLECTION = 15;
  114. -- local ANIMATION_SHAKE_NUM_SHAKES = 4;
  115.  
  116. local ANIMATION_RAINFALL_X_MAX = 75;
  117. local ANIMATION_RAINFALL_Y_MIN = 50;
  118. local ANIMATION_RAINFALL_Y_MAX = 100;
  119. local ANIMATION_RAINFALL_Y_START_MIN = 5
  120. local ANIMATION_RAINFALL_Y_START_MAX = 15;
  121.  
  122. local ANIMATION_LENGTH = 1;
  123.  
  124. local DAMAGE_TYPE_COLORS = {
  125. [SCHOOL_MASK_PHYSICAL] = "FFFF00",
  126. [SCHOOL_MASK_HOLY] = "FFE680",
  127. [SCHOOL_MASK_FIRE] = "FF8000",
  128. [SCHOOL_MASK_NATURE] = "4DFF4D",
  129. [SCHOOL_MASK_FROST] = "80FFFF",
  130. [SCHOOL_MASK_SHADOW] = "8080FF",
  131. [SCHOOL_MASK_ARCANE] = "FF80FF",
  132. [SCHOOL_MASK_FIRE + SCHOOL_MASK_FROST + SCHOOL_MASK_ARCANE + SCHOOL_MASK_NATURE + SCHOOL_MASK_SHADOW] = "A330C9", -- Chromatic
  133. [SCHOOL_MASK_FIRE + SCHOOL_MASK_FROST + SCHOOL_MASK_ARCANE + SCHOOL_MASK_NATURE + SCHOOL_MASK_SHADOW + SCHOOL_MASK_HOLY] = "A330C9", -- Magic
  134. [SCHOOL_MASK_PHYSICAL + SCHOOL_MASK_FIRE + SCHOOL_MASK_FROST + SCHOOL_MASK_ARCANE + SCHOOL_MASK_NATURE + SCHOOL_MASK_SHADOW + SCHOOL_MASK_HOLY] = "A330C9", -- Chaos
  135. ["melee"] = "FFFFFF",
  136. ["pet"] = "CC8400"
  137. };
  138.  
  139. local MISS_EVENT_STRINGS = {
  140. ["ABSORB"] = "Absorbed",
  141. ["BLOCK"] = "Blocked",
  142. ["DEFLECT"] = "Deflected",
  143. ["DODGE"] = "Dodged",
  144. ["EVADE"] = "Evaded",
  145. ["IMMUNE"] = "Immune",
  146. ["MISS"] = "Missed",
  147. ["PARRY"] = "Parried",
  148. ["REFLECT"] = "Reflected",
  149. ["RESIST"] = "Resisted",
  150. };
  151.  
  152. local FRAME_LEVEL_OVERLAY = 3;
  153. local FRAME_LEVEL_ABOVE = 2;
  154. local FRAME_LEVEL_BELOW = 1;
  155.  
  156.  
  157. ----------------
  158. -- FONTSTRING --
  159. ----------------
  160. local function getFontPath(fontName)
  161. local fontPath = SharedMedia:Fetch("font", fontName);
  162.  
  163. if (fontPath == nil) then
  164. fontPath = "Fonts\\FRIZQT__.TTF";
  165. end
  166.  
  167. return fontPath;
  168. end
  169.  
  170. local fontStringCache = {};
  171. local function getFontString()
  172. local fontString;
  173.  
  174. if (next(fontStringCache)) then
  175. fontString = table.remove(fontStringCache);
  176. else
  177. fontString = NameplateSCT.frame:CreateFontString();
  178. end
  179.  
  180. fontString:SetParent(NameplateSCT.frame);
  181. fontString:SetFont(getFontPath(NameplateSCT.db.global.font), 15, NameplateSCT.db.global.fontFlag);
  182. if NameplateSCT.db.global.textShadow then fontString:SetShadowOffset(1,-1) end
  183. fontString:SetAlpha(1);
  184. fontString:SetDrawLayer("OVERLAY");
  185. fontString:SetText("");
  186. fontString:Show();
  187.  
  188. return fontString;
  189. end
  190.  
  191. local function recycleFontString(fontString)
  192. fontString:SetAlpha(0);
  193. fontString:Hide();
  194.  
  195. animating[fontString] = nil;
  196.  
  197. fontString.distance = nil;
  198. fontString.arcTop = nil;
  199. fontString.arcBottom = nil;
  200. fontString.arcXDist = nil;
  201. fontString.deflection = nil;
  202. fontString.numShakes = nil;
  203. fontString.animation = nil;
  204. fontString.animatingDuration = nil;
  205. fontString.animatingStartTime = nil;
  206. fontString.anchorFrame = nil;
  207.  
  208. fontString.unit = nil;
  209. fontString.guid = nil;
  210.  
  211. fontString.pow = nil;
  212. fontString.startHeight = nil;
  213. fontString.NSCTFontSize = nil;
  214. fontString:SetFont(getFontPath(NameplateSCT.db.global.font), 15, NameplateSCT.db.global.fontFlag);
  215. if NameplateSCT.db.global.textShadow then fontString:SetShadowOffset(1,-1) end
  216. fontString:SetParent(NameplateSCT.frame);
  217.  
  218. table.insert(fontStringCache, fontString);
  219. end
  220.  
  221.  
  222. ----------------
  223. -- NAMEPLATES --
  224. ----------------
  225. local nameplatePositionTicker;
  226. local guidNameplatePositionX = {}; -- why two tables? Because creating tables creates garbage, at least that's the idea
  227. local guidNameplatePositionY = {};
  228. local function saveNameplatePositions_Awful()
  229. -- look, this isn't a good way of doing this, but it's quick and easy and I don't
  230. -- understand why GetCenter of the nameplate isn't actually where it is and why I can't
  231. -- figure out how to scale it properly with GetEffectiveScale or whatever
  232. local fontString = getFontString();
  233.  
  234. for unit, guid in pairs(unitToGuid) do
  235. local nameplate = C_NamePlate.GetNamePlateForUnit(unit);
  236. if (nameplate and not UnitIsDead(unit) and nameplate:IsShown()) then
  237. fontString:SetPoint("CENTER", nameplate, "CENTER", 0, 0);
  238. guidNameplatePositionX[guid], guidNameplatePositionY[guid] = fontString:GetCenter();
  239. end
  240. end
  241.  
  242. recycleFontString(fontString);
  243. end
  244.  
  245. local function startSavingNameplatePositions()
  246. if (not nameplatePositionTicker) then
  247. nameplatePositionTicker = C_Timer.NewTicker(1/10, saveNameplatePositions_Awful);
  248. end
  249. end
  250.  
  251. local function stopSavingNameplatePositions()
  252. nameplatePositionTicker:Cancel();
  253. nameplatePositionTicker = nil;
  254. end
  255.  
  256. -- NameplateSCT.SaveNameplatePositions_Awful = saveNameplatePositions_Awful;
  257.  
  258. --[[ this should work for reasonable nameplate systems, but doesn't work with a bunch of them -.-
  259. local function setNameplateFrameLevels()
  260. local targetStrata;
  261. local offTargetStrata;
  262. local targetFrameLevel;
  263. local offTargetFrameLevelLow;
  264. local offTargetFrameLevelHigh;
  265.  
  266. -- get strata/framelevels for target and max for offtargets
  267. for unit, guid in pairs(unitToGuid) do
  268. local nameplate = C_NamePlate.GetNamePlateForUnit(unit);
  269. if (nameplate and not UnitIsDead(unit) and nameplate:IsShown()) then
  270. local nameplateFrame = _G[nameplate:GetName().."UnitFrame"];
  271.  
  272. if (nameplateFrame) then
  273. if (UnitIsUnit("target", unit)) then
  274. targetStrata = nameplateFrame:GetFrameStrata();
  275. targetFrameLevel = nameplateFrame:GetFrameLevel();
  276. else
  277. offTargetStrata = nameplateFrame:GetFrameStrata();
  278.  
  279. local frameLevel = nameplateFrame:GetFrameLevel();
  280. if (not offTargetFrameLevelHigh or offTargetFrameLevelHigh < frameLevel) then
  281. offTargetFrameLevelHigh = frameLevel;
  282. end
  283.  
  284. if (not offTargetFrameLevelLow or offTargetFrameLevelLow < frameLevel) then
  285. offTargetFrameLevelLow = frameLevel;
  286. end
  287. end
  288. end
  289. end
  290. end
  291.  
  292. if (targetStrata and targetFrameLevel) then
  293. local lowFrameLevel = targetFrameLevel - 1;
  294. if (lowFrameLevel < 0) then
  295. lowFrameLevel = 0;
  296. end
  297.  
  298. for _, frame in pairs(targetFrames) do
  299. frame:SetFrameStrata(targetStrata);
  300. end
  301. targetFrames[FRAME_LEVEL_OVERLAY]:SetFrameLevel(targetFrameLevel + 4);
  302. targetFrames[FRAME_LEVEL_ABOVE]:SetFrameLevel(targetFrameLevel + 3);
  303. targetFrames[FRAME_LEVEL_BELOW]:SetFrameLevel(lowFrameLevel);
  304. end
  305.  
  306. if (offTargetStrata and offTargetFrameLevelHigh and offTargetFrameLevelLow) then
  307. local lowFrameLevel = offTargetFrameLevelLow - 2;
  308. if (lowFrameLevel < 0) then
  309. lowFrameLevel = 0;
  310. end
  311.  
  312. for _, frame in pairs(offTargetFrames) do
  313. frame:SetFrameStrata(offTargetStrata);
  314. end
  315. offTargetFrames[FRAME_LEVEL_OVERLAY]:SetFrameLevel(offTargetFrameLevelHigh + 2);
  316. offTargetFrames[FRAME_LEVEL_ABOVE]:SetFrameLevel(offTargetFrameLevelHigh + 1);
  317. offTargetFrames[FRAME_LEVEL_BELOW]:SetFrameLevel(lowFrameLevel);
  318. end
  319. end
  320. ]]--
  321.  
  322. local function setNameplateFrameLevels()
  323. for _, frame in pairs(targetFrames) do
  324. frame:SetFrameStrata("LOW");
  325. end
  326. targetFrames[FRAME_LEVEL_OVERLAY]:SetFrameLevel(1001);
  327. targetFrames[FRAME_LEVEL_ABOVE]:SetFrameLevel(1000);
  328. targetFrames[FRAME_LEVEL_BELOW]:SetFrameLevel(999);
  329.  
  330. for _, frame in pairs(offTargetFrames) do
  331. frame:SetFrameStrata("LOW");
  332. end
  333. offTargetFrames[FRAME_LEVEL_OVERLAY]:SetFrameLevel(901);
  334. offTargetFrames[FRAME_LEVEL_ABOVE]:SetFrameLevel(900);
  335. offTargetFrames[FRAME_LEVEL_BELOW]:SetFrameLevel(899);
  336. end
  337.  
  338. ----------
  339. -- CORE --
  340. ----------
  341. function NameplateSCT:OnInitialize()
  342. -- setup db
  343. self.db = LibStub("AceDB-3.0"):New("NameplateSCTDB", defaults, true);
  344.  
  345. -- setup chat commands
  346. self:RegisterChatCommand("nsct", "OpenMenu");
  347.  
  348. -- setup menu
  349. self:RegisterMenu();
  350.  
  351. setNameplateFrameLevels();
  352.  
  353. -- if the addon is turned off in db, turn it off
  354. if (self.db.global.enabled == false) then
  355. self:Disable();
  356. end
  357. end
  358.  
  359. function NameplateSCT:OnEnable()
  360. playerGUID = UnitGUID("player");
  361.  
  362. self:RegisterEvent("NAME_PLATE_UNIT_ADDED");
  363. self:RegisterEvent("NAME_PLATE_UNIT_REMOVED");
  364. self:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED");
  365.  
  366. self.db.global.enabled = true;
  367. end
  368.  
  369. function NameplateSCT:OnDisable()
  370. self:UnregisterAllEvents();
  371.  
  372. for fontString, _ in pairs(animating) do
  373. recycleFontString(fontString);
  374. end
  375.  
  376. self.db.global.enabled = false;
  377. end
  378.  
  379.  
  380. ---------------
  381. -- ANIMATION --
  382. ---------------
  383. local function verticalPath(elapsed, duration, distance)
  384. return 0, LibEasing.InQuad(elapsed, 0, distance, duration);
  385. end
  386.  
  387. local function arcPath(elapsed, duration, xDist, yStart, yTop, yBottom)
  388. local x, y;
  389. local progress = elapsed/duration;
  390.  
  391. x = progress * xDist;
  392.  
  393. -- progress 0 to 1
  394. -- at progress 0, y = yStart
  395. -- at progress 0.5 y = yTop
  396. -- at progress 1 y = yBottom
  397.  
  398. -- -0.25a + .5b + yStart = yTop
  399. -- -a + b + yStart = yBottom
  400.  
  401. -- -0.25a + .5b + yStart = yTop
  402. -- .5b + yStart - yTop = 0.25a
  403. -- 2b + 4yStart - 4yTop = a
  404.  
  405. -- -(2b + 4yStart - 4yTop) + b + yStart = yBottom
  406. -- -2b - 4yStart + 4yTop + b + yStart = yBottom
  407. -- -b - 3yStart + 4yTop = yBottom
  408.  
  409. -- -3yStart + 4yTop - yBottom = b
  410.  
  411. -- 2(-3yStart + 4yTop - yBottom) + 4yStart - 4yTop = a
  412. -- -6yStart + 8yTop - 2yBottom + 4yStart - 4yTop = a
  413. -- -2yStart + 4yTop - 2yBottom = a
  414.  
  415. -- -3yStart + 4yTop - yBottom = b
  416. -- -2yStart + 4yTop - 2yBottom = a
  417.  
  418. local a = -2 * yStart + 4 * yTop - 2 * yBottom;
  419. local b = -3 * yStart + 4 * yTop - yBottom;
  420.  
  421. y = -a * math.pow(progress, 2) + b * progress + yStart;
  422.  
  423. return x, y;
  424. end
  425.  
  426. local function powSizing(elapsed, duration, start, middle, finish)
  427. local size = finish;
  428. if (elapsed < duration) then
  429. if (elapsed/duration < 0.5) then
  430. size = LibEasing.OutQuint(elapsed, start, middle - start, duration/2);
  431. else
  432. size = LibEasing.InQuint(elapsed - elapsed/2, middle, finish - middle, duration/2);
  433. end
  434. end
  435. return size;
  436. end
  437.  
  438. local function AnimationOnUpdate()
  439. if (next(animating)) then
  440. -- setNameplateFrameLevels();
  441.  
  442. for fontString, _ in pairs(animating) do
  443. local elapsed = GetTime() - fontString.animatingStartTime;
  444. if (elapsed > fontString.animatingDuration) then
  445. -- the animation is over
  446. recycleFontString(fontString);
  447. else
  448. local isTarget = false
  449. if fontString.unit then
  450. isTarget = UnitIsUnit(fontString.unit, "target");
  451. else
  452. fontString.unit = "player"
  453. end
  454. -- frame level
  455. if (fontString.frameLevel) then
  456. if (isTarget) then
  457. if (fontString:GetParent() ~= targetFrames[fontString.frameLevel]) then
  458. fontString:SetParent(targetFrames[fontString.frameLevel])
  459. end
  460. else
  461. if (fontString:GetParent() ~= offTargetFrames[fontString.frameLevel]) then
  462. fontString:SetParent(offTargetFrames[fontString.frameLevel])
  463. end
  464. end
  465. end
  466.  
  467. -- alpha
  468. local startAlpha = NameplateSCT.db.global.formatting.alpha;
  469. if (NameplateSCT.db.global.useOffTarget and not isTarget and fontString.unit ~= "player") then
  470. startAlpha = NameplateSCT.db.global.offTargetFormatting.alpha;
  471. end
  472.  
  473. local alpha = LibEasing.InExpo(elapsed, startAlpha, -startAlpha, fontString.animatingDuration);
  474. fontString:SetAlpha(alpha);
  475.  
  476. -- sizing
  477. if (fontString.pow) then
  478. if (elapsed < fontString.animatingDuration/6) then
  479. fontString:SetText(fontString.NSCTTextWithoutIcons);
  480.  
  481. local size = powSizing(elapsed, fontString.animatingDuration/6, fontString.startHeight/2, fontString.startHeight*2, fontString.startHeight);
  482. fontString:SetTextHeight(size);
  483. else
  484. fontString.pow = nil;
  485. fontString:SetTextHeight(fontString.startHeight);
  486. fontString:SetFont(getFontPath(NameplateSCT.db.global.font), fontString.NSCTFontSize, NameplateSCT.db.global.fontFlag);
  487. if NameplateSCT.db.global.textShadow then fontString:SetShadowOffset(1,-1) end
  488. fontString:SetText(fontString.NSCTText);
  489. end
  490. end
  491.  
  492. -- position
  493. local xOffset, yOffset = 0, 0;
  494. if (fontString.animation == "verticalUp") then
  495. xOffset, yOffset = verticalPath(elapsed, fontString.animatingDuration, fontString.distance);
  496. elseif (fontString.animation == "verticalDown") then
  497. xOffset, yOffset = verticalPath(elapsed, fontString.animatingDuration, -fontString.distance);
  498. elseif (fontString.animation == "fountain") then
  499. xOffset, yOffset = arcPath(elapsed, fontString.animatingDuration, fontString.arcXDist, 0, fontString.arcTop, fontString.arcBottom);
  500. elseif (fontString.animation == "rainfall") then
  501. _, yOffset = verticalPath(elapsed, fontString.animatingDuration, -fontString.distance);
  502. xOffset = fontString.rainfallX;
  503. yOffset = yOffset + fontString.rainfallStartY;
  504. -- elseif (fontString.animation == "shake") then
  505. -- TODO
  506. end
  507.  
  508. if (not UnitIsDead(fontString.unit) and fontString.anchorFrame and fontString.anchorFrame:IsShown()) then
  509. if fontString.unit == "player" then -- player frame
  510. fontString:SetPoint("CENTER", fontString.anchorFrame, "CENTER", NameplateSCT.db.global.xOffsetPersonal + xOffset, NameplateSCT.db.global.yOffsetPersonal + yOffset); -- Only allows for adjusting vertical offset
  511. else -- nameplate frames
  512. fontString:SetPoint("CENTER", fontString.anchorFrame, "CENTER", NameplateSCT.db.global.xOffset + xOffset, NameplateSCT.db.global.yOffset + yOffset);
  513. end
  514. -- remember the last position of the nameplate
  515. local x, y = fontString:GetCenter();
  516. guidNameplatePositionX[fontString.guid] = x - (NameplateSCT.db.global.xOffset + xOffset);
  517. guidNameplatePositionY[fontString.guid] = y - (NameplateSCT.db.global.yOffset + yOffset);
  518. elseif (guidNameplatePositionX[fontString.guid] and guidNameplatePositionY[fontString.guid]) then
  519. fontString.anchorFrame = nil;
  520. fontString:ClearAllPoints();
  521. fontString:SetPoint("CENTER", UIParent, "BOTTOMLEFT", guidNameplatePositionX[fontString.guid] + NameplateSCT.db.global.xOffset + xOffset, guidNameplatePositionY[fontString.guid] + NameplateSCT.db.global.yOffset + yOffset);
  522. else
  523. recycleFontString(fontString);
  524. end
  525. end
  526. end
  527. else
  528. -- nothing in the animation list, so just kill the onupdate
  529. NameplateSCT.frame:SetScript("OnUpdate", nil);
  530. end
  531. end
  532.  
  533. -- NameplateSCT.AnimationOnUpdate = AnimationOnUpdate;
  534.  
  535. local arcDirection = 1;
  536. function NameplateSCT:Animate(fontString, anchorFrame, duration, animation)
  537. animation = animation or "verticalUp";
  538.  
  539. fontString.animation = animation;
  540. fontString.animatingDuration = duration;
  541. fontString.animatingStartTime = GetTime();
  542. fontString.anchorFrame = anchorFrame == player and UIParent or anchorFrame;
  543.  
  544. if (animation == "verticalUp") then
  545. fontString.distance = ANIMATION_VERTICAL_DISTANCE;
  546. elseif (animation == "verticalDown") then
  547. fontString.distance = ANIMATION_VERTICAL_DISTANCE;
  548. elseif (animation == "fountain") then
  549. fontString.arcTop = math.random(ANIMATION_ARC_Y_TOP_MIN, ANIMATION_ARC_Y_TOP_MAX);
  550. fontString.arcBottom = -math.random(ANIMATION_ARC_Y_BOTTOM_MIN, ANIMATION_ARC_Y_BOTTOM_MAX);
  551. fontString.arcXDist = arcDirection * math.random(ANIMATION_ARC_X_MIN, ANIMATION_ARC_X_MAX);
  552.  
  553. arcDirection = arcDirection * -1;
  554. elseif (animation == "rainfall") then
  555. fontString.distance = math.random(ANIMATION_RAINFALL_Y_MIN, ANIMATION_RAINFALL_Y_MAX);
  556. fontString.rainfallX = math.random(-ANIMATION_RAINFALL_X_MAX, ANIMATION_RAINFALL_X_MAX);
  557. fontString.rainfallStartY = -math.random(ANIMATION_RAINFALL_Y_START_MIN, ANIMATION_RAINFALL_Y_START_MAX);
  558. -- elseif (animation == "shake") then
  559. -- fontString.deflection = ANIMATION_SHAKE_DEFLECTION;
  560. -- fontString.numShakes = ANIMATION_SHAKE_NUM_SHAKES;
  561. end
  562.  
  563. animating[fontString] = true;
  564.  
  565. -- start onupdate if it's not already running
  566. if (NameplateSCT.frame:GetScript("OnUpdate") == nil) then
  567. NameplateSCT.frame:SetScript("OnUpdate", AnimationOnUpdate);
  568. end
  569. end
  570.  
  571.  
  572. ------------
  573. -- EVENTS --
  574. ------------
  575. local guidDeletion = {};
  576. local function scheduleGUIDNameplatePositionWipe(guid)
  577. local deleteGUIDLocation = function()
  578. guidNameplatePositionX[guid] = nil;
  579. guidNameplatePositionY[guid] = nil;
  580. end
  581.  
  582. guidDeletion[guid] = C_Timer.NewTimer(1, deleteGUIDLocation);
  583. end
  584.  
  585. function NameplateSCT:NAME_PLATE_UNIT_ADDED(event, unitID)
  586. local guid = UnitGUID(unitID);
  587.  
  588. unitToGuid[unitID] = guid;
  589. guidToUnit[guid] = unitID;
  590.  
  591. if (guidDeletion[guid]) then
  592. guidDeletion[guid]:Cancel();
  593. end
  594.  
  595. guidNameplatePositionX[guid] = nil;
  596. guidNameplatePositionY[guid] = nil;
  597.  
  598. startSavingNameplatePositions();
  599. end
  600.  
  601. function NameplateSCT:NAME_PLATE_UNIT_REMOVED(event, unitID)
  602. local guid = unitToGuid[unitID];
  603.  
  604. unitToGuid[unitID] = nil;
  605. guidToUnit[guid] = nil;
  606.  
  607. scheduleGUIDNameplatePositionWipe(guid);
  608.  
  609. -- stop saving positions if there are no nameplates
  610. if (not next(guidToUnit)) then
  611. stopSavingNameplatePositions();
  612. end
  613. end
  614.  
  615. function NameplateSCT:CombatFilter(_, clue, _, sourceGUID, _, sourceFlags, _, destGUID, _, _, _, ...)
  616. if playerGUID == sourceGUID or (NameplateSCT.db.global.personal and playerGUID == destGUID) then -- Player events
  617. local destUnit = guidToUnit[destGUID];
  618. if (destUnit) or (destGUID == playerGUID and NameplateSCT.db.global.personal) then
  619. if (string.find(clue, "_DAMAGE")) then
  620. local spellID, spellName, spellSchool, amount, overkill, school, resisted, blocked, absorbed, critical, glancing, crushing, isOffHand;
  621. if (string.find(clue, "SWING")) then
  622. spellName, amount, overkill, school_ignore, resisted, blocked, absorbed, critical, glancing, crushing, isOffHand = "melee", ...;
  623. elseif (string.find(clue, "ENVIRONMENTAL")) then
  624. spellName, amount, overkill, school, resisted, blocked, absorbed, critical, glancing, crushing = ...;
  625. else
  626. spellID, spellName, spellSchool, amount, overkill, school, resisted, blocked, absorbed, critical, glancing, crushing, isOffHand = ...;
  627. end
  628. self:DamageEvent(destGUID, spellID, amount, school, critical, spellName);
  629. elseif(string.find(clue, "_MISSED")) then
  630. local spellID, spellName, spellSchool, missType, isOffHand, amountMissed;
  631.  
  632. if (string.find(clue, "SWING")) then
  633. if destGUID == playerGUID then
  634. missType, isOffHand, amountMissed = ...;
  635. else
  636. missType, isOffHand, amountMissed = "melee", ...;
  637. end
  638. else
  639. spellID, spellName, spellSchool, missType, isOffHand, amountMissed = ...;
  640. end
  641. self:MissEvent(destGUID, spellID, missType);
  642. end
  643. end
  644. elseif (bit.band(sourceFlags, COMBATLOG_OBJECT_TYPE_GUARDIAN) > 0 or bit.band(sourceFlags, COMBATLOG_OBJECT_TYPE_PET) > 0) and bit.band(sourceFlags, COMBATLOG_OBJECT_AFFILIATION_MINE) > 0 then -- Pet/Guardian events
  645. local destUnit = guidToUnit[destGUID];
  646. if (destUnit) or (destGUID == playerGUID and NameplateSCT.db.global.personal) then
  647. if (string.find(clue, "_DAMAGE")) then
  648. local spellID, spellName, spellSchool, amount, overkill, school, resisted, blocked, absorbed, critical, glancing, crushing, isOffHand;
  649. if (string.find(clue, "SWING")) then
  650. spellName, amount, overkill, school_ignore, resisted, blocked, absorbed, critical, glancing, crushing, isOffHand = "pet", ...;
  651. elseif (string.find(clue, "ENVIRONMENTAL")) then
  652. spellName, amount, overkill, school, resisted, blocked, absorbed, critical, glancing, crushing = ...;
  653. else
  654. spellID, spellName, spellSchool, amount, overkill, school, resisted, blocked, absorbed, critical, glancing, crushing, isOffHand = ...;
  655. end
  656. self:DamageEvent(destGUID, spellID, amount, "pet", critical, spellName);
  657. -- elseif(string.find(clue, "_MISSED")) then -- Don't show pet MISS events for now.
  658. -- local spellID, spellName, spellSchool, missType, isOffHand, amountMissed;
  659.  
  660. -- if (string.find(clue, "SWING")) then
  661. -- if destGUID == playerGUID then
  662. -- missType, isOffHand, amountMissed = ...;
  663. -- else
  664. -- missType, isOffHand, amountMissed = "pet", ...;
  665. -- end
  666. -- else
  667. -- spellID, spellName, spellSchool, missType, isOffHand, amountMissed = ...;
  668. -- end
  669. -- self:MissEvent(destGUID, spellID, missType);
  670. end
  671. end
  672. end
  673. end
  674.  
  675. function NameplateSCT:COMBAT_LOG_EVENT_UNFILTERED ()
  676. return NameplateSCT:CombatFilter(CombatLogGetCurrentEventInfo())
  677. end
  678.  
  679. -------------
  680. -- DISPLAY --
  681. -------------
  682. local function commaSeperate(number)
  683. -- https://stackoverflow.com/questions/10989788/lua-format-integer
  684. local _, _, minus, int, fraction = tostring(number):find('([-]?)(%d+)([.]?%d*)');
  685. int = int:reverse():gsub("(%d%d%d)", "%1,");
  686. return minus..int:reverse():gsub("^,", "")..fraction;
  687. end
  688.  
  689. local numDamageEvents = 0;
  690. local lastDamageEventTime;
  691. local runningAverageDamageEvents = 0;
  692. function NameplateSCT:DamageEvent(guid, spellID, amount, school, crit, spellName)
  693. local text, textWithoutIcons, animation, pow, size, icon, alpha;
  694. local frameLevel = FRAME_LEVEL_ABOVE;
  695.  
  696. local unit = guidToUnit[guid];
  697. local isTarget = unit and UnitIsUnit(unit, "target");
  698.  
  699. if (self.db.global.useOffTarget and not isTarget and playerGUID ~= guid) then
  700. size = self.db.global.offTargetFormatting.size;
  701. icon = self.db.global.offTargetFormatting.icon;
  702. alpha = self.db.global.offTargetFormatting.alpha;
  703. else
  704. size = self.db.global.formatting.size;
  705. icon = self.db.global.formatting.icon;
  706. alpha = self.db.global.formatting.alpha;
  707. end
  708.  
  709. -- select an animation
  710. if (crit) then
  711. frameLevel = FRAME_LEVEL_OVERLAY;
  712. animation = guid ~= playerGUID and self.db.global.animations.crit or self.db.global.animationsPersonal.crit;
  713. pow = true;
  714. else
  715. animation = guid ~= playerGUID and self.db.global.animations.normal or self.db.global.animationsPersonal.normal;
  716. pow = false;
  717. end
  718.  
  719. if (icon ~= "only") then
  720. -- truncate
  721. if (self.db.global.truncate and amount >= 100000000 and self.db.global.truncateLetter) then
  722. text = string.format("%.1f억", amount / 100000000);
  723. elseif (self.db.global.truncate and amount >= 100000) then
  724. text = string.format("%.0f", amount / 10000);
  725.  
  726. if (self.db.global.truncateLetter) then
  727. text = text.."만";
  728. end
  729. elseif (self.db.global.truncate and amount >= 10000) then
  730. text = string.format("%.1f", amount / 10000);
  731.  
  732. if (self.db.global.truncateLetter) then
  733. text = text.."만";
  734. end
  735. else
  736. if (self.db.global.commaSeperate) then
  737. text = commaSeperate(amount);
  738. else
  739. text = tostring(amount);
  740. end
  741. end
  742.  
  743. -- color text
  744. if self.db.global.damageColor and school and DAMAGE_TYPE_COLORS[school] then
  745. text = "|Cff"..DAMAGE_TYPE_COLORS[school]..text.."|r";
  746. elseif self.db.global.damageColor and spellName == "melee" and DAMAGE_TYPE_COLORS[spellName] then
  747. text = "|Cff"..DAMAGE_TYPE_COLORS[spellName]..text.."|r";
  748. else
  749. text = "|Cff"..self.db.global.defaultColor..text.."|r";
  750. end
  751.  
  752. -- add icons
  753. textWithoutIcons = text;
  754. if (icon ~= "none" and spellID) then
  755. local iconText = "|T"..GetSpellTexture(spellID)..":0|t";
  756.  
  757. if (icon == "both") then
  758. text = iconText..text..iconText;
  759. elseif (icon == "left") then
  760. text = iconText..text;
  761. elseif (icon == "right") then
  762. text = text..iconText;
  763. end
  764. end
  765. else
  766. -- showing only icons
  767. if (not spellID) then
  768. return;
  769. end
  770.  
  771. text = "|T"..GetSpellTexture(spellID)..":0|t";
  772. textWithoutIcons = text; -- since the icon is by itself, the fontString won't have the strange scaling bug
  773. end
  774.  
  775. -- shrink small hits
  776. if (self.db.global.sizing.smallHits) and playerGUID ~= guid then
  777. if (not lastDamageEventTime or (lastDamageEventTime + SMALL_HIT_EXPIRY_WINDOW < GetTime())) then
  778. numDamageEvents = 0;
  779. runningAverageDamageEvents = 0;
  780. end
  781.  
  782. runningAverageDamageEvents = ((runningAverageDamageEvents*numDamageEvents) + amount)/(numDamageEvents + 1);
  783. numDamageEvents = numDamageEvents + 1;
  784. lastDamageEventTime = GetTime();
  785.  
  786. if ((not crit and amount < SMALL_HIT_MULTIPIER*runningAverageDamageEvents)
  787. or (crit and amount/2 < SMALL_HIT_MULTIPIER*runningAverageDamageEvents)) then
  788. size = size * self.db.global.sizing.smallHitsScale;
  789. end
  790. end
  791.  
  792. -- embiggen crit's size
  793. if (self.db.global.sizing.crits and crit) and playerGUID ~= guid then
  794. size = size * self.db.global.sizing.critsScale;
  795. end
  796.  
  797. -- make sure that size is larger than 5
  798. if (size < 5) then
  799. size = 5;
  800. end
  801.  
  802. self:DisplayText(guid, text, textWithoutIcons, size, animation, frameLevel, pow);
  803. end
  804.  
  805. function NameplateSCT:MissEvent(guid, spellID, missType)
  806. local text, animation, pow, size, icon, alpha;
  807. local unit = guidToUnit[guid];
  808. local isTarget = unit and UnitIsUnit(unit, "target");
  809.  
  810. if (self.db.global.useOffTarget and not isTarget and playerGUID ~= guid) then
  811. size = self.db.global.offTargetFormatting.size;
  812. icon = self.db.global.offTargetFormatting.icon;
  813. alpha = self.db.global.offTargetFormatting.alpha;
  814. else
  815. size = self.db.global.formatting.size;
  816. icon = self.db.global.formatting.icon;
  817. alpha = self.db.global.formatting.alpha;
  818. end
  819.  
  820. -- embiggen miss size
  821. if self.db.global.sizing.miss and playerGUID ~= guid then
  822. size = size * self.db.global.sizing.missScale;
  823. end
  824.  
  825. if (icon == "only") then
  826. return;
  827. end
  828.  
  829. animation = playerGUID ~= guid and self.db.global.animations.miss or self.db.global.animationsPersonal.miss;
  830. pow = true;
  831.  
  832. text = MISS_EVENT_STRINGS[missType] or "Missed";
  833. text = "|Cff"..self.db.global.defaultColor..text.."|r";
  834.  
  835. -- add icons
  836. local textWithoutIcons = text;
  837. if (icon ~= "none" and spellID) then
  838. local iconText = "|T"..GetSpellTexture(spellID)..":0|t";
  839.  
  840. if (icon == "both") then
  841. text = iconText..text..iconText;
  842. elseif (icon == "left") then
  843. text = iconText..text;
  844. elseif (icon == "right") then
  845. text = text..iconText;
  846. end
  847. end
  848.  
  849. self:DisplayText(guid, text, textWithoutIcons, size, animation, FRAME_LEVEL_ABOVE, pow)
  850. end
  851.  
  852. function NameplateSCT:DisplayText(guid, text, textWithoutIcons, size, animation, frameLevel, pow)
  853. local fontString;
  854. local unit = guidToUnit[guid];
  855. local nameplate;
  856.  
  857. if (unit) then
  858. nameplate = C_NamePlate.GetNamePlateForUnit(unit);
  859. end
  860.  
  861. -- if there isn't an anchor frame, make sure that there is a guidNameplatePosition cache entry
  862. if playerGUID == guid and not unit then
  863. nameplate = player
  864. elseif (not nameplate and not (guidNameplatePositionX[guid] and guidNameplatePositionY[guid])) then
  865. return;
  866. end
  867.  
  868. fontString = getFontString();
  869.  
  870. fontString.NSCTText = text;
  871. fontString.NSCTTextWithoutIcons = textWithoutIcons;
  872. fontString:SetText(fontString.NSCTText);
  873.  
  874. fontString.NSCTFontSize = size;
  875. fontString:SetFont(getFontPath(NameplateSCT.db.global.font), fontString.NSCTFontSize, NameplateSCT.db.global.fontFlag);
  876. if NameplateSCT.db.global.textShadow then fontString:SetShadowOffset(1,-1) end
  877. fontString.startHeight = fontString:GetStringHeight();
  878. fontString.pow = pow;
  879. fontString.frameLevel = frameLevel;
  880.  
  881. if (fontString.startHeight <= 0) then
  882. fontString.startHeight = 5;
  883. end
  884.  
  885. fontString.unit = unit;
  886. fontString.guid = guid;
  887.  
  888. -- if there is no nameplate,
  889. self:Animate(fontString, nameplate, ANIMATION_LENGTH, animation);
  890. end
  891.  
  892.  
  893. -------------
  894. -- OPTIONS --
  895. -------------
  896. local function rgbToHex(r, g, b)
  897. return string.format("%02x%02x%02x", math.floor(255 * r), math.floor(255 * g), math.floor(255 * b));
  898. end
  899.  
  900. local function hexToRGB(hex)
  901. return tonumber(hex:sub(1,2), 16)/255, tonumber(hex:sub(3,4), 16)/255, tonumber(hex:sub(5,6), 16)/255, 1;
  902. end
  903.  
  904. local iconValues = {
  905. ["none"] = "No Icons",
  906. ["left"] = "Left Side",
  907. ["right"] = "Right Side",
  908. ["both"] = "Both Sides",
  909. ["only"] = "Icons Only (No Text)",
  910. };
  911.  
  912. local animationValues = {
  913. -- ["shake"] = "Shake",
  914. ["verticalUp"] = "Vertical Up",
  915. ["verticalDown"] = "Vertical Down",
  916. ["fountain"] = "Fountain",
  917. ["rainfall"] = "Rainfall",
  918. };
  919.  
  920. local fontFlags = {
  921. [""] = "None",
  922. ["OUTLINE"] = "Outline",
  923. ["THICKOUTLINE"] = "Thick Outline",
  924. ["nil, MONOCHROME"] = "Monochrome",
  925. ["OUTLINE , MONOCHROME"] = "Monochrome Outline",
  926. ["THICKOUTLINE , MONOCHROME"] = "Monochrome Thick Outline",
  927. };
  928.  
  929. local menu = {
  930. name = "NameplateSCT",
  931. handler = NameplateSCT,
  932. type = 'group',
  933. args = {
  934. enable = {
  935. type = 'toggle',
  936. name = "Enable",
  937. desc = "If the addon is enabled.",
  938. get = "IsEnabled",
  939. set = function(_, newValue) if (not newValue) then NameplateSCT:Disable(); else NameplateSCT:Enable(); end end,
  940. order = 1,
  941. width = "half",
  942. },
  943.  
  944. disableBlizzardFCT = {
  945. type = 'toggle',
  946. name = "Disable Blizzard FCT",
  947. desc = "",
  948. get = function(_, newValue) return GetCVar("floatingCombatTextCombatDamage") == "0" end,
  949. set = function(_, newValue)
  950. if (newValue) then
  951. SetCVar("floatingCombatTextCombatDamage", "0");
  952. else
  953. SetCVar("floatingCombatTextCombatDamage", "1");
  954. end
  955. end,
  956. order = 2,
  957. },
  958.  
  959. personalNameplate = {
  960. type = 'toggle',
  961. name = "Personal SCT",
  962. desc = "Also show numbers when you take damage on your personal nameplate or center screen",
  963. get = function() return NameplateSCT.db.global.personal; end,
  964. set = function(_, newValue) NameplateSCT.db.global.personal = newValue; end,
  965. order = 3,
  966. },
  967.  
  968. animations = {
  969. type = 'group',
  970. name = "Animations",
  971. order = 30,
  972. inline = true,
  973. disabled = function() return not NameplateSCT.db.global.enabled; end;
  974. args = {
  975. normal = {
  976. type = 'select',
  977. name = "Default",
  978. desc = "",
  979. get = function() return NameplateSCT.db.global.animations.normal; end,
  980. set = function(_, newValue) NameplateSCT.db.global.animations.normal = newValue; end,
  981. values = animationValues,
  982. order = 1,
  983. },
  984. crit = {
  985. type = 'select',
  986. name = "Criticals",
  987. desc = "",
  988. get = function() return NameplateSCT.db.global.animations.crit; end,
  989. set = function(_, newValue) NameplateSCT.db.global.animations.crit = newValue; end,
  990. values = animationValues,
  991. order = 2,
  992. },
  993. miss = {
  994. type = 'select',
  995. name = "Miss/Parry/Dodge/etc",
  996. desc = "",
  997. get = function() return NameplateSCT.db.global.animations.miss; end,
  998. set = function(_, newValue) NameplateSCT.db.global.animations.miss = newValue; end,
  999. values = animationValues,
  1000. order = 3,
  1001. },
  1002. },
  1003. },
  1004.  
  1005. animationsPersonal = {
  1006. type = 'group',
  1007. name = "Personal SCT Animations",
  1008. order = 40,
  1009. inline = true,
  1010. hidden = function() return not NameplateSCT.db.global.personal; end,
  1011. disabled = function() return not NameplateSCT.db.global.enabled; end;
  1012. args = {
  1013. normal = {
  1014. type = 'select',
  1015. name = "Default",
  1016. desc = "",
  1017. get = function() return NameplateSCT.db.global.animationsPersonal.normal; end,
  1018. set = function(_, newValue) NameplateSCT.db.global.animationsPersonal.normal = newValue; end,
  1019. values = animationValues,
  1020. order = 1,
  1021. },
  1022. crit = {
  1023. type = 'select',
  1024. name = "Criticals",
  1025. desc = "",
  1026. get = function() return NameplateSCT.db.global.animationsPersonal.crit; end,
  1027. set = function(_, newValue) NameplateSCT.db.global.animationsPersonal.crit = newValue; end,
  1028. values = animationValues,
  1029. order = 2,
  1030. },
  1031. miss = {
  1032. type = 'select',
  1033. name = "Miss/Parry/Dodge/etc",
  1034. desc = "",
  1035. get = function() return NameplateSCT.db.global.animationsPersonal.miss; end,
  1036. set = function(_, newValue) NameplateSCT.db.global.animationsPersonal.miss = newValue; end,
  1037. values = animationValues,
  1038. order = 3,
  1039. },
  1040. },
  1041. },
  1042.  
  1043. appearance = {
  1044. type = 'group',
  1045. name = "Appearance/Offsets",
  1046. order = 50,
  1047. inline = true,
  1048. disabled = function() return not NameplateSCT.db.global.enabled; end;
  1049. args = {
  1050. font = {
  1051. type = "select",
  1052. dialogControl = "LSM30_Font",
  1053. name = "Font",
  1054. order = 1,
  1055. values = AceGUIWidgetLSMlists.font,
  1056. get = function() return NameplateSCT.db.global.font; end,
  1057. set = function(_, newValue) NameplateSCT.db.global.font = newValue; end,
  1058. },
  1059. fontFlag = {
  1060. type = 'select',
  1061. name = "Font Flags",
  1062. desc = "",
  1063. get = function() return NameplateSCT.db.global.fontFlag; end,
  1064. set = function(_, newValue) NameplateSCT.db.global.fontFlag = newValue; end,
  1065. values = fontFlags,
  1066. order = 2,
  1067. },
  1068. fontShadow = {
  1069. type = 'toggle',
  1070. name = "Text Shadow",
  1071. get = function() return NameplateSCT.db.global.textShadow; end,
  1072. set = function(_, newValue) NameplateSCT.db.global.textShadow = newValue end,
  1073. order = 3,
  1074. },
  1075.  
  1076. damageColor = {
  1077. type = 'toggle',
  1078. name = "Use Damage Type Color",
  1079. desc = "",
  1080. get = function() return NameplateSCT.db.global.damageColor; end,
  1081. set = function(_, newValue) NameplateSCT.db.global.damageColor = newValue; end,
  1082. order = 4,
  1083. },
  1084.  
  1085. defaultColor = {
  1086. type = 'color',
  1087. name = "Default Color",
  1088. desc = "",
  1089. hasAlpha = false,
  1090. set = function(_, r, g, b) NameplateSCT.db.global.defaultColor = rgbToHex(r, g, b); end,
  1091. get = function() return hexToRGB(NameplateSCT.db.global.defaultColor); end,
  1092. order = 5,
  1093. },
  1094.  
  1095. xOffset = {
  1096. type = 'range',
  1097. name = "X Offset",
  1098. desc = "Has soft max/min, you can type whatever you'd like into the editbox",
  1099. softMin = -75,
  1100. softMax = 75,
  1101. step = 1,
  1102. get = function() return NameplateSCT.db.global.xOffset; end,
  1103. set = function(_, newValue) NameplateSCT.db.global.xOffset = newValue; end,
  1104. order = 10,
  1105. width = "full",
  1106. },
  1107.  
  1108. yOffset = {
  1109. type = 'range',
  1110. name = "Y Offset",
  1111. desc = "Has soft max/min, you can type whatever you'd like into the editbox",
  1112. softMin = -75,
  1113. softMax = 75,
  1114. step = 1,
  1115. get = function() return NameplateSCT.db.global.yOffset; end,
  1116. set = function(_, newValue) NameplateSCT.db.global.yOffset = newValue; end,
  1117. order = 11,
  1118. width = "full",
  1119. },
  1120.  
  1121. xOffsetPersonal = {
  1122. type = 'range',
  1123. name = "X Offset Personal SCT",
  1124. hidden = function() return not NameplateSCT.db.global.personal; end,
  1125. desc = "Only used if Personal Nameplate is Disabled",
  1126. softMin = -400,
  1127. softMax = 400,
  1128. step = 1,
  1129. get = function() return NameplateSCT.db.global.xOffsetPersonal; end,
  1130. set = function(_, newValue) NameplateSCT.db.global.xOffsetPersonal = newValue; end,
  1131. order = 12,
  1132. width = "full",
  1133. },
  1134.  
  1135. yOffsetPersonal = {
  1136. type = 'range',
  1137. name = "Y Offset Personal SCT",
  1138. hidden = function() return not NameplateSCT.db.global.personal; end,
  1139. desc = "Only used if Personal Nameplate is Disabled",
  1140. softMin = -400,
  1141. softMax = 400,
  1142. step = 1,
  1143. get = function() return NameplateSCT.db.global.yOffsetPersonal; end,
  1144. set = function(_, newValue) NameplateSCT.db.global.yOffsetPersonal = newValue; end,
  1145. order = 12,
  1146. width = "full",
  1147. },
  1148. },
  1149. },
  1150.  
  1151. formatting = {
  1152. type = 'group',
  1153. name = "Text Formatting",
  1154. order = 90,
  1155. inline = true,
  1156. disabled = function() return not NameplateSCT.db.global.enabled; end;
  1157. args = {
  1158. truncate = {
  1159. type = 'toggle',
  1160. name = "Truncate Number",
  1161. desc = "",
  1162. get = function() return NameplateSCT.db.global.truncate; end,
  1163. set = function(_, newValue) NameplateSCT.db.global.truncate = newValue; end,
  1164. order = 1,
  1165. },
  1166. truncateLetter = {
  1167. type = 'toggle',
  1168. name = "Show Truncated Letter",
  1169. desc = "",
  1170. disabled = function() return not NameplateSCT.db.global.enabled or not NameplateSCT.db.global.truncate; end,
  1171. get = function() return NameplateSCT.db.global.truncateLetter; end,
  1172. set = function(_, newValue) NameplateSCT.db.global.truncateLetter = newValue; end,
  1173. order = 2,
  1174. },
  1175. commaSeperate = {
  1176. type = 'toggle',
  1177. name = "Comma Seperate",
  1178. desc = "100000 -> 100,000",
  1179. disabled = function() return not NameplateSCT.db.global.enabled or NameplateSCT.db.global.truncate; end,
  1180. get = function() return NameplateSCT.db.global.commaSeperate; end,
  1181. set = function(_, newValue) NameplateSCT.db.global.commaSeperate = newValue; end,
  1182. order = 3,
  1183. },
  1184.  
  1185. icon = {
  1186. type = 'select',
  1187. name = "Icon",
  1188. desc = "",
  1189. get = function() return NameplateSCT.db.global.formatting.icon; end,
  1190. set = function(_, newValue) NameplateSCT.db.global.formatting.icon = newValue; end,
  1191. values = iconValues,
  1192. order = 51,
  1193. },
  1194. size = {
  1195. type = 'range',
  1196. name = "Size",
  1197. desc = "",
  1198. min = 5,
  1199. max = 72,
  1200. step = 1,
  1201. get = function() return NameplateSCT.db.global.formatting.size; end,
  1202. set = function(_, newValue) NameplateSCT.db.global.formatting.size = newValue; end,
  1203. order = 52,
  1204. },
  1205. alpha = {
  1206. type = 'range',
  1207. name = "Start Alpha",
  1208. desc = "",
  1209. min = 0.1,
  1210. max = 1,
  1211. step = .01,
  1212. get = function() return NameplateSCT.db.global.formatting.alpha; end,
  1213. set = function(_, newValue) NameplateSCT.db.global.formatting.alpha = newValue; end,
  1214. order = 53,
  1215. },
  1216.  
  1217. useOffTarget = {
  1218. type = 'toggle',
  1219. name = "Use Seperate Off-Target Text Appearance",
  1220. desc = "",
  1221. get = function() return NameplateSCT.db.global.useOffTarget; end,
  1222. set = function(_, newValue) NameplateSCT.db.global.useOffTarget = newValue; end,
  1223. order = 100,
  1224. width = "full",
  1225. },
  1226. offTarget = {
  1227. type = 'group',
  1228. name = "Off-Target Text Appearance",
  1229. hidden = function() return not NameplateSCT.db.global.useOffTarget; end,
  1230. order = 101,
  1231. inline = true,
  1232. args = {
  1233. icon = {
  1234. type = 'select',
  1235. name = "Icon",
  1236. desc = "",
  1237. get = function() return NameplateSCT.db.global.offTargetFormatting.icon; end,
  1238. set = function(_, newValue) NameplateSCT.db.global.offTargetFormatting.icon = newValue; end,
  1239. values = iconValues,
  1240. order = 1,
  1241. },
  1242. size = {
  1243. type = 'range',
  1244. name = "Size",
  1245. desc = "",
  1246. min = 5,
  1247. max = 72,
  1248. step = 1,
  1249. get = function() return NameplateSCT.db.global.offTargetFormatting.size; end,
  1250. set = function(_, newValue) NameplateSCT.db.global.offTargetFormatting.size = newValue; end,
  1251. order = 2,
  1252. },
  1253. alpha = {
  1254. type = 'range',
  1255. name = "Start Alpha",
  1256. desc = "",
  1257. min = 0.1,
  1258. max = 1,
  1259. step = .01,
  1260. get = function() return NameplateSCT.db.global.offTargetFormatting.alpha; end,
  1261. set = function(_, newValue) NameplateSCT.db.global.offTargetFormatting.alpha = newValue; end,
  1262. order = 3,
  1263. },
  1264. },
  1265. },
  1266. },
  1267. },
  1268.  
  1269. sizing = {
  1270. type = 'group',
  1271. name = "Sizing Modifiers",
  1272. order = 100,
  1273. inline = true,
  1274. disabled = function() return not NameplateSCT.db.global.enabled; end;
  1275. args = {
  1276. crits = {
  1277. type = 'toggle',
  1278. name = "Embiggen Crits",
  1279. desc = "",
  1280. get = function() return NameplateSCT.db.global.sizing.crits; end,
  1281. set = function(_, newValue) NameplateSCT.db.global.sizing.crits = newValue; end,
  1282. order = 1,
  1283. },
  1284. critsScale = {
  1285. type = 'range',
  1286. name = "Embiggen Crits Scale",
  1287. desc = "",
  1288. disabled = function() return not NameplateSCT.db.global.enabled or not NameplateSCT.db.global.sizing.crits; end,
  1289. min = 1,
  1290. max = 3,
  1291. step = .01,
  1292. get = function() return NameplateSCT.db.global.sizing.critsScale; end,
  1293. set = function(_, newValue) NameplateSCT.db.global.sizing.critsScale = newValue; end,
  1294. order = 2,
  1295. width = "double",
  1296. },
  1297.  
  1298. miss = {
  1299. type = 'toggle',
  1300. name = "Embiggen Miss/Parry/Dodge/etc",
  1301. desc = "",
  1302. get = function() return NameplateSCT.db.global.sizing.miss; end,
  1303. set = function(_, newValue) NameplateSCT.db.global.sizing.miss = newValue; end,
  1304. order = 10,
  1305. },
  1306. missScale = {
  1307. type = 'range',
  1308. name = "Embiggen Miss/Parry/Dodge/etc Scale",
  1309. desc = "",
  1310. disabled = function() return not NameplateSCT.db.global.enabled or not NameplateSCT.db.global.sizing.miss; end,
  1311. min = 1,
  1312. max = 3,
  1313. step = .01,
  1314. get = function() return NameplateSCT.db.global.sizing.missScale; end,
  1315. set = function(_, newValue) NameplateSCT.db.global.sizing.missScale = newValue; end,
  1316. order = 11,
  1317. width = "double",
  1318. },
  1319.  
  1320. smallHits = {
  1321. type = 'toggle',
  1322. name = "Scale Down Small Hits",
  1323. desc = "",
  1324. get = function() return NameplateSCT.db.global.sizing.smallHits; end,
  1325. set = function(_, newValue) NameplateSCT.db.global.sizing.smallHits = newValue; end,
  1326. order = 20,
  1327. },
  1328. smallHitsScale = {
  1329. type = 'range',
  1330. name = "Small Hits Scale",
  1331. desc = "",
  1332. disabled = function() return not NameplateSCT.db.global.enabled or not NameplateSCT.db.global.sizing.smallHits; end,
  1333. min = 0.33,
  1334. max = 1,
  1335. step = .01,
  1336. get = function() return NameplateSCT.db.global.sizing.smallHitsScale; end,
  1337. set = function(_, newValue) NameplateSCT.db.global.sizing.smallHitsScale = newValue; end,
  1338. order = 21,
  1339. width = "double",
  1340. },
  1341. },
  1342. },
  1343. },
  1344. };
  1345.  
  1346. function NameplateSCT:OpenMenu()
  1347. -- just open to the frame, double call because blizz bug
  1348. InterfaceOptionsFrame_OpenToCategory(self.menu);
  1349. InterfaceOptionsFrame_OpenToCategory(self.menu);
  1350. end
  1351.  
  1352. function NameplateSCT:RegisterMenu()
  1353. LibStub("AceConfigRegistry-3.0"):RegisterOptionsTable("NameplateSCT", menu);
  1354. self.menu = LibStub("AceConfigDialog-3.0"):AddToBlizOptions("NameplateSCT", "NameplateSCT");
  1355. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement