Untitled
unknown
plain_text
a year ago
16 kB
10
Indexable
// ==UserScript== // @name Harmony's tests_muff // @namespace https://www.bondageprojects.com/ // @version 1.0.3 // @description My random tests // @author Harmony // @match https://bondageprojects.elementfx.com/* // @match https://www.bondageprojects.elementfx.com/* // @match https://bondage-europe.com/* // @match https://www.bondage-europe.com/* // @icon https://www.google.com/s2/favicons?sz=64&domain=bondage-europe.com // @grant none // ==/UserScript== (function() { 'use strict'; var bcModSdk=function(){"use strict";const e="1.1.0";function o(e){alert("Mod ERROR:\n"+e);const o=new Error(e);throw console.error(o),o}const t=new TextEncoder;function n(e){return!!e&&"object"==typeof e&&!Array.isArray(e)}function r(e){const o=new Set;return e.filter((e=>!o.has(e)&&o.add(e)))}const i=new Map,a=new Set;function d(e){a.has(e)||(a.add(e),console.warn(e))}function s(e){const o=[],t=new Map,n=new Set;for(const r of p.values()){const i=r.patching.get(e.name);if(i){o.push(...i.hooks);for(const[o,a]of i.patches.entries())t.has(o)&&t.get(o)!==a&&d(`ModSDK: Mod '${r.name}' is patching function ${e.name} with same pattern that is already applied by different mod, but with different pattern:\nPattern:\n${o}\nPatch1:\n${t.get(o)||""}\nPatch2:\n${a}`),t.set(o,a),n.add(r.name)}}o.sort(((e,o)=>o.priority-e.priority));const r=function(e,o){if(0===o.size)return e;let t=e.toString().replaceAll("\r\n","\n");for(const[n,r]of o.entries())t.includes(n)||d(`ModSDK: Patching ${e.name}: Patch ${n} not applied`),t=t.replaceAll(n,r);return(0,eval)(`(${t})`)}(e.original,t);let i=function(o){var t,i;const a=null===(i=(t=m.errorReporterHooks).hookChainExit)||void 0===i?void 0:i.call(t,e.name,n),d=r.apply(this,o);return null==a||a(),d};for(let t=o.length-1;t>=0;t--){const n=o[t],r=i;i=function(o){var t,i;const a=null===(i=(t=m.errorReporterHooks).hookEnter)||void 0===i?void 0:i.call(t,e.name,n.mod),d=n.hook.apply(this,[o,e=>{if(1!==arguments.length||!Array.isArray(o))throw new Error(`Mod ${n.mod} failed to call next hook: Expected args to be array, got ${typeof e}`);return r.call(this,e)}]);return null==a||a(),d}}return{hooks:o,patches:t,patchesSources:n,enter:i,final:r}}function c(e,o=!1){let r=i.get(e);if(r)o&&(r.precomputed=s(r));else{let o=window;const a=e.split(".");for(let t=0;t<a.length-1;t++)if(o=o[a[t]],!n(o))throw new Error(`ModSDK: Function ${e} to be patched not found; ${a.slice(0,t+1).join(".")} is not object`);const d=o[a[a.length-1]];if("function"!=typeof d)throw new Error(`ModSDK: Function ${e} to be patched not found`);const c=function(e){let o=-1;for(const n of t.encode(e)){let e=255&(o^n);for(let o=0;o<8;o++)e=1&e?-306674912^e>>>1:e>>>1;o=o>>>8^e}return((-1^o)>>>0).toString(16).padStart(8,"0").toUpperCase()}(d.toString().replaceAll("\r\n","\n")),l={name:e,original:d,originalHash:c};r=Object.assign(Object.assign({},l),{precomputed:s(l),router:()=>{},context:o,contextProperty:a[a.length-1]}),r.router=function(e){return function(...o){return e.precomputed.enter.apply(this,[o])}}(r),i.set(e,r),o[r.contextProperty]=r.router}return r}function l(){const e=new Set;for(const o of p.values())for(const t of o.patching.keys())e.add(t);for(const o of i.keys())e.add(o);for(const o of e)c(o,!0)}function f(){const e=new Map;for(const[o,t]of i)e.set(o,{name:o,original:t.original,originalHash:t.originalHash,sdkEntrypoint:t.router,currentEntrypoint:t.context[t.contextProperty],hookedByMods:r(t.precomputed.hooks.map((e=>e.mod))),patchedByMods:Array.from(t.precomputed.patchesSources)});return e}const p=new Map;function u(e){p.get(e.name)!==e&&o(`Failed to unload mod '${e.name}': Not registered`),p.delete(e.name),e.loaded=!1,l()}function g(e,t,r){"string"==typeof e&&"string"==typeof t&&(alert(`Mod SDK warning: Mod '${e}' is registering in a deprecated way.\nIt will work for now, but please inform author to update.`),e={name:e,fullName:e,version:t},t={allowReplace:!0===r}),e&&"object"==typeof e||o("Failed to register mod: Expected info object, got "+typeof e),"string"==typeof e.name&&e.name||o("Failed to register mod: Expected name to be non-empty string, got "+typeof e.name);let i=`'${e.name}'`;"string"==typeof e.fullName&&e.fullName||o(`Failed to register mod ${i}: Expected fullName to be non-empty string, got ${typeof e.fullName}`),i=`'${e.fullName} (${e.name})'`,"string"!=typeof e.version&&o(`Failed to register mod ${i}: Expected version to be string, got ${typeof e.version}`),e.repository||(e.repository=void 0),void 0!==e.repository&&"string"!=typeof e.repository&&o(`Failed to register mod ${i}: Expected repository to be undefined or string, got ${typeof e.version}`),null==t&&(t={}),t&&"object"==typeof t||o(`Failed to register mod ${i}: Expected options to be undefined or object, got ${typeof t}`);const a=!0===t.allowReplace,d=p.get(e.name);d&&(d.allowReplace&&a||o(`Refusing to load mod ${i}: it is already loaded and doesn't allow being replaced.\nWas the mod loaded multiple times?`),u(d));const s=e=>{"string"==typeof e&&e||o(`Mod ${i} failed to patch a function: Expected function name string, got ${typeof e}`);let t=g.patching.get(e);return t||(t={hooks:[],patches:new Map},g.patching.set(e,t)),t},f={unload:()=>u(g),hookFunction:(e,t,n)=>{g.loaded||o(`Mod ${i} attempted to call SDK function after being unloaded`);const r=s(e);"number"!=typeof t&&o(`Mod ${i} failed to hook function '${e}': Expected priority number, got ${typeof t}`),"function"!=typeof n&&o(`Mod ${i} failed to hook function '${e}': Expected hook function, got ${typeof n}`);const a={mod:g.name,priority:t,hook:n};return r.hooks.push(a),l(),()=>{const e=r.hooks.indexOf(a);e>=0&&(r.hooks.splice(e,1),l())}},patchFunction:(e,t)=>{g.loaded||o(`Mod ${i} attempted to call SDK function after being unloaded`);const r=s(e);n(t)||o(`Mod ${i} failed to patch function '${e}': Expected patches object, got ${typeof t}`);for(const[n,a]of Object.entries(t))"string"==typeof a?r.patches.set(n,a):null===a?r.patches.delete(n):o(`Mod ${i} failed to patch function '${e}': Invalid format of patch '${n}'`);l()},removePatches:e=>{g.loaded||o(`Mod ${i} attempted to call SDK function after being unloaded`);s(e).patches.clear(),l()},callOriginal:(e,t,n)=>(g.loaded||o(`Mod ${i} attempted to call SDK function after being unloaded`),"string"==typeof e&&e||o(`Mod ${i} failed to call a function: Expected function name string, got ${typeof e}`),Array.isArray(t)||o(`Mod ${i} failed to call a function: Expected args array, got ${typeof t}`),function(e,o,t=window){return c(e).original.apply(t,o)}(e,t,n)),getOriginalHash:e=>("string"==typeof e&&e||o(`Mod ${i} failed to get hash: Expected function name string, got ${typeof e}`),c(e).originalHash)},g={name:e.name,fullName:e.fullName,version:e.version,repository:e.repository,allowReplace:a,api:f,loaded:!0,patching:new Map};return p.set(e.name,g),Object.freeze(f)}function h(){const e=[];for(const o of p.values())e.push({name:o.name,fullName:o.fullName,version:o.version,repository:o.repository});return e}let m;const y=function(){if(void 0===window.bcModSdk)return window.bcModSdk=function(){const o={version:e,apiVersion:1,registerMod:g,getModsInfo:h,getPatchingInfo:f,errorReporterHooks:Object.seal({hookEnter:null,hookChainExit:null})};return m=o,Object.freeze(o)}();if(n(window.bcModSdk)||o("Failed to init Mod SDK: Name already in use"),1!==window.bcModSdk.apiVersion&&o(`Failed to init Mod SDK: Different version already loaded ('1.1.0' vs '${window.bcModSdk.version}')`),window.bcModSdk.version!==e&&(alert(`Mod SDK warning: Loading different but compatible versions ('1.1.0' vs '${window.bcModSdk.version}')\nOne of mods you are using is using an old version of SDK. It will work for now but please inform author to update`),window.bcModSdk.version.startsWith("1.0.")&&void 0===window.bcModSdk._shim10register)){const e=window.bcModSdk,o=Object.freeze(Object.assign(Object.assign({},e),{registerMod:(o,t,n)=>o&&"object"==typeof o&&"string"==typeof o.name&&"string"==typeof o.version?e.registerMod(o.name,o.version,"object"==typeof t&&!!t&&!0===t.allowReplace):e.registerMod(o,t,n),_shim10register:!0}));window.bcModSdk=o}return window.bcModSdk}();return"undefined"!=typeof exports&&(Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=y),y}(); const hrt = bcModSdk.registerMod({ name: 'HarmsRT', fullName: 'harmony\'s random tests', version: '1.0.3', }); const hrtGameVersion = parseInt(GameVersion.substring(1, 4)); window.hrtSettings = { mapCheats: false, cameraLocked: true, cameraX: 0, cameraY: 0 }; // Cheat mode hrt.patchFunction( 'ChatRoomMapDrawGrid', { 'X - Player.MapData.Pos.X': 'X - (window.hrtSettings.cameraLocked ? Player.MapData.Pos.X : window.hrtSettings.cameraX)', 'Y - Player.MapData.Pos.Y': 'Y - (window.hrtSettings.cameraLocked ? Player.MapData.Pos.Y : window.hrtSettings.cameraY)', } ); function DrawButtonSize(Left, Top, Width, Height, Label, Color, Image, HoveringText, Disabled) { ControllerAddActiveArea(Left, Top); // Draw the button rectangle (makes the background color cyan if the mouse is over it) MainCanvas.beginPath(); MainCanvas.rect(Left, Top, Width, Height); MainCanvas.fillStyle = ((MouseX >= Left) && (MouseX <= Left + Width) && (MouseY >= Top) && (MouseY <= Top + Height) && !CommonIsMobile && !Disabled) ? "Cyan" : Color; MainCanvas.fillRect(Left, Top, Width, Height); MainCanvas.fill(); MainCanvas.lineWidth = 2; MainCanvas.strokeStyle = 'black'; MainCanvas.stroke(); MainCanvas.closePath(); // Draw the text or image DrawTextFit(Label, Left + Width / 2, Top + (Height / 2) + 1, Width - 4, "black"); if ((Image != null) && (Image != "")) DrawImageResize(Image, Left + 2, Top + 2, Width - 4, Height - 4); // Draw the hovering text if ((HoveringText != null) && (MouseX >= Left) && (MouseX <= Left + Width) && (MouseY >= Top) && (MouseY <= Top + Height) && !CommonIsMobile) { DrawHoverElements.push(() => DrawButtonHover(Left, Top, Width, Height, HoveringText)); } } hrt.hookFunction( 'ChatRoomMapCalculatePerceptionMasks', -200, (args, next) => { if (window.hrtSettings.mapCheats) { ChatRoomMapVisibilityMask.fill(true); ChatRoomMapAudibilityMask.fill(true); return; } return next(args); } ); hrt.hookFunction( 'ChatRoomMapDraw', 0, (args, next) => { next(args); if (window.hrtSettings.mapCheats) { DrawButtonSize(930, 860, 60, 60, "", "White", "Icons/Public.png"); if (!window.hrtSettings.cameraLocked) { DrawButton(860, 720, 60, 60, "", "White", "Icons/Small/North.png"); DrawButton(790, 790, 60, 60, "", "White", "Icons/Small/West.png"); DrawButton(860, 790, 60, 60, "", "White", "Icons/Small/South.png"); DrawButton(930, 790, 60, 60, "", "White", "Icons/Small/East.png"); } } } ); hrt.hookFunction( 'ChatRoomMapMouseDown', 0, (args, next) => { if (MouseIn(930, 860, 60, 60) && window.hrtSettings.mapCheats) { window.hrtSettings.cameraLocked = !window.hrtSettings.cameraLocked; window.hrtSettings.cameraX = Player.MapData.Pos.X; window.hrtSettings.cameraY = Player.MapData.Pos.Y; return; } if (MouseIn(860, 720, 60, 60)) { window.hrtSettings.cameraY -= 1; return; } if (MouseIn(790, 790, 60, 60)) { window.hrtSettings.cameraX -= 1; return; } if (MouseIn(860, 790, 60, 60)) { window.hrtSettings.cameraY += 1; return; } if (MouseIn(930, 790, 60, 60)) { window.hrtSettings.cameraX += 1; return; } next(args); } ); if (hrtGameVersion > 100) { hrt.patchFunction( 'InventoryIsBlockedByDistance', { 'ChatRoomMapHasSuperPowers() || ChatRoomMapCharacterOnInteractionRange(C)': 'ChatRoomMapHasSuperPowers() || ChatRoomMapCharacterOnInteractionRange(C) || window.hrtSettings.mapCheats' } ); } else { hrt.patchFunction( 'DialogDontAllowItemDistance', { 'ChatRoomMapHasSuperPowers() || ChatRoomMapCharacterOnWhisperRange(CurrentCharacter)': 'ChatRoomMapHasSuperPowers() || ChatRoomMapCharacterOnWhisperRange(CurrentCharacter) || window.hrtSettings.mapCheats' } ); } hrt.hookFunction( 'ChatRoomSync', 200, (args, next) => { let r = next(args); if ((ChatRoomData.MapData != null) && (ChatRoomData.MapData.Type != null) && (ChatRoomData.MapData.Type == "Always")) ChatRoomMapActivate(); return r; } ); hrt.patchFunction( 'ChatRoomRun', { 'ChatRoomData.MapData.Type == "Always"': 'ChatRoomData.MapData.Type == "Always" && !window.hrtSettings.mapCheats' } ); hrt.patchFunction( 'ChatRoomMapDraw', { 'ChatRoomData.MapData.Type == "Always"': 'ChatRoomData.MapData.Type == "Always" && !window.hrtSettings.mapCheats'/*, 'ChatRoomData.MapData.Type == "Never"': 'ChatRoomData.MapData.Type == "Never" && !window.hrtSettings.mapCheats'*/ } ); /*hrt.patchFunction( 'ChatRoomMapButton', { 'ChatRoomData.MapData.Type != "Never"': 'ChatRoomData.MapData.Type != "Never" || window.hrtSettings.mapCheats' } );*/ let canvas = document.getElementById('MainCanvas'); let startX; let startY; let dragging = false; canvas.addEventListener('mousedown', function(event) { startX = event.pageX; startY = event.pageY; dragging = true; }); canvas.addEventListener('mousemove', function(event) { if ((CurrentScreen != "ChatRoom") || !ChatRoomMapVisible || ChatRoomChatHidden || ChatRoomMapEditMode != "") return; if (!window.hrtSettings.mapCheats || window.hrtSettings.cameraLocked) return; if (!dragging) return; const endX = event.pageX; const endY = event.pageY; const diffX = endX - startX; const diffY = endY - startY; const TileSize = 1000 / ((ChatRoomMapViewRange * 2) + 1); if (Math.sqrt(diffX * diffX + diffY * diffY) >= 5) { window.hrtSettings.cameraX -= diffX / TileSize; window.hrtSettings.cameraY -= diffY / TileSize; } startX = endX; startY = endY; }); canvas.addEventListener('mouseup', function(event) { dragging = false; }); // Toggle const hrtComms = [ { Tag: 'mapcheats', Action: () => { window.hrtSettings.mapCheats = !window.hrtSettings.mapCheats; ChatRoomSendLocal('Map cheats ' + (window.hrtSettings.mapCheats ? 'en' : 'dis') + 'abled'); if (window.hrtSettings.mapCheats) { ChatRoomMapViewRangeMax = 100; ChatRoomMapCalculatePerceptionMasks(); } else { ChatRoomMapViewRangeMax = 7; window.hrtSettings.cameraLocked = true; } }, Description: ': Activates map cheats' } ]; CommandCombine(hrtComms); })();
Editor is loading...
Leave a Comment