Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (async () => {
- const sleep = ms => new Promise(r => setTimeout(r, ms));
- const randInt = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;
- const explosionChars = '█▓▒░╬╠╣╦╩╗╔╝╚│─┼#@%&*!~^$'.split('');
- const burnChars = '.,:;\'`"~-_'.split('');
- const randChar = () => explosionChars[randInt(0, explosionChars.length - 1)];
- const randBurnChar = () => burnChars[randInt(0, burnChars.length - 1)];
- const burnCIDs = [29, 6, 22];
- let running = true;
- let instantMode = false;
- let shockwaveEnabled = false;
- let altAftermathEnabled = true;
- const tick = async () => { if (!instantMode) await sleep(5); };
- // ── Track own sent messages ─────────────────────────────────────
- const ownMessages = [];
- function chatSend(msg) {
- ownMessages.push({ text: msg, time: Date.now() });
- w.chat.send(msg);
- }
- function isOwnMessage(msg) {
- const now = Date.now();
- return ownMessages.some(own => {
- if (now - own.time > 15000) return false;
- return msg.includes(own.text);
- });
- }
- // ── chat log & listener pipeline ────────────────────────────────
- const chatLog = [];
- const chatListeners = [];
- function pushMessage(msg, source) {
- if (isOwnMessage(msg)) {
- console.log(`[Vaporizer][${source}] SKIPPED (own): "${msg}"`);
- return;
- }
- console.log(`[Vaporizer][${source}] message: "${msg}"`);
- chatLog.push({ time: Date.now(), message: msg, source });
- chatListeners.forEach(fn => fn(msg));
- }
- function deepExtract(obj) {
- if (!obj) return "";
- if (typeof obj === "string") return obj;
- for (const k of ["message","msg","data","text","content","value","chatMsg","body"]) {
- if (obj[k] && typeof obj[k] === "string") return obj[k];
- }
- if (Array.isArray(obj) && obj.length) return deepExtract(obj[obj.length - 1]);
- for (const k of Object.keys(obj)) {
- if (typeof obj[k] === "string" && obj[k].length > 0 && obj[k].length < 300)
- return obj[k];
- }
- return String(obj);
- }
- const rawHandler = (...args) => {
- console.log("[Vaporizer][RAW]", JSON.stringify(args));
- let msg = "";
- for (const a of args) {
- const m = deepExtract(a);
- if (m) { msg = m; break; }
- }
- if (msg) pushMessage(msg, "event");
- };
- // ── binding strategies ──────────────────────────────────────────
- let bound1 = false, bound2 = false, bound3 = false;
- const evNames = ["chat","chatMessage","message","msg","chat_message","chatMsg"];
- if (w.events && typeof w.events.on === "function") {
- evNames.forEach(n => { try { w.events.on(n, rawHandler); bound1 = true; } catch(e){} });
- }
- if (typeof w.on === "function") {
- evNames.forEach(n => { try { w.on(n, rawHandler); bound2 = true; } catch(e){} });
- }
- [w, w.events].forEach(target => {
- if (target && typeof target.addEventListener === "function") {
- evNames.forEach(n => { try { target.addEventListener(n, rawHandler); bound3 = true; } catch(e){} });
- }
- });
- let observer = null;
- const chatSelectors = [
- "#chat-messages", ".chat-messages", "#chatbox", ".chatbox",
- "[class*='chat']", "[id*='chat']", ".messages", "#messages"
- ];
- let chatContainer = null;
- for (const sel of chatSelectors) {
- const el = document.querySelector(sel);
- if (el) { chatContainer = el; break; }
- }
- if (chatContainer) {
- observer = new MutationObserver(mutations => {
- for (const m of mutations) {
- for (const node of m.addedNodes) {
- const txt = (node.textContent || "").trim();
- if (txt) pushMessage(txt, "dom");
- }
- }
- });
- observer.observe(chatContainer, { childList: true, subtree: true });
- }
- if (w.chat) {
- for (const fn of ["receive","onMessage","onReceive","handleMessage","_onMessage"]) {
- if (typeof w.chat[fn] === "function") {
- const orig = w.chat[fn].bind(w.chat);
- w.chat[fn] = (...args) => { rawHandler(...args); return orig(...args); };
- }
- }
- }
- let pollTimer = null;
- if (w.events && Array.isArray(w.events)) {
- let lastLen = w.events.length;
- pollTimer = setInterval(() => {
- while (lastLen < w.events.length) {
- const ev = w.events[lastLen];
- const m = deepExtract(ev);
- if (m) pushMessage(m, "poll");
- lastLen++;
- }
- }, 100);
- }
- console.log(`[Vaporizer] Bindings: events.on=${bound1} w.on=${bound2} addEventListener=${bound3} DOM=${!!chatContainer}`);
- // ── waitForChat ─────────────────────────────────────────────────
- function waitForChat(predicate) {
- return new Promise(resolve => {
- const handler = msg => {
- const result = predicate(msg);
- if (result !== undefined && result !== false) {
- const idx = chatListeners.indexOf(handler);
- if (idx !== -1) chatListeners.splice(idx, 1);
- resolve(result);
- }
- };
- chatListeners.push(handler);
- });
- }
- // ══════════════════════════════════════════════════════════════════
- // CONSOLE COMMANDS (still available alongside HUD toggles)
- // ══════════════════════════════════════════════════════════════════
- window.eRadius = (num) => {
- num = parseInt(num);
- if (isNaN(num) || num < 5) {
- console.warn("[eRadius] Invalid or < 5. Usage: eRadius(10)");
- return;
- }
- console.log(`[eRadius] Radius set to ${num}`);
- pushMessage(String(num), "eRadius-fallback");
- };
- window.instant = (val) => {
- if (val === true || val === "true" || val === 1) instantMode = true;
- else if (val === false || val === "false" || val === 0) instantMode = false;
- else { console.warn("[instant] Usage: instant(true) or instant(false)"); return; }
- console.log(`[Vaporizer] Instant mode: ${instantMode ? "ON" : "OFF"}`);
- };
- window.shockwave = (val) => {
- if (val === true || val === "true" || val === 1) shockwaveEnabled = true;
- else if (val === false || val === "false" || val === 0) shockwaveEnabled = false;
- else { console.warn("[shockwave] Usage: shockwave(true) or shockwave(false)"); return; }
- console.log(`[Vaporizer] Shockwave: ${shockwaveEnabled ? "ON" : "OFF"}`);
- };
- window.altAftermath = (val) => {
- if (val === true || val === "true" || val === 1) altAftermathEnabled = true;
- else if (val === false || val === "false" || val === 0) altAftermathEnabled = false;
- else { console.warn("[altAftermath] Usage: altAftermath(true) or altAftermath(false)"); return; }
- console.log(`[Vaporizer] Alt Aftermath: ${altAftermathEnabled ? "ON" : "OFF"}`);
- };
- console.log("[Vaporizer] Console commands:");
- console.log(" eRadius(10) -- set radius if chat detection fails");
- console.log(" instant(true) -- instant char placement");
- console.log(" shockwave(true) -- enable expanding ring (default OFF)");
- console.log(" altAftermath(false)-- burn marks instead of clean square (default ON)");
- // ── Step 1: greet ───────────────────────────────────────────────
- chatSend("The Great Vaporizer v1 started, whats the explosion radius?");
- chatSend("(If chat detection fails, type eRadius(number) in browser console)");
- // ── Step 2: wait for radius ─────────────────────────────────────
- const explosionRadius = await waitForChat(msg => {
- const matches = msg.match(/-?\d+/);
- if (!matches) return false;
- const n = parseInt(matches[0]);
- if (isNaN(n)) return false;
- if (n < 5) {
- chatSend("Minimum radius is 5! Try again.");
- return false;
- }
- return n;
- });
- const radius = Math.max(explosionRadius, 5);
- console.log("[Vaporizer] Radius accepted:", radius);
- // ── Step 3: HUD with toggles ────────────────────────────────────
- chatSend("HUD opening for coordinate targets!");
- await sleep(400);
- const toggleBtnStyle = (active) =>
- `display:inline-block;padding:6px 14px;margin:3px;border:none;border-radius:4px;
- cursor:pointer;font-family:monospace;font-size:13px;font-weight:bold;
- transition:all 0.2s;
- background:${active ? "linear-gradient(to right,#006600,#009900)" : "linear-gradient(to right,#550000,#880000)"};
- color:${active ? "#88ff88" : "#ff8888"};
- box-shadow:0 0 8px ${active ? "rgba(0,255,0,0.3)" : "rgba(255,0,0,0.3)"};`;
- const { startX, startY } = await new Promise(resolve => {
- const hud = document.createElement("div");
- hud.id = "vaporizer-hud";
- Object.assign(hud.style, {
- position: "fixed", top: "50%", left: "50%",
- transform: "translate(-50%,-50%)",
- background: "linear-gradient(145deg, #3a0000 0%, #1a0000 30%, #2d1200 70%, #4a1800 100%)",
- color: "#ff9944",
- padding: "28px 32px", borderRadius: "14px",
- zIndex: "999999", fontFamily: "monospace",
- border: "2px solid #ff4444",
- boxShadow: "0 0 40px rgba(255,68,68,.6), inset 0 0 60px rgba(0,0,0,0.5)",
- minWidth: "360px", maxWidth: "420px", textAlign: "center"
- });
- hud.innerHTML = `
- <h2 style="color:#ff4444;margin:0 0 6px;text-shadow:0 0 10px #ff0000">
- The Great Vaporizer v1</h2>
- <p style="margin:4px 0 14px;color:#cc8844">
- Explosion Radius: <b style="color:#ff4444">${radius}</b></p>
- <hr style="border-color:#552200">
- <div style="margin:14px 0;text-align:left">
- <label style="display:block;margin-bottom:4px;color:#ff9944">Target X:</label>
- <input type="text" id="vap-x" placeholder="X (negatives allowed)"
- style="width:100%;box-sizing:border-box;background:#1a0a00;color:#ff9944;
- border:1px solid #883300;padding:8px;font-size:14px;font-family:monospace"/>
- </div>
- <div style="margin:14px 0;text-align:left">
- <label style="display:block;margin-bottom:4px;color:#ff9944">Target Y:</label>
- <input type="text" id="vap-y" placeholder="Y (negatives allowed)"
- style="width:100%;box-sizing:border-box;background:#1a0a00;color:#ff9944;
- border:1px solid #883300;padding:8px;font-size:14px;font-family:monospace"/>
- </div>
- <hr style="border-color:#552200;margin:16px 0 12px">
- <p style="margin:0 0 8px;color:#cc8844;font-size:13px">-- Toggles --</p>
- <div style="margin:8px 0;text-align:left">
- <span style="color:#ff9944;font-size:13px">Instant Mode:</span>
- <button id="vap-tog-instant" style="${toggleBtnStyle(instantMode)}">
- ${instantMode ? "ON" : "OFF"}</button>
- <span style="color:#886644;font-size:11px;margin-left:4px">
- (no delay on char placement)</span>
- </div>
- <div style="margin:8px 0;text-align:left">
- <span style="color:#ff9944;font-size:13px">Shockwave:</span>
- <button id="vap-tog-shockwave" style="${toggleBtnStyle(shockwaveEnabled)}">
- ${shockwaveEnabled ? "ON" : "OFF"}</button>
- <span style="color:#886644;font-size:11px;margin-left:4px">
- (expanding ring before blast)</span>
- </div>
- <div style="margin:8px 0;text-align:left">
- <span style="color:#ff9944;font-size:13px">Alt Aftermath:</span>
- <button id="vap-tog-altaft" style="${toggleBtnStyle(altAftermathEnabled)}">
- ${altAftermathEnabled ? "ON" : "OFF"}</button>
- <span style="color:#886644;font-size:11px;margin-left:4px">
- (ON=clean square | OFF=burn marks)</span>
- </div>
- <hr style="border-color:#552200;margin:14px 0 10px">
- <div id="vap-error" style="color:#ffcc00;font-size:12px;min-height:18px;margin:4px 0"></div>
- <button id="vap-submit"
- style="width:100%;padding:12px;
- background:linear-gradient(to right,#8b0000,#cc4400);
- color:#fff;border:none;cursor:pointer;font-weight:bold;font-size:16px;
- margin-top:8px;border-radius:6px;font-family:monospace;
- text-shadow:0 0 5px #ff0000">
- [ Submit ]</button>`;
- document.body.appendChild(hud);
- // ── wire up toggle buttons ──────────────────────────────────
- function wireToggle(btnId, getter, setter) {
- const btn = document.getElementById(btnId);
- btn.addEventListener("click", () => {
- const newVal = !getter();
- setter(newVal);
- btn.textContent = newVal ? "ON" : "OFF";
- btn.style.cssText = toggleBtnStyle(newVal);
- console.log(`[Vaporizer] Toggle ${btnId}: ${newVal ? "ON" : "OFF"}`);
- });
- }
- wireToggle("vap-tog-instant",
- () => instantMode,
- (v) => { instantMode = v; });
- wireToggle("vap-tog-shockwave",
- () => shockwaveEnabled,
- (v) => { shockwaveEnabled = v; });
- wireToggle("vap-tog-altaft",
- () => altAftermathEnabled,
- (v) => { altAftermathEnabled = v; });
- // ── submit button ───────────────────────────────────────────
- document.getElementById("vap-submit").addEventListener("click", () => {
- const xv = document.getElementById("vap-x").value.trim();
- const yv = document.getElementById("vap-y").value.trim();
- const errEl = document.getElementById("vap-error");
- if (xv === "" || yv === "") {
- errEl.textContent = "!! Fill in both X and Y !!";
- hud.style.border = "2px solid #ffcc00";
- setTimeout(() => { hud.style.border = "2px solid #ff4444"; errEl.textContent = ""; }, 1500);
- return;
- }
- const px = parseInt(xv);
- const py = parseInt(yv);
- if (isNaN(px) || isNaN(py)) {
- errEl.textContent = "!! Enter valid numbers (e.g. -50, 120) !!";
- hud.style.border = "2px solid #ffcc00";
- setTimeout(() => { hud.style.border = "2px solid #ff4444"; errEl.textContent = ""; }, 1500);
- return;
- }
- hud.remove();
- resolve({ startX: px, startY: -py });
- });
- });
- console.log(`[Vaporizer] Target: X=${startX} Y=${startY} (Y was inverted)`);
- console.log(`[Vaporizer] Settings: instant=${instantMode} shockwave=${shockwaveEnabled} altAftermath=${altAftermathEnabled}`);
- // ── Step 4: countdown ───────────────────────────────────────────
- chatSend("Detonation sequence done. detonating at 10 seconds");
- for (let i = 10; i >= 1; i--) {
- console.log(`[Vaporizer] ${i}...`);
- await sleep(1000);
- }
- chatSend("bye bye!");
- await sleep(300);
- // ── precompute positions ────────────────────────────────────────
- const positions = [];
- for (let dy = -radius; dy <= radius; dy++)
- for (let dx = -radius; dx <= radius; dx++)
- if (dx * dx + dy * dy <= radius * radius)
- positions.push({ dx, dy });
- const burnRadius = radius + 3;
- const burnPositions = [];
- for (let dy = -burnRadius; dy <= burnRadius; dy++)
- for (let dx = -burnRadius; dx <= burnRadius; dx++) {
- if (dx * dx + dy * dy <= burnRadius * burnRadius)
- burnPositions.push({ dx, dy });
- }
- function getRing(r) {
- const ring = [];
- for (let dy = -(r + 1); dy <= r + 1; dy++)
- for (let dx = -(r + 1); dx <= r + 1; dx++) {
- const dist = Math.sqrt(dx * dx + dy * dy);
- if (dist >= r - 0.5 && dist < r + 0.5)
- ring.push({ dx, dy });
- }
- return ring;
- }
- console.log(`[Vaporizer] Explosion: ${positions.length} cells | Burn area: ${burnPositions.length} cells`);
- // ══════════════════════════════════════════════════════════════════
- // Step 5: SHOCKWAVE (only if enabled)
- // ══════════════════════════════════════════════════════════════════
- if (shockwaveEnabled) {
- console.log("[Vaporizer] Shockwave starting...");
- let prevRing = [];
- for (let r = 0; r <= radius; r++) {
- for (const pos of prevRing) {
- const cid = [6, 22, 29][randInt(0, 2)];
- w.changeColor(cid);
- writeCharAt(randChar(), cid, startX + pos.dx, startY + pos.dy);
- await tick();
- }
- const ring = getRing(r);
- for (const pos of ring) {
- w.changeColor(2);
- writeCharAt(randChar(), 2, startX + pos.dx, startY + pos.dy);
- await tick();
- }
- prevRing = ring;
- await sleep(70);
- }
- for (const pos of prevRing) {
- const cid = [6, 22, 29][randInt(0, 2)];
- w.changeColor(cid);
- writeCharAt(randChar(), cid, startX + pos.dx, startY + pos.dy);
- await tick();
- }
- console.log("[Vaporizer] Shockwave complete");
- } else {
- console.log("[Vaporizer] Shockwave skipped (OFF)");
- }
- // ══════════════════════════════════════════════════════════════════
- // Step 6: 30-second explosion animation
- // ══════════════════════════════════════════════════════════════════
- const t0 = Date.now();
- let charCount = 0;
- const activeStreakDYs = new Set();
- let lastStreakTime = Date.now();
- while (running && Date.now() - t0 < 30000) {
- const elapsed = Date.now() - t0;
- const phase = elapsed / 30000;
- const pos = positions[randInt(0, positions.length - 1)];
- const x = startX + pos.dx;
- const y = startY + pos.dy;
- const distFromCenter = Math.sqrt(pos.dx * pos.dx + pos.dy * pos.dy);
- const normDist = distFromCenter / radius;
- let cid;
- if (Math.abs(pos.dy) <= 1) {
- cid = 2;
- } else if (activeStreakDYs.has(pos.dy)) {
- cid = 2;
- } else if (normDist < 0.25) {
- cid = [2, 2, 6, 22][randInt(0, 3)];
- } else if (normDist < 0.5) {
- cid = [6, 22, 29, randInt(10, 29)][randInt(0, 3)];
- } else if (normDist < 0.75) {
- cid = randInt(3, 29);
- } else {
- cid = [29, 6, 22, randInt(3, 12)][randInt(0, 3)];
- }
- if (phase > 0.6 && randInt(0, 4) === 0) cid = burnCIDs[randInt(0, 2)];
- if (phase > 0.85 && randInt(0, 2) === 0) cid = burnCIDs[randInt(0, 2)];
- if (randInt(0, 80) === 0) cid = 2;
- w.changeColor(cid);
- writeCharAt(randChar(), cid, x, y);
- charCount++;
- let doStreak = false;
- if (instantMode) {
- if (Date.now() - lastStreakTime >= 5000) {
- doStreak = true;
- lastStreakTime = Date.now();
- }
- } else {
- if (charCount % 500 === 0) doStreak = true;
- }
- if (doStreak) {
- const sDY = randInt(-radius, radius);
- activeStreakDYs.add(sDY);
- console.log(`[Vaporizer] + streak dy=${sDY} (chars=${charCount}, instant=${instantMode})`);
- for (let sdx = -radius; sdx <= radius; sdx++) {
- if (sdx * sdx + sDY * sDY <= radius * radius) {
- w.changeColor(2);
- writeCharAt(randChar(), 2, startX + sdx, startY + sDY);
- charCount++;
- await tick();
- if (Date.now() - t0 >= 30000) break;
- }
- }
- }
- await tick();
- }
- console.log(`[Vaporizer] Explosion finished - ${charCount} chars in 30s (instant=${instantMode})`);
- // ══════════════════════════════════════════════════════════════════
- // Step 7: clear explosion area
- // ══════════════════════════════════════════════════════════════════
- w.changeColor(0);
- for (const pos of positions) {
- writeCharAt(" ", 0, startX + pos.dx, startY + pos.dy);
- await tick();
- }
- // ══════════════════════════════════════════════════════════════════
- // Step 8: aftermath
- // ══════════════════════════════════════════════════════════════════
- if (altAftermathEnabled) {
- console.log("[Vaporizer] Alt aftermath: CID 0 square (radius 3)");
- for (let dy = -3; dy <= 3; dy++) {
- for (let dx = -3; dx <= 3; dx++) {
- w.changeColor(0);
- writeCharAt(" ", 0, startX + dx, startY + dy);
- await tick();
- }
- }
- } else {
- console.log("[Vaporizer] Burn marks + debris aftermath...");
- for (const pos of burnPositions) {
- const dist = Math.sqrt(pos.dx * pos.dx + pos.dy * pos.dy);
- if (dist > radius - 1) {
- if (randInt(0, 2) === 0) {
- const cid = burnCIDs[randInt(0, 2)];
- w.changeColor(cid);
- writeCharAt(randBurnChar(), cid, startX + pos.dx, startY + pos.dy);
- await tick();
- }
- } else {
- if (randInt(0, 6) === 0) {
- const cid = burnCIDs[randInt(0, 2)];
- w.changeColor(cid);
- writeCharAt(randBurnChar(), cid, startX + pos.dx, startY + pos.dy);
- await tick();
- }
- }
- }
- }
- // ── done ────────────────────────────────────────────────────────
- chatSend("Explosion done, ending script.");
- console.log("[Vaporizer] Script ended. Full chat log:", chatLog);
- running = false;
- delete window.eRadius;
- delete window.instant;
- delete window.shockwave;
- delete window.altAftermath;
- if (observer) observer.disconnect();
- if (pollTimer) clearInterval(pollTimer);
- const unbinders = [
- [w.events, "removeListener"], [w.events, "off"],
- [w, "removeListener"], [w, "off"]
- ];
- for (const [target, method] of unbinders) {
- if (target && typeof target[method] === "function") {
- evNames.forEach(n => { try { target[method](n, rawHandler); } catch(e){} });
- }
- }
- console.log("[Vaporizer] All listeners cleaned up.");
- })();
Advertisement