init
This commit is contained in:
@@ -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
|
||||
----------------------------------------------------------------------------------------------------
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
@@ -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
|
||||
@@ -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.
|
||||
@@ -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 = "特殊警报"
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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",
|
||||
}
|
||||
@@ -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",
|
||||
}
|
||||
|
||||
|
||||
@@ -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",
|
||||
}
|
||||
|
||||
@@ -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 l’alerte spéciale pour $spell:%d",
|
||||
dispel = "Afficher l’alerte spéciale à dispel/spellsteal \n $spell:%d",
|
||||
interupt = "Afficher l’alerte spéciale interrompre $spell:%d",
|
||||
you = "Afficher l’alerte spéciale lorsque vous êtes affecté par $spell:%d",
|
||||
target = "Afficher l’alerte spéciale quand quelqu'un est touché par $spell:%d",
|
||||
close = "Afficher l’alerte spéciale quand quelqu'un est proche de vous \n affected by $spell:%d",
|
||||
move = "Afficher l’alerte spéciale lorsque vous êtes affecté par $spell:%d",
|
||||
run = "Afficher l’alerte spéciale pour $spell:%d",
|
||||
cast = "Afficher l’alerte spéciale pour $spell:%d cast",
|
||||
stack = "Afficher l’alerte 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",
|
||||
}
|
||||
@@ -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
|
||||
@@ -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: разрешает перемещение стрелки",
|
||||
}
|
||||
|
||||
|
||||
@@ -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.
@@ -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 |
Reference in New Issue
Block a user