Character Vault
Any Concept / Any System
Compendium
Your System Come To Life
Roll20 for Android
Streamlined for your Tablet
Roll20 for iPad
Streamlined for your Tablet

Personal tools

Difference between revisions of "API:Short Community Scripts"

From Roll20 Wiki

Jump to: navigation, search
(Created page with "{{revdate}}{{pro only|page}} {{main|API:Script Index}} This is a collection of shorter API scripts and snippets created the community, which haven't ended up in the one-click...")
 
(add a few)
Line 8: Line 8:
  
 
__TOC__
 
__TOC__
==Make Rollable Table Tokens==
+
 
 +
==Token==
 +
 
 +
===Make Rollable Table Tokens===
 
{{fpl|10417631/ !make-rtt}} by [[Aaron]]
 
{{fpl|10417631/ !make-rtt}} by [[Aaron]]
  
Line 115: Line 118:
 
});
 
});
 
</pre>
 
</pre>
 +
 +
===Show Tooltip===
 +
{{fpl|10422291/ Showtooltip}} by [[Aaron]]
 +
 +
Shows [[Token Tooltip]] of selected tokens in the chat.
 +
 +
<pre style="overflow:auto;white-space:pre-wrap;">!show-tip //show in chat to all
 +
!wshow-tip  //whisper to self</pre>
 +
 +
 +
<pre style="overflow:auto;white-space:pre-wrap;" data-language="javascript">on('ready',()=>{
 +
 +
 +
  const s = {
 +
    container: `display:inline-block;border:1px solid #999;border-radius:.2em; padding: .1em;background-color:white;width:100%;`,
 +
    img: `max-width: 5em;max-height:5em;display:block;overflow:auto;background-color:transparent;float:left;margin:.5em;`,
 +
    quote: `font-weight: bold;font-style:italic;padding:.3em;`,
 +
    clear: `clear:both;`
 +
  };
 +
  const f = {
 +
    container: (d,q) => `<div style="${s.container}">${d}${q}${f.clear()}</div>`,
 +
    item: (d)=>`<img src="${d}" style="${s.img}">`,
 +
    quote: (q)=>q?`<div style="${s.quote}">${q}</div>`:'',
 +
    clear: () => `<div style="${s.clear}"></div>`
 +
  };
 +
 +
  on('chat:message',msg=>{
 +
    if('api'===msg.type && /^![w]?show-tip(\b\s|$)/i.test(msg.content) && playerIsGM(msg.playerid)){
 +
      let who = (getObj('player',msg.playerid)||{get:()=>'API'}).get('_displayname');
 +
      let whisper = /^!w/i.test(msg.content);
 +
      let msgs = (msg.selected || [])
 +
        .map(o=>getObj('graphic',o._id))
 +
        .filter(g=>undefined !== g)
 +
        .filter(g=>0 !== g.get('tooltip').length)
 +
        .map(t=>f.container(f.item(t.get('imgsrc')),f.quote(t.get('tooltip'))))
 +
        ;
 +
      if(msgs){
 +
        sendChat('',`${whisper ? `/w "${who}" `: ''}${msgs.join('')}`);
 +
      }
 +
    }
 +
  });
 +
});
 +
</pre>
 +
 +
 +
===DropTorch===
 +
{{fpl|8428606/ DropTorch}}, A little script that lets you and your players drop their light source on the ground.
 +
 +
===RetrieveTokens===
 +
{{fpl|8001191/ RetrieveTokens}} -- get graphics that are off the page
 +
 +
==Map==
 +
 +
===ToggleDaylight===
 +
{{fpl|9719344/ ToggleDaylight}} turn daylight mode on, off, or toggle it for LDL or UDL on the current page.
 +
 +
  
  

Revision as of 14:55, 11 October 2021

Main Page: API:Script Index

This is a collection of shorter API scripts and snippets created the community, which haven't ended up in the one-click menu for for being so situational or small.


Contents


Token

Make Rollable Table Tokens

!make-rtt(Forum) by Aaron

Little script for making Rollable Table Tokens. Just select a bunch of graphics on the page and run:

!make-rtt

and it will zip them up in a Rollable Table Token. it sorts them in order from top to bottom, left to right. If any graphics are from the marketplace, it will put the dead X on them and not include them. It places the new token at the lop left of the tokens (or at (0,0 if you have some bizzare selected tokens that are somewhat off screen..)


on('ready',()=>{

  const s = {
    err: "padding: 1px 1em; size:.8em; font-weight:bold; background: #cccccc; border:2px solid black; border-radius:1em; color: #990000;"
  };

  const getCleanImgsrc = (imgsrc) => {
    let parts = imgsrc.match(/(.*\/images\/.*)(thumb|med|original|max)([^?]*)(\?[^?]+)?$/);
    if(parts) {
      return parts[1]+'thumb'+parts[3]+(parts[4]?parts[4]:`?${Math.round(Math.random()*9999999)}`);
    }
    return;
  };


  const positionalSorter = (a,b) => {
    let at = Math.round((a.get('top')+17)/35);
    let bt = Math.round((b.get('top')+17)/35);
    let al = Math.round((a.get('left')+17)/35);
    let bl = Math.round((b.get('left')+17)/35);
    let abt = at-bt;
    let abl = al-bl;
    return (0 === abt ? abl : abt);
  };

  const findTraits = (b) => (o) => {
    let x = parseFloat(o.get('left'));
    let y = parseFloat(o.get('top'));
    let w = parseFloat(o.get('width'));
    let h = parseFloat(o.get('height'));
    b.minX = Math.min(b.minX,x-(w/2));
    b.minY = Math.min(b.minY,y-(h/2));
    b.maxX = Math.max(b.minX,x+(w/2));
    b.maxY = Math.max(b.minY,y+(h/2));
    b.layer = o.get('layer');
    b.pageid = o.get('pageid');
    return o;
  };

  on('chat:message',msg=>{
    if('api'===msg.type && /^!make-rtt(\b\s|$)/i.test(msg.content) && playerIsGM(msg.playerid)){
      let who = (getObj('player',msg.playerid)||{get:()=>'API'}).get('_displayname');

      let traits = {
        minX: Number.MAX_SAFE_INTEGER,
        minY: Number.MAX_SAFE_INTEGER,
        maxX: -Number.MAX_SAFE_INTEGER,
        maxY: -Number.MAX_SAFE_INTEGER,
        layer: 'objects',
        pageid: ''
      };


      if(0===(msg.selected||[].length)){
          sendChat('',`/w "${who}" <div style="${s.err}">Please selected some tokens.</div>`);
          return;
      }

      let images = (msg.selected || [])
        .map(o=>getObj('graphic',o._id))
        .filter(g=>undefined !== g)
        .sort(positionalSorter)
        .map(findTraits(traits))
        .reduce((m,g)=>{
          let i = getCleanImgsrc(g.get('imgsrc'));
          if(i){
            m.push(i);
          } else {
            g.set('status_dead',true);
          }
          return m;
        },[])
        ;

        if(images.length){
          let token = createObj('graphic',{
            pageid: traits.pageid,
            layer: traits.layer,
            left: traits.minX||0,
            top: traits.minY||0,
            width: 70,
            height: 70,
            imgsrc: images[0],
            sides: images.map(encodeURIComponent).join('|')
          });
          if(token){
            toFront(token);
          } else {
            sendChat('',`/w "${who}" <div style="${s.err}">Failed to create token!</div>`);
          }
          
        } else {
          sendChat('',`/w "${who}" <div style="${s.err}">Only marketplace images found!</div>`);
        }
    }
  });
});

Show Tooltip

Showtooltip(Forum) by Aaron

Shows Token Tooltip of selected tokens in the chat.

!show-tip //show in chat to all
!wshow-tip   //whisper to self


on('ready',()=>{


  const s = {
    container: `display:inline-block;border:1px solid #999;border-radius:.2em; padding: .1em;background-color:white;width:100%;`,
    img: `max-width: 5em;max-height:5em;display:block;overflow:auto;background-color:transparent;float:left;margin:.5em;`,
    quote: `font-weight: bold;font-style:italic;padding:.3em;`,
    clear: `clear:both;`
  };
  const f = {
    container: (d,q) => `<div style="${s.container}">${d}${q}${f.clear()}</div>`,
    item: (d)=>`<img src="${d}" style="${s.img}">`,
    quote: (q)=>q?`<div style="${s.quote}">${q}</div>`:'',
    clear: () => `<div style="${s.clear}"></div>`
  };

  on('chat:message',msg=>{
    if('api'===msg.type && /^![w]?show-tip(\b\s|$)/i.test(msg.content) && playerIsGM(msg.playerid)){
      let who = (getObj('player',msg.playerid)||{get:()=>'API'}).get('_displayname');
      let whisper = /^!w/i.test(msg.content);
      let msgs = (msg.selected || [])
        .map(o=>getObj('graphic',o._id))
        .filter(g=>undefined !== g)
        .filter(g=>0 !== g.get('tooltip').length)
        .map(t=>f.container(f.item(t.get('imgsrc')),f.quote(t.get('tooltip'))))
        ;
      if(msgs){
        sendChat('',`${whisper ? `/w "${who}" `: ''}${msgs.join('')}`);
      }
    }
  });
});


DropTorch

DropTorch(Forum), A little script that lets you and your players drop their light source on the ground.

RetrieveTokens

RetrieveTokens(Forum) -- get graphics that are off the page

Map

ToggleDaylight

ToggleDaylight(Forum) turn daylight mode on, off, or toggle it for LDL or UDL on the current page.



Other Community APIs