UI and Macro

Jan 20, 2017 Welcome! Please read! Welcome to the UI and Macro forum! This forum is here to provide you with a friendly environment where you can discuss user interface customizations for World of Warcraft with your fellow players. Community forums work best when participants treat their fellow posters with respect and courtesy, so we ask that you take the time to read through the forum Code of Conduct (http://us.battle.net/en/community/conduct) and guidelines (https://us.battle.net/forums/en/wow/topic/20752671773) before posting. Important Reminders: Search The search function at the top of the World of Warcraft community site is extremely effective and robust. Before you create a new forum topic, please be use it to search for similar topics, blog posts, or web pages that may contain the answer for which you are looking. Making a new thread on an existing subject can result in your thread being deleted or, if you continue to re-post the same content, the loss of your forum privileges for spamming. Rating The forum rating system can be used to promote positive discussion, demote unhelpful comments, and even report posts that violate the forum Code of Conduct. By hovering over a post you'll be presented with several options, including a "thumbs up" (Like) and a "thumbs down" (Dislike) icon. Clicking the "thumbs up" icon will rate the post up. If enough people like a post, it will gain a Highly Rated status and appear at the top of related search results. Highly Rated posts will also have a highlighted background. Clicking the "thumbs down" icon will expand a drop-down menu which will include "Dislike," "Trolling, "Spam" and "Report" options. "Dislike" will rate the post down. If enough people dislike a post, it will be darkened, and with a lot of dislikes it will be hidden completely. You can also quickly report a post as trolling or spam, or use the report function to fill out a more comprehensive description of a violation. Please note that you can only rate each post once. Use your power wisely to help foster a positive and helpful forum community. Have fun posting on these forums, and good luck with your adventures in Azeroth! Guidelines In addition to the forum Code of Conduct (http://us.battle.net/en-us/community/conduct), here are some common courtesy guidelines to follow. While these do technically fall within the bounds of the Code of Conduct, these cover more specific examples of common errors that will lead to thread deletions or posting privileges being revoked. The World of Warcraft forums are for discussion of topics directly related to World of Warcraft. The forums here are specifically to discuss the game and related topics. Any topics not related to World of Warcraft, Battle.net, or Blizzard Entertainment are subject to deletion. Don't post in all capital letters, use a misleading title, excessive punctuation, and/or non-standard symbols, etc. While everyone wants their posts read, we ask you to refrain from using these types of tactics in order to bring more people to your thread. Let your post stand on its own merit. Threads violating this guideline are subject to deletion. Using the words "Blizzard," "Blue," or any community team members' names in a thread topic is frowned upon. Everyone would like Blizzard to read and acknowledge his or her post, and we understand that; however, use of such words in the subject line does not help that come to pass. Please make your thread title relevant to the post subject. Threads violating this guideline are subject to deletion. Posting "First" or IBTL ("in before lock") constitutes as spamming. You will be suspended if you create a post that is intended to call out that you achieved a specific reply number in a thread. This is considered spamming. Posting IBTL ("in before the lock") is not helpful, and if you feel a thread should be moderated please use the rating button to do so. Do not "bump" posts. The act of posting simply to bump a thread is considered spamming. This also includes bumping very old threads for no reason (called "necro bumping" or "necroing"). Petition posts are frowned upon. These are discussion forums and, as such, we ask that you hold discussions. Creating a thread to ask for replies as votes is not a discussion. Threads violating this guideline are subject to deletion. Do not post about locked or deleted threads. Posts that are moderated have a reason behind the moderation. It's up to you to read the forum Code of Conduct and these guidelines to determine what you did wrong, learn from your mistake, and attempt to post again without breaking any rules. There is also cool down period we institute during times of high forum traffic. If you are violating policy during one of these times due to frustration, you will be given a three-hour cool down suspension. This does not get logged on your record and is simply in place to keep the forums readable and civil. Serious violations will still have the appropriate action taken against them as documented in the Code of Conduct, and we do keep track of these cool down periods separately—if one is found to be repeatedly violating policy, appropriate action will be taken.Kaivax0 Jan 20, 2017
Jan 27 FAQ: Installing & Troubleshooting AddOns How to Install AddOns for World of Warcraft - By Unkle of Grounding Totem, US Kirin Tor - With a tip of the hat to Lopeppeppy for her original guide. When AddOns are properly installed, a new button appears in the lower left corner of the character selection screen of World of Warcaft, labeled AddOns. If you do not see this button, your AddOn is not properly installed or no AddOns are installed at all. - Where to Get AddOns Always download your AddOns from a reputable source. The author of this guide recommends you use the following sites for most of your AddOn needs. ● WoWInterface.com - https://wowinterface.com/ ● CurseForge.com - https://www.curseforge.com/wow/addons. - Extracting your AddOns AddOns are delivered in compressed files to save space on hosting sites servers and to reduce the amount of time it takes you to download them. They are commonly in .zip format with some .rar format files. Windows and Macintosh computers have native support for .zip files. If your AddOn is compressed in .rar format, you will need another program to open them. Your web browser may also be able to open compressed files for you automatically after they are downloaded. For Windows XP, Windows Vista, or Windows 7 users I suggest 7-Zip. ● http://www.7-zip.org/ For Mac OSX users I suggest The Unarchiver. ● http://wakaba.c3.cx/s/apps/unarchiver.html When the AddOn is extracted, you should have a folder that is named the AddOn’s name. ... Some AddOns have sub-folders inside their main folder. This is fine, and you should leave them there. Some AddOns are called one name, but are really multiple AddOns delivered together. When this happens, you download a compressed file that has several folders in it. ... - Where to Put AddOns Once You’ve Extracted Them AddOns belong in the following folder: World of Warcraft/Interface/AddOns ... Put the folder you extracted into the correct folder for your operating system. Correctly installed, my example AddOn, Fane, looks like this: ● Windows XP C: \Program Files\World of Warcraft\Interface\AddOns\Fane [C:] (or which ever drive you have the game installed on) |----World of Warcraft |----Interface |----AddOns |----Fane ● Windows Vista or Windows 7 C:\Users\Public\Games\ World of Warcraft\Interface\AddOns\Fane Windows Vista or Windows 7 [C:] |----Users |----Public |----Games |----World of Warcraft |----Interface |----AddOns |----Fane ● Mac OSX [Macintosh Hard Drive]../World of Warcraft/Interface/AddOns/Fane [Macintosh Hard Drive] |----World of Warcraft |----Interface |----AddOns |----Fane The most common issue with why your AddOn won't load. If you have an extra folder layer in the mix, your AddOn won't load. [C:] |----World of Warcraft |----Interface |----AddOns |----Fane1234567 <-- Extra Folder. Bad folder. No biscuit. |----Fane More Installing Resources: ● WoWInteface.com’s Instatll FAQ: http://www.wowinterface.com/forums/faq.php?faq=install#faq_howto_install ● WoWInteface.com’s Image of Correctly installed AddOns: http://www.wowinterface.com/storage/faq/correct.gif ● Seerah’s excellent YouTube video for installing AddOns (using WinZip on Windows XP). http://www.youtube.com/watch?v=dylXGXET8OA - What to Do When Something Goes Wrong ● Make sure AddOns are in the correct directory. - Do you have more than one copy of WoW installed? If so, did you put the AddOns in the right copy’s folder? This is especially important if you install multiple copies of the game, or you’re installing the game from DVD after a major expansion such as Wrath of the Lich King or Cataclysm. You can right-click on the icon you use to launch WoW (Windows) or use "CMD+I" (Mac OSX) to get the properties for the short cut. The properties will tell you the "Target" of the shortcut (or alias) which is where your copy of WoW is installed. - Did you extract the AddOn correctly? Make sure you are unzipping/uncompressing your addons. WinZip, WinRar, 7zip, The Unarchiver and StuffIt (for Mac) are common unzipping programs. See the section above on Extracting Your AddOns. WinZIP users: You must make sure the option to "Use Folder Names" is checked or WinZIP will just extract the files and not make the proper sub-folders. - Did you accidentally get an extra folder layer? If you have a folder called something like AddOnName6.01.01 with folders under that named like the examples above, you’ve copied the wrong things to your AddOns folder. See the section above on Extracting Your AddOns. ● I used the Repair Tool and now my AddOns are gone! When the repair tool is run the Interface and WTF folders get renamed with the date added to the file name. This means those AddOns won't get loaded. You can simply rename the folders without the date. If the problem that caused you to run the Repair Tool was being caused by a rogue AddOn you’ll have the problem again if you do this. ● Don’t install AddOns while WoW is running. WoW doesn't register addon changes until you exit the game and restart it. Save yourself some frustration and install only when you’ve completely exited the game. Log in to check them, log back out as necessary to fix things. ● My AddOns didn’t load after a patch! From the character select screen, click the AddOns button. In the upper right corner of the AddOns screen, check the "Load Out of Date Addons" box.Unkle348 Jan 27
Dec 30 AddOn Development Reference (PLEASE DO NOT POST QUESTIONS IN THIS THREAD, USE THE FORUM FOR QUESTIONS) While there are numerous sites available with WoW UI API Documentation, there are a number of useful features that aren't exactly API calls, but are really useful to AddOn developers. Extracting UI Files (coming shortly given cataclysm changes) Lua File Arguments Whenever WoW loads and runs an AddOn's .lua file (not including saved variables), it passes in two parameters which can be accessed via the ... token: local addonName, addonTable = ...; The addonName is the name by which WoW is referring to the AddOn, based on the capitalization of the AddOn's .toc file. The addonTable is a private table which is sent to every file in a particular AddOn (but is distinct from the table sent to other AddOns). The game maintains no global registry of these tables, so it's garbage collected if not used, and an AddOn must grab its own reference to use it later. Iriel22 Dec 30
Nov 16, 2010 UI Add-On Development Policy 7/15/2009 Music Distribution through UI Add-Ons We have recently seen a number of User Interface Add-Ons that are making modifications to the World of Warcraft in-game music files and wanted to take a moment to go over some important points with the community in connection with this. While we are currently allowing Add-Ons that remove or replace existing sound files, keep in mind that it is illegal to distribute copyrighted materials, in this case in-game music and audio files, without authorization. One of the primary goals of the user interface is to allow players to customize their game experience and we hope to avoid making any modifications in the future that will prevent this. -------------------------------------------------------------------------------------------------------------------------------------------- 4/13/2009 UI Add-On Development Policy Update On March 20, we released the new add-on development policy to the public as an ongoing effort to help ensure add-on integrity, safety, and quality for the community. Since that time we have been in touch with many UI development communities on what the policy means to them and the continuing development of these add-ons. We would like to announce further that we are providing a sixty-day grace period beginning at the time of the initial release of the policy for UI developers to comply with the new policy. After May 19th, Blizzard Entertainment will begin to enforce the Add-on Development policy, and developers found to be in violation of this policy will be contacted directly. -------------------------------------------------------------------------------------------------------------------------------------------- World of Warcraft User Interface Add-On Development Policy With the continuing popularity of World of Warcraft user interface add-ons (referred to hereafter as "add-ons") created by the community of players, Blizzard Entertainment has formalized design and distribution guidelines for add-ons. These guidelines have been put in place to ensure the integrity of World of Warcraft and to help promote an enjoyable gaming environment for all of our players - failure to abide by them may result in measures up to and including taking formal legal action. 1) Add-ons must be free of charge. All add-ons must be distributed free of charge. Developers may not create "premium" versions of add-ons with additional for-pay features, charge money to download an add-on, charge for services related to the add-on, or otherwise require some form of monetary compensation to download or access an add-on. 2) Add-on code must be completely visible. The programming code of an add-on must in no way be hidden or obfuscated, and must be freely accessible to and viewable by the general public. 3) Add-ons must not negatively impact World of Warcraft realms or other players. Add-ons will perform no function which, in Blizzard Entertainment's sole discretion, negatively impacts the performance of the World of Warcraft realms or otherwise negatively affects the game for other players. For example, this includes but is not limited to excessive use of the chat system, unnecessary loading from the hard disk, and slow frame rates. 4) Add-ons may not include advertisements. Add-ons may not be used to advertise any goods or services. 5) Add-ons may not solicit donations. Add-ons may not include requests for donations. We recognize the immense amount of effort and resources that go into developing an add-on; however, such requests should be limited to the add-on website or distribution site and should not appear in the game. 6) Add-ons must not contain offensive or objectionable material. World of Warcraft has been given a "T" by the ESRB, and similar ratings from other ratings boards around the world. Blizzard Entertainment requires that add-ons not include any material that would not be allowed under these ratings. 7) Add-ons must abide by World of Warcraft ToU and EULA. All add-ons must follow the World of Warcraft Terms of Use and the World of Warcraft End User License Agreement. 8) Blizzard Entertainment has the right to disable add-on functionality as it sees fit. To maintain the integrity World of Warcraft and ensure the best possible gaming experience for our players, Blizzard Entertainment reserves the right to disable any add-on functionality within World of Warcraft at its sole discretion. For more information... If you are an add-on developer and have any questions about and this User Interface Add-On Development Policy and how it pertains to the add-on that you've developed, please don't hesitate to email us at WoWUI@blizzard.com. Nethaera0 Nov 16, 2010
Feb 17 Macros - What Every Player Needs to Know Table of Contents: ------------------------------- 1. Intro - Macro Basics 2. Macros - What can they do? 3. Macros - What can they NOT do? 4. Conditionals - How do they work? 5. Scripting - What is possible in a macro? 6. Macros - Tips, Tricks, and Shortcuts 7. Off-GCD Abilities List 8. More to Come 9. FAQ 10. Reserved 1. Intro - Macro Basics Macros are a very useful tool within the World of Warcraft client. They allow you to combine multiple actions onto a single button. While the entire macro will run every time, actions which trigger the Global Cooldown will stop later GCD actions from functioning. You can make a macro to take almost any action you can click or keybind, with certain restrictions. Macro commands can be made more useful with [conditionals], snippets that check on various things to allow a small degree of decision making. While macros execute the first valid item from the top down, individual commands execute the first valid conditional, from left to right. Macros can be used to execute scripts, small snippets of Lua code, from within WoW without the use of an external addon. This is done by using the /run command. Scripting is an advanced feature and is explained more in detail in post 5. There are a number of tips, tricks, and shortcuts to help you get the most out of your macros. Most of the ones listed have come from this very forum, and I have consolidated them here to make it easier. My intention is to continue to expand this post with more useful information over time, so feel free to add a post with any questions or useful information you think I should add.Adreaver280 Feb 17
Nov 3 UI Changes coming in 7.2 From our latest PTR Patch Notes: User Interface You can now assign a specialization to an equipment set in the Equipment Manager. An “Open All” button has been added to the mailbox. You can now preview an ensemble set by CTRL-clicking it. Spellbook Spells that haven’t been moved to an action bar are highlighted in the spellbook. Mousing over a spell highlights it on your action bar, making it easier to locate. Pet spells can now be dragged onto the player action bar. Quick Join Auto Accept: A setting has been added to allow friends and guild members to instantly join your queues without a confirmation. This setting is located in Interface Options -> Social. Group tooltips now show the available roles and if auto accept is enabled. Right click a Quick Join group to whisper a member of that group. Please note that if you find a bug, it's best that you report it in our 7.2 PTR Bug Report Forum. Thanks!Kaivax20 Nov 3
Jan 20, 2017 UI and Macro Forum Guidelines Guidelines In addition to the forum Code of Conduct, here are some common courtesy guidelines to follow. While these do technically fall within the bounds of the Code of Conduct, these cover more specific examples of common errors that will lead to thread deletions or posting privileges being revoked. The World of Warcraft forums are for discussion of topics directly related to World of Warcraft. The forums here are specifically to discuss the game and related topics. Any topics not related to World of Warcraft, Battle.net, or Blizzard Entertainment are subject to deletion. Don't post in all capital letters, use a misleading title, excessive punctuation, and/or non-standard symbols, etc. While everyone wants their posts read, we ask you to refrain from using these types of tactics in order to bring more people to your thread. Let your post stand on its own merit. Threads violating this guideline are subject to deletion. Using the words "Blizzard," "Blue," or any community team members' names in a thread topic is frowned upon. Everyone would like Blizzard to read and acknowledge his or her post, and we understand that; however, use of such words in the subject line does not help that come to pass. Please make your thread title relevant to the post subject. Threads violating this guideline are subject to deletion. Posting "First" or IBTL ("in before lock") constitutes as spamming. You will be suspended if you create a post that is intended to call out that you achieved a specific reply number in a thread. This is considered spamming. Posting IBTL ("in before the lock") is not helpful, and if you feel a thread should be moderated please use the rating button to do so. Do not "bump" posts. The act of posting simply to bump a thread is considered spamming. This also includes bumping very old threads for no reason (called "necro bumping" or "necroing"). Petition posts are frowned upon. These are discussion forums and, as such, we ask that you hold discussions. Creating a thread to ask for replies as votes is not a discussion. Threads violating this guideline are subject to deletion. Do not post about locked or deleted threads. Posts that are moderated have a reason behind the moderation. It's up to you to read the forum Code of Conduct and these guidelines to determine what you did wrong, learn from your mistake, and attempt to post again without breaking any rules. There is also cool down period we institute during times of high forum traffic. If you are violating policy during one of these times due to frustration, you will be given a three-hour cool down suspension. This does not get logged on your record and is simply in place to keep the forums readable and civil. Serious violations will still have the appropriate action taken against them as documented in the Code of Conduct, and we do keep track of these cool down periods separately—if one is found to be repeatedly violating policy, appropriate action will be taken.Kaivax0 Jan 20, 2017
2h Weakaura show spell icon at all times. Friend just got back into wow. i'm wanting to help him learn his dps opener to maximize dps normally i'd just put the spells in order on the action bar. but his are full somehow.. looking to make a weakaura to do the same. spells in order of what he should press for his opener. what i'm having trouble with is i cannot figure out how to just make a static spell icon that shows at all times as it would on the action bars. any help would be greatful :PBriomar0 2h
4h Friendly health bars not showing in Dungeons Hi everyone, I was playing my first Cata dungeon today and I could not get the friendly health bars to show up while in the dungeon. I tried using Shift-V and I can see that the nameplates change but the health-bars just seem to be missing. They also did not show up while in combat. Here you can see what I mean: https://imgur.com/a/GpWoG I was also running Dungeons yesterday and I could swear that I didn't have this issue. I'm also using KUI nameplates by the way which however shouldn't have any effect on friendly nameplates in dungeons. Thanks!Faalstad6 4h
4h Hide Bars Out of Combat Hey guys, Dominos user here, just wondering if there's a way to hide bars out of combat to make gameplay more immersive? I'd love to hide specific bars, but hiding all of them would be ok I guess... If Dominos can't do it, anything else that can? I've heard Bartender is a CPU hog thoAlsandor4 4h
6h addon disable macro? Is it possible to enable/disable addons thought a macro? And what form would it take ?Sholeh4 6h
6h elvui editbox issue So this is what happens whenever i change tabs in elvui and i was wondering if there was any setting that would cause the editbox to show up faded?https://puu.sh/zvcWH/1b979f46d9.jpgRsk0 6h
10h Hey, Fizzie. . . . . . . I'm sort of getting my mind back together after surgery and I'm continuing on that WA replacement I was working on. I have in mind to have a "device" defined as a frame, but not have anything visible in it. Can I still use that as a parent for all the keys that are visually represented and set "visible" on the parent (even if it has no actual visible elements)? So far as I can see in VDT, the elements are defining just fine, but before I get too deep into coding the rest, I wanna know if this'll work or not. function f:CreateDeviceFrame(deviceName) local frameName = deviceName.."Frame" local frame = _G[frameName] if not frame then local xOff, yOff = f:GetDeviceOffsets(deviceName) frame = CreateFrame("frame", frameName, UIParent) frame:SetPoint("CENTER", "UIParent", "CENTER", xOff, yOff) for i=1,frame:GetNumPoints() do print(deviceName, frame:GetPoint(i)) end end return frameName end GetDeviceOffsets just pulls some x/y figures from a table I use in defining the device in the first place. The loop on GetNumPoints() seems to show me that everything is properly defined for the device frames. What I want to do is use that frame (let's use the G13Frame for specifics) as a place to hang the individual button frames, the visible ones, and then use the G13Frame itself when I need to move things around (assuming I want to move things around). Am I on the right track here, or does hide/show only work on frames that have something in them *to* hide/show?Ehiztari9 10h
10h Curse forcing Twitch on WoW users I know it's not Blizzard directly, but forcing people to now use a public broadcasting site is not right - at all.Casimer220 10h
12h Class/Spec Specific Resources Help EDIT: This doesn't seem to be from an addon, so how do I get this to show up on my other characters? Hello UI & Macro, Today I have perhaps a dumb question. I have a number of nice addons installed. Bartender4, SpartanUI, Quartz, Weakauras, DBM, etc. These are the big ones. None of them creates this nice subtle resource counter for my soul shards on my Warlock. I think this is a Blizzard default thing. Seen here - https://imgur.com/FGQc4s2 There is a health and mana bar and a soul shards indicator just below it. Here is my whole UI - https://imgur.com/Jye49zP I hopped onto my arcane mage earlier and I noticed there wasn't one on my screen for the Arcane charges just like the soul shards. In fact, the health and mana bars aren't there either. I'm sure there is one, and I'd turn it on if I could.. but I can't remember how. Where is the setting to turn this on and off? Why is it only on for my Warlock? Can anyone help?Abyssius3 12h
12h Cool Down Addon Is there a simple addon that allows spell icons to flash when the cool down expires?Noonthirty3 12h
13h Taskbar Light Up Thing Is there a way through addon or settings to suppress the taskbar icon from flashing when something comes up in game? There are times when it's handy, but not so much when I'm at work, supposed to be working, then alt-tab to a browser window or something only to have the taskbar start flashing. Can I disable this? Thanks.Jadepunk2 13h
13h how do i write a macro for pvp instance chat want to say "GET ORBS" in pvp instance chatZioneyes1 13h
15h Playing a sound in place of Not Enough Focus. I'm trying to create an addon that will PlaySoundFile("Interface\\Addons\\AuraSounds\\COOKIEMONSTER.ogg", "Master") --which I'll actually change to ding4.ogg, but the above will make testing easier-- when I get the error message "not enough focus" or "not enough rage" or "not enough energy" etc. Preferably with a 1-2 second delay between plays so I'm not overloaded with the sound. Using google, it looked like the errors would be ERR_OUT_OF_FOCUS (and so on), but using EventTrace, there are no such error. There is only UI_ERROR_MESSAGE, and for the focus one argument 1 is 329, arguement 2 is "Not enough focus" local EventFrame = CreateFrame("Frame") EventFrame:RegisterEvent("UI_ERROR_MESSAGE") EventFrame:SetScript("OnEvent", function(self,event,...) --Recognize when a UI_ErrorMessage happens if arg2 == "Not enough focus" then PlaySoundFile("Interface\\Addons\\AuraSounds\\COOKIEMONSTER.ogg", "Master") end end) Before adding the "if arg2" line, I briefly had it playing the sound with every single UI_Error_message, but I can't even get it back to that. Please help. Once I get this, I would like to attach the number of my current Focus/Mana/Energy/Whatever to the center of ClassNameplateManaBarFrame (the personal nameplate added in legion) I'm not wanting to make any in game configurations for this. I can change target sound files, and font sizes from the lua, I just can't get the basic thing to work. TMW is able to do this. I have an invisible bar set to make the ding whenever I try to cast a spell without enough resources. The problem is that whenever the UI is hidden, all sounds stop. I would like to replaced the button with a standalone addon. Please help, and thank you.Velden6 15h
16h Filter Text? Is there a way in game to filter text (better yet, colour code) in the chabtox? I see this can be done in the Log tab, which is super useful. What about everything else though? Or is this add-on only territory?Niklicious4 16h
16h Need help - First time Focus macro [Solved] I want to make a macro that can tab through enemies and as I tab through them set my previous enemy (the one I just had as /targetenemy)as focus. This is what I have but it needs refining, please help! ... Has trouble if I have no target in the first place and has trouble when dealing with dead targets/focus, gets sticky. Kind of want something a little smoother for some bgs and learning how to focus. Thank you in advance!Vaedal3 16h
20h Addon Settings After Server Transfer + Rename Hello everyone. I recently transferred a character from one server to another and upon reaching the destination, the name of the character was set differently from its previous home. Understandably, when attempting to log right in, the vast majority of my UI Addons (all of those with per-character setting options I am guessing) have been reset to default. This left quite a mess and it would be a pain to reconfigure everything from scratch, so I've been trying to figure out exactly what is necessary to port the addon settings from my character's old server and name to his new one. I've been checking around for possible solutions to my issue but it seems that some of those I've tried were for earlier versions of WoW and are no longer functional. I am sure that someone here knows an up-to-date method if it is possible I tried going into the WOWFOLDER > WTF >Account > ACCOUNTNAME > OLDSERVERNAME folder and copied the OLDCHARACTERNAME folder. I then took it to NEWSERVERNAME, pasted it, and renamed it to NEWCHARACTERNAME , thinking this might work, but alas when I logged in my UI was still askew. Could anyone please inform me of current working methodology for this? I do recall reading something from 6.x era saying its actually no longer possible to do easily, and instead requires a ton of editing to the Lua scripts for each addon or something and if this is the case, I figure I may as well just configure from scratch - my Curse..er..Twitch client reads at over 100 addons so that just doesn't seem worthwhile. Much appreciated, especially if there is a workable solution for this!Temeraire2 20h
1d Addon settings not saving [solved] I've been having a problem with my addon settings for about a week. It appears that WoW is unable to overwrite the LUA files stored in the WTF folder. I've developed a workaround but I really want to figure out a solution. What happens is that when I reload or log out of WoW, the game creates a bunch of TMP files, such as "WIM.lua.tmp". Note that this is not specific to any one addon. I believe the normal process is that these files last only for a moment while the non-temporary version of the file is overwritten, so in this example "WIM.lua". However, for some reason this is not happening. I've done everything that I can think of: changed permissions, owners, run the repair tool, reinstalled addons, administrator mode, and so forth. The only fix is to open the game, delete the addon files while it is running, and then when the game reloads or logs out it saves the files without a problem.Theilea24 1d
1d A small issue with my mount macro. So I have this macro I use to switch between two mounts, a flying and a ground mount, depending if flying is allowed in the area or not. It's this macro: #showtooltip /cast [flyable] <flying mount>; <ground mount> /dismount [mounted] Now it worked like a charm, except in the Warrior Order Hall (summons the flying mount despite not being able to fly there), but that was rather minor. The problem was when I went to Azeroth, and I found out that this macro only summons the ground mount, despite the ability to fly on Azeroth being unlocked. Is it a bug in the game, or is my macro missing something?Daemonfox4 1d
1d Getting Rid of "?" In Macro (PvP) Okay you all, I am a bit (okies, a lot) OCD with my interface and one thing has been really annoying me lately. On my Warlock I have the following Honor Talent macro which allows the button and tooltip to change based on which of those three talents I have. It looks like this: ... But the problem is when I am outside the BG it's an ugly question mark. How do you make it to where it's not a question mark while outside the BG? I tired changing the icon to a different image but then it doesn't change based on the talent I have. I tried putting passives in there, but it stays a question mark. Please help :)Florence3 1d
1d Elvui and keybinding I am having trouble binding keys. Is there somewhere I can go to seek instruction? I really appreciate any help I can get. THanks.Quixotte6 1d
1d Add Ons not usuable in game I recently deleted my ELV UI From my addons folder thinking I would update it by redownloading. I downloaded it and cut/paste it to my add ons like always but it WILL NOT come up in the add ons in game. So I tried deleting everything in my add ons file and redownloading ELV UI. It still does not work and now I can not get any other previously operational add on to take effect. HELP!!!!!Darktitan4 1d
1d Druid Macro Hey guys, i just rolled a new druid and i need help with a Macro. I got this one: #showtooltip /cast Travel Form /cast Bear Form Outside works great, but indoors obviously it doesn't work because of travel form. Is there anyway i can fix this? Something like: /cast Travel Form if not possible /cast Bear formTolmur2 1d
1d Shadow Dance Macro What is wrong with this macro? /castsequence reset=15 Shadowstep, Backstab, Backstab, Nightblade, Backstab, Symbols of Death, Death from Above, Shadow Dance, Eviscerate, Shadowstrike, Shadowstrike, EviscerateQuixotte9 1d
1d Need help with Exorsus Raid Tools. Hello Im trying to set up ExRT to track raid cooldowns for the most part I have everything set up I was just wondering if there is a way I can make the cooldowns that are being tracked in the column reset on death or possibly left/right clicking on them to make them go away? I can seem to find an option like that any where.Maraad2 1d
1d 2 Spells Cast On Mouseover, Else Target I can't figure out how to have two spells bound to the same macro that cast on mouseover unless you aren't hovering over something, then it casts on your target. I can only get one of the spells to work properly. This is what it looks like right now. #showtooltip /use [mod:shift,@mouseover,harm]Vampiric Touch /use [@mouseover,harm][]Shadow Word: PainMagdermor10 1d
1d Move portrait etc I heard xpearl can do this, but when I went and looked at it on curse there was a page about how it's been discontinued etc etc and wasn't willing to download it. Was just looking for an addon that will move my portrait, and that of my target portrait. Want to move it to the middle of my screen, seems pretty popular in some videos out there. Is xpearl what most people use, or anyone get any others? Also, how can I change where loot rolls pop up? That would be handy to move that to the side instead of having it in the middle where my action bars are now. Suggestions would be great cheers.Null8 1d
2d Azure Water Strider issue when indoors the Azure Water Strider is showing as usable when indoors /run print(C_MountJournal.GetMountInfoByID(449)) 5th return should be usable = false, yet its returning true the summon fails if you try. i can use IsUsableSpell( ) on the mount spell instead as it shows it as not being usable but it would be nice if the GetMountInfoByID returned the correct valueArkayenro2 2d
2d Addon to alert when a... Is there an addon that allows you to track specific mobs and then alert you when they are detected? I have a bad habit of zoning out while gathering herbs and stuff and I bet I miss half the spawned enemies such as the Lashers in Val'sharah or the friendly foxes in Highmountain. All I want to do is have some kind of alert that lets my dumb self know "Hey, this creature just spawned!" so I don't just fly off.Bovinedivine4 2d
2d Macro to collect PvP Prestige / rank info? Howdy. How do I collect PvP Prestige and rank info from my toon? There is an old macro floating around the internet as shown below but I think its depreciated and no longer works. I'd like it to tell me my prestige, my rank, and how much honor I have. /script P=(math.floor(GetPVPRankProgress(target)*10000))/100 W=UnitPVPRank("player") N=(W-6)*5000+5000*P/100 Q=(W-5)*5000-N*0.8 SendChatMessage("Rank Progress: "..P.."% ".."Current RP: "..N.." RP to next rank "..Q.."","emote")Gawgug0 2d
2d Turn Off Error Text Why is there no option to turn off the red text error messages in the middle of my screen for things like "Not enough mana" or "I don't have a target"? Seems like kind of a no-brainer. I think I'd like to try just voice errors without text. That red text in the middle of the screen really makes me feel like my screen is cluttered.Smithson20 2d
2d Assistance Required- Taunt Mouseover Macro So I'm fairly new to WoW (very new) and I need to set up a macro that enables me to mouseover a target and cast taunt without having to click on it. Can someone explain to me how to do this please? It would help a lot.Urukk1 2d
2d How to have a macro select + turn in a quest? So the situation is: people block the quest-giver with mammoth mounts during the Stranglethorn Fishing Extravaganza. I'm driving myself nuts trying to make a macro to target the npc, open up the quest dialogue (as if right-clicking the npc, this is the part I can't find the command for), select the reward, and complete the quest.Grampa4 2d
2d Custom texture jagged edges. Hey I'm trying to add custom map markers on the map and minimap, I've created perfectly smooth round circle tga files in GIMP but they display ingame as not perfectly circular. I've tried upping the size to 1024x1024 even though I see other addons using far smaller textures. Is there some trick to making them appear smooth? I also tried smoothing the edges of the circle in the editor. This is the tga file https://imgur.com/a/NEEsy (converted to png) What it looks like ingame https://imgur.com/a/vDpr8 See the arrow in the right corner looks smooth, but not my green circle. Does the arrow maybe only look smooth caus of the black border? Any ideas if I can fix it?Venomisto1 2d
3d ELVUI bag troubles I have no idea how this happened. This isn't a character i play much but was thinking of returning to. The green bag outlines are really distracting. Anyone know whats going on or what the solution is? https://imgur.com/a/VGEs6Zombeefy0 3d
3d Flame Shock on Target's Target Hello, I'm trying to create a macro that will flame shock my target's target while pressing shift, and simply flame shock with no modifier. This doesn't work: #showtooltip flame shock /cast [mod:nomod] flame shock /cast [mod:shift] [@targettarget] flame shockMurkochi3 3d
3d alter exp chat message want a small addon that alters the xp gained chat message,specificaly to add math for exp gained from looms,which of these is the correct one? COMBATLOG_XPGAIN_EXHAUSTION1 %s dies, you gain %d experience. (%s exp %s bonus) COMBATLOG_XPGAIN_EXHAUSTION2 %s dies, you gain %d experience. (%s exp %s bonus) COMBATLOG_XPGAIN_EXHAUSTION4 %s dies, you gain %d experience. (%s exp %s penalty) COMBATLOG_XPGAIN_EXHAUSTION5 %s dies, you gain %d experience. (%s exp %s penalty) COMBATLOG_XPGAIN_FIRSTPERSON %s dies, you gain %d experience. COMBATLOG_XPGAIN_FIRSTPERSON_GROUP %s dies, you gain %d experience. (+%d group bonus) COMBATLOG_XPGAIN_FIRSTPERSON_RAID %s dies, you gain %d experience. (-%d raid penalty) COMBATLOG_XPGAIN_FIRSTPERSON_UNNAMED You gain %d experience. cold someone post an example snip?Nirran0 3d
3d Detect weekly reset and run a function? Is there a semi-easy way to run a function when reset happens if online but also at first logon after reset if I wasn't online? I want to clear some saved data for my addon at every weekly reset. The only way I can see to do it is write some long complicated function that has all the regions/timezones/daylight savings adjustments and calculate from the epoch or maybe GetQuestResetTime(), is there an easier way?Venomisto3 3d
3d See Enemy Player Guild w/ Nameplates Enabled Is anyone aware of a nameplate addon (like Tidyplates) that allows you to somehow display an enemy player's guild affiliation even while their healthbar is showing?Isarii0 3d
3d Addon that will sort regents by expansion I have a bank load of reagents that I want to clean up so I only keep the recent ones that are used in Legion. Are there any addons that will sort them or provide a tooltip that will show me if they were used in Warlords or Pandaria etc??Brutálise1 3d
3d IsFlyableArea( ) broken - again in Kalimdor/Eastern Kingdoms, IsFlyableArea( ) is returning false for a level 60 nightbourne with flying skill but without the previously required spell. for old toons that had the previously required spell its returning trueArkayenro8 3d
3d UI - Stuffing Bags Update Hi All - I've been working on trying to fix and update a favorite UI that the author appears to have abandoned. It's called QulightUI and it's a combination of oUF, StuffingBags, and a number of other items including Aurora for skinning. I've identified and resolved the causes of issues with ilvl not being displayed on items in the bags, cooldowns not displaying, etc. This is my FIRST crack at LUA stuff, but I have other programming exp in C#, Java, PowerShell, Batch, etc. My updated code is below, what I am fighting with is that the itemlevel being displayed is not updating when an item is moved from one slot to another. The displayed "text" value stays on the source location and over-writes the last item in the bag while you have it picked up. Obviously, I didn't write the majority of this code, and ashamedly, it's taken me about 15 hours of work to get the ilvl display to show up and fix the item cooldowns. Can someone help me understand what might be going wrong. Basically when I move an item from one slot to another in the bags, it appears that the item clink (gathered from GetContainerItemInfo(bag,slot)) does not populate when an item is moved. I suspect this might be due to the "ITEM_LOCK_CHANGED" event firing faster than it is resolving the destination location of the item, but the text never moves for the item level, it stays on the old bag slot. This is likely due to the CLINK = nil because for some reason GetContainerItemLink is not working when the "ITEM_LOCK_CHANGED" fires. Thanks in advance for any assistance! local F, C = unpack(select(2, ...)) if not Qulight["bags"].Enable == true then return end local BAGS_BACKPACK = {0, 1, 2, 3, 4} local BAGS_BANK = {-1, 5, 6, 7, 8, 9, 10, 11} local ST_NORMAL = 1 local ST_FISHBAG = 2 local ST_SPECIAL = 3 local bag_bars = 0 StaticPopupDialogs.BUY_BANK_SLOT = { text = CONFIRM_BUY_BANK_SLOT, button1 = YES, button2 = NO, OnAccept = function(self) PurchaseSlot() end, OnShow = function(self) MoneyFrame_Update(self.moneyFrame, GetBankSlotCost()) end, hasMoneyFrame = 1, timeout = 0, hideOnEscape = 1, preferredIndex = 5, } StaticPopupDialogs.CANNOT_BUY_BANK_SLOT = { text = "Can't buy anymore slots!", button1 = ACCEPT, timeout = 0, whileDead = 1, preferredIndex = 5, } Stuffing = CreateFrame("Frame", nil, UIParent) Stuffing:RegisterEvent("ADDON_LOADED") Stuffing:RegisterEvent("PLAYER_ENTERING_WORLD") Stuffing:SetScript("OnEvent", function(this, event, ...) if IsAddOnLoaded("AdiBags") or IsAddOnLoaded("ArkInventory") or IsAddOnLoaded("cargBags_Nivaya") or IsAddOnLoaded("cargBags") or IsAddOnLoaded("Bagnon") or IsAddOnLoaded("Combuctor") or IsAddOnLoaded("TBag") then return end Stuffing[event](this, ...) end) local function Print(x) print("|cffffff00"..x) end -- Drop down menu stuff from Postal local Stuffing_DDMenu = CreateFrame("Frame", "Stuffing_DropDownMenu") Stuffing_DDMenu.displayMode = "MENU" Stuffing_DDMenu.info = {} Stuffing_DDMenu.HideMenu = function() if UIDROPDOWNMENU_OPEN_MENU == Stuffing_DDMenu then CloseDropDownMenus() end end local function Stuffing_Sort(args) if not args then args = "" end Stuffing.itmax = 0 Stuffing:SetBagsForSorting(args) Stuffing:SortBags() end local function Stuffing_OnShow() Stuffing:PLAYERBANKSLOTS_CHANGED(29) for i = 0, #BAGS_BACKPACK - 1 do Stuffing:BAG_UPDATE(i) end Stuffing:Layout() Stuffing:SearchReset() PlaySound(SOUNDKIT.IG_BACKPACK_OPEN) collectgarbage("collect") end local function StuffingBank_OnHide() CloseBankFrame() if Stuffing.frame:IsShown() then Stuffing.frame:Hide() end PlaySound(SOUNDKIT.IG_BACKPACK_CLOSE) end local function Stuffing_OnHide() if Stuffing.bankFrame and Stuffing.bankFrame:IsShown() then Stuffing.bankFrame:Hide() end PlaySound(SOUNDKIT.IG_BACKPACK_CLOSE) end local function Stuffing_Open() if not Stuffing.frame:IsShown() then Stuffing.frame:Show() end end local function Stuffing_Close() Stuffing.frame:Hide() end local function Stuffing_Toggle() if Stuffing.frame:IsShown() then Stuffing.frame:Hide() else Stuffing.frame:Show() end end -- Bag slot stuff local trashButton = {} local trashBag = {} -- Tooltip used for scanning local scanner = CreateFrame("GameTooltip", "iLvlScanningTooltip", nil, "GameTooltipTemplate") local scannerName = scanner:GetName() -- Tooltip and scanning by Phanx @ http://www.wowinterface.com/forums/showthread.php?p=271406 local S_ITEM_LEVEL = "^" .. gsub(_G.ITEM_LEVEL, "%%d", "(%%d+)") local ItemDB = {} local function _getRealItemLevel(link, owner, bag, slot) --if ItemDB[link] then print(ItemDB[link]) return ItemDB[link] end local realItemLevel scanner.owner = owner scanner:SetOwner(owner, "ANCHOR_NONE") scanner:SetBagItem(bag, slot) local line = _G[scannerName.."TextLeft2"] if line then local msg = line:GetText() if msg and string.find(msg, S_ITEM_LEVEL) then local itemLevel = string.match(msg, S_ITEM_LEVEL) if itemLevel and (tonumber(itemLevel) > 0) then realItemLevel = itemLevel end else -- Check line 3, some artifacts have the ilevel there line = _G[scannerName.."TextLeft3"] if line then local msg = line:GetText() if msg and string.find(msg, S_ITEM_LEVEL) then local itemLevel = string.match(msg, S_ITEM_LEVEL) if itemLevel and (tonumber(itemLevel) > 0) then realItemLevel = itemLevel end end end end end ItemDB[link] = tonumber(realItemLevel) return realItemLevel end function Stuffing:SlotUpdate(b) local texture, count, locked, quality = GetContainerItemInfo(b.bag, b.slot) local clink = GetContainerItemLink(b.bag, b.slot) local isQuestItem, questId = GetContainerItemQuestInfo(b.bag, b.slot) --local ilvldisplay = b.frame:CreateFontString(ilvldisplay, "OVERLAY") --ilvldisplay:SetFont(Qulight["media"].font, 10, "OUTLINE") --ilvldisplay:SetPoint("TOPLEFT", 1, -1) --ilvldisplay:SetTextColor(1, 1, 0) ilvldisplay:SetText("") if not clink then print(b.ilvl) end if not b.frame.lock then b.frame:SetBackdropBorderColor(.15,.15,.15,0) end if b.cooldown and StuffingFrameBags and StuffingFrameBags:IsShown() then local start, duration, enable = GetContainerItemCooldown(b.bag, b.slot) CooldownFrame_Set(b.cooldown, start, duration, enable) end --added to find upgrade items if b.frame.UpgradeIcon then b.frame.UpgradeIcon:SetPoint("TOPLEFT", Qulight.bags.buttonsize/1.7, -Qulight.bags.buttonsize/1.7) b.frame.UpgradeIcon:SetSize(Qulight.bags.buttonsize/2.7, Qulight.bags.buttonsize/2.7) local itemIsUpgrade = IsContainerItemAnUpgrade(b.frame:GetParent():GetID(), b.frame:GetID()) if itemIsUpgrade and itemIsUpgrade == true then b.frame.UpgradeIcon:SetShown(true) else b.frame.UpgradeIcon:SetShown(false) end end if clink then --b.name, _, b.rarity, b.ilvl, b.level, b.type, b.subtype, _, b.equip = GetItemInfo(clink) b.name, _, b.rarity, b.ilvl, b.level, _, _, _, _, _, _, b.itemClassID, b.itemSubClassID = GetItemInfo(clink) if not b.frame.lock and b.rarity and b.rarity > 1 and not (isQuestItem or questId) then b.frame:SetBackdropBorderColor(GetItemQualityColor(b.rarity)) elseif isQuestItem or questId then b.frame:SetBackdropBorderColor(1, 1, 0) end else b.name, b.rarity, b.level = nil, nil, nil end if clink then --if (b.type == "Weapon" or "Armor") and b.equip ~= "" or (b.type == "Gem" and b.subtype == "Artifact Relic") then if b.ilvl and quality > 1 and (b.itemClassID == 2 or b.itemClassID == 4 or (b.itemClassID == 3 and b.itemSubClassID == 11)) then b.ilvl = _getRealItemLevel(clink,self,b.bag,b.slot) or b.ilvl --local ilvldisplay = b.frame:CreateFontString(nil,"OVERLAY") --ilvldisplay:SetFont(Qulight["media"].font, 10, "OUTLINE") --ilvldisplay:SetPoint("TOP",0,-1) ilvldisplay:SetText(b.ilvl) --if(b.rarity) then --red, green, blue, hex = GetItemQualityColor(b.rarity) --red = red + ((1-red) * 0.5) --green = green + ((1-green) * 0.5) --blue = blue + ((1-blue) * 0.5) --ilvldisplay:SetTextColor(red,green,blue) --end end end SetItemButtonTexture(b.frame, texture) SetItemButtonCount(b.frame, count) SetItemButtonDesaturated(b.frame, locked) b.frame:Show() end function Stuffing:BagSlotUpdate(bag) if not self.buttons then return end for _, v in ipairs(self.buttons) do if v.bag == bag then self:SlotUpdate(v) end end end function Stuffing:UpdateCooldowns(b) if b.cooldown and StuffingFrameBags and StuffingFrameBags:IsShown() then local start, duration, enable = GetContainerItemCooldown(b.bag, b.slot) CooldownFrame_Set(b.cooldown, start, duration, enable) end end function CreateReagentContainer() local Reagent = CreateFrame("Frame", "StuffingFrameReagent", UIParent) local SwitchBankButton = CreateFrame("Button", nil, Reagent) local SortButton = CreateFrame("Button", nil, Reagent) local NumButtons = ReagentBankFrame.size local NumRows, LastRowButton, NumButtons, LastButton = 0, ReagentBankFrameItem1, 1, ReagentBankFrameItem1 local Deposit = ReagentBankFrame.DespositButton Reagent:SetWidth(((Qulight.bags.buttonsize + Qulight.bags.buttonspace) * Qulight.bags.bankcolumns) + 17) Reagent:SetPoint("TOPLEFT", _G["StuffingFrameBank"], "TOPLEFT", 0, 0) Reagent:SetFrameStrata(_G["StuffingFrameBank"]:GetFrameStrata()) Reagent:SetFrameLevel(_G["StuffingFrameBank"]:GetFrameLevel() + 5) SwitchBankButton:SetSize(80, 20) SwitchBankButton:SetPoint("TOPLEFT", 10, -4) local SBButton = SwitchBankButton:CreateFontString("SwitchBankButton", "OVERLAY") SBButton:SetFont(Qulight["media"].font, 10, "OUTLINE") SBButton:SetPoint("CENTER") SwitchBankButton:SetText(BANK) SwitchBankButton:SetScript("OnClick", function() Reagent:Hide() _G["StuffingFrameBank"]:Show() BankFrame_ShowPanel(BANK_PANELS[1].name) end) Deposit:SetParent(Reagent) Deposit:ClearAllPoints() Deposit:SetSize(170, 20) Deposit:SetPoint("TOPLEFT", SwitchBankButton, "TOPRIGHT", 3, 0) local Dep = Deposit:CreateFontString("Deposit", "OVERLAY") Dep:SetFont(Qulight["media"].font, 10, "OUTLINE") Dep:SetText(REAGENTBANK_DEPOSIT) SortButton:SetSize(170, 20) SortButton:SetPoint("TOPRIGHT", SwitchBankButton, "TOPRIGHT", 2, 0) local SortBButton = SortButton:CreateFontString("SwitchBankButton", "OVERLAY") SortBButton:SetFont(Qulight["media"].font, 10) SortBButton:SetPoint("CENTER") SortButton:SetText(BAG_FILTER_CLEANUP) SortButton:SetScript("OnClick", BankFrame_AutoSortButtonOnClick) -- Close button local Close = CreateFrame("Button", "StuffingCloseButtonReagent", Reagent, "UIPanelCloseButton") Close:SetSize(25, 25) Close:SetPoint("TOPRIGHT", 0, 0) Close:RegisterForClicks("AnyUp") Close:SetScript("OnClick", function(self, btn) if btn == "RightButton" then if Stuffing_DDMenu.initialize ~= Stuffing.Menu then CloseDropDownMenus() Stuffing_DDMenu.initialize = Stuffing.Menu end ToggleDropDownMenu(nil, nil, Stuffing_DDMenu, self:GetName(), 0, 0) return else StuffingBank_OnHide() self:GetParent():Hide() end end) ReskinClose(Close) for i = 1, 98 do local button = _G["ReagentBankFrameItem" .. i] local icon = _G[button:GetName() .. "IconTexture"] local count = _G[button:GetName().."Count"] ReagentBankFrame:SetParent(Reagent) ReagentBankFrame:ClearAllPoints() ReagentBankFrame:SetAllPoints() CreateStyle(ReagentBankFrame, 3) button:SetNormalTexture("") button.IconBorder:SetAlpha(0) button:SetPushedTexture("") button:ClearAllPoints() button:SetSize(Qulight.bags.buttonsize, Qulight.bags.buttonsize) button:SetBackdropColor(0, 0, 0, 0) button:SetBackdropBorderColor(0, 0, 0, 1) CreateStyle(button, 3) if i == 1 then button:SetPoint("TOPLEFT", Reagent, "TOPLEFT", 10, -27) LastRowButton = button LastButton = button elseif NumButtons == Qulight.bags.bankcolumns then button:SetPoint("TOPRIGHT", LastRowButton, "TOPRIGHT", 0, -(Qulight.bags.buttonspace + Qulight.bags.buttonsize)) button:SetPoint("BOTTOMLEFT", LastRowButton, "BOTTOMLEFT", 0, -(Qulight.bags.buttonspace + Qulight.bags.buttonsize)) LastRowButton = button NumRows = NumRows + 1 NumButtons = 1 else button:SetPoint("TOPRIGHT", LastButton, "TOPRIGHT", (Qulight.bags.buttonspace + Qulight.bags.buttonsize), 0) button:SetPoint("BOTTOMLEFT", LastButton, "BOTTOMLEFT", (Qulight.bags.buttonspace + Qulight.bags.buttonsize), 0) NumButtons = NumButtons + 1 end icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) icon:SetPoint("TOPLEFT", 2, -2) icon:SetPoint("BOTTOMRIGHT", -2, 2) LastButton = button end Reagent:SetHeight(((Qulight.bags.buttonsize + Qulight.bags.buttonspace) * (NumRows + 1) + 40) - 1) MoneyFrame_Update(ReagentBankFrame.UnlockInfo.CostMoneyFrame, GetReagentBankCost()) -- Unlock window CreateStyle(ReagentBankFrameUnlockInfoPurchaseButton, 3) ReagentBankFrameUnlockInfo:SetAllPoints(Reagent) end function Stuffing:BagFrameSlotNew(p, slot) for _, v in ipairs(self.bagframe_buttons) do if v.slot == slot then return v, false end end local ret = {} if slot > 3 then ret.slot = slot slot = slot - 4 ret.frame = CreateFrame("CheckButton", "StuffingBBag"..slot.."Slot", p, "BankItemButtonBagTemplate") ret.frame:SetID(slot) table.insert(self.bagframe_buttons, ret) BankFrameItemButton_Update(ret.frame) BankFrameItemButton_UpdateLocked(ret.frame) if not ret.frame.tooltipText then ret.frame.tooltipText = "" end else ret.frame = CreateFrame("CheckButton", "StuffingFBag"..slot.."Slot", p, "BagSlotButtonTemplate") hooksecurefunc(ret.frame.IconBorder, "SetVertexColor", function(self, r, g, b) if r ~= 0.65882 and g ~= 0.65882 and b ~= 0.65882 then self:GetParent():SetBackdropBorderColor(r, g, b) end self:SetTexture("") end) hooksecurefunc(ret.frame.IconBorder, "Hide", function(self) self:GetParent():SetBackdropBorderColor(.15,.15,.15,0) end) ret.slot = slot table.insert(self.bagframe_buttons, ret) end --ret.frame:SetTemplate("Default") --ret.frame:StyleButton() ret.frame:SetNormalTexture("") ret.frame:SetCheckedTexture("") local t = _G[ret.frame:GetName().."IconTexture"] t:SetTexCoord(0.1, 0.9, 0.1, 0.9) t:SetPoint("TOPLEFT", ret.frame, 2, -2) t:SetPoint("BOTTOMRIGHT", ret.frame, -2, 2) return ret end function Stuffing:SlotNew(bag, slot) for _, v in ipairs(self.buttons) do if v.bag == bag and v.slot == slot then v.lock = false return v, false end end local tpl = "ContainerFrameItemButtonTemplate" if bag == -1 then tpl = "BankItemButtonGenericTemplate" end local ret = {} if #trashButton > 0 then local f = -1 for i, v in ipairs(trashButton) do local b, s = v:GetName():match("(%d+)_(%d+)") b = tonumber(b) s = tonumber(s) if b == bag and s == slot then f = i break else v:Hide() end end if f ~= -1 then ret.frame = trashButton[f] table.remove(trashButton, f) ret.frame:Show() end end if not ret.frame then ret.frame = CreateFrame("Button", "StuffingBag"..bag.."_"..slot, self.bags[bag], tpl) --ret.frame:StyleButton() --ret.frame:SetTemplate("Default") ret.frame:SetNormalTexture(nil) local t = _G[ret.frame:GetName().."IconTexture"] t:SetTexCoord(0.1, 0.9, 0.1, 0.9) t:SetPoint("TOPLEFT", ret.frame, 2, -2) t:SetPoint("BOTTOMRIGHT", ret.frame, -2, 2) local c = _G[ret.frame:GetName().."Count"] c:SetFont(Qulight["media"].font, 10, "OUTLINE") c:SetShadowOffset(1, -1) c:SetPoint("BOTTOMRIGHT", 1, 1) ilvldisplay = ret.frame:CreateFontString(nil,"OVERLAY") ilvldisplay:SetFont(Qulight["media"].font, 10, "OUTLINE") ilvldisplay:SetShadowOffset(1, -1) ilvldisplay:SetPoint("TOPLEFT", 1, -1) --ret.frame.text = CreateFontString("text",Qulight["media"].font, 10, "OUTLINE") --ret.frame.text:SetPoint("TOPLEFT", 1, -1) --ret.frame.text:SetTextColor(1, 1, 0) --ret.frame:FontString("text","OVERLAY") --ret.frame.text:SetFont(Qulight["media"].font, 10, "OUTLINE") --ret.frame.text:SetPoint("TOPLEFT", 1, -1) --ret.frame.text:SetTextColor(1, 1, 0) local Battlepay = _G[ret.frame:GetName()].BattlepayItemTexture if Battlepay then Battlepay:SetAlpha(0) end end ret.bag = bag ret.slot = slot ret.frame:SetID(slot) ret.cooldown = _G[ret.frame:GetName().."Cooldown"] ret.cooldown:Show() self:SlotUpdate(ret) return ret, true end local BAGTYPE_PROFESSION = 0x0008 + 0x0010 + 0x0020 + 0x0040 + 0x0080 + 0x0200 + 0x0400 + 0x10000 local BAGTYPE_FISHING = 32768 function Stuffing:BagType(bag) local bagType = select(2, GetContainerNumFreeSlots(bag)) if bagType and bit.band(bagType, BAGTYPE_FISHING) > 0 then return ST_FISHBAG elseif bagType and bit.band(bagType, BAGTYPE_PROFESSION) > 0 then return ST_SPECIAL end return ST_NORMAL end function Stuffing:BagNew(bag, f) for i, v in pairs(self.bags) do if v:GetID() == bag then v.bagType = self:BagType(bag) return v end end local ret if #trashBag > 0 then local f = -1 for i, v in pairs(trashBag) do if v:GetID() == bag then f = i break end end if f ~= -1 then ret = trashBag[f] table.remove(trashBag, f) ret:Show() ret.bagType = self:BagType(bag) return ret end end ret = CreateFrame("Frame", "StuffingBag"..bag, f) ret.bagType = self:BagType(bag) ret:SetID(bag) return ret end function Stuffing:SearchUpdate(str) str = string.lower(str) for _, b in ipairs(self.buttons) do if b.frame and not b.name then b.frame:SetAlpha(.2) end if b.name then if not string.find (string.lower(b.name), str, 1, true) then SetItemButtonDesaturated(b.frame, true) b.frame:SetAlpha(.2) else SetItemButtonDesaturated(b.frame, false) b.frame:SetAlpha(1) end end end end function Stuffing:SearchReset() for _, b in ipairs(self.buttons) do b.frame:SetAlpha(1) SetItemButtonDesaturated(b.frame, false) end end local function FontString(parent, name, fontName, fontHeight, fontStyle) local fs = parent:CreateFontString(nil, "OVERLAY") fs:SetFont(fontName, fontHeight, fontStyle) fs:SetJustifyH("LEFT") if not name then parent.text = fs else parent[name] = fs end return fs end function Stuffing:CreateBagFrame(w) local n = "StuffingFrame"..w local f = CreateFrame("Frame", n, UIParent) f:EnableMouse(true) f:SetMovable(true) f:SetFrameStrata("HIGH") f:SetFrameLevel(1) f:SetScript("OnMouseDown", function(self, button) if IsShiftKeyDown() and button == "LeftButton" then self:StartMoving() end end) f:SetScript("OnMouseUp", f.StopMovingOrSizing) if w == "Bank" then f:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", 3, 190) else f:SetPoint("BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", -3, 190) end if w == "Bank" then -- Buy button f.b_purchase = CreateFrame("Button", "StuffingPurchaseButton"..w, f) f.b_purchase:SetSize(80, 20) f.b_purchase:SetPoint("TOPLEFT", 10, -4) f.b_purchase:RegisterForClicks("AnyUp") f.b_purchase:SetScript("OnClick", function(self, btn) local _, full = GetNumBankSlots() if not full then StaticPopup_Show("BUY_BANK_SLOT") else StaticPopup_Show("CANNOT_BUY_BANK_SLOT") end end) local fb_purchasetitle = f.b_purchase:CreateFontString("f.b_purchase", "OVERLAY") fb_purchasetitle:SetFont(Qulight["media"].font, 10, "OUTLINE") fb_purchasetitle:SetText(BANKSLOTPURCHASE) fb_purchasetitle:SetPoint("CENTER") -- Reagent button f.b_reagent = CreateFrame("Button", "StuffingReagentButton"..w, f) f.b_reagent:SetSize(105, 20) f.b_reagent:SetPoint("TOPLEFT", f.b_purchase, "TOPRIGHT", 3, 0) f.b_reagent:RegisterForClicks("AnyUp") f.b_reagent:SetScript("OnClick", function() BankFrame_ShowPanel(BANK_PANELS[2].name) if not ReagentBankFrame.isMade then CreateReagentContainer() ReagentBankFrame.isMade = true else _G["StuffingFrameReagent"]:Show() end _G["StuffingFrameBank"]:SetAlpha(0) end) local fb_reagent = f.b_reagent:CreateFontString("f.b_reagent", "OVERLAY") fb_reagent:SetFont(Qulight["media"].font, 10, "OUTLINE") fb_reagent:SetText(REAGENT_BANK) fb_reagent:SetPoint("CENTER") end -- Close button f.b_close = CreateFrame("Button", "StuffingCloseButton"..w, f, "UIPanelCloseButton") f.b_close:SetSize(25, 25) f.b_close:SetPoint("TOPRIGHT", 0, 0) f.b_close:RegisterForClicks("AnyUp") f.b_close:SetScript("OnClick", function(self, btn) if btn == "RightButton" then if Stuffing_DDMenu.initialize ~= Stuffing.Menu then CloseDropDownMenus() Stuffing_DDMenu.initialize = Stuffing.Menu end ToggleDropDownMenu(nil, nil, Stuffing_DDMenu, self:GetName(), 0, 0) return end self:GetParent():Hide() end) ReskinClose(f.b_close) -- Create the bags frame local fb = CreateFrame("Frame", n.."BagsFrame", f) fb:SetPoint("BOTTOMLEFT", f, "TOPLEFT", 0, 3) fb:SetFrameStrata("MEDIUM") f.bags_frame = fb return f end function Stuffing:InitBank() if self.bankFrame then return end local f = self:CreateBagFrame("Bank") f:SetScript("OnHide", StuffingBank_OnHide) self.bankFrame = f end function Stuffing:InitBags() if self.frame then return end self.buttons = {} self.bags = {} self.bagframe_buttons = {} local f = self:CreateBagFrame("Bags") f:SetScript("OnShow", Stuffing_OnShow) f:SetScript("OnHide", Stuffing_OnHide) local editbox = CreateFrame("EditBox", nil, f) editbox:Hide() editbox:SetAutoFocus(true) editbox:SetHeight(40) local resetAndClear = function(self) self:GetParent().detail:Show() self:ClearFocus() Stuffing:SearchReset() end local updateSearch = function(self, t) if t == true then Stuffing:SearchUpdate(self:GetText()) end end editbox:SetScript("OnEscapePressed", resetAndClear) editbox:SetScript("OnEnterPressed", resetAndClear) editbox:SetScript("OnEditFocusLost", editbox.Hide) editbox:SetScript("OnEditFocusGained", editbox.HighlightText) editbox:SetScript("OnTextChanged", updateSearch) editbox:SetText(SEARCH) local detail = f:CreateFontString(nil, "ARTWORK", "GameFontHighlightLarge") detail:SetPoint("TOPLEFT", f, 11, -10) detail:SetPoint("RIGHT", f, -140, -10) detail:SetHeight(13) detail:SetShadowColor(0, 0, 0, 0) detail:SetJustifyH("LEFT") detail:SetText("|cff9999ff"..SEARCH.."|r") editbox:SetAllPoints(detail) local button = CreateFrame("Button", nil, f) button:EnableMouse(true) button:RegisterForClicks("LeftButtonUp", "RightButtonUp") button:SetAllPoints(detail) button:SetScript("OnClick", function(self, btn) if btn == "RightButton" then self:GetParent().detail:Hide() self:GetParent().editbox:Show() self:GetParent().editbox:HighlightText() else if self:GetParent().editbox:IsShown() then self:GetParent().editbox:Hide() self:GetParent().editbox:ClearFocus() self:GetParent().detail:Show() Stuffing:SearchReset() end end end) local tooltip_hide = function() GameTooltip:Hide() end local tooltip_show = function(self) GameTooltip:SetOwner(self, "ANCHOR_CURSOR") GameTooltip:ClearLines() GameTooltip:SetText("Right-click to search") end button:SetScript("OnEnter", tooltip_show) button:SetScript("OnLeave", tooltip_hide) f.editbox = editbox f.detail = detail f.button = button self.frame = f f:Hide() end CreateBDbags= function(f) f:SetBackdrop({ bgFile = Qulight["media"].texture, edgeFile = Qulight["media"].glow, edgeSize = 3, }) f:SetBackdropColor(0, 0, 0, 0) f:SetBackdropBorderColor(0, 0, 0, 1) end function Stuffing:Layout(isBank) local slots = 0 local rows = 0 local off = 26 local cols, f, bs if isBank then bs = BAGS_BANK cols = 12 f = self.bankFrame f:SetAlpha(1) else bs = BAGS_BACKPACK cols = 12 f = self.frame f.editbox:SetFont(Qulight["media"].font, 10) f.detail:SetFont(Qulight["media"].font, 10, "OUTLINE") f.detail:SetShadowOffset(1, -1) f.detail:ClearAllPoints() f.detail:SetPoint("TOPLEFT", f, 12, -8) f.detail:SetPoint("RIGHT", f, -140, 0) end f:SetClampedToScreen(1) CreateStyle(f, 2) local fb = f.bags_frame if Qulight["bags"].BagBars then fb:SetClampedToScreen(1) local bsize = 25 local w = 2 * 1 w = w + ((#bs - 1) * bsize) w = w + ((#bs - 2) * 4) fb:SetHeight(w) fb:SetWidth(2 + bsize) fb:Show() else fb:Hide() end local idx = 0 for _, v in ipairs(bs) do if (not isBank and v <= 3 ) or (isBank and v ~= -1) then local bsize = 32 local b = self:BagFrameSlotNew(fb, v) local xoff = -1 if isBank then xoff = xoff + (idx * bsize) xoff = xoff + 1 b.frame:ClearAllPoints() b.frame:SetPoint("LEFT", fb, "LEFT", xoff, -88) b.frame:SetSize(bsize, bsize) else xoff = xoff + (idx * bsize) xoff = xoff + 1 b.frame:ClearAllPoints() b.frame:SetPoint("LEFT", fb, "LEFT", xoff, -44) b.frame:SetSize(bsize, bsize) end CreateStyle(b.frame, 2) local btns = self.buttons b.frame:HookScript("OnEnter", function(self) local bag if isBank then bag = v else bag = v + 1 end for ind, val in ipairs(btns) do if val.bag == bag then val.frame:SetAlpha(1) else val.frame:SetAlpha(0.2) end end end) b.frame:HookScript("OnLeave", function(self) for _, btn in ipairs(btns) do btn.frame:SetAlpha(1) end end) b.frame:SetScript("OnClick", nil) idx = idx + 1 end end for _, i in ipairs(bs) do local x = GetContainerNumSlots(i) if x > 0 then if not self.bags[i] then self.bags[i] = self:BagNew(i, f) end slots = slots + GetContainerNumSlots(i) end end rows = floor(slots / cols) if (slots % cols) ~= 0 then rows = rows + 1 end f:SetWidth(440) f:SetHeight(rows * 32 + (rows - 1) * 4 + off + 12 * 2 - 2) local idx = 0 for _, i in ipairs(bs) do local bag_cnt = GetContainerNumSlots(i) local specialType = select(2, GetContainerNumFreeSlots(i)) if bag_cnt > 0 then self.bags[i] = self:BagNew(i, f) local bagType = self.bags[i].bagType self.bags[i]:Show() for j = 1, bag_cnt do local b, isnew = self:SlotNew(i, j) local xoff local yoff local x = (idx % cols) local y = floor(idx / cols) if isnew then table.insert(self.buttons, idx + 1, b) end xoff = 12 + (x * 31) + (x * 4) yoff = off + 12 + (y * 31) + ((y - 1) * 4) yoff = yoff * -1 CreateBDbags(b.frame) b.frame:ClearAllPoints() b.frame:SetPoint("TOPLEFT", f, "TOPLEFT", xoff, yoff) b.frame:SetSize(32, 32) b.frame:SetPushedTexture("") b.frame:SetNormalTexture("") b.frame:Show() CreateStyle(b.frame, 3) if bagType == ST_FISHBAG then b.frame:SetBackdropBorderColor(1, 0, 0) -- Tackle b.frame.lock = true elseif bagType == ST_SPECIAL then if specialType == 0x0008 then -- Leatherworking b.frame:SetBackdropBorderColor(0.8, 0.7, 0.3) elseif specialType == 0x0010 then -- Inscription b.frame:SetBackdropBorderColor(0.3, 0.3, 0.8) elseif specialType == 0x0020 then -- Herbs b.frame:SetBackdropBorderColor(0.3, 0.7, 0.3) elseif specialType == 0x0040 then -- Enchanting b.frame:SetBackdropBorderColor(0.6, 0, 0.6) elseif specialType == 0x0080 then -- Engineering b.frame:SetBackdropBorderColor(0.9, 0.4, 0.1) elseif specialType == 0x0200 then -- Gems b.frame:SetBackdropBorderColor(0, 0.7, 0.8) elseif specialType == 0x0400 then -- Mining b.frame:SetBackdropBorderColor(0.4, 0.3, 0.1) elseif specialType == 0x10000 then -- Cooking b.frame:SetBackdropBorderColor(0.9, 0, 0.1) end b.frame.lock = true end self:SlotUpdate(b) idx = idx + 1 end end end end function Stuffing:SetBagsForSorting(c) Stuffing_Open() self.sortBags = {} local cmd = ((c == nil or c == "") and {"d"} or {strsplit("/", c)}) for _, s in ipairs(cmd) do if s == "c" then self.sortBags = {} elseif s == "d" then if not self.bankFrame or not self.bankFrame:IsShown() then for _, i in ipairs(BAGS_BACKPACK) do if self.bags[i] and self.bags[i].bagType == ST_NORMAL then table.insert(self.sortBags, i) end end else for _, i in ipairs(BAGS_BANK) do if self.bags[i] and self.bags[i].bagType == ST_NORMAL then table.insert(self.sortBags, i) end end end elseif s == "p" then if not self.bankFrame or not self.bankFrame:IsShown() then for _, i in ipairs(BAGS_BACKPACK) do if self.bags[i] and self.bags[i].bagType == ST_SPECIAL then table.insert(self.sortBags, i) end end else for _, i in ipairs(BAGS_BANK) do if self.bags[i] and self.bags[i].bagType == ST_SPECIAL then table.insert(self.sortBags, i) end end end else table.insert(self.sortBags, tonumber(s)) end end local bids = "Using bags: " for _, i in ipairs(self.sortBags) do bids = bids..i.." " end Print(bids) end local function StuffingSlashCmd(Cmd) local cmd, args = strsplit(" ", Cmd:lower(), 2) if cmd == "config" then Stuffing_OpenConfig() elseif cmd == "sort" then Stuffing_Sort(args) elseif cmd == "psort" then Stuffing_Sort("c/p") elseif cmd == "stack" then Stuffing:SetBagsForSorting(args) Stuffing:Restack() elseif cmd == "test" then Stuffing:SetBagsForSorting(args) elseif cmd == "purchase" then if Stuffing.bankFrame and Stuffing.bankFrame:IsShown() then local cnt, full = GetNumBankSlots() if full then Print("Can't buy anymore slots!") return end if args == "yes" then PurchaseSlot() return end Print(string.format("Cost: %.2f gold", GetBankSlotCost() / 10000)) Print("Buy new slot with /bags purchase yes") else Print("You need to open your bank first.") end else Print("/bags sort - ".."Sort your bags or your bank, if open.") Print("/bags stack - ".."Fill up partial stacks in your bags or bank, if open.") Print("/bags purchase - ".."Buy bank slot (need to have bank open).") end end function Stuffing:ADDON_LOADED(addon) self:RegisterEvent("BAG_UPDATE") self:RegisterEvent("ITEM_LOCK_CHANGED") self:RegisterEvent("BANKFRAME_OPENED") self:RegisterEvent("BANKFRAME_CLOSED") self:RegisterEvent("GUILDBANKFRAME_OPENED") self:RegisterEvent("GUILDBANKFRAME_CLOSED") self:RegisterEvent("PLAYERBANKSLOTS_CHANGED") --self:RegisterEvent("PLAYERREAGENTBANKSLOTS_CHANGED") self:RegisterEvent("BAG_CLOSED") self:RegisterEvent("BAG_UPDATE_COOLDOWN") --self:RegisterEvent("REAGENTBANK_UPDATE") SlashCmdList.STUFFING = StuffingSlashCmd SLASH_STUFFING1 = "/bags" SLASH_STUFFING2 = "/טפן" self:InitBags() tinsert(UISpecialFrames, "StuffingFrameBags") tinsert(UISpecialFrames, "StuffingFrameReagent") ToggleBackpack = Stuffing_Toggle ToggleBag = Stuffing_Toggle ToggleAllBags = Stuffing_Toggle OpenAllBags = Stuffing_Open OpenBackpack = Stuffing_Open CloseAllBags = Stuffing_Close CloseBackpack = Stuffing_Close --BankFrame:UnregisterAllEvents() BankFrame:SetScale(0.00001) BankFrame:SetAlpha(0) BankFrame:SetPoint("TOPLEFT") end function Stuffing:PLAYER_ENTERING_WORLD() Stuffing:UnregisterEvent("PLAYER_ENTERING_WORLD") ToggleBackpack() ToggleBackpack() end function Stuffing:PLAYERBANKSLOTS_CHANGED(id) if id > 28 then for _, v in ipairs(self.bagframe_buttons) do if v.frame and v.frame.GetInventorySlot then BankFrameItemButton_Update(v.frame) BankFrameItemButton_UpdateLocked(v.frame) if not v.frame.tooltipText then v.frame.tooltipText = "" end end end end if self.bankFrame and self.bankFrame:IsShown() then self:BagSlotUpdate(-1) end end function Stuffing:PLAYERREAGENTBANKSLOTS_CHANGED() for i = 1, 98 do local button = _G["ReagentBankFrameItem" .. i] if not button then return end local _, _, _, quality = GetContainerItemInfo(-3, i) local clink = GetContainerItemLink(-3, i) button:SetBackdropBorderColor(unpack(C.media.border_color)) if clink then if quality and quality > 1 then button:SetBackdropBorderColor(GetItemQualityColor(quality)) end end end end function Stuffing:BAG_UPDATE(id) self:BagSlotUpdate(id) end function Stuffing:ITEM_LOCK_CHANGED(bag, slot) if slot == nil then return end for _, v in ipairs(self.buttons) do if v.bag == bag and v.slot == slot then self:SlotUpdate(v) break end end end function Stuffing:BANKFRAME_OPENED() if not self.bankFrame then self:InitBank() end self:Layout(true) for _, x in ipairs(BAGS_BANK) do self:BagSlotUpdate(x) end self.bankFrame:Show() Stuffing_Open() end function Stuffing:BANKFRAME_CLOSED() if Stuffing_FrameReagent then Stuffing_FrameReagent:Hide() end if self.bankFrame then self.bankFrame:Hide() end end function Stuffing:GUILDBANKFRAME_OPENED() Stuffing_Open() end function Stuffing:GUILDBANKFRAME_CLOSED() Stuffing_Close() end function Stuffing:BAG_CLOSED(id) local b = self.bags[id] if b then table.remove(self.bags, id) b:Hide() table.insert(trashBag, #trashBag + 1, b) end while true do local changed = false for i, v in ipairs(self.buttons) do if v.bag == id then v.frame:Hide() v.frame.lock = false table.insert(trashButton, #trashButton + 1, v.frame) table.remove(self.buttons, i) v = nil changed = true end end if not changed then break end end end function Stuffing:BAG_UPDATE_COOLDOWN() for i, v in pairs(self.buttons) do self:UpdateCooldowns(v) end end local BS_bagGroups local BS_itemSwapGrid local function BS_clearData() BS_itemSwapGrid = {} BS_bagGroups = {} end function Stuffing:SortOnUpdate(elapsed) self.elapsed = (self.elapsed or 0) + elapsed if self.elapsed < 0.05 then return end self.elapsed = 0 local changed = false local blocked = false for bagIndex in pairs(BS_itemSwapGrid) do for slotIndex in pairs(BS_itemSwapGrid[bagIndex]) do local destinationBag = BS_itemSwapGrid[bagIndex][slotIndex].destinationBag local destinationSlot = BS_itemSwapGrid[bagIndex][slotIndex].destinationSlot local _, _, locked1 = GetContainerItemInfo(bagIndex, slotIndex) local _, _, locked2 = GetContainerItemInfo(destinationBag, destinationSlot) if locked1 or locked2 then blocked = true elseif bagIndex ~= destinationBag or slotIndex ~= destinationSlot then PickupContainerItem(bagIndex, slotIndex) PickupContainerItem(destinationBag, destinationSlot) local tempItem = BS_itemSwapGrid[destinationBag][destinationSlot] BS_itemSwapGrid[destinationBag][destinationSlot] = BS_itemSwapGrid[bagIndex][slotIndex] BS_itemSwapGrid[bagIndex][slotIndex] = tempItem changed = true return end end end if not changed and not blocked then self:SetScript("OnUpdate", nil) BS_clearData() end end local function InBags(x) if not Stuffing.bags[x] then return false end for _, v in ipairs(Stuffing.sortBags) do if x == v then return true end end return false end function Stuffing:SortBags() BS_clearData() local bagList if _G["StuffingFrameReagent"] and _G["StuffingFrameReagent"]:IsShown() then bagList = {-3} elseif Stuffing.bankFrame and Stuffing.bankFrame:IsShown() then bagList = {11, 10, 9, 8, 7, 6, 5, -1} else bagList = {4, 3, 2, 1, 0} end for _, slotNum in pairs(bagList) do if GetContainerNumSlots(slotNum) > 0 then BS_itemSwapGrid[slotNum] = {} local family = select(2, GetContainerNumFreeSlots(slotNum)) if family then if family == 0 then family = "Default" end if not BS_bagGroups[family] then BS_bagGroups[family] = {} BS_bagGroups[family].bagSlotNumbers = {} end table.insert(BS_bagGroups[family].bagSlotNumbers, slotNum) end end end for _, group in pairs(BS_bagGroups) do group.itemList = {} for _, bagSlot in pairs(group.bagSlotNumbers) do for itemSlot = 1, GetContainerNumSlots(bagSlot) do local itemLink = GetContainerItemLink(bagSlot, itemSlot) if itemLink ~= nil then local newItem = {} local n, _, q, iL, rL, c1, c2, _, Sl = GetItemInfo(itemLink) -- Hearthstone if n == GetItemInfo(6948) or n == GetItemInfo(110560) then q = 9 end -- Fix for battle pets if not n then n = itemLink q = select(4, GetContainerItemInfo(bagSlot, itemSlot)) iL = 1 rL = 1 c1 = "Pet" c2 = "Pet" Sl = "" end newItem.sort = q..c1..c2..rL..n..iL..Sl tinsert(group.itemList, newItem) BS_itemSwapGrid[bagSlot][itemSlot] = newItem newItem.startBag = bagSlot newItem.startSlot = itemSlot end end end table.sort(group.itemList, function(a, b) return a.sort > b.sort end) for index, item in pairs(group.itemList) do local gridSlot = index for _, bagSlotNumber in pairs(group.bagSlotNumbers) do if gridSlot <= GetContainerNumSlots(bagSlotNumber) then BS_itemSwapGrid[item.startBag][item.startSlot].destinationBag = bagSlotNumber BS_itemSwapGrid[item.startBag][item.startSlot].destinationSlot = GetContainerNumSlots(bagSlotNumber) - gridSlot + 1 break else gridSlot = gridSlot - GetContainerNumSlots(bagSlotNumber) end end end end self:SetScript("OnUpdate", Stuffing.SortOnUpdate) end function Stuffing:RestackOnUpdate(e) if not self.elapsed then self.elapsed = 0 end self.elapsed = self.elapsed + e if self.elapsed < 0.1 then return end self.elapsed = 0 self:Restack() end function Stuffing:Restack() local st = {} Stuffing_Open() for i, v in pairs(self.buttons) do if InBags(v.bag) then local _, cnt, _, _, _, _, clink = GetContainerItemInfo(v.bag, v.slot) if clink then local n, _, _, _, _, _, _, s = GetItemInfo(clink) if n and cnt ~= s then if not st[n] then st[n] = {{item = v, size = cnt, max = s}} else table.insert(st[n], {item = v, size = cnt, max = s}) end end end end end local did_restack = false for i, v in pairs(st) do if #v > 1 then for j = 2, #v, 2 do local a, b = v[j - 1], v[j] local _, _, l1 = GetContainerItemInfo(a.item.bag, a.item.slot) local _, _, l2 = GetContainerItemInfo(b.item.bag, b.item.slot) if l1 or l2 then did_restack = true else PickupContainerItem(a.item.bag, a.item.slot) PickupContainerItem(b.item.bag, b.item.slot) did_restack = true end end end end if did_restack then self:SetScript("OnUpdate", Stuffing.RestackOnUpdate) else self:SetScript("OnUpdate", nil) Print("Restacking finished.") end end function Stuffing:PLAYERBANKBAGSLOTS_CHANGED() if not StuffingPurchaseButtonBank then return end local _, full = GetNumBankSlots() if full then StuffingPurchaseButtonBank:Hide() else StuffingPurchaseButtonBank:Show() end end function Stuffing.Menu(self, level) if not level then return end local info = self.info wipe(info) if level ~= 1 then return end wipe(info) info.text = "Sort" info.notCheckable = 1 info.func = function() SortBags() SortBankBags() SortReagentBankBags() end UIDropDownMenu_AddButton(info, level) wipe(info) info.text = "Sort Special" info.notCheckable = 1 info.func = function() Stuffing_Sort("c/p") end UIDropDownMenu_AddButton(info, level) wipe(info) info.text = "Stack" info.notCheckable = 1 info.func = function() if InCombatLockdown() then Print(ERR_NOT_IN_COMBAT) return end Stuffing:SetBagsForSorting("d") Stuffing:Restack() end UIDropDownMenu_AddButton(info, level) wipe(info) info.text = "Stack Special" info.notCheckable = 1 info.func = function() if InCombatLockdown() then Print(ERR_NOT_IN_COMBAT) return end Stuffing:SetBagsForSorting("c/p") Stuffing:Restack() end UIDropDownMenu_AddButton(info, level) wipe(info) info.text = "Show Bags" info.checked = function() return Qulight["bags"].bag_bars == 1 end info.func = function() if Qulight["bags"].bag_bars == 1 then Qulight["bags"].bag_bars = 0 else Qulight["bags"].bag_bars = 1 end Stuffing:Layout() if Stuffing.bankFrame and Stuffing.bankFrame:IsShown() then Stuffing:Layout(true) end end UIDropDownMenu_AddButton(info, level) wipe(info) info.disabled = nil info.notCheckable = 1 info.text = CLOSE info.func = self.HideMenu info.tooltipTitle = CLOSE UIDropDownMenu_AddButton(info, level) endPwnersmash3 3d
3d Macro to target a specific player Hi gang, I tried to make a macro to target a specific ENEMY player in a BG last night. The player that I was trying to target was from another realm. I thought that a simple macro like the one bellow would work: /target playername-server it did not work. I tried looking up how to create such a macro and could only find really old posts or other types of macros that I wasn't looking for. Does anyone happen to know how to create such a macro?Hotpockits5 3d
4d LF addon highlights buffs raidframe(pic inc) Hey in this clip https://clips.twitch.tv/LivelySpicyPoxOSkomodo or here is a screenshot https://imgur.com/EgisqNm You can see that on the raid frames when his lifebloom is about to expire it gets highlighted. I really want that for my UI, I have tried googling it and can't find anything, I asked him as well but he wouldn't help me.Luxxor0 4d
4d How to change "move and steer" to right mouse I just want to change the "move and steer" key bind to holding down right mouse click, if that is possible. and if possible, would it be a good idea since right clicking is pretty important in-game? I am a "new" returning player so i am fresh to everything and never got into movement keybinds when i used to play, so i am uneducated on the sorts. i have google searched and found the "bindings.cache" solution but either it doesnt work, or i am too dumb to set it up. any help would be appreciated, and if im not in the right sub-forum just let me know. Thanks.Briarwolf2 4d