ZeroAd Engine

Bypass ads and skip interruptions in HTML5 games. Instantly auto-completes Poki SDK ads (commercialBreak/rewardedBreak), AdInPlay ads, and CrazyGames reward overlays/promo screens. Blocks iframes, video ads, intrusive containers, and adblock detection warnings. Improved future-proof AdInPlay bypass + adblock evasion (tested on taming.io, Poki, CrazyGames, Ninja.io).

2026-02-11 기준 버전입니다. 최신 버전을 확인하세요.

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램을 설치해야 합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name ZeroAd Engine
// @namespace http://tampermonkey.net/
// @version 2026.02.12.1
// @description Bypass ads and skip interruptions in HTML5 games. Instantly auto-completes Poki SDK ads (commercialBreak/rewardedBreak), AdInPlay ads, and CrazyGames reward overlays/promo screens. Blocks iframes, video ads, intrusive containers, and adblock detection warnings. Improved future-proof AdInPlay bypass + adblock evasion (tested on taming.io, Poki, CrazyGames, Ninja.io).
// @author Updated with Grok
// @match *://*/*
// @license MIT
// @grant none
// ==/UserScript==

(function () {
    'use strict';

    /////////////////////////////////////////////
    // [1] Robust Direct Function Patch for PokiSDK
    /////////////////////////////////////////////

    function patchPokiSDK() {
        if (typeof window.PokiSDK !== 'object') return false;

        const sdk = window.PokiSDK;

        if (sdk.__patched) return true;
        sdk.__patched = true;

        const instantResolve = (value = undefined) => Promise.resolve(value);

        if (typeof sdk.init === 'function') {
            sdk.init = function (...args) {
                console.log('[AdBypasser] 🚀 PokiSDK.init instantly resolved');
                return instantResolve();
            };
        }

        if (typeof sdk.commercialBreak === 'function') {
            sdk.commercialBreak = function (onStart) {
                console.log('[AdBypasser] ⏭ PokiSDK.commercialBreak skipped');
                if (typeof onStart === 'function') onStart();
                return instantResolve();
            };
        }

        if (typeof sdk.rewardedBreak === 'function') {
            sdk.rewardedBreak = function (options = {}) {
                console.log('[AdBypasser] 🎁 PokiSDK.rewardedBreak instantly rewarded');
                if (typeof options === 'function') options();
                else if (typeof options.onStart === 'function') options.onStart();
                return instantResolve(true);
            };
        }

        if (typeof sdk.displayAd === 'function') {
            sdk.displayAd = function () {
                console.log('[AdBypasser] 🚫 PokiSDK.displayAd blocked');
                return instantResolve();
            };
        }

        if (typeof sdk.destroyAd === 'function') {
            sdk.destroyAd = function () {
                console.log('[AdBypasser] 🗑️ PokiSDK.destroyAd suppressed');
            };
        }

        console.log('[AdBypasser] 🧠 PokiSDK fully patched');
        return true;
    }

    /////////////////////////////////////////////
    // [2] Enhanced AdInPlay SDK Patch (future-proof + callback/promise support)
    /////////////////////////////////////////////

    function patchAdInPlay() {
        if (typeof window.adinplay !== 'object' || window.adinplay.__patched) return;

        window.adinplay.__patched = true;
        console.log('[AdBypasser] 🔒 AdInPlay SDK neutralized (enhanced)');

        const blockedMethods = [
            'play', 'preroll', 'midroll', 'postroll', 'banner',
            'rewarded', 'reward', 'rewardVideo', 'interstitial',
            'show', 'showAd', 'display', 'displayAd', 'init'
        ];

        window.adinplay = new Proxy(window.adinplay, {
            get(target, prop) {
                if (blockedMethods.includes(prop)) {
                    return (...args) => {
                        console.log(`[AdBypasser] ⛔ AdInPlay.${String(prop)}() blocked & resolved`);
                        // Call any callbacks (common pattern)
                        args.forEach(arg => {
                            if (typeof arg === 'function') arg();
                        });
                        // Resolve with success for rewarded types
                        const isRewarded = /reward/i.test(String(prop));
                        return Promise.resolve(isRewarded ? true : undefined);
                    };
                }
                return target[prop];
            }
        });
    }

    /////////////////////////////////////////////
    // [3] DOM Ad + Adblock Warning Nuker Selectors
    /////////////////////////////////////////////

    const adSelectors = [
        '#preroll', '#adsbox',
        'iframe[src*="ads"]', 'iframe[title="Advertisement"]',
        'video[title="Advertisement"]',
        '[id^="ad_"]', '[id$="_ad"]', '[id="ad"]',
        '[class="ad"]', '[class^="ad-"]', '[class$="-ad"]',
        '[class~="ad-banner"]', '[class~="adbox"]', '[class~="adunit"]',
        '[class*="pokiSdk"]', 'div[id^="google_ads"]', 'div[id^="div-gpt"]',
        'div[class*="banner-ad"]', 'div[class*="ad-wrapper"]',
        'script[src*="ads"]',
        '.pokiSdkContainer', '.pokiSdkVideoContainer', '.pokiSDKAdContainer',
        '.pokiSdkSpinnerContainer', '.pokiSdkPauseButtonContainer', '.pokiSdkStartAdButton',
        '.ad-container', '.video-ad', '.interstitial-ad', '.rewarded-ad',
        '[class*="poki-pill"]', '.poki-pill',
        // Adblock detection/warning overlays (common patterns)
        '[class*="adblock"]', '[id*="adblock"]',
        '[class*="blocker"]', '[id*="blocker"]',
        '.adblock-warning', '.adblocker-modal', '.adblock-detected',
        '#adblock', '#disableAdblock', '.please-disable-adblock',
        '.adb-modal', '.adblocker-message', '.disable-adblock-message'
    ];

    const removedSelectors = new Set();

    function removeAdElements() {
        adSelectors.forEach(selector => {
            const elements = document.querySelectorAll(selector);
            if (elements.length > 0) {
                elements.forEach(el => el.remove());
                if (!removedSelectors.has(selector)) {
                    console.log(`[AdBypasser] 💣 Removed: ${selector}`);
                    removedSelectors.add(selector);
                }
            }
        });
    }

    function safeRemoveAdElements() {
        if ('requestIdleCallback' in window) {
            requestIdleCallback(removeAdElements, { timeout: 100 });
        } else {
            setTimeout(removeAdElements, 0);
        }
    }

    /////////////////////////////////////////////
    // [4] CrazyGames Promo Skip
    /////////////////////////////////////////////

    function handleCrazyGamesPromo() {
        const btn = document.getElementById('mainContinuePlayingButton');
        if (btn) {
            console.log('[AdBypasser] 🎯 CrazyGames promo detected — auto-clicking Continue');
            btn.click();
            let promoDiv = btn.closest('div.MuiGrid-root');
            if (promoDiv) {
                promoDiv.remove();
                console.log('[AdBypasser] 💥 CrazyGames promo container removed');
            }
        }
    }

    /////////////////////////////////////////////
    // [5] MutationObserver
    /////////////////////////////////////////////

    function startMutationWatch() {
        const observer = new MutationObserver(() => {
            patchAdInPlay();
            safeRemoveAdElements();
            handleCrazyGamesPromo();
        });

        observer.observe(document.documentElement, {
            childList: true,
            subtree: true
        });

        console.log('[AdBypasser] 👁️ MutationObserver activated');
    }

    /////////////////////////////////////////////
    // [6] Iframe Ad Remover
    /////////////////////////////////////////////

    const iframeObserver = new MutationObserver(() => {
        document.querySelectorAll('iframe').forEach(iframe => {
            try {
                const src = iframe.src || iframe.getAttribute('src');
                if (src && /ads|doubleclick|preroll|videoads/i.test(src)) {
                    iframe.remove();
                    console.log('[AdBypasser] 🪓 Removed suspicious iframe:', src);
                }
            } catch (e) { }
        });
    });

    iframeObserver.observe(document.body || document.documentElement, {
        childList: true,
        subtree: true
    });

    /////////////////////////////////////////////
    // [7] Initialization
    /////////////////////////////////////////////

    window.addEventListener('DOMContentLoaded', () => {
        let attempts = 0;
        const maxAttempts = 20;
        const interval = setInterval(() => {
            if (patchPokiSDK() || attempts++ >= maxAttempts) {
                clearInterval(interval);
                if (attempts >= maxAttempts) {
                    console.warn('[AdBypasser] PokiSDK patch timeout');
                }
            }
        }, 800);

        patchAdInPlay();
        safeRemoveAdElements();
        handleCrazyGamesPromo();
        startMutationWatch();
    });

    const runtime = setInterval(() => {
        patchPokiSDK();
        patchAdInPlay();
        safeRemoveAdElements();
        handleCrazyGamesPromo();
    }, 1000);

    setTimeout(() => {
        clearInterval(runtime);
        console.log('[AdBypasser] 🛑 Startup interval cleared');
    }, 30000);

})();