This commit is contained in:
Andrew6810
2022-10-21 06:50:13 -07:00
parent 8571e98fb1
commit 39c0ed874e
466 changed files with 52263 additions and 2 deletions
+218
View File
@@ -0,0 +1,218 @@
v5.00 29/12/2020
- Initial release
----------------------------------------------------------------------------------------------------
v5.01 13/01/2021
- Added hateful strikes to Gruul/Curator
- Added Magtheridon Heroic
- Added Enrage timer on Maulgar
- Added Yell on Gruul Cave In
- Added Heroic version of Gruul's Cave In
- Fixed Heroic Prince
- Fixed Heroic Illhoof
- SpellTimers (player cooldowns) are now separate bars from boss timers
- Added vanilla mods from ABM
----------------------------------------------------------------------------------------------------
v5.02 06/03/2021
- Added Animal bosses in Karazhan
- Added warning for Magtheridon debris
- Added timer for Infernals on Magtheridon
- Added sunder armor stacks on Prince
- Improved heroic Magtheridon targeting search for fingers and hands casts.
- Fixed Moroes PWS cast trigger
- Fixed new Gruul timers
- Fixed timers running too long on Illhoof
- Fixed the timers on Maulgar
- Fixed the berserk timer on Kazzak
- Raidleaders/assist can now opt in to autmatically whisper the target of the Kazzak bomb
----------------------------------------------------------------------------------------------------
v5.03 09/04/2021
- Added Heroic Romulo and Julianne mechanic
- Added missing onyxia vanilla module
- Fixed error on Magtheridon's Infernals
- Fixed wrong spell name on Rokad (Animal boss)
- Fixed the first infernal timer of Prince
- Fixed an error on Heroic Aran
- Fixed a missing translation on Opera in Karazhan
- Fixed timer for Holy Wrath on Maiden
- Fixed the Black Morass portal timer
----------------------------------------------------------------------------------------------------
v5.04 05/05/2021
- Added support for phases for vanilla and T4 bosses in Details!
- Added support for Raid Ability Timeline (WeakAura2)
- Added support for /Pull as an alias for /dbm pull
- Added a backup CD timer for Maiden's Holy Wrath
- Fixed a bunch of bosses for Naxxramas
- Fixed a bunch of lua errors in vanilla raids
- Fixed Whirlwind timers for Maulgar
- Fixed Magtheridon back to working state
- Fixed missing start timers on Prince
- Fixed broken Sunder warning on Prince
- Fixed Into Shadow Realm timer for Heroic 25 man Prince
- Fixed heroic Romulo and Julianne mechanic
- Fixed Boulder and Cave in CD timers for Gruul
- Added different versions for heroic Hateful Strike/Hateful Bolt on Gruul/Curator
----------------------------------------------------------------------------------------------------
v5.05 23/05/2021
- Added special warning to purge Power word: Shield on Maulgar
- Added Repentance cast timer to Maiden
- Added Moroes enrage timer
- Added a phase 2 warning on Moroes
- Fixed whirlwind timers on Maulgar
- Fixed Fingers and Hands timer on Magtheridon to only show on Ascended
- Added a timer for Attumen curse
- Fixed Moroes Vanish timer
- Fixed Desperate prayer on heroic Flex
- Fixed Romulo and Julianne lua error
- Fixed timers for Howl and Red riding hood on Big Bad Wolf
- Fixed Julianne heal cast time per difficutly
- Fixed Hateful timer in phase 2 Curator
- Fixed Smoldering announce text
- Fixed Illhoof curse timer
- Fixed cast timer on Netherspite's Breath
- Fixed Aran Flame Wreath cast timer
- Fixed Phase 3 warning on Prince
- Fixed different timers on Prince per difficulty
- Fixed Infernal timers on Prince
- Fixed Sunder armor announce on Prince
----------------------------------------------------------------------------------------------------
v5.06 13/06/2021
- Added "/pull 0" and "/pull cancel" as commands to stop a pull timer.
(Requires everyone to update for everyone to see the timer cancelled)
- Added mechanics in the following Mythic Dungeons:
- Shattered Halls
- Underbog
- Steamvault
- Auchenai Crypts
- Mana Tombs
- Sethekk Halls
- Shadow Labs
- Fixed missing timers on Maiden
- Fixed the timer on Curator being off after the first Evocate
- Fixed Big Bad Wolf timers of Red Riding Hood mechanic
----------------------------------------------------------------------------------------------------
v5.07 05/08/2021
- Added all SSC bosses
- Fixed icon for Big Bad Wolf opera event's Red Riding Hood target in Karazhan
- Fixed Magtheridon's Hand and Fingers timers to only appear in Ascended
- Added warning for standing in Conflaguration on Magtheridon
- Fixed lua error in Shadow Labs
- Removed warning for Immolate on Garr (casts too often with no danger)
----------------------------------------------------------------------------------------------------
v5.07.14 17/08/2021
- Rework of Lady Vashj module, all timers fixed.
- Ascended mechanics added for Lady Vashj.
- Fixed Free for All not activating correctly on Lady Vashj.
- Added Toxic Sporebat timer for Phase 3.
- Fixed Tainted Core not being correctly tracked.
- Fixed Coilfang Enchantress spam.
- Fixed Static Charge targets not being shown on Lady Vashj.
- Added missing icons for Phase 2 timers on Lady Vashj.
- Added absent Special Warning for standing in Toxic Spore.
- Fixed Berserk timer being incorrect for Lady Vashj.
----------------------------------------------------------------------------------------------------
v5.08 20/08/2021
- Fixed timers for Ascended Fathomlord
- Fixed timers for Ascended Tidewalker
- Fixed Generator timer on Vashj in phase 3
- Added tentacle for Lurker
- Fixed Geyser timer stop on breath on Lurker
- Added new Hakkar mechanics
- Added new mechanics to several other ZG bosses
----------------------------------------------------------------------------------------------------
v5.08.1 25/09/2021
- Added new Mechancis to MC bosses:
- Lucifron
- Magmadar
- Gehennas
- Garr
- Baron
- Golemagg
----------------------------------------------------------------------------------------------------
v5.08.2 27/09/2021
- Added new Mechancis to MC bosses:
- Shazzrah
- Ragnaros
- Adding all difficulty IDs to Geddon
- Fixed the spam on Reverb on Garr
- Added timers to Golemagg's cave in
- Removed spammy abilities from Sulfuron
----------------------------------------------------------------------------------------------------
v5.09 20/10/2021
- Added new mechanics to Onyxia Ascended
- Added warning for Poison pool on Hakkar
- Fixed lua error on Tidewalker
- Fixed timer for Son of Hakkar on Hakkar
- Fixed lua error in Black Morass
----------------------------------------------------------------------------------------------------
v5.10 24/01/2022
- Added all Tempest Keep bosses
- Fixed lua error on Tidewalker
----------------------------------------------------------------------------------------------------
v5.11 17/02/2022
- Fixed combatstop on Al'ar
- Fixed repeat timer of Pound on Void Reaver
- Fixed Void Reaver fire warning to only show on self
- Fixed timer on Solarian's Lunar/Solar Wrath
- Fixed timer on Solarian's Void Spawn (New timer on killing Void Spawn)
----------------------------------------------------------------------------------------------------
v5.12 19/04/2022
- Fixed Dive Bomb timers on Al'ar
- Fixed Flame Cascade (fire tornado) timer on Al'ar
- Fixed Next Breath timer on Al'ar
- Fixed platform change timer on Al'ar
- Fixed Phasing issues on Al'ar
- Fixed error on Feather refresh on Al'ar
- Added Opt-In option to yell on receiving Living Bomb on Al'ar
- Removed unused code, combat log events and simplified codings on Void Reaver
- Fixed the wording of upcoming priest announcements on High Astromancer Solarian
- Fixed timers for Solar and Lunar Wrath yells on High Astromancer Solarian
- Changed the warning level of Solar and Lunar stacks from 3 to 5 on High Astromancer Solarian
- Added timer and warning for Void Seed on High Astromancer Solarian
- Added Opt-In option to yell on receiving Panic on High Astromancer Solarian
- Added Opt-In option to set icon on Ascended Orbital Blast target on High Astromancer Solarian
- Fixed the combat entry point on Kael'thas Sunstrider
- Fixed the timer delays in last phase for Ascended difficulty on Kael'thas Sunstrider
- Fixed first pull timer for Telonicus on Kael'thas Sunstrider
- Fixed timers for council resurrection on Kael'thas Sunstrider
- Fixed timer for Kael'thas Sunstrider activation on Kael'thas Sunstrider
- Fixed Thaladred the Darkener's Gaze and Bladestorm mechanic change timers and warnings on Ascended difficulties on Kael'thas Sunstrider
- Added warnings and timers for Focused Burst on Kael'thas Sunstrider
- Added warnings and timers for World in Flames on Kael'thas Sunstrider
- Added warnings and timers for Bladestorm on Kael'thas Sunstrider
- Added warnings and timers for Blood Leech on Kael'thas Sunstrider
- Added warnings and timers for Mana Shield on Kael'thas Sunstrider
- Added warnings and timers for Rebirth on Kael'thas Sunstrider
- Added warnings and timers for Flamestrike on Kael'thas Sunstrider
- Added warnings and timers for Form Dying Star on Kael'thas Sunstrider
- Added warnings and timers for Gravity Lapse on Kael'thas Sunstrider
- Added Opt-In option to set icon on Gaze of the Darkener target on Kael'thas Sunstrider
- Added Opt-In option to set icon on Focused Burst target on Kael'thas Sunstrider
- Added checks for ascended only mechanics to only show on Ascended difficulties in Tempest Keep
----------------------------------------------------------------------------------------------------
v5.13 dd/mm/yyyy
- Fixed the combat entry point for long and short intro on Kael'thas Sunstrider
- Fixed a LUA error on Solarian
- Fixed the "Lunar Fire (Unknown" bug on Solarion
- Fixed double Voidspawn timers going off on Solarion
- Fixed Lunar Wrath yell countdown timer on Solarion
- Added some of the mechanics for the mobs in Tempest Keep
----------------------------------------------------------------------------------------------------
v5.14 08/08/2022
- Added failsafe to avoid double triggers going into Phase 2
- Redid timers for Finger and Hand of Death
- Fixed Phase 3 timers
- Added timer for the Debris damage going into Phase 3
- Added a proper target function to always show who's the target of Finger and Hand of Death
----------------------------------------------------------------------------------------------------
v5.15 16/10/2022
- Added all Zul'Aman bosses and timers for Normal and Heroic
- Fixed pull cancel message to no longer have an extra "0" at the end
- Fixed and improved yellLivingBomb on Alar. This option is now turned on by default and will now count down from 3 before you drop it.
- Fixed warnFlameBreath on Alar not working for all difficulties
- Solarion now warns stack number at 4 instead of 5
----------------------------------------------------------------------------------------------------
+250
View File
@@ -0,0 +1,250 @@
-- This file uses models and textures taken from TomTom. The 3d arrow model was created by Guillotine (curse.guillotine@gmail.com) and 2d minimap textures by Cladhaire.
----------------------------
-- Initialize variables --
----------------------------
-- globals
DBM.Arrow = {}
-- locals
local runAwayArrow
local targetType
local targetPlayer
local targetX, targetY
local hideTime, hideDistance
-- cached variables
local pi, pi2 = math.pi, math.pi * 2
local floor = math.floor
local sin, cos, atan2, sqrt, min = math.sin, math.cos, math.atan2, math.sqrt, math.min
local GetPlayerMapPosition = GetPlayerMapPosition
--------------------
-- Create Frame --
--------------------
local frame = CreateFrame("Button", nil, UIParent)
frame:Hide()
frame:SetFrameStrata("HIGH")
frame:SetWidth(56)
frame:SetHeight(42)
frame:SetMovable(true)
frame:EnableMouse(false)
frame:RegisterForDrag("LeftButton", "RightButton")
frame:SetScript("OnDragStart", function(self)
self:StartMoving()
end)
frame:SetScript("OnDragStop", function(self)
self:StopMovingOrSizing()
local point, _, _, x, y = self:GetPoint(1)
DBM.Options.ArrowPoint = point
DBM.Options.ArrowPosX = x
DBM.Options.ArrowPosY = y
end)
local arrow = frame:CreateTexture(nil, "OVERLAY")
arrow:SetTexture("Interface\\AddOns\\DBM-Core\\textures\\arrows\\Arrow.blp")
arrow:SetAllPoints(frame)
---------------------
-- Map Utilities --
---------------------
local SetMapToCurrentZone -- throttled SetMapToCurrentZone function to prevent lag issues with unsupported WorldMap addons
do
local lastMapUpdate = 0
function SetMapToCurrentZone(...)
if GetTime() - lastMapUpdate > 1 then
lastMapUpdate = GetTime()
return _G.SetMapToCurrentZone(...)
end
end
end
local calculateDistance
do
local mapSizes = DBM.MapSizes
function calculateDistance(x1, y1, x2, y2)
local mapName = GetMapInfo()
local floors = mapSizes[mapName]
if not floors then
return
end
local dims = floors[GetCurrentMapDungeonLevel()]
if not dims and levels and GetCurrentMapDungeonLevel() == 0 then -- we are in a known zone but the dungeon level seems to be wrong
SetMapToCurrentZone() -- fixes the dungeon level (if it was wrong for some reason)
dims = levels[GetCurrentMapDungeonLevel()] -- try again
end
if not dims then -- we are in an unknown dungeon :(
return
end
local dX = (x1 - x2) * dims[1]
local dY = (y1 - y2) * dims[2]
return sqrt(dX * dX + dY * dY)
end
end
-- GetPlayerFacing seems to return values between -pi and pi instead of 0 - 2pi sometimes since 3.3.3
local GetPlayerFacing = function(...)
local result = GetPlayerFacing(...)
if result < 0 then
result = result + pi2
end
return result
end
------------------------
-- Update the arrow --
------------------------
local updateArrow
do
local currentCell
function updateArrow(direction, distance)
local cell = floor(direction / pi2 * 108 + 0.5) % 108
if cell ~= currentCell then
currentCell = cell
local column = cell % 9
local row = floor(cell / 9)
local xStart = (column * 56) / 512
local yStart = (row * 42) / 512
local xEnd = ((column + 1) * 56) / 512
local yEnd = ((row + 1) * 42) / 512
arrow:SetTexCoord(xStart, xEnd, yStart, yEnd)
end
if distance then
if runAwayArrow then
local perc = distance / hideDistance
arrow:SetVertexColor(1 - perc, perc, 0)
if distance >= hideDistance then
frame:Hide()
end
else
local perc = min(distance, 100) / 100
arrow:SetVertexColor(1, 1 - perc, 0)
if distance <= hideDistance then
frame:Hide()
end
end
else
if runAwayArrow then
arrow:SetVertexColor(1, 0.3, 0)
else
arrow:SetVertexColor(1, 1, 0)
end
end
end
end
------------------------
-- OnUpdate Handler --
------------------------
do
local rotateState = 0
-- local skipFrame -- todo: skipping frames makes the arrow laggy, maybe skip frames if frame rate >= 45
frame:SetScript("OnUpdate", function(self, elapsed)
if WorldMapFrame:IsShown() then -- it doesn't work while the world map frame is shown
arrow:Hide()
return
end
-- skipFrame = not skipFrame
-- if skipFrame then
-- return
-- end
if hideTime and GetTime() > hideTime then
frame:Hide()
end
arrow:Show()
local x, y = GetPlayerMapPosition("player")
if x == 0 and y == 0 then
SetMapToCurrentZone()
x, y = GetPlayerMapPosition("player")
if x == 0 and y == 0 then
self:Hide() -- hide the arrow if you enter a zone without a map
return
end
end
if targetType == "player" then
targetX, targetY = GetPlayerMapPosition(targetPlayer)
if targetX == 0 and targetY == 0 then
self:Hide() -- hide the player if the target doesn't exist. TODO: just hide the texture and add a timeout
end
elseif targetType == "rotate" then
rotateState = rotateState + elapsed
targetX = x + cos(rotateState)
targetY = y + sin(rotateState)
end
if not targetX or not targetY then
return
end
local angle = atan2(x - targetX, targetY - y)
if angle <= 0 then -- -pi < angle < pi but we need/want a value between 0 and 2 pi
if runAwayArrow then
angle = -angle -- 0 < angle < pi
else
angle = pi - angle -- pi < angle < 2pi
end
else
if runAwayArrow then
angle = pi2 - angle -- pi < angle < 2pi
else
angle = pi - angle -- 0 < angle < pi
end
end
updateArrow(angle - GetPlayerFacing(), calculateDistance(x, y, targetX, targetY))
end)
end
----------------------
-- Public Methods --
----------------------
local function show(runAway, x, y, distance, time)
local player
if type(x) == "string" then
player, hideDistance, hideTime = x, y, hideDistance
end
frame:Show()
runAwayArrow = runAway
hideDistance = distance or runAway and 100 or 3
if time then
hideTime = time + GetTime()
else
hideTime = nil
end
if player then
targetType = "player"
targetPlayer = player
else
targetType = "fixed"
targetX, targetY = x, y
end
end
function DBM.Arrow:ShowRunTo(...)
return show(false, ...)
end
function DBM.Arrow:ShowRunAway(...)
return show(true, ...)
end
function DBM.Arrow:Hide(autoHide)
frame:Hide()
end
local function endMove()
frame:EnableMouse(false)
DBM.Arrow:Hide()
end
function DBM.Arrow:Move()
targetType = "rotate"
runAwayArrow = false
hideDistance = 5
frame:EnableMouse(true)
frame:Show()
DBM.Bars:CreateBar(25, DBM_ARROW_MOVABLE, "Interface\\Icons\\Spell_Holy_BorrowedTime")
DBM:Unschedule(endMove)
DBM:Schedule(25, endMove)
end
function DBM.Arrow:LoadPosition()
frame:SetPoint(DBM.Options.ArrowPoint, DBM.Options.ArrowPosX, DBM.Options.ArrowPosY)
end
+284
View File
@@ -0,0 +1,284 @@
---------------
-- Globals --
---------------
DBM.BossHealth = {}
-------------
-- Locals --
-------------
local bossHealth = DBM.BossHealth
local bars = {}
local barCache = {}
local updateFrame
local getBarId
local updateBar
local anchor
local header
local dropdownFrame
--local sortingEnabled
do
local id = 0
function getBarId()
id = id + 1
return id
end
end
------------
-- Menu --
------------
local menu
menu = {
{
text = DBM_CORE_RANGECHECK_LOCK,
checked = false, -- requires DBM.Options which is not available yet
func = function()
menu[1].checked = not menu[1].checked
DBM.Options.HealthFrameLocked = menu[1].checked
end
},
{
text = DBM_CORE_BOSSHEALTH_HIDE_FRAME,
notCheckable = true,
func = function() bossHealth:Hide() end
}
}
-----------------------
-- Script Handlers --
-----------------------
local function onMouseDown(self, button)
if button == "LeftButton" and not DBM.Options.HealthFrameLocked then
anchor.moving = true
anchor:StartMoving()
end
end
local function onMouseUp(self, button)
anchor.moving = nil
anchor:StopMovingOrSizing()
local point, _, _, x, y = anchor:GetPoint(1)
DBM.Options.HPFramePoint = point
DBM.Options.HPFrameX = x
DBM.Options.HPFrameY = y
if button == "RightButton" then
EasyMenu(menu, dropdownFrame, "cursor", nil, nil, "MENU")
end
end
local onHide = onMouseUp
-----------------
-- Apply Style --
-----------------
local function updateBarStyle(bar, id)
bar:ClearAllPoints()
if DBM.Options.HealthFrameGrowUp then
bar:SetPoint("BOTTOM", bars[id - 1] or anchor, "TOP", 0, 0)
else
bar:SetPoint("TOP", bars[id - 1] or anchor, "BOTTOM", 0, 0)
end
local barborder = _G[bar:GetName().."BarBorder"]
local barbar = _G[bar:GetName().."Bar"]
local width = DBM.Options.HealthFrameWidth
if width < 175 then -- these health frames really suck :(
barbar:ClearAllPoints()
barbar:SetPoint("CENTER", barbar:GetParent(), "CENTER", -6, 0)
bar:SetWidth(DBM.Options.HealthFrameWidth)
barborder:SetWidth(DBM.Options.HealthFrameWidth * 0.99)
barbar:SetWidth(DBM.Options.HealthFrameWidth * 0.95)
elseif width >= 225 then
barbar:ClearAllPoints()
barbar:SetPoint("CENTER", barbar:GetParent(), "CENTER", 5, 0)
bar:SetWidth(DBM.Options.HealthFrameWidth)
barborder:SetWidth(DBM.Options.HealthFrameWidth * 0.995)
barbar:SetWidth(DBM.Options.HealthFrameWidth * 0.965)
else
bar:SetWidth(DBM.Options.HealthFrameWidth)
barborder:SetWidth(DBM.Options.HealthFrameWidth * 0.99)
barbar:SetWidth(DBM.Options.HealthFrameWidth * 0.95)
end
end
-----------------------
-- Create the Frame --
-----------------------
local function createFrame(self)
anchor = CreateFrame("Frame", nil, UIParent)
anchor:SetWidth(60)
anchor:SetHeight(10)
anchor:SetMovable(1)
anchor:EnableMouse(1)
anchor:SetPoint(DBM.Options.HPFramePoint, UIParent, DBM.Options.HPFramePoint, DBM.Options.HPFrameX, DBM.Options.HPFrameY)
header = anchor:CreateFontString(nil, "ARTWORK", "GameFontNormalSmall")
header:SetPoint("BOTTOM", anchor, "BOTTOM")
anchor:SetScript("OnUpdate", updateFrame)
anchor:SetScript("OnMouseDown", onMouseDown)
anchor:SetScript("OnMouseUp", onMouseUp)
anchor:SetScript("OnHide", onHide)
dropdownFrame = CreateFrame("Frame", "DBMBossHealthDropdown", anchor, "UIDropDownMenuTemplate")
menu[1].checked = DBM.Options.HealthFrameLocked
end
local function createBar(self, cId, name)
local bar = table.remove(barCache, #barCache) or CreateFrame("Frame", "DBM_BossHealth_Bar_"..getBarId(), anchor, "DBMBossHealthBarTemplate")
bar:Show()
local bartext = _G[bar:GetName().."BarName"]
local barborder = _G[bar:GetName().."BarBorder"]
local barbar = _G[bar:GetName().."Bar"]
barborder:SetScript("OnMouseDown", onMouseDown)
barborder:SetScript("OnMouseUp", onMouseUp)
barborder:SetScript("OnHide", onHide)
bar.id = cId
bar.hidden = false
bar:ClearAllPoints()
bartext:SetText(name)
updateBar(bar, 100)
return bar
end
------------------
-- Bar Update --
------------------
function updateBar(bar, percent, dontShowDead)
local bartimer = _G[bar:GetName().."BarTimer"]
local barbar = _G[bar:GetName().."Bar"]
bartimer:SetText((percent > 0 or dontShowDead) and math.floor(percent).."%" or DBM_CORE_DEAD)
barbar:SetValue(percent)
barbar:SetStatusBarColor((100 - percent) / 100, percent/100, 0)
bar.value = percent
local bossAlive = false
for i = 1, #bars do
if bars[i].value > 0 then
bossAlive = true
break
end
end
if not bossAlive and #bars > 0 then
bossHealth:Hide()
end
end
do
local t = 0
local targetCache = {}
local function getCIDfromGUID(guid)
if not guid then
return -1
end
local cType = bit.band(guid:sub(0, 5), 0x00F)
return (cType == 3 or cType == 5) and tonumber(guid:sub(9, 12), 16) or -1
end
-- local function compareBars(b1, b2)
-- return b1.value > b2.value
-- end
function updateFrame(self, e)
t = t + e
if t >= 0.5 then
t = 0
-- if #bars > DBM.Options.HPFrameMaxEntries then
-- sortingEnabled = true
-- end
-- if sortingEnabled then
-- table.sort(bars, compareBars)
-- end
for i, v in ipairs(bars) do
-- if i > DBM.Options.HPFrameMaxEntries then
-- v:Hide()
-- else
-- v:Show()
-- end
if type(v.id) == "number" then
local id = targetCache[v.id] -- ask the cache if we already know where the mob is
if getCIDfromGUID(UnitGUID(id or "")) ~= v.id then -- the cache doesn't know it, update the cache
targetCache[v.id] = nil
-- check focus target
if getCIDfromGUID(UnitGUID("focus")) == v.id then
targetCache[v.id] = "focus"
else
-- check target and raid/party targets
local uId = ((GetNumRaidMembers() == 0) and "party") or "raid"
for i = 0, math.max(GetNumRaidMembers(), GetNumPartyMembers()) do
id = (i == 0 and "target") or uId..i.."target"
if getCIDfromGUID(UnitGUID(id or "")) == v.id then
targetCache[v.id] = id
break
end
end
end
end
if getCIDfromGUID(UnitGUID(id or "")) == v.id then -- did we find the mob? if yes: update the health bar
updateBar(v, ((UnitHealth(id)) / (UnitHealthMax(id)) * 100 or 100))
end
elseif type(v.id) == "function" then -- generic bars
updateBar(v, v.id(), true)
end
end
end
end
end
-----------------------
-- General Methods --
-----------------------
function bossHealth:Show(name)
if not anchor then createFrame(bossHealth) end
header:SetText(name)
anchor:Show()
bossHealth:Clear()
end
function bossHealth:Clear()
if not anchor or not anchor:IsShown() then return end
for i = #bars, 1, -1 do
local bar = bars[i]
bar:Hide()
bar:ClearAllPoints()
barCache[#barCache + 1] = bar
bars[i] = nil
end
-- sortingEnabled = false
end
function bossHealth:Hide()
if anchor then anchor:Hide() end
end
function bossHealth:AddBoss(cId, name)
if not anchor or not anchor:IsShown() then return end
table.insert(bars, createBar(self, cId, name))
updateBarStyle(bars[#bars], #bars)
end
function bossHealth:RemoveBoss(cId)
if not anchor or not anchor:IsShown() then return end
for i = #bars, 1, -1 do
local bar = bars[i]
if bar.id == cId then
if bars[i + 1] then
local next = bars[i + 1]
next:SetPoint("TOP", bars[i - 1] or anchor, "BOTTOM", 0, 0)
end
bar:Hide()
bar:ClearAllPoints()
barCache[#barCache + 1] = bar
table.remove(bars, i)
end
end
end
function bossHealth:UpdateSettings()
if not anchor then createFrame(bossHealth) end
anchor:SetPoint(DBM.Options.HPFramePoint, UIParent, DBM.Options.HPFramePoint, DBM.Options.HPFrameX, DBM.Options.HPFrameY)
for i, v in ipairs(bars) do
updateBarStyle(v, i)
end
end
+71
View File
@@ -0,0 +1,71 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Frame name="DBMBossHealthBarTemplate" enableMouse="true" virtual="true" frameStrata="MEDIUM" topLevel="true">
<Size>
<AbsDimension x="200" y="20"/>
</Size>
<Frames>
<StatusBar name="$parentBar">
<Size>
<AbsDimension x="190" y="12"/>
</Size>
<Anchors>
<Anchor point="CENTER" relativePoint="CENTER">
<Offset>
<AbsDimension x="2" y="0"/>
</Offset>
</Anchor>
</Anchors>
<Layers>
<Layer level="BACKGROUND">
<Texture name="$parentBackground">
<Color r="0" g="0" b="0" a="0.3"/>
</Texture>
</Layer>
<Layer level="OVERLAY">
<FontString name="$parentName" inherits="GameFontHighlightSmall" text="">
<Anchors>
<Anchor point="LEFT" relativePoint="LEFT">
<Offset>
<AbsDimension x="2" y="1"/>
</Offset>
</Anchor>
</Anchors>
</FontString>
<FontString name="$parentTimer" inherits="GameFontHighlightSmall" text="">
<Anchors>
<Anchor point="RIGHT" relativePoint="RIGHT">
<Offset>
<AbsDimension x="-2" y="1"/>
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Frames>
<Button name="$parentBorder">
<Size>
<AbsDimension x="198" y="32"/>
</Size>
<Anchors>
<Anchor point="LEFT">
<Offset>
<AbsDimension x="-4" y="0"/>
</Offset>
</Anchor>
</Anchors>
<NormalTexture name="$parentTextureNormal" file="Interface\PaperDollInfoFrame\UI-Character-Skills-BarBorder"/>
</Button>
</Frames>
<BarTexture name="$parentTextureBar" file="Interface\PaperDollInfoFrame\UI-Character-Skills-Bar"/>
<BarColor r="1.0" g="0.7" b="0.0"/>
<Scripts>
<OnLoad>
self:SetMinMaxValues(0, 100)
</OnLoad>
</Scripts>
</StatusBar>
</Frames>
</Frame>
</Ui>
File diff suppressed because it is too large Load Diff
+29
View File
@@ -0,0 +1,29 @@
## Interface: 30300
## Title:|cffffd200Deadly Boss Mods|r |cff69ccf0Core|r
## Title-zhCN: |cffffd200Deadly Boss Mods|r |cff69ccf0核心|r
## Title-ruRU:|cffffd200Deadly Boss Mods|r |cff69ccf0Основной|r
## Title-zhTW:|cffffd200Deadly Boss Mods|r |cff69ccf0核心|r
## Title-koKR:|cffffd200Deadly Boss Mods|r |cff69ccf0핵심 모듈|r
## Title-esES:|cffffd200Deadly Boss Mods|r |cff69ccf0Proceso|r
## Title-esMX:|cffffd200Deadly Boss Mods|r |cff69ccf0Proceso|r
## Notes: Deadly Boss Mods - heavily modified to suit Project Ascension raid fights.
## SavedVariablesPerCharacter: DBM_SavedOptions, DBT_SavedOptions
## LoadOnDemand: 0
## DefaultState: enabled
## Author: Tandanu and Nitram, updated by Junior and Szyler.
## X-Website: https://discord.gg/4ZHfgskSvM
localization.en.lua
localization.de.lua
localization.cn.lua
localization.ru.lua
localization.fr.lua
localization.tw.lua
localization.kr.lua
localization.es.lua
DBT-Template.xml
DBT.lua
DBM-Core.lua
DBM-Arrow.lua
DBM-RangeCheck.lua
DBM-BossHealth.lua
DBM-BossHealth.xml
+569
View File
@@ -0,0 +1,569 @@
--[[
********************************************************************
********************************************************************
Help Constants at top
Help functions:
DBM_GetGroupNr(name)
DBM_GetRaidId(name)
DBM_GetClass(name)
DBM_GetRank(name)
DBM_GetSmoothColor(percent)
DBM_GetTextClassColor(class)
DBM_GetColorText(r,g,b)
DBM_StringIcon(icon)
DBM_StringTexture(texture)
DBM_GetTextReactionColor(reaction)
DBM_GetRealBossName(boss)
DBM_GetMarkNameFromNumber(marknr)
DBM_round(tal)
DBM_UnitHealthPercent(unitid,CountOneHpAsZero = false)
DBM_UnitPowerPercent(unitid)
DBM_PlaySoundFile(file)
DBM_UnitClassification(uid)
DBM_BoostPlaySound(file,boost,duration);
DBM_CheckForBuff(buffname, unit)
DBM_CheckForDebuff(buffname, unit)
DBM_GetBuffText(buffindex, unit)
DBM_GetDeBuffText(buffindex, unit)
DBM_band(mask,...) bitands all args with mask and return true or false
DBM_bor(b1,...) bitors all args
DBM_linebreakStr(str,b,tryspace) tryspace if try to break the line at spaces isntead
DBM_SetTrue(varname)
DBM_SetFalse(varname)
DBM_SearchBags(itemname)
DBM_SplitItemToEmptySlots(bag,item,stacksize)
DBM_FormatMoney(money)
DBM_FlagsColor(flags)
DBM_CPUWarning()
DBM_NoneEnglish()
DBM_CreateExtraMenuFrames(nrFrames,nrButtons)
Sync functions:
DBM_GetPlayerMapPosition(uid)
********************************************************************
********************************************************************
]]--
DBM_c_w = "|cFFFFFFFF";
DBM_c_r = "|cFFFF0000";
DBM_c_g = "|cFF00FF00";
DBM_c_dg = "|cFF007F00";
DBM_c_b = "|cFF0000FF";
DBM_c_lb = "|cFF66AAFF";
DBM_c_t = "|cFF00FFFF";
DBM_c_y = "|cFFFFFF00";
DBM_c_purple = "|cFFFF00FF";
DBM_c_p = "|cFF8888CC";
DBM_c_v = "|cFF4444CC";
DBM_c_tt = "|cFFFED100";
DBM_c_bronze = "|cFFFF8800";
DBM_c_black = "|cFF000000";
DBM_c_grey = "|cFFB4B4B4";
DBM_c_pink = "|cFFFFA3B1";
DBM_c_ = "|r"; DBM_c = "|r";
DBM_ICONS = "Interface\\Icons\\";
DBM_FONT_TVCENMT = "Interface\\AddOns\\AscensionBuffFrames\\Fonts\\Tw_Cen_MT_Bold.ttf";
DBM_FONT_DBM = "Interface\\AddOns\\AscensionBuffFrames\\Fonts\\DBM.ttf";
DBM_TEXTURE_BANTOBAR = "Interface\\AddOns\\AscensionBuffFrames\\Textures\\BantoBar";
function DBM_GetGroupNr(name)
local i,n,g;
for i=1,GetNumRaidMembers() do
n,_,g = GetRaidRosterInfo(i);
if(n==name) then
return g;
end
end
return false;
end
function DBM_GetRaidId(name)
local i,n;
for i=1,GetNumRaidMembers() do
n = GetRaidRosterInfo(i);
if(string.lower(n)==string.lower(name)) then
return i;
end
end
return false;
end
function DBM_GetClass(name)
local i,n,c;
for i=1,GetNumRaidMembers() do
n,_,_,_,c = GetRaidRosterInfo(i);
if(n==name) then
return c;
end
end
return "";
end
function DBM_GetRank(name)
local i,n,c;
for i=1,GetNumRaidMembers() do
n,c = GetRaidRosterInfo(i);
if(n==name) then
return c;
end
end
return false;
end
function DBM_GetSmoothColor(percent)
local r, g, b;
if(percent > 0.5) then
r = (1.0 - percent) * 2;
g = 1.0;
else
r = 1.0;
g = percent * 2;
end
b = 0.0;
return r,g,b;
end
function DBM_GetTextClassColor(class)
local color = RAID_CLASS_COLORS[string.gsub(string.upper(class)," ","")];
if(color) then
local colorText = ("|cff%.2x%.2x%.2x"):format(color.r*255,color.g*255,color.b*255);
return colorText;
end
return "|cFFFFFFFF";
end
function DBM_GetColorText(r,g,b)
local colorText = ("|cff%.2x%.2x%.2x"):format(r*255,g*255,b*255);
return colorText;
end
function DBM_StringIcon(icon)
return DBM_StringTexture(DBM_ICONS..icon)
end
function DBM_StringTexture(texture)
return "|T"..texture..":0|t";
end
function DBM_GetTextReactionColor(reaction)
if(reaction<4) then
return DBM_c_r;
elseif(reaction==4) then
return DBM_c_y;
else
return DBM_c_g;
end
end
function DBM_GetRealBossName(boss)
local n;
if(DBM_BOSS_DATA[boss].realname) then
n = DBM_BOSS_DATA[boss].realname;
else
n = boss;
end
return n;
end
function DBM_GetMarkNameFromNumber(marknr)
if(marknr==1) then
return "star";
elseif(marknr==2) then
return "circle";
elseif(marknr==3) then
return "diamond";
elseif(marknr==4) then
return "triangle";
elseif(marknr==5) then
return "moon";
elseif(marknr==6) then
return "square";
elseif(marknr==7) then
return "cross";
elseif(marknr==8) then
return "skull";
end
end
function DBM_round(tal)
if (tal < 0) then
return math.ceil(tal-0.5)
else
return math.floor(tal+0.5)
end
end
function DBM_UnitHealthPercent(unit,CountOneHpAsZero)
if(UnitExists(unit)) then
local hp = UnitHealth(unit) / UnitHealthMax(unit) * 100;
if(CountOneHpAsZero and UnitHealth(unit)==1) then
return 0;
elseif(hp == 0) then
return 0;
elseif(hp < 1) then
return 1;
else
return math.floor(hp);
end
else
return 0;
end
end
function DBM_UnitPowerPercent(unitid)
if(UnitExists(unitid)) then
return math.floor(UnitPower(unitid) / UnitPowerMax(unitid) * 100);
else
return 0;
end
end
function DBM_PlaySoundFile(file)
if(DBM_GetS("SoundWarnings")) then
PlaySoundFile(file);
end
end
function DBM_UnitClassification(uid)
local c = UnitClassification(uid);
local name = UnitName(uid);
if(DBM_ZONE and (name == "Captain Qeez" or name == "Captain Tuubid" or name == "Captain Xurrem" or name == "Major Pakkon" or name =="Colonel Zerran" or name == "Major Yeggeth" or name == "Captain Drenn")) then
return "worldboss";
end
if(DBM_ZONE and c=="elite" and UnitLevel(uid)==-1) then
return "worldboss";
end
return c;
end
function DBM_BoostPlaySound(file,boost,duration)
local savemaster = GetCVar("Sound_MasterVolume");
DBM_debug("Boosting Master Volume to: "..savemaster + boost);
SetCVar("Sound_MasterVolume",savemaster + boost);
DBM_PlaySoundFile(file);
DBM_Delay(duration,function()
DBM_debug("Restoring Master to: "..savemaster);
SetCVar("Sound_MasterVolume",savemaster);
end);
end
function DBM_CheckForBuff(buffname, unit)
if (not unit) then unit = "player"; end if (not UnitExists(unit)) then return; end
local name = UnitBuff(unit,buffname);
if(name) then
return true;
end
return false;
end
function DBM_CheckForDebuff(buffname, unit)
if (not unit) then unit = "player"; end if (not UnitExists(unit)) then return; end
local name = UnitDebuff(unit,buffname);
if(name) then
return true;
end
return false;
end
function DBM_GetBuffText(buffindex, unit)
if (not unit) then unit = "player"; end if (not UnitExists(unit)) then return nil; end
AscensionBuffFrames_TTTextLeft2:SetText();
AscensionBuffFrames_TT:SetUnitBuff(unit, buffindex);
return AscensionBuffFrames_TTTextLeft2:GetText();
end
function DBM_GetDeBuffText(buffindex, unit)
if (not unit) then unit = "player"; end if (not UnitExists(unit)) then return nil; end
AscensionBuffFrames_TTTextLeft2:SetText();
AscensionBuffFrames_TT:SetUnitDeBuff(unit, buffindex);
return AscensionBuffFrames_TTTextLeft2:GetText();
end
function DBM_band(mask,...)
args = {...};
local i;
for i=1,#args do
if(bit.band(mask,args[i]) == 0) then
return false;
end
end
return true;
end
function DBM_bor(b1,...)
args = {...};
local i;
for i=1,#args do
b1 = bit.bor(b1,args[i]);
end
return b1;
end
function DBM_linebreakStr(str,b,tryspace)
local l = {};
local t;
while(string.len(str) > 0) do
if(tryspace) then
if(string.len(str) <= b) then
--if the full line fits, just take it all
l[#l+1] = str;
break;
end
t = string.find(string.reverse(string.sub(str,1,b+1))," ",1,true);
if(not t) then
--just break the line
l[#l+1] = string.sub(str,1,b);
str = string.sub(str,b+1);
else
--break the line and remove the space
l[#l+1] = string.sub(str,1,b-(t-1));
str = string.sub(str,b+2-(t-1));
end
else
l[#l+1] = string.sub(str,1,b);
str = string.sub(str,b+1);
end
end
return table.concat(l,"\n");
end
function DBM_SetTrue(varname)
_G[varname] = true;
end
function DBM_SetFalse(varname)
_G[varname] = false;
end
function DBM_SearchBags(itemname)
local bag,slot;
for bag=0,NUM_BAG_SLOTS do
for slot=1,GetContainerNumSlots(bag) do
if (GetContainerItemLink(bag,slot) and string.find(GetContainerItemLink(bag,slot), itemname)) then
return bag,slot;
end
end
end
return false,false;
end
function DBM_SplitItemToEmptySlots(bag,item,stacksize)
local valid = GetContainerItemLink(bag,item);
if(valid and stacksize > 0) then
local _,itemcount,locked = GetContainerItemInfo(bag,item);
--it not locked searchbags for free slots
if(not locked) then
local sbag,sslot;
for sbag=0,NUM_BAG_SLOTS do
for sslot=1,GetContainerNumSlots(sbag) do
if(GetContainerItemLink(sbag,sslot)==nil) then
--free slot found split stack into this slot
if(itemcount > stacksize) then
SplitContainerItem(bag,item,stacksize);
itemcount = itemcount - stacksize;
--find correct bag to click
for i=1, NUM_CONTAINER_FRAMES do
local bagframe = getglobal("ContainerFrame"..i);
if ( bagframe:IsShown() and bagframe:GetID() == sbag ) then
--bag found, now find slot
for j=1, GetContainerNumSlots(sbag) do
local slotframe = getglobal(bagframe:GetName().."Item"..j);
if(slotframe:GetID()==sslot) then
--found correct slot, click it
slotframe:Click();
DBM_Delay(0.6,DBM_SplitItemToEmptySlots,bag,item,stacksize);
return;
end
end
end
end
end
end
end
end
end
end
end
function DBM_FormatMoney(money)
local SILVER = "|cFFC0C0C0";
local COPPER = "|cFFCC9900";
local GOLD = "|cFFFFFF66";
local WHITE = "|cFFFFFFFF";
local c,s,g;
local retstr = "";
g = floor(money/10000);
s = mod(floor(money/100),100);
c = mod(money,100);
if(g>0) then
retstr = retstr..WHITE..g..GOLD.." Gold";
end
if(s>0) then
if ( retstr ~= "" ) then retstr = retstr .. " " end;
retstr = retstr..WHITE..s..SILVER.." Silver";
end
if(c>0) then
if ( retstr ~= "" ) then retstr = retstr .. " " end;
retstr = retstr..WHITE..c..COPPER.." Copper";
end
return retstr;
end
function DBM_FlagsColor(flags)
if(DBM_band(flags,COMBATLOG_OBJECT_REACTION_HOSTILE) ) then
return "|cFFFF0000";
elseif(DBM_band(flags,COMBATLOG_OBJECT_REACTION_NEUTRAL) ) then
return "|cFFFFFF00";
elseif(DBM_band(flags,COMBATLOG_OBJECT_REACTION_FRIENDLY) ) then
return "|cFF00FF00";
end
end
function DBM_StripNames(name)
name = string.gsub(name,"%'","");
name = string.gsub(name," ","_");
return name;
end
function DBM_NoneEnglish()
if(GetLocale() ~= "enUS") then
DBM_printc("AscensionBuffFramess text parsing is made for the english client only, so some features may not work for you.");
end
end
function DBM_CPUWarning()
if(GetCVar("scriptProfile")=="1") then
DBM_printc("|cFFFFFFFFWarning|cFF8888CC CPU Profileing is on, this may have a huge performance impact on gameplay");
DBM_printc("If this is unintentional you can disable it by typing /DBMcpuoff");
end
end
function DBM_CPUPOff()
if(GetCVar("scriptProfile")~="0") then
SetCVar("scriptProfile", "0");
ReloadUI();
end
end
function DBM_CreateExtraMenuFrames(nrFrames,nrButtons)
--[[
for i=UIDROPDOWNMENU_MAXLEVELS+1,nrFrames do
UIDropDownMenu_CreateFrames(i, 0);
end]]--
--[[
local i,j;
for i=3,nrFrames do
--first check if frame exists
if(not getglobal("DropDownList"..i)) then
--Create the frame
local frame = CreateFrame("Button","DropDownList"..i,UIParent,"UIDropDownListTemplate");
frame:SetToplevel(true);
frame:SetID(i);
frame:SetFrameStrata("FULLSCREEN_DIALOG");
frame:Hide();
end
--now add extra buttons if they dont exists
for j=9,nrButtons do
if(not getglobal("DropDownList"..i.."Button"..j)) then
local frame = CreateFrame("Button","DropDownList"..i.."Button"..j,getglobal("DropDownList"..i),"UIDropDownMenuButtonTemplate");
frame:SetID(j);
end
end
end]]--
end
--[[
********************************************************************
********************************************************************
Sync Functions
********************************************************************
********************************************************************
]]--
--[[ ********************************
Position Sync
********************************]]--
local pos_sync_table = {};
local pos_last_asked_sync = {};
local pos_send_my_until = 0;
local pos_dont_send_to_fast = 0;
local function send_position_sync()
SetMapToCurrentZone();
local x,y = GetPlayerMapPosition("player");
local zone = GetRealZoneText();
DBM_send_mess("MYPOS "..x.."@"..y.."@"..zone);
end
function DBM_PositionSync_OnUpdate()
--runs 20 times each second
if(pos_send_my_until > GetTime()) then
--dont send to fast
if(pos_dont_send_to_fast + 1 > GetTime()) then
return;
end
pos_dont_send_to_fast = GetTime();
--send
send_position_sync();
end
end
function DBM_PositionSyncRequest_Recive(msg,from)
if(msg==DBM_YOU) then
pos_send_my_until = GetTime()+8;
end
end
function DBM_PositionSync_Recive(msg,from)
local found,_,x,y,zone = string.find(msg,"(.+)@(.+)@(.+)");
if(found) then
pos_sync_table[from] = {
x = tonumber(x),
y = tonumber(y),
zone = zone,
};
end
end
function DBM_GetPlayerMapPosition(uid)
if(UnitExists(uid)) then
--fix your own coords
SetMapToCurrentZone();
--get coords
local x,y = GetPlayerMapPosition(uid);
--if we got coords from blizz UI just pass them
if(x+y > 0) then
return x,y;
end
--get coords from sync
local name = UnitName(uid);
--check if we should ask for new sync
if(not pos_last_asked_sync[name]) then pos_last_asked_sync[name] = 0; end --to be failsafe
if(pos_last_asked_sync[name]+5 < GetTime()) then
pos_last_asked_sync[name] = GetTime();
DBM_send_mess("REQUESTPOS "..name);
end
--okay no fetch from table
if(not pos_sync_table[name]) then
--not updated yet or no DBM
return 0,0;
end
--check if we are in same zone
if(GetRealZoneText()==pos_sync_table[name].zone) then
return pos_sync_table[name].x,pos_sync_table[name].y;
else
return 0,0;
end
end
return GetPlayerMapPosition(uid);
end
+440
View File
@@ -0,0 +1,440 @@
-- ***************************************************
-- ** DBM Range Check Frame **
-- ** http://www.deadlybossmods.com **
-- ***************************************************
--
-- This addon is written and copyrighted by:
-- * Paul Emmerich (Tandanu @ EU-Aegwynn) (DBM-Core)
-- * Martin Verges (Nitram @ EU-Azshara) (DBM-GUI)
--
-- The localizations are written by:
-- * enGB/enUS: Tandanu
-- * deDE: Tandanu/Nitram
-- * ruRU: BootWin
-- * zhTW: Azael/kc10577
-- * (add your names here!)
--
-- Special thanks to:
-- * Arta (DBM-Party)
--
--
-- The code of this addon is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 License. (see license.txt)
-- All included textures and sounds are copyrighted by their respective owners.
--
--
-- You are free:
-- * to Share — to copy, distribute, display, and perform the work
-- * to Remix — to make derivative works
-- Under the following conditions:
-- * Attribution. You must attribute the work in the manner specified by the author or licensor (but not in any way that suggests that they endorse you or your use of the work).
-- * Noncommercial. You may not use this work for commercial purposes.
-- * Share Alike. If you alter, transform, or build upon this work, you may distribute the resulting work only under the same or similar license to this one.
--
--
-- This file makes use of the following free (Creative Commons Sampling Plus 1.0) sounds:
-- * alarmclockbeeps.ogg by tedthetrumpet (http://www.freesound.org/usersViewSingle.php?id=177)
-- * blip_8.ogg by Corsica_S (http://www.freesound.org/usersViewSingle.php?id=7037)
-- The full of text of the license can be found in the file "Sounds\Creative Commons Sampling Plus 1.0.txt".
---------------
-- Globals --
---------------
DBM.RangeCheck = {}
--------------
-- Locals --
--------------
local rangeCheck = DBM.RangeCheck
local checkFuncs = {}
local frame
local createFrame
local onUpdate
local dropdownFrame
local initializeDropdown
local initRangeCheck -- initializes the range check for a specific range (if necessary), returns false if the initialization failed (because of a map range check in an unknown zone)
-- for Phanx' Class Colors
local RAID_CLASS_COLORS = CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS
---------------------
-- Dropdown Menu --
---------------------
-- todo: this dropdown menu is somewhat ugly and unflexible....
do
local function setRange(self, range)
rangeCheck:Show(range)
end
local sound0 = "none"
local sound1 = "Interface\\AddOns\\DBM-Core\\Sounds\\blip_8.ogg"
local sound2 = "Interface\\AddOns\\DBM-Core\\Sounds\\alarmclockbeeps.ogg"
local function setSound(self, option, sound)
DBM.Options[option] = sound
if sound ~= "none" then
PlaySoundFile(sound)
end
end
local function toggleLocked()
DBM.Options.RangeFrameLocked = not DBM.Options.RangeFrameLocked
end
function initializeDropdown(dropdownFrame, level, menu)
local info
if level == 1 then
info = UIDropDownMenu_CreateInfo()
info.text = DBM_CORE_RANGECHECK_SETRANGE
info.notCheckable = true
info.hasArrow = true
info.menuList = "range"
UIDropDownMenu_AddButton(info, 1)
info = UIDropDownMenu_CreateInfo()
info.text = DBM_CORE_RANGECHECK_SOUNDS
info.notCheckable = true
info.hasArrow = true
info.menuList = "sounds"
UIDropDownMenu_AddButton(info, 1)
info = UIDropDownMenu_CreateInfo()
info.text = DBM_CORE_RANGECHECK_LOCK
if DBM.Options.RangeFrameLocked then
info.checked = true
end
info.func = toggleLocked
UIDropDownMenu_AddButton(info, 1)
info = UIDropDownMenu_CreateInfo()
info.text = DBM_CORE_RANGECHECK_HIDE
info.notCheckable = true
info.func = rangeCheck.Hide
info.arg1 = rangeCheck
UIDropDownMenu_AddButton(info, 1)
elseif level == 2 then
if menu == "range" then
if initRangeCheck() then
info = UIDropDownMenu_CreateInfo()
info.text = DBM_CORE_RANGECHECK_SETRANGE_TO:format(6)
info.func = setRange
info.arg1 = 6
info.checked = (frame.range == 6)
UIDropDownMenu_AddButton(info, 2)
end
if initRangeCheck() then
info = UIDropDownMenu_CreateInfo()
info.text = DBM_CORE_RANGECHECK_SETRANGE_TO:format(8)
info.func = setRange
info.arg1 = 8
info.checked = (frame.range == 8)
UIDropDownMenu_AddButton(info, 2)
end
info = UIDropDownMenu_CreateInfo()
info.text = DBM_CORE_RANGECHECK_SETRANGE_TO:format(10)
info.func = setRange
info.arg1 = 10
info.checked = (frame.range == 10)
UIDropDownMenu_AddButton(info, 2)
info = UIDropDownMenu_CreateInfo()
info.text = DBM_CORE_RANGECHECK_SETRANGE_TO:format(11)
info.func = setRange
info.arg1 = 11
info.checked = (frame.range == 11)
UIDropDownMenu_AddButton(info, 2)
if initRangeCheck() then
info = UIDropDownMenu_CreateInfo()
info.text = DBM_CORE_RANGECHECK_SETRANGE_TO:format(12)
info.func = setRange
info.arg1 = 12
info.checked = (frame.range == 12)
UIDropDownMenu_AddButton(info, 2)
end
info = UIDropDownMenu_CreateInfo()
info.text = DBM_CORE_RANGECHECK_SETRANGE_TO:format(15)
info.func = setRange
info.arg1 = 15
info.checked = (frame.range == 15)
UIDropDownMenu_AddButton(info, 2)
if initRangeCheck() then
info = UIDropDownMenu_CreateInfo()
info.text = DBM_CORE_RANGECHECK_SETRANGE_TO:format(20)
info.func = setRange
info.arg1 = 20
info.checked = (frame.range == 20)
UIDropDownMenu_AddButton(info, 2)
end
info = UIDropDownMenu_CreateInfo()
info.text = DBM_CORE_RANGECHECK_SETRANGE_TO:format(28)
info.func = setRange
info.arg1 = 28
info.checked = (frame.range == 28)
UIDropDownMenu_AddButton(info, 2)
elseif menu == "sounds" then
info = UIDropDownMenu_CreateInfo()
info.text = DBM_CORE_RANGECHECK_SOUND_OPTION_1
info.notCheckable = true
info.hasArrow = true
info.menuList = "RangeFrameSound1"
UIDropDownMenu_AddButton(info, 2)
info = UIDropDownMenu_CreateInfo()
info.text = DBM_CORE_RANGECHECK_SOUND_OPTION_2
info.notCheckable = true
info.hasArrow = true
info.menuList = "RangeFrameSound2"
UIDropDownMenu_AddButton(info, 2)
end
elseif level == 3 then
local option = menu
info = UIDropDownMenu_CreateInfo()
info.text = DBM_CORE_RANGECHECK_SOUND_0
info.func = setSound
info.arg1 = option
info.arg2 = sound0
info.checked = (DBM.Options[option] == sound0)
UIDropDownMenu_AddButton(info, 3)
info = UIDropDownMenu_CreateInfo()
info.text = DBM_CORE_RANGECHECK_SOUND_1
info.func = setSound
info.arg1 = option
info.arg2 = sound1
info.checked = (DBM.Options[option] == sound1)
UIDropDownMenu_AddButton(info, 3)
info = UIDropDownMenu_CreateInfo()
info.text = DBM_CORE_RANGECHECK_SOUND_2
info.func = setSound
info.arg1 = option
info.arg2 = sound2
info.checked = (DBM.Options[option] == sound2)
UIDropDownMenu_AddButton(info, 3)
end
end
end
-----------------
-- Play Sounds --
-----------------
local function updateSound(numPlayers) -- called every 5 seconds
if not UnitAffectingCombat("player") then
return
end
if numPlayers == 1 then
if DBM.Options.RangeFrameSound1 ~= "none" then
PlaySoundFile(DBM.Options.RangeFrameSound1)
end
elseif numPlayers > 1 then
if DBM.Options.RangeFrameSound2 ~= "none" then
PlaySoundFile(DBM.Options.RangeFrameSound2)
end
end
end
------------------------
-- Create the frame --
------------------------
function createFrame()
local elapsed = 0
local frame = CreateFrame("GameTooltip", "DBMRangeCheck", UIParent, "GameTooltipTemplate")
dropdownFrame = CreateFrame("Frame", "DBMRangeCheckDropdown", frame, "UIDropDownMenuTemplate")
frame:SetFrameStrata("DIALOG")
frame:SetPoint(DBM.Options.RangeFramePoint, UIParent, DBM.Options.RangeFramePoint, DBM.Options.RangeFrameX, DBM.Options.RangeFrameY)
frame:SetHeight(64)
frame:SetWidth(64)
frame:EnableMouse(true)
frame:SetToplevel(true)
frame:SetMovable()
GameTooltip_OnLoad(frame)
frame:SetPadding(16)
frame:RegisterForDrag("LeftButton")
frame:SetScript("OnDragStart", function(self)
if not DBM.Options.RangeFrameLocked then
self:StartMoving()
end
end)
frame:SetScript("OnDragStop", function(self)
self:StopMovingOrSizing()
ValidateFramePosition(self)
local point, _, _, x, y = self:GetPoint(1)
DBM.Options.RangeFrameX = x
DBM.Options.RangeFrameY = y
DBM.Options.RangeFramePoint = point
end)
frame:SetScript("OnUpdate", function(self, e)
elapsed = elapsed + e
if elapsed >= 0.5 and self.checkFunc then
onUpdate(self, elapsed)
elapsed = 0
end
end)
frame:SetScript("OnMouseDown", function(self, button)
if button == "RightButton" then
UIDropDownMenu_Initialize(dropdownFrame, initializeDropdown, "MENU")
ToggleDropDownMenu(1, nil, dropdownFrame, "cursor", 5, -10)
end
end)
return frame
end
----------------
-- OnUpdate --
----------------
local soundUpdate = 0
function onUpdate(self, elapsed)
local color
local j = 0
self:ClearLines()
self:SetText(DBM_CORE_RANGECHECK_HEADER:format(self.range), 1, 1, 1)
if initRangeCheck(self.range) then
for i = 1, GetNumRaidMembers() do
local uId = "raid"..i
if not UnitIsUnit(uId, "player") and not UnitIsDeadOrGhost(uId) and self.checkFunc(uId, self.range) and (not self.filter or self.filter(uId)) then
j = j + 1
color = RAID_CLASS_COLORS[select(2, UnitClass(uId))] or NORMAL_FONT_COLOR
local icon = GetRaidTargetIndex(uId)
local text = icon and ("|TInterface\\TargetingFrame\\UI-RaidTargetingIcon_%d:0|t %s"):format(icon, UnitName(uId)) or UnitName(uId)
self:AddLine(text, color.r, color.g, color.b)
if j >= 5 then
break
end
end
end
else
self:AddLine(DBM_CORE_RANGE_CHECK_ZONE_UNSUPPORTED:format(self.range))
end
soundUpdate = soundUpdate + elapsed
if soundUpdate >= 5 and j > 0 then
updateSound(j)
soundUpdate = 0
end
self:Show()
end
-----------------------
-- Check functions --
-----------------------
checkFuncs[11] = function(uId)
return CheckInteractDistance(uId, 2)
end
checkFuncs[10] = function(uId)
return CheckInteractDistance(uId, 3)
end
checkFuncs[28] = function(uId)
return CheckInteractDistance(uId, 4)
end
local getDistanceBetween
do
local mapSizes = DBM.MapSizes
function getDistanceBetween(uId, x, y)
local startX, startY = GetPlayerMapPosition(uId)
local mapName = GetMapInfo()
local dims = mapSizes[mapName] and mapSizes[mapName][GetCurrentMapDungeonLevel()]
if not dims then
return
end
local dX = (startX - x) * dims[1]
local dY = (startY - y) * dims[2]
return math.sqrt(dX * dX + dY * dY)
end
local function mapRangeCheck(uId, range)
return getDistanceBetween(uId, GetPlayerMapPosition("player")) < range
end
function initRangeCheck(range)
if checkFuncs[range] ~= mapRangeCheck then
return true
end
local pX, pY = GetPlayerMapPosition("player")
if pX == 0 and pY == 0 then
SetMapToCurrentZone()
pX, pY = GetPlayerMapPosition("player")
end
local levels = mapSizes[GetMapInfo()]
if not levels then
return false
end
local dims = levels[GetCurrentMapDungeonLevel()]
if not dims and levels and GetCurrentMapDungeonLevel() == 0 then -- we are in a known zone but the dungeon level seems to be wrong
SetMapToCurrentZone() -- fixes the dungeon level
dims = levels[GetCurrentMapDungeonLevel()] -- try again
if not dims then -- there is actually a level 0 in this zone but we don't know about it...too bad :(
return false
end
elseif not dims then
return false
end
return true -- everything ok!
end
setmetatable(checkFuncs, {
__index = function(t, k)
return mapRangeCheck
end
})
end
do
local bandages = {21991, 34721, 38643, 34722, 34721, 34722} -- you should have one of these bandages in your cache
checkFuncs[15] = function(uId)
for i, v in ipairs(bandages) do
if IsItemInRange(v, uId) == 1 then
return true
elseif IsItemInRange(v, uId) == 0 then
return false
end
end
end
end
---------------
-- Methods --
---------------
function rangeCheck:Show(range, filter)
if type(range) == "function" then -- the first argument is optional
return self:Show(nil, range)
end
range = range or 10
frame = frame or createFrame()
frame.checkFunc = checkFuncs[range] or error(("Range \"%d yd\" is not supported."):format(range), 2)
frame.range = range
frame.filter = filter
frame:Show()
frame:SetOwner(UIParent, "ANCHOR_PRESERVE")
onUpdate(frame, 0)
end
function rangeCheck:Hide()
if frame then frame:Hide() end
end
function rangeCheck:IsShown()
return frame and frame:IsShown()
end
function rangeCheck:GetDistance(...)
if initRangeCheck() then
return getDistanceBetween(...)
end
end
+96
View File
@@ -0,0 +1,96 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Frame name="DBTBarTemplate" virtual="true" frameStrata="MEDIUM" topLevel="true">
<Size>
<AbsDimension x="195" y="20"/>
</Size>
<Frames>
<StatusBar name="$parentBar">
<Size>
<AbsDimension x="195" y="20"/>
</Size>
<Anchors>
<Anchor point="CENTER" relativePoint="CENTER">
<Offset>
<AbsDimension x="0" y="0"/>
</Offset>
</Anchor>
</Anchors>
<Layers>
<Layer level="BACKGROUND">
<Texture name="$parentBackground">
<Color r="0" g="0" b="0" a="0.3"/>
</Texture>
</Layer>
<Layer level="OVERLAY">
<Texture name="$parentSpark" file="Interface\AddOns\DBM-Core\textures\Spark.blp" alphaMode="ADD">
<Size>
<AbsDimension x="32" y="64"/>
</Size>
<Anchors>
<Anchor point="CENTER">
<Offset>
<AbsDimension x="0" y="0"/>
</Offset>
</Anchor>
</Anchors>
</Texture>
<FontString name="$parentName" inherits="GameFontHighlightSmall" text="">
<Anchors>
<Anchor point="LEFT" relativePoint="LEFT">
<Offset>
<AbsDimension x="7" y="0.5"/>
</Offset>
</Anchor>
</Anchors>
</FontString>
<FontString name="$parentTimer" inherits="GameFontHighlightSmall" text="">
<Anchors>
<Anchor point="RIGHT" relativePoint="RIGHT">
<Offset>
<AbsDimension x="-1" y="0.5"/>
</Offset>
</Anchor>
</Anchors>
</FontString>
<Texture name="$parentIcon1">
<Size>
<AbsDimension x="20" y="20"/>
</Size>
<Anchors>
<Anchor point="RIGHT" relativePoint="LEFT">
<Offset>
<AbsDimension x="0" y="0"/>
</Offset>
</Anchor>
</Anchors>
</Texture>
<Texture name="$parentIcon2">
<Size>
<AbsDimension x="20" y="20"/>
</Size>
<Anchors>
<Anchor point="LEFT" relativePoint="RIGHT">
<Offset>
<AbsDimension x="0" y="0"/>
</Offset>
</Anchor>
</Anchors>
</Texture>
</Layer>
</Layers>
<BarTexture name="$parentTexture" file="Interface\AddOns\DBM-Core\textures\default.tga"/>
<BarColor r="1.0" g="0.7" b="0.0"/>
<Scripts>
<OnLoad function="DBT_Bar_OnLoad"/>
</Scripts>
</StatusBar>
</Frames>
<Scripts>
<OnUpdate function="DBT_Bar_OnUpdate"/>
<OnMouseDown function="DBT_Bar_OnMouseDown"/>
<OnMouseUp function="DBT_Bar_OnMouseUp"/>
<OnHide function="DBT_Bar_OnHide"/>
</Scripts>
</Frame>
</Ui>
+990
View File
@@ -0,0 +1,990 @@
-- ***************************************************
-- ** Deadly Bar Timers **
-- ** http://www.deadlybossmods.com **
-- ***************************************************
--
-- This addon is written and copyrighted by:
-- * Paul Emmerich (Tandanu @ EU-Aegwynn) (DBM-Core)
-- * Martin Verges (Nitram @ EU-Azshara) (DBM-GUI)
--
-- The localizations are written by:
-- * enGB/enUS: Tandanu http://www.deadlybossmods.com
-- * deDE: Tandanu http://www.deadlybossmods.com
-- * zhCN: Diablohu http://wow.gamespot.com.cn
-- * ruRU: BootWin bootwin@gmail.com
-- * zhTW: Azael/kc10577 kc10577@hotmail.com
-- * esES: Interplay/1nn7erpLaY http://www.1nn7erpLaY.com
-- * (add your names here!)
--
-- Special thanks to:
-- * Arta (DBM-Party)
--
--
-- The code of this addon is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 License. (see license.txt)
-- All included textures and sounds are copyrighted by their respective owners.
--
--
-- You are free:
-- * to Share ?to copy, distribute, display, and perform the work
-- * to Remix ?to make derivative works
-- Under the following conditions:
-- * Attribution. You must attribute the work in the manner specified by the author or licensor (but not in any way that suggests that they endorse you or your use of the work).
-- * Noncommercial. You may not use this work for commercial purposes.
-- * Share Alike. If you alter, transform, or build upon this work, you may distribute the resulting work only under the same or similar license to this one.
---------------
-- Globals --
---------------
DBT = {}
DBT_SavedOptions = {}
--------------
-- Locals --
--------------
local fCounter = 1
local barPrototype = {}
local unusedBars = {}
local unusedBarObjects = setmetatable({}, {__mode = "kv"})
local instances = {}
local updateClickThrough
local options
local function stringFromTimer(t)
if t <= 60 then
return ("%.1f"):format(t)
else
return ("%d:%0.2d"):format(t/60, math.fmod(t, 60))
end
end
-----------------------
-- Default Options --
-----------------------
options = {
BarXOffset = {
type = "number",
default = 0,
},
BarYOffset = {
type = "number",
default = 0,
},
HugeBarXOffset = {
type = "number",
default = 0,
},
HugeBarYOffset = {
type = "number",
default = 0,
},
ExpandUpwards = {
type = "boolean",
default = false,
},
Flash = {
type = "boolean",
default = true,
},
FadeIn = {
type = "boolean",
default = true,
},
Break = {
type = "boolean",
default = true,
},
IconLeft = {
type = "boolean",
default = true,
},
IconRight = {
type = "boolean",
default = false,
},
Texture = {
type = "string",
default = "Interface\\AddOns\\DBM-Core\\textures\\default.tga",
},
StartColorR = {
type = "number",
default = 1,
},
StartColorG = {
type = "number",
default = 0.7,
},
StartColorB = {
type = "number",
default = 0,
},
EndColorR = {
type = "number",
default = 1,
},
EndColorG = {
type = "number",
default = 0,
},
EndColorB = {
type = "number",
default = 0,
},
TextColorR = {
type = "number",
default = 1,
},
TextColorG = {
type = "number",
default = 1,
},
TextColorB = {
type = "number",
default = 1,
},
DynamicColor = {
type = "boolean",
default = true,
},
Width = {
type = "number",
default = 183,
},
Scale = {
type = "number",
default = 0.9,
},
HugeBarsEnabled = {
type = "boolean",
default = true,
},
HugeWidth = {
type = "number",
default = 200,
},
HugeScale = {
type = "number",
default = 1.03,
},
TimerPoint = {
type = "string",
default = "TOPRIGHT",
},
TimerX = {
type = "number",
default = -223,
},
TimerY = {
type = "number",
default = -260,
},
HugeTimerPoint = {
type = "string",
default = "CENTER",
},
HugeTimerX = {
type = "number",
default = 0,
},
HugeTimerY = {
type = "number",
default = -120,
},
EnlargeBarsTime = {
type = "number",
default = 8,
},
EnlargeBarsPercent = {
type = "number",
default = 0.125,
},
FillUpBars = {
type = "boolean",
default = true,
},
ClickThrough = {
type = "boolean",
default = false,
},
Font = {
type = "string",
default = STANDARD_TEXT_FONT,
},
FontSize = {
type = "number",
default = 10
}
}
--------------------------
-- Double Linked List --
--------------------------
--
-- this linked list can only contain tables that do not use the fields "prev" and "next"
-- this restriction especially means that an object must not be in two different linked lists at the same time
-- but this is sufficient for DBT here, having a wrapper object would just be an unnecessary overhead
-- special table keys for "prev"/"next" (e.g. userdata values) would add unnecessary complexity
local DLL = {}
DLL.__index = DLL
function DLL:Append(obj)
if self.first == nil then -- list is empty
self.first = obj
self.last = obj
else -- list is not empty
obj.prev = self.last
self.last.next = obj
self.last = obj
end
return obj
end
function DLL:Remove(obj)
if self.first == nil then -- list is empty...
-- ...meaning the object is not even in the list, nothing we can do here expect for removing the "prev" and "next" entries from obj
elseif self.first == obj and self.last == obj then -- list has only one element
self.first = nil
self.last = nil
elseif self.first == obj then -- trying to remove the first element
self.first = obj.next
self.first.prev = nil
elseif self.last == obj then -- trying to remove the last element
self.last = obj.prev
self.last.next = nil
elseif obj.prev and obj.next then -- trying to remove something in the middle of the list
obj.prev.next, obj.next.prev = obj.next, obj.prev
end
obj.prev = nil
obj.next = nil
end
function DLL:New()
return setmetatable({
first = nil,
last = nil
}, self)
end
setmetatable(DLL, {__call = DLL.New})
-------------------------------
-- DBT Constructor/Options --
-------------------------------
do
local mt = {__index = DBT}
local optionMT = {
__index = function(t, k)
if options[k] then
return options[k].default
else
return nil
end
end
}
function DBT:New()
local obj = setmetatable(
{
options = setmetatable({}, optionMT),
defaultOptions = setmetatable({}, optionMT),
mainAnchor = CreateFrame("Frame", nil, UIParent),
secAnchor = CreateFrame("Frame", nil, UIParent),
bars = {},
smallBars = DLL(),
hugeBars = DLL()
},
mt
)
obj.mainAnchor:SetHeight(1)
obj.mainAnchor:SetWidth(1)
obj.mainAnchor:SetPoint("TOPRIGHT", 223, -260)
obj.mainAnchor:SetClampedToScreen(true)
obj.mainAnchor:SetMovable(true)
obj.mainAnchor:Show()
obj.secAnchor:SetHeight(1)
obj.secAnchor:SetWidth(1)
obj.secAnchor:SetPoint("CENTER", 0, -120)
obj.secAnchor:SetClampedToScreen(true)
obj.secAnchor:SetMovable(true)
obj.secAnchor:Show()
table.insert(instances, obj)
return obj
end
function DBT:LoadOptions(id)
local savedOptions;
if type(id) == "table" then
savedOptions = id;
else
DBT_SavedOptions[id] = DBT_SavedOptions[id] or {};
savedOptions = DBT_SavedOptions[id];
end
self.options = setmetatable(savedOptions, optionMT)
self.mainAnchor:ClearAllPoints()
self.secAnchor:ClearAllPoints()
self.mainAnchor:SetPoint(self.options.TimerPoint, UIParent, self.options.TimerPoint, self.options.TimerX, self.options.TimerY)
self.secAnchor:SetPoint(self.options.HugeTimerPoint, UIParent, self.options.HugeTimerPoint, self.options.HugeTimerX, self.options.HugeTimerY)
end
end
function DBT:SetOption(option, value)
if not options[option] then
error(("Invalid option: %s"):format(tostring(option)), 2)
elseif options[option].type and type(value) ~= options[option].type then
error(("The option %s requires a %s value. (tried to assign a %s value)"):format(tostring(option), tostring(options[option].type), tostring(type(value))), 2)
elseif options[option].checkFunc then
local ok, errMsg = options[option].checkFunc(self, option, value)
if not ok then
error(("Error while setting option %s to %s: %s"):format(tostring(option), tostring(value), tostring(errMsg)), 2)
end
end
local oldValue = self.options[option]
self.options[option] = value
if options[option].onChange then
options[option].onChange(self, value, oldValue)
end
self:ApplyStyle()
end
function DBT:GetOption(option)
return self.options[option]
end
function DBT:GetDefaultOption(option)
return self.defaultOptions[option]
end
-----------------------
-- Bar Constructor --
-----------------------
do
local function createBarFrame(self)
local frame
if unusedBars[#unusedBars] then
frame = unusedBars[#unusedBars]
unusedBars[#unusedBars] = nil
frame:Show()
else
frame = CreateFrame("Frame", "DBT_Bar_"..fCounter, self.mainAnchor, "DBTBarTemplate")
fCounter = fCounter + 1
end
frame:EnableMouse(not self.options.ClickThrough or self.movable)
return frame
end
local mt = {__index = barPrototype}
function DBT:CreateBar(timer, id, icon, huge, small, color, isDummy)
if timer <= 0 then return end
if (self.numBars or 0) >= 15 and not isDummy then return end
local newBar = self:GetBar(id)
if newBar then -- update an existing bar
newBar:SetTimer(timer) -- this can kill the timer and the timer methods don't like dead timers
if newBar.dead then return end
newBar:SetElapsed(0) -- same
if newBar.dead then return end
newBar:ApplyStyle()
newBar:SetText(id)
newBar:SetIcon(icon)
else -- create a new one
newBar = next(unusedBarObjects, nil)
local newFrame = createBarFrame(self)
if newBar then
unusedBarObjects[newBar] = nil
newBar.dead = nil -- resurrected it :)
newBar.frame = newFrame
newBar.id = id
newBar.timer = timer
newBar.totalTime = timer
newBar.owner = self
newBar.moving = nil
newBar.enlarged = nil
newBar.fadingIn = 0
newBar.small = small
newBar.color = color
newBar.flashing = nil
else -- duplicate code ;(
newBar = setmetatable({
frame = newFrame,
id = id,
timer = timer,
totalTime = timer,
owner = self,
moving = nil,
enlarged = nil,
fadingIn = 0,
small = small,
color = color,
flashing = nil
}, mt)
end
newFrame.obj = newBar
self.numBars = (self.numBars or 0) + 1
if (timer <= self.options.EnlargeBarsTime or huge) and self:GetOption("HugeBarsEnabled") then -- starts enlarged?
newBar.enlarged = true
self.hugeBars:Append(newBar)
else
self.smallBars:Append(newBar)
end
newBar:ApplyStyle()
newBar:SetText(id)
newBar:SetIcon(icon)
newBar:SetPosition()
newBar:Update(0)
self.bars[newBar] = true
end
return newBar
end
end
-----------------
-- Dummy Bar --
-----------------
do
local dummyBars = 0
local function dummyCancel(self)
self.timer = self.totalTime
self.flashing = nil
self:Update(0)
self.flashing = nil
getglobal(self.frame:GetName().."BarSpark"):SetAlpha(1)
end
function DBT:CreateDummyBar()
dummyBars = dummyBars + 1
local dummy = self:CreateBar(25, "dummy"..dummyBars, "Interface\\Icons\\Spell_Nature_WispSplode", nil, true, nil, true)
dummy:SetText("Dummy")
dummy:Cancel()
self.bars[dummy] = true
unusedBars[#unusedBars] = nil
unusedBarObjects[dummy] = nil
dummy.frame.obj = dummy
dummy.frame:SetParent(UIParent)
dummy.frame:ClearAllPoints()
dummy.frame:SetScript("OnUpdate", nil)
dummy.Cancel = dummyCancel
dummy:ApplyStyle()
dummy.dummy = true
return dummy
end
end
-----------------------------
-- General Bar Functions --
-----------------------------
--do
-- local function iterator(self, frame)
-- return not frame and self.mainFirstBar or frame and frame.next
-- end
--
-- local function reverseIterator(self, frame)
-- return (not frame and self.mainLastBar) or frame and frame.prev
-- end
--
-- function DBT:GetBarIterator(reverse)
-- return (reverse and reverseIterator) or iterator, self, nil
-- end
--end
function DBT:GetBarIterator()
return pairs(self.bars)
end
function DBT:GetBar(id)
for bar in self:GetBarIterator() do
if id == bar.id then
return bar
end
end
end
function DBT:CancelBar(id)
for bar in self:GetBarIterator() do
if id == bar.id then
bar:Cancel()
return true
end
end
return false
end
function DBT:UpdateBar(id, elapsed, totalTime)
for bar in self:GetBarIterator() do
if id == bar.id then
bar:SetTimer(totalTime or bar.totalTime)
bar:SetElapsed(elapsed or self.totalTime - self.timer)
return true
end
end
return false
end
---------------------------
-- General Bar Methods --
---------------------------
function DBT:ShowTestBars()
self:CreateBar(10, "Test 1", "Interface\\Icons\\Spell_Nature_WispSplode")
self:CreateBar(14, "Test 2", "Interface\\Icons\\Spell_Nature_WispSplode")
self:CreateBar(20, "Test 3", "Interface\\Icons\\Spell_Nature_WispSplode")
self:CreateBar(12, "Test 4", "Interface\\Icons\\Spell_Nature_WispSplode")
self:CreateBar(21.5, "Test 5", "Interface\\Icons\\Spell_Nature_WispSplode")
end
function barPrototype:SetTimer(timer)
self.totalTime = timer
self:Update(0)
end
function barPrototype:SetElapsed(elapsed)
self.timer = self.totalTime - elapsed
if (self.enlarged or self.moving == "enlarge") and not (self.timer <= self.owner.options.EnlargeBarsTime or (self.timer/self.totalTime) <= self.owner.options.EnlargeBarsPercent) then
local next = self.next
self:RemoveFromList()
self.enlarged = nil
self.moving = nil
if next then
next:MoveToNextPosition()
end
self.owner.smallBars:Append(self)
self:SetPosition()
end
self:Update(0)
end
function barPrototype:SetText(text)
getglobal(self.frame:GetName().."BarName"):SetText(text)
end
function barPrototype:SetIcon(icon)
getglobal(self.frame:GetName().."BarIcon1"):SetTexture("")
getglobal(self.frame:GetName().."BarIcon1"):SetTexture(icon)
getglobal(self.frame:GetName().."BarIcon2"):SetTexture("")
getglobal(self.frame:GetName().."BarIcon2"):SetTexture(icon)
end
function barPrototype:SetColor(color)
self.color = color
getglobal(self.frame:GetName().."Bar"):SetStatusBarColor(color.r, color.g, color.b)
getglobal(self.frame:GetName().."BarSpark"):SetVertexColor(color.r, color.g, color.b)
end
------------------
-- Bar Update --
------------------
function barPrototype:Update(elapsed)
local frame = self.frame
local bar = getglobal(frame:GetName().."Bar")
local texture = getglobal(frame:GetName().."BarTexture")
local spark = getglobal(frame:GetName().."BarSpark")
local timer = getglobal(frame:GetName().."BarTimer")
local obj = self.owner
self.timer = self.timer - elapsed
if obj.options.DynamicColor and not self.color then
local r = obj.options.StartColorR + (obj.options.EndColorR - obj.options.StartColorR) * (1 - self.timer/self.totalTime)
local g = obj.options.StartColorG + (obj.options.EndColorG - obj.options.StartColorG) * (1 - self.timer/self.totalTime)
local b = obj.options.StartColorB + (obj.options.EndColorB - obj.options.StartColorB) * (1 - self.timer/self.totalTime)
bar:SetStatusBarColor(r, g, b)
spark:SetVertexColor(r, g, b)
end
if self.timer <= 0 then
return self:Cancel()
else
if obj.options.FillUpBars then
bar:SetValue(1 - self.timer/self.totalTime)
else
bar:SetValue(self.timer/self.totalTime)
end
spark:ClearAllPoints()
spark:SetPoint("CENTER", bar, "LEFT", bar:GetValue() * bar:GetWidth(), -1)
timer:SetText(stringFromTimer(self.timer))
end
if obj.options.FadeIn and self.fadingIn and self.fadingIn < 0.5 then
self.fadingIn = self.fadingIn + elapsed
frame:SetAlpha((self.fadingIn) / 0.5)
elseif self.fadingIn then
self.fadingIn = nil
end
if self.timer <= 7.75 and not self.flashing and obj.options.Flash then
self.flashing = true
self.ftimer = 0
end
if self.flashing then
local ftime = self.ftimer % 1.25
if ftime >= 0.5 then
texture:SetAlpha(1)
spark:SetAlpha(1)
elseif ftime >= 0.25 then
texture:SetAlpha(1 - (0.5 - ftime) / 0.25)
spark:SetAlpha(1 - (0.5 - ftime) / 0.25)
else
texture:SetAlpha(1 - (ftime / 0.25))
spark:SetAlpha(1 - (ftime / 0.25))
end
self.ftimer = self.ftimer + elapsed
end
if self.moving == "move" and self.moveElapsed <= 0.5 then
self.moveElapsed = self.moveElapsed + elapsed
local newX = self.moveOffsetX + (obj.options.BarXOffset - self.moveOffsetX) * (self.moveElapsed / 0.5)
local newY
if self.owner.options.ExpandUpwards then
newY = self.moveOffsetY + 40 + (obj.options.BarYOffset - self.moveOffsetY) * (self.moveElapsed / 0.5)
else
newY = self.moveOffsetY + (-obj.options.BarYOffset - self.moveOffsetY) * (self.moveElapsed / 0.5)
end
frame:ClearAllPoints()
frame:SetPoint(self.movePoint, self.moveAnchor, self.moveRelPoint, newX, newY)
elseif self.moving == "move" then
self.moving = nil
self:SetPosition()
elseif self.moving == "enlarge" and self.moveElapsed <= 1 then
self:AnimateEnlarge(elapsed)
elseif self.moving == "enlarge" then
self.moving = nil
self.enlarged = true
self.owner.hugeBars:Append(self)
self:ApplyStyle()
self:SetPosition()
end
if (self.timer <= self.owner.options.EnlargeBarsTime or (self.timer/self.totalTime) <= self.owner.options.EnlargeBarsPercent) and (not self.small) and not self.enlarged and self.moving ~= "enlarge" and self.owner:GetOption("HugeBarsEnabled") then
local next = self.next
self:RemoveFromList()
if next then
local oldX = next.frame:GetRight() - next.frame:GetWidth()/2 -- the next frame's point needs to be cleared before we enlarge the bar to prevent the frame from "jumping around"
local oldY = next.frame:GetTop() -- so we need to save the old point for :MoveToNextPosition() as :GetTop() and :GetRight() might return nil (sometimes? happened only once in 2 weeks of raiding...but it crashed DBT...) after :ClearAllPoints()
next.frame:ClearAllPoints()
end
self:Enlarge()
if next then
next:MoveToNextPosition(oldX, oldY) -- ugly?
end
end
end
do
local frame = CreateFrame("Frame")
frame:SetScript("OnUpdate", function(self, elapsed)
if UIParent:IsShown() then return end
for i, v in ipairs(instances) do
for bar in v:GetBarIterator() do
bar:Update(elapsed)
end
end
end)
end
-------------------
-- Movable Bar --
-------------------
function DBT:SavePosition()
local point, _, _, x, y = self.mainAnchor:GetPoint(1)
self:SetOption("TimerPoint", point)
self:SetOption("TimerX", x)
self:SetOption("TimerY", y)
local point, _, _, x, y = self.secAnchor:GetPoint(1)
self:SetOption("HugeTimerPoint", point)
self:SetOption("HugeTimerX", x)
self:SetOption("HugeTimerY", y)
end
do
local function moveEnd(self)
updateClickThrough(self, self:GetOption("ClickThrough"))
self.movable = false
end
function DBT:ShowMovableBar(small, large)
if small or small == nil then
local bar1 = self:CreateBar(20, "Move1", "Interface\\Icons\\Spell_Nature_WispSplode", nil, true)
bar1:SetText(DBM_CORE_MOVABLE_BAR)
end
if large or large == nil then
local bar2 = self:CreateBar(20, "Move2", "Interface\\Icons\\Spell_Nature_WispSplode", true)
bar2:SetText(DBM_CORE_MOVABLE_BAR)
end
updateClickThrough(self, false)
self.movable = true
DBM:Unschedule(moveEnd, self)
DBM:Schedule(20, moveEnd, self)
end
end
--------------------
-- Bar Handling --
--------------------
function barPrototype:RemoveFromList()
if self.moving ~= "enlarge" then
(self.enlarged and self.owner.hugeBars or self.owner.smallBars):Remove(self)
end
end
------------------
-- Bar Cancel --
------------------
function barPrototype:Cancel()
local next = self.next
table.insert(unusedBars, self.frame)
self.frame:Hide()
self.frame.obj = nil
self:RemoveFromList()
if next then
next:MoveToNextPosition()
end
self.owner.bars[self] = nil
unusedBarObjects[self] = self
self.dead = true
self.owner.numBars = (self.owner.numBars or 1) - 1
end
-----------------
-- Bar Style --
-----------------
function DBT:ApplyStyle()
for bar in self:GetBarIterator() do
bar:ApplyStyle()
end
end
function barPrototype:ApplyStyle()
local frame = self.frame
local bar = getglobal(frame:GetName().."Bar")
local spark = getglobal(frame:GetName().."BarSpark")
local texture = getglobal(frame:GetName().."BarTexture")
local icon1 = getglobal(frame:GetName().."BarIcon1")
local icon2 = getglobal(frame:GetName().."BarIcon2")
local name = getglobal(frame:GetName().."BarName")
local timer = getglobal(frame:GetName().."BarTimer")
texture:SetTexture(self.owner.options.Texture)
if self.color then
bar:SetStatusBarColor(self.color.r, self.color.g, self.color.b)
spark:SetVertexColor(self.color.r, self.color.g, self.color.b)
else
bar:SetStatusBarColor(self.owner.options.StartColorR, self.owner.options.StartColorG, self.owner.options.StartColorB)
spark:SetVertexColor(self.owner.options.StartColorR, self.owner.options.StartColorG, self.owner.options.StartColorB)
end
name:SetTextColor(self.owner.options.TextColorR, self.owner.options.TextColorG, self.owner.options.TextColorB)
timer:SetTextColor(self.owner.options.TextColorR, self.owner.options.TextColorG, self.owner.options.TextColorB)
if self.owner.options.IconLeft then icon1:Show() else icon1:Hide() end
if self.owner.options.IconRight then icon2:Show() else icon2:Hide() end
if self.enlarged then frame:SetWidth(self.owner.options.HugeWidth) else frame:SetWidth(self.owner.options.Width) end
if self.enlarged then bar:SetWidth(self.owner.options.HugeWidth) else bar:SetWidth(self.owner.options.Width) end
if self.enlarged then frame:SetScale(self.owner.options.HugeScale) else frame:SetScale(self.owner.options.Scale) end
self.frame:Show()
spark:SetAlpha(1)
texture:SetAlpha(1)
bar:SetAlpha(1)
frame:SetAlpha(1)
name:SetFont(self.owner.options.Font, self.owner.options.FontSize)
timer:SetFont(self.owner.options.Font, self.owner.options.FontSize)
self:Update(0)
end
local function updateOrientation(self)
for bar in self:GetBarIterator() do
if not bar.dummy then
if bar.moving == "enlarge" then
bar.enlarged = true
bar.moving = false
self.owner.hugeBars:Append(self)
bar:ApplyStyle()
end
bar.moving = nil
bar:SetPosition()
end
end
end
options.ExpandUpwards.onChange = updateOrientation
options.BarYOffset.onChange = updateOrientation
options.BarXOffset.onChange = updateOrientation
function updateClickThrough(self, newValue)
if not self.movable then
for bar in self:GetBarIterator() do
if not bar.dummy then
bar.frame:EnableMouse(not newValue)
end
end
end
end
options.ClickThrough.onChange = updateClickThrough
--------------------
-- Bar Announce --
--------------------
function barPrototype:Announce()
local msg
if self.owner.announceHook then
msg = self.owner.announceHook(self)
end
msg = msg or ("%s %d:%02d"):format(getglobal(self.frame:GetName().."BarName"):GetText(), math.floor(self.timer / 60), self.timer % 60)
local chatWindow = ChatEdit_GetActiveWindow()
if chatWindow then
chatWindow:Insert(msg)
else
SendChatMessage(msg, (select(2, IsInInstance()) == "pvp" and "BATTLEGROUND") or (GetNumRaidMembers() > 0 and "RAID") or "PARTY")
end
end
function DBT:SetAnnounceHook(f)
self.announceHook = f
end
-----------------------
-- Bar Positioning --
-----------------------
function barPrototype:SetPosition()
if self.moving == "enlarge" then return end
local anchor = (self.prev and self.prev.frame) or (self.enlarged and self.owner.secAnchor) or self.owner.mainAnchor
self.frame:ClearAllPoints()
if self.owner.options.ExpandUpwards then
self.frame:SetPoint("TOP", anchor, "BOTTOM", self.owner.options.BarXOffset, 40 + self.owner.options.BarYOffset)
else
self.frame:SetPoint("TOP", anchor, "BOTTOM", self.owner.options.BarXOffset, -self.owner.options.BarYOffset)
end
end
function barPrototype:MoveToNextPosition(oldX, oldY)
if self.moving == "enlarge" then return end
local newAnchor = (self.prev and self.prev.frame) or (self.enlarged and self.owner.secAnchor) or self.owner.mainAnchor
local oldX = oldX or (self.frame:GetRight() - self.frame:GetWidth()/2)
local oldY = oldY or (self.frame:GetTop())
self.frame:ClearAllPoints()
if self.owner.options.ExpandUpwards then
self.frame:SetPoint("TOP", newAnchor, "BOTTOM", self.owner.options.BarXOffset, 40 + self.owner.options.BarYOffset)
else
self.frame:SetPoint("TOP", newAnchor, "BOTTOM", self.owner.options.BarXOffset, -self.owner.options.BarYOffset)
end
local newX = self.frame:GetRight() - self.frame:GetWidth()/2
local newY = self.frame:GetTop()
self.frame:ClearAllPoints()
self.frame:SetPoint("TOP", newAnchor, "BOTTOM", -(newX - oldX), -(newY - oldY))
self.moving = "move"
self.movePoint = "TOP"
self.moveRelPoint = "BOTTOM"
self.moveAnchor = newAnchor
self.moveOffsetX = -(newX - oldX)
self.moveOffsetY = -(newY - oldY)
self.moveElapsed = 0
end
function barPrototype:Enlarge()
local newAnchor = (self.owner.hugeBars.last and self.owner.hugeBars.last.frame) or self.owner.secAnchor
local oldX = self.frame:GetRight() - self.frame:GetWidth()/2
local oldY = self.frame:GetTop()
self.frame:ClearAllPoints()
if self.owner.options.ExpandUpwards then
self.frame:SetPoint("TOP", newAnchor, "BOTTOM", self.owner.options.BarXOffset, 40 + self.owner.options.BarYOffset)
else
self.frame:SetPoint("TOP", newAnchor, "BOTTOM", self.owner.options.BarXOffset, -self.owner.options.BarYOffset)
end
local newX = self.frame:GetRight() - self.frame:GetWidth()/2
local newY = self.frame:GetTop()
self.frame:ClearAllPoints()
self.frame:SetPoint("TOP", newAnchor, "BOTTOM", -(newX - oldX), -(newY - oldY))
self.moving = "enlarge"
self.movePoint = "TOP"
self.moveRelPoint = "BOTTOM"
self.moveAnchor = newAnchor
self.moveOffsetX = -(newX - oldX)
self.moveOffsetY = -(newY - oldY)
self.moveElapsed = 0
end
---------------------------
-- Bar Special Effects --
---------------------------
function barPrototype:AnimateEnlarge(elapsed)
self.moveElapsed = self.moveElapsed + elapsed
local newX = self.moveOffsetX + (self.owner.options.BarXOffset - self.moveOffsetX) * (self.moveElapsed / 1)
local newY
if self.owner.options.ExpandUpwards then
newY = self.moveOffsetY + 50 + (self.owner.options.BarYOffset - self.moveOffsetY) * (self.moveElapsed / 1)
else
newY = self.moveOffsetY + (self.owner.options.BarYOffset - self.moveOffsetY) * (self.moveElapsed / 1)
end
local newWidth = self.owner.options.Width + (self.owner.options.HugeWidth - self.owner.options.Width ) * (self.moveElapsed / 1)
local newScale = self.owner.options.Scale + (self.owner.options.HugeScale - self.owner.options.Scale) * (self.moveElapsed / 1)
if (self.moveOffsetY > 0 and newY > self.owner.options.BarYOffset) or (self.moveOffsetY < 0 and newY < self.owner.options.BarYOffset) then
self.frame:ClearAllPoints()
self.frame:SetPoint(self.movePoint, self.moveAnchor, self.moveRelPoint, newX, newY)
self.frame:SetScale(newScale)
self.frame:SetWidth(newWidth)
getglobal(self.frame:GetName().."Bar"):SetWidth(newWidth)
else
self.moving = nil
self.enlarged = true
self.owner.hugeBars:Append(self)
self:ApplyStyle()
self:SetPosition()
end
end
--[[
do
local breakFrames = {}
function barPrototype:Break() -- coming soon
local frame = table.remove(breakTextures, #breakTextures) or CreateFrame("Frame", nil, self.owner.mainAnchor)
frame:SetParent(self.owner.mainAnchor)
frame.tex1 = frame.tex1 or frame:CreateTexture(nil, "OVERLAY")
frame.tex2 = frame.tex2 or frame:CreateTexture(nil, "OVERLAY")
local tex1 = frame.tex1
local tex2 = frame.tex2
tex1:SetTexture(self.owner.options.Texture)
tex2:SetTexture(self.owner.options.Texture)
-- tex1:SetTexCoordModifiesRect(true)
tex1:SetHorizTile(true)
tex1:SetVertTile(true)
tex1:SetTexCoord(0, 0.5, 0, 1)
end
end
]]--
----------------------------------------
-- Functions used by the XML Template --
----------------------------------------
function DBT_Bar_OnLoad(self)
self:SetMinMaxValues(0, 1)
self:SetValue(1)
end
function DBT_Bar_OnUpdate(self, elapsed)
self.obj:Update(elapsed)
end
function DBT_Bar_OnMouseDown(self, btn)
if self.obj.owner.movable and btn == "LeftButton" then
if self.obj.enlarged then
self.obj.owner.secAnchor:StartMoving()
else
self.obj.owner.mainAnchor:StartMoving()
end
end
end
function DBT_Bar_OnMouseUp(self, btn)
self.obj.owner.mainAnchor:StopMovingOrSizing()
self.obj.owner.secAnchor:StopMovingOrSizing()
self.obj.owner:SavePosition()
if btn == "RightButton" then
self.obj:Cancel()
elseif btn == "LeftButton" and IsShiftKeyDown() then
self.obj:Announce()
end
end
function DBT_Bar_OnHide(self)
if self.obj then
self.obj.owner.mainAnchor:StopMovingOrSizing()
self.obj.owner.secAnchor:StopMovingOrSizing()
end
end
+61
View File
@@ -0,0 +1,61 @@
License
THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.
1. Definitions
a. "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License.
b. "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(g) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License.
c. "Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership.
d. "License Elements" means the following high-level license attributes as selected by Licensor and indicated in the title of this License: Attribution, Noncommercial, ShareAlike.
e. "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License.
f. "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast.
g. "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work.
h. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation.
i. "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images.
j. "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium.
2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws.
3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below:
a. to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections;
b. to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified.";
c. to Distribute and Publicly Perform the Work including as incorporated in Collections; and,
d. to Distribute and Publicly Perform Adaptations.
The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved, including but not limited to the rights described in Section 4(e).
4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions:
a. You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(d), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(d), as requested.
b. You may Distribute or Publicly Perform an Adaptation only under: (i) the terms of this License; (ii) a later version of this License with the same License Elements as this License; (iii) a Creative Commons jurisdiction license (either this or a later license version) that contains the same License Elements as this License (e.g., Attribution-NonCommercial-ShareAlike 3.0 US) ("Applicable License"). You must include a copy of, or the URI, for Applicable License with every copy of each Adaptation You Distribute or Publicly Perform. You may not offer or impose any terms on the Adaptation that restrict the terms of the Applicable License or the ability of the recipient of the Adaptation to exercise the rights granted to that recipient under the terms of the Applicable License. You must keep intact all notices that refer to the Applicable License and to the disclaimer of warranties with every copy of the Work as included in the Adaptation You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Adaptation, You may not impose any effective technological measures on the Adaptation that restrict the ability of a recipient of the Adaptation from You to exercise the rights granted to that recipient under the terms of the Applicable License. This Section 4(b) applies to the Adaptation as incorporated in a Collection, but this does not require the Collection apart from the Adaptation itself to be made subject to the terms of the Applicable License.
c. You may not exercise any of the rights granted to You in Section 3 above in any manner that is primarily intended for or directed toward commercial advantage or private monetary compensation. The exchange of the Work for other copyrighted works by means of digital file-sharing or otherwise shall not be considered to be intended for or directed toward commercial advantage or private monetary compensation, provided there is no payment of any monetary compensation in con-nection with the exchange of copyrighted works.
d. If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and, (iv) consistent with Section 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4(d) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties.
e. For the avoidance of doubt:
i. Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License;
ii. Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License if Your exercise of such rights is for a purpose or use which is otherwise than noncommercial as permitted under Section 4(c) and otherwise waives the right to collect royalties through any statutory or compulsory licensing scheme; and,
iii. Voluntary License Schemes. The Licensor reserves the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License that is for a purpose or use which is otherwise than noncommercial as permitted under Section 4(c).
f. Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise.
5. Representations, Warranties and Disclaimer
UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING AND TO THE FULLEST EXTENT PERMITTED BY APPLICABLE LAW, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO THIS EXCLUSION MAY NOT APPLY TO YOU.
6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
7. Termination
a. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License.
b. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above.
8. Miscellaneous
a. Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License.
b. Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License.
c. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
d. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent.
e. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You.
f. The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law.
+134
View File
@@ -0,0 +1,134 @@
-- Simplified Chinese by Diablohu/yleaf(yaroot@gmail.com)
-- http://wow.gamespot.com.cn
-- Last Update: 12/13/2008
-- yleaf (yaroot@gmail.com) 9-19-2009
if GetLocale() ~= "zhCN" then return end
DBM_CORE_LOAD_MOD_ERROR = "读取%s模块时发生错误:%s"
DBM_CORE_LOAD_MOD_SUCCESS = "成功读取%s模块!"
DBM_CORE_LOAD_GUI_ERROR = "无法读取图形界面:%s"
DBM_CORE_COMBAT_STARTED = "%s作战开始,祝你走运 :)";
DBM_CORE_BOSS_DOWN = "%s被击杀!用时%s。"
DBM_CORE_BOSS_DOWN_LONG = "%s被击杀!本次用时%s,上次用时%s,最快击杀用时%s。"
DBM_CORE_BOSS_DOWN_NEW_RECORD = "%s被击杀!用时%s,新的击杀纪录诞生了!(原纪录为%s)"
DBM_CORE_COMBAT_ENDED = "%s作战结束,用时%s。"
DBM_CORE_TIMER_FORMAT_SECS = "%d秒"
DBM_CORE_TIMER_FORMAT_MINS = "%d分钟"
DBM_CORE_TIMER_FORMAT = "%d分%d秒"
DBM_CORE_MIN = ""
DBM_CORE_MIN_FMT = "%d 分"
DBM_CORE_SEC = ""
DBM_CORE_SEC_FMT = "%d 秒"
DBM_CORE_DEAD = "死亡"
DBM_CORE_OK = "确定"
DBM_CORE_GENERIC_WARNING_BERSERK = "%s%s后激怒"
DBM_CORE_GENERIC_TIMER_BERSERK = "激怒"
DBM_CORE_OPTION_TIMER_BERSERK = "显示激怒倒计时"
DBM_CORE_OPTION_HEALTH_FRAME = "显示首领生命值窗口"
DBM_CORE_OPTION_CATEGORY_TIMERS = "计时条"
DBM_CORE_OPTION_CATEGORY_WARNINGS = "警报"
DBM_CORE_OPTION_CATEGORY_MISC = "其它"
DBM_CORE_AUTO_RESPONDED = "已自动回复密语。"
DBM_CORE_STATUS_WHISPER = "%s%s%d/%d存活"
DBM_CORE_AUTO_RESPOND_WHISPER = "%s正在与%s交战,(当前%s,%d/%d存活)"
DBM_CORE_VERSIONCHECK_HEADER = "Deadly Boss Mods - 版本检测"
DBM_CORE_VERSIONCHECK_ENTRY = "%s%s(r%d)"
DBM_CORE_VERSIONCHECK_ENTRY_NO_DBM = "%s:尚未安装DBM"
DBM_CORE_VERSIONCHECK_FOOTER = "团队中有%d名成员正在使用Deadly Boss Mods"
DBM_CORE_UPDATEREMINDER_HEADER = "你的Deadly Boss Mods版本已过期。\n你可以在如下地址下载到新版本%s(r%d):"
DBM_CORE_UPDATEREMINDER_FOOTER = "Ctrl-C:复制下载地址到剪切板。"
DBM_CORE_UPDATEREMINDER_NOTAGAIN = "发现新版本后弹出提示框"
DBM_CORE_MOVABLE_BAR = "拖动我!"
DBM_PIZZA_SYNC_INFO = "|Hplayer:%1$s|h[%1$s]|h向你发送了一个倒计时:'%2$s'\n|HDBM:cancel:%2$s:nil|h|cff3588ff[取消该计时]|r|h |HDBM:ignore:%2$s:%1$s|h|cff3588ff[忽略来自%1$s的计时]|r|h"
DBM_PIZZA_CONFIRM_IGNORE = "是否要在该次游戏连接中屏蔽来自%s的计时?"
DBM_PIZZA_ERROR_USAGE = "命令:/dbm [broadcast] timer <时间(秒)> <文本>"
DBM_CORE_ERROR_DBMV3_LOADED = "目前有2个版本的Deadly Boss Mods正在运行:DBMv3和DBMv4。\n单击“确定”按钮可将DBMv3关闭并重载用户界面。\n我们建议将插件目录下的DBMv3删除。"
DBM_CORE_MINIMAP_TOOLTIP_HEADER = "Deadly Boss Mods"
DBM_CORE_MINIMAP_TOOLTIP_FOOTER = "Shift+单击或右键点击即可移动"
DBM_CORE_RANGECHECK_HEADER = "距离监视(%d码)"
DBM_CORE_RANGECHECK_SETRANGE = "设置距离"
DBM_CORE_RANGECHECK_SOUNDS = "声音"
DBM_CORE_RANGECHECK_SOUND_OPTION_1 = "当有玩家接近时播放声音提示"
DBM_CORE_RANGECHECK_SOUND_OPTION_2 = "多名玩家接近提示"
DBM_CORE_RANGECHECK_SOUND_0 = ""
DBM_CORE_RANGECHECK_SOUND_1 = "默认声音"
DBM_CORE_RANGECHECK_SOUND_2 = "蜂鸣"
DBM_CORE_RANGECHECK_HIDE = "隐藏"
DBM_CORE_RANGECHECK_SETRANGE_TO = "%d码"
DBM_CORE_SLASHCMD_HELP = {
"可用命令:",
"/dbm version:进行团队范围的DBM版本检测(也可使用:ver)",
"/dbm unlock:显示一个可移动的计时条,可通过对它来移动所有DBM计时条的位置(也可使用:move)",
"/dbm timer <x> <文本>:开始一个以<文本>为名称的时间为<x>秒的倒计时",
"/dbm broadcast timer <x> <文本>:向团队广播一个以<文本>为名称的时间为<x>秒的倒计时(需要团队领袖或助理权限)",
"/dbm help:显示该帮助信息",
}
DBM_ERROR_NO_PERMISSION = "无权进行该操作。"
DBM_CORE_BOSSHEALTH_HIDE_FRAME = "隐藏"
DBM_CORE_ALLIANCE = "联盟"
DBM_CORE_HORDE = "部落"
DBM_CORE_UNKNOWN = "未知"
DBM_CORE_TIMER_PULL = "开怪倒计时"
DBM_CORE_ANNOUNCE_PULL = "%d 秒后开怪"
DBM_CORE_ANNOUNCE_PULL_NOW = "开怪!"
DBM_CORE_ACHIEVEMENT_TIMER_SPEED_KILL = "快速击杀"
-- Auto-generated Timer Localizations
DBM_CORE_AUTO_TIMER_TEXTS.target = "%s: %%s"
DBM_CORE_AUTO_TIMER_TEXTS.cast = "%s"
DBM_CORE_AUTO_TIMER_TEXTS.active = "%s"
DBM_CORE_AUTO_TIMER_TEXTS.cd = "%s 冷却"
DBM_CORE_AUTO_TIMER_TEXTS.next = "下一次 %s"
DBM_CORE_AUTO_TIMER_TEXTS.achievement = "%s"
DBM_CORE_AUTO_TIMER_OPTIONS.target = "显示 |cff71d5ff|Hspell:%d|h%s|h|r debuff计时"
DBM_CORE_AUTO_TIMER_OPTIONS.cast = "显示 |cff71d5ff|Hspell:%d|h%s|h|r 施法计时"
DBM_CORE_AUTO_TIMER_OPTIONS.active = "显示 |cff71d5ff|Hspell:%d|h%s|h|r 持续计时"
DBM_CORE_AUTO_TIMER_OPTIONS.cd = "显示 |cff71d5ff|Hspell:%d|h%s|h|r 冷却计时"
DBM_CORE_AUTO_TIMER_OPTIONS.next = "显示下一次 |cff71d5ff|Hspell:%d|h%s|h|r 计时"
DBM_CORE_AUTO_TIMER_OPTIONS.achievement = "显示成就: %s 计时"
-- Auto-generated Warning Localizations
DBM_CORE_AUTO_ANNOUNCE_TEXTS.target = "%s 于 >%%s<"
DBM_CORE_AUTO_ANNOUNCE_TEXTS.spell = "%s"
DBM_CORE_AUTO_ANNOUNCE_TEXTS.cast = "%s: %.1f sec"
DBM_CORE_AUTO_ANNOUNCE_TEXTS.soon = "即将 %s"
DBM_CORE_AUTO_ANNOUNCE_TEXTS.prewarn = "%2$s 后 %1$s"
DBM_CORE_AUTO_ANNOUNCE_TEXTS.phase = "第 %d 阶段"
DBM_CORE_AUTO_ANNOUNCE_OPTIONS.target = "警报目标的: |cff71d5ff|Hspell:%d|h%s|h|r"
DBM_CORE_AUTO_ANNOUNCE_OPTIONS.spell = "显示警报: |cff71d5ff|Hspell:%d|h%s|h|r"
DBM_CORE_AUTO_ANNOUNCE_OPTIONS.cast = "施法提示: |cff71d5ff|Hspell:%d|h%s|h|r"
DBM_CORE_AUTO_ANNOUNCE_OPTIONS.soon = "提前警报 |cff71d5ff|Hspell:%d|h%s|h|r"
DBM_CORE_AUTO_ANNOUNCE_OPTIONS.prewarn = "提前警报 |cff71d5ff|Hspell:%d|h%s|h|r"
DBM_CORE_AUTO_ANNOUNCE_OPTIONS.phase = "显示阶段提示: %d"
-- New special warnings
DBM_CORE_MOVE_SPECIAL_WARNING_BAR = "移动特殊警报"
DBM_CORE_MOVE_SPECIAL_WARNING_TEXT = "特殊警报"
+193
View File
@@ -0,0 +1,193 @@
if GetLocale() ~= "deDE" then return end
DBM_CORE_NEED_SUPPORT = "Hey, bist du ein Programmierer oder gut in Fremdsprachen? Falls ja, benötigt das DBM-Team deine Hilfe, damit DBM das beste BossMod in WoW bleibt. Trete dem Team auf www.deadlybossmods.com bei oder sende eine E-Mail an tandanu@deadlybossmods.com oder nitram@deadlybossmods.com."
DBM_CORE_LOAD_MOD_ERROR = "Fehler beim Laden von Boss Mods für %s: %s"
DBM_CORE_LOAD_MOD_SUCCESS = "Boss Mods für '%s' geladen, für weitere Optionen gib /dbm in deinem Chatfenster ein!"
DBM_CORE_LOAD_GUI_ERROR = "Konnte das GUI nicht laden: %s"
DBM_CORE_COMBAT_STARTED = "Kampf gegen %s hat begonnen. Viel Glück! :)";
DBM_CORE_BOSS_DOWN = "%s tot nach %s!"
DBM_CORE_BOSS_DOWN_LONG = "%s tot nach %s! Euer letzter kill hat %s gedauert und der schnellste %s."
DBM_CORE_BOSS_DOWN_NEW_RECORD = "%s tot nach %s! Das ist ein neuer Rekord! (der alte Rekord war %s)"
DBM_CORE_COMBAT_ENDED = "Kampf gegen %s hat nach %s aufgehört."
DBM_CORE_TIMER_FORMAT_SECS = "%d |4Sekunde:Sekunden;"
DBM_CORE_TIMER_FORMAT_MINS = "%d |4Minute:Minuten;"
DBM_CORE_TIMER_FORMAT = "%d |4Minute:Minuten; und %d |4Sekunde:Sekunden;"
DBM_CORE_MIN = "Min"
DBM_CORE_MIN_FMT = "%d Min"
DBM_CORE_SEC = "Sek"
DBM_CORE_SEC_FMT = "%d Sek"
DBM_CORE_DEAD = "Tot"
DBM_CORE_OK = "Okay"
DBM_CORE_GENERIC_WARNING_BERSERK = "Berserker in %s %s"
DBM_CORE_GENERIC_TIMER_BERSERK = "Berserker"
DBM_CORE_OPTION_TIMER_BERSERK = "Berserker-Timer anzeigen"
DBM_CORE_OPTION_HEALTH_FRAME = "BossHealth-Frame anzeigen"
DBM_CORE_OPTION_CATEGORY_TIMERS = "Timer"
DBM_CORE_OPTION_CATEGORY_WARNINGS = "Ansagen"
DBM_CORE_OPTION_CATEGORY_MISC = "Verschiedenes"
DBM_CORE_AUTO_RESPONDED = "Automatisch geantwortet."
DBM_CORE_STATUS_WHISPER = "%s: %s, %d/%d Spieler am Leben"
DBM_CORE_AUTO_RESPOND_WHISPER = "%s ist damit beschäftigt, gegen %s zu kämpfen! (%s, %d/%d Spieler am Leben)"
DBM_CORE_WHISPER_COMBAT_END_KILL = "%s hat %s besiegt!"
DBM_CORE_WHISPER_COMBAT_END_WIPE = "%s ist an %s gewipet"
DBM_CORE_VERSIONCHECK_HEADER = "Deadly Boss Mods - Versionen"
DBM_CORE_VERSIONCHECK_ENTRY = "%s: %s (r%d)"
DBM_CORE_VERSIONCHECK_ENTRY_NO_DBM = "%s: DBM nicht installiert"
DBM_CORE_VERSIONCHECK_FOOTER = "%d Spieler mit Deadly Boss Mods gefunden"
DBM_CORE_YOUR_VERSION_OUTDATED = "Deine Version von Deadly Boss Mods ist veraltet! Bitte besuche www.deadlybossmods.com, um die neueste Version herunterzuladen."
DBM_CORE_DISABLED_ICON_FUNCTION = "Dein DBM setzt keine Zeichen mehr, weil deine Version veraltet ist. Bitte aktualisiere dein DBM so bald wie möglich und aktiviere die Zeichenfunktion wieder."
DBM_CORE_UPDATEREMINDER_HEADER = "Deine Version von Deadly Boss Mods ist veraltet.\n Version %s (r%d) ist hier zum Download verfügbar:"
DBM_CORE_UPDATEREMINDER_FOOTER = "Drücke Strg+C um den Download-Link in die Zwischenablage zu kopieren"
DBM_CORE_UPDATEREMINDER_NOTAGAIN = "Zeige Popup wenn eine neue Version verfügbar ist"
DBM_CORE_MOVABLE_BAR = "Zieh mich!"
DBM_PIZZA_SYNC_INFO = "|Hplayer:%1$s|h[%1$s]|h hat dir einen DBM-Timer geschickt: '%2$s'\n|HDBM:cancel:%2$s:nil|h|cff3588ff[Diesen Timer abbrechen]|r|h |HDBM:ignore:%2$s:%1$s|h|cff3588ff[Pizza-Timer von %1$s ignorieren]|r|h"
DBM_PIZZA_CONFIRM_IGNORE = "Willst du wirklich DBM-Timer von %s für diese Session ignorieren?"
DBM_PIZZA_ERROR_USAGE = "Benutzung: /dbm [broadcast] timer <Sekunden> <text>"
DBM_CORE_ERROR_DBMV3_LOADED = "Deadly Boss Mods läuft doppelt, da du DBMv3 und DBMv4 installiert und aktiviert hast!\nKlick auf \"Okay\" um DBMv3 zu deaktivieren und dein Interface neu zu laden.\nAußerdem solltest du deinen AddOn-Ordner aufräumen, indem du alle DBMv3 Mods löschst."
DBM_CORE_MINIMAP_TOOLTIP_HEADER = "Deadly Boss Mods"
DBM_CORE_MINIMAP_TOOLTIP_FOOTER = "Shift+Klick oder Rechtsklick zum Bewegen"
DBM_CORE_RANGECHECK_HEADER = "Abstandscheck (%d m)"
DBM_CORE_RANGECHECK_SETRANGE = "Abstand einstellen"
DBM_CORE_RANGECHECK_SOUNDS = "Sounds"
DBM_CORE_RANGECHECK_SOUND_OPTION_1 = "Sound wenn ein Spieler in Reichweite ist"
DBM_CORE_RANGECHECK_SOUND_OPTION_2 = "Sound wenn mehr als ein Spieler in Reichweite ist"
DBM_CORE_RANGECHECK_SOUND_0 = "Kein Sound"
DBM_CORE_RANGECHECK_SOUND_1 = "Standard-Sound"
DBM_CORE_RANGECHECK_SOUND_2 = "Nerviges Piepsen"
DBM_CORE_RANGECHECK_HIDE = "Verstecken"
DBM_CORE_RANGECHECK_SETRANGE_TO = "%d m"
DBM_CORE_RANGECHECK_LOCK = "Frame sperren"
DBM_CORE_SLASHCMD_HELP = {
"Verfügbare Slash-Commands:",
"/dbm version: führt einen raidweiten Versionscheck durch (alias: ver)",
"/dbm unlock: zeigt einen bewegbaren Timer an (alias: move)",
"/dbm timer <x> <text>: startet einen <x> Sekunden langen DBM-Timer mit dem Namen <text>",
"/dbm broadcast timer <x> <text>: schickt einen <x> Sekunden langen DBM-Timer mit dem Namen <text> an den Raid (benötigt (A) oder (L))",
"/dbm break <min>: startet einen Pause-Timer für <min> Minuten. Schickt allen Raidmitgliedern mit DBM einen Pause-Timer (benötigt (A) oder (L)).",
"/dbm help: zeigt diese Hilfe",
}
DBM_ERROR_NO_PERMISSION = "Du hast nicht die benötigte Berechtigung für diesen Befehl!"
DBM_CORE_BOSSHEALTH_HIDE_FRAME = "Verstecken"
DBM_CORE_ALLIANCE = "Allianz"
DBM_CORE_HORDE = "Horde"
DBM_CORE_UNKNOWN = "unbekannt"
DBM_CORE_BREAK_START = "Pause startet jetzt -- du hast %s Minute(n)!"
DBM_CORE_BREAK_MIN = "Pause endet in %s Minute(n)!"
DBM_CORE_BREAK_SEC = "Pause endet in %s Sekunden!"
DBM_CORE_TIMER_BREAK = "Pause"
DBM_CORE_ANNOUNCE_BREAK_OVER = "Pause vorbei"
DBM_CORE_TIMER_PULL = "Pull in"
DBM_CORE_ANNOUNCE_PULL = "Pull in %d Sek"
DBM_CORE_ANNOUNCE_PULL_NOW = "Pull jetzt!"
DBM_CORE_ACHIEVEMENT_TIMER_SPEED_KILL = "Speed-Kill"
-- Auto-generated Timer Localizations
-- Auto-generated Timer Localizations
DBM_CORE_AUTO_TIMER_TEXTS = {
target = "%s: %%s",
cast = "%s",
active = "%s",
cd = "%s CD",
next = "Nächster %s",
achievement = "%s",
}
DBM_CORE_AUTO_TIMER_OPTIONS = {
target = "Debufftimer für |cff71d5ff|Hspell:%d|h%s|h|r anzeigen",
cast = "Casttimer für |cff71d5ff|Hspell:%d|h%s|h|r anzeigen",
active = "Timer während |cff71d5ff|Hspell:%d|h%s|h|r aktiv ist anzeigen",
cd = "Cooldowntimer für |cff71d5ff|Hspell:%d|h%s|h|r anzeigen",
next = "Timer für nächstes |cff71d5ff|Hspell:%d|h%s|h|r anzeigen",
achievement = "Timer für %s anzeigen",
}
-- Auto-generated Warning Localizations
DBM_CORE_AUTO_ANNOUNCE_TEXTS = {
target = "%s auf >%%s<",
spell = "%s",
cast = "%s in %.1f Sek",
soon = "%s bald",
prewarn = "%s in %s",
phase = "Phase %d",
}
local prewarnOption = "Zeige Vorwarnung für |cff71d5ff|Hspell:%d|h%s|h|r"
DBM_CORE_AUTO_ANNOUNCE_OPTIONS = {
target = "Ziel von |cff71d5ff|Hspell:%d|h%s|h|r ansagen",
spell = "Zeige Warnung für |cff71d5ff|Hspell:%d|h%s|h|r",
cast = "Zeige Warnung wenn |cff71d5ff|Hspell:%d|h%s|h|r gezaubert wird",
soon = prewarnOption,
prewarn = prewarnOption,
phase = "Zeige Warnung für Phase %d"
}
-- Auto-generated Special Warning Localizations
DBM_CORE_AUTO_SPEC_WARN_OPTIONS = {
spell = "Zeige Spezialwarnung für $spell:%d",
dispel = "Zeige Spezialwarnung zum Reinigen/Rauben von \n $spell:%d",
interupt = "Zeige Spezialwarnung zum Unterbrechen von $spell:%d",
you = "Zeige Spezialwarnung wenn du von \n $spell:%d betroffen bist",
target = "Zeige Spezialwarnung wenn jemand von \n $spell:%d betroffen ist",
close = "Zeige Spezialwarnung wenn jemand in deiner Nähe von \n $spell:%d betroffen ist",
move = "Zeige Spezialwarnung wenn du von \n $spell:%d betroffen bist",
run = "Zeige Spezialwarnung für $spell:%d",
cast = "Zeige Spezialwarnung für Zaubern von $spell:%d",
stack = "Zeige Spezialwarnung für >=%d Stacks von \n $spell:%d"
}
DBM_CORE_AUTO_SPEC_WARN_TEXTS = {
spell = "%s!",
dispel = "%s auf %%s - jetzt reinigen",
interupt = "%s - jetzt unterbrechen",
you = "%s auf dir",
target = "%s auf %%s",
close = "%s auf %%s in deiner Nähe",
move = "%s - geh weg",
run = "%s - lauf weg",
cast = "%s - stoppe Zauber",
stack = "%s (%%d)"
}
DBM_CORE_AUTO_ICONS_OPTION_TEXT = "Setze Zeichen auf Ziele von $spell:%d"
DBM_CORE_AUTO_SOUND_OPTION_TEXT = "Spiele Sound bei $spell:%d"
-- New special warnings
DBM_CORE_MOVE_SPECIAL_WARNING_BAR = "Spezialwarnung beweglich"
DBM_CORE_MOVE_SPECIAL_WARNING_TEXT = "Spezialwarnung"
DBM_CORE_RANGE_CHECK_ZONE_UNSUPPORTED = "Eine %d-m-Abstacksprüfung wird in dieser Zone nicht unterstützt.\nUnterstützte Abstände sind 10, 11, 15 und 28 m."
DBM_ARROW_MOVABLE = "Pfeil beweglich"
DBM_ARROW_NO_RAIDGROUP = "Diese Funktion steht nur in Schlachtzügen und innerhalb von Instanzen zu Verfügung."
DBM_ARROW_ERROR_USAGE = {
"Benutzung von DBM-Arrow:",
"/dbm arrow <x> <y> erzeugt einen Pfeil, der auf bestimmte Koordinaten zeigt (0 < x/y < 100)",
"/dbm arrow <player> erzeugt einen Pfeil, der auf einen bestimmten Spieler in deiner Gruppe oder deinem Schlachtzug zeigt",
"/dbm arrow hide versteckt den Pfeil",
"/dbm arrow move macht den Pfeil beweglich",
}
+221
View File
@@ -0,0 +1,221 @@
DBM_CORE_NEED_SUPPORT = "Are you good with programming or languages? If yes, the DBM team needs your help to keep DBM the best boss mod for WoW. Join the team by visiting https://discord.gg/4ZHfgskSvM or sending a message to Szyler on Discord or on Area52."
DBM_CORE_LOAD_MOD_ERROR = "Error while loading boss mods for %s: %s"
DBM_CORE_LOAD_MOD_SUCCESS = "Loaded '%s' boss mods. For more options, type /dbm in your chat."
DBM_CORE_LOAD_GUI_ERROR = "Could not load GUI: %s"
DBM_CORE_COMBAT_STARTED = "%s engaged. Good luck and have fun! :)";
DBM_CORE_BOSS_DOWN = "%s down after %s!"
DBM_CORE_BOSS_DOWN_LONG = "%s down after %s! Your last kill took %s and your fastest kill took %s."
DBM_CORE_BOSS_DOWN_NEW_RECORD = "%s down after %s! This is a new record! (Old record was %s)"
DBM_CORE_COMBAT_ENDED = "Combat against %s ended after %s."
DBM_CORE_TIMER_FORMAT_SECS = "%d |4second:seconds;"
DBM_CORE_TIMER_FORMAT_MINS = "%d |4minute:minutes;"
DBM_CORE_TIMER_FORMAT = "%d |4minute:minutes; and %d |4second:seconds;"
DBM_CORE_MIN = "min"
DBM_CORE_MIN_FMT = "%d min"
DBM_CORE_SEC = "sec"
DBM_CORE_SEC_FMT = "%d sec"
DBM_CORE_DEAD = "dead"
DBM_CORE_OK = "Okay"
DBM_CORE_GENERIC_WARNING_BERSERK = "Berserk in %s %s"
DBM_CORE_GENERIC_TIMER_BERSERK = "Berserk"
DBM_CORE_OPTION_TIMER_BERSERK = "Show timer for $spell:26662"
DBM_CORE_OPTION_TIMER_BERSERK_CUSTOM = "Show timer for |cff71d5ff|Hspell:%d|h%s|h|r"
DBM_CORE_OPTION_HEALTH_FRAME = "Show boss health frame"
DBM_CORE_OPTION_CATEGORY_TIMERS = "Bars"
DBM_CORE_OPTION_CATEGORY_WARNINGS = "Announces"
DBM_CORE_OPTION_CATEGORY_MISC = "Miscellaneous"
DBM_CORE_AUTO_RESPONDED = "Auto-responded."
DBM_CORE_STATUS_WHISPER = "%s: %s, %d/%d people alive"
DBM_CORE_AUTO_RESPOND_WHISPER = "%s is busy fighting against %s (%s, %d/%d people alive)"
DBM_CORE_WHISPER_COMBAT_END_KILL = "%s has defeated %s!"
DBM_CORE_WHISPER_COMBAT_END_WIPE = "%s has wiped on %s"
DBM_CORE_VERSIONCHECK_HEADER = "Deadly Boss Mods - Versions"
DBM_CORE_VERSIONCHECK_ENTRY = "%s: %s (r%d)"
DBM_CORE_VERSIONCHECK_ENTRY_NO_DBM = "%s: DBM not installed"
DBM_CORE_VERSIONCHECK_FOOTER = "Found %d players with Deadly Boss Mods"
DBM_CORE_YOUR_VERSION_OUTDATED = "Your version of Deadly Boss Mods is out-of-date. Please visit https://discord.gg/4ZHfgskSvM to get the latest version."
DBM_CORE_UPDATEREMINDER_HEADER = "Your version of Deadly Boss Mods is out-of-date.\n Version %s (r%d) is available for download here:"
DBM_CORE_UPDATEREMINDER_FOOTER = "Press Ctrl-C to copy the download link to your clipboard."
DBM_CORE_UPDATEREMINDER_NOTAGAIN = "Show popup when a new version is available"
DBM_CORE_MOVABLE_BAR = "Drag me!"
DBM_PIZZA_SYNC_INFO = "|Hplayer:%1$s|h[%1$s]|h sent you a DBM timer: '%2$s'\n|HDBM:cancel:%2$s:nil|h|cff3588ff[Cancel this timer]|r|h |HDBM:ignore:%2$s:%1$s|h|cff3588ff[Ignore timers from %1$s]|r|h"
DBM_PIZZA_CONFIRM_IGNORE = "Do you really want to ignore DBM timers from %s for this session?"
DBM_PIZZA_ERROR_USAGE = "Usage: /dbm [broadcast] timer <time> <text>"
DBM_CORE_ERROR_DBMV3_LOADED = "Deadly Boss Mods is running twice because you have DBMv3 and DBMv4 installed and enabled!\nClick \"Okay\" to disable DBMv3 and reload your interface.\nYou should also clean up your AddOns folder by deleting the old DBMv3 folders."
DBM_CORE_MINIMAP_TOOLTIP_HEADER = "Deadly Boss Mods"
DBM_CORE_MINIMAP_TOOLTIP_FOOTER = "Shift+click or right-click to move\nAlt+shift+click for free drag and drop"
DBM_CORE_RANGECHECK_HEADER = "Range Check (%d yd)"
DBM_CORE_RANGECHECK_SETRANGE = "Set range"
DBM_CORE_RANGECHECK_SOUNDS = "Sounds"
DBM_CORE_RANGECHECK_SOUND_OPTION_1 = "Sound when one player is in range"
DBM_CORE_RANGECHECK_SOUND_OPTION_2 = "Sound when more than one player is in range"
DBM_CORE_RANGECHECK_SOUND_0 = "No sound"
DBM_CORE_RANGECHECK_SOUND_1 = "Default sound"
DBM_CORE_RANGECHECK_SOUND_2 = "Annoying beep"
DBM_CORE_RANGECHECK_HIDE = "Hide"
DBM_CORE_RANGECHECK_SETRANGE_TO = "%d yd"
DBM_CORE_RANGECHECK_LOCK = "Lock frame"
DBM_LFG_INVITE = "LFG Invite"
DBM_CORE_SLASHCMD_HELP = {
"Available slash commands:",
"/dbm version: Performs a raid-wide version check (alias: ver).",
"/dbm unlock: Shows a movable status bar timer (alias: move).",
"/dbm timer <x> <text>: Starts a <x> second DBM Timer with the name <text>.",
"/dbm broadcast timer <x> <text>: Broadcasts a <x> second DBM Timer with the name <text> to the raid (requires leader/promoted status).",
"/dbm break <min>: Starts a break timer for <min> minutes. Gives all raid members with DBM a break timer (requires leader/promoted status).",
"/dbm help: Shows slash command descriptions",
}
DBM_ERROR_NO_PERMISSION = "You don't have the required permission to do this."
DBM_CORE_BOSSHEALTH_HIDE_FRAME = "Close health frame"
DBM_CORE_ALLIANCE = "Alliance"
DBM_CORE_HORDE = "Horde"
DBM_CORE_UNKNOWN = "unknown"
DBM_CORE_BREAK_START = "Break starting now -- you have %s minute(s)!"
DBM_CORE_BREAK_MIN = "Break ends in %s minute(s)!"
DBM_CORE_BREAK_SEC = "Break ends in %s seconds!"
DBM_CORE_TIMER_BREAK = "Break time!"
DBM_CORE_ANNOUNCE_BREAK_OVER = "Break time is over"
DBM_CORE_TIMER_PULL = "Pull in"
DBM_CORE_ANNOUNCE_PULL = "Pull in %d sec"
DBM_CORE_ANNOUNCE_PULL_NOW = "Pull now!"
DBM_CORE_ANNOUNCE_PULL_CANCEL = "Pull timer canceled!"
DBM_CORE_ACHIEVEMENT_TIMER_SPEED_KILL = "Speed Kill"
-- Auto-generated Timer Localizations
DBM_CORE_AUTO_TIMER_TEXTS = {
target = "%s: %%s",
cast = "%s",
active = "%s",
cd = "%s CD",
next = "Next %s",
achievement = "%s",
phase = "Phase %s",
}
DBM_CORE_AUTO_TIMER_OPTIONS = {
target = "Show timer for |cff71d5ff|Hspell:%d|h%s|h|r debuff",
cast = "Show timer for |cff71d5ff|Hspell:%d|h%s|h|r cast",
active = "Show timer for |cff71d5ff|Hspell:%d|h%s|h|r duration",
cd = "Show timer for |cff71d5ff|Hspell:%d|h%s|h|r cooldown",
next = "Show timer for next |cff71d5ff|Hspell:%d|h%s|h|r",
achievement = "Show timer for %s",
phase = "Show timer for phase |cff71d5ff|Hspell:%d|h%s|h|r",
}
-- Auto-generated Warning Localizations
DBM_CORE_AUTO_ANNOUNCE_TEXTS = {
target = "%s on >%%s<",
spell = "%s",
cast = "Casting %s: %.1f sec",
soon = "%s soon",
prewarn = "%s in %s",
phase = "Phase %d",
interrupt = "Interrupt %d",
}
local prewarnOption = "Show pre-warning for |cff71d5ff|Hspell:%d|h%s|h|r"
DBM_CORE_AUTO_ANNOUNCE_OPTIONS = {
target = "Announce |cff71d5ff|Hspell:%d|h%s|h|r targets",
spell = "Show warning for |cff71d5ff|Hspell:%d|h%s|h|r",
cast = "Show warning when |cff71d5ff|Hspell:%d|h%s|h|r is being cast",
soon = prewarnOption,
prewarn = prewarnOption,
phase = "Announce Phase %d",
interrupt = "Show warning for when to interrupt %d"
}
-- Auto-generated Special Warning Localizations
DBM_CORE_AUTO_SPEC_WARN_OPTIONS = {
spell = "Show special warning for $spell:%d",
dispel = "Show special warning to dispel/spellsteal \n $spell:%d",
interupt = "Show special warning to interupt $spell:%d",
you = "Show special warning when you are affected by \n $spell:%d",
target = "Show special warning when someone is affected by \n $spell:%d",
close = "Show special warning when someone close to you is \n affected by $spell:%d",
move = "Show special warning when you are affected by \n $spell:%d",
run = "Show special warning for $spell:%d",
cast = "Show special warning for $spell:%d cast",
stack = "Show special warning for >=%d stacks of \n $spell:%d"
}
DBM_CORE_AUTO_SPEC_WARN_TEXTS = {
spell = "%s!",
dispel = "%s on %%s - dispel now",
interupt = "%s - interupt now",
you = "%s on you",
target = "%s on %%s",
close = "%s on %%s near you",
move = "%s - move away",
run = "%s - run away",
cast = "%s - stop casting",
stack = "%s (%%d)"
}
DBM_CORE_AUTO_YELL_OPTION = {
shortyell = "Yell when you are affected by $spell:%d",
yell = "Yell with name when you are affected \n by $spell:%d",
count = "Yell with count when you are affected\n by $spell:%d",
fade = "Yell with countdown and spell name \n when $spell:%d is fading",
shortfade = "Yell with countdown when $spell:%d \n is fading",
iconfade = "Yell with countdown and icon when \n $spell:%d is fading",
position = "Yell with position when you are affected \n by $spell:%d",
combo = "Yell when you are affected by $spell:%d \n and other spells at same time"
}
DBM_CORE_AUTO_YELL_ANNOUNCE_TEXT = {
shortyell = "%s",
yell = "%s on " .. UnitName("player"),
count = "%s on " .. UnitName("player") .. " (%%d)",
fade = "%s fading in %%d",
shortfade = "%%d",
iconfade = "{rt%%2$d} %%1$d {rt%%2$d}",
position = "%s %%s on {rt%%d}"..UnitName("player").."{rt%%d}",
combo = "%s and %%s"--Spell name (from option, plus spellname given in arg)
}
DBM_CORE_AUTO_ICONS_OPTION_TEXT = "Set icons on $spell:%d targets"
DBM_CORE_AUTO_SOUND_OPTION_TEXT = "Play sound on $spell:%d"
-- New special warnings
DBM_CORE_MOVE_SPECIAL_WARNING_BAR = "Special warning movable"
DBM_CORE_MOVE_SPECIAL_WARNING_TEXT = "Special Warning"
DBM_CORE_RANGE_CHECK_ZONE_UNSUPPORTED = "A %d yard range check is not supported in this zone.\nSupported ranges are 10, 11, 15 and 28 yard."
DBM_ARROW_MOVABLE = "Arrow movable"
DBM_ARROW_NO_RAIDGROUP = "This function only works in raid groups and within raid instances."
DBM_ARROW_ERROR_USAGE = {
"DBM-Arrow usage:",
"/dbm arrow <x> <y> creates an arrow that points to a specific locataion (0 < x/y < 100)",
"/dbm arrow <player> creates and arrow that points to a specific player in your party or raid",
"/dbm arrow hide hides the arrow",
"/dbm arrow move makes the arrow movable",
}
+194
View File
@@ -0,0 +1,194 @@
if GetLocale() ~= "esES" and GetLocale() ~= "esMX" then return end
DBM_CORE_NEED_SUPPORT = "¡Ey! ¿Eres un programador o eres bueno con los idiomas? Si es así, el Equipo DBM necesita tu ayuda para mantener el DBM como el mejor BossMod del WoW. Únete al equipo haciendo click en www.deadlybossmods.com o enviando un mensaje a tandanu@deadlybossmods.com o nitram@deadlybossmods.com."
DBM_CORE_LOAD_MOD_ERROR = "Error al cargar modulo %s: %s"
DBM_CORE_LOAD_MOD_SUCCESS = "Cargado modulo de '%s' !"
DBM_CORE_LOAD_GUI_ERROR = "No se puede cargar la GUI: %s"
DBM_CORE_COMBAT_STARTED = "%s llamado. Buena suerte y diviertase! :)";
DBM_CORE_BOSS_DOWN = "%s murio en %s!"
DBM_CORE_BOSS_DOWN_LONG = "%s murio en %s! Su muerte reciente fue %s y la muerte mas rapida fue %s."
DBM_CORE_BOSS_DOWN_NEW_RECORD = "%s murio en %s! Es un nuevo record! (el antiguo era %s)"
DBM_CORE_COMBAT_ENDED = "El combate contra %s termino en %s."
DBM_CORE_TIMER_FORMAT_SECS = "%d |4segundo:segundos;"
DBM_CORE_TIMER_FORMAT_MINS = "%d |4minuto:minutos;"
DBM_CORE_TIMER_FORMAT = "%d |4minuto:minutos; y %d |4segundo:segundos;"
DBM_CORE_MIN = "min"
DBM_CORE_MIN_FMT = "%d min"
DBM_CORE_SEC = "seg"
DBM_CORE_SEC_FMT = "%d sec"
DBM_CORE_DEAD = "muerto"
DBM_CORE_OK = "Aceptar"
DBM_CORE_GENERIC_WARNING_BERSERK = "Enrage en %s %s"
DBM_CORE_GENERIC_TIMER_BERSERK = "Enrage"
DBM_CORE_OPTION_TIMER_BERSERK = "Mostrar tiempo para Enrage"
DBM_CORE_OPTION_HEALTH_FRAME = "Mostrar barra de vida del boss"
DBM_CORE_OPTION_CATEGORY_TIMERS = "Barras"
DBM_CORE_OPTION_CATEGORY_WARNINGS = "Anuncios"
DBM_CORE_OPTION_CATEGORY_MISC = "Miscelaneo"
DBM_CORE_AUTO_RESPONDED = "Auto-respusta."
DBM_CORE_STATUS_WHISPER = "%s: %s, %d/%d gete viva"
DBM_CORE_AUTO_RESPOND_WHISPER = "%s esta ocupado en la batalla contra %s (%s, %d/%d gente viva)"
DBM_CORE_WHISPER_COMBAT_END_KILL = "%s ha derrotado a %s!"
DBM_CORE_WHISPER_COMBAT_END_WIPE = "%s ha wipeado en %s"
DBM_CORE_VERSIONCHECK_HEADER = "Deadly Boss Mods - Version"
DBM_CORE_VERSIONCHECK_ENTRY = "%s: %s (r%d)"
DBM_CORE_VERSIONCHECK_ENTRY_NO_DBM = "%s: DBM no instalado"
DBM_CORE_VERSIONCHECK_FOOTER = "Encontrados %d jugadores con Deadly Boss Mods"
DBM_CORE_YOUR_VERSION_OUTDATED = "¡Tu versión de Deadly Boss Mods es antigua! Por favor, visita www.deadlybossmods.com para bajarte la última versión."
DBM_CORE_UPDATEREMINDER_HEADER = "La version de tu Deadly Boss Mods es antigua.\n Version %s (r%d) disponible para descargar aqui:"
DBM_CORE_UPDATEREMINDER_FOOTER = "Presiona Contro+C para copiar el link de la descarga."
DBM_CORE_UPDATEREMINDER_NOTAGAIN = "Mostrar popup si hay nueva version de Deadly Boss Mods"
DBM_CORE_MOVABLE_BAR = "¡Muéveme!"
DBM_PIZZA_SYNC_INFO = "|Hplayer:%1$s|h[%1$s]|h envia tu tiempo: '%2$s'\n|HDBM:cancel:%2$s:nil|h|cff3588ff[Cancelar este tiempo]|r|h |HDBM:ignore:%2$s:%1$s|h|cff3588ff[Ignorar tiempos de %1$s]|r|h"
DBM_PIZZA_CONFIRM_IGNORE = "¿De verdad quieres ignorar los tiempos de %s para esta sesion?"
DBM_PIZZA_ERROR_USAGE = "Usa: /dbm [broadcast] timer <time> <text>"
DBM_CORE_ERROR_DBMV3_LOADED = "Deadly Boss Mods is running twice because you have DBMv3 and DBMv4 installed and enabled!\nClick \"Okay\" to disable DBMv3 and reload your interface.\nYou should also clean up your AddOns folder by deleting the old DBMv3 folders."
DBM_CORE_MINIMAP_TOOLTIP_HEADER = "DBM-Español"
DBM_CORE_MINIMAP_TOOLTIP_FOOTER = "Mayus+Raton1 o Raton2 para mover\nAlt+Mayus+Raton1 para moverlo a donde quieras"
DBM_CORE_RANGECHECK_HEADER = "Comprobacion de Rango (%d yd)"
DBM_CORE_RANGECHECK_SETRANGE = "Ajustar Rango"
DBM_CORE_RANGECHECK_SOUNDS = "Sonidos"
DBM_CORE_RANGECHECK_SOUND_OPTION_1 = "Sonido si una persona esta a rango"
DBM_CORE_RANGECHECK_SOUND_OPTION_2 = "Sonido si mas de una persona estan a rango"
DBM_CORE_RANGECHECK_SOUND_0 = "Sin sonido"
DBM_CORE_RANGECHECK_SOUND_1 = "Sonido por defecto"
DBM_CORE_RANGECHECK_SOUND_2 = "Sonido de despertador"
DBM_CORE_RANGECHECK_HIDE = "Esconder"
DBM_CORE_RANGECHECK_SETRANGE_TO = "%d yd"
DBM_CORE_RANGECHECK_LOCK = "Bloquear ventana"
DBM_LFG_INVITE = "Invitación al grupo"
DBM_CORE_SLASHCMD_HELP = {
"Comandos disponibles:",
"/dbm version: comprueba la versión de DBM de toda la banda (alias: ver)",
"/dbm unlock: muestra una barra de estado desplazable (alias: move)",
"/dbm timer <x> <text>: Muestra un contador de <x> segundos con el nombre <text>",
"/dbm broadcast timer <x> <text>: Muestra un contador de <x> segundos con el nombre <text> a la banda (requiere lider/ayudante)",
"/dbm break <min>: Empieza un descanso de <min> minutos. Muestra a todos los miembros de banda con DBM un contador de descanso (requiere lider/ayudante).",
"/dbm help: muestra esta ayuda",
}
DBM_ERROR_NO_PERMISSION = "No tienes permiso para hacer eso."
DBM_CORE_BOSSHEALTH_HIDE_FRAME = "Esconder"
DBM_CORE_ALLIANCE = "Alianza"
DBM_CORE_HORDE = "Horda"
DBM_CORE_UNKNOWN = "desconocido"
DBM_CORE_BREAK_START = "¡El descanso empieza ahora -- tienes %s minuto(s)!"
DBM_CORE_BREAK_MIN = "¡El descanso acaba en %s minuto(s)!"
DBM_CORE_BREAK_SEC = "¡El descanso acaba en %s segundos!"
DBM_CORE_TIMER_BREAK = "¡Descanso!"
DBM_CORE_ANNOUNCE_BREAK_OVER = "El descanso terminó"
DBM_CORE_TIMER_PULL = "Pull en"
DBM_CORE_ANNOUNCE_PULL = "Pull en %d seg"
DBM_CORE_ANNOUNCE_PULL_NOW = "Pull ahora!"
DBM_CORE_ACHIEVEMENT_TIMER_SPEED_KILL = "Matar rapido"
-- Auto-generated Timer Localizations
DBM_CORE_AUTO_TIMER_TEXTS = {
target = "%s: %%s",
cast = "%s",
active = "%s",
cd = "%s CD",
next = "Siguiente %s",
achievement = "%s",
}
DBM_CORE_AUTO_TIMER_OPTIONS = {
target = "Mostrar tiempo de debuff |cff71d5ff|Hspell:%d|h%s|h|r ",
cast = "Mostrar tiempo de cast de |cff71d5ff|Hspell:%d|h%s|h|r ",
active = "Mostrar duración de |cff71d5ff|Hspell:%d|h%s|h|r ",
cd = "Mostrar CD de |cff71d5ff|Hspell:%d|h%s|h|r ",
next = "Mostrar tiempo para el siguiente |cff71d5ff|Hspell:%d|h%s|h|r ",
achievement = "Mostrar tiempo para %s",
}
-- Auto-generated Warning Localizations
DBM_CORE_AUTO_ANNOUNCE_TEXTS = {
target = "%s en >%%s<",
spell = "%s",
cast = "Casteando %s: %.1f seg",
soon = "%s pronto",
prewarn = "%s en %s",
phase = "Fase %d",
}
local prewarnOption = "Mostrar una pre-alerta para |cff71d5ff|Hspell:%d|h%s|h|r"
DBM_CORE_AUTO_ANNOUNCE_OPTIONS = {
target = "Anunciar objetivo de |cff71d5ff|Hspell:%d|h%s|h|r",
spell = "Mostrar aviso para |cff71d5ff|Hspell:%d|h%s|h|r",
cast = "Mostrar aviso cuando castee |cff71d5ff|Hspell:%d|h%s|h|r",
soon = "Mostrar pre-aviso para |cff71d5ff|Hspell:%d|h%s|h|r",
prewarn = "Mostrar pre-aviso para |cff71d5ff|Hspell:%d|h%s|h|r",
phase = "Mostrar aviso para fase %d",
}
-- Auto-generated Special Warning Localizations
DBM_CORE_AUTO_SPEC_WARN_OPTIONS = {
spell = "Mostrar aviso especial para $spell:%d",
dispel = "Mostrar aviso especial para dispelear/robar hechizo \n $spell:%d",
interupt= "Mostrar aviso especial para interrumpir $spell:%d",
you = "Mostrar aviso especial cuando te afecta \n $spell:%d",
target = "Mostrar aviso especial cuando a alguien le afecta \n $spell:%d",
close = "Mostrar aviso especial cuando a alguien cerca de ti \n le afecta $spell:%d",
move = "Mostrar aviso especial cuando te afecta \n $spell:%d",
run = "Mostrar aviso especial para $spell:%d",
cast = "Mostrar aviso especial para casteo de $spell:%d",
stack = "Mostrar aviso especial cuando tienes >=%d marcas de \n $spell:%d"
}
DBM_CORE_AUTO_SPEC_WARN_TEXTS = {
spell = "%s",
dispel = "%s ¡dispelea ahora!",
interupt = "%s ¡interrumpe ahora!",
you = "%s en ti!",
target = "%s en %%s",
close = "%s en %%s cerca de ti",
move = "%s ¡muévete!",
run = "%s ¡corre!",
cast = "%s ¡para de castear!",
stack = "%s (%%d)"
}
DBM_CORE_AUTO_ICONS_OPTION_TEXT = "Poner iconos en objetivos de $spell:%d"
DBM_CORE_AUTO_SOUND_OPTION_TEXT = "Reproducir sonido en $spell:%d"
-- New special warnings
DBM_CORE_MOVE_SPECIAL_WARNING_BAR = "Aviso especial desplazable"
DBM_CORE_MOVE_SPECIAL_WARNING_TEXT = "Aviso especial"
DBM_CORE_RANGE_CHECK_ZONE_UNSUPPORTED = "La comprobación de rango de %d yardas no está disponible en esta zona.\nLos rangos disponibles son 10, 11, 15 y 28 yardas."
DBM_ARROW_MOVABLE = "Flecha movible"
DBM_ARROW_NO_RAIDGROUP = "Esta funcionalidad solo puede usarse en grupos de banda o en estancias de banda."
DBM_ARROW_ERROR_USAGE = {
"Uso de DBM-Arrow:",
"/dbm arrow <x> <y>: Crea una flecha que apunta a una dirección específica (0 < x/y < 100)",
"/dbm arrow <jugador>: Crea una flecha que apunta a un miembro específico de la banda",
"/dbm arrow hide: Oculta la flecha",
"/dbm arrow move: Hace la flecha movible",
}
+194
View File
@@ -0,0 +1,194 @@
if GetLocale() ~= "frFR" then return end
DBM_CORE_LOAD_MOD_ERROR = "Erreur durant le chargement du boss mod pour %s: %s"
DBM_CORE_LOAD_MOD_SUCCESS = "Boss mod pour '%s' chargé!"
DBM_CORE_LOAD_GUI_ERROR = "Ne peut charger le GUI: %s"
DBM_CORE_COMBAT_STARTED = "%s engagé. Bonne chance et amusez-vous bien ! :)";
DBM_CORE_BOSS_DOWN = "%s est mort après %s!"
DBM_CORE_BOSS_DOWN_LONG = "%s est mort après %s! Votre dernier down a durée %s et le plus rapide a duré %s."
DBM_CORE_BOSS_DOWN_NEW_RECORD = "%s est mort après %s! C'est un nouveau record! (l'ancien record était de %s)"
DBM_CORE_COMBAT_ENDED = "Combat contre %s terminé après %s."
DBM_CORE_TIMER_FORMAT_SECS = "%d |4seconde:secondes;"
DBM_CORE_TIMER_FORMAT_MINS = "%d |4minute:minutes;"
DBM_CORE_TIMER_FORMAT = "%d |4minute:minutes; et %d |4seconde:secondes;"
DBM_CORE_MIN = "min"
DBM_CORE_MIN_FMT = "%d min"
DBM_CORE_SEC = "sec"
DBM_CORE_SEC_FMT = "%d sec"
DBM_CORE_DEAD = "mort"
DBM_CORE_OK = "Okay"
DBM_CORE_GENERIC_WARNING_BERSERK = "Frénésie dans %s %s"
DBM_CORE_GENERIC_TIMER_BERSERK = "Frénésie"
DBM_CORE_OPTION_TIMER_BERSERK = "Afficher le timer pour la Frénésie"
DBM_CORE_OPTION_HEALTH_FRAME = "Afficher la fenêtre de vie du Boss"
DBM_CORE_OPTION_CATEGORY_TIMERS = "Barres"
DBM_CORE_OPTION_CATEGORY_WARNINGS = "Annonces"
DBM_CORE_OPTION_CATEGORY_MISC = "Divers"
DBM_CORE_AUTO_RESPONDED = "Réponse automatique."
DBM_CORE_STATUS_WHISPER = "%s: %s, %d/%d personnes en vie"
DBM_CORE_AUTO_RESPOND_WHISPER = "%s est occupé(e) à combattre contre %s (%s, %d/%d personnes en vie)"
DBM_CORE_WHISPER_COMBAT_END_KILL = "%s a vaincu %s !"
DBM_CORE_WHISPER_COMBAT_END_WIPE = "%s a wip sur %s"
DBM_CORE_VERSIONCHECK_HEADER = "Deadly Boss Mods - Versions"
DBM_CORE_VERSIONCHECK_ENTRY = "%s: %s (r%d)"
DBM_CORE_VERSIONCHECK_ENTRY_NO_DBM = "%s: DBM non installé"
DBM_CORE_VERSIONCHECK_FOOTER = "a trouvé %d joueurs avec Deadly Boss Mods"
DBM_CORE_YOUR_VERSION_OUTDATED = "Votre version de Deadly Boss Mods est périmé! Merci de visiter www.deadlybossmods.com pour avoir la dernière version."
DBM_CORE_DISABLED_ICON_FUNCTION = "Votre version ne peut pas mettre les icones, car votre version est périmé. Merci de la mettre a jour dès que possible et réactiver la fonction icone."
DBM_CORE_UPDATEREMINDER_HEADER = "Votre version de Deadly Boss Mods est périmée.\n Version %s (r%d) disponible ici:"
DBM_CORE_UPDATEREMINDER_FOOTER = "Faites Ctrl-C pour copier le lien votre presse-papier."
DBM_CORE_UPDATEREMINDER_NOTAGAIN = "Montre une annonce quand une nouvelle version de DBM est disponible."
DBM_CORE_MOVABLE_BAR = "Déplace-moi!"
DBM_PIZZA_SYNC_INFO = "|Hplayer:%1$s|h[%1$s]|h vous envoie un timer pizza: '%2$s'\n|HDBM:annuler:%2$s:nil|h|cff3588ff[Annuler ce timer]|r|h |HDBM:ignorer:%2$s:%1$s|h|cff3588ff[Ignorer les timers de %1$s]|r|h"
DBM_PIZZA_CONFIRM_IGNORE = "Voulez vous vraiment ignorer les timers pizza de %s pour cette session?"
DBM_PIZZA_ERROR_USAGE = "Usage: /dbm [broadcast] timer <time> <text>"
DBM_CORE_ERROR_DBMV3_LOADED = "Deadly Boss Mods est lancé en double car vous avez DBMv3 et DBMv4 d'installé et d'activé!\nCliquez sur \"Okay\" pour désactiver DBMv3 et recharger votre interfarce.\nVous pouvez aussi nettoyer votre fichier AddOns en supprimant l'ancien fichier DBMv3."
DBM_CORE_MINIMAP_TOOLTIP_HEADER = "Deadly Boss Mods"
DBM_CORE_MINIMAP_TOOLTIP_FOOTER = "Shift+clic ou clic droit pour déplacer\nAlt+shift+click pour drag&drop librement"
DBM_CORE_RANGECHECK_HEADER = "Vérifie la portée (%d m)"
DBM_CORE_RANGECHECK_SETRANGE = "Définir la portée"
DBM_CORE_RANGECHECK_SOUNDS = "Sons"
DBM_CORE_RANGECHECK_SOUND_OPTION_1 = "Joue un son quand un joueur est dans la zone"
DBM_CORE_RANGECHECK_SOUND_OPTION_2 = "Joue un autre son quand plus d'un joueur sont dans la zone"
DBM_CORE_RANGECHECK_SOUND_0 = "Pas de son"
DBM_CORE_RANGECHECK_SOUND_1 = "Son par défaut"
DBM_CORE_RANGECHECK_SOUND_2 = "Son Ennuyeux"
DBM_CORE_RANGECHECK_HIDE = "Cacher"
DBM_CORE_RANGECHECK_SETRANGE_TO = "%d m"
DBM_CORE_RANGECHECK_LOCK = "Verrouiller la fenêtre"
DBM_LFG_INVITE = "LFG Invite"
DBM_CORE_SLASHCMD_HELP = {
"Commandes slash disponible:",
"/dbm version: Vérifie la version du raid (alias: ver)",
"/dbm unlock: Affiche un Timer Status déplacable (alias: move)",
"/dbm timer <x> <text>: Commence un <x> second Timer Pizza avec le nom <text>",
"/dbm broadcast timer <x> <text>: Diffuse un Timer Pizza de <x> secondes avec le nom <text> au raid (Nécessite d'être promu ou leader)",
"/dbm break <min>: Démarre un timer de pause pour <min> minutes. Envoie à tous les membres du raid avec DBM ce timer de pause (Nécessite d'être promu ou leader).",
"/dbm help: Affiche l'aide",
}
DBM_ERROR_NO_PERMISSION = "Vous n'avez pas les permissions requises pour faire ceci."
DBM_CORE_BOSSHEALTH_HIDE_FRAME = "Cacher"
DBM_CORE_ALLIANCE = "Alliance"
DBM_CORE_HORDE = "Horde"
DBM_CORE_UNKNOWN = "Inconnu"
DBM_CORE_BREAK_START = "La pause démarre maintenant -- vous avez %s minute(s)!"
DBM_CORE_BREAK_MIN = "La pause finit dans %s minutes!"
DBM_CORE_BREAK_SEC = "La pause finit dans %s secondes!"
DBM_CORE_TIMER_BREAK = "Break time!"-----
DBM_CORE_ANNOUNCE_BREAK_OVER = "Break time is over"-----
DBM_CORE_TIMER_PULL = "Pull dans"
DBM_CORE_ANNOUNCE_PULL = "Pull dans %d sec"
DBM_CORE_ANNOUNCE_PULL_NOW = "Pull maintenant!"
DBM_CORE_ACHIEVEMENT_TIMER_SPEED_KILL = "Speed Kill"
-- Auto-generated Timer Localizations
DBM_CORE_AUTO_TIMER_TEXTS = {
target = "%s: %%s",
cast = "%s",
active = "%s",
cd = "CD de: %s",
next = "Prochain(e) %s",
achievement = "%s",
combatstart = "Le combat commence",
}
DBM_CORE_AUTO_TIMER_OPTIONS = {
target = "Afficher le temps du debuff pour: |cff71d5ff|Hspell:%d|h%s|h|r",
cast = "Afficher la barre d'incantation pour: |cff71d5ff|Hspell:%d|h%s|h|r",
active = "Afficher le timer pour la fin de: |cff71d5ff|Hspell:%d|h%s|h|r",
cd = "Afficher le cooldown pour: |cff71d5ff|Hspell:%d|h%s|h|r",
next = "Afficher le timer pour le prochain: |cff71d5ff|Hspell:%d|h%s|h|r",
achievement = "Montre le timer pour %s",
combatstart = "Montre le timer pour le début du combat",
}
-- Auto-generated Warning Localizations
DBM_CORE_AUTO_ANNOUNCE_TEXTS = {
target = "%s sur >%%s<",
spell = "%s",
cast = "Cast %s: %.1f sec",
soon = "%s bientôt",
prewarn = "%s dans %s",
phase = "Phase %d",
}
local prewarnOption = "Montre une pré-alerte pour |cff71d5ff|Hspell:%d|h%s|h|r"
DBM_CORE_AUTO_ANNOUNCE_OPTIONS = {
target = "Annonce la cible de |cff71d5ff|Hspell:%d|h%s|h|r",
spell = "Montre une alerte pour |cff71d5ff|Hspell:%d|h%s|h|r",
cast = "Montre une alerte quand |cff71d5ff|Hspell:%d|h%s|h|r est en cours de cast",
soon = "Montre une alerte avant |cff71d5ff|Hspell:%d|h%s|h|r",
prewarn = "Montre une alerte avant |cff71d5ff|Hspell:%d|h%s|h|r",
phase = "Montre une alerte pour la phase %d",
}
-- Auto-generated Special Warning Localizations
DBM_CORE_AUTO_SPEC_WARN_OPTIONS = {
spell = "Afficher lalerte spéciale pour $spell:%d",
dispel = "Afficher lalerte spéciale à dispel/spellsteal \n $spell:%d",
interupt = "Afficher lalerte spéciale interrompre $spell:%d",
you = "Afficher lalerte spéciale lorsque vous êtes affecté par $spell:%d",
target = "Afficher lalerte spéciale quand quelqu'un est touché par $spell:%d",
close = "Afficher lalerte spéciale quand quelqu'un est proche de vous \n affected by $spell:%d",
move = "Afficher lalerte spéciale lorsque vous êtes affecté par $spell:%d",
run = "Afficher lalerte spéciale pour $spell:%d",
cast = "Afficher lalerte spéciale pour $spell:%d cast",
stack = "Afficher lalerte spéciale pour >=%d des piles de \n $spell:%d"
}
DBM_CORE_AUTO_SPEC_WARN_TEXTS = {
spell = "%s!",
dispel = "%s on %%s - dispel maintenant",
interupt = "%s - interrompre maintenant",
you = "%s sur toi",
target = "%s sur %%s",
close = "%s sur %%s près de vous",
move = "%s - bouge vite",
run = "%s - éloigne toi",
cast = "%s - stop cast",
stack = "%s (%%d)"
}
DBM_CORE_AUTO_ICONS_OPTION_TEXT = "Set d'icônes sur $spell:%d en targets"
DBM_CORE_AUTO_SOUND_OPTION_TEXT = "jouer un son sur $spell:%d"
-- New special warnings
DBM_CORE_MOVE_SPECIAL_WARNING_BAR = "Alerte spéciale déplaçable"
DBM_CORE_MOVE_SPECIAL_WARNING_TEXT = "Alerte spéciale"
DBM_CORE_RANGE_CHECK_ZONE_UNSUPPORTED = "Une %d vérification de distance n'est pas supporté dans cette zone.\nLes distances autorisés est 10, 11, 15 et 28 yard."
DBM_ARROW_MOVABLE = "Bouger la Flèche"
DBM_ARROW_ERROR_USAGE = {
"DBM-flèche usage:",
"/dbm flèche <x> <y> crée une flèche qui pointe vers une locataion spécifiques (0 < x/y < 100)",
"/dbm flèche <player> crée une flèche qui pointe vers un joueur précis dans votre groupe ou raid",
"/dbm flèche cache la flèche",
"/dbm flèche fait déplacer",
}
+187
View File
@@ -0,0 +1,187 @@
if (GetLocale() == "koKR") then
DBM_CORE_NEED_SUPPORT = "안녕하세요. DBM Team입니다. 만약 프로그래밍 또는 언어에 대해 잘 아신다면, DBM Team에 어떤 도움이든 주실 수 있습니다. 만약, 한글화 혹은 코드 수정에 관해 건의/수정 사항이 있다면 wow.somegate.com 또는 에이그윈(호드) 흑묘서희에게 연락바랍니다. DBM BossMods Team에 참가하고 싶다면 www.deadlybossmods.com 또는 tandanu@deadlybossmods.com 또는 nitram@deadlybossmods.com에 연락 바랍니다. 물론, 영어를 매우 잘하셔야겠죠?"
DBM_CORE_LOAD_MOD_ERROR = "%s 보스 모드 로딩중 에러 발생: %s"
DBM_CORE_LOAD_MOD_SUCCESS = "'%s' 보스 모드가 로드되었습니다.!"
DBM_CORE_LOAD_GUI_ERROR = "GUI를 로드할 수 없습니다: %s"
DBM_CORE_COMBAT_STARTED = "%s 작동됨. 행운을 빕니다! :)";
DBM_CORE_BOSS_DOWN = "%s (을)를 쓰러트렸습니다. (%s 소요 되었습니다!)"
DBM_CORE_BOSS_DOWN_LONG = "%s (을)를 쓰러트렸습니다. (%s 소요 되었습니다!) 당신의 최종 킬 타임은, %s 입니다. 그리고 당신의 제일 빠른 킬 타임은 %s 입니다.."
DBM_CORE_BOSS_DOWN_NEW_RECORD = "%s (을)를 쓰러뜨렸습니다. (%s 소요 되었습니다!) 이 기록은 새로운 기록이군요! (과거의 기록: %s)"
DBM_CORE_COMBAT_ENDED = "%s 전투가 종료되었습니다. (%s 소요 되었습니다.)"
DBM_CORE_TIMER_FORMAT_SECS = "%d |4초:초;"
DBM_CORE_TIMER_FORMAT_MINS = "%d |4분:분;"
DBM_CORE_TIMER_FORMAT = "%d |4분:분; and %d |4초:초;"
DBM_CORE_MIN = ""
DBM_CORE_MIN_FMT = "%d 분"
DBM_CORE_SEC = ""
DBM_CORE_SEC_FMT = "%d 초"
DBM_CORE_DEAD = "죽음"
DBM_CORE_OK = "수락"
DBM_CORE_GENERIC_WARNING_BERSERK = "%s %s 후에 광폭화"
DBM_CORE_GENERIC_TIMER_BERSERK = "광폭화"
DBM_CORE_OPTION_TIMER_BERSERK = "광폭화 타이머 보기"
DBM_CORE_OPTION_HEALTH_FRAME = "보스 HP 프레임 보기"
DBM_CORE_OPTION_CATEGORY_TIMERS = ""
DBM_CORE_OPTION_CATEGORY_WARNINGS = "알림"
DBM_CORE_OPTION_CATEGORY_MISC = "기타 추가 기능"
DBM_CORE_AUTO_RESPONDED = "자동-부활."
DBM_CORE_STATUS_WHISPER = "%s: %s, %d/%d 공대원이 생존해 있습니다."
DBM_CORE_AUTO_RESPOND_WHISPER = "%s 님은 현재 바쁩니다. %s의 전투가 진행중입니다. (%s, %d/%d 공대원 생존중) 전투가 끝난 후 통보를 받게 될 것입니다."
DBM_CORE_WHISPER_COMBAT_END_KILL = "%s 님이 %s의 전투가 끝났습니다!"
DBM_CORE_WHISPER_COMBAT_END_WIPE = "%s 님이 %s의 전투에서 전멸하였습니다."
DBM_CORE_VERSIONCHECK_HEADER = "죽이는 보스 모드 - 버젼"
DBM_CORE_VERSIONCHECK_ENTRY = "%s: %s (r%d)"
DBM_CORE_VERSIONCHECK_ENTRY_NO_DBM = "%s: 죽이는 보스 모드가 설치 되어있지 않습니다."
DBM_CORE_VERSIONCHECK_FOOTER = "%d 명의 플레이어가 설치되어 있는 것을 찾았습니다."
DBM_CORE_YOUR_VERSION_OUTDATED = "당신의 DBM 버전이 오래되었습니다! www.deadlybossmods.com 또는 wow.somegate.com(korean)에 접속하셔셔 마지막 버전을 다운로드 받으셔요."
DBM_CORE_UPDATEREMINDER_HEADER = "당신의 죽이는 보스 모드 버전이 옛날 버전입니다.\n Version %s (r%d) 가 새로운 버전이며, 최신 버전 위치:"
DBM_CORE_UPDATEREMINDER_FOOTER = "Ctrl-C 를 누르면 클립보드에 복사가 됩니다."
DBM_CORE_UPDATEREMINDER_NOTAGAIN = "새로운 버전이 검색되면 관련 창을 띄웁니다."
DBM_CORE_MOVABLE_BAR = "나를 움직이세요~_~"
DBM_PIZZA_SYNC_INFO = "|Hplayer:%1$s|h[%1$s]|h님이 당신에게 DBM 타이머 보냄: '%2$s'\n|HDBM:cancel:%2$s:nil|h|cff3588ff[타이머 취소]|r|h |HDBM:ignore:%2$s:%1$s|h|cff3588ff[%1$s 타이머 무시]|r|h"
DBM_PIZZA_CONFIRM_IGNORE = "현재 세션에서 %s님이 보낸 DBM 타이머를 무시하도록 하겠습니까?"
DBM_PIZZA_ERROR_USAGE = "사용법: /dbm [broadcast] timer <시간> <글자>"
DBM_CORE_ERROR_DBMV3_LOADED = "Deadly Boss Mods 가 실행중에 있습니다.\n당신께서 DBMv3 와 DBMv4를 동시에 설치하여 이런 상황이 발생한 것 같습니다.\n\"수락\"을 클릭하시면 DBMv3를 차단하고, UI가 다시시작 될 것입니다.\n또한, 애드온 폴더내에 존재하고 있는 DBMv3 폴더를 삭제하시길 권장합니다."
DBM_CORE_MINIMAP_TOOLTIP_HEADER = "죽이는 보스 모드"
DBM_CORE_MINIMAP_TOOLTIP_FOOTER = "Shift+click 또는 right-click 으로 움직이세요.\nAlt+shift+click 으로 움직이면 자유롭게 배치할 수 있습니다."
DBM_CORE_RANGECHECK_HEADER = "거리 체크 (%d m)"
DBM_CORE_RANGECHECK_SETRANGE = "거리 지정"
DBM_CORE_RANGECHECK_SOUNDS = "소리"
DBM_CORE_RANGECHECK_SOUND_OPTION_1 = "거리 이내 1명의 플레이어가 있을 경우의 소리"
DBM_CORE_RANGECHECK_SOUND_OPTION_2 = "1명 이상의 플레이어가 있을 경우의 소리"
DBM_CORE_RANGECHECK_SOUND_0 = "소리 없음"
DBM_CORE_RANGECHECK_SOUND_1 = "기본 소리"
DBM_CORE_RANGECHECK_SOUND_2 = "짜증나는 소리(-_-;)"
DBM_CORE_RANGECHECK_HIDE = "숨기기"
DBM_CORE_RANGECHECK_SETRANGE_TO = "%d m"
DBM_CORE_RANGECHECK_LOCK = "프레임 잠금"
DBM_LFG_INVITE = "던전 입장"
DBM_CORE_SLASHCMD_HELP = {
"사용 가능한 명령어:",
"/dbm version: 공격대 전체 버전 체크 (줄임말: ver)",
"/dbm unlock: 상태 바 타이머를 움직일 수 있도록 보여줍니다.(줄임말: move)",
"/dbm timer <숫자> <글자>: <숫자> 초만큼 진행되는 <글자>바가 생성 됨.",
"/dbm broadcast timer <숫자> <글자>: <숫자> 초만큼 진행되는 <글자>바를 공격대에 알립니다.(공격대 권한이 있을 경우만 작동)",
"/dbm break <min>: <min>분 동안 타이머를 작동합니다. 모든 공격대원에게 DBM이 발송하는 쉬는 시간 타이머를 보냅니다.",
"/dbm help: 현재 보고 있는 도움말.",
}
DBM_ERROR_NO_PERMISSION = "해당 명령어를 실행하기 위한 권한을 가지고 있지 않습니다."
DBM_CORE_BOSSHEALTH_HIDE_FRAME = "보스 체력 프레임 닫기"
DBM_CORE_ALLIANCE = "얼라이언스"
DBM_CORE_HORDE = "호드"
DBM_CORE_UNKNOWN = "알 수 없음"
DBM_CORE_BREAK_START = "쉬는 시간 시작 -- %s 분 남았습니다!"
DBM_CORE_BREAK_MIN = "%s 분 후 쉬는 시간이 끝납니다!"
DBM_CORE_BREAK_SEC = "%s 초 후 쉬는 시간이 끝납니다!"
DBM_CORE_TIMER_BREAK = "쉬는 시간!"
DBM_CORE_ANNOUNCE_BREAK_OVER = "쉬는 시간이 종료되었습니다."
DBM_CORE_TIMER_PULL = "풀링 중 입니다."
DBM_CORE_ANNOUNCE_PULL = "%d 초 뒤 풀링 합니다."
DBM_CORE_ANNOUNCE_PULL_NOW = "풀링했습니다. 긴장하세요.!"
DBM_CORE_ACHIEVEMENT_TIMER_SPEED_KILL = "Speed Kill(업적 타이머)"
-- Auto-generated Timer Localizations
DBM_CORE_AUTO_TIMER_TEXTS.target = "%s: %%s"
DBM_CORE_AUTO_TIMER_TEXTS.cast = "%s"
DBM_CORE_AUTO_TIMER_TEXTS.active = "%s"
DBM_CORE_AUTO_TIMER_TEXTS.cd = "%s 쿨다운"
DBM_CORE_AUTO_TIMER_TEXTS.next = "다음 %s"
DBM_CORE_AUTO_TIMER_TEXTS.achievement = "%s"
DBM_CORE_AUTO_TIMER_OPTIONS.target = "|cff71d5ff|Hspell:%d|h%s|h|r 디버프 타이머 보기"
DBM_CORE_AUTO_TIMER_OPTIONS.cast = "|cff71d5ff|Hspell:%d|h%s|h|r 시전 타이머 보기"
DBM_CORE_AUTO_TIMER_OPTIONS.active = "|cff71d5ff|Hspell:%d|h%s|h|r 유지 타이머 보기"
DBM_CORE_AUTO_TIMER_OPTIONS.cd = "|cff71d5ff|Hspell:%d|h%s|h|r 쿨다운 타이머 보기"
DBM_CORE_AUTO_TIMER_OPTIONS.next = "다음 |cff71d5ff|Hspell:%d|h%s|h|r 타이머 보기"
DBM_CORE_AUTO_TIMER_OPTIONS.achievement = "%s 위한 타이머 보기"
-- Auto-generated Warning Localizations
DBM_CORE_AUTO_ANNOUNCE_TEXTS.target = "%s : >%%s<"
DBM_CORE_AUTO_ANNOUNCE_TEXTS.spell = "%s"
DBM_CORE_AUTO_ANNOUNCE_TEXTS.cast = "주문시전 %s : %.1f 초"
DBM_CORE_AUTO_ANNOUNCE_TEXTS.soon = "곧 %s"
DBM_CORE_AUTO_ANNOUNCE_TEXTS.prewarn = "%s : %s"
DBM_CORE_AUTO_ANNOUNCE_TEXTS.phase = "%d 단계"
DBM_CORE_AUTO_ANNOUNCE_OPTIONS.target = "|cff71d5ff|Hspell:%d|h%s|h|r 대상 알리기"
DBM_CORE_AUTO_ANNOUNCE_OPTIONS.spell = "|cff71d5ff|Hspell:%d|h%s|h|r 경고 보기"
DBM_CORE_AUTO_ANNOUNCE_OPTIONS.cast = "|cff71d5ff|Hspell:%d|h%s|h|r 시전을 시작할 경우 경고 보기"
DBM_CORE_AUTO_ANNOUNCE_OPTIONS.soon = "|cff71d5ff|Hspell:%d|h%s|h|r의 사전 경고 보기(soon)"
DBM_CORE_AUTO_ANNOUNCE_OPTIONS.prewarn = "|cff71d5ff|Hspell:%d|h%s|h|r의 사전 경고 보기(prewarn)"
DBM_CORE_AUTO_ANNOUNCE_OPTIONS.phase = "%d 단계 경고 보기"
-- Auto-generated Special Warning Localizations
DBM_CORE_AUTO_SPEC_WARN_OPTIONS = {
spell = "$spell:%d의 특수 경고 보기",
dispel = "$spell:%d의 특수 경고 보기(해제/마법훔치기)",
interupt = "$spell:%d의 특수 경고 보기(차단)",
you = "$spell:%d의 영향을 받을 경우 특수 경고 보기",
target = "$spell:%d의 영향을 누군가 받을 경우 특수 경고 보기",
close = "$spell:%d의 영향을 가까운 공대원으로부터 받을 경우 특수 경고 보기",
move = "$spell:%d의 영향을 받을 경우 특수 경고 보기(이동)",
run = "$spell:%d의 특수 경고 보기(빠른이동)",
cast = "$spell:%d의 시전 특수 경고 보기",
stack = "%d 중첩 이상 쌓일 경우 $spell:%d의 특수 경고 보기"-- stack = "Show special warning when you have >=%d stacks of \n $spell:%d"
}
DBM_CORE_AUTO_SPEC_WARN_TEXTS = {
spell = "%s!",
dispel = "%s : %%s - 해제!",
interupt = "%s - 차단!",
you = "당신에게 %s",
target = "%s : %%s",
close = "%%s에게 가까운 당신에게 %s 시전",
move = "%s - 이동하세요!",
run = "%s - 뛰세요!",
cast = "%s - 시전 중지",
stack = "%s (%%d)"
}
DBM_CORE_AUTO_ICONS_OPTION_TEXT = "$spell:%d 대상 공격대 아이콘 설정"
DBM_CORE_AUTO_SOUND_OPTION_TEXT = "$spell:%d 특수 소리 재생"
-- New special warnings
DBM_CORE_MOVE_SPECIAL_WARNING_BAR = "특수 경고 움직이기"
DBM_CORE_MOVE_SPECIAL_WARNING_TEXT = "특수 경고"
DBM_CORE_RANGE_CHECK_ZONE_UNSUPPORTED = " %dm 거리 체크를 지원하지 않는 지역입니다. 10, 11, 15 그리고 28m를 지원합니다."
DBM_ARROW_MOVABLE = "화살표 움직이기"
DBM_ARROW_NO_RAIDGROUP = "공격대 던전에서만 사용"
DBM_ARROW_ERROR_USAGE = {
"DBM-Arrow 사용법:",
"/dbm arrow <x> <y> 특정 좌표(X/Y)에 화살표를 만듭니다.(0 < x/y < 100)",
"/dbm arrow <player> 당신이 속한 파티 또는 공격대의 특정 플레이어를 가르키는 화살표를 만듭니다.",
"/dbm arrow hide 화살표를 숨깁니다.",
"/dbm arrow move 화살표를 움직이도록 합니다.",
"/dbm arrow target 대상을 가르키는 화살표를 만듭니다.",
"/dbm arrow focus 주시대상을 가르키는 화살표를 만듭니다.",
}
end
+196
View File
@@ -0,0 +1,196 @@
if GetLocale() ~= "ruRU" then return end
DBM_CORE_NEED_SUPPORT = "Вы - программист или хороший переводчик? Команда разработчиков DBM нуждается в вашей помощи. Присоединяйтесь к нам - зайдите на www.deadlybossmods.com или отправьте сообщение на tandanu@deadlybossmods.com или nitram@deadlybossmods.com."
DBM_CORE_LOAD_MOD_ERROR = "Ошибка при загрузке DBM для %s: %s"
DBM_CORE_LOAD_MOD_SUCCESS = "Загружен DBM для \"%s\", введите /dbm для вызова настроек!"
DBM_CORE_LOAD_GUI_ERROR = "Не удалось загрузить GUI: %s"
DBM_CORE_COMBAT_STARTED = "%s вступает в бой. Удачи! :)";
DBM_CORE_BOSS_DOWN = "%s погибает спустя %s!"
DBM_CORE_BOSS_DOWN_LONG = "%s погибает спустя %s! Последний бой длился %s, лучший бой длился %s."
DBM_CORE_BOSS_DOWN_NEW_RECORD = "%s погибает спустя %s! Это новая запись! (Предшествующая запись была %s)"
DBM_CORE_COMBAT_ENDED = "Бой с %s длился %s"
DBM_CORE_TIMER_FORMAT_SECS = "%d сек"
DBM_CORE_TIMER_FORMAT_MINS = "%d мин"
DBM_CORE_TIMER_FORMAT = "%d мин %d сек"
DBM_CORE_MIN = "мин"
DBM_CORE_MIN_FMT = "%d мин"
DBM_CORE_SEC = "сек"
DBM_CORE_SEC_FMT = "%d сек"
DBM_CORE_DEAD = "мертв"
DBM_CORE_OK = "ОК"
DBM_CORE_GENERIC_WARNING_BERSERK = "Берсерк через %s %s"
DBM_CORE_GENERIC_TIMER_BERSERK = "Берсерк"
DBM_CORE_OPTION_TIMER_BERSERK = "Отсчет времени до $spell:26662"
DBM_CORE_OPTION_HEALTH_FRAME = "Отображать здоровье босса"
DBM_CORE_OPTION_CATEGORY_TIMERS = "Индикаторы"
DBM_CORE_OPTION_CATEGORY_WARNINGS = "Предупреждения"
DBM_CORE_OPTION_CATEGORY_MISC = "Прочее"
DBM_CORE_AUTO_RESPONDED = "Авто-ответ."
DBM_CORE_STATUS_WHISPER = "%s: %s, %d/%d человек живые"
DBM_CORE_AUTO_RESPOND_WHISPER = "%s сейчас не может ответить, в бою с %s (%s, %d/%d человек живые)"
DBM_CORE_WHISPER_COMBAT_END_KILL = "%s одержал победу над %s!"
DBM_CORE_WHISPER_COMBAT_END_WIPE = "%s потерпел поражение от %s"
DBM_CORE_VERSIONCHECK_HEADER = "Deadly Boss Mods - версии"
DBM_CORE_VERSIONCHECK_ENTRY = "%s: %s (r%d)"
DBM_CORE_VERSIONCHECK_ENTRY_NO_DBM = "%s: DBM не установлен"
DBM_CORE_VERSIONCHECK_FOOTER = "Найдено %d |4игрок:игрока:игроков; с установленным Deadly Boss Mods"
DBM_CORE_YOUR_VERSION_OUTDATED = "Ваша версия Deadly Boss Mods устарела! Пожалуйста, посетите www.deadlybossmods.com для загрузки последней версии."
DBM_CORE_UPDATEREMINDER_HEADER = "Ваша версия Deadly Boss Mods устарела.\n Версия %s (r%d) доступна для загрузки здесь:"
DBM_CORE_UPDATEREMINDER_FOOTER = "Нажмите CTRL+C, чтобы скопировать ссылку загрузки в буфер обмена."
DBM_CORE_UPDATEREMINDER_NOTAGAIN = "Всплывающее сообщение при наличии новой версии"
DBM_CORE_MOVABLE_BAR = "Перетащите!"
DBM_PIZZA_SYNC_INFO = "|Hplayer:%1$s|h[%1$s]|h транслирует DBM Timer: '%2$s'\n|HDBM:cancel:%2$s:nil|h|cff3588ff[Отменить этот DBM Timer]|r|h |HDBM:ignore:%2$s:%1$s|h|cff3588ff[Игнорировать DBM Timer от %1$s]|r|h"
DBM_PIZZA_CONFIRM_IGNORE = "Вы действительно хотите проигнорировать DBM Timer данного сеанса от %s?"
DBM_PIZZA_ERROR_USAGE = "Использование: /dbm [broadcast] timer <time> <text>"
DBM_CORE_ERROR_DBMV3_LOADED = "Deadly Boss Mods запущен дважды, поскольку установлены DBMv3 и DBMv4 и включены!\nНажмите кнопку \"ОК\" для отключения DBMv3 и перезагрузки интерфейса.\nНаведите порядок в вашей папке AddOns, удалите старые папки DBMv3."
DBM_CORE_MINIMAP_TOOLTIP_HEADER = "Deadly Boss Mods"
DBM_CORE_MINIMAP_TOOLTIP_FOOTER = "Shift+щелчок или щелкните правой кнопкой мыши, чтобы переместить"
DBM_CORE_RANGECHECK_HEADER = "Проверка дистанции (%d м)"
DBM_CORE_RANGECHECK_SETRANGE = "Настройка дистанции"
DBM_CORE_RANGECHECK_SOUNDS = "Звуки"
DBM_CORE_RANGECHECK_SOUND_OPTION_1 = "Звуковой сигнал, когда игрок находится в диапазоне"
DBM_CORE_RANGECHECK_SOUND_OPTION_2 = "Звуковой сигнал для всех остальных игроков в диапазоне"
DBM_CORE_RANGECHECK_SOUND_0 = "Без звука"
DBM_CORE_RANGECHECK_SOUND_1 = "По умолчанию"
DBM_CORE_RANGECHECK_SOUND_2 = "Раздражающий звуковой сигнал"
DBM_CORE_RANGECHECK_HIDE = "Скрыть"
DBM_CORE_RANGECHECK_SETRANGE_TO = "%d м"
DBM_CORE_RANGECHECK_LOCK = "Закрепить полосу"
DBM_LFG_INVITE = "Приглашение в подземелье"
DBM_CORE_SLASHCMD_HELP = {
"Доступные (/) команды:",
"/dbm version: выполнение проверки используемой рейдом версии (псевдоним: ver)",
"/dbm unlock: отображение перемещаемой строки состояния таймера (псевдоним: move)",
"/dbm timer <x> <text>: начинает отсчет <x> сек. Pizza Timer с именем <text>",
"/dbm broadcast timer <x> <text>: транслирует <x> сек. Pizza Timer с именем <text> в рейд (требуются права лидера или помощника)",
"/dbm break <min>: начинает отсчет отдыха на <min> мин., транслирует отсчет отдыха всем членам рейда с DBM (требуются права лидера или помощника).",
"/dbm help: вывод этой справки",
}
DBM_ERROR_NO_PERMISSION = "У вас недостаточно прав, для выполнение этой операции."
DBM_CORE_BOSSHEALTH_HIDE_FRAME = "Скрыть"
DBM_CORE_ALLIANCE = "Альянс"
DBM_CORE_HORDE = "Орда"
DBM_CORE_UNKNOWN = "неизвестно"
DBM_CORE_BREAK_START = "Перерыв начинается -- у вас есть %s мин.!"
DBM_CORE_BREAK_MIN = "Перерыв заканчивается через %s мин.!"
DBM_CORE_BREAK_SEC = "Перерыв заканчивается через %s сек.!"
DBM_CORE_TIMER_BREAK = "Перерыв!"
DBM_CORE_ANNOUNCE_BREAK_OVER = "Перерыв закончился"
DBM_CORE_TIMER_PULL = "Атака"
DBM_CORE_ANNOUNCE_PULL = "Атака через %d сек."
DBM_CORE_ANNOUNCE_PULL_NOW = "Атака!"
DBM_CORE_ACHIEVEMENT_TIMER_SPEED_KILL = "Быстрое убийство"
-- Auto-generated Timer Localizations
DBM_CORE_AUTO_TIMER_TEXTS = {
target = "%s: %%s",
cast = "%s",
active = "%s",
cd = "Восст. %s",
next = "След. %s",
achievement = "%s",
}
DBM_CORE_AUTO_TIMER_OPTIONS = {
target = "Отсчет времени действия эффекта |cff71d5ff|Hspell:%d|h%s|h|r",
cast = "Отсчет времени применения заклинания |cff71d5ff|Hspell:%d|h%s|h|r",
active = "Отсчет времени действия |cff71d5ff|Hspell:%d|h%s|h|r",
cd = "Отсчет времени до восстановления |cff71d5ff|Hspell:%d|h%s|h|r",
next = "Отсчет времени до следующего |cff71d5ff|Hspell:%d|h%s|h|r",
achievement = "Отсчет времени для %s",
}
-- Auto-generated Warning Localizations
DBM_CORE_AUTO_ANNOUNCE_TEXTS = {
target = "%s на |3-5(>%%s<)",
spell = "%s",
cast = "Применение заклинания %s: %.1f сек",
soon = "Скоро %s",
prewarn = "%s через %s",
phase = "Фаза %d",
}
local prewarnOption = "Предупреждать заранее о |cff71d5ff|Hspell:%d|h%s|h|r"
DBM_CORE_AUTO_ANNOUNCE_OPTIONS = {
target = "Объявлять цели заклинания |cff71d5ff|Hspell:%d|h%s|h|r",
spell = "Предупреждение для |cff71d5ff|Hspell:%d|h%s|h|r",
cast = "Предупреждать о применении заклинания |cff71d5ff|Hspell:%d|h%s|h|r",
soon = prewarnOption,
prewarn = prewarnOption,
phase = "Объявлять фазу %d"
}
-- Auto-generated Special Warning Localizations
DBM_CORE_AUTO_SPEC_WARN_OPTIONS = {
spell = "Спец-предупреждение для $spell:%d",
dispel = "Спец-предупреждение для рассеивания/похищения заклинания \n$spell:%d",
interupt = "Спец-предупреждение для прерывания заклинания \n$spell:%d",
you = "Спец-предупреждение, когда на вас $spell:%d",
target = "Спец-предупреждение, когда на ком-то $spell:%d",
close = "Спец-предупреждение, когда на ком-то рядом с вами \n$spell:%d",
move = "Спец-предупреждение для $spell:%d",
run = "Спец-предупреждение для $spell:%d",
cast = "Спец-предупреждение о применении заклинания \n$spell:%d",
stack = "Спец-предупреждение для >=%d стаков $spell:%d"
}
DBM_CORE_AUTO_SPEC_WARN_TEXTS = {
spell = "%s!",
dispel = "%s на |3-5(%%s) - рассейте заклинание",
interupt = "%s - прерывание",
you = "%s на вас",
target = "%s на |3-5(%%s)",
close = "%s на |3-5(%%s) около вас",
move = "%s - отбегите",
run = "%s - бегите",
cast = "%s - прекратите чтение заклинаний",
stack = "%s (%%d)"
}
DBM_CORE_AUTO_ICONS_OPTION_TEXT = "Устанавливать метки на цели заклинания $spell:%d"
DBM_CORE_AUTO_SOUND_OPTION_TEXT = "Звуковой сигнал при $spell:%d"
-- New special warnings
DBM_CORE_MOVE_SPECIAL_WARNING_BAR = "Индикатор спец-предупреждения"
DBM_CORE_MOVE_SPECIAL_WARNING_TEXT = "Специальное предупреждение"
DBM_CORE_RANGE_CHECK_ZONE_UNSUPPORTED = "Проверка дистанции %d м. недоступна в этой зоне.\nДоступные дистанции - 10, 11, 15 и 28 м."
DBM_ARROW_MOVABLE = "Стрелку можно перемещать"
DBM_ARROW_NO_RAIDGROUP = "Данная функция работает только в рейд-группах и внутри рейдовых подземелий."
DBM_ARROW_ERROR_USAGE = {
"Использование DBM-Arrow:",
"/dbm arrow <x> <y>: создает стрелку, указывающую в определенную точку (0 < x/y < 100)",
"/dbm arrow <player>: создает стрелку, указывающую на определенного игрока в вашей группе или рейде",
"/dbm arrow hide: скрывает стрелку",
"/dbm arrow move: разрешает перемещение стрелки",
}
+191
View File
@@ -0,0 +1,191 @@
if GetLocale() ~= "zhTW" then return end
DBM_CORE_NEED_SUPPORT = "嘿, 你是否擁有良好的程式開發或語言能力? 如果是的話, DBM團隊真的需要你的幫助以保持成為WOW入面最佳的首領模組。觀看 www.deadlybossmods.com 或發送郵件到 tandanu@deadlybossmods.com 或 nitram@deadlybossmods.com 來加入團隊。"
DBM_CORE_LOAD_MOD_ERROR = "載入%s模組時發生錯誤:%s"
DBM_CORE_LOAD_MOD_SUCCESS = "成功載入%s模組。輸入/dbm有更多選項。"
DBM_CORE_LOAD_GUI_ERROR = "無法載入圖形介面:%s"
DBM_CORE_COMBAT_STARTED = "%s開戰。祝好運與盡興! :)";
DBM_CORE_BOSS_DOWN = "擊敗%s,經過%s!"
DBM_CORE_BOSS_DOWN_LONG = "擊敗%s!本次經過%s,上次經過%s,最快紀錄%s。"
DBM_CORE_BOSS_DOWN_NEW_RECORD = "擊敗%s!經過%s,這是一個新記錄!(舊紀錄為%s)"
DBM_CORE_COMBAT_ENDED = "%s的戰鬥經過%s結束。"
DBM_CORE_TIMER_FORMAT_SECS = "%d秒"
DBM_CORE_TIMER_FORMAT_MINS = "%d分鐘"
DBM_CORE_TIMER_FORMAT = "%d分%d秒"
DBM_CORE_MIN = ""
DBM_CORE_MIN_FMT = "%d分"
DBM_CORE_SEC = ""
DBM_CORE_SEC_FMT = "%d秒"
DBM_CORE_DEAD = "死亡"
DBM_CORE_OK = "確定"
DBM_CORE_GENERIC_WARNING_BERSERK = "%s%s後狂暴"
DBM_CORE_GENERIC_TIMER_BERSERK = "狂暴"
DBM_CORE_OPTION_TIMER_BERSERK = "為$spell:26662顯示計時器"
DBM_CORE_OPTION_HEALTH_FRAME = "顯示首領血量框架"
DBM_CORE_OPTION_CATEGORY_TIMERS = "計時器"
DBM_CORE_OPTION_CATEGORY_WARNINGS = "提示"
DBM_CORE_OPTION_CATEGORY_MISC = "其它"
DBM_CORE_AUTO_RESPONDED = "已自動回覆密語。"
DBM_CORE_STATUS_WHISPER = "%s%s%d/%d存活。"
DBM_CORE_AUTO_RESPOND_WHISPER = "%s正在與%s交戰(當前%s,%d/%d存活)"
DBM_CORE_WHISPER_COMBAT_END_KILL = "%s已經擊敗%s!"
DBM_CORE_WHISPER_COMBAT_END_WIPE = "%s在%s的戰鬥中滅團了。"
DBM_CORE_VERSIONCHECK_HEADER = "Deadly Boss Mods - 版本檢測"
DBM_CORE_VERSIONCHECK_ENTRY = "%s%s(r%d)"
DBM_CORE_VERSIONCHECK_ENTRY_NO_DBM = "%s:尚未安裝DBM"
DBM_CORE_VERSIONCHECK_FOOTER = "團隊中有%d名成員正在使用Deadly Boss Mods"
DBM_CORE_YOUR_VERSION_OUTDATED = "你的 Deadly Boss Mod 已經過期。請到 www.deadlybossmods.com 下載最新版本。"
DBM_CORE_UPDATEREMINDER_HEADER = "你的 Deadly Boss Mod 已經過期。\n你可以在此網址下載到新版本%s(r%d):"
DBM_CORE_UPDATEREMINDER_FOOTER = "Ctrl-C:複製下載網址到剪貼簿。"
DBM_CORE_UPDATEREMINDER_NOTAGAIN = "當有新版本時顯示彈出提示"
DBM_CORE_MOVABLE_BAR = "拖動我!"
DBM_PIZZA_SYNC_INFO = "|Hplayer:%1$s|h[%1$s]|h向你發送了一個倒數計時:'%2$s'\n|HDBM:cancel:%2$s:nil|h|cff3588ff[取消該計時]|r|h |HDBM:ignore:%2$s:%1$s|h|cff3588ff[忽略來自%1$s的計時]|r|h"
DBM_PIZZA_CONFIRM_IGNORE = "是否要在該次遊戲連結中忽略來自%s的計時?"
DBM_PIZZA_ERROR_USAGE = "命令:/dbm [broadcast] timer <時間(秒)> <文字>"
DBM_CORE_ERROR_DBMV3_LOADED = "目前有2個版本的Deadly Boss Mods正在運行:DBMv3和DBMv4。\n按一下“確定”按鈕可將DBMv3關閉並重載插件。\n我們建議將插件目錄下的DBMv3刪除。"
DBM_CORE_MINIMAP_TOOLTIP_HEADER = "Deadly Boss Mods"
DBM_CORE_MINIMAP_TOOLTIP_FOOTER = "Shift+左鍵或右鍵點擊即可移動"
DBM_CORE_RANGECHECK_HEADER = "距離監視(%d碼)"
DBM_CORE_RANGECHECK_SETRANGE = "設置距離"
DBM_CORE_RANGECHECK_SOUNDS = "音效"
DBM_CORE_RANGECHECK_SOUND_OPTION_1 = "當一位玩家在範圍內時播放音效"
DBM_CORE_RANGECHECK_SOUND_OPTION_2 = "當多於一位玩家在範圍內時播放音效"
DBM_CORE_RANGECHECK_SOUND_0 = "沒有音效"
DBM_CORE_RANGECHECK_SOUND_1 = "預設音效"
DBM_CORE_RANGECHECK_SOUND_2 = "蜂鳴聲"
DBM_CORE_RANGECHECK_HIDE = "隱藏"
DBM_CORE_RANGECHECK_SETRANGE_TO = "%d碼"
DBM_CORE_RANGECHECK_LOCK = "鎖定框架"
DBM_LFG_INVITE = "地城準備確認"
DBM_CORE_SLASHCMD_HELP = {
"可用命令:",
"/dbm version:進行團隊範圍內的版本檢測(也可使用:ver)。",
"/dbm unlock:顯示一個可移動的計時器(也可使用:move)。",
"/dbm timer <x> <文字>:開始一個以<文字>為名稱的時間為<x>秒的計時器。",
"/dbm broadcast timer <x> <文字>:向團隊廣播一個以<文字>為名稱,時間為<x>秒的計時器(需開啟團隊廣播及助理權限)。",
"/dbm break <分鐘>: 開始休息計時器<分鐘>。向所有團隊成員發送一個DBM休息計時器(需開啟團隊廣播及助理權限)。",
"/dbm help:顯示可用命令的說明。",
}
DBM_ERROR_NO_PERMISSION = "無權進行此操作。"
DBM_CORE_BOSSHEALTH_HIDE_FRAME = "關閉血量框架"
DBM_CORE_ALLIANCE = "聯盟"
DBM_CORE_HORDE = "部落"
DBM_CORE_UNKNOWN = "未知"
DBM_CORE_BREAK_START = "現在開始休息-你有%s分鐘!"
DBM_CORE_BREAK_MIN = "%s分鐘後休息時間結束!"
DBM_CORE_BREAK_SEC = "%s秒後休息時間結束!"
DBM_CORE_TIMER_BREAK = "休息時間!"
DBM_CORE_ANNOUNCE_BREAK_OVER = "休息時間已經結束"
DBM_CORE_TIMER_PULL = "戰鬥準備"
DBM_CORE_ANNOUNCE_PULL = "%d秒後拉怪"
DBM_CORE_ANNOUNCE_PULL_NOW = "拉怪囉!"
DBM_CORE_ACHIEVEMENT_TIMER_SPEED_KILL = "快速擊殺"
-- Auto-generated Timer Localizations
DBM_CORE_AUTO_TIMER_TEXTS = {
target = "%s: %%s",
cast = "%s",
active = "%s",
cd = "%s 冷卻",
next = "下一次 %s",
achievement = "%s",
}
DBM_CORE_AUTO_TIMER_OPTIONS = {
target = "為|cff71d5ff|Hspell:%d|h%s|h|r顯示減益計時器",
cast = "為|cff71d5ff|Hspell:%d|h%s|h|r顯示施法計時器",
active = "為|cff71d5ff|Hspell:%d|h%s|h|r顯示持續時間計時器",
cd = "為|cff71d5ff|Hspell:%d|h%s|h|r顯示冷卻計時器",
next = "為下一次 |cff71d5ff|Hspell:%d|h%s|h|r顯示計時器",
achievement = "為成就:%s顯示計時器",
}
-- Auto-generated Warning Localizations
DBM_CORE_AUTO_ANNOUNCE_TEXTS = {
target = "%s: >%%s<",
spell = "%s",
cast = "施放 %s: %.1f 秒",
soon = "%s 即將到來",
prewarn = "%s 在 %s",
phase = "第%d階段"
}
local prewarnOption = "為|cff71d5ff|Hspell:%d|h%s|h|r顯示預先警告"
DBM_CORE_AUTO_ANNOUNCE_OPTIONS = {
target = "提示|cff71d5ff|Hspell:%d|h%s|h|r的目標",
spell = "為|cff71d5ff|Hspell:%d|h%s|h|r顯示警告",
cast = "當|cff71d5ff|Hspell:%d|h%s|h|r施放時顯示警告",
soon = prewarnOption,
prewarn = prewarnOption,
phase = "提示第%d階段"
}
-- Auto-generated Special Warning Localizations
DBM_CORE_AUTO_SPEC_WARN_OPTIONS = {
spell = "為$spell:%d顯示特別警告",
dispel = "需對$spell:%d驅散/竊取時顯示特別警告",
interupt = "需對$spell:%d斷法時顯示特別警告",
you = "當你中了$spell:%d時顯示特別警告",
target = "當有人中了$spell:%d時顯示特別警告",
close = "當你附近有人中了$spell:%d時顯示特別警告",
move = "當你中了$spell:%d時顯示特別警告",
run = "為$spell:%d顯示特別警告",
cast = "為$spell:%d施放時顯示特別警告",
stack = "為>=%d層$spell:%d時顯示特別警告"
}
DBM_CORE_AUTO_SPEC_WARN_TEXTS = {
spell = "%s!",
dispel = "%%s中了%s - 現在驅散",
interupt = "%s - 現在斷法",
you = "你中了%s",
target = "%%s中了%s",
close = "你附近的%%s中了%s",
move = "%s - 快離開",
run = "%s - 快跑開",
cast = "%s - 停止施法",
stack = "%s (%%d)"
}
DBM_CORE_AUTO_ICONS_OPTION_TEXT = "為$spell:%d的目標設置標記"
DBM_CORE_AUTO_SOUND_OPTION_TEXT = "為$spell:%d播放音效"
-- New special warnings
DBM_CORE_MOVE_SPECIAL_WARNING_BAR = "可拖動的特別警告"
DBM_CORE_MOVE_SPECIAL_WARNING_TEXT = "特別警告"
DBM_CORE_RANGE_CHECK_ZONE_UNSUPPORTED = "在此區域中不支援%d碼的距離檢查。\n已支援的距離有10,11,15及28碼。"
DBM_ARROW_MOVABLE = "可移動箭頭"
DBM_ARROW_NO_RAIDGROUP = "此功能僅作用於團隊副本中的團隊小隊。"
DBM_ARROW_ERROR_USAGE = {
"DBM-Arrow 用法:",
"/dbm arrow <x> <y> 建立一個箭頭在特定的位置(0 < x/y < 100)",
"/dbm arrow <玩家> 建立並箭頭指向你的隊伍或團隊中特定的玩家",
"/dbm arrow hide 隱藏箭頭",
"/dbm arrow move 可移動箭頭",
}
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,71 @@
THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.
1. Definitions
a. "Collective Work" means a work, such as a periodical issue, anthology or encyclopedia, in which the Work in its entirety in unmodified form, along with a number of other contributions, constituting separate and independent works in themselves, are assembled into a collective whole. A work that constitutes a Collective Work will not be considered a Derivative Work (as defined below) for the purposes of this License.
b. "Derivative Work" means a work based upon the Work or upon the Work and other pre-existing works, such as a translation, musical arrangement, dramatization, fictionalization, motion picture version, sound recording, art reproduction, abridgment, condensation, or any other form in which the Work may be recast, transformed, or adapted, except that a work that constitutes a Collective Work will not be considered a Derivative Work for the purpose of this License.
c. "Licensor" means the individual or entity that offers the Work under the terms of this License.
d. "Original Author" means the individual or entity who created the Work.
e. "Work" means the copyrightable work of authorship offered under the terms of this License.
f. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation.
2. Fair Use Rights. Nothing in this license is intended to reduce, limit, or restrict any rights arising from fair use, first sale or other limitations on the exclusive rights of the copyright owner under copyright law or other applicable laws.
3. License Grant & Restrictions. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below on the conditions as stated below:
a. Re-creativity permitted. You may create and reproduce Derivative Works, provided that:
i. the Derivative Work(s) constitute a good-faith partial or recombined usage employing "sampling," "collage," "mash-up," or other comparable artistic technique, whether now known or hereafter devised, that is highly transformative of the original, as appropriate to the medium, genre, and market niche; and
ii. Your Derivative Work(s) must only make a partial use of the original Work, or if You choose to use the original Work as a whole, You must either use the Work as an insubstantial portion of Your Derivative Work(s) or transform it into something substantially different from the original Work. In the case of a musical Work and/or audio recording, the mere synchronization ("synching") of the Work with a moving image shall not be considered a transformation of the Work into something substantially different.
b. You may distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission, any Derivative Work(s) authorized under this License.
c. Prohibition on advertising. All advertising and promotional uses are excluded from the above rights, except for advertisement and promotion of the Derivative Work(s) that You are creating from the Work and Yourself as the author thereof.
d. Noncommercial sharing of verbatim copies permitted.
i. You may reproduce the Work, incorporate the Work into one or more Collective Works, and reproduce the Work as incorporated in the Collective Works. You may distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission the Work including or incorporated in Collective Works.
ii. You may not exercise any of the rights granted to You in the paragraph immediately above in any manner that is primarily intended for or directed toward commercial advantage or private monetary compensation. The exchange of the Work for other copyrighted works by means of digital file-sharing or otherwise shall not be considered to be intended for or directed toward commercial advantage or private monetary compensation, provided there is no payment of any monetary compensation in connection with the exchange of copyrighted works.
e. Attribution and Notice.
i. If You distribute, publicly display, publicly perform, or publicly digitally perform the Work or any Derivative Works or Collective Works, You must keep intact all copyright notices for the Work and give the Original Author credit reasonable to the medium or means You are utilizing by conveying the name (or pseudonym if applicable) of the Original Author if supplied; the title of the Work if supplied; to the extent reasonably practicable, provide the Uniform Resource Identifier, if any, that Licensor specifies to be associated with the Work or a Derivative Work, unless such Uniform Resource Identifier does not refer to the copyright notice or licensing information for the Work; and in the case of a Derivative Work, provide a credit identifying the use of the Work in the Derivative Work (e.g., "Remix of the Work by Original Author," or "Inclusion of a portion of the Work by Original Author in collage"). Such credit may be implemented in any reasonable manner; provided, however, that in the case of a Derivative Work or Collective Work, at a minimum such credit will appear where any other comparable authorship credit appears and in a manner at least as prominent as such other comparable authorship credit.
ii. You may distribute, publicly display, publicly perform or publicly digitally perform the Work only under the terms of this License, and You must include a copy of, or the Uniform Resource Identifier for, this License with every copy or phonorecord of the Work or Derivative Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Work that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Work with any technological measures that control access of use of the Work in a manner inconsistent with the terms of this License. The above applies to the Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Work itself to be made subject to the terms of this License. Upon notice from any Licensor You must, to the extent practicable, remove from the Derivative Work or Collective Work any reference to such Licensor or the Original Author, as requested.
The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. All rights not expressly granted by Licensor are hereby reserved.
4. Disclaimer
UNLESS SPECIFIED OTHERWISE BY THE PARTIES IN A SEPARATE WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE.
5. Limitation on Liability.
IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
6. Termination
a. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Derivative Works or Collective Works from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 4, 5, 6, and 7 will survive any termination of this License.
b. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above.
7. Miscellaneous
a. Each time You distribute or publicly digitally perform the Work or a Collective Work, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License.
b. Each time You distribute or publicly digitally perform a Derivative Work, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License.
c. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
d. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent.
e. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements, or representations with respect to the Work, and with respect to the subject matter hereof, not specified above. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+3
View File
@@ -0,0 +1,3 @@
The sound "alarmclockbeeps.ogg" was created by tedthetrumpet (http://www.freesound.org/usersViewSingle.php?id=177). It is a free sound licensed under a Creative Commons Sampling Plus 1.0 License (http://creativecommons.org/licenses/sampling+/1.0/). The full text of the license can be found in the file "Creative Commons Sampling Plus 1.0.txt".
The sound "blip_8.ogg" was created by Corsica_S (http://www.freesound.org/usersViewSingle.php?id=7037). It is a free sound licensed under a Creative Commons Sampling Plus 1.0 License (http://creativecommons.org/licenses/sampling+/1.0/). The full text of the license can be found in the file "Creative Commons Sampling Plus 1.0.txt".
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,5 @@
3D-Arrow:
Everyone has full permission to do whatever they want with this model file in any non-commercial manner. Attribution to "Guillotine" is nice, but not necessary. For any commrcial use, contact me first at curse.guillotine@gmail.com
Minimap Textures:
Taken from TomTom with permission, thanks to Cladhaire!
Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB