-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMain.js
More file actions
1 lines (1 loc) · 13.1 KB
/
Copy pathMain.js
File metadata and controls
1 lines (1 loc) · 13.1 KB
1
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")})();