Skip to content

Latest commit

 

History

History
30 lines (20 loc) · 14.6 KB

File metadata and controls

30 lines (20 loc) · 14.6 KB

OpenFrontIO-AutoClicker

AutoClicker for Openfront.io is a fully functioning script that is made to carry out actions in OpenFrontIO faster.

How to Use

Copy the following code(or copy from Main.js) and save it as a book mark on your browser, then click it while in a game

javascript:(()=>{const COUNT=50,TYPE="Atom Bomb",KEY="__openfrontNukeBatch_v2";if(window[KEY]){window[KEY].abort();delete window[KEY];alert("OpenFront nuke macro OFF");return}const menu=document.querySelector("build-menu");if(!menu?.game||!menu.eventBus||!menu.transformHandler||typeof menu.sendBuildOrUpgrade!=="function"){alert("Join a running game before activating this bookmark.");return}let template;try{menu.sendBuildOrUpgrade.call({eventBus:{emit(event){template=event}},uiState:{rocketDirectionUp:true},hideMenu(){}},{type:TYPE,canBuild:true,canUpgrade:false},0)}catch(error){console.error("[OpenFront] Setup error:",error)}if(!template||template.unit!==TYPE){alert("Could not locate the build event. The game interface may have changed.");return}const BuildEvent=template.constructor,controller=new AbortController(),options={capture:true,signal:controller.signal};let held=false,pressed=false;const editing=event=>event.composedPath().some(node=>node?.isContentEditable||["INPUT","TEXTAREA","SELECT"].includes(node?.tagName));const onMap=event=>event.composedPath().some(node=>node?.id==="game-input-overlay"||node?.tagName==="CANVAS");const swallow=event=>{event.preventDefault();event.stopImmediatePropagation()};window.addEventListener("keydown",event=>{if(event.code==="KeyX"&&!event.ctrlKey&&!event.altKey&&!event.metaKey&&!editing(event)){held=true;swallow(event)}},options);window.addEventListener("keyup",event=>{if(event.code==="KeyX"){held=false;if(!editing(event))swallow(event)}},options);window.addEventListener("blur",()=>{held=false;pressed=false},{signal:controller.signal});document.addEventListener("visibilitychange",()=>{if(document.hidden){held=false;pressed=false}},{signal:controller.signal});window.addEventListener("pointerdown",event=>{if(event.button!==0||!held||editing(event)||!onMap(event))return;pressed=true;swallow(event);try{if(document.querySelector("build-menu")!==menu)throw new Error("Game changed. Toggle the bookmark off and on again.");const world=menu.transformHandler.screenToWorldCoordinates(event.clientX,event.clientY);if(!world||!menu.game.isValidCoord(world.x,world.y))throw new Error("Cursor is outside the map.");const tile=menu.game.ref(world.x,world.y);const request=new BuildEvent(TYPE,tile);request.unit=TYPE;request.tile=tile;request.rocketDirectionUp=typeof menu.uiState?.rocketDirectionUp==="boolean"?menu.uiState.rocketDirectionUp:true;request.amount=COUNT;console.info("[OpenFront] Sending nuke batch:",{unit:request.unit,tile:request.tile,rocketDirectionUp:request.rocketDirectionUp,amount:request.amount});menu.eventBus.emit(request)}catch(error){console.error("[OpenFront] Nuke macro error:",error);alert("Nuke macro error: "+error.message)}},options);for(const type of ["mousedown","mouseup","pointerup","click","pointercancel"]){window.addEventListener(type,event=>{if(!pressed||event.button>0)return;swallow(event);if(type==="click"||type==="pointercancel")pressed=false},options)}window[KEY]=controller;alert("Hold a key + left-click the map\n\nX - Nuke\nZ - Port\nV - SAM\nB - Missile silo")})();(()=>{const KEY="__of_port_macro__",old=window[KEY];if(old){old.stop();delete window[KEY];console.log("[OpenFront] Port macro OFF");return}const menu=document.querySelector("build-menu"),bus=menu?.eventBus,game=menu?.game,transform=menu?.transformHandler;if(!menu||!bus||!game||!transform){console.error("[OpenFront] Could not find the active game%27s BuildMenu/EventBus. Run this inside a match.");return}let upgradeCtor=null,buildCtor=null,busy=false,zHeld=false,macroPointer=false;const captureEvent=(bu,tile)=>{let captured=null;const originalEmit=bus.emit;const originalHide=menu.hideMenu;try{bus.emit=function(ev){captured=ev};menu.hideMenu=function(){};menu.sendBuildOrUpgrade(bu,tile)}catch(e){console.error("[OpenFront] Could not discover event type:",e)}finally{bus.emit=originalEmit;menu.hideMenu=originalHide}return captured?.constructor||null};const typing=e=>{const t=e.target;return !!(t&&(t.closest?.("input,textarea,select,[contenteditable=%27true%27]")||t.isContentEditable))};const keydown=e=>{if(e.code!=="KeyZ"||typing(e))return;zHeld=true;e.preventDefault();e.stopImmediatePropagation()};const keyup=e=>{if(e.code!=="KeyZ")return;zHeld=false;e.preventDefault();e.stopImmediatePropagation()};const blur=()=>{zHeld=false;macroPointer=false;busy=false};const pointerdown=async e=>{if(e.button!==0||!zHeld||typing(e))return;if(!document.body.classList.contains("in-game"))return;if(!e.target?.closest?.("#game-input-overlay"))return;macroPointer=true;e.preventDefault();e.stopImmediatePropagation();if(busy)return;busy=true;try{if(game.inSpawnPhase?.())return;const cell=transform.screenToWorldCoordinates(e.clientX,e.clientY);if(!game.isValidCoord(cell.x,cell.y))return;const tile=game.ref(cell.x,cell.y);const player=game.myPlayer?.();if(!player)return;const list=await player.buildables(tile,["Port"]);const bu=list.find(x=>x.type==="Port");if(!bu)return;if(bu.canUpgrade!==false){upgradeCtor??=captureEvent(bu,tile);if(!upgradeCtor){console.error("[OpenFront] Could not locate UpgradeStructureIntentEvent");return}const id=bu.canUpgrade;bus.emit(new upgradeCtor(id,bu.type,50));bus.emit(new upgradeCtor(id,bu.type,50));console.log("[OpenFront] Port upgrade: up to 100 levels")}else if(bu.canBuild!==false){buildCtor??=captureEvent(bu,tile);if(!buildCtor){console.error("[OpenFront] Could not locate BuildUnitIntentEvent");return}bus.emit(new buildCtor(bu.type,tile));console.log("[OpenFront] Built Port")}else{console.log("[OpenFront] No valid Port build/upgrade here")}}catch(err){console.error("[OpenFront] Port macro error:",err)}finally{busy=false}};const pointerup=e=>{if(!macroPointer)return;macroPointer=false;e.preventDefault();e.stopImmediatePropagation()};window.addEventListener("keydown",keydown,true);window.addEventListener("keyup",keyup,true);window.addEventListener("blur",blur,true);window.addEventListener("pointerdown",pointerdown,true);window.addEventListener("pointerup",pointerup,true);window.addEventListener("pointercancel",pointerup,true);window[KEY]={stop(){window.removeEventListener("keydown",keydown,true);window.removeEventListener("keyup",keyup,true);window.removeEventListener("blur",blur,true);window.removeEventListener("pointerdown",pointerdown,true);window.removeEventListener("pointerup",pointerup,true);window.removeEventListener("pointercancel",pointerup,true)}};console.log("[OpenFront] Port macro ON — hold Z + left click")})();(()=>{const KEY="__of_sam_macro__",old=window[KEY];if(old){old.stop();delete window[KEY];console.log("[OpenFront] SAM macro OFF");return}const menu=document.querySelector("build-menu"),bus=menu?.eventBus,game=menu?.game,transform=menu?.transformHandler;if(!menu||!bus||!game||!transform){console.error("[OpenFront] Could not find the active game%27s BuildMenu/EventBus. Run this inside a match.");return}let upgradeCtor=null,buildCtor=null,busy=false,vHeld=false,macroPointer=false;const captureEvent=(bu,tile)=>{let captured=null;const originalEmit=bus.emit;const originalHide=menu.hideMenu;try{bus.emit=function(ev){captured=ev};menu.hideMenu=function(){};menu.sendBuildOrUpgrade(bu,tile)}catch(e){console.error("[OpenFront] Could not discover event type:",e)}finally{bus.emit=originalEmit;menu.hideMenu=originalHide}return captured?.constructor||null};const typing=e=>{const t=e.target;return !!(t&&(t.closest?.("input,textarea,select,[contenteditable=%27true%27]")||t.isContentEditable))};const keydown=e=>{if(e.code!=="KeyV"||typing(e))return;vHeld=true;e.preventDefault();e.stopImmediatePropagation()};const keyup=e=>{if(e.code!=="KeyV")return;vHeld=false;e.preventDefault();e.stopImmediatePropagation()};const blur=()=>{vHeld=false;macroPointer=false;busy=false};const pointerdown=async e=>{if(e.button!==0||!vHeld||typing(e))return;if(!document.body.classList.contains("in-game"))return;if(!e.target?.closest?.("#game-input-overlay"))return;macroPointer=true;e.preventDefault();e.stopImmediatePropagation();if(busy)return;busy=true;try{if(game.inSpawnPhase?.())return;const cell=transform.screenToWorldCoordinates(e.clientX,e.clientY);if(!game.isValidCoord(cell.x,cell.y))return;const tile=game.ref(cell.x,cell.y);const player=game.myPlayer?.();if(!player)return;const list=await player.buildables(tile,["SAM Launcher"]);const bu=list.find(x=>x.type==="SAM Launcher");if(!bu)return;if(bu.canUpgrade!==false){upgradeCtor??=captureEvent(bu,tile);if(!upgradeCtor){console.error("[OpenFront] Could not locate UpgradeStructureIntentEvent");return}const id=bu.canUpgrade;bus.emit(new upgradeCtor(id,bu.type,50));bus.emit(new upgradeCtor(id,bu.type,50));console.log("[OpenFront] SAM upgrade: up to 100 levels")}else if(bu.canBuild!==false){buildCtor??=captureEvent(bu,tile);if(!buildCtor){console.error("[OpenFront] Could not locate BuildUnitIntentEvent");return}bus.emit(new buildCtor(bu.type,tile));console.log("[OpenFront] Built SAM Launcher")}else{console.log("[OpenFront] No valid SAM build/upgrade here")}}catch(err){console.error("[OpenFront] SAM macro error:",err)}finally{busy=false}};const pointerup=e=>{if(!macroPointer)return;macroPointer=false;e.preventDefault();e.stopImmediatePropagation()};window.addEventListener("keydown",keydown,true);window.addEventListener("keyup",keyup,true);window.addEventListener("blur",blur,true);window.addEventListener("pointerdown",pointerdown,true);window.addEventListener("pointerup",pointerup,true);window.addEventListener("pointercancel",pointerup,true);window[KEY]={stop(){window.removeEventListener("keydown",keydown,true);window.removeEventListener("keyup",keyup,true);window.removeEventListener("blur",blur,true);window.removeEventListener("pointerdown",pointerdown,true);window.removeEventListener("pointerup",pointerup,true);window.removeEventListener("pointercancel",pointerup,true)}};console.log("[OpenFront] SAM macro ON — hold V + left click")})();(()=>{const KEY="__of_missile_silo_macro__",old=window[KEY];if(old){old.stop();delete window[KEY];console.log("[OpenFront] Missile Silo macro OFF");return}const menu=document.querySelector("build-menu"),bus=menu?.eventBus,game=menu?.game,transform=menu?.transformHandler;if(!menu||!bus||!game||!transform){console.error("[OpenFront] Could not find the active game%27s BuildMenu/EventBus. Run this inside a match.");return}let upgradeCtor=null,buildCtor=null,busy=false,bHeld=false,macroPointer=false;const captureEvent=(bu,tile)=>{let captured=null;const originalEmit=bus.emit;const originalHide=menu.hideMenu;try{bus.emit=function(ev){captured=ev};menu.hideMenu=function(){};menu.sendBuildOrUpgrade(bu,tile)}catch(e){console.error("[OpenFront] Could not discover event type:",e)}finally{bus.emit=originalEmit;menu.hideMenu=originalHide}return captured?.constructor||null};const typing=e=>{const t=e.target;return !!(t&&(t.closest?.("input,textarea,select,[contenteditable=%27true%27]")||t.isContentEditable))};const keydown=e=>{if(e.code!=="KeyB"||typing(e))return;bHeld=true;e.preventDefault();e.stopImmediatePropagation()};const keyup=e=>{if(e.code!=="KeyB")return;bHeld=false;e.preventDefault();e.stopImmediatePropagation()};const blur=()=>{bHeld=false;macroPointer=false;busy=false};const pointerdown=async e=>{if(e.button!==0||!bHeld||typing(e))return;if(!document.body.classList.contains("in-game"))return;if(!e.target?.closest?.("#game-input-overlay"))return;macroPointer=true;e.preventDefault();e.stopImmediatePropagation();if(busy)return;busy=true;try{if(game.inSpawnPhase?.())return;const cell=transform.screenToWorldCoordinates(e.clientX,e.clientY);if(!game.isValidCoord(cell.x,cell.y))return;const tile=game.ref(cell.x,cell.y);const player=game.myPlayer?.();if(!player)return;const list=await player.buildables(tile);const bu=list.find(x=>x.type==="Missile Silo");if(!bu){console.log("[OpenFront] Missile Silo is not available at this tile");return}if(bu.canUpgrade!==false){upgradeCtor??=captureEvent(bu,tile);if(!upgradeCtor){console.error("[OpenFront] Could not locate UpgradeStructureIntentEvent");return}const id=bu.canUpgrade;bus.emit(new upgradeCtor(id,bu.type,50));bus.emit(new upgradeCtor(id,bu.type,50));console.log("[OpenFront] Missile Silo upgrade: up to 100 levels")}else if(bu.canBuild!==false){buildCtor??=captureEvent(bu,tile);if(!buildCtor){console.error("[OpenFront] Could not locate BuildUnitIntentEvent");return}bus.emit(new buildCtor(bu.type,tile));console.log("[OpenFront] Built Missile Silo")}else{console.log("[OpenFront] Cannot build or upgrade Missile Silo here")}}catch(err){console.error("[OpenFront] Missile Silo macro error:",err)}finally{busy=false}};const pointerup=e=>{if(!macroPointer)return;macroPointer=false;e.preventDefault();e.stopImmediatePropagation()};window.addEventListener("keydown",keydown,true);window.addEventListener("keyup",keyup,true);window.addEventListener("blur",blur,true);window.addEventListener("pointerdown",pointerdown,true);window.addEventListener("pointerup",pointerup,true);window.addEventListener("pointercancel",pointerup,true);window[KEY]={stop(){window.removeEventListener("keydown",keydown,true);window.removeEventListener("keyup",keyup,true);window.removeEventListener("blur",blur,true);window.removeEventListener("pointerdown",pointerdown,true);window.removeEventListener("pointerup",pointerup,true);window.removeEventListener("pointercancel",pointerup,true)}};console.log("[OpenFront] Missile Silo macro ON — hold B + left click")})();

Hold the corresponding key and click where you want the building/nuke to be built, and it will be build at there for the corresponding amount assuming you have enough gold. Holding the key and rapidly clicking allows you to build a large amount within a short period of time.

Key (Hold) Action
x Launch 50 Nuke
z Build/Upgrade 100 Port
v Build/Upgrade 100 Sam
b Build/Upgrade 100 Silo

Context

I like to play custom games with large gold multiplier, in which case it would be exhausting to upgrade hundreds of levels of building and launch thousands batches of nuke, so this script is wrote to upgrade and launch at a faster rate by applying a multiplier

For example in a 50x Gold "Nuke War" custom game, players often struggle to launch nuke fast enough to penetrate enemy air defense(SAM) despite sufficient gold

This script is made by backward engineering the source code published on https://github.com/openfrontio/openfrontio

Play the game on https://openfront.io

This is NOT a cheating script, this script does not let you gain more resource than what you already have, all it does is improving experience and help you carry out instruction faster