diff --git a/extensions/Lily/MoreEvents.js b/extensions/Lily/MoreEvents.js index b215802af8..e1afd62c4d 100644 --- a/extensions/Lily/MoreEvents.js +++ b/extensions/Lily/MoreEvents.js @@ -2,6 +2,7 @@ // ID: lmsMoreEvents // Description: Start your scripts in new ways. // By: LilyMakesThings +// By: Fath11 // License: MIT AND LGPL-3.0 (function (Scratch) { @@ -13,6 +14,12 @@ const stopIcon = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAMAAAAp4XiDAAAAQlBMVEUAAAC/UFC8Q0OzTU24SEi4SEi3SEi4R0e4SEi4SEi4SEi4SEi7SUm8SUnMTk7MT0/OT0/PT0/gVVXiVVXsWVn///+CoOd2AAAAC3RSTlMAEBMUu7zLz9D8/dIXnJwAAAABYktHRBXl2PmjAAAAxklEQVRIx+3WwRKDIBAD0JWqVEOtWv7/W3twOqKwELzW3N9wYhORMMYiztgZUZMUAKxqmh5Kno/MG256nzI59Z2mB+BWH+XzUt5RhWoyQjFZkTQFkTBFERlCnAwlDoYUgaHFblpaeL86AK0MvNjMIABmT2cGIAAWniw3ucm/k9ovduEjXzgXtUfJmtrTt9VZzYH9FSB/xvfKZMsiLFmuko61zBTfucjL9RpXf6nEU2MhPxXS86J+kORmjz6V6seViOnG8oT7ApMcjsYZwhXCAAAAAElFTkSuQmCC"; + const pauseIcon = + "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMTgiIHdpZHRoPSIxOCI+PHBhdGggZD0iTTIzMS40MjkgMTg4LjkyOVYxNzEuMDdoNC4yODV2MTcuODU4em0xMi4xNDIgMFYxNzEuMDdoNC4yODZ2MTcuODU4eiIgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMzMwOSAwIDAgLjk1NDI3IC0yMzguNTczIC0xNjIuNzY5KSIgZGF0YS1wYXBlci1kYXRhPSJ7JnF1b3Q7aXNQYWludGluZ0xheWVyJnF1b3Q7OnRydWV9IiBmaWxsPSIjZmZhZTAwIiBzdHJva2U9IiNkODk0MDAiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbCIvPjwvc3ZnPg=="; + + const continueIcon = + "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMTgiIHdpZHRoPSIxOCI+PHBhdGggZD0ibTI0Ni4wNTUgMTgwLTEyLjExIDEyLjExdi0yNC4yMnoiIHRyYW5zZm9ybT0ibWF0cml4KDEuMTM5NDkgMCAwIC42Nzk0MyAtMjY0LjU5NSAtMTEzLjI5OCkiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlPSIjZDg5NDAwIiBmaWxsPSIjZmZhZTAwIiBkYXRhLXBhcGVyLWRhdGE9InsmcXVvdDtpc1BhaW50aW5nTGF5ZXImcXVvdDs6dHJ1ZX0iLz48L3N2Zz4="; + // Source: // https://github.com/TurboWarp/scratch-vm/blob/develop/src/io/keyboard.js // https://github.com/TurboWarp/scratch-blocks/blob/develop/blocks_vertical/event.js @@ -205,6 +212,34 @@ runtime.shouldExecuteStopClicked = false; originalGreenFlag.call(this); }; + + let pauseHandler = () => { + runtime.allScriptsByOpcodeDo( + "lmsMoreEvents_whenProjectPaused", + (script, target) => { + const topBlockId = script.blockId; + for (let j = 0; j < runtime.threads.length; j++) { + if ( + runtime.threads[j].topBlock === topBlockId && + runtime.threads[j].status !== 4 + ) { + return; + } + } + runtime._pushThread(topBlockId, target); + } + ); + }; + + runtime.on("RUNTIME_PAUSED", () => { + runtime.once("BEFORE_EXECUTE", pauseHandler); + }); + + runtime.on("RUNTIME_UNPAUSED", () => { + runtime.once("BEFORE_EXECUTE", () => { + runtime.startHats("lmsMoreEvents_whenProjectUnPaused"); + }); + }); } getInfo() { @@ -228,6 +263,32 @@ }, extensions: ["colours_event"], }, + { + opcode: "whenProjectPaused", + blockType: Scratch.BlockType.EVENT, + text: Scratch.translate("when [PAUSE] clicked"), + isEdgeActivated: false, + arguments: { + PAUSE: { + type: Scratch.ArgumentType.IMAGE, + dataURI: pauseIcon, + }, + }, + extensions: ["colours_event"], + }, + { + opcode: "whenProjectUnPaused", + blockType: Scratch.BlockType.EVENT, + text: Scratch.translate("when [UNPAUSE] clicked"), + isEdgeActivated: false, + arguments: { + UNPAUSE: { + type: Scratch.ArgumentType.IMAGE, + dataURI: continueIcon, + }, + }, + extensions: ["colours_event"], + }, { opcode: "forever", blockType: Scratch.BlockType.EVENT,