Created
March 31, 2018 19:44
-
-
Save shdwjk/385fa663f498e1ddefdcecad9a5a047f to your computer and use it in GitHub Desktop.
DXWarlock's HealthColors Script -- with TokenMod Support
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* global createObj TokenMod spawnFxWithDefinition getObj state playerIsGM sendChat _ findObjs log on*/ | |
/* | |
My Profile link: https://app.roll20.net/users/262130/dxwarlock | |
GIT link: https://github.com/dxwarlock/Roll20/blob/master/Public/HeathColors | |
Roll20Link: https://app.roll20.net/forum/post/4630083/script-aura-slash-tint-healthcolor | |
*/ | |
/*jshint bitwise: false*/ | |
var HealthColors = HealthColors || (function () { | |
'use strict'; | |
var version = '1.5.1', | |
ScriptName = "HealthColors", | |
schemaVersion = '1.0.3', | |
Updated = "April 6 2017", | |
/*------------------------ | |
ON TOKEN CHANGE/CREATE | |
------------------------*/ | |
handleToken = function (obj, prev, update) { | |
//CHECK IF TRIGGERED------------ | |
if(state.HealthColors.auraColorOn !== true || obj.get("layer") !== "objects") return; | |
if(obj.get("represents") !== "" || (obj.get("represents") === "" && state.HealthColors.OneOff === true)) { | |
if(obj.get('imgsrc').match(/files.d20.io\/images\/4277467\/iQYjFOsYC5JsuOPUCI9RGA\//)) return; | |
//**CHECK BARS------------// | |
var barUsed = state.HealthColors.auraBar; | |
var maxValue, curValue, prevValue; | |
if(obj.get(barUsed + "_max") !== "" || obj.get(barUsed + "_value") !== "") { | |
maxValue = parseInt(obj.get(barUsed + "_max"), 10); | |
curValue = parseInt(obj.get(barUsed + "_value"), 10); | |
prevValue = prev[barUsed + "_value"]; | |
} | |
if(isNaN(maxValue) || isNaN(curValue) || isNaN(prevValue)) return; | |
//CALC PERCENTAGE------------ | |
var percReal = Math.round((curValue / maxValue) * 100); | |
var markerColor = PercentToHEX(percReal); | |
//DEFINE VARIABLES--- | |
var pColor = '#ffffff'; | |
var GM = '',PC = ''; | |
var IsTypeOn, PercentOn, ShowDead, UseAura; | |
//**CHECK MONSTER OR PLAYER------------// | |
var oCharacter = getObj('character', obj.get("_represents")); | |
var type = (oCharacter === undefined || oCharacter.get("controlledby") === "") ? 'Monster' : 'Player'; | |
var colortype = (state.HealthColors.auraTint) ? 'tint' : 'aura1'; | |
//IF PLAYER------------ | |
if(type == 'Player') { | |
GM = state.HealthColors.GM_PCNames; | |
PC = state.HealthColors.PCNames; | |
IsTypeOn =state.HealthColors.PCAura; | |
PercentOn = state.HealthColors.auraPercPC; | |
ShowDead = state.HealthColors.auraDeadPC; | |
var cBy = oCharacter.get('controlledby'); | |
var player = getObj('player', cBy); | |
pColor = '#000000'; | |
if(player !== undefined) pColor = player.get('color'); | |
} | |
//IF MONSTER------------ | |
else if(type == 'Monster') { | |
GM = state.HealthColors.GM_NPCNames; | |
PC = state.HealthColors.NPCNames; | |
IsTypeOn =state.HealthColors.NPCAura; | |
PercentOn = state.HealthColors.auraPerc; | |
ShowDead = state.HealthColors.auraDead; | |
} | |
else return; | |
//CHECK DISABLED AURA/TINT ATTRIB------------ | |
if(oCharacter !== undefined) { | |
UseAura = lookupUseColor(oCharacter); | |
} | |
//SET HEALTH COLOR---------- | |
if(IsTypeOn && UseAura !== "NO") { | |
percReal = Math.min(percReal, 100); | |
if(percReal > PercentOn || curValue === 0) SetAuraNone(obj); | |
else TokenSet(obj, state.HealthColors.AuraSize, markerColor, pColor, update); | |
//SHOW DEAD---------- | |
if(ShowDead === true) { | |
if(curValue > 0) obj.set("status_dead", false); | |
else if(curValue < 1) { | |
var DeadSounds = state.HealthColors.auraDeadFX; | |
if(DeadSounds !== "None" && curValue != prevValue) PlayDeath(DeadSounds); | |
obj.set("status_dead", true); | |
SetAuraNone(obj); | |
} | |
} | |
} | |
else if((!IsTypeOn || UseAura === "NO") && obj.get(colortype + '_color') === markerColor) SetAuraNone(obj); | |
//SET SHOW NAMES------------ | |
SetShowNames(GM,PC,obj); | |
//**SPURT FX------------// | |
if(curValue != prevValue && prevValue != "" && update !== "YES") { | |
//CHECK BLOOD ATTRIB------------ | |
var UseBlood; | |
if(oCharacter !== undefined) { | |
UseBlood = lookupUseBlood(oCharacter); | |
} | |
if(state.HealthColors.FX === true && obj.get("layer") == "objects" && (UseBlood !== "OFF" || UseBlood !== "NO")) { | |
var HurtColor, HealColor, FX, aFX, FXArray = []; | |
var amount = Math.abs(curValue - prevValue); | |
var HitSizeCalc = Math.min((amount / maxValue) * 4, 1); | |
var Scale = obj.get("height") / 70; | |
var HitSize = Math.max(HitSizeCalc, 0.2) * (_.random(60, 100) / 100); | |
//IF HEALED------------ | |
if(curValue > prevValue) { | |
aFX = findObjs({_type: "custfx",name: '-DefaultHeal'}, {caseInsensitive: true})[0]; | |
FX = aFX.get("definition"); | |
HealColor = HEXtoRGB(state.HealthColors.HealFX); | |
FX.startColour = HealColor; | |
FXArray.push(FX); | |
} | |
//IF HURT------------ | |
else if(curValue < prevValue) { | |
aFX = findObjs({_type: "custfx",name: '-DefaultHurt'}, {caseInsensitive: true})[0]; | |
if(aFX) FX = aFX.get("definition"); | |
//CHECK DEFAULT COLOR-- | |
if(UseBlood === "DEFAULT" || UseBlood === undefined) { | |
HurtColor = HEXtoRGB(state.HealthColors.HurtFX); | |
FX.startColour = HurtColor; | |
FXArray.push(FX); | |
} | |
//ELSE CHECK CUSTOM COLOR/FX-- | |
else if(UseBlood !== "DEFAULT" && UseBlood !== undefined) { | |
HurtColor = HEXtoRGB(UseBlood); | |
//IF CUSTOM COLOR-- | |
if(_.difference(HurtColor, [0, 0, 0, 0]).length !== 0) { | |
FX.startColour = HurtColor; | |
FXArray.push(FX); | |
} | |
//ELSE ASSUME CUSTOM FX-- | |
else { | |
var i = UseBlood.split(/,/); | |
_.each(i, function (FXname) { | |
aFX = findObjs({_type: "custfx",name: FXname}, {caseInsensitive: true})[0]; | |
if(aFX) FXArray.push(aFX.get("definition")); | |
else GMW("No FX with name " + FXname); | |
}); | |
} | |
} | |
} | |
else return; | |
//SPAWN FX------------ | |
_.each(FXArray, function (FX) { | |
SpawnFX(Scale, HitSize, obj.get("left"), obj.get("top"), FX, obj.get("_pageid")); | |
}); | |
} | |
} | |
} | |
}, | |
/*------------------------ | |
CHAT MESSAGES | |
------------------------*/ | |
handleInput = function (msg) { | |
var msgFormula = msg.content.split(/\s+/); | |
var command = msgFormula[0].toUpperCase(), UPPER =""; | |
if(msg.type == "api" && command.indexOf("!AURA") !== -1) { | |
var OPTION = msgFormula[1] || "MENU"; | |
if(!playerIsGM(msg.playerid)) { | |
sendChat('HealthColors', "/w " + msg.who + " you must be a GM to use this command!"); | |
return; | |
} | |
else { | |
if(OPTION !== "MENU") GMW("UPDATING TOKENS..."); | |
switch(OPTION.toUpperCase()) { | |
case "MENU": | |
break; | |
case "ON": | |
state.HealthColors.auraColorOn = !state.HealthColors.auraColorOn; | |
break; | |
case "BAR": | |
state.HealthColors.auraBar = "bar" + msgFormula[2]; | |
break; | |
case "TINT": | |
state.HealthColors.auraTint = !state.HealthColors.auraTint; | |
break; | |
case "PERC": | |
state.HealthColors.auraPercPC = parseInt(msgFormula[2], 10); | |
state.HealthColors.auraPerc = parseInt(msgFormula[3], 10); | |
break; | |
case "PC": | |
state.HealthColors.PCAura = !state.HealthColors.PCAura; | |
break; | |
case "NPC": | |
state.HealthColors.NPCAura = !state.HealthColors.NPCAura; | |
break; | |
case "GMNPC": | |
state.HealthColors.GM_NPCNames = msgFormula[2]; | |
break; | |
case "GMPC": | |
state.HealthColors.GM_PCNames = msgFormula[2]; | |
break; | |
case "PCNPC": | |
state.HealthColors.NPCNames = msgFormula[2]; | |
break; | |
case "PCPC": | |
state.HealthColors.PCNames = msgFormula[2]; | |
break; | |
case "DEAD": | |
state.HealthColors.auraDead = !state.HealthColors.auraDead; | |
break; | |
case "DEADPC": | |
state.HealthColors.auraDeadPC = !state.HealthColors.auraDeadPC; | |
break; | |
case "DEADFX": | |
state.HealthColors.auraDeadFX = msgFormula[2]; | |
break; | |
case "SIZE": | |
state.HealthColors.AuraSize = parseFloat(msgFormula[2]); | |
break; | |
case "ONEOFF": | |
state.HealthColors.OneOff = !state.HealthColors.OneOff; | |
break; | |
case "FX": | |
state.HealthColors.FX = !state.HealthColors.FX; | |
break; | |
case "HEAL": | |
UPPER = msgFormula[2]; | |
UPPER = UPPER.toUpperCase(); | |
state.HealthColors.HealFX = UPPER; | |
break; | |
case "HURT": | |
UPPER = msgFormula[2]; | |
UPPER = UPPER.toUpperCase(); | |
state.HealthColors.HurtFX = UPPER; | |
break; | |
case "RESET": | |
delete state.HealthColors; | |
GMW("STATE RESET"); | |
checkInstall(); | |
break; | |
case "UPDATE": | |
manUpdate(msg); | |
return; | |
} | |
aurahelp(OPTION); | |
} | |
} | |
}, | |
/*------------------------ | |
"FUNCTIONS" | |
------------------------*/ | |
//SET TOKEN COLORS------------ | |
TokenSet = function (obj, sizeSet, markerColor, pColor, update) { | |
var Pageon = getObj("page", obj.get("_pageid")); | |
var scale = Pageon.get("scale_number") / 10; | |
if(state.HealthColors.auraTint === true) { | |
if(obj.get('aura1_color') == markerColor && update === "YES") { | |
obj.set({'aura1_color': "transparent",'aura2_color': "transparent",}); | |
} | |
obj.set({'tint_color': markerColor,}); | |
} | |
else { | |
if(obj.get('tint_color') == markerColor && update === "YES") { | |
obj.set({'tint_color': "transparent",}); | |
} | |
obj.set({ | |
'aura1_radius': sizeSet * scale * 1.8, | |
'aura2_radius': sizeSet * scale * 0.1, | |
'aura1_color': markerColor, | |
'aura2_color': pColor, | |
'showplayers_aura1': true, | |
'showplayers_aura2': true, | |
}); | |
} | |
}, | |
//REMOVE ALL------------ | |
SetAuraNone = function (obj) { | |
if(state.HealthColors.auraTint === true) obj.set({'tint_color': "transparent",}); | |
else obj.set({'aura1_color': "transparent",'aura2_color': "transparent",}); | |
}, | |
//FORCE ALL TOKEN UPDATE------------ | |
MenuForceUpdate = function(){ | |
var i = 0; | |
var start = new Date().getTime(); | |
var barUsed = state.HealthColors.auraBar; | |
_.chain(findObjs({type: 'graphic',subtype: 'token',layer: 'objects'})) | |
.filter((o)=>o.get(barUsed + "_max") !== "" && o.get(barUsed + "_value") !== "") | |
.each(function(obj) { | |
var prev = JSON.parse(JSON.stringify(obj)); | |
handleToken(obj, prev, 'YES'); | |
i++; | |
}); | |
var end = new Date().getTime(); | |
return "Tokens Processed: " + i + "<br>Run time in ms: " + (end - start); | |
}, | |
SetShowNames = function(GM,PC,obj) { | |
if(GM != 'Off' && GM != '') { | |
GM = (GM == "Yes") ? true : false; | |
obj.set({'showname': GM}); | |
} | |
if(PC != 'Off' && PC != '') { | |
PC = (PC == "Yes") ? true : false; | |
obj.set({'showplayers_name': PC}); | |
} | |
}, | |
//MANUAL UPDATE------------ | |
manUpdate = function(msg){ | |
var selected = msg.selected; | |
var allNames = ''; | |
_.each(selected, function(obj) { | |
var token = getObj('graphic', obj._id); | |
var tName = token.get("name"); | |
allNames = allNames.concat(tName+'<br>'); | |
var prev = JSON.parse(JSON.stringify(token)); | |
handleToken(token, prev, "YES"); | |
}); | |
GMW(allNames); | |
}, | |
//ATTRIBUTE CACHE------------ | |
makeSmartAttrCache = function (attribute, options) { | |
let cache = {}, | |
defaultValue = options.default || 'YES', | |
validator = options.validation || _.constant(true); | |
on('change:attribute', function (attr) { | |
if(attr.get('name') === attribute) { | |
if(!validator(attr.get('current'))) { | |
attr.set('current', defaultValue); | |
} | |
cache[attr.get('characterid')] = attr.get('current'); | |
var tokens = findObjs({type: 'graphic'}).filter((o) => o.get('represents') === attr.get("characterid")); | |
_.each(tokens, function (obj) { | |
var prev = JSON.parse(JSON.stringify(obj)); | |
handleToken(obj, prev, "YES"); | |
}); | |
} | |
}); | |
on('destroy:attribute', function (attr) { | |
if(attr.get('name') === attribute) { | |
delete cache[attr.get('characterid')]; | |
} | |
}); | |
return function(character){ | |
let attr = findObjs({type: 'attribute',name: attribute,characterid: character.id},{caseInsensitive:true})[0] || | |
createObj('attribute',{name: attribute,characterid: character.id, current: defaultValue}); | |
if(!cache[character.id] || cache[character.id] !== attr.get('current')){ | |
if(!validator(attr.get('current'))){ | |
attr.set('current',defaultValue); | |
} | |
cache[character.id]=attr.get('current'); | |
} | |
return cache[character.id]; | |
}; | |
}, | |
lookupUseBlood = makeSmartAttrCache('USEBLOOD',{ | |
default: 'DEFAULT' | |
}), | |
lookupUseColor = makeSmartAttrCache('USECOLOR',{ | |
default: 'YES', | |
validation: (o)=>o.match(/YES|NO/) | |
}), | |
//DEATH SOUND------------ | |
PlayDeath = function (trackname) { | |
var RandTrackName; | |
if(trackname.indexOf(",") > 0) { | |
var tracklist = trackname.split(","); | |
RandTrackName = tracklist[Math.floor(Math.random() * tracklist.length)]; | |
} | |
else RandTrackName = trackname; | |
var track = findObjs({type: 'jukeboxtrack',title: RandTrackName})[0]; | |
if(track) { | |
track.set('playing', false); | |
track.set('softstop', false); | |
track.set('volume', 50); | |
track.set('playing', true); | |
} | |
else { | |
log(ScriptName + ": No track found named " + RandTrackName); | |
} | |
}, | |
//PERC TO RGB------------ | |
PercentToHEX = function (percent) { | |
var HEX; | |
if(percent > 100) HEX = "#0000FF"; | |
else { | |
if(percent === 100) percent = 99; | |
var r, g, b = 0; | |
if(percent < 50) { | |
g = Math.floor(255 * (percent / 50)); | |
r = 255; | |
} | |
else { | |
g = 255; | |
r = Math.floor(255 * ((50 - percent % 50) / 50)); | |
} | |
HEX = "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1); | |
} | |
return HEX; | |
}, | |
//HEX TO RGB------------ | |
HEXtoRGB = function (hex) { | |
let parts = (hex || '').match(/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/); | |
if(parts) { | |
let rgb = _.chain(parts).rest().map((d) => parseInt(d, 16)).value(); | |
rgb.push(1.0); | |
return rgb; | |
} | |
return [0, 0, 0, 0.0]; | |
}, | |
//SPAWN FX------------ | |
SpawnFX = function (Scale,HitSize,left,top,FX,pageid) { | |
_.defaults(FX, { | |
"maxParticles": 100, | |
"duration": 100, | |
"size": 100, | |
"sizeRandom": 100, | |
"lifeSpan": 100, | |
"lifeSpanRandom": 100, | |
"speed": 0, | |
"speedRandom": 0, | |
"angle": 0, | |
"angleRandom": 0, | |
"emissionRate": 100, | |
"startColour": [255,255,255,1], | |
"endColour": [0,0,0,1], | |
"gravity": {"x": 0,"y": 0.0}, | |
}); | |
var newFX = { | |
"maxParticles": FX.maxParticles * HitSize, | |
"duration": FX.duration * HitSize, | |
"size": FX.size * Scale / 2, | |
"sizeRandom": FX.sizeRandom * Scale / 2, | |
"lifeSpan": FX.lifeSpan, | |
"lifeSpanRandom": FX.lifeSpanRandom, | |
"speed": FX.speed * Scale, | |
"speedRandom": FX.speedRandom * Scale, | |
"angle": FX.angle, | |
"angleRandom": FX.angleRandom, | |
"emissionRate": FX.emissionRate * HitSize * 2, | |
"startColour": FX.startColour, | |
"endColour": FX.endColour, | |
"gravity": {"x": FX.gravity.x * Scale,"y": FX.gravity.y * Scale}, | |
}; | |
spawnFxWithDefinition(left,top,newFX,pageid); | |
}, | |
//HELP MENU------------ | |
aurahelp = function (OPTION) { | |
var Update = ''; | |
if(OPTION !== "MENU") Update = MenuForceUpdate(); | |
var img = "background-image: -webkit-linear-gradient(left, #76ADD6 0%, #a7c7dc 100%);"; | |
var tshadow = "-1px -1px #000, 1px -1px #000, -1px 1px #000, 1px 1px #000 , 2px 2px #222;"; | |
var style = 'style="padding-top: 1px; text-align:center; font-size: 9pt; width: 48px; height: 14px; border: 1px solid black; margin: 1px; background-color: #6FAEC7;border-radius: 4px; box-shadow: 1px 1px 1px #707070;'; | |
var off = "#A84D4D"; | |
var disable = "#D6D6D6"; | |
var HR = "<hr style='background-color: #000000; margin: 5px; border-width:0;color: #000000;height: 1px;'/>"; | |
var FX = state.HealthColors.auraDeadFX.substring(0, 4); | |
sendChat('HealthColors', "/w GM <b><br>" + '<div style="border-radius: 8px 8px 8px 8px; padding: 5px; font-size: 9pt; text-shadow: ' + tshadow + '; box-shadow: 3px 3px 1px #707070; ' + img + ' color:#FFF; border:2px solid black; text-align:right; vertical-align:middle;">' + '<u><big>HealthColors Version: ' + version + '</u></big><br>' + //-- | |
HR + //-- | |
'Is On: <a ' + style + 'background-color:' + (state.HealthColors.auraColorOn !== true ? off : "") + ';" href="!aura on">' + (state.HealthColors.auraColorOn !== true ? "No" : "Yes") + '</a><br>' + //-- | |
'Bar: <a ' + style + '" href="!aura bar ?{Bar|1|2|3}">' + state.HealthColors.auraBar + '</a><br>' + //-- | |
'Use Tint: <a ' + style + 'background-color:' + (state.HealthColors.auraTint !== true ? off : "") + ';" href="!aura tint">' + (state.HealthColors.auraTint !== true ? "No" : "Yes") + '</a><br>' + //-- | |
'Percentage(PC/NPC): <a ' + style + '" href="!aura perc ?{PCPercent?|100} ?{NPCPercent?|100}">' + state.HealthColors.auraPercPC + '/'+ state.HealthColors.auraPerc +'</a><br>' + //-- | |
HR + //-- | |
'Show PC Health: <a ' + style + 'background-color:' + (state.HealthColors.PCAura !== true ? off : "") + ';" href="!aura pc">' + (state.HealthColors.PCAura !== true ? "No" : "Yes") + '</a><br>' + //-- | |
'Show NPC Health: <a ' + style + 'background-color:' + (state.HealthColors.NPCAura !== true ? off : "") + ';" href="!aura npc">' + (state.HealthColors.NPCAura !== true ? "No" : "Yes") + '</a><br>' + //-- | |
'Show Dead PC: <a ' + style + 'background-color:' + (state.HealthColors.auraDeadPC !== true ? off : "") + ';" href="!aura deadPC">' + (state.HealthColors.auraDeadPC !== true ? "No" : "Yes") + '</a><br>' + //-- | |
'Show Dead NPC: <a ' + style + 'background-color:' + (state.HealthColors.auraDead !== true ? off : "") + ';" href="!aura dead">' + (state.HealthColors.auraDead !== true ? "No" : "Yes") + '</a><br>' + //-- | |
HR + //-- | |
'GM Sees all PC Names: <a ' + style + 'background-color:' + ButtonColor(state.HealthColors.GM_PCNames, off, disable) + ';" href="!aura gmpc ?{Setting|Yes|No|Off}">' + state.HealthColors.GM_PCNames + '</a><br>' + //-- | |
'GM Sees all NPC Names: <a ' + style + 'background-color:' + ButtonColor(state.HealthColors.GM_NPCNames, off, disable) + ';" href="!aura gmnpc ?{Setting|Yes|No|Off}">' + state.HealthColors.GM_NPCNames + '</a><br>' + //--- | |
HR + //-- | |
'PC Sees all PC Names: <a ' + style + 'background-color:' + ButtonColor(state.HealthColors.PCNames, off, disable) + ';" href="!aura pcpc ?{Setting|Yes|No|Off}">' + state.HealthColors.PCNames + '</a><br>' + //-- | |
'PC Sees all NPC Names: <a ' + style + 'background-color:' + ButtonColor(state.HealthColors.NPCNames, off, disable) + ';" href="!aura pcnpc ?{Setting|Yes|No|Off}">' + state.HealthColors.NPCNames + '</a><br>' + //-- | |
HR + //-- | |
'Aura Size: <a ' + style + '" href="!aura size ?{Size?|0.7}">' + state.HealthColors.AuraSize + '</a><br>' + //-- | |
'One Offs: <a ' + style + 'background-color:' + (state.HealthColors.OneOff !== true ? off : "") + ';" href="!aura ONEOFF">' + (state.HealthColors.OneOff !== true ? "No" : "Yes") + '</a><br>' + //-- | |
'FX: <a ' + style + 'background-color:' + (state.HealthColors.FX !== true ? off : "") + ';" href="!aura FX">' + (state.HealthColors.FX !== true ? "No" : "Yes") + '</a><br>' + //-- | |
'HealFX Color: <a ' + style + 'background-color:#' + state.HealthColors.HealFX + ';""href="!aura HEAL ?{Color?|00FF00}">' + state.HealthColors.HealFX + '</a><br>' + //-- | |
'HurtFX Color: <a ' + style + 'background-color:#' + state.HealthColors.HurtFX + ';""href="!aura HURT ?{Color?|FF0000}">' + state.HealthColors.HurtFX + '</a><br>' + //-- | |
'DeathSFX: <a ' + style + '" href="!aura deadfx ?{Sound Name?|' + state.HealthColors.auraDeadFX + '}">' + FX + '</a><br>' + //-- | |
HR + //-- | |
Update +//-- | |
'</div>'); | |
}, | |
//OFF BUTTON COLORS------------ | |
ButtonColor = function (state, off, disable) { | |
var color; | |
if(state == "No") color = off; | |
if(state == "Off") color = disable; | |
return color; | |
}, | |
//CHECK INSTALL & SET STATE------------ | |
checkInstall = function () { | |
log('-=>' + ScriptName + ' v' + version + ' [Updated: ' + Updated + ']<=-'); | |
if(!_.has(state, 'HealthColors') || state.HealthColors.schemaVersion !== schemaVersion) { | |
log('<' + ScriptName + ' Updating Schema to v' + schemaVersion + '>'); | |
state.HealthColors = {schemaVersion: schemaVersion}; | |
state.HealthColors.version = version; | |
} | |
//CHECK STATE VALUES | |
if(_.isUndefined(state.HealthColors.auraColorOn)) state.HealthColors.auraColorOn = true; //global on or off | |
if(_.isUndefined(state.HealthColors.auraBar)) state.HealthColors.auraBar = "bar1"; //bar to use | |
if(_.isUndefined(state.HealthColors.auraTint)) state.HealthColors.auraTint = false; //use tint instead? | |
if(_.isUndefined(state.HealthColors.auraPercPC)) state.HealthColors.auraPercPC = 100; //precent to start showing PC | |
if(_.isUndefined(state.HealthColors.auraPerc)) state.HealthColors.auraPerc = 100; //precent to start showing NPC | |
//----------------- | |
if(_.isUndefined(state.HealthColors.PCAura)) state.HealthColors.PCAura = true; //show players Health? | |
if(_.isUndefined(state.HealthColors.NPCAura)) state.HealthColors.NPCAura = true; //show NPC Health? | |
if(_.isUndefined(state.HealthColors.auraDeadPC)) state.HealthColors.auraDeadPC = true; //show dead X status PC | |
if(_.isUndefined(state.HealthColors.auraDead)) state.HealthColors.auraDead = true; //show dead X status NPC | |
//----------------- | |
if(_.isUndefined(state.HealthColors.GM_PCNames)) state.HealthColors.GM_PCNames = "Yes"; //show GM PC names? | |
if(_.isUndefined(state.HealthColors.PCNames)) state.HealthColors.PCNames = "Yes"; //show players PC Names? | |
//----------------- | |
if(_.isUndefined(state.HealthColors.GM_NPCNames)) state.HealthColors.GM_NPCNames = "Yes"; //show GM NPC names? | |
if(_.isUndefined(state.HealthColors.NPCNames)) state.HealthColors.NPCNames = "Yes"; //show players NPC Names? | |
//----------------- | |
if(_.isUndefined(state.HealthColors.AuraSize)) state.HealthColors.AuraSize = 0.7; //set aura size? | |
if(_.isUndefined(state.HealthColors.FX)) state.HealthColors.FX = true; //set FX ON/OFF? | |
if(_.isUndefined(state.HealthColors.HealFX)) state.HealthColors.HealFX = "00FF00"; //set FX HEAL COLOR | |
if(_.isUndefined(state.HealthColors.HurtFX)) state.HealthColors.HurtFX = "FF0000"; //set FX HURT COLOR? | |
if(_.isUndefined(state.HealthColors.auraDeadFX)) state.HealthColors.auraDeadFX = 'None'; //Sound FX Name | |
//TokenMod CHECK | |
if('undefined' !== typeof TokenMod && TokenMod.ObserveTokenChange) TokenMod.ObserveTokenChange(handleToken); | |
var FXHurt = findObjs({_type: "custfx",name: "-DefaultHurt"}, {caseInsensitive: true})[0]; | |
var FXHeal = findObjs({_type: "custfx",name: "-DefaultHeal"}, {caseInsensitive: true})[0]; | |
//DEFAULT FX CHECK | |
if(!FXHurt) { | |
GMW("Creating Default Hurt FX"); | |
var Hurt = { | |
"maxParticles": 150, | |
"duration": 50, | |
"size": 10, | |
"sizeRandom": 3, | |
"lifeSpan": 25, | |
"lifeSpanRandom": 5, | |
"speed": 8, | |
"speedRandom": 3, | |
"gravity": {"x": 0.01,"y": 0.65}, | |
"angle": 270, | |
"angleRandom": 25, | |
"emissionRate": 100, | |
"startColour": [0, 0, 0, 0], | |
"endColour": [0, 0, 0, 0], | |
}; | |
createObj('custfx', {name: "-DefaultHurt",definition: Hurt}); | |
} | |
if(!FXHeal) { | |
GMW("Creating Default Heal FX"); | |
var Heal = { | |
"maxParticles": 150, | |
"duration": 50, | |
"size": 10, | |
"sizeRandom": 15, | |
"lifeSpan": 50, | |
"lifeSpanRandom": 30, | |
"speed": 0.5, | |
"speedRandom": 2, | |
"angle": 0, | |
"angleRandom": 180, | |
"emissionRate": 1000, | |
"startColour": [0, 0, 0, 0], | |
"endColour": [0, 0, 0, 0], | |
}; | |
createObj('custfx', {name: "-DefaultHeal",definition: Heal}); | |
} | |
}, | |
//WHISPER GM------------ | |
GMW = function (text) { | |
var DIV = "<div style='width: 100%; border-radius: 4px; box-shadow: 1px 1px 1px #707070; text-align: center; vertical-align: middle; padding: 3px 0px; margin: 0px auto; border: 1px solid #000; color: #000; background-image: -webkit-linear-gradient(-45deg, #a7c7dc 0%,#85b2d3 100%);"; | |
var MSG = DIV + "'><b>"+text+"</b></div"; | |
sendChat('HealthColors', "/w GM "+MSG); | |
}, | |
//OUTSIDE CALL------------ | |
UpdateToken = function (obj, prev) { | |
if (obj.get("type") === "graphic") handleToken(obj, prev); | |
else GMW("Script sent non-Token to be updated!"); | |
}, | |
//REGISTER TRIGGERS------------ | |
registerEventHandlers = function () { | |
on('chat:message', handleInput); | |
on("change:token", handleToken); | |
on('add:token', function (t) { | |
_.delay(() => { | |
let token = getObj('graphic', t.id), | |
prev = JSON.parse(JSON.stringify(token)); | |
handleToken(token, prev, "YES"); | |
}, 400); | |
}); | |
}; | |
//RETURN OUTSIDE FUNCTIONS------------ | |
return { | |
GMW: GMW, | |
Update: UpdateToken, | |
CheckInstall: checkInstall, | |
RegisterEventHandlers: registerEventHandlers | |
}; | |
}()); | |
//On Ready | |
on('ready', function () { | |
'use strict'; | |
//HealthColors.GMW("API READY"); | |
HealthColors.CheckInstall(); | |
HealthColors.RegisterEventHandlers(); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment