Roll20 uses cookies to improve your experience on our site. Cookies enable you to enjoy certain features, social sharing functionality, and tailor message and display ads to your interests on our site and others. They also help us understand how our site is being used. By continuing to use our site, you consent to our use of cookies. Update your cookie preferences .
×
Create a free account

Roll20 Tips and Tricks (Innovative Solutions to Common Problems)

1537466502
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
No, it's a good question. The purpose of this thread is to avoid just that. The search functionality of Roll20 forums is not particularly robust, and this thread serves to keep such information easily findable, indexed and linkable. If someone wants to take an idea and run with it, with multiple user inputs, they should start a new thread just for that (and they have!). Ideally, they could edit their original stupid trick post with a link to the broader discussion. This keeps this thread lean and focused and allows users to know where to go to find more information or discussion on it. Small comments or amendments to a trick in-thread are fine. Long digressions are not.
1537473174

Edited 1595398631
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Map Pins A question that often comes up (and there is a suggestion for it), is "How can I make a token that I can place on a map that is linked to a handout?" Although such functionality is not yet possible, you can get very close, requiring only one extra step in execution, and a bit of up-front work. Location Handout The first thing you need is a handout for the location. I have created one in my campaign for a tavern called "Sirens", a nautical establishment with an open stage for performers. Normally, when linking between journals (handouts are a specialized journal, just like character sheets), you just type [Name of handout] in brackets. Anyone reading the handout can click on the resulting link and if they have permission to view the handout, it will open it for them. The problem is, that syntax doesn't work in chat. When you click on it, what is sent to chat is a URL for the handout. for example the URL for my Sirens Handout looks like: <a href="http://journal.roll20.net/handout/-LMrw17y13I587wGj9M7" rel="nofollow">http://journal.roll20.net/handout/-LMrw17y13I587wGj9M7</a> That's fine. We're going to use that URL. It's a little tricky to find, but this leads us to the next thing we need: Directory Handout This is just a master handout that has links to all of the locations (handouts) in your game. For instance the Entry for Sirens just looks like: [Sirens] Put in an entry for each handout. you could even put explanatory text in there for quick reference: [Sirens] - A karaoke bar in Grand Markets [Broken Moon Tavern] - A seedy dive that is a hangout for the wererat thieve's guild ... This will serve you well as a GM, since it can be organized however you like and doesn't need to be viewed or controlled by the players (i.e. you can link to secret handouts if you wish. Save the handout. You should see something like this: Right click the link for Sirens, and copy the URL. Next comes the Map Token. Map Token The Map Token is based on a unique character sheet. You can call it Map Token, or whatever you like. For it's token, you can use a Dot or Flag, or even an Aura. You could even use a rollable token for different kinds of locations: taverns, temples, merchants, etc.&nbsp;&nbsp; Save that as a default token for the Map Item character . You can put as many instances of this token as you wish on your map, so long as they all link back to the character.You can name each token whatever you like, probably the name of the building or town it represents. Don't assign any bars. Ad this Ability to the Abilities Tab and save it as a token action: &amp;{template:default} {{name=@{selected|token_name}}} {{[Click Here](@{selected|bar2|max})}} When clicked, this will call up a default template with the title bar representing the map item. The only thing in the roll template is a link that says "Click Here". You will need to name it something to let players know it is clickable, since it does not appear like a normal button. Now comes the last step. Paste that URL you got from the master handout above into the Max field of bar two. (Why bar 2 max? see note at end) &nbsp;Close up the token. When selected, it should now have a token action button that says "Map Item". Click on that, and you will get this dialog box: Click on the click here link, and the handout will open if you have permission to view it. So to summarize, there's a bit of setup at the very beginning, but as you add handouts the procedure is: Add link to master handout Copy URL Drag new Map Info token onto map Name it and place URL in Bar2 Max Done. Potential API enhancements Aaron's&nbsp; TokenLock &nbsp;script can keep the players from moving the token from where you put it Supernotes can put all this info into chat and avoid using handouts altogether. Just put the info into the token's GM Notes field, and use the command "!pcnote". You can put it in any bar of course, so long as you edit the reference in the macro above. I chose that one because putting it into any of the value buttons causes the URL to display when you click on the often, but putting it in the max of any bar causes a small blank bar to appear above the token when selected. Bar 2 is closest to the token and not as obtrusive Artwork used for map is my own. The Stein token was from Game-icons.net
it should also be noted that they are also incapable of creating the [intra-linked] handout if they do not have View (in Journal) Access, so even if they save it with the correct name, it won't even link, behaving instead as though the handout does not exist
1537580680
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Blue64 said: it should also be noted that they are also incapable of creating the [intra-linked] handout if they do not have View (in Journal) Access, so even if they save it with the correct name, it won't even link, behaving instead as though the handout does not exist keithcurtis &nbsp;said: &nbsp;Anyone reading the handout can click on the resulting link and if they have permission to view the handout , it will open it for them.
creation is not the same as access. Having View Access is a requirement for opening the Link as well, true, but the Creation of said Link will not happen without the appropriate permissions either. An important detail for technical reasons. The GM for example will be incapable of Creating said Link if they are in Player Mode and have not given themselves the View Access (for example, [MacroGM] would not work in such instances)
1537625924
Kraynic
Pro
Sheet Author
That seems to be a really small nit to pick.&nbsp; Most things you would want to do setting up a game as a GM won't work if you are logged in as a player.
1537634964
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Thank you Kraynic and Blue64. This has now been addressed and answered fully. Let's all move on.
1537801277
Kirsty
Pro
Sheet Author
Monster Images in Chat Anyone who has purchased monsters through Roll20 knows that the come with amazing artwork. However, the way that the pages are set up means that if you want to show those images to your players, the monster stat block will also be revealed. You can choose to go through and delete the information that you don't want players to see, but it's a bit of a pain. To get around this issue, I suggest putting your monster images in the chat window. Not only does this allow players to see the images without the stat block, it also means that the GM can save space in their library. Because the chat window will show an image from a link, you don't have to upload the image and can save precious library space for other things. This works for images you find online, as well as for images from the Monster Manual or other Roll20 published books. Step 1: Right click on the image and select "copy image address". Step 2: Paste the URL into chat like so: [Name](URL) Note the blue highlighted section. This must be deleted from the URL in order for it to work properly. All images pasted into the chat window must end with .jpg or other image extension. If you don't delete the last section, you will get a link, rather than an image, in chat. Result: To take this one step further, you could put the image url into one of the bars of your tokens or as an attribute on the character sheet itself. Then make yourself a macro so that you can bring the images into chat quickly and easily. If you put the URL in bar 3 on you token, your macro would look like this: [x](@{selected|bar1})
1538520201

Edited 1538538146
Kirsty that's essentially what I said, but you had screenshots to go with it. both of our examples are using Roll20 images. Also, I have found that you can put the pictures into a &amp;{template:default} in order to contain multiple images at a large size within a single message, 1 image per {{Row}} , otherwise the pictures get a little odd if you {{con=join}} them. another option however would be... Rollable Encounter Table: Image Those familiar with setting up a Druid's Wild Shape are familiar with setting up Images on Rollable Tables, however, not everyone might realize that those Images can be shown to Chat using something like: /roll 10t[Encounter] or /gmroll 10t[Encounter] each image will have the Table entry's Text as it's Tooltip, so, for example, if you get a result of 3 Crossbow Rogues, 2 Wizards, 2 Clerics, 1 Druid, 1 Barbarian, and 1 Paladin (3+2+2+1+1+1=10), you will see the images in Chat, and know exactly which Tokens to grab for the Random Encounter based on that, in addition to being able to mouse over the image for it's name (in case you forgot it). It should however be noted that [[inline rolls]] don't show the images, nor will they show multiple results. it is however good for doing individual rolls, and can be easily spammed via a simple Macro along the lines of: &amp;{template:default} {{name=10 Monster Encounter List}} {{Monster 1=[[1t[Encounter]]]}} {{Monster 2=[[1t[Encounter]]]}} {{Monster 3=[[1t[Encounter]]]}} {{Monster 4=[[1t[Encounter]]]}} {{Monster 5=[[1t[Encounter]]]}} {{Monster 6=[[1t[Encounter]]]}} {{Monster 7=[[1t[Encounter]]]}} {{Monster 8=[[1t[Encounter]]]}} {{Monster 9=[[1t[Encounter]]]}} {{Monster 10=[[1t[Encounter]]]}} however, it should be noted that this specific line of Macros... (Edit: *does a lot of debugging and testing*) ...is rather unwieldy in the form of a unified Macro, as there is a lot of sidestepping the Parser, and it still desires to be split into multiple macros for maximum efficiency. That being said, if you really do want a good looking Text variant of this...
1538537558

Edited 1538537690
Rollable Encounter Table: Text after around 3 hours of sledgehammering square pegs into round holes, I finally came up with a usable format! Some of you might wonder why I picked this following method over spreading the entire thing out over an ever expanding number of Macros, and my reasoning is twofold. Lag Reduction the more Attributes &amp; Abilities you have, the more lines of HTML it generates, as each entry has it's own sets of Code. Whilst this seems like a minor amount of weight on the system, it becomes compounded by the incremental size of each Macro, which means that coding 20 creatures spawning is equivalent to coding 1 creature shy of 1+2+3+4+5+6 combined. 1 through 20 combined is 210 creatures, then you still have the Allied Combatants, &amp; Allied Merchants, and that's JUST the creatures, bringing you up to 630 Creatures programmed, across 60 Abilities, each ability having a Corresponding Attribute so it can be Randomly Generated every time, not counting the Menu Macro(s) that point to each Attribute, doubling the 630 to 1,260. The HTML to generate each Attribute and Ability pair is not exactly short either; you'd likely start seeing the Lag within 10 duplicates of only that Character Sheet, on a 10x10 blank Map with no other resources in the Campaign. By comparison: it takes about 50 to 250 handouts in a sub folder's sub folder of a sub folder sitting inside of a folder (yeah, 4 folders) to achieve the same results in terms of machine strain Lessening the long-term workload Aside from the Machine Strain that spreading everything out would create, there is the hunting down of each and every change you make. Using this method, I have not only saved all of the Coding that 1,260+ entries would have generated to create those Attribute and Ability Slots, but, I was also able to centralize the workload when a Rollable Table needs to get swapped out. 'How does this lessen the Workload?' you might ask. In a word: Scrolling. Those Attributes and Abilities Pages get absolutely monolithic in size as time goes on, in addition to the Lag from the Machine Strain (whether it's your RAM or Processor, strain is strain). Having everything for each type in 1 Text Box saves SO much Scrolling, which saves on Carpal Tunnel as well, in addition to increasing the Stability of the Ctrl+F search results, since it will want to focus on a lesser area overall (by magnitudes of magnitudes) when you desire to change something. enough with the Reasoning for this method (which is useful information if you were unawares of such things), and onward to the method it's self. First: we will want a Character Sheet, trust me, between the organization, accessibility, and shortcuts, you'll WANT a Character Sheet. These will be GM tier Macros, not Player level, so be sure to address that accordingly. I would also suggest that you make this it's own Character Sheet, as it is quite extensive, even though I have shortened it to a mere shadow of it's former self. Once the Character Sheet is generated, and it has been stripped of it's useless Attributes (in 5e OGL Sheet you only need the Charactermancer Stage Complete and the Version Number for example, open it a few times and delete the other Attributes, they'll be useless for this) our next step will be to set up a few Abilities to get us started: EncounterMenu AllyCombat AllyMerchant CR0 CR0.25 CR0.50 CR0.75 CR1 These are all important in their own ways. the CR section is the Enemies, whereas the Ally section is for potential non-lethal encounters, and of course EncounterMenu is the entry menu, it contains the Friend/Foe identification table, since you'll only need to roll it once. it's not standard, but the system is modular and adaptive, it could be used for Items, Chance encounters, which eyes the Beholder is using this Round, pretty much anything that you can put on the Rollable Tables, it does however take some setting up, so do not mistake this for a system that will be usable "on the Fly" (which would be one of the few benefits of the more straining system, which takes even longer than this one on the front end of the work load, as you will need to create the 20+ Entries for 6 Tiers before you can use it compared to around 12 entries here) to ensure I am capable of posting what code I do have, I shall post it here and continue typing this via Edit, as time is short on my end Abilities: EncounterMenu /w gm &amp;{template:default} {{name=Ally Options}} {{[Combat](! @{AllyC}) | [Merchant](! @{AllyM})}} /w gm &amp;{template:default} {{name=Foe CR Options}} {{| [0](! @{CR0}) | [0.25](! @{CR0.25}) | [0.50](! @{CR0.50}) | [0.75](! @{CR0.75}) | [1](! @{CR1}) | [2](! @{CR2}) | [3](! @{CR3}) | [4](! @{CR4}) | [5](! @{CR5}) |}} /w gm &amp;{template:default} {{name=5 Creature Encounter List}} {{Creature 1=@{FriendFoe}}} {{Creature 2=@{FriendFoe}}} {{Creature 3=@{FriendFoe}}} {{Creature 4=@{FriendFoe}}} {{Creature 5=@{FriendFoe}}} AllyCombat !?{Number|1,{{[[1t[AllyCombat]]]&amp;#125;&amp;#125;|2,{{[[1t[AllyCombat]]]&amp;#125;&amp;#125; {{[[1t[AllyCombat]]]&amp;#125;&amp;#125;|3,{{[[1t[AllyCombat]]]&amp;#125;&amp;#125; {{[[1t[AllyCombat]]]&amp;#125;&amp;#125; {{[[1t[AllyCombat]]]&amp;#125;&amp;#125;|4,{{[[1t[AllyCombat]]]&amp;#125;&amp;#125; {{[[1t[AllyCombat]]]&amp;#125;&amp;#125; {{[[1t[AllyCombat]]]&amp;#125;&amp;#125; {{[[1t[AllyCombat]]]&amp;#125;&amp;#125;|5,{{[[1t[AllyCombat]]]&amp;#125;&amp;#125; {{[[1t[AllyCombat]]]&amp;#125;&amp;#125; {{[[1t[AllyCombat]]]&amp;#125;&amp;#125; {{[[1t[AllyCombat]]]&amp;#125;&amp;#125; {{[[1t[AllyCombat]]]&amp;#125;&amp;#125;} &amp;{template:default} {{name=Combat Allies}} ?{Number} AllyMerchant !?{Number|1,{{[[1t[AllyMerchant]]]&amp;#125;&amp;#125;|2,{{[[1t[AllyMerchant]]]&amp;#125;&amp;#125; {{[[1t[AllyMerchant]]]&amp;#125;&amp;#125;|3,{{[[1t[AllyMerchant]]]&amp;#125;&amp;#125; {{[[1t[AllyMerchant]]]&amp;#125;&amp;#125; {{[[1t[AllyMerchant]]]&amp;#125;&amp;#125;|4,{{[[1t[AllyMerchant]]]&amp;#125;&amp;#125; {{[[1t[AllyMerchant]]]&amp;#125;&amp;#125; {{[[1t[AllyMerchant]]]&amp;#125;&amp;#125; {{[[1t[AllyMerchant]]]&amp;#125;&amp;#125;|5,{{[[1t[AllyMerchant]]]&amp;#125;&amp;#125; {{[[1t[AllyMerchant]]]&amp;#125;&amp;#125; {{[[1t[AllyMerchant]]]&amp;#125;&amp;#125; {{[[1t[AllyMerchant]]]&amp;#125;&amp;#125; {{[[1t[AllyMerchant]]]&amp;#125;&amp;#125;} &amp;{template:default} {{name=Merchant Allies}} ?{Number} CR0 !?{Number|1,{{[[1t[CR0]]]&amp;#125;&amp;#125;|2,{{[[1t[CR0]]]&amp;#125;&amp;#125; {{[[1t[CR0]]]&amp;#125;&amp;#125;|3,{{[[1t[CR0]]]&amp;#125;&amp;#125; {{[[1t[CR0]]]&amp;#125;&amp;#125; {{[[1t[CR0]]]&amp;#125;&amp;#125;|4,{{[[1t[CR0]]]&amp;#125;&amp;#125; {{[[1t[CR0]]]&amp;#125;&amp;#125; {{[[1t[CR0]]]&amp;#125;&amp;#125; {{[[1t[CR0]]]&amp;#125;&amp;#125;|5,{{[[1t[CR0]]]&amp;#125;&amp;#125; {{[[1t[CR0]]]&amp;#125;&amp;#125; {{[[1t[CR0]]]&amp;#125;&amp;#125; {{[[1t[CR0]]]&amp;#125;&amp;#125; {{[[1t[CR0]]]&amp;#125;&amp;#125;} &amp;{template:default} {{name=CR 0 Enemies}} ?{Number} CR0.25 !?{Number|1,{{[[1t[CR0.25]]]&amp;#125;&amp;#125;|2,{{[[1t[CR0.25]]]&amp;#125;&amp;#125; {{[[1t[CR0.25]]]&amp;#125;&amp;#125;|3,{{[[1t[CR0.25]]]&amp;#125;&amp;#125; {{[[1t[CR0.25]]]&amp;#125;&amp;#125; {{[[1t[CR0.25]]]&amp;#125;&amp;#125;|4,{{[[1t[CR0.25]]]&amp;#125;&amp;#125; {{[[1t[CR0.25]]]&amp;#125;&amp;#125; {{[[1t[CR0.25]]]&amp;#125;&amp;#125; {{[[1t[CR0.25]]]&amp;#125;&amp;#125;|5,{{[[1t[CR0.25]]]&amp;#125;&amp;#125; {{[[1t[CR0.25]]]&amp;#125;&amp;#125; {{[[1t[CR0.25]]]&amp;#125;&amp;#125; {{[[1t[CR0.25]]]&amp;#125;&amp;#125; {{[[1t[CR0.25]]]&amp;#125;&amp;#125;} &amp;{template:default} {{name=CR 0 Enemies}} ?{Number} CR0.50 !?{Number|1,{{[[1t[CR0.50]]]&amp;#125;&amp;#125;|2,{{[[1t[CR0.50]]]&amp;#125;&amp;#125; {{[[1t[CR0.50]]]&amp;#125;&amp;#125;|3,{{[[1t[CR0.50]]]&amp;#125;&amp;#125; {{[[1t[CR0.50]]]&amp;#125;&amp;#125; {{[[1t[CR0.50]]]&amp;#125;&amp;#125;|4,{{[[1t[CR0.50]]]&amp;#125;&amp;#125; {{[[1t[CR0.50]]]&amp;#125;&amp;#125; {{[[1t[CR0.50]]]&amp;#125;&amp;#125; {{[[1t[CR0.50]]]&amp;#125;&amp;#125;|5,{{[[1t[CR0.50]]]&amp;#125;&amp;#125; {{[[1t[CR0.50]]]&amp;#125;&amp;#125; {{[[1t[CR0.50]]]&amp;#125;&amp;#125; {{[[1t[CR0.50]]]&amp;#125;&amp;#125; {{[[1t[CR0.50]]]&amp;#125;&amp;#125;} &amp;{template:default} {{name=CR 0 Enemies}} ?{Number} CR0.75 !?{Number|1,{{[[1t[CR0.75]]]&amp;#125;&amp;#125;|2,{{[[1t[CR0.75]]]&amp;#125;&amp;#125; {{[[1t[CR0.75]]]&amp;#125;&amp;#125;|3,{{[[1t[CR0.75]]]&amp;#125;&amp;#125; {{[[1t[CR0.75]]]&amp;#125;&amp;#125; {{[[1t[CR0.75]]]&amp;#125;&amp;#125;|4,{{[[1t[CR0.75]]]&amp;#125;&amp;#125; {{[[1t[CR0.75]]]&amp;#125;&amp;#125; {{[[1t[CR0.75]]]&amp;#125;&amp;#125; {{[[1t[CR0.75]]]&amp;#125;&amp;#125;|5,{{[[1t[CR0.75]]]&amp;#125;&amp;#125; {{[[1t[CR0.75]]]&amp;#125;&amp;#125; {{[[1t[CR0.75]]]&amp;#125;&amp;#125; {{[[1t[CR0.75]]]&amp;#125;&amp;#125; {{[[1t[CR0.75]]]&amp;#125;&amp;#125;} &amp;{template:default} {{name=CR 0 Enemies}} ?{Number} CR1 !?{Number|1,{{[[1t[CR1]]]&amp;#125;&amp;#125;|2,{{[[1t[CR1]]]&amp;#125;&amp;#125; {{[[1t[CR1]]]&amp;#125;&amp;#125;|3,{{[[1t[CR1]]]&amp;#125;&amp;#125; {{[[1t[CR1]]]&amp;#125;&amp;#125; {{[[1t[CR1]]]&amp;#125;&amp;#125;|4,{{[[1t[CR1]]]&amp;#125;&amp;#125; {{[[1t[CR1]]]&amp;#125;&amp;#125; {{[[1t[CR1]]]&amp;#125;&amp;#125; {{[[1t[CR1]]]&amp;#125;&amp;#125;|5,{{[[1t[CR1]]]&amp;#125;&amp;#125; {{[[1t[CR1]]]&amp;#125;&amp;#125; {{[[1t[CR1]]]&amp;#125;&amp;#125; {{[[1t[CR1]]]&amp;#125;&amp;#125; {{[[1t[CR1]]]&amp;#125;&amp;#125;} &amp;{template:default} {{name=CR 0 Enemies}} ?{Number} Attributes, the ones that are sidestepping the Parser are in here, they'll have the Parsed version at the bottom of such entries: FriendFoe [[1t[FriendFoe]]] AllyC &amp;#37;&amp;#123;Encounter&amp;#124;AllyCombat&amp;#125; %{Encounter|AllyCombat} AllyM &amp;#37;&amp;#123;Encounter&amp;#124;AllyMerchant&amp;#125; %{Encounter|AllyMerchant} CR0 &amp;#37;&amp;#123;Encounter&amp;#124;cr0&amp;#125; %{Encounter|cr0} CR0.25 &amp;#37;&amp;#123;Encounter&amp;#124;cr0.25&amp;#125; %{Encounter|cr0.25} CR0.50 &amp;#37;&amp;#123;Encounter&amp;#124;cr0.50&amp;#125; %{Encounter|cr0.50} CR0.75 &amp;#37;&amp;#123;Encounter&amp;#124;cr0.75&amp;#125; %{Encounter|cr0.75} CR1 &amp;#37;&amp;#123;Encounter&amp;#124;cr1&amp;#125; %{Encounter|cr1} etc. Rollable Table (they're replaceable, this will however get you a test model. Sorry I didn't get the CR modules online, but it's simple renaming) FriendFoe 1 Friend 1 Foe AllyCombat 1 Combat1 1 Combat2 1 Combat3 1 Combat4 1 Combat5 AllyMerchant 1 Merchant1 1 Merchant2 1 Merchant3 1 Merchant4 1 Merchant5
1538539630

Edited 1538539691
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Aligning Images in Handouts Let me preface this Stupid Trick by saying: use at your own caution. This goes into a bit of html trickery to accomplish, and it might bollux up a handout. Once upon a time, you could right click an image in a handout and cause it to align right or left, flowing the text around it. This is one of the features that was lost during the Text Editor Upgrade. This functionality is still possible if you are determined to achieve it. I have created a handout with a little character portrait (Antioch, my "assassin with a heart of gold"™) to keep this simple, and filled it with placeholder text. For this trick to work, you must copy and paste the image from an online source, not an image editing app. If it's a personal image, upload it to something like imgur. My assumption is that posting from an online source copies over the necessary tags. Paste the graphic in the general area where you want it to appear. It will either be floating above the text on its own line, or flush left and force the first line to use its height for line space. This is Not Desirable. Save the handout. That's right, we're going to edit this in display mode. Right click on the image and Choose "Inspect". I am using Chrome for these shots, but the overall procedure is similar enough in FIrefox. You will see a bunch of formatting and content code appear&nbsp; (the position is browser and user-dependent, but you can't miss it). The graphic and its formatting tags will be highlighted. Right click on it and choose "Add Attribute". A small editing space will appear in which you can add&nbsp; align="left" or align="right" as shown: The graphic will now float to the left or right of the text, which will flow around it. Normally, this sort of editing is temporary. You are only changing how the page will display for that session on that browser. It will disappear as soon as you click the edit button on the handout. So don't edit it yet. &nbsp;Instead select all of the text on the handout, making sure to get the image as well. Copy. Now edit the handout and delete the contents completely. Paste the "temporary" edited content. It will paste with your behind-the-scenes tag editing intact, and the text will wrap around the image accordingly. Save your handout. Ta da.
1538539834
GiGs
Pro
Sheet Author
API Scripter
Thats quite a clunky workaround, keith, but it works. And since it works, it shows that wrapping feature should be something the roll20 devs can restore natively, once they get around to it.
1538541906

Edited 1538542110
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
That it hasn't been implemented prompted me to put in the cautionary note. I assume it's a more complicated problem than it looks. For instance, the text once pasted, sometimes needs some style taming. Some of it might be bold, or right-aligned, for instance. Also, in order to work, it requires the picture have originally been copied from an online source. And what works in a handout might break somewhere else, or cause complications with other things I'm not even aware of. Caveat textor! —And yeah, it is a huge kludge.
1538543231

Edited 1538543260
You can fix the text by saving it to a .txt file, closing, and reopening the file, it clears all formatting that way, allowing it to adapt to whatever you paste it to (just be careful not to remove your photo in the process, as it will remove more than just the tag if it gets shoved into a .txt file) P. S. Awesome trick
1539086093

Edited 1539088517
Kirsty said: Monster Images in Chat [Post details here] To expand on this, if you put #.png at the end of the image it will be interpreted as an image even if it has the hash at the end. This way you can put it into a macro instead of manually having to trim out the end part. [Image](?{URL}#.png) Click it and paste in the url. Also Keith if you edit the html while in edit mode directly you can save changes just by typing any character and then deleting it. This lets you do some pretty awesome css trickery. (Displayed here is a simple link that looks like and behaves like a button that runs an API command on click) Btw are API tricks allowed here? Because that button does something special.
1539091121
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Thanks Noon! API tricks are absolutely welcome, so long as it is clearly marked as such, and more than just "look what this script does", i.e. a clever or innovative use. A link to the script is always appreciated. Finally, if the same thing can be done without the API, just with more work, that's always appreciated. Please elaborate on "if you edit the html while in edit mode directly you can save changes just by typing any character and then deleting it".
SO USEFUL JUST ADDED THAT MACRO TO MY GAME!! Noon said: Kirsty said: Monster Images in Chat [Post details here] To expand on this, if you put #.png at the end of the image it will be interpreted as an image even if it has the hash at the end. This way you can put it into a macro instead of manually having to trim out the end part. [Image](?{URL}#.png) Click it and paste in the url. Also Keith if you edit the html while in edit mode directly you can save changes just by typing any character and then deleting it. This lets you do some pretty awesome css trickery. (Displayed here is a simple link that looks like and behaves like a button that runs an API command on click) Btw are API tricks allowed here? Because that button does something special.
1539096818

Edited 1539288707
I'll refrain from most of my janky code tricks like bookmarklets (unless you want them). To elaborate on the HTML thing: If you use the browser's inspector to edit the raw html of the notes section while in edit mode, any changes you make won't be saved when you click Save Changes unless you have used the wysiwyg editor at least once after. For instance in this screenshot you can see I have custom css markup on this anchor making it look like a button. (the style attribute on the &lt;a&gt;). If I wanted to update my button with, for example, a border, I would: Select the item I want to modify using the inspector(in this case, the link [Ctrl + Shift + C in chrome]) Make changes to the html directly (border: red solid 2px) Close the inspector and synchronize changes by making any change using the REAL roll 20 editor. Save Changes when you're finished editing. Done Now that I think about it, there's not much to the button trick but maybe it is something useful.
1539097043

Edited 1539097388
Live Handouts (API) Basically handouts can be changed on the fly. A button inside the handout that calls an API script ( using journal command buttons ) to edit the handout will make changes to it without having to reload it. You can use this to create handouts that have actual user interaction and states (if you use the gmnotes section to store variables and the notes section to display information). The caveat is that the title of the handout won't change unless you close/ reopen it. This could also be used to show players something without cluttering up their Journal. Just overwrite the last thing you showed them and show it to them again. Here's a mockup I made for something else that uses this. (It is much faster than displayed. I hover over the buttons for half a second before clicking them in this gif)
1539102657
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Very nice. Feel free to edit and elaborate with code and scripts used. If you feel it's just way to complicated for this thread, and you want to put it in it's own thread, link to it from within here and I'll still put it in the index in the top post. As for the bookmarklets, i'll leave that to your discretion. The Aaron has a very nice collection here that you can use to serve as a guideline, and I would suggest an independent thread. I would make much greater use of them myself, but Chrome has such more sluggish performance than Firefox Quantum, which no longer supports them. If you want to make your own bookmarklet thread, I'll link it on the front page like the Aaron's, if it's robust enough.
1539102697
Scott C.
Forum Champion
Sheet Author
API Scripter
Compendium Curator
That's pretty nifty Noon. I could swear I had tried editing handouts in real time with the API without success before. Could you also share the API script that you are using to drive this?
1539103810
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Scott C. said: That's pretty nifty Noon. I could swear I had tried editing handouts in real time with the API without success before. Could you also share the API script that you are using to drive this? For a whole script, probably best to use its own thread. It makes it easier for people to find it, comment and ask for help.
Good news on the bookmarklets, keith. Updated 4 days ago and bz needsinfo'd himself. Hopefully fixed in the next ff. It is just set('notes'). Something must have changed since you last checked. You'll still need to wait on the callback for get('gmnotes') if you're doing states like I described above. I'll create a real thread when I'm ready to release that component.
1539113133
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Holy crow! For me, this will be a game changer! Noon said: Good news on the bookmarklets, keith. Updated 4 days ago and bz needsinfo'd himself. Hopefully fixed in the next ff.
1541537701

Edited 1541537856
Mik Holmes
Pro
Marketplace Creator
I'm so disappointed that this thread got de-stickied. It seems this thread has been all but forgotten. I've been desperately trying to think of something to add just for the hell of it. And I might have something. User "Bast L." has created an API script to do my grid toggle idea (thank you so much!), which I've tweaked slightly, allowing for exploration-mode player tokens to maintain their not-a-drawing status (which otherwise prohibits changing status icons or affecting bar bubbles). This is an update to my previous suggestion:&nbsp; <a href="https://app.roll20.net/forum/post/5899495/stupid-roll20-tricks-and-some-clever-ones/?pageforid=6700678#post-6700678" rel="nofollow">https://app.roll20.net/forum/post/5899495/stupid-roll20-tricks-and-some-clever-ones/?pageforid=6700678#post-6700678</a> Exploration Mode (API) - Version 2 If you're in a tight map, your players might find it difficult to maneuver with typical tokens. Outside combat, a 10'x10' room can easily fit five people, but with regular token size, you'd need to overlay people - and even then, players would struggle to see the map. Using the API, you can make macros to shrink or enlarge tokens, while turning off the grid for your page. You'll also need the TokenMod script. GridToggle Script //Toggles Grid on and off with a button. //Body of macro reads: !GridToggle on or off on("ready", function() { on('chat:message', function(msg) { if (msg.type === "api" &amp;&amp; msg.content.split(" ")[0] === "!GridToggle" &amp;&amp; playerIsGM(msg.playerid)) { let campaign = findObjs({_type: "campaign"})[0]; let page = findObjs({_type: "page", id: campaign.get('playerpageid')})[0]; if(msg.content.split(" ")[1] == "on") { page.set("snapping_increment", 1); } else { page.set("snapping_increment", 0); } /*if(page.get("snapping_increment") == 1) { page.set("snapping_increment", 0); } else { page.set("snapping_increment", 1); }*/ } }); }); Explore-mode Macro, select all tokens and run !token-mod --set width|/2 height|/2 !GridToggle off Combat-mode Macro, select all tokens and run !token-mod --set width|*2 height|*2 !GridToggle on Since these macros include both resizing and changing the grid, sometimes you might misclick and have the wrong grid status. Here's a simple toggle macro. !GridToggle ?{On or Off|off|on} The !GridToggle script only affects the page with the player bar, but the resizing works on any page, so be careful when using it on other pages. Eagle-eyed readers might notice that the script only detects whether or not there is a "on" following !GridToggle; any other result, "off" or otherwise, will turn the grid off.&nbsp; If you prefer not to mess with the grid when using these, you can instead use the isdrawing flag in token mod. !token-mod --on isdrawing --set width|/2 height|/2 !token-mod --off isdrawing --set width|*2 height|*2
1541540467
Gen Kitty
Forum Champion
The thread is semi-stickied, as it has a listing in <a href="https://app.roll20.net/forum/post/6712857/helpful-hints-tricks-and-guidance-thread-repository" rel="nofollow">https://app.roll20.net/forum/post/6712857/helpful-hints-tricks-and-guidance-thread-repository</a> which is stickied.
I'm tinkering with an idea I had that could theoretically allow me to have access to the Nested Rollable Tables. It's difficult to put into words, and I have not fully researched into it yet, but I might have something within the next week.
1541601761

Edited 1541601896
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Thanks Mik! I have added this as a (More Info) link on your original index listing. I like this one; it mirrors the sort of thing I used to do on the physical tabletop all the time: draw small rooms at double scale. And I do miss it being de-stickied, too. But the number of threads that were stickied was getting a little ridiculous. Gen Kitty is right about it being internally carried in a stickied post. And I appreciate every post that keeps this thread going. I try to make sure to think of a tip if one hasn't been added in a while. It also gets quite a bit of traffic from myself and others regularly linking to it. Sheet Macros and Chat Menus links should be on a hot key for me. :) Mik Holmes said: I'm so disappointed that this thread got de-stickied. It seems this thread has been all but forgotten. I've been desperately trying to think of something to add just for the hell of it. And I might have something.
I have figured out how to do it at last! Without API Access, I am proud to present: Nestable Rollable Tables (Free User Version) We all know that it is a pain to handle the Nestable Tables, especially when rolling for Loot! I have managed to successfully figure out how to handle such a conundrum! Although, I should warn you, it has it's limitations. Here are the simple steps to follow: The Nested Tables MUST explicitly be named a Number, any Number that can be returned using the [[Inline Rolling]] will work fine (so, as low as 0.00) You will need to have exactly the correct amount of Nested answers Example: 0: Roll for Loot Type: 1, 2, 3 1: Gem: 10 GP Result 50 GP Result 100 GP Result 1,000 GP Result 2: Armor: Light Result Medium Result Heavy Result 3: Weapon: Simple Result: Melee Roll Separately Result: Ranged Roll Separately Martial Result: Melee Roll Separately Result: Ranged Roll Separately Each point on the Tree is only named a Number, the Labeling can be placed as the first result with a Weight of 0, thus it will never actually Roll it, and retains the functionality of a Nested Table. when Rolling, you will need to inline roll each result inside the Table's Inline Roll Example: the above Rolls would be [[1t[[[1t[[[1t[0]]]]]]]]] [[1t[ [[1t[ [[1t[0]]] ]]] ]]] it rolls a Table, uses that result to roll the 2nd Table, which returns the Result for the 3rd Table. NOTE: This will not return ANY result if the Nesting ends before the final Roll, it will simply return 0, which I suggest having a Table 0 with the Result of "0", as there is no Error Message for this result. The finished Result will be an extremely streamlined Rollable Table, allowing you to even work in your 5e DMG Tables without needing to look up or search for anything, so long as you follow this guideline. This is also useful since it can be placed anywhere there is Text sent to Chat, and should not require Parser Evasion. I have not tested the maximum Nest Depth yet.
1541701473

Edited 1541799816
Auras as Token Outlines Use an aura of radius 0 to create quick outlines on tokens so they stand out on the table. My preference is to set aura1 to white, aura2 to a random color and then make aura2 visible to the players so they can see the enemies better, but not as good as myself. You can even make a script in the API that randomly does this by doing something like this: Make selected tokens have a random color outline (!randomColor) on("chat:message", function(msg) { if (msg.type == "api" &amp;&amp; msg.content.indexOf('!randomColor') == 0) _.each(msg.selected, function(s) { let token = getObj('graphic', s._id); if (token) token.set({ aura1_radius: '0', aura1_color: '#ffffff', showplayers_aura1: false, aura2_radius: '0', aura2_color: [...Array(6)].reduce((m) =&gt; m + '00123456789abcdef'.charAt(randomInteger(16)), '#'), showplayers_aura2: true }); }); }); You can change this to your needs. I made it a little more readable than my normal code. If you'd prefer, here is a way for it to work with token-mod ( You need to create a table called "hex" that contains 0-9 and A-F ): !token-mod --set aura1_color|ffffff aura2_color|[[1t[hex]]][[1t[hex]]][[1t[hex]]][[1t[hex]]][[1t[hex]]][[1t[hex]]] aura1_radius|0 aura2_radius|0 --on showplayers_aura2 If you'd prefer a bookmarklet here is that as well (Only works for 1 token at a time) javascript:(function()%7Bcurrentcontexttarget.model.save(%7Baura2_color%3A%20'%23'%20%2B%20(Math.random().toString(16)%20%2B%20'0000000').slice(2%2C%208)%7D)%7D)() (You can set the second aura to .2 to make the token have an outline)
don't forget you can set the Aura to Square as well!
1541709197
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Good tip and nice bonus script, Noon. Thanks for going to the extra effort to showing how it could be done with existing scripts! Blue64 said: don't forget you can set the Aura to Square as well! Important for games such as D&amp;D 5e which uses diagonal=1. I often do this to show the reach on irregular token images.
1542090095

Edited 1542090118
Mike W.
Pro
Sheet Author
I just discovered the third party: Roll20 Enhancement Suite. <a href="https://ssstormy.github.io/roll20-enhancement-suite/" rel="nofollow">https://ssstormy.github.io/roll20-enhancement-suite/</a> This is great!
1542090992
GiGs
Pro
Sheet Author
API Scripter
Oh yeah! It's very useful.
FYI Roll20 Enhancement Suite has just been renamed to VTT Enhancement Suite <a href="https://ssstormy.github.io/roll20-enhancement-suite/" rel="nofollow">https://ssstormy.github.io/roll20-enhancement-suite/</a>
1544400106

Edited 1544401703
Invisible Tokens Often in games a character (PC or NPC) is invisible or hidden. Pro subscribers can use the Bump API script, but not everyone is a subscriber, or even if you are, sometimes you need something quick and dirty. Many games just mark the token with an icon and tell everyone that token is invisible and not to metagame. A common way to handle this for NPCs is to place their token on the GM Layer. But switching layers in the middle of a fight is extra work, and the GM Layer won't work for an invisible player-controlled token. This trick's solution is to temporarily use a transparent PNG file for the token and apply an Aura to it that only the controlling player(s) and the GM can see. Disclaimer: This is not my original trick; I picked up this tip on the Roll20 forums long ago, but I can't recall who I got it from. First you need a transparent PNG file. You can make one in your favorite graphics editing program, like GIMP, Paint.NET, or PhotoShop. I named mine utility_clear_invisible_hidden_transparent_token.png so it would come up in Roll20 image searches whatever term I used to find it. Upload/drag-and-drop it to Roll20. Once the transparent PNG is a token on a game's tabletop, click on it to edit the token. Set the settings (Represents, Controlled By, Bar Values, Has Sight, etc.) as you would for any other token, with the following differences: On the Basic Tab Set an Aura to size 0 and set the color you wish to use. On the Advanced Tab Uncheck the "See" checkboxes for all Player Permissions. Check the "Edit" checkbox for the Aura you set on the Basic tab. Visible Name, Bars, and Auras for the invisible character will reveal its location. If a token is emitting light, it will give away its position. Clear the "Emits Light" values or uncheck the "All Players See Light" checkbox, as appropriate. A careless player may forget and use their light source while invisible; whether you remind them about it or not is up to you. ;-) Set the Ruler tool's visibility to "Hide from others" before using it in relation to an invisible token. Also, even if the Ruler is set to "Hide from others," do not use waypoints in your movement -- the path of the invisible token will be displayed to all. ( Credit to Brent T. for noting these .) Remember to reverse these token and Ruler settings when the token is no longer invisible/hidden. Here are the results: Alabaskar's player thinks he is in trouble: But little does he know his invisible ally, Rabulias, is flanking the Hill Giant, ready to strike for some sneak attack damage: But neither player knows that the GM has an invisible Gnoll flanking Alabaskar: Bonus Tips For tokens that often turn invisible, you can make a Rollable Table token for the character to make the switch a little easier. You still need to change the token settings mentioned above. ( Credit to Ziechael ) If you are a Pro subscriber, you can make a macro that calls the TokenMod API script and sets all the various token settings. You can even make a Roll Query dropdown in the macro that prompts the user to turn invisibility on or off. ( Credit to Ziechael )
1544406512
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Excellent trick, Rabulias! Thanks!
1544483669

Edited 1544555026
It should be noted that the Rollable Tables section is not capable of being reorganised, so if you want to move either something in a table, or move an entire table, you need to actually rebuild either everything not above the table entry you wish to insert, or all of the tables not above where you insert the new table, this however can be sped up by using the previously mentioned (~3 posts ago) Roll20 Enhancement Suite Add-on (it's available for Chrome on Desktop, and Firefox on Mobile and Desktop), as you can Export things to a .json format, and then use a Text Editing program (I like Notepad++) to insert the entry into the correct position, then simply import the Table(s). The export function relies on local storage to "download" the file, which means it is useful if you for example want to work on a Character Sheet, but Roll20 crashed an hour ago and might not be up until tomorrow but you won't be near Wi-Fi for the next few days, all of the work from that hour offline will still be in the .json file. Figured I should point out that you can speed up the process by mixing those two tricks. Also, if you use the Rollable Table Default Token trick, only Rollable Table entries that have an image will show up in the Change Side Page, so if the Table has 10 entries, but only 2 images, there is only 2 options on the Change Side Page. Edit: if you have a problem with my post, please be more specific, I try to cover a lot of content when I do post, so vague mentions are relatively easily dismissed because I have no idea what they are referring to. If the Thread Moderators (for example, Keith, who encouraged suggestions about mixing tricks, which is what this post is about) think that some content should not be in the Post, they are free to edit it out (something Keith has previously mentioned that he usually does anyways).
1544607621

Edited 1544608397
Ziechael
Forum Champion
Sheet Author
API Scripter
Fine tune 'snap to grid' dynamic lighting Of course nothing can compare to the dynamic lighting lines that can be achieved without snapping to the grid but sometimes it is preferable to have nice straight lines at set angles to one another! But... I hear you cry... the grid is often right on the walls, free hand is my only choice right? WRONG Mortal! Behold, the power of the smaller grid!!! With a somewhat complex room the existing grid doesn't exactly lend itself to shift+click snapping: 1. Here we go... 2. Basic grid, snap to dynamic lighting... meh 3. Free hand, always better but such potential for a misclick ruining the whole thing... especially if you don't notice it until too late! 4. Reducing the grid to 0.2 or less gives much finer control when using shift+click to draw your lines. Just as good as free hand without the potential for disaster when doing large maps with a single lighting line. Naturally, don't forget to reset your grid to 1 unit again afterwards ;)
1544609500

Edited 1544609608
Ziechael
Forum Champion
Sheet Author
API Scripter
Forum searching... but better This may not qualify as a stupid trick for Roll20 per se, however it can be utilised in conjunction with Roll20 to enhance your forum searching needs. In my example below it was used to look for games listed in the LFG forum for the Pathfinder system, listing the results in date order rather than by relevance which is how the forum search currently works :( The LFG tool is obviously a preference for searches like that but the forum is still a go-to for lots of people. However, this 'trick' can be used for any forum searching to ensure that you are getting the most recent opinions and ideas rather than severely out of date advice for things like token setup, API script support, changes to VTT features over time etc. The answer... Google itself! Before: After:
1544627266

Edited 1544628746
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Good tip, Ziechael. I use that to search the forums all the time, but didn't realize it wasn't in here. You can also fine tune it even tighter: site:app.roll20.net/forum/ &nbsp;will restrict your results to forum only, ignoring the rest of the site. site:marketplace.roll20.net &nbsp;will only return marketplace images, very useful in conjunction with a google image search for finding that perfect image. Clicking on the visit button will take you to the marketplace page in question. site:wiki.roll20.net &nbsp;will of course help you search the wiki more thoroughly. No slight on Roll20's built-in searching, but realistically, this is Google's primary super power. Just remember that capitalization is important. " site: " works, but " Site: " does not.
Also, if you want a specific string of words such as "Curse of Strahd" you can search it either as "Curse" "of" "Strahd" Which will force all results to include Curse, of, &amp; Strahd in any order somewhere within each result, or you can just search "Curse of Strahd" Which will force each result to explicitly return exactly Curse of Strahd, in that order, with no words in between. Another useful trick would be to subtract results "Curse of Strahd" -Phandelver You will not only get exclusively Curse of Strahd results, but there will be zero mention of Phandelver (looking at you Lost Mines of Phandelver). Google tries to train their Search Engine to understand human questions, but it is still best to understand that it responds best to questions built in a way that a Robot understands (in this case a "Spider Bot"), especially if you think about it in a way that a Robot would see a Human's entry, that usually returns you the best results. Another thing to note: leave out the punctuation in your search unless it is a part of the quoted search, question marks are a type of Wildcard.
1548865224

Edited 1548866848
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Precautions to Take With Very Large Maps The Roll20 site will warn you of potential problems when you are going to create a very large map. Unless the map has a lot of dynamic lighting features or a ton of placed images, it's usually not a problem. However, occasionally a very large and complex map can keep your site from loading. Every time you try to enter the game, it locks up, trying to load that big map. If you could load on a different page, you could at least get into the game so that you could delete the troublemaker but you are locked out. There are two things you can do to prevent this problem: 1) Always exit on your Landing Page . Assuming this is not also a huge map, this will ensure that you can always get into the game. If you have trouble loading the problem page, you can delete it from the landing page. and/or 2) Always leave the Player Ribbon on a safe page. If you have trouble entering the game, you can give a Dummy Account access to the game and promote it to GM status. The Dummy Account will initially enter the game wherever the player ribbon is, and can delete that troublesome page. See subsequent posts for more info.
1548866008
Scott C.
Forum Champion
Sheet Author
API Scripter
Compendium Curator
I'll add an addendum to that Keith. You could make the dummy account ahead of time and then separate it from the party so that it is always on your safe page regardless of what happens to the other users in the game.
1548866170
The Aaron
Roll20 Production Team
API Scripter
Also, if you're a pro subscriber and can't get on to change the player ribbon, it could be done in an API script.
1548866798
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
The Aaron said: Also, if you're a pro subscriber and can't get on to change the player ribbon, it could be done in an API script. How would that work? Wouldn't you have to log in to the game in order for the Sandbox to spin up? (I never realized how mixed that metaphor is).
1548868841
The Aaron
Roll20 Production Team
API Scripter
You could add a script that would change the ribbon, then invite a new account and log in with it, which would cause it to spin up and move then, then promote them to GM.
I guess the API was stronger than I thought ('^_^)
1550160130

Edited 1550164940
Example of Structured Abilities: The XP Macro It's a couple years old, but this XP calculation macro setup I created for the 5e OGL sheet is still being used by myself every day. I thought I would share it again. XP Calc Macro .&nbsp; I have since simplified the number of enemies selection macro, the below version looks prettier. XP-#Enemies /w gm&nbsp; &amp;{template:npcaction} {{rname=XP Calc}} {{name=Enemies}} {{description=Select number defeated [1](~Macros|XP-1) [2](~Macros|XP-2) [3](~Macros|XP-3) [4](~Macros|XP-4) [5](~Macros|XP-5) [6](~Macros|XP-6) [7](~Macros|XP-7) [8](~Macros|XP-8) [9](~Macros|XP-9) [10](~Macros|XP-10) [11](~Macros|XP-11) [12](~Macros|XP-12) [13](~Macros|XP-13) [14](~Macros|XP-14) [15](~Macros|XP-15)&nbsp; }} Happy Gaming!
1550161314

Edited 1550161359
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
I normally don't index macro examples or code snippets, this being more about clever or innovative use of the Roll20 interface and tools. But your linked post is an excellent example of building a structured macro/ability, which is something that is not really explored in the wiki. I'm going to list it as Example of Structured Abilities: The XP Macro. If you agree, feel free to edit that in as a title to your post, with Header 3 style. It just makes it easier for folks to find useful info.&nbsp;