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

[Help] Blood and Honor script infinite loop

1464068888

Edited 1464068972
This is the only script I'm using, and for some reason it will only work for a few minutes at a time. The error I'm getting is "infinite loop." Any help with this would be very much appreciated. Thanks!
1464100974
Ada L.
Marketplace Creator
Sheet Author
API Scripter
When pasting in code, you should really use the  Code paragraph blocks. It preserves indentation and makes things a lot easier to read. ;)
A lot of us seem to be getting a similar issue, there's a thread going at&nbsp;<a href="https://app.roll20.net/forum/post/3404865/intermittent-infinite-loop-issue" rel="nofollow">https://app.roll20.net/forum/post/3404865/intermittent-infinite-loop-issue</a> I'm starting to think its not so much an issue with the scripts as it is with Roll20's API
1464129952

Edited 1464130315
I am pretty sure it is indeed an issue with Roll20's API. The script worked fine for months, and then instantly stopped working the week the SRD update happened. I haven't changed anything in the script other than when I initially set it up.
///////////////////////////////////////////////// /***********************************************/ var BloodAndHonor = { &nbsp; &nbsp; author: { &nbsp; &nbsp; name: "John C." || "Echo" || "SplenectomY", company: "Team Asshat" || "The Alehounds", contact: "<a href="mailto:echo@TeamAsshat.com" rel="nofollow">echo@TeamAsshat.com</a>", }, version: "0.8", gist: "<a href="https://gist.github.com/SplenectomY/097dac3e427ec50f32c9" rel="nofollow">https://gist.github.com/SplenectomY/097dac3e427ec50f32c9</a>", forum: "<a href="https://app.roll20.net/forum/post/1477230/" rel="nofollow">https://app.roll20.net/forum/post/1477230/</a>", wiki: "<a href="https://wiki.roll20.net/Script:Blood_And_Honor:_Automatic_blood_spatter,_pooling_and_trail_effects" rel="nofollow">https://wiki.roll20.net/Script:Blood_And_Honor:_Automatic_blood_spatter,_pooling_and_trail_effects</a>", /***********************************************/ ///////////////////////////////////////////////// // This value should match the size of a standard grid in your campaign // Default is 70 px x 70 px square, Roll20's default. tokenSize: 70, // If you have it installed, this will plug in TheAaron's isGM auth module, // which will make it so only the GM can use the !clearblood command // Change to "true" if you want to check for authorization useIsGM: false, // YOU MUST ADD YOUR OWN SPATTERS AND POOLS TO YOUR LIBRARY // AND GET THE IMAGE LINK VIA YOUR WEB BROWSER. // FOLLOW THE INSTRUCTIONS HERE: // &nbsp;<a href="https://wiki.roll20.net/API:Objects#imgsrc_and_av" rel="nofollow">https://wiki.roll20.net/API:Objects#imgsrc_and_av</a>... // You can add as many as you'd like to either category. // Spatters are also used for blood trails. spatters: [ "<a href="https://s3.amazonaws.com/files.d20.io/images/5205/thumb.png?1336251791" rel="nofollow">https://s3.amazonaws.com/files.d20.io/images/5205/thumb.png?1336251791</a>", &nbsp; &nbsp; &nbsp; &nbsp; "<a href="https://s3.amazonaws.com/files.d20.io/images/17252689/ffp4DUnkhVGqjzErZqDe8A/thumb.png?1458180613" rel="nofollow">https://s3.amazonaws.com/files.d20.io/images/17252689/ffp4DUnkhVGqjzErZqDe8A/thumb.png?1458180613</a>", &nbsp; &nbsp; &nbsp; &nbsp; "<a href="https://s3.amazonaws.com/files.d20.io/images/17252681/HFQD2W3CRFt9ulheP6_jIQ/thumb.png?1458180582" rel="nofollow">https://s3.amazonaws.com/files.d20.io/images/17252681/HFQD2W3CRFt9ulheP6_jIQ/thumb.png?1458180582</a>", &nbsp; &nbsp; &nbsp; &nbsp; "<a href="https://s3.amazonaws.com/files.d20.io/images/17252673/DTm-ohwN_Jdhk13dCPqEVw/thumb.png?1458180559" rel="nofollow">https://s3.amazonaws.com/files.d20.io/images/17252673/DTm-ohwN_Jdhk13dCPqEVw/thumb.png?1458180559</a>", ], pools: [ "<a href="https://s3.amazonaws.com/files.d20.io/images/17253108/pRxtDtszPkwvkFgRlN9cBg/thumb.png?1458181931" rel="nofollow">https://s3.amazonaws.com/files.d20.io/images/17253108/pRxtDtszPkwvkFgRlN9cBg/thumb.png?1458181931</a>", &nbsp; &nbsp; &nbsp; &nbsp; "<a href="https://s3.amazonaws.com/files.d20.io/images/17253758/7W5xqMFPPkfO5uFHArhNFA/thumb.png?1458183837" rel="nofollow">https://s3.amazonaws.com/files.d20.io/images/17253758/7W5xqMFPPkfO5uFHArhNFA/thumb.png?1458183837</a>", &nbsp; &nbsp; &nbsp; &nbsp; "<a href="https://s3.amazonaws.com/files.d20.io/images/17253763/dhBlV_AWzSHHr_BE0MXIgw/thumb.png?1458183856" rel="nofollow">https://s3.amazonaws.com/files.d20.io/images/17253763/dhBlV_AWzSHHr_BE0MXIgw/thumb.png?1458183856</a>", &nbsp; &nbsp; &nbsp; &nbsp; "<a href="https://s3.amazonaws.com/files.d20.io/images/17253764/h0JxYxVf7wBmq9pRxlzPtg/thumb.png?1458183860" rel="nofollow">https://s3.amazonaws.com/files.d20.io/images/17253764/h0JxYxVf7wBmq9pRxlzPtg/thumb.png?1458183860</a>", &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; ], chooseBlood: function chooseBlood(type) { if (type == "spatter") return BloodAndHonor.spatters[randomInteger(BloodAndHonor.spatters.length) - 1]; if (type == "pool") return BloodAndHonor.pools[randomInteger(BloodAndHonor.pools.length) - 1]; }, getOffset: function getOffset() { if (randomInteger(2) == 1) return 1; else return -1; }, bloodColor: function bloodColor(gmnotes) { if (gmnotes.indexOf("bloodcolor_purple") !== -1) return "#0000ff"; if (gmnotes.indexOf("bloodcolor_blue") !== -1) return "#00ffff"; if (gmnotes.indexOf("bloodcolor_orange") !== -1) return "#ffff00"; else return "transparent" }, createBlood: function createBlood(gPage_id,gLeft,gTop,gWidth,gType,gColor) { gLeft = gLeft + (randomInteger(Math.floor(gWidth / 2)) * BloodAndHonor.getOffset()); gTop = gTop + (randomInteger(Math.floor(gWidth / 2)) * BloodAndHonor.getOffset()); setTimeout(function(){ toFront(fixedCreateObj("graphic",{ imgsrc: gType, gmnotes: "blood", pageid: gPage_id, left: gLeft, tint_color: gColor, top: gTop, rotation: randomInteger(360) - 1, width: gWidth, height: gWidth, layer: "map", })); },50); }, timeout: 0, onTimeout: function theFinalCountdown() { if (BloodAndHonor.timeout &gt; 0) { BloodAndHonor.timeout--; } else { return; } } }; fixedCreateObj = (function () { return function () { var obj = createObj.apply(this, arguments); if (obj && !obj.fbpath) { obj.fbpath = obj.changed._fbpath.replace(/([^\/]*\/){4}/, "/"); } return obj; }; }()); on("ready", function(obj) { setInterval(function(){BloodAndHonor.onTimeout()},1000); on("change:graphic:bar3_value", function(obj, prev) { if (obj.get("bar3_max") === "" || obj.get("layer") != "objects" || (obj.get("gmnotes")).indexOf("noblood") !== -1) return; // Create spatter near token if "bloodied". // Chance of spatter depends on severity of damage else if (obj.get("bar3_value") &lt;= obj.get("bar3_max") / 2 && prev["bar3_value"] &gt; obj.get("bar3_value") && obj.get("bar3_value") &gt; 0) { if (randomInteger(obj.get("bar3_max")) &gt; obj.get("bar3_value")) { var bloodMult = 1 + ((obj.get("bar3_value") - prev["bar3_value"]) / obj.get("bar3_max")); BloodAndHonor.createBlood(obj.get("_pageid"), obj.get("left"), obj.get("top"), Math.floor(BloodAndHonor.tokenSize * bloodMult), BloodAndHonor.chooseBlood("spatter"), BloodAndHonor.bloodColor(obj.get("gmnotes"))); } } // Create pool near token if health drops below 1. else if (obj.get("bar3_value") &lt;= 0) { BloodAndHonor.createBlood(obj.get("_pageid"), obj.get("left"), obj.get("top"), Math.floor(BloodAndHonor.tokenSize * 1.5), BloodAndHonor.chooseBlood("pool"), BloodAndHonor.bloodColor(obj.get("gmnotes"))); } }); //Make blood trails, chance goes up depending on how injured a token is on("change:graphic:lastmove", function(obj) { if (BloodAndHonor.timeout == 0) { if (obj.get("bar3_value") &lt;= obj.get("bar3_max") / 2 && (obj.get("gmnotes")).indexOf("noblood") == -1) { if (randomInteger(obj.get("bar3_max")) &gt; obj.get("bar3_value")) { BloodAndHonor.createBlood(obj.get("_pageid"), obj.get("left"), obj.get("top"), Math.floor(BloodAndHonor.tokenSize / 2), BloodAndHonor.chooseBlood("spatter"), BloodAndHonor.bloodColor(obj.get("gmnotes"))); BloodAndHonor.timeout += 2; } } } }); on("chat:message", function(msg) { if (msg.type == "api" && msg.content.indexOf("!clearblood") !== -1) { if (BloodAndHonor.useIsGM && !isGM(msg.playerid)) { sendChat(msg.who,"/w " + msg.who + " You are not authorized to use that command!"); return; } else { objects = filterObjs(function(obj) { if(obj.get("type") == "graphic" && obj.get("gmnotes") == "blood") return true; else return false; }); _.each(objects, function(obj) { obj.set("left",0); obj.set("top",0); }); } } }); });
I have the same issue with this script. It will work for a while, then get shut down by Roll20 saying it is detecting infinite loop condition, but I think this is actually not the case. What is the timeout value that is being used to determine if a script is long-running?
I'm positive there is a patched version somewhere in the repository.
Also, take a look at this. <a href="https://app.roll20.net/forum/post/2299858/script-b" rel="nofollow">https://app.roll20.net/forum/post/2299858/script-b</a>...
1467812665
The Aaron
Roll20 Production Team
API Scripter
Machine Ator said: I have the same issue with this script. It will work for a while, then get shut down by Roll20 saying it is detecting infinite loop condition, but I think this is actually not the case. What is the timeout value that is being used to determine if a script is long-running? See:&nbsp; Riley's Response in the other thread. (TL;DR; -- 30 seconds, which is a long time for a program)