├── .gitignore ├── .pkgmeta ├── Core.lua ├── DefaultSettings.lua ├── DynamicCam-Cata.toc ├── DynamicCam-Classic.toc ├── DynamicCam-Wrath.toc ├── DynamicCam.toc ├── LICENSE ├── Libs └── LICENSE.md ├── Locales ├── Locales.xml ├── deDE.lua ├── enUS.lua ├── esES.lua ├── esMX.lua ├── frFR.lua ├── itIT.lua ├── koKR.lua ├── ptBR.lua ├── ruRU.lua ├── zhCN.lua └── zhTW.lua ├── MouseZoom.lua ├── Options.lua ├── Presets.lua ├── README.md ├── Sharing.lua ├── SituationManager.lua ├── UiHideModule.lua └── embeds.xml /.gitignore: -------------------------------------------------------------------------------- 1 | Libs/ 2 | /release.bat 3 | /.release 4 | -------------------------------------------------------------------------------- /.pkgmeta: -------------------------------------------------------------------------------- 1 | package-as: DynamicCam 2 | 3 | externals: 4 | Libs/AceAddon-3.0: 5 | url: https://repos.wowace.com/wow/ace3/trunk/AceAddon-3.0 6 | Libs/AceConfig-3.0: 7 | url: https://repos.wowace.com/wow/ace3/trunk/AceConfig-3.0 8 | Libs/AceConsole-3.0: 9 | url: https://repos.wowace.com/wow/ace3/trunk/AceConsole-3.0 10 | Libs/AceDB-3.0: 11 | url: https://repos.wowace.com/wow/ace3/trunk/AceDB-3.0 12 | Libs/AceDBOptions-3.0: 13 | url: https://repos.wowace.com/wow/ace3/trunk/AceDBOptions-3.0 14 | Libs/AceEvent-3.0: 15 | url: https://repos.wowace.com/wow/ace3/trunk/AceEvent-3.0 16 | Libs/AceGUI-3.0: 17 | url: https://repos.wowace.com/wow/ace3/trunk/AceGUI-3.0 18 | Libs/AceHook-3.0: 19 | url: https://repos.wowace.com/wow/ace3/trunk/AceHook-3.0 20 | Libs/AceLocale-3.0: 21 | url: https://repos.wowace.com/wow/ace3/trunk/AceLocale-3.0 22 | Libs/AceTimer-3.0: 23 | url: https://repos.wowace.com/wow/ace3/trunk/AceTimer-3.0 24 | Libs/AceSerializer-3.0: 25 | url: https://repos.wowace.com/wow/ace3/trunk/AceSerializer-3.0 26 | Libs/CallbackHandler-1.0: 27 | url: https://repos.wowace.com/wow/callbackhandler/trunk/CallbackHandler-1.0 28 | Libs/LibStub: 29 | url: https://repos.wowace.com/wow/libstub/trunk 30 | Libs/LibCamera: 31 | url: https://github.com/Mpstark/LibCamera.git 32 | Libs/LibEasing: 33 | url: https://github.com/Mpstark/LibEasing.git 34 | Libs/LibCompress: 35 | url: https://repos.wowace.com/wow/libcompress/trunk 36 | -------------------------------------------------------------------------------- /DefaultSettings.lua: -------------------------------------------------------------------------------- 1 | local folderName = ... 2 | local DynamicCam = LibStub("AceAddon-3.0"):GetAddon(folderName) 3 | local L = LibStub("AceLocale-3.0"):GetLocale("DynamicCam") 4 | 5 | 6 | 7 | DynamicCam.situationDefaults = { 8 | 9 | name = "", 10 | 11 | enabled = false, 12 | 13 | executeOnInit = "", 14 | 15 | priority = 0, 16 | events = {}, 17 | 18 | condition = "return false", 19 | 20 | executeOnEnter = "", 21 | executeOnExit = "", 22 | 23 | delay = 0, 24 | 25 | 26 | viewZoom = { 27 | enabled = false, 28 | viewZoomType = "zoom", 29 | 30 | zoomTransitionTime = 1, 31 | zoomType = "set", 32 | zoomValue = 10, 33 | zoomMin = 5, 34 | zoomMax = 15, 35 | zoomTimeIsMax = false, 36 | 37 | viewNumber = 2, 38 | viewRestore = true, 39 | viewInstant = false, 40 | restoreDefaultViewNumber = 1, 41 | }, 42 | 43 | rotation = { 44 | enabled = false, 45 | rotationType = "continuous", 46 | 47 | rotationTime = 1, 48 | rotationSpeed = 10, 49 | 50 | yawDegrees = 0, 51 | pitchDegrees = 0, 52 | 53 | rotateBack = true, 54 | rotateBackTime = 1, 55 | }, 56 | 57 | hideUI = { 58 | enabled = false, 59 | 60 | fadeOpacity = 0.6, 61 | fadeOutTime = 1, 62 | fadeInTime = 1, 63 | 64 | emergencyShowEscEnabled = true, 65 | 66 | hideEntireUI = false, 67 | keepFrameRate = false, 68 | 69 | keepAlertFrames = true, 70 | keepTooltip = true, 71 | keepMinimap = false, 72 | keepChatFrame = false, 73 | keepPartyRaidFrame = false, 74 | keepTrackingBar = false, 75 | keepEncounterBar = false, 76 | 77 | keepCustomFrames = false, 78 | customFramesToKeep = { 79 | AuctionHouseFrame = true, 80 | BankFrame = true, 81 | BagnonBankFrame1 = true, 82 | BuffFrame = true, 83 | ClassTrainerFrame = true, 84 | DebuffFrame = true, 85 | GossipFrame = true, 86 | MerchantFrame = true, 87 | PetStableFrame = true, 88 | QuestFrame = true, 89 | StaticPopup1 = true, 90 | WardrobeFrame = true, 91 | }, 92 | 93 | }, 94 | 95 | 96 | situationSettings = { 97 | cvars = {}, 98 | }, 99 | } 100 | 101 | 102 | 103 | 104 | DynamicCam.defaults = { 105 | profile = { 106 | 107 | -- Global settings. 108 | 109 | zoomRestoreSetting = "adaptive", 110 | reactiveZoomEnhancedMinZoom = false, 111 | settingsPanelIgnoreParentAlpha = true, 112 | 113 | -- Standard settings (for when no situation is overriding them). 114 | standardSettings = { 115 | 116 | reactiveZoomEnabled = true, 117 | reactiveZoomAddIncrementsAlways = 1, 118 | reactiveZoomAddIncrements = 2.5, 119 | reactiveZoomIncAddDifference = 1.2, 120 | reactiveZoomMaxZoomTime = 0.1, 121 | 122 | shoulderOffsetZoomEnabled = true, 123 | shoulderOffsetZoomLowerBound = 2, 124 | shoulderOffsetZoomUpperBound = 7, 125 | 126 | -- cvars 127 | cvars = { 128 | cameraDistanceMaxZoomFactor = tonumber(GetCVarDefault("cameraDistanceMaxZoomFactor")), 129 | cameraZoomSpeed = tonumber(GetCVarDefault("cameraZoomSpeed")), 130 | 131 | cameraYawMoveSpeed = tonumber(GetCVarDefault("cameraYawMoveSpeed")), 132 | cameraPitchMoveSpeed = tonumber(GetCVarDefault("cameraPitchMoveSpeed")), 133 | 134 | test_cameraOverShoulder = tonumber(GetCVarDefault("test_cameraOverShoulder")), 135 | 136 | test_cameraDynamicPitch = tonumber(GetCVarDefault("test_cameraDynamicPitch")), 137 | test_cameraDynamicPitchBaseFovPad = tonumber(GetCVarDefault("test_cameraDynamicPitchBaseFovPad")), 138 | test_cameraDynamicPitchBaseFovPadFlying = tonumber(GetCVarDefault("test_cameraDynamicPitchBaseFovPadFlying")), 139 | test_cameraDynamicPitchBaseFovPadDownScale = tonumber(GetCVarDefault("test_cameraDynamicPitchBaseFovPadDownScale")), 140 | test_cameraDynamicPitchSmartPivotCutoffDist = tonumber(GetCVarDefault("test_cameraDynamicPitchSmartPivotCutoffDist")), 141 | 142 | test_cameraTargetFocusEnemyEnable = tonumber(GetCVarDefault("test_cameraTargetFocusEnemyEnable")), 143 | test_cameraTargetFocusEnemyStrengthYaw = tonumber(GetCVarDefault("test_cameraTargetFocusEnemyStrengthYaw")), 144 | test_cameraTargetFocusEnemyStrengthPitch = tonumber(GetCVarDefault("test_cameraTargetFocusEnemyStrengthPitch")), 145 | test_cameraTargetFocusInteractEnable = tonumber(GetCVarDefault("test_cameraTargetFocusInteractEnable")), 146 | test_cameraTargetFocusInteractStrengthYaw = tonumber(GetCVarDefault("test_cameraTargetFocusInteractStrengthYaw")), 147 | test_cameraTargetFocusInteractStrengthPitch = tonumber(GetCVarDefault("test_cameraTargetFocusInteractStrengthPitch")), 148 | 149 | test_cameraHeadMovementStrength = tonumber(GetCVarDefault("test_cameraHeadMovementStrength")), 150 | test_cameraHeadMovementStandingStrength = tonumber(GetCVarDefault("test_cameraHeadMovementStandingStrength")), 151 | test_cameraHeadMovementStandingDampRate = tonumber(GetCVarDefault("test_cameraHeadMovementStandingDampRate")), 152 | test_cameraHeadMovementMovingStrength = tonumber(GetCVarDefault("test_cameraHeadMovementMovingStrength")), 153 | test_cameraHeadMovementMovingDampRate = tonumber(GetCVarDefault("test_cameraHeadMovementMovingDampRate")), 154 | test_cameraHeadMovementFirstPersonDampRate = tonumber(GetCVarDefault("test_cameraHeadMovementFirstPersonDampRate")), 155 | test_cameraHeadMovementRangeScale = tonumber(GetCVarDefault("test_cameraHeadMovementRangeScale")), 156 | test_cameraHeadMovementDeadZone = tonumber(GetCVarDefault("test_cameraHeadMovementDeadZone")), 157 | }, 158 | 159 | -- Currently not changeable through UI. 160 | reactiveZoomEasingFunc = "OutQuad", 161 | easingZoom = "InOutQuad", 162 | easingYaw = "InOutQuad", 163 | easingPitch = "InOutQuad", 164 | 165 | }, 166 | 167 | 168 | situations = { 169 | 170 | ["001"] = { 171 | name = L["City"], 172 | events = {"PLAYER_UPDATE_RESTING"}, 173 | priority = 1, 174 | condition = "return IsResting()", 175 | }, 176 | ["002"] = { 177 | name = L["City (Indoors)"], 178 | events = {"PLAYER_UPDATE_RESTING", "ZONE_CHANGED_INDOORS", "ZONE_CHANGED", "SPELL_UPDATE_USABLE"}, 179 | priority = 11, 180 | condition = "return IsResting() and IsIndoors()", 181 | }, 182 | ["004"] = { 183 | name = L["World"], 184 | events = {"PLAYER_UPDATE_RESTING", "ZONE_CHANGED_NEW_AREA"}, 185 | priority = 0, 186 | condition = "return not IsResting() and not IsInInstance()", 187 | }, 188 | ["005"] = { 189 | name = L["World (Indoors)"], 190 | events = {"PLAYER_UPDATE_RESTING", "ZONE_CHANGED_INDOORS", "ZONE_CHANGED", "ZONE_CHANGED_NEW_AREA", "SPELL_UPDATE_USABLE"}, 191 | priority = 10, 192 | condition = "return not IsResting() and not IsInInstance() and IsIndoors()", 193 | }, 194 | ["006"] = { 195 | name = L["World (Combat)"], 196 | events = {"PLAYER_REGEN_DISABLED", "PLAYER_REGEN_ENABLED", "ZONE_CHANGED_NEW_AREA"}, 197 | priority = 50, 198 | condition = "return not IsInInstance() and UnitAffectingCombat(\"player\")", 199 | }, 200 | ["020"] = { 201 | name = L["Dungeon/Scenerio"], 202 | events = {"ZONE_CHANGED_NEW_AREA"}, 203 | priority = 2, 204 | condition = [[local isInstance, instanceType = IsInInstance() 205 | return isInstance and (instanceType == "party" or instanceType == "scenario")]], 206 | }, 207 | ["021"] = { 208 | name = L["Dungeon/Scenerio (Outdoors)"], 209 | events = {"ZONE_CHANGED_INDOORS", "ZONE_CHANGED", "ZONE_CHANGED_NEW_AREA", "SPELL_UPDATE_USABLE"}, 210 | priority = 12, 211 | condition = [[local isInstance, instanceType = IsInInstance() 212 | return isInstance and (instanceType == "party" or instanceType == "scenario") and IsOutdoors()]], 213 | }, 214 | ["023"] = { 215 | name = L["Dungeon/Scenerio (Combat, Boss)"], 216 | events = {"PLAYER_REGEN_DISABLED", "PLAYER_REGEN_ENABLED", "ZONE_CHANGED_NEW_AREA", "ENCOUNTER_START", "ENCOUNTER_END", "INSTANCE_ENCOUNTER_ENGAGE_UNIT"}, 217 | priority = 302, 218 | condition = [[local isInstance, instanceType = IsInInstance() 219 | return isInstance and (instanceType == "party" or instanceType == "scenario") and UnitAffectingCombat("player") and IsEncounterInProgress()]], 220 | }, 221 | ["024"] = { 222 | name = L["Dungeon/Scenerio (Combat, Trash)"], 223 | events = {"PLAYER_REGEN_DISABLED", "PLAYER_REGEN_ENABLED", "ZONE_CHANGED_NEW_AREA", "ENCOUNTER_START", "ENCOUNTER_END", "INSTANCE_ENCOUNTER_ENGAGE_UNIT"}, 224 | priority = 202, 225 | condition = [[local isInstance, instanceType = IsInInstance() 226 | return isInstance and (instanceType == "party" or instanceType == "scenario") and UnitAffectingCombat("player") and not IsEncounterInProgress()]], 227 | }, 228 | ["030"] = { 229 | name = L["Raid"], 230 | events = {"ZONE_CHANGED_NEW_AREA"}, 231 | priority = 3, 232 | condition = [[local isInstance, instanceType = IsInInstance() 233 | return isInstance and instanceType == "raid"]], 234 | }, 235 | ["031"] = { 236 | name = L["Raid (Outdoors)"], 237 | events = {"ZONE_CHANGED_INDOORS", "ZONE_CHANGED", "ZONE_CHANGED_NEW_AREA", "SPELL_UPDATE_USABLE"}, 238 | priority = 13, 239 | condition = [[local isInstance, instanceType = IsInInstance() 240 | return isInstance and instanceType == "raid" and IsOutdoors()]], 241 | }, 242 | ["033"] = { 243 | name = L["Raid (Combat, Boss)"], 244 | events = {"PLAYER_REGEN_DISABLED", "PLAYER_REGEN_ENABLED", "ZONE_CHANGED_NEW_AREA", "ENCOUNTER_START", "ENCOUNTER_END", "INSTANCE_ENCOUNTER_ENGAGE_UNIT"}, 245 | priority = 303, 246 | condition = [[local isInstance, instanceType = IsInInstance() 247 | return isInstance and instanceType == "raid" and UnitAffectingCombat("player") and IsEncounterInProgress()]], 248 | }, 249 | ["034"] = { 250 | name = L["Raid (Combat, Trash)"], 251 | events = {"PLAYER_REGEN_DISABLED", "PLAYER_REGEN_ENABLED", "ZONE_CHANGED_NEW_AREA", "ENCOUNTER_START", "ENCOUNTER_END", "INSTANCE_ENCOUNTER_ENGAGE_UNIT"}, 252 | priority = 203, 253 | condition = [[local isInstance, instanceType = IsInInstance() 254 | return isInstance and instanceType == "raid" and UnitAffectingCombat("player") and not IsEncounterInProgress()]], 255 | }, 256 | ["050"] = { 257 | name = L["Arena"], 258 | events = {"ZONE_CHANGED_NEW_AREA"}, 259 | priority = 3, 260 | condition = [[local isInstance, instanceType = IsInInstance() 261 | return isInstance and instanceType == "arena"]], 262 | }, 263 | ["051"] = { 264 | name = L["Arena (Combat)"], 265 | events = {"PLAYER_REGEN_DISABLED", "PLAYER_REGEN_ENABLED", "ZONE_CHANGED_NEW_AREA"}, 266 | priority = 203, 267 | condition = [[local isInstance, instanceType = IsInInstance() 268 | return isInstance and instanceType == "arena" and UnitAffectingCombat("player")]], 269 | }, 270 | ["060"] = { 271 | name = L["Battleground"], 272 | events = {"ZONE_CHANGED_NEW_AREA"}, 273 | priority = 3, 274 | condition = [[local isInstance, instanceType = IsInInstance() 275 | return isInstance and instanceType == "pvp"]], 276 | }, 277 | ["061"] = { 278 | name = L["Battleground (Combat)"], 279 | events = {"PLAYER_REGEN_DISABLED", "PLAYER_REGEN_ENABLED", "ZONE_CHANGED_NEW_AREA"}, 280 | priority = 203, 281 | condition = [[local isInstance, instanceType = IsInInstance() 282 | return isInstance and instanceType == "pvp" and UnitAffectingCombat("player")]], 283 | }, 284 | 285 | 286 | ["100"] = { 287 | name = L["Mounted (any)"], 288 | events = {"PLAYER_MOUNT_DISPLAY_CHANGED", "UNIT_AURA"}, 289 | priority = 100, 290 | condition = "return IsMounted() and not UnitOnTaxi(\"player\")", 291 | }, 292 | 293 | ["101"] = { 294 | name = L["Mounted (only flying-mount)"], 295 | events = {"PLAYER_MOUNT_DISPLAY_CHANGED", "UNIT_AURA"}, 296 | priority = 101, 297 | condition = "return IsMounted() and not UnitOnTaxi(\"player\") and DynamicCam:CurrentMountCanFly()", 298 | }, 299 | 300 | ["102"] = { 301 | name = L["Mounted (only flying-mount + airborne)"], 302 | events = {"PLAYER_MOUNT_DISPLAY_CHANGED", "UNIT_AURA"}, 303 | priority = 102, 304 | condition = "return IsMounted() and not UnitOnTaxi(\"player\") and DynamicCam:CurrentMountCanFly() and IsFlying()", 305 | }, 306 | 307 | ["103"] = { 308 | name = L["Mounted (only flying-mount + airborne + Skyriding)"], 309 | events = {"PLAYER_MOUNT_DISPLAY_CHANGED", "UNIT_AURA"}, 310 | priority = 103, 311 | condition = "return IsMounted() and not UnitOnTaxi(\"player\") and DynamicCam:CurrentMountCanFly() and IsFlying() and DynamicCam:SkyridingOn()", 312 | }, 313 | 314 | ["104"] = { 315 | name = L["Mounted (only flying-mount + Skyriding)"], 316 | events = {"PLAYER_MOUNT_DISPLAY_CHANGED", "UNIT_AURA"}, 317 | priority = 102, 318 | condition = "return IsMounted() and not UnitOnTaxi(\"player\") and DynamicCam:CurrentMountCanFly() and DynamicCam:SkyridingOn()", 319 | }, 320 | 321 | ["105"] = { 322 | name = L["Mounted (only airborne)"], 323 | events = {"PLAYER_MOUNT_DISPLAY_CHANGED", "UNIT_AURA"}, 324 | priority = 101, 325 | condition = "return IsMounted() and not UnitOnTaxi(\"player\") and IsFlying()", 326 | }, 327 | 328 | ["106"] = { 329 | name = L["Mounted (only airborne + Skyriding)"], 330 | events = {"PLAYER_MOUNT_DISPLAY_CHANGED", "UNIT_AURA"}, 331 | priority = 102, 332 | condition = "return IsMounted() and not UnitOnTaxi(\"player\") and IsFlying() and DynamicCam:SkyridingOn()", 333 | }, 334 | 335 | ["107"] = { 336 | name = L["Mounted (only Skyriding)"], 337 | events = {"PLAYER_MOUNT_DISPLAY_CHANGED", "UNIT_AURA"}, 338 | priority = 101, 339 | condition = "return IsMounted() and not UnitOnTaxi(\"player\") and DynamicCam:SkyridingOn()", 340 | }, 341 | 342 | ["115"] = { 343 | name = L["Druid Travel Form"], 344 | events = {"UPDATE_SHAPESHIFT_FORM"}, 345 | executeOnInit = [[this.travelFormIds = { 346 | [3] = true, -- Travel 347 | [4] = true, -- Aquatic 348 | [27] = true, -- Swift Flight 349 | [29] = true, -- Flight 350 | }]], 351 | priority = 100, 352 | condition = [[local formId = GetShapeshiftFormID() 353 | if formId and this.travelFormIds[formId] then 354 | return true 355 | else 356 | return false 357 | end]], 358 | }, 359 | 360 | ["120"] = { 361 | name = L["Dracthyr Soar"], 362 | events = {"UNIT_AURA"}, 363 | priority = 100, 364 | condition = [[if C_UnitAuras.GetPlayerAuraBySpellID(430747) ~= nil then return true end 365 | return false]], 366 | }, 367 | 368 | ["130"] = { 369 | name = L["Skyriding Race"], 370 | events = {"UNIT_AURA"}, 371 | -- Get all "Race Starting" buff IDs with the copy ID button here: 372 | -- https://www.wowhead.com/spells/uncategorized/name:race+starting 373 | -- (Use the "copy" icon, then select ID. Sorting must be done afterwards.) 374 | executeOnInit = [[-- "Race Starting" buffs. 375 | local raceBuffList = {369893, 370014, 370326, 370329, 370419, 370426, 372239, 373495, 373571, 373578, 373851, 373857, 374088, 374091, 374143, 374144, 374182, 374183, 374244, 374246, 374412, 374414, 374592, 374593, 374825, 375236, 375261, 375262, 375356, 375358, 375477, 375479, 375810, 376062, 376195, 376366, 376805, 376817, 377025, 377026, 377692, 377745, 378415, 378430, 378753, 378775, 379036, 379397, 381978, 382000, 382632, 382652, 382717, 382755, 383473, 383474, 383596, 383597, 386211, 386331, 387548, 387563, 392228, 395088, 396688, 396710, 396712, 396714, 396934, 396943, 396960, 396977, 396984, 396997, 397050, 397129, 397131, 397141, 397143, 397147, 397151, 397155, 397157, 397175, 397179, 397182, 397187, 397189, 398027, 398034, 398049, 398054, 398100, 398107, 398113, 398116, 398120, 398123, 398141, 398213, 398228, 398264, 398309, 398326, 398408, 398428, 403192, 403205, 403502, 403533, 403679, 403729, 403746, 403784, 403795, 403830, 403884, 403898, 403934, 403992, 404002, 404558, 404640, 404644, 406234, 406257, 406294, 406297, 406398, 406400, 406401, 406420, 406421, 406422, 406438, 406439, 406440, 406506, 406507, 406508, 406696, 406697, 406698, 406766, 406767, 406768, 406799, 406800, 406801, 406923, 406924, 406925, 406943, 406944, 406945, 407214, 407215, 407216, 407529, 407530, 407531, 407593, 407594, 407595, 407619, 407620, 407621, 407717, 407718, 407719, 407756, 407757, 407758, 409713, 409738, 409758, 409759, 409760, 409761, 409762, 409763, 409766, 409768, 409774, 409775, 409778, 409780, 409782, 409783, 409786, 409787, 409791, 409792, 409793, 409794, 409796, 409797, 409799, 409800, 409801, 409802, 409803, 409804, 409807, 409808, 409811, 409812, 409814, 409815, 409817, 409818, 409820, 409821, 409855, 409857, 409859, 409860, 409861, 409862, 409863, 409864, 409865, 409866, 409867, 409868, 410748, 410749, 410750, 410751, 410752, 410753, 410754, 410755, 410756, 410757, 410758, 410759, 410853, 410854, 410855, 410856, 410857, 410858, 410859, 410860, 410861, 410862, 410863, 410864, 411311, 411312, 411314, 411315, 411316, 411317, 411318, 411319, 411320, 411322, 411323, 411325, 411326, 411327, 411329, 411330, 411331, 411332, 411333, 411334, 411335, 411336, 411337, 411338, 411339, 411340, 411341, 411342, 411343, 411345, 411346, 411347, 413655, 413690, 413695, 413778, 413779, 413780, 413851, 413852, 413854, 413940, 413941, 413942, 413966, 413967, 413968, 414016, 414017, 414018, 414349, 414350, 414351, 414368, 414372, 414374, 414616, 414617, 414618, 414740, 414741, 414742, 414751, 414755, 414756, 414773, 414774, 414775, 414829, 414830, 414831, 414891, 414892, 414893, 415587, 417042, 417043, 417044, 417226, 417230, 417231, 417604, 417605, 417606, 417758, 417760, 417761, 417869, 417870, 417871, 417948, 417949, 417950, 418026, 418027, 418028, 418142, 418143, 418144, 418287, 418288, 418289, 418461, 418465, 418466, 419432, 419433, 419434, 419679, 419680, 419681, 420157, 420158, 420159, 420742, 420917, 420965, 420975, 420988, 421060, 421437, 421438, 421439, 421451, 421452, 422015, 422017, 422018, 422020, 422021, 422174, 422175, 422176, 422178, 422179, 422400, 422401, 422402, 422403, 422404, 423378, 423380, 423381, 423382, 423383, 423562, 423568, 423577, 423579, 423580, 425090, 425091, 425092, 425333, 425334, 425335, 425449, 425450, 425452, 425597, 425598, 425601, 425740, 425741, 425742, 426038, 426039, 426040, 426109, 426110, 426111, 426347, 426348, 426349, 426583, 426584, 426585, 427231, 427234, 427235, 431833, 431834, 431835, 431898, 431899, 431900, 439233, 439234, 439235, 439236, 439238, 439239, 439241, 439243, 439244, 439245, 439246, 439247, 439248, 439249, 439250, 439251, 439252, 439254, 439257, 439258, 439260, 439261, 439262, 439263, 439265, 439266, 439267, 439268, 439269, 439270, 439271, 439272, 439273, 439274, 439275, 439276, 439277, 439278, 439281, 439282, 439283, 439284, 439286, 439287, 439288, 439289, 439290, 439291, 439292, 439293, 439294, 439295, 439296, 439298, 439300, 439301, 439302, 439303, 439304, 439305, 439307, 439308, 439309, 439310, 439311, 439313, 439316, 439317, 439318, 439319, 439320, 439321} 376 | 377 | -- For faster lookups: 378 | this.raceBuffs = {} 379 | for _, v in pairs(raceBuffList) do 380 | this.raceBuffs[v] = true 381 | end 382 | ]], 383 | priority = 103, 384 | condition = [[-- Check for "Racing" buff first, which is the most common one. 385 | if C_UnitAuras.GetPlayerAuraBySpellID(369968) ~= nil then return true end 386 | for i = 1, 40 do 387 | local aura = C_UnitAuras.GetBuffDataByIndex("player", i) 388 | if aura and aura.spellId and this.raceBuffs[aura.spellId] then 389 | return true 390 | end 391 | end 392 | return false]], 393 | }, 394 | 395 | ["160"] = { 396 | name = L["Taxi"], 397 | events = {"PLAYER_CONTROL_LOST", "PLAYER_CONTROL_GAINED"}, 398 | priority = 1000, 399 | condition = "return UnitOnTaxi(\"player\")", 400 | }, 401 | ["170"] = { 402 | name = L["Vehicle"], 403 | events = {"UNIT_ENTERED_VEHICLE", "UNIT_EXITED_VEHICLE"}, 404 | priority = 1000, 405 | condition = "return UnitUsingVehicle(\"player\")", 406 | }, 407 | 408 | ["200"] = { 409 | name = L["Hearth/Teleport"], 410 | events = {"UNIT_SPELLCAST_START", "UNIT_SPELLCAST_STOP", "UNIT_SPELLCAST_SUCCEEDED", "UNIT_SPELLCAST_CHANNEL_START", "UNIT_SPELLCAST_CHANNEL_STOP", "UNIT_SPELLCAST_CHANNEL_UPDATE", "UNIT_SPELLCAST_INTERRUPTED"}, 411 | executeOnInit = [[local teleportSpellList = { 412 | 556, -- Astral Recall 413 | 3561, -- Teleport: Stormwind 414 | 3562, -- Teleport: Ironforge 415 | 3563, -- Teleport: Undercity 416 | 3565, -- Teleport: Darnassus 417 | 3566, -- Teleport: Thunder Bluff 418 | 3567, -- Teleport: Orgrimmar 419 | 8690, -- Hearthstone 420 | 18960, -- Teleport: Moonglade 421 | 23442, -- Everlook Transporter 422 | 23453, -- Gnomish Transporter 423 | 26373, -- Lunar Festival Invitation 424 | 32271, -- Teleport: Exodar 425 | 32272, -- Teleport: Silvermoon 426 | 33690, -- Teleport: Shattrath 427 | 35715, -- Teleport: Shattrath 428 | 36890, -- Area52 Transporter 429 | 36941, -- Toshley's Station Transporter 430 | 41234, -- Teleport: Black Temple 431 | 49358, -- Teleport: Stonard 432 | 49359, -- Teleport: Theramore 433 | 49844, -- Using Direbrew's Remote 434 | 50977, -- Death Gate 435 | 53140, -- Teleport: Dalaran - Northrend 436 | 54406, -- Teleport: Dalaran 437 | 66238, -- Argent Crusader's Tabard 438 | 67833, -- Wormhole Generator: Northrend 439 | 73324, -- Jaina's Locket 440 | 75136, -- Ethereal Portal 441 | 88342, -- Teleport: Tol Barad 442 | 88344, -- Teleport: Tol Barad 443 | 89157, -- Teleport: Stormwind (Guild Cloaks) 444 | 89158, -- Teleport: Orgrimmar (Guild Cloaks) 445 | 89597, -- Baradin's Wardens Tabard 446 | 89598, -- Hellscream's Reach Tabard 447 | 94719, -- The Innkeeper's Daughter 448 | 120145, -- Ancient Teleport: Dalaran 449 | 126755, -- Wormhole Generator: Pandaria 450 | 132621, -- Teleport: Vale of Eternal Blossoms 451 | 132627, -- Teleport: Vale of Eternal Blossoms 452 | 136508, -- Dark Portal 453 | 140295, -- Kirin Tor Beacon 454 | 147985, -- Curious Bronze Timepiece 455 | 163830, -- Wormhole Centrifuge 456 | 168487, -- Home Away from Home 457 | 168499, -- Home Away from Home 458 | 171253, -- Garrison Hearthstone 459 | 175608, -- Relic of Karabor 460 | 176242, -- Teleport: Warspear 461 | 176248, -- Teleport: Stormshield 462 | 189838, -- Teleport to Shipyard 463 | 192084, -- Jump to Skyhold 464 | 192085, -- Jump to Skyhold 465 | 193669, -- Basic Dimensional Rifting 466 | 193753, -- Dreamwalk 467 | 193759, -- Teleport: Hall of the Guardian 468 | 196079, -- Recall (to the sanctuary of Frostwolf Keep) 469 | 196080, -- Recall (to the sanctuary of Dun Baldar) 470 | 216016, -- Jump to Skyhold 471 | 222695, -- Dalaran Hearthstone 472 | 223352, -- Khadgar's Beacon (Teleport to Dalaran) 473 | 223805, -- Advanced Dimensional Rifting 474 | 224869, -- Teleport: Dalaran - Broken Isles 475 | 225428, -- Town Portal: Shala'nir 476 | 225434, -- Town Portal: Sashj'tar 477 | 225435, -- Town Portal: Kal'delar 478 | 225436, -- Town Portal: Faronaar 479 | 225440, -- Town Portal: Lian'tril 480 | 227334, -- Flight Master's Whistle 481 | 231504, -- [Tome of] Town Portal 482 | 231505, -- [Scroll of] Town Portal 483 | 248906, -- Vindicaar Teleport Beacon 484 | 250796, -- Wormhole Generator: Argus 485 | 262100, -- Recall (to your Great Hall) 486 | 278244, -- Greatfather Winter's Hearthstone 487 | 278559, -- Headless Horseman's Hearthstone 488 | 281403, -- Teleport: Boralus 489 | 281404, -- Teleport: Dazar'alor 490 | 285362, -- Lunar Elder's Hearthstone 491 | 285424, -- Peddlefeet's Lovely Hearthstone 492 | 286031, -- Noble Gardener's Hearthstone 493 | 286331, -- Fire Eater's Hearthstone 494 | 286353, -- Brewfest Reveler's Hearthstone 495 | 291981, -- Ultrasafe Transporter: Mechagon 496 | 292764, -- Returning (BfA Quest) 497 | 293840, -- Teleport: Moonglade (back) 498 | 298068, -- Holographic Digitalization Hearthstone 499 | 299083, -- Wormhole Generator: Kul Tiras 500 | 299084, -- Wormhole Generator: Zandalar 501 | 308742, -- Eternal Traveler's Hearthstone 502 | 311643, -- Hearth to Faol's Rest 503 | 311681, -- Tirisfal Camp Scroll 504 | 311749, -- Hearth to Uther's Tomb 505 | 312372, -- Return to Camp 506 | 324031, -- Wormhole Generator: Shadowlands 507 | 325624, -- Cypher of Relocation 508 | 326064, -- Night Fae Hearthstone 509 | 335671, -- Scroll of Teleport: Theater of Pain 510 | 340200, -- Necrolord Hearthstone 511 | 340767, -- Chromie's Teleportation Scroll 512 | 342122, -- Venthyr Sinstone 513 | 344587, -- Teleport: Oribos 514 | 345393, -- Kyrian Hearthstone 515 | 346167, -- Attendant's Pocket Portal: Bastion 516 | 346168, -- Attendant's Pocket Portal: Oribos 517 | 346170, -- Attendant's Pocket Portal: Ardenweald 518 | 346171, -- Attendant's Pocket Portal: Maldraxxus 519 | 346173, -- Attendant's Pocket Portal: Revendreth 520 | 363799, -- Dominated Hearthstone 521 | 366945, -- Enlightened Hearthstone 522 | 367013, -- Broker Translocation Matrix 523 | 368788, -- Hearth to Brill 524 | 375357, -- Timewalker's Hearthstone 525 | 386379, -- Wyrmhole Generator: Dragon Isles 526 | 391042, -- Ohn'ir Windsage's Hearthstone 527 | 395277, -- Teleport: Valdrakken 528 | 398099, -- Thrall's Hearthstone (Orc Heritage Campaign) 529 | 401802, -- Stone of the Hearth 530 | 410148, -- Lost Dragonscale 531 | 412555, -- Path of the Naaru 532 | 418549, -- Teleporting to the Vindicaar 533 | 420418, -- Deepdweller's Earthen Hearthstone 534 | 422284, -- Hearthstone of the Flame 535 | 426620, -- Spare Hologem (Draenei Heritage Quest) 536 | 438606, -- Draenic Hologem (Hearthstone) 537 | 441154, -- Nostwin's Voucher (Pandaria Remix) 538 | 446540, -- Teleport: Dornogal 539 | 448126, -- Wormhole Generator: Khaz Algar 540 | 449508, -- Nostwin's Return Service (Pandaria Remix) 541 | 450410, -- Dalaran Hearthstone (Dark Heart Quest) 542 | 460271, -- Teleporting to Silithus 543 | 463481, -- Notorious Thread's Hearthstone 544 | 1221356, -- Teleport: Orgrimmar (Guild Cloaks) 545 | 1221357, -- Teleport: Orgrimmar (Guild Cloaks) 546 | 1221359, -- Teleport: Stormwind (Guild Cloaks) 547 | 1221360, -- Teleport: Stormwind (Guild Cloaks) 548 | 549 | } 550 | 551 | -- For faster lookups: 552 | this.teleportSpells = {} 553 | for _, v in pairs(teleportSpellList) do 554 | this.teleportSpells[v] = true 555 | end 556 | ]], 557 | priority = 130, 558 | condition = [[local _, _, _, _, _, _, _, _, spellId = UnitCastingInfo("player") 559 | if this.teleportSpells[spellId] then return true end 560 | return false]], 561 | executeOnEnter = [[local _, _, _, startTime, endTime = UnitCastingInfo("player") 562 | this.transitionTime = (endTime - startTime)/1000 563 | this.rotationTime = this.transitionTime]], 564 | }, 565 | ["201"] = { 566 | name = L["Annoying Spells"], 567 | events = {"UNIT_AURA"}, 568 | executeOnInit = [[local annoyingSpellList = { 569 | 46924, -- Bladestorm 570 | 51690, -- Killing Spree 571 | 188499, -- Blade Dance 572 | 210152, -- Death Sweep 573 | } 574 | 575 | -- For faster lookups: 576 | this.annoyingSpells = {} 577 | for _, v in pairs(annoyingSpellList) do 578 | this.annoyingSpells[v] = true 579 | end 580 | ]], 581 | priority = 1000, 582 | condition = [[for i = 1, 40 do 583 | local spellId = nil 584 | if UnitBuff then -- Classic 585 | _, _, _, _, _, _, _, _, _, spellId = UnitBuff("player", i) 586 | else -- Retail 587 | local aura = C_UnitAuras.GetBuffDataByIndex("player", i) 588 | if aura then spellId = aura.spellId end 589 | end 590 | 591 | if this.annoyingSpells[spellId] then return true end 592 | end 593 | return false]], 594 | }, 595 | ["300"] = { 596 | name = L["NPC Interaction"], 597 | events = {"AUCTION_HOUSE_CLOSED", "AUCTION_HOUSE_SHOW", "BANKFRAME_CLOSED", "BANKFRAME_OPENED", "CLOSE_TABARD_FRAME", "GOSSIP_CLOSED", "GOSSIP_SHOW", "GUILD_REGISTRAR_CLOSED", "GUILD_REGISTRAR_SHOW", "MERCHANT_CLOSED", "MERCHANT_SHOW", "OPEN_TABARD_FRAME", "PET_STABLE_CLOSED", "PET_STABLE_SHOW", "PLAYER_INTERACTION_MANAGER_FRAME_HIDE", "PLAYER_INTERACTION_MANAGER_FRAME_SHOW", "PLAYER_TARGET_CHANGED", "QUEST_COMPLETE", "QUEST_DETAIL", "QUEST_FINISHED", "QUEST_GREETING", "QUEST_PROGRESS", "SHIPMENT_CRAFTER_CLOSED", "SHIPMENT_CRAFTER_OPENED", "TRAINER_CLOSED", "TRAINER_SHOW", "TRANSMOGRIFY_CLOSE", "TRANSMOGRIFY_OPEN"}, 598 | executeOnInit = [[this.frames = {"AuctionHouseFrame", "BagnonBankFrame1", "BankFrame", "ClassTrainerFrame", "GarrisonCapacitiveDisplayFrame", "GossipFrame", "GuildRegistrarFrame", "ImmersionFrame", "MerchantFrame", "PetStableFrame", "QuestFrame", "TabardFrame", "WardrobeFrame"} 599 | 600 | this.excludedFrames = {"FlightMapFrame"} 601 | 602 | this.mountVendors = { 603 | ["62821"] = 460, -- Grand Expedition Yak 604 | ["62822"] = 460, -- Grand Expedition Yak 605 | ["227773"] = 2237, -- Grizzly Hills Packmaster 606 | ["227774"] = 2237, -- Grizzly Hills Packmaster 607 | ["231085"] = 2265, -- Trader's Gilded Brutosaur 608 | -- Add more npcId and mountId pairs here. 609 | -- To find them, uncomment print command in condition script. 610 | } 611 | ]], 612 | priority = 110, 613 | condition = [[-- Don't want to apply this to my own mount vendors while mounted. 614 | if IsMounted() then 615 | local npcGUID = UnitGUID("npc") 616 | if npcGUID then 617 | local _, _, _, _, _, npcId = strsplit("-", npcGUID) 618 | -- Uncomment this to find out npcId and mountId pairs. 619 | -- print("NPC Condition: Current npc", npcId, "current mount", DynamicCam:GetCurrentMount()) 620 | if this.mountVendors[npcId] and this.mountVendors[npcId] == DynamicCam:GetCurrentMount() then 621 | return false 622 | end 623 | end 624 | end 625 | 626 | local shown = false 627 | for _, v in pairs(this.frames) do 628 | if (_G[v] and _G[v]:IsShown()) then 629 | shown = true 630 | break 631 | end 632 | end 633 | 634 | for _, v in pairs(this.excludedFrames) do 635 | if (_G[v] and _G[v]:IsShown()) then 636 | shown = false 637 | break 638 | end 639 | end 640 | 641 | return shown and UnitExists("npc")]], 642 | }, 643 | ["301"] = { 644 | name = L["Mailbox"], 645 | events = {"MAIL_SHOW", "PLAYER_INTERACTION_MANAGER_FRAME_SHOW", "PLAYER_INTERACTION_MANAGER_FRAME_HIDE", "MAIL_CLOSED", "GOSSIP_CLOSED"}, 646 | priority = 110, 647 | condition = [[ 648 | -- Exclude Trader's Gilded Brutosaur Mailbox. 649 | if IsMounted() then 650 | local npcGUID = UnitGUID("npc") 651 | if npcGUID then 652 | local _, _, _, _, _, npcId = strsplit("-", npcGUID) 653 | -- print("Mailbox Condition: Current npc", npcId, "current mount", DynamicCam:GetCurrentMount()) 654 | if npcId == "231086" and DynamicCam:GetCurrentMount() == 2265 then 655 | return false 656 | end 657 | end 658 | end 659 | 660 | return MailFrame and MailFrame:IsShown() 661 | ]], 662 | }, 663 | ["302"] = { 664 | name = L["Fishing"], 665 | events = {"UNIT_SPELLCAST_START", "UNIT_SPELLCAST_STOP", "UNIT_SPELLCAST_SUCCEEDED", "UNIT_SPELLCAST_CHANNEL_START", "UNIT_SPELLCAST_CHANNEL_STOP", "UNIT_SPELLCAST_CHANNEL_UPDATE", "UNIT_SPELLCAST_INTERRUPTED"}, 666 | priority = 20, 667 | condition = [[if GetSpellInfo then -- Classic 668 | return UnitChannelInfo("player") == GetSpellInfo(7620) 669 | else -- Retail 670 | return UnitChannelInfo("player") == C_Spell.GetSpellName(7620) 671 | end]], 672 | delay = 1, 673 | }, 674 | ["320"] = { 675 | name = L["Gathering"], 676 | events = {"UNIT_SPELLCAST_START", "UNIT_SPELLCAST_STOP", "UNIT_SPELLCAST_SUCCEEDED", "UNIT_SPELLCAST_CHANNEL_START", "UNIT_SPELLCAST_CHANNEL_STOP", "UNIT_SPELLCAST_CHANNEL_UPDATE", "UNIT_SPELLCAST_INTERRUPTED"}, 677 | executeOnInit = [[this.spells = { 678 | -- https://www.wowhead.com/spells/professions/mining/name:mining 679 | 2575, 2576, 2656, 3564, 10248, 29354, 50310, 74517, 102161, 158754, 195122, 265837, 265839, 265841, 265843, 265845, 265847, 265849, 265851, 265853, 309835, 366260, 423341, 680 | -- https://www.wowhead.com/spells/professions/skinning/name:skinning 681 | 8613, 8617, 8618, 10768, 32678, 50305, 74522, 102216, 158756, 194174, 195125, 205243, 265855, 265857, 265859, 265861, 265863, 265865, 265867, 265869, 265871, 308569, 366259, 392440, 392445, 423342, 682 | -- https://www.wowhead.com/spells/professions/herbalism/name:gathering 683 | 2366, 2368, 3570, 11993, 28695, 50300, 74519, 110413, 158745, 195114, 265819, 265821, 265823, 265825, 265827, 265829, 265831, 265834, 265835, 309780, 366252, 441327, 684 | }]], 685 | priority = 120, 686 | condition = [[local name, _, _, _, _, _, _, _, spellId = UnitCastingInfo("player") 687 | -- Uncomment this to find out more spell IDs. 688 | -- print(name, spellId) 689 | for _, v in pairs(this.spells) do 690 | if v == spellId then return true end 691 | end 692 | return false]] 693 | }, 694 | ["303"] = { 695 | name = L["AFK"], 696 | events = {"PLAYER_FLAGS_CHANGED"}, 697 | priority = 120, 698 | condition = "return UnitIsAFK(\"player\")", 699 | }, 700 | ["310"] = { 701 | name = L["Pet Battle"], 702 | events = {"PET_BATTLE_OPENING_START", "PET_BATTLE_CLOSE"}, 703 | priority = 130, 704 | condition = "return C_PetBattles.IsInBattle()", 705 | }, 706 | }, 707 | 708 | }, 709 | } 710 | 711 | 712 | -- Special modifications for classic. 713 | if WOW_PROJECT_ID ~= WOW_PROJECT_MAINLINE then 714 | 715 | -- No pet battles before mists. 716 | DynamicCam.defaults.profile.situations["310"] = nil 717 | 718 | DynamicCam.defaults.profile.situations["103"] = nil -- Mounted (only flying-mount + airborne + Skyriding) 719 | DynamicCam.defaults.profile.situations["104"] = nil -- Mounted (only flying-mount + Skyriding) 720 | DynamicCam.defaults.profile.situations["106"] = nil -- Mounted (only airborne + Skyriding) 721 | DynamicCam.defaults.profile.situations["107"] = nil -- Mounted (only Skyriding) 722 | 723 | DynamicCam.defaults.profile.situations["120"] = nil -- Dracthyr Soar 724 | DynamicCam.defaults.profile.situations["130"] = nil -- Dragon Racing 725 | 726 | 727 | 728 | if WOW_PROJECT_ID == WOW_PROJECT_CLASSIC then 729 | 730 | -- Cannot have SHIPMENT_CRAFTER_CLOSED, SHIPMENT_CRAFTER_OPENED, TRANSMOGRIFY_CLOSE, TRANSMOGRIFY_OPEN. 731 | -- In classic also not PLAYER_INTERACTION_MANAGER_FRAME_HIDE and PLAYER_INTERACTION_MANAGER_FRAME_SHOW. 732 | DynamicCam.defaults.profile.situations["300"].events = {"AUCTION_HOUSE_CLOSED", "AUCTION_HOUSE_SHOW", "BANKFRAME_CLOSED", "BANKFRAME_OPENED", "CLOSE_TABARD_FRAME", "GOSSIP_CLOSED", "GOSSIP_SHOW", "GUILD_REGISTRAR_CLOSED", "GUILD_REGISTRAR_SHOW", "MERCHANT_CLOSED", "MERCHANT_SHOW", "OPEN_TABARD_FRAME", "PET_STABLE_CLOSED", "PET_STABLE_SHOW", "PLAYER_TARGET_CHANGED", "QUEST_COMPLETE", "QUEST_DETAIL", "QUEST_FINISHED", "QUEST_GREETING", "QUEST_PROGRESS", "TRAINER_CLOSED", "TRAINER_SHOW", "TAXIMAP_OPENED", "TAXIMAP_CLOSED"} 733 | 734 | DynamicCam.defaults.profile.situations["301"].events = {"MAIL_SHOW", "MAIL_CLOSED", "GOSSIP_CLOSED"} 735 | 736 | 737 | -- No flying in classic. 738 | DynamicCam.defaults.profile.situations["101"] = nil 739 | DynamicCam.defaults.profile.situations["102"] = nil 740 | DynamicCam.defaults.profile.situations["105"] = nil 741 | 742 | 743 | -- No vehicles before wrath. 744 | DynamicCam.defaults.profile.situations["170"] = nil 745 | 746 | 747 | -- Currently Wrath classic. 748 | else 749 | 750 | -- Cannot have "SHIPMENT_CRAFTER_CLOSED", "SHIPMENT_CRAFTER_OPENED", "TRANSMOGRIFY_CLOSE", "TRANSMOGRIFY_OPEN 751 | DynamicCam.defaults.profile.situations["300"].events = {"AUCTION_HOUSE_CLOSED", "AUCTION_HOUSE_SHOW", "BANKFRAME_CLOSED", "BANKFRAME_OPENED", "CLOSE_TABARD_FRAME", "GOSSIP_CLOSED", "GOSSIP_SHOW", "GUILD_REGISTRAR_CLOSED", "GUILD_REGISTRAR_SHOW", "MERCHANT_CLOSED", "MERCHANT_SHOW", "OPEN_TABARD_FRAME", "PET_STABLE_CLOSED", "PET_STABLE_SHOW", "PLAYER_INTERACTION_MANAGER_FRAME_HIDE", "PLAYER_INTERACTION_MANAGER_FRAME_SHOW", "PLAYER_TARGET_CHANGED", "QUEST_COMPLETE", "QUEST_DETAIL", "QUEST_FINISHED", "QUEST_GREETING", "QUEST_PROGRESS", "TRAINER_CLOSED", "TRAINER_SHOW"} 752 | 753 | 754 | -- No way to filter for flying mounts in Wrath classic. 755 | DynamicCam.defaults.profile.situations["101"] = nil 756 | DynamicCam.defaults.profile.situations["102"] = nil 757 | 758 | end 759 | 760 | end 761 | 762 | 763 | 764 | 765 | -- Copy the defaults into each situation. 766 | for _, situation in pairs(DynamicCam.defaults.profile.situations) do 767 | for k, v in pairs(DynamicCam.situationDefaults) do 768 | -- But only if the situation does not have a custom setting. 769 | if not situation[k] then 770 | situation[k] = v 771 | end 772 | end 773 | end 774 | 775 | 776 | 777 | 778 | -- With DC 2.0, some default values changed. As AceDB does not store default values, 779 | -- non-existent entries may have to be set to the old default when modernizing a profile. 780 | DynamicCam.oldDefaults = { 781 | 782 | shoulderOffsetZoom = { 783 | enabled = true, 784 | lowerBound = 2, 785 | upperBound = 8, 786 | }, 787 | 788 | reactiveZoom = { 789 | enabled = false, 790 | addIncrementsAlways = 1, 791 | addIncrements = 3, 792 | maxZoomTime = .25, 793 | incAddDifference = 4, 794 | }, 795 | 796 | defaultCvars = { 797 | cameraDistanceMaxZoomFactor = 2.6, 798 | cameraZoomSpeed = 20, 799 | 800 | test_cameraOverShoulder = 0, 801 | 802 | test_cameraDynamicPitch = 0, 803 | test_cameraDynamicPitchBaseFovPad = .35, 804 | test_cameraDynamicPitchBaseFovPadFlying = .75, 805 | test_cameraDynamicPitchBaseFovPadDownScale = .25, 806 | test_cameraDynamicPitchSmartPivotCutoffDist = 10, 807 | 808 | test_cameraTargetFocusEnemyEnable = 0, 809 | test_cameraTargetFocusEnemyStrengthYaw = 0.5, 810 | test_cameraTargetFocusEnemyStrengthPitch = 0.4, 811 | test_cameraTargetFocusInteractEnable = 0, 812 | test_cameraTargetFocusInteractStrengthYaw = 1.0, 813 | test_cameraTargetFocusInteractStrengthPitch = 0.75, 814 | 815 | test_cameraHeadMovementStrength = 0, 816 | test_cameraHeadMovementStandingStrength = 0.3, 817 | test_cameraHeadMovementStandingDampRate = 10, 818 | test_cameraHeadMovementMovingStrength = 0.5, 819 | test_cameraHeadMovementMovingDampRate = 10, 820 | test_cameraHeadMovementFirstPersonDampRate = 20, 821 | test_cameraHeadMovementRangeScale = 5, 822 | test_cameraHeadMovementDeadZone = 0.015, 823 | }, 824 | 825 | situations = { 826 | 827 | enabled = true, 828 | 829 | cameraActions = { 830 | transitionTime = 0.75, 831 | timeIsMax = true, 832 | 833 | rotate = false, 834 | rotateSetting = "continuous", 835 | rotateSpeed = 20, 836 | yawDegrees = 0, 837 | pitchDegrees = 0, 838 | rotateBack = false, 839 | 840 | zoomSetting = "off", 841 | zoomValue = 10, 842 | zoomMin = 5, 843 | zoomMax = 15, 844 | }, 845 | view = { 846 | enabled = false, 847 | viewNumber = 5, 848 | restoreView = false, 849 | instant = false, 850 | }, 851 | extras = { 852 | hideUI = false, 853 | hideUIFadeOpacity = 0, 854 | actuallyHideUI = true, 855 | keepMinimap = false, 856 | }, 857 | }, 858 | 859 | -- AFK was the only situation in DC pre-2.0 that had other defaults. 860 | afkSituation = { 861 | cameraActions = { 862 | transitionTime = 1, 863 | rotateSpeed = 3, 864 | zoomValue = 9, 865 | rotate = true, 866 | zoomSetting = "out", 867 | }, 868 | extras = { 869 | hideUI = true, 870 | }, 871 | 872 | } 873 | 874 | } 875 | 876 | -------------------------------------------------------------------------------- /DynamicCam-Cata.toc: -------------------------------------------------------------------------------- 1 | ## Interface: 40402 2 | ## Version: @project-version@ 3 | ## Title: DynamicCam 4 | ## Author: mpstark, LudiusMaximus 5 | ## Notes: A more dynamic camera. 6 | ## Notes-zhCN: 智能动态相机镜头。 7 | 8 | ## OptionalDeps: Ace3, LibCamera, LibEasing, LibCompress, Bartender4, GW2_UI, Immersion, Immersion_ExtraFade 9 | ## SavedVariables: DynamicCamDB, minZoomValues 10 | 11 | ## X-Curse-Project-ID: 101120 12 | ## X-WoWI-ID: 25570 13 | ## X-Wago-ID: b6XVoOGp 14 | 15 | ## X-Donate: PayPal:ludiusmaximus@gmail.com 16 | ## X-License: The MIT License (MIT) 17 | 18 | 19 | embeds.xml 20 | 21 | 22 | UiHideModule.lua 23 | 24 | 25 | Core.lua 26 | 27 | MouseZoom.lua 28 | SituationManager.lua 29 | 30 | DefaultSettings.lua 31 | 32 | Sharing.lua 33 | Presets.lua 34 | Options.lua 35 | -------------------------------------------------------------------------------- /DynamicCam-Classic.toc: -------------------------------------------------------------------------------- 1 | ## Interface: 11507 2 | ## Version: @project-version@ 3 | ## Title: DynamicCam 4 | ## Author: mpstark, LudiusMaximus 5 | ## Notes: A more dynamic camera. 6 | ## Notes-zhCN: 智能动态相机镜头。 7 | 8 | ## OptionalDeps: Ace3, LibCamera, LibEasing, LibCompress, Bartender4, GW2_UI, Immersion, Immersion_ExtraFade 9 | ## SavedVariables: DynamicCamDB, minZoomValues 10 | 11 | ## X-Curse-Project-ID: 101120 12 | ## X-WoWI-ID: 25570 13 | ## X-Wago-ID: b6XVoOGp 14 | 15 | ## X-Donate: PayPal:ludiusmaximus@gmail.com 16 | ## X-License: The MIT License (MIT) 17 | 18 | 19 | embeds.xml 20 | 21 | 22 | UiHideModule.lua 23 | 24 | 25 | Core.lua 26 | 27 | MouseZoom.lua 28 | SituationManager.lua 29 | 30 | DefaultSettings.lua 31 | 32 | Sharing.lua 33 | Presets.lua 34 | Options.lua 35 | -------------------------------------------------------------------------------- /DynamicCam-Wrath.toc: -------------------------------------------------------------------------------- 1 | ## Interface: 30403 2 | ## Version: @project-version@ 3 | ## Title: DynamicCam 4 | ## Author: mpstark, LudiusMaximus 5 | ## Notes: A more dynamic camera. 6 | ## Notes-zhCN: 智能动态相机镜头。 7 | 8 | ## OptionalDeps: Ace3, LibCamera, LibEasing, LibCompress, Bartender4, GW2_UI, Immersion, Immersion_ExtraFade 9 | ## SavedVariables: DynamicCamDB, minZoomValues 10 | 11 | ## X-Curse-Project-ID: 101120 12 | ## X-WoWI-ID: 25570 13 | ## X-Wago-ID: b6XVoOGp 14 | 15 | ## X-Donate: PayPal:ludiusmaximus@gmail.com 16 | ## X-License: The MIT License (MIT) 17 | 18 | 19 | embeds.xml 20 | 21 | 22 | UiHideModule.lua 23 | 24 | 25 | Core.lua 26 | 27 | MouseZoom.lua 28 | SituationManager.lua 29 | 30 | DefaultSettings.lua 31 | 32 | Sharing.lua 33 | Presets.lua 34 | Options.lua 35 | -------------------------------------------------------------------------------- /DynamicCam.toc: -------------------------------------------------------------------------------- 1 | ## Interface: 110105 2 | ## Version: @project-version@ 3 | ## Title: DynamicCam 4 | ## Author: mpstark, LudiusMaximus 5 | ## Notes: A more dynamic camera. 6 | ## Notes-zhCN: 智能动态相机镜头。 7 | 8 | ## OptionalDeps: Ace3, LibCamera, LibEasing, LibCompress, LibHideUI, Bartender4, GW2_UI, Immersion, Immersion_ExtraFade 9 | ## SavedVariables: DynamicCamDB, minZoomValues 10 | 11 | ## X-Curse-Project-ID: 101120 12 | ## X-WoWI-ID: 25570 13 | ## X-Wago-ID: b6XVoOGp 14 | 15 | ## X-Donate: PayPal:ludiusmaximus@gmail.com 16 | ## X-License: The MIT License (MIT) 17 | 18 | 19 | embeds.xml 20 | 21 | 22 | UiHideModule.lua 23 | 24 | 25 | Core.lua 26 | 27 | MouseZoom.lua 28 | SituationManager.lua 29 | 30 | DefaultSettings.lua 31 | 32 | Sharing.lua 33 | Presets.lua 34 | Options.lua 35 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017-2020 Michael P. Starkweather (mpstark), 2020-2025 LudiusMaximus 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Libs/LICENSE.md: -------------------------------------------------------------------------------- 1 | All library code contained in this directory ("Libs") is owned and licensed by their respective owners. 2 | -------------------------------------------------------------------------------- /Locales/Locales.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 |