├── .github ├── ANNOUNCEMENT.md ├── CODEOWNERS ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── bug.yml │ ├── config.yml │ ├── hack.yml │ ├── other.yml │ └── security.yml ├── PTB.png ├── ProdigyLoaderPNP.png ├── SECURITY.md ├── dependabot.yml ├── fixedlogo.png ├── plainlogo.png ├── ppnp.png ├── pull_request_template.md └── workflows │ ├── Autorelease.yml │ ├── BetterDependabot.yml │ ├── cheatGUI-webpack.yml │ ├── codeql-analysis.yml │ └── dependency-review.yml ├── .gitignore ├── .vscode ├── PMGH.code-snippets └── settings.json ├── CITATION.cff ├── LICENSE.txt ├── PHEx ├── README.md ├── build.mjs ├── build.sh ├── build │ ├── default │ ├── extension.crx │ ├── extension.xpi │ └── extension.zip ├── firefox │ ├── assets │ │ ├── x128.png │ │ ├── x16.png │ │ └── x48.png │ ├── background.js │ ├── disableIntegrity.js │ ├── manifest.json │ ├── popup.html │ ├── popup.js │ └── swal │ │ ├── SOURCE.txt │ │ ├── sweetalert2.all.min.js │ │ └── sweetalert2.min.css ├── package.json ├── src │ ├── assets │ │ ├── x128.png │ │ ├── x16.png │ │ └── x48.png │ ├── block.json │ ├── disableIntegrity.js │ ├── manifest.json │ ├── popup.html │ ├── popup.js │ └── swal │ │ └── sweetalert2.all.min.js └── status.json ├── README.md ├── cheatGUI ├── .eslintrc.json ├── .npmrc ├── README.md ├── babel.config.js ├── dist │ └── bundle.js ├── hot-reload.mjs ├── loader.cjs ├── package.json ├── postcss.config.js ├── src │ ├── assets │ │ ├── academy.png │ │ ├── archives.png │ │ ├── bonfire_spire.png │ │ ├── crystal_caverns.png │ │ ├── darktower.png │ │ ├── dyno.png │ │ ├── earthtower.png │ │ ├── elemental_guardian.png │ │ ├── forest.png │ │ ├── house.png │ │ ├── lamplight.png │ │ ├── shipwreck_shore.png │ │ ├── shiverchill.png │ │ ├── skywatch.png │ │ ├── tower_town.png │ │ └── toyzone.png │ ├── class │ │ ├── Hack.ts │ │ └── Toggler.ts │ ├── declarations.d.ts │ ├── hacks │ │ ├── battle.ts │ │ ├── beta.ts │ │ ├── inventory.ts │ │ ├── location.ts │ │ ├── minigame.ts │ │ ├── misc.ts │ │ ├── patched.ts │ │ ├── pets.ts │ │ ├── player.ts │ │ └── utility.ts │ ├── index.ts │ ├── style.scss │ └── utils │ │ ├── chat.ts │ │ ├── fps.ts │ │ ├── hackify.ts │ │ ├── keybinds.ts │ │ ├── popupCloser.ts │ │ ├── status.ts │ │ ├── swal.ts │ │ ├── util.ts │ │ └── wasd.ts ├── statusmessage.json ├── tsconfig.json └── webpack.config.js ├── docs ├── classes │ ├── _player_d_.player.md │ └── _player_d_.playerdata.md ├── globals.md ├── interfaces │ ├── _game_d_.game.md │ ├── _pixi_d_.pixi.md │ ├── _player_d_.playername.md │ └── _prodigy_d_.prodigy.md └── modules │ ├── _game_d_.md │ ├── _item_d_.md │ ├── _pixi_d_.md │ ├── _player_d_.md │ ├── _prodigy_d_.md │ ├── _test_.md │ └── _util_d_.md ├── meta ├── CONTRIBUTORS.md ├── PRIVACY_POLICY.md ├── TIMELINE.md ├── YOUTUBE_ATTRIBUTION.md ├── manual │ ├── BRAVE.md │ ├── CHROME.md │ ├── EDGE.md │ ├── FIREFOX.md │ └── OPERA.md ├── prodigyerrors │ ├── CONTRIBUTING.md │ ├── README.md │ ├── http20.md │ ├── http36.md │ ├── http403.md │ ├── http404.md │ ├── http418.md │ ├── http500.md │ ├── http72.md │ ├── http84.md │ └── inactivityKick.md ├── webstores │ ├── BRAVE.md │ ├── CHROME.md │ ├── EDGE.md │ ├── FIREFOX.md │ └── OPERA.md └── wiki │ ├── QUICKSTART.md │ ├── README.md │ └── UPDATING.md └── typings ├── backpack.d.ts ├── debugMisc.d.ts ├── game.d.ts ├── gameContainer.d.ts ├── gameData.d.ts ├── item.d.ts ├── open.d.ts ├── package.json ├── pet.d.ts ├── pixi.d.ts ├── player.d.ts ├── prodigy.d.ts ├── test.ts └── util.d.ts /.github/ANNOUNCEMENT.md: -------------------------------------------------------------------------------- 1 | **[Before you do anything, please join the temporary discord server, discord.gg/2qzTbdXSg9, though we'll be moving to other platforms soon.](https://discord.gg/2qzTbdXSg9)** 2 | 3 |
4 | 5 | First we'd like to thank everyone for being with us. For the past 6 months, we've maintained the largest Prodigy hack, all while keepings things open source and ad-free. 6 | 7 | Our goal, of bringing back Prodigy hacks, has somewhat been accomplished! Costs of keeping alive Prodigy Hack servers have also been up to $20 a month, in the past few months, and that's all from my, @afkvido's wallet. I make zero money from these hacks, and am going broke from them sometimes. 8 | 9 | For these reasons, as of November 4, 2022, all official publications of our extension on webstores, and instances of P-NP servers, will all be closed down. 10 | 11 | We will keep our source code on GitHub, where anyone can continue development by forking our repositories. We'll continue to review pull requests, but patched hacks most likely will remain patched. Our main issue is Prodigy made a little patch and I, being the only active person of ProdigyPNP, have no idea how to fix it. 12 | 13 | If you would like to run your own instance of the hacks, check out [ProdigyPNP/P-NP](https://github.com/ProdigyPNP/P-NP), but again, there is still fixing to be done. [Our license allows anyone to run and develop our hacks, as long as no profit is made](https://github.com/ProdigyPNP/ProdigyMathGameHacking/blob/master/LICENSE.txt). 14 | 15 | Thank you everyone for understanding, and getting us to insane milestones, such as 45k extension weekly users (before removal), 30k YouTube views (before our main tutorial was removed), and 7k Discord members (before the server was TOS'd). 16 | 17 | If you're wondering where ProdigyPNP is headed next, which most of you likely aren't, and are just children thirsting for Prodigy hacks, sorry, anyways, I'm headed to developing actual software that's legal and doesn't break every five days, and **maybe, perhaps**, a [new Prodigy hack menu](https://github.com/ProdigyPXP). Check out @ProdigyPXP to see the software and for updates on the new hacks I'm making. 18 | 19 | So long, everyone. Good luck, and GodSpeed. 20 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/en/articles/about-code-owners 2 | # to learn more about code owners. 3 | # Order is important; the last matching pattern takes the most 4 | # precedence. You may specify either a GitHub username, or an 5 | # email address if you prefer, as the code owner. 6 | 7 | 8 | # ------- BEGIN CODEOWNERS ------- 9 | 10 | 11 | 12 | # GitHub config 13 | /.github/ @afkvido @donaldli2020 @Erisfiregamer1 14 | 15 | 16 | # PHEx 17 | /PHEx/ @afkvido @donaldli2020 @Erisfiregamer1 18 | 19 | 20 | # The cheat GUI 21 | /willsCheatMenu/ @afkvido @donaldli2020 @Erisfiregamer1 22 | 23 | 24 | 25 | # Repository metadata & wiki 26 | /meta/ @afkvido @donaldli2020 @Erisfiregamer1 27 | 28 | 29 | 30 | # ------- END CODEOWNERS ------- 31 | -------------------------------------------------------------------------------- /.github/CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 |

Hacks are being shut down. Thanks for everything.

2 | 3 |

Our Discord server: discord.gg/2qzTbdXSg9

4 | 5 | 6 | # ProdigyPNP Code of Conduct 7 | 8 | Our goal was to improve Prodigy's security, not ruining the game for profit. We won't sell our hacks, or put ads. 9 | 10 | Our hacks will **always** be open-source, and free to use. 11 | 12 | --- 13 | 14 | You may ***never***: 15 | 16 | - Sell our hacks in any way shape or form. **This includes selling hacked accounts**. 17 | - Hide our hacks behind a paywall/subscribewall of any kind 18 | - This includes adfly 😐 19 | - Claim ownership of our hacks 😠 20 | - Modify our hacks slightly just to add your own ads 🤨 21 | 22 | If you're gonna talk about our hacks (on YouTube or other social media platforms), please please pretty please [credit us properly](https://github.com/ProdigyPNP/ProdigyMathGameHacking/blob/master/YOUTUBE_ATTRIBUTION.md). 23 | 24 | It hurts our souls when skids take credit for our hacks and don't even link us. 25 | 26 | --- 27 | 28 | Last reminder that we are **volunteers**, and do not profit from this. We do this for *fun*, not for evil. Please don't spoil our fun. 29 | -------------------------------------------------------------------------------- /.github/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 |

Hacks are being shut down. Thanks for everything.

2 | 3 |

Our Discord server: discord.gg/2qzTbdXSg9

4 | 5 | 6 | 7 | # Contributing 8 | 9 | This organization and repo is done for. We're not maintaining anything anymore, since we've shut down. If you're interested in developing with us, join us at [@ProdigyPXP](https://github.com/ProdigyPXP)- where we'll make new software, and perhaps one day new Prodigy hacks. 10 | 11 | 12 | Hacking Prodigy used to be as easy as `PIXI.game.prodigy.player.gold=999`, but now we need a whole team! 13 | 14 | QUICK NOTE FROM gemsvidø: IT IS LITERALLY POSSIBLE TO DO `Boot.prototype.game._state._current.user.source.data.gold=999` AND THAT WORKS LMAO LLLLLL 15 | 16 | 17 | If you'd like to join as an official collaborator, you can message us on [our official Discord server](https://dsc.gg/ProdigyPNP)! 18 | 19 | Additionally, please read our [Code of Conduct](https://github.com/ProdigyPNP/ProdigyMathGameHacking/blob/master/.github/CODE_OF_CONDUCT.md) before continuing. 20 | 21 | --- 22 | 23 | ## The Goal of [ProdigyPNP](https://github.com/ProdigyPNP/ProdigyMathGameHacking) 24 | 25 | Our main goal in this repository is to bring Prodigy's attention to their game's architecture. 26 | 27 | Most of the data stuff is handled on the client side, so hacking is as easy as changing a variable. No pwn needed! 28 | 29 | Since we've started this repository, Prodigy's security has improved by leaps and bounds, but the main issue is still the same; 30 | once you get to the player variable, you can easily change anything you want. 31 | 32 | Ideally everything would be handled server side. For example, arena points are already handled properly. The only way to increment arena points is by sending a "win" event, which is rate limited to once per minute. 33 | 34 | We've sort-of achived our goal. See [ANNOUNCEMENT](./ANNOUNCEMENT.md). 35 | 36 | ## Tasks 37 | 38 | There are lots of things to do! (Ranked from easiest to hardest) 39 | 40 | ### Research 41 | 42 | As the name indicates, research. Research includes: 43 | 44 | - Looking for new endpoints to mess around with 45 | - Reading the Prodigy source extensively 46 | - Reporting broken hacks 47 | - Suggesting new hack ideas 48 | 49 | Requirements: 50 | 51 | - Basic coding skills, mainly in JavaScript and TypeScript 52 | - Basic understanding of what an API is (the bar is super low huh) 53 | - Reading skills ;p 54 | 55 | Anybody can do this! If you want to help with any of these, you can post your findings in [Discussions](https://github.com/ProdigyPNP/ProdigyMathGameHacking/discussions), or [our official Discord](https://dsc.gg/2qzTbdXSg9). 56 | 57 | ### Typings 58 | 59 | Basically just typescript definitions for Prodigy objects. An understanding of how to implement the types is also necessary. 60 | 61 | Requirements: 62 | 63 | - lots of spare time 64 | 65 | If you make a PR with Typings, [Will](https://github.com/MelnCat) will will you into his Will will. <3 66 | 67 | 68 | 69 | 70 | ### [The Hack GUI](https://github.com/ProdigyPNP/ProdigyMathGameHacking/tree/master/cheatGUI) 71 | 72 | [The Hack GUI](https://github.com/ProdigyPNP/ProdigyMathGameHacking/tree/master/cheatGUI)! Written in Typescript, it gives a visual cheat menu, with tons of handy dandy hacks in one place. No more copy pasting required! 73 | 74 | Requirements: 75 | 76 | - Javascript/Typescript knowledge 77 | - Basic knowledge of how to use the command line 78 | - Basic knowledge of Node.js & TypeScript syntax 79 | - A good personality 80 | 81 | you can build it from `./cheatGUI` with `webpack`. 82 | 83 | ### [Browser Extension](../PHEx/README.md) 84 | 85 | We used to rely on the Chrome extension "Redirector", and "Anti-CSP", but due to some extra anti-cheats from Prodigy, we've decided to roll our own extension. 86 | 87 | The extension does a few things (only on Prodigy domains): 88 | 89 | - disable CSP, so we can inject our scripts 90 | - disable Prodigy's official game files, and load our hacked files 91 | - hehehehehehe 92 | 93 | We usually don't need help with this, it almost never changes, When it does change, we usually need 94 | *extremely skilled* researchers to figure out the problem, and fix it. 95 | 96 | #### [P-NP](https://github.com/ProdigyPNP/P-NP) (aka Redirector) 97 | 98 | Redirector was made by [Will](https://github.com/MelnCat). Thanks, [Will](https://github.com/MelnCat)! 99 | 100 | It just edits the game's script so we can bypass any clientside anti-cheats, and expose the special sauce objects we desire. 101 | 102 | [Redirector]((https://github.com/ProdigyPNP/P-NP)) is written in Typescript. It also comes in its own repository! 103 | 104 | To build: 105 | 106 | ```sh 107 | pnpm build 108 | ``` 109 | 110 | Really, if anyone can help with Redirector type shit, for the love of god, join us. ProdigyPNP is done for, though please email [gemsvido@gmail.com](mailto:gemsvido@gmail.com) if you know it, since we're making a new Prodigy hack in 2023. 111 | 112 | Because we can edit the game script, we can also import external scripts, such as the [Cheat GUI](https://github.com/ProdigyPNP/ProdigyMathGameHacking/tree/master/cheatGUI). 113 | 114 | ## Your contributions are licensed under the [MPL 2.0 software license](https://github.com/ProdigyPNP/ProdigyMathGameHacking/blob/master/LICENSE.txt) 115 | 116 | When you submit anything here, your contributions will be licensed under [the MPL 2.0 license](https://www.mozilla.org/en-US/MPL/2.0/). Contact a collaborator if this is an issue to you. 117 | 118 | ## We Develop with [GitHub](https://github.com) 119 | 120 | We use [GitHub](https://github.com) to host code, track [issues](https://github.com/ProdigyPNP/ProdigyMathGameHacking/issues) and feature requests, and provide you with this work. 121 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | patreon: "ProdigyPXP" # Patreon 2 | open_collective: "ProdigyPNP" # Open Collective 3 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug.yml: -------------------------------------------------------------------------------- 1 | name: "Bug Report" 2 | description: "Report a bug to help us improve Prodigy Hacks." 3 | title: "[B] title" 4 | labels: ["Is: Bug", "Priority: Medium"] 5 | assignees: ["afkvido"] 6 | body: 7 | 8 | - type: textarea 9 | id: description 10 | attributes: 11 | label: Describe the bug 12 | description: | 13 | A clear and concise description of what the issue is. 14 | Provide as much information as possible. 15 | validations: 16 | required: true 17 | - type: textarea 18 | id: replication 19 | attributes: 20 | label: Describe how to replicate bug 21 | description: | 22 | Please provide a step-by-step explanation on how to reproduce the bug. 23 | Make sure to test your replication steps. 24 | validations: 25 | required: true 26 | - type: input 27 | id: date 28 | attributes: 29 | label: Date of submittion 30 | validations: 31 | required: true 32 | - type: input 33 | id: phex 34 | attributes: 35 | label: Your PHEx version 36 | validations: 37 | required: true 38 | - type: input 39 | id: context 40 | attributes: 41 | label: Your operating system and the version 42 | validations: 43 | required: true 44 | - type: checkboxes 45 | id: prerequisites 46 | attributes: 47 | label: Before submitting a bug report 48 | options: 49 | - label: | 50 | This bug wasn't already reported. 51 | (I have checked every bug report on GitHub) 52 | required: true 53 | - label: | 54 | I agree to this repository's prerequisites. 55 | (I have read and agree to the License, Code of Conduct, and Contributing Guidelines) 56 | required: true 57 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: true 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/hack.yml: -------------------------------------------------------------------------------- 1 | name: "Hack Request" 2 | description: "Request a hack to be added to the cheat GUI" 3 | title: "[HR] title" 4 | labels: ["Is: Enhancement", "Category: Cheat GUI"] 5 | assignees: ["afkvido"] 6 | body: 7 | 8 | - type: textarea 9 | id: description 10 | attributes: 11 | label: Describe the hack 12 | description: | 13 | A clear and concise description of what you would like. 14 | Please provide as much information as possible. 15 | validations: 16 | required: true 17 | - type: input 18 | id: date 19 | attributes: 20 | label: Date of submittion 21 | validations: 22 | required: true 23 | - type: checkboxes 24 | id: prerequisites 25 | attributes: 26 | label: Before submitting a hack request 27 | options: 28 | - label: | 29 | This hack wasn't already requested. 30 | (I have checked every hack request on GitHub) 31 | required: true 32 | - label: | 33 | I agree to this repository's prerequisites. 34 | (I have read and agree to the License, Code of Conduct, and Contributing Guidelines) 35 | required: true 36 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/other.yml: -------------------------------------------------------------------------------- 1 | name: "Other" 2 | description: "Submit a blank issue to ProdigyMathGameHacking." 3 | title: "[O] title" 4 | assignees: ["afkvido"] 5 | body: 6 | 7 | - type: textarea 8 | id: description 9 | attributes: 10 | label: Describe your issue 11 | description: | 12 | Make a clear and concise description. 13 | Provide as much information as possible. 14 | validations: 15 | required: true 16 | - type: input 17 | id: date 18 | attributes: 19 | label: Date of submittion 20 | validations: 21 | required: true 22 | - type: checkboxes 23 | id: prerequisites 24 | attributes: 25 | label: Before submitting an issue 26 | options: 27 | - label: | 28 | This wasn't already submitted. 29 | (I have checked every issue on GitHub) 30 | required: true 31 | - label: | 32 | I agree to this repository's prerequisites. 33 | (I have read and agree to the License, Code of Conduct, and Contributing Guidelines) 34 | required: true 35 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/security.yml: -------------------------------------------------------------------------------- 1 | name: "Security issue" 2 | description: "Report a security issue to help us improve Prodigy Hacks." 3 | title: "[SE] title" 4 | labels: ["Is: Bug", "Priority: High"] 5 | assignees: ["afkvido"] 6 | body: 7 | 8 | - type: textarea 9 | id: description 10 | attributes: 11 | label: Describe the vulnerability 12 | description: | 13 | A clear and concise description of what the issue is. 14 | Provide as much information as possible. 15 | validations: 16 | required: true 17 | - type: textarea 18 | id: replication 19 | attributes: 20 | label: Describe how to replicate the vulnerability 21 | description: | 22 | Please provide a step-by-step explanation on how to reproduce the bug. 23 | Make sure to test your replication steps. 24 | validations: 25 | required: true 26 | - type: input 27 | id: date 28 | attributes: 29 | label: Date of submittion 30 | validations: 31 | required: true 32 | - type: input 33 | id: phex 34 | attributes: 35 | label: Vulerable PHEx versions, type LATEST if this is for the latest version, type ALL if this is for all versions. 36 | validations: 37 | required: true 38 | - type: input 39 | id: context 40 | attributes: 41 | label: Vulnerable operating systems and their versions, type ALL if this is global. 42 | validations: 43 | required: true 44 | - type: checkboxes 45 | id: prerequisites 46 | attributes: 47 | label: Before submitting a bug report 48 | options: 49 | - label: | 50 | This vulnerability wasn't already reported. 51 | (I have checked every bug report on GitHub) 52 | required: true 53 | - label: | 54 | I agree to this repository's prerequisites. 55 | (I have read and agree to the License, Code of Conduct, and Contributing Guidelines) 56 | required: true 57 | -------------------------------------------------------------------------------- /.github/PTB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/7221b84ae5a0dad782f06c3cce5be9953fca5162/.github/PTB.png -------------------------------------------------------------------------------- /.github/ProdigyLoaderPNP.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/7221b84ae5a0dad782f06c3cce5be9953fca5162/.github/ProdigyLoaderPNP.png -------------------------------------------------------------------------------- /.github/SECURITY.md: -------------------------------------------------------------------------------- 1 |

Hacks are being shut down. Thanks for everything.

2 | 3 |

Our Discord server: discord.gg/2qzTbdXSg9

4 | 5 | # Security Policy 6 | 7 | ## Supported Versions 8 | 9 | 10 | 11 | | Version | Supported | 12 | |---------|---------------------| 13 | | = 3.0.1 | Full functionality for Firefox and Chromium. public gmaemin wasn't fixed, still nobody uses it. | 14 | | = 3.0.0 | Custom P-NP URL does not work. Neither does public-game.min.js, but it seems like nobody uses it these days. | 15 | | < 3.0.0 | Manifest V2 extensions will be deprecated in 2023. | 16 | | = 2.2.0 | Full functionality of Infinite Zero, other than public-game.min.js | 17 | | = 2.1.9 | Functionality not guaranteed. Infinite Zero is not implemented. | 18 | | < 2.1.9 | Hacks don't work, as we only fixed P-NP in versions 2.1.9 and above | 19 | | < 2.1.5 | Major Vulnerability - [these versions use prodigyhacking.ml](https://github.com/Prodigy-Hacking/ProdigyMathGameHacking/releases/2.1.5), a domain that [we](https://github.com/ProdigyPNP) or [PMGH](https://github.com/Prodigy-Hacking) do not control. | 20 | 21 | 22 | ## Reporting a Vulnerability 23 | 24 | Report on Discord: https://dsc.gg/ProdigyPNP 25 | 26 | Report on GitHub: https://github.com/ProdigyPNP/ProdigyMathGameHacking/issues 27 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for all configuration options: 4 | # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates 5 | 6 | version: 2 7 | updates: 8 | 9 | # cheatGUI 10 | - package-ecosystem: "npm" # See documentation for possible values 11 | directory: "/cheatGUI" # Location of package manifests 12 | schedule: 13 | interval: "daily" # Run Daily 14 | commit-message: 15 | prefix: "[cheatGUI]" 16 | assignees: 17 | - "afkvido" 18 | - "donaldli2022" 19 | 20 | 21 | # PHEx 22 | - package-ecosystem: "npm" # See documentation for possible values 23 | directory: "/PHEx" # Location of package manifests 24 | schedule: 25 | interval: "daily" # Run Daily 26 | commit-message: 27 | prefix: "[PHEx]" 28 | assignees: 29 | - "afkvido" 30 | - "donaldli2022" 31 | 32 | 33 | # typings 34 | - package-ecosystem: "npm" # See documentation for possible values 35 | directory: "/typings" # Location of package manifests 36 | schedule: 37 | interval: "daily" # Run Daily 38 | commit-message: 39 | prefix: "[typings]" 40 | assignees: 41 | - "afkvido" 42 | - "donaldli2022" 43 | 44 | 45 | # docs 46 | - package-ecosystem: "npm" # See documentation for possible values 47 | directory: "/docs" # Location of package manifests 48 | schedule: 49 | interval: "daily" # Run Daily 50 | commit-message: 51 | prefix: "[docs]" 52 | assignees: 53 | - "afkvido" 54 | - "donaldli2022" 55 | 56 | 57 | # GitHub Actions 58 | - package-ecosystem: "github-actions" # See documentation for possible values 59 | directory: "/" # Location of package manifests 60 | schedule: 61 | interval: "daily" # Run Daily 62 | commit-message: 63 | prefix: "[Actions]" 64 | assignees: 65 | - "afkvido" 66 | - "donaldli2022" 67 | -------------------------------------------------------------------------------- /.github/fixedlogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/7221b84ae5a0dad782f06c3cce5be9953fca5162/.github/fixedlogo.png -------------------------------------------------------------------------------- /.github/plainlogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/7221b84ae5a0dad782f06c3cce5be9953fca5162/.github/plainlogo.png -------------------------------------------------------------------------------- /.github/ppnp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/7221b84ae5a0dad782f06c3cce5be9953fca5162/.github/ppnp.png -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.github/workflows/Autorelease.yml: -------------------------------------------------------------------------------- 1 | # Manual PHEx autorelease 2 | 3 | name: Autorelease PHEx 4 | 5 | # Controls when the action will run. Workflow runs when manually triggered using the UI 6 | # or API. 7 | on: 8 | workflow_dispatch: 9 | # Inputs the workflow accepts. 10 | inputs: 11 | tag: 12 | # Friendly description to be shown in the UI instead of 'tag' 13 | description: 'Tagname of the git tag you are making a release of' 14 | # Input has to be provided for the workflow to run 15 | required: true 16 | 17 | # A workflow run is made up of one or more jobs that can run sequentially or in parallel 18 | jobs: 19 | # This workflow contains a single job called "greet" 20 | greet: 21 | # The type of runner that the job will run on 22 | runs-on: ubuntu-latest 23 | 24 | 25 | # Steps represent a sequence of tasks that will be executed as part of the job 26 | steps: 27 | 28 | 29 | - name: GitHub Release 30 | uses: marvinpinto/action-automatic-releases@v1.2.1 31 | with: 32 | repo_token: "${{ secrets.GITHUB_TOKEN }}" 33 | automatic_release_tag: "${{ github.event.inputs.tag }}" 34 | prerelease: false 35 | title: "PHEx ${{ github.event.inputs.tag }}" 36 | files: | 37 | ./PHEx/build/extension.zip 38 | ./PHEx/build/extension.xpi 39 | ./PHEx/build/extension.crx 40 | 41 | - name: Chrome Web Store Release 42 | uses: mobilefirstllc/cws-publish@latest 43 | with: 44 | action: 'upload' # one of: upload, publish, testers 45 | client_id: ${{ secrets.CLIENT }} 46 | client_secret: ${{ secrets.SECRET }} 47 | refresh_token: ${{ secrets.TOKEN }} 48 | extension_id: 'nmipcbdicnmjoifanpdcjdmifeioglkm' 49 | zip_file: './PHEx/build/extension.zip' 50 | 51 | 52 | - name: Edge Addons Store Release 53 | uses: wdzeng/edge-addon@v1 54 | with: 55 | product-id: '5f5dd37a-2075-4f20-baa7-1c6b611b8efc' 56 | zip-path: './PHEx/build/extension.zip' 57 | client-id: ${{ secrets.EDGE_CLIENT_ID }} 58 | client-secret: ${{ secrets.EDGE_CLIENT_SECRET }} 59 | access-token-url: ${{ secrets.EDGE_ACCESS_TOKEN_URL }} 60 | 61 | - name: Firefox Addons Store Release 62 | uses: wdzeng/firefox-addon@v1 63 | with: 64 | addon-guid: '' 65 | xpi-path: './PHEx/build/extension.xpi' 66 | self-hosted: false 67 | jwt-issuer: ${{ secrets.FIREFOX_JWT_ISSUER }} 68 | jwt-secret: ${{ secrets.FIREFOX_JWT_SECRET }} 69 | 70 | -------------------------------------------------------------------------------- /.github/workflows/BetterDependabot.yml: -------------------------------------------------------------------------------- 1 | name: Better Dependabot 2 | 3 | on: 4 | schedule: 5 | - cron: "0 0 * * *" # Supposedly at the end of every day. 6 | workflow_dispatch: 7 | 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | 13 | strategy: 14 | matrix: 15 | node-version: [16.x] 16 | 17 | steps: 18 | - uses: actions/checkout@v4 19 | 20 | - name: Install Node.js ${{ matrix.node-version }} 21 | uses: actions/setup-node@v4 22 | with: 23 | node-version: ${{ matrix.node-version }} 24 | 25 | - name: Install pnpm 26 | uses: pnpm/action-setup@v3.0.0 27 | with: 28 | version: 7 29 | 30 | - name: Update cheatGUI dependencies 31 | run: | 32 | cd ./cheatGUI/ 33 | pnpm update 34 | - name: Update typings dependencies 35 | run: | 36 | cd ./typings/ 37 | pnpm update 38 | - name: Update PHEx dependencies 39 | run: | 40 | cd ./PHEx/ 41 | pnpm update 42 | - name: Commit with git 43 | run: | 44 | git pull 45 | git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" 46 | git config --global user.name "github-actions[bot]" 47 | git add . 48 | git commit -s -m "Update dependencies" || echo "No changes" 49 | - name: Push changes to GitHub 50 | uses: ad-m/github-push-action@master 51 | with: 52 | github_token: ${{ secrets.GITHUB_TOKEN }} 53 | branch: ${{ github.ref }} 54 | -------------------------------------------------------------------------------- /.github/workflows/cheatGUI-webpack.yml: -------------------------------------------------------------------------------- 1 | name: Autobuild cheatGUI 2 | 3 | on: 4 | push: 5 | branches: [ "master" ] 6 | workflow_dispatch: 7 | 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | 13 | strategy: 14 | matrix: 15 | node-version: [16.x] 16 | 17 | steps: 18 | - uses: actions/checkout@v4 19 | 20 | - name: Install Node.js ${{ matrix.node-version }} 21 | uses: actions/setup-node@v4 22 | with: 23 | node-version: ${{ matrix.node-version }} 24 | 25 | - name: Install pnpm 26 | uses: pnpm/action-setup@v3.0.0 27 | with: 28 | version: 7 29 | 30 | - name: Build with pnpm 31 | run: | 32 | cd cheatGUI 33 | pnpm install 34 | pnpm build 35 | - name: Commit with git 36 | run: | 37 | git pull 38 | git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" 39 | git config --global user.name "github-actions[bot]" 40 | git add . 41 | git commit --allow-empty -s -m "AutoBuild cheatGUI" 42 | - name: Push changes to GitHub 43 | uses: ad-m/github-push-action@master 44 | with: 45 | github_token: ${{ secrets.GITHUB_TOKEN }} 46 | branch: ${{ github.ref }} 47 | -------------------------------------------------------------------------------- /.github/workflows/codeql-analysis.yml: -------------------------------------------------------------------------------- 1 | # For most projects, this workflow file will not need changing; you simply need 2 | # to commit it to your repository. 3 | # 4 | # You may wish to alter this file to override the set of languages analyzed, 5 | # or to provide custom queries or build logic. 6 | # 7 | # ******** NOTE ******** 8 | # We have attempted to detect the languages in your repository. Please check 9 | # the `language` matrix defined below to confirm you have the correct set of 10 | # supported CodeQL languages. 11 | # 12 | name: "CodeQL" 13 | 14 | on: 15 | push: 16 | branches: [ master, masterf ] 17 | pull_request: 18 | # The branches below must be a subset of the branches above 19 | branches: [ master ] 20 | schedule: 21 | - cron: '18 12 * * 3' 22 | 23 | jobs: 24 | analyze: 25 | name: Analyze 26 | runs-on: ubuntu-latest 27 | 28 | strategy: 29 | fail-fast: false 30 | matrix: 31 | language: [ 'javascript' ] 32 | # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] 33 | # Learn more: 34 | # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed 35 | 36 | steps: 37 | - name: Checkout repository 38 | uses: actions/checkout@v4 39 | 40 | # Initializes the CodeQL tools for scanning. 41 | - name: Initialize CodeQL 42 | uses: github/codeql-action/init@v3 43 | with: 44 | languages: ${{ matrix.language }} 45 | # If you wish to specify custom queries, you can do so here or in a config file. 46 | # By default, queries listed here will override any specified in a config file. 47 | # Prefix the list here with "+" to use these queries and those in the config file. 48 | # queries: ./path/to/local/query, your-org/your-repo/queries@main 49 | 50 | # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). 51 | # If this step fails, then you should remove it and run the build manually (see below) 52 | - name: Autobuild 53 | uses: github/codeql-action/autobuild@v3 54 | 55 | # ℹ️ Command-line programs to run using the OS shell. 56 | # 📚 https://git.io/JvXDl 57 | 58 | # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines 59 | # and modify them (or add more) to build your code if your project 60 | # uses a compiled language 61 | 62 | #- run: | 63 | # make bootstrap 64 | # make release 65 | 66 | - name: Perform CodeQL Analysis 67 | uses: github/codeql-action/analyze@v3 68 | -------------------------------------------------------------------------------- /.github/workflows/dependency-review.yml: -------------------------------------------------------------------------------- 1 | # Dependency Review Action 2 | # 3 | # This Action will scan dependency manifest files that change as part of a Pull Reqest, surfacing known-vulnerable versions of the packages declared or updated in the PR. Once installed, if the workflow run is marked as required, PRs introducing known-vulnerable packages will be blocked from merging. 4 | # 5 | # Source repository: https://github.com/actions/dependency-review-action 6 | # Public documentation: https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/about-dependency-review#dependency-review-enforcement 7 | name: 'Dependency Review' 8 | on: [pull_request] 9 | 10 | permissions: 11 | contents: read 12 | 13 | jobs: 14 | dependency-review: 15 | runs-on: ubuntu-latest 16 | steps: 17 | - name: 'Checkout Repository' 18 | uses: actions/checkout@v4 19 | - name: 'Dependency Review' 20 | uses: actions/dependency-review-action@v4 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Packager files 2 | package-lock.json 3 | pnpm-lock.yaml 4 | 5 | # Generated Config files 6 | config.json 7 | 8 | # Generated Log files 9 | *.log 10 | 11 | # NodeJS/npm modules 12 | node_modules/ 13 | 14 | # Extension Private Key files 15 | *.pem 16 | 17 | # MacOS 18 | **/.DS_Store 19 | 20 | # IntelliJ IDEA 21 | /.idea/ 22 | *.iml 23 | 24 | 25 | # Logs 26 | logs 27 | *.log 28 | npm-debug.log* 29 | yarn-debug.log* 30 | yarn-error.log* 31 | lerna-debug.log* 32 | .pnpm-debug.log* 33 | 34 | # Diagnostic reports (https://nodejs.org/api/report.html) 35 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 36 | 37 | # Runtime data 38 | pids 39 | *.pid 40 | *.seed 41 | *.pid.lock 42 | 43 | # Various caches 44 | .npm 45 | *.tsbuildinfo 46 | .eslintcache 47 | .stylelintcache 48 | .rpt2_cache/ 49 | .rts2_cache_cjs/ 50 | .rts2_cache_es/ 51 | .rts2_cache_umd/ 52 | 53 | # dotenv environment variable files 54 | .env 55 | .env.development.local 56 | .env.test.local 57 | .env.production.local 58 | .env.local 59 | -------------------------------------------------------------------------------- /.vscode/PMGH.code-snippets: -------------------------------------------------------------------------------- 1 | { 2 | "Create Hack": { 3 | "scope": "typescript", 4 | "prefix": "ch", 5 | "body": [ 6 | "new Hack(category.$1, \"\", \"\").setClick(async () => {", 7 | " ", 8 | "});" 9 | ], 10 | "description": "Create new hack", 11 | }, 12 | "Create Toggler": { 13 | "scope": "typescript", 14 | "prefix": "ct", 15 | "body": [ 16 | "new Toggler(category.$1, \"\", \"\").setEnabled(async () => {", 17 | " ", 18 | "}).setDisabled(async() => {", 19 | " ", 20 | "});" 21 | ] 22 | } 23 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "git.ignoreLimitWarning": true 3 | } -------------------------------------------------------------------------------- /CITATION.cff: -------------------------------------------------------------------------------- 1 | cff-version: 1.2.0 2 | message: "If you use this software, please cite it as below." 3 | authors: 4 | - family-names: "ProdigyPNP" 5 | given-names: "" 6 | title: "ProdigyMathGameHacking" 7 | version: 3.0.1 8 | date-released: 2022-04-22 9 | url: "https://github.com/ProdigyPNP/ProdigyMathGameHacking" -------------------------------------------------------------------------------- /PHEx/README.md: -------------------------------------------------------------------------------- 1 | # Prodigy Hacking Extension (PHEx) 2 | 3 | Combined with [P-NP](https://github.com/ProdigyPNP/P-NP) to inject modified game files into Prodigy. 4 | 5 | Made of the Redirector extension, no-csp, and a little extra spice ;) 6 |

7 | 8 | 9 | 10 | 11 | ## [Usage](https://github.com/ProdigyPNP/ProdigyMathGameHacking/blob/master/meta/wiki/QUICKSTART.md) 12 | See our guide: https://github.com/ProdigyPNP/ProdigyMathGameHacking/blob/master/meta/wiki/QUICKSTART.md 13 |

14 | 15 | 16 | 17 | 18 | ## Building 19 | 20 | Using Shell 21 | ```shell 22 | pnpm sh:build 23 | ``` 24 | 25 | Using Node.js 26 | ```shell 27 | pnpm install 28 | pnpm js:build 29 | ``` 30 | 31 | The output will be in `/PHEx/build/`. The generated files are `extension.zip`, `extension.xpi`, and `extension.crx`. 32 | 33 |

34 | 35 | 36 | 37 | 38 | ## Credit 39 | 40 | Originally created by [UnstableRus](https://github.com/UntrustableRus). Thanks, [Rus](https://github.com/UntrustableRus)! 41 | 42 | Currently maintained by [ProdigyPNP](https://github.com/ProdigyPNP). -------------------------------------------------------------------------------- /PHEx/build.mjs: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | // PHEx Build Script 3 | 4 | 5 | /** Directory Zipper */ 6 | import zipdir from "zip-dir"; 7 | 8 | 9 | /** console.log prefix */ 10 | const prefix = "[PHEx Builder] "; 11 | 12 | // newline cuz it looks nicer in the terminal when i do. 13 | console.log("\n"); 14 | 15 | /** old console.log function */ 16 | var backup = console.log; 17 | 18 | // console.log plus prefix 19 | console.log = ((message) => { 20 | // im so smart lol 21 | backup(prefix + message); 22 | }) 23 | 24 | 25 | // Tell the user that the chromium extension is being zipped 26 | console.log("Zipping chromium extension..."); 27 | 28 | 29 | // Zip ./src to ./build.extension.zip 30 | zipdir("./src/", { saveTo: "./build/extension.zip" }, function (err, buffer) { 31 | 32 | // If this encounters an error, print the error and return. 33 | if (err) return console.error(err); 34 | 35 | // If the program has gotten to this step, then the program has not encountered any errors. 36 | // Tell the user that extension.zip has been built. 37 | console.log(".ZIP chromium extension built -> extension.zip"); 38 | 39 | // Tell the user that we've build the chromium extension successfully. 40 | console.log("Chromium extension Success!\n"); 41 | 42 | 43 | 44 | 45 | 46 | // Tell the user that the firefox extension is being zipped 47 | console.log("Zipping firefox extension..."); 48 | 49 | // Zip ./firefox to ./build.extension.zip 50 | zipdir("./firefox/", { saveTo: "./build/extension.xpi" }, function (err, _buffer) { 51 | 52 | // If this encounters an error, print the error and return. 53 | if (err) return console.error(err); 54 | 55 | // If the program has gotten to this step, then the program has not encountered any errors. 56 | // Tell the user that extension.xpi has been built. 57 | console.log(".XPI file built -> extension.xpi"); 58 | 59 | // Tell the user that we've build the firefox extension successfully. 60 | console.log("Firefox extension Success!\n"); 61 | 62 | 63 | // When making .crx extensions, it needs to be signed with a private key file to work. 64 | // Tell the user that extension.crx needs to be signed if it's a production-used release. 65 | console.warn("IMPORTANT: IF YOU ARE MAKING AN OFFICIAL PHEx RELEASE, THEN PLEASE REMEMBER TO SIGN THE .CRX WITH A PRIVATE KEY FILE.\n"); 66 | 67 | 68 | // Tell the user that we're done. 69 | console.log("Done!"); 70 | 71 | }); 72 | 73 | 74 | }); 75 | -------------------------------------------------------------------------------- /PHEx/build.sh: -------------------------------------------------------------------------------- 1 | # PHEx Build Script 2 | 3 | # Prefix 4 | PREFIX="[PHEx Builder] " 5 | 6 | echo "" 7 | 8 | # echo with prefix 9 | xlog () { 10 | echo "$PREFIX$1" 11 | } 12 | 13 | # exit with message 14 | ext () { 15 | echo "$1" 16 | exit 0 17 | } 18 | 19 | 20 | 21 | 22 | # Delete build/extension.zip 23 | xlog "Deleting extension.zip..." 24 | rm build/extension.zip && xlog "Deleted extension.zip" || xlog "No extension.zip found" 25 | 26 | 27 | # Delete build/extension.xpi 28 | xlog "Deleting extension.xpi..." 29 | rm build/extension.xpi && xlog "Deleted extension.xpi" || xlog "No extension.xpi found" 30 | echo "" 31 | 32 | 33 | 34 | 35 | # Tell the user that the chromium extension is being zipped 36 | xlog "Zipping chromium extension..." 37 | 38 | # Go into ./src/ 39 | cd ./src/ 40 | 41 | # Zip ./src/ to ./build.extension.zip 42 | zip -q -r ../build/extension.zip ./ && xlog ".ZIP chromium extension built -> extension.zip" 43 | 44 | # Tell the user that we've build the chromium extension successfully. 45 | xlog "Chromium extension Success!" && echo "" 46 | 47 | 48 | 49 | 50 | 51 | 52 | # Go out of ./src/ and into ./firefox/ 53 | cd ../firefox/ 54 | 55 | # Zip ./firefox/ to ./build.extension.xpi 56 | zip -q -r ../build/extension.xpi ./ && xlog ".XPI file built -> extension.xpi" 57 | 58 | 59 | # Tell the user that we've build the firefox extension successfully. 60 | xlog "Firefox extension Success!" && echo "" 61 | 62 | 63 | 64 | 65 | # When making .crx extensions, it needs to be signed with a private key file to work. 66 | # Tell the user that extension.crx needs to be signed if it's a production-used release. 67 | echo "\033[0;31m" && xlog "IMPORTANT: IF YOU ARE MAKING AN OFFICIAL PHEx RELEASE, THEN PLEASE REMEMBER TO SIGN THE .CRX WITH A PRIVATE KEY FILE." && echo "" 68 | 69 | # Tell the user that we're done. 70 | echo "\033[0m" && xlog "Done!" -------------------------------------------------------------------------------- /PHEx/build/default: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /PHEx/build/extension.crx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/7221b84ae5a0dad782f06c3cce5be9953fca5162/PHEx/build/extension.crx -------------------------------------------------------------------------------- /PHEx/build/extension.xpi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/7221b84ae5a0dad782f06c3cce5be9953fca5162/PHEx/build/extension.xpi -------------------------------------------------------------------------------- /PHEx/build/extension.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/7221b84ae5a0dad782f06c3cce5be9953fca5162/PHEx/build/extension.zip -------------------------------------------------------------------------------- /PHEx/firefox/assets/x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/7221b84ae5a0dad782f06c3cce5be9953fca5162/PHEx/firefox/assets/x128.png -------------------------------------------------------------------------------- /PHEx/firefox/assets/x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/7221b84ae5a0dad782f06c3cce5be9953fca5162/PHEx/firefox/assets/x16.png -------------------------------------------------------------------------------- /PHEx/firefox/assets/x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/7221b84ae5a0dad782f06c3cce5be9953fca5162/PHEx/firefox/assets/x48.png -------------------------------------------------------------------------------- /PHEx/firefox/background.js: -------------------------------------------------------------------------------- 1 | /** 2 | * background.js 3 | * 4 | * modified by gemsvidø for firefox support 5 | */ 6 | 7 | 8 | 9 | /** CSP and X-Frame headers */ 10 | const HEADERS_TO_STRIP_LOWERCASE = [ 11 | "content-security-policy", 12 | "x-frame-options", 13 | ]; 14 | 15 | // Remove CSP and X-Frame headers on all Prodigy domains 16 | browser.webRequest.onHeadersReceived.addListener( 17 | details => ({ 18 | responseHeaders: details.responseHeaders.filter(header => !HEADERS_TO_STRIP_LOWERCASE.includes(header.name.toLowerCase())) 19 | }), 20 | { urls: ["*://*.prodigygame.com/*"] }, 21 | ["blocking", "responseHeaders"] 22 | ); 23 | 24 | 25 | 26 | 27 | 28 | 29 | /** Set a value in the local storage */ 30 | function set(key, value) { 31 | browser.storage.local.set({ [key]: value }); 32 | }; 33 | 34 | /** Get a value from the local storage */ 35 | function get(key) { 36 | return new Promise(resolve => { 37 | browser.storage.local.get([key], result => { 38 | resolve(result[key]); 39 | }) 40 | }) 41 | }; 42 | 43 | 44 | 45 | // Redirect Requests 46 | browser.webRequest.onBeforeRequest.addListener(async details => { 47 | 48 | /** Custom P-NP URL */ 49 | const url = await get("url"); 50 | 51 | /** Use custom URL */ 52 | const checked = await get("checked"); 53 | 54 | /** P-NP URL to be used */ 55 | const redirectorDomain = (url && checked) ? url : await (await fetch("https://infinitezero.net/domain")).text(); 56 | 57 | 58 | // If hacks are offline, show an alert 59 | if (details.url.startsWith("https://code.prodigygame.com/code/") && details.url.includes("/game.min.js")) { 60 | fetch("https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/master/PHEx/status.json").then(response => response.json()).then(async data => { 61 | if (data.offline == true) { 62 | 63 | if (swal) { 64 | swal.fire({ 65 | title: "Oh no!", 66 | html: `Our hacks are currently having some issues, and we're working on it.`, 67 | icon: "error" 68 | }); 69 | } else { 70 | const res = confirm(`Uh Oh! Hacks look to be down. Hit OK to go to our discord to get updates on when they'll go back up!`); 71 | if (res) location = "https://dsc.gg/ProdigyPNP"; 72 | } 73 | } 74 | }); 75 | 76 | // Block game.min.js 77 | browser.webRequest.onBeforeRequest.addListener( 78 | _ => ({ cancel: true }), 79 | { urls: ["*://code.prodigygame.com/code/*"] }, 80 | ["blocking"], 81 | ); 82 | 83 | // see disableIntegrity.js, we append the new game.min to the document 84 | return { cancel: true }; 85 | 86 | // Public gamemin 87 | } else if (details.url.startsWith("https://code.prodigygame.com/js/public-game")) { 88 | 89 | 90 | const hash = new String(details.url.split("public-game-")[1].split(".")[0]).valueOf(); 91 | console.log("Public gamemin hash: " + hash) 92 | 93 | // add a redirectUrl header which should redirect public gamemin to our hacked public gamemin. 94 | return { 95 | redirectUrl: `${redirectorDomain}/public-game.min.js?hash=${hash}&updated=${Date.now()}` 96 | }; 97 | } 98 | 99 | 100 | }, { 101 | 102 | // Block gamemin and public gamemin 103 | urls: [ 104 | "*://code.prodigygame.com/code/*/game.min.js*", 105 | "*://code.prodigygame.com/js/public-game-*.min.js*" 106 | ], 107 | types: ["main_frame", "sub_frame", "stylesheet", "script", "image", "font", "object", "xmlhttprequest", "ping", "csp_report", "media", "websocket", "other"], 108 | }, ["blocking"]); -------------------------------------------------------------------------------- /PHEx/firefox/disableIntegrity.js: -------------------------------------------------------------------------------- 1 | /** 2 | * disableIntegrity.js 3 | * 4 | * Currently maintained by ProdigyPNP 5 | * Original author: Prodigy-Hacking 6 | * Contributors: hostedposted, gemsvido, Eris 7 | * File has been updated for Firefox 8 | */ 9 | 10 | (async () => { 11 | 12 | /** Get an item from the browser local storage. */ 13 | function get(key) { 14 | return new Promise(resolve => { 15 | browser.storage.local.get([key], result => { 16 | resolve(result[key]); 17 | }); 18 | }); 19 | } 20 | 21 | /** Custom P-NP URL from popup.js */ 22 | const url = await get("url"); 23 | 24 | /** Use Custom P-NP URL. */ 25 | const checked = await get("checked"); 26 | 27 | /** P-NP URL to use. Code: (If url exists and checked is true, then use url. Else, get a domain from infinite zero.) */ 28 | const redirectorDomain = (url && checked) ? url : (await (await fetch("https://infinitezero.net/domain")).text()).valueOf(); 29 | 30 | 31 | 32 | 33 | /*-----------------------------------------------* 34 | * * 35 | * INJECT GAME.MIN.JS * 36 | * * 37 | ------------------------------------------------*/ 38 | 39 | 40 | async function insertCode () { 41 | try { 42 | /** P-NP Loader. If you're using a custom URL, then you have the ?force attribute. */ 43 | const request = await (await fetch(`https://infinitezero.net/eval${(url && checked) ? "?force=" + url : ""}`)).text(); 44 | document.documentElement.setAttribute("onreset", `${request}\nSW.Load.decrementLoadSemaphore();`); 45 | document.documentElement.dispatchEvent(new CustomEvent("reset")); 46 | document.documentElement.removeAttribute("onreset"); 47 | } catch (e) { 48 | alert("Failed to load the hacks. Error:\n" + e.message); 49 | } 50 | } 51 | 52 | if (!window.scriptIsInjected) { 53 | 54 | 55 | insertCode().catch((err) => { 56 | swal.fire({ 57 | title: "Could not insert gamemin", 58 | html: err, 59 | icon: "error" 60 | }); 61 | }); 62 | 63 | 64 | 65 | 66 | 67 | /*-----------------------------------------------* 68 | * * 69 | * LATEST PHEx VERSION * 70 | * * 71 | ------------------------------------------------*/ 72 | 73 | 74 | /** User's version of PHEx */ 75 | const pluginVersion = browser.runtime.getManifest().version; 76 | 77 | /** Latest version of PHEx. */ 78 | const supportedVersion = (await (await fetch(`${redirectorDomain}/version`)).text()); 79 | 80 | 81 | /** Checks for plugin version. If outdated, triggers dialog box */ 82 | if (pluginVersion !== supportedVersion) { 83 | const res = confirm(`PHEx is outdated. If you experience any errors, please update.\n\Your Version: ${pluginVersion}\nLatest Version: ${supportedVersion}`); 84 | if (res) location = "https://github.com/ProdigyPNP/ProdigyMathGameHacking/blob/master/meta/wiki/UPDATING.md"; 85 | } 86 | 87 | 88 | 89 | 90 | 91 | /*-----------------------------------------------* 92 | * * 93 | * DISABLE INTEGRITY * 94 | * * 95 | ------------------------------------------------*/ 96 | 97 | 98 | /** Remove integrity attributes from scripts and links. */ 99 | console.groupCollapsed("[PHEx] integrity patches"); 100 | [...document.getElementsByTagName("script"), ...document.getElementsByTagName("link")].forEach(element => { 101 | if (element.hasAttribute("integrity")) { 102 | console.log("[PHEx] " + element.getAttribute("integrity")); 103 | element.removeAttribute("integrity"); 104 | } 105 | }); 106 | console.groupEnd("[PHEx] integrity patches"); 107 | /** End disable integrity */ 108 | 109 | 110 | 111 | 112 | /** Script is now injected. */ 113 | window.scriptIsInjected = true; 114 | } 115 | })(); 116 | -------------------------------------------------------------------------------- /PHEx/firefox/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Prodigy Hacking Extension | PHEx", 3 | "version": "3.0.2", 4 | "description": "Free and open source hacks for Prodigy Math Game (for Firefox).", 5 | "permissions": [ 6 | "webRequest", 7 | "webRequestBlocking", 8 | "*://*.prodigygame.com/*", 9 | "https://raw.githubusercontent.com/*", 10 | "https://infinitezero.net/*", 11 | "storage" 12 | ], 13 | "icons": { 14 | "16": "assets/x16.png", 15 | "48": "assets/x48.png", 16 | "128": "assets/x128.png" 17 | }, 18 | "background": { 19 | "scripts": ["background.js", "swal/sweetalert2.all.min.js"], 20 | "persistent": true 21 | }, 22 | "content_scripts": [{ 23 | "matches": ["https://math.prodigygame.com/*"], 24 | "js": ["disableIntegrity.js", "swal/sweetalert2.all.min.js"] 25 | }], 26 | "browser_action": { 27 | "default_popup": "popup.html" 28 | }, 29 | "manifest_version": 2 30 | } 31 | -------------------------------------------------------------------------------- /PHEx/firefox/popup.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | PHEx 12 | 13 | 14 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 |
51 | 52 | 53 |

PHEx

54 |

Firefox edition

55 | 56 | 57 | 58 |
59 | 60 |
61 | 62 | 63 |

64 | 65 | 66 |

67 | 68 |
69 | 70 | 71 |
72 | 73 | 74 | 75 |

To use the hack, just go to prodigy. If you need help, go to our Discord server.

76 | 77 | 78 | 79 |

80 | 81 | 82 |
83 | Developer Options 84 | 85 | 86 |

Developer Options

87 | 88 | 89 |

Only touch if you know what you're doing! To use the hack, just go to Prodigy. If you need help, go to our Discord server.

90 | 91 | 92 |

Custom P-NP URL

93 | 94 | 95 | 96 | 97 | 98 |

Use Custom URL

99 | 100 | 101 | 102 | 103 | 104 |

Save

105 | 106 | 107 |

Only touch if you know what you're doing! To save options, type in "nootnoot", and submit.

108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 |

117 | 118 | 119 | 120 |
121 | 122 | 123 | 124 |
125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | -------------------------------------------------------------------------------- /PHEx/firefox/popup.js: -------------------------------------------------------------------------------- 1 | (async () => { 2 | 3 | /** Set a value in the local storage */ 4 | function set(key, value) { 5 | browser.storage.local.set({ [key]: value }); 6 | }; 7 | 8 | /** Get a value from the local storage */ 9 | function get(key) { 10 | return new Promise(resolve => { 11 | browser.storage.local.get([key], result => { 12 | resolve(result[key]); 13 | }) 14 | }) 15 | }; 16 | 17 | /** Validate the URL */ 18 | function validURL(str) { 19 | var pattern = new RegExp('^(https?:\\/\\/)?'+ // protocol 20 | '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|'+ // domain name 21 | '((\\d{1,3}\\.){3}\\d{1,3}))'+ // OR ip (v4) address 22 | '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*'+ // port and path 23 | '(\\?[;&a-z\\d%_.~+=-]*)?'+ // query string 24 | '(\\#[-a-z\\d_]*)?$','i'); // fragment locator 25 | return !!pattern.test(str) || new URL(str).hostname === "localhost"; 26 | } 27 | 28 | /** Checkbox (use custom P-NP URL) */ 29 | const checkbox = document.querySelector(".check") 30 | 31 | /** Textarea (custom P-NP URL) */ 32 | const input = document.querySelector("input") 33 | 34 | // input is either the custom URL, or blank. 35 | input.value = await get("url") || ""; 36 | 37 | // checkbox is either checked or not. 38 | checkbox.checked = await get("checked") || false; 39 | 40 | input.onchange = () => { 41 | document.querySelector("p").innerHTML = "" 42 | } 43 | 44 | 45 | checkbox.addEventListener("click", async (event) => { 46 | if (await get("checked")) { 47 | // if already checked, `no` need to run checks 48 | // set checked to new value, which should be false 49 | set("checked", checkbox.checked); 50 | 51 | } else { 52 | 53 | // if we're turning on checked, we need to run a few checks 54 | if (validURL(input.value)) { 55 | // if the URL is valid, update url and checked to their latest values. 56 | set("url", input.value); 57 | set("checked", checkbox.checked); 58 | 59 | } else { 60 | // if the URL is invalid, scream at them until they burst into tears 61 | alert("[PHEx] Invalid Custom P-NP URL"); 62 | checkbox.checked = false; 63 | } 64 | } 65 | }); 66 | 67 | })(); -------------------------------------------------------------------------------- /PHEx/firefox/swal/SOURCE.txt: -------------------------------------------------------------------------------- 1 | https://github.com/sweetalert2/sweetalert2 -------------------------------------------------------------------------------- /PHEx/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "phex", 3 | "version": "3.0.1", 4 | "description": "Prodigy Hacking Extension", 5 | "main": "build.mjs", 6 | "scripts": { 7 | "js:build": "node build.mjs", 8 | "sh:build": "sh build.sh", 9 | 10 | "build": "echo \"Use js:build or sh:build\"", 11 | "start": "echo \"Use js:build or sh:build\"" 12 | }, 13 | "repository": { 14 | "type": "git", 15 | "url": "git+https://github.com/ProdigyPNP/ProdigyMathGameHacking.git" 16 | }, 17 | "keywords": [], 18 | "author": "ProdigyPNP", 19 | "license": "MPL-2.0", 20 | "bugs": { 21 | "url": "https://github.com/ProdigyPNP/ProdigyMathGameHacking/issues" 22 | }, 23 | "homepage": "https://github.com/ProdigyPNP/ProdigyMathGameHacking/blob/master/PHEx/README.md", 24 | "devDependencies": { 25 | "zip-dir": "^2.0.0" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /PHEx/src/assets/x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/7221b84ae5a0dad782f06c3cce5be9953fca5162/PHEx/src/assets/x128.png -------------------------------------------------------------------------------- /PHEx/src/assets/x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/7221b84ae5a0dad782f06c3cce5be9953fca5162/PHEx/src/assets/x16.png -------------------------------------------------------------------------------- /PHEx/src/assets/x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/7221b84ae5a0dad782f06c3cce5be9953fca5162/PHEx/src/assets/x48.png -------------------------------------------------------------------------------- /PHEx/src/block.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "priority": 1, 5 | "action": { 6 | "type": "block" 7 | }, 8 | "condition": { 9 | "urlFilter": "*://code.prodigygame.com/code/*/game.min.js?v=*" 10 | } 11 | }, 12 | 13 | { 14 | "id": 2, 15 | "priority": 1, 16 | "action": { 17 | "type": "modifyHeaders", 18 | "responseHeaders": [ 19 | { 20 | "header": "Content-Security-Policy", 21 | "operation": "remove" 22 | }, 23 | { 24 | "header": "content-security-policy", 25 | "operation": "remove" 26 | }, 27 | { 28 | "header": "X-Frame-Options", 29 | "operation": "remove" 30 | }, 31 | { 32 | "header": "x-frame-options", 33 | "operation": "remove" 34 | } 35 | ] 36 | }, 37 | "condition": { 38 | "urlFilter": "*://*.prodigygame.com/*", 39 | "resourceTypes": ["main_frame", "sub_frame", "stylesheet", "script", "image", "font", "object", "xmlhttprequest", "ping", "csp_report", "media", "websocket", "webtransport", "webbundle", "other"] 40 | } 41 | }, 42 | 43 | { 44 | "id": 3, 45 | "priority": 2, 46 | "action": { 47 | "type": "redirect", 48 | "redirect": { 49 | "url": "https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/master/.github/ppnp.png" 50 | } 51 | }, 52 | "condition": { 53 | "urlFilter": "*://cdn.prodigygame.com/game/assets/v1_cache/single-images/login-bg-13/1/login-bg-13.png", 54 | "resourceTypes": ["main_frame", "sub_frame", "stylesheet", "script", "image", "font", "object", "xmlhttprequest", "ping", "csp_report", "media", "websocket", "webtransport", "webbundle", "other"] 55 | } 56 | }, 57 | 58 | { 59 | "id": 4, 60 | "priority": 2, 61 | "action": { 62 | "type": "redirect", 63 | "redirect": { 64 | "url": "https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/master/.github/ProdigyLoaderPNP.png" 65 | } 66 | }, 67 | "condition": { 68 | "urlFilter": "*://code.prodigygame.com/assets/svg/*logo*-*.svg", 69 | "resourceTypes": ["main_frame", "sub_frame", "stylesheet", "script", "image", "font", "object", "xmlhttprequest", "ping", "csp_report", "media", "websocket", "webtransport", "webbundle", "other"] 70 | } 71 | } 72 | 73 | ] 74 | -------------------------------------------------------------------------------- /PHEx/src/disableIntegrity.js: -------------------------------------------------------------------------------- 1 | /** 2 | * disableIntegrity.js 3 | * 4 | * Currently maintained by ProdigyPNP 5 | * Original author: Prodigy-Hacking 6 | * Contributors: hostedposted, gemsvido, Eris 7 | * File has been updated for Manifest V3 8 | */ 9 | 10 | 11 | (async () => { 12 | 13 | const browser = chrome || browser; 14 | 15 | /** get an item from chrome local storage */ 16 | function get(key) { 17 | return new Promise(resolve => { 18 | browser.storage.local.get([key], result => { 19 | resolve(result[key]); 20 | }); 21 | }); 22 | } 23 | 24 | /** Custom P-NP URL */ 25 | const url = await get("url"); 26 | 27 | /** Use Custom P-NP URL */ 28 | const checked = await get("checked"); 29 | 30 | /** RedirectorDomain */ 31 | const PNPURL = (url && checked) ? url : await (await fetch("https://infinitezero.net/domain")).text(); 32 | 33 | 34 | 35 | 36 | /*-----------------------------------------------* 37 | * * 38 | * INJECT GAME.MIN.JS * 39 | * * 40 | ------------------------------------------------*/ 41 | 42 | async function insertCode () { 43 | try { 44 | /** P-NP Loader. If you're using a custom URL, then you have the ?force attribute. */ 45 | const request = await (await fetch(`https://infinitezero.net/eval${(url && checked) ? "?force=" + url : ""}`)).text(); 46 | document.documentElement.setAttribute("onreset", `${request}\nSW.Load.decrementLoadSemaphore();`); 47 | document.documentElement.dispatchEvent(new CustomEvent("reset")); 48 | document.documentElement.removeAttribute("onreset"); 49 | } catch (e) { 50 | alert("Failed to load the hacks. Error:\n" + e.message); 51 | } 52 | } 53 | 54 | 55 | 56 | 57 | 58 | /*-----------------------------------------------* 59 | * * 60 | * DISABLE INTEGRITY * 61 | * * 62 | ------------------------------------------------*/ 63 | 64 | 65 | if (!window.scriptIsInjected) { 66 | window.scriptIsInjected = true; 67 | setTimeout(insertCode, 1000); 68 | console.group("integrity patches"); 69 | [...document.getElementsByTagName("script"), ...document.getElementsByTagName("link")].forEach(v => { 70 | if (v.integrity) { 71 | console.log(v.integrity); 72 | v.removeAttribute("integrity"); 73 | } 74 | }); 75 | console.groupEnd(); 76 | } 77 | 78 | 79 | 80 | 81 | 82 | 83 | /*-----------------------------------------------* 84 | * * 85 | * LATEST PHEx VERSION * 86 | * * 87 | ------------------------------------------------*/ 88 | 89 | 90 | /** User's version of PHEx */ 91 | const pluginVersion = chrome.runtime.getManifest().version; 92 | 93 | /** Latest version of PHEx. */ 94 | const supportedVersion = (await (await fetch(`${PNPURL}/version`)).text()); 95 | 96 | 97 | /** Checks for plugin version. If outdated, triggers dialog box */ 98 | if (pluginVersion !== supportedVersion) { 99 | const res = confirm(`PHEx is outdated. If you experience any errors, please update.\n\Your Version: ${pluginVersion}\nLatest Version: ${supportedVersion}`); 100 | if (res) { location = "https://github.com/ProdigyPNP/ProdigyMathGameHacking/blob/master/meta/wiki/UPDATING.md"; } 101 | } 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | /*-----------------------------------------------* 110 | * * 111 | * CUSTOM LOADING TEXT * 112 | * * 113 | ------------------------------------------------*/ 114 | 115 | /** Custom Loading Text Array */ 116 | const customLoadingText = await (await (await fetch("https://raw.githubusercontent.com/ProdigyPNP/P-NP/master/loadingText.txt")).text()).split("\n"); 117 | 118 | /** Which text to use */ 119 | var index = 0; 120 | 121 | /** Update custom loading text index */ 122 | setInterval(() => { 123 | index = Math.floor(Math.random() * customLoadingText.length); 124 | }, 2000); 125 | 126 | 127 | /** Override the loading text */ 128 | setInterval(() => { 129 | const LT = document.getElementById("loading-text"); 130 | if (LT) LT.innerHTML = customLoadingText[index]; 131 | }, 100); 132 | 133 | 134 | 135 | 136 | })(); 137 | -------------------------------------------------------------------------------- /PHEx/src/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Prodigy Hacking Extension | PHEx", 3 | "manifest_version": 3, 4 | "version": "3.0.2", 5 | "description": "Free and open source hacks for Prodigy Math Game", 6 | "author": "ProdigyPNP", 7 | 8 | "permissions": [ 9 | "declarativeNetRequest", 10 | "storage" 11 | ], 12 | "host_permissions": [ 13 | "*://*.prodigygame.com/*", 14 | "https://raw.githubusercontent.com/*", 15 | "https://infinitezero.net/*" 16 | ], 17 | "icons": { 18 | "16": "assets/x16.png", 19 | "48": "assets/x48.png", 20 | "128": "assets/x128.png" 21 | }, 22 | "declarative_net_request" : { 23 | "rule_resources" : [ 24 | { 25 | "id": "rulesets", 26 | "enabled": true, 27 | "path": "block.json" 28 | } 29 | ] 30 | }, 31 | "content_scripts": [{ 32 | "matches": ["https://math.prodigygame.com/*"], 33 | "js": ["disableIntegrity.js", "swal/sweetalert2.all.min.js"] 34 | }], 35 | "action": { 36 | "default_popup": "popup.html", 37 | "default_icons": { 38 | "16": "assets/x16.png", 39 | "48": "assets/x48.png", 40 | "128": "assets/x128.png" 41 | }, 42 | "default_title": "Prodigy Hacking Extension | PHEx" 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /PHEx/src/popup.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | PHEx 12 | 13 | 14 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 |
51 | 52 | 53 |

PHEx

54 | 55 | 56 |
57 | 58 |
59 | 60 | 61 |

62 | 63 | 64 |

65 | 66 |
67 | 68 | 69 |
70 | 71 | 72 | 73 |

To use the hack, just go to prodigy. If you need help, go to our Discord server.

74 | 75 | 76 | 77 |

78 | 79 | 80 |
81 | Developer Options 82 | 83 | 84 |

Developer Options

85 | 86 | 87 |

Only touch if you know what you're doing! To use the hack, just go to Prodigy. If you need help, go to our Discord server.

88 | 89 | 90 |

Custom P-NP URL

91 | 92 | 93 | 94 | 95 | 96 |

Use Custom URL

97 | 98 | 99 | 100 | 101 | 102 |

Save

103 | 104 | 105 |

Only touch if you know what you're doing! To save options, type in "nootnoot", and submit.

106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 |

115 | 116 | 117 | 118 |
119 | 120 | 121 | 122 |
123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | -------------------------------------------------------------------------------- /PHEx/src/popup.js: -------------------------------------------------------------------------------- 1 | (async() => { 2 | function set(key, value) { 3 | chrome.storage.local.set({ [key]: value }) 4 | }; 5 | function get(key) { 6 | return new Promise(resolve => { 7 | chrome.storage.local.get([key], result => { 8 | resolve(result[key]) 9 | }) 10 | }) 11 | }; 12 | function validURL(str) { 13 | var pattern = new RegExp('^(https?:\\/\\/)?'+ // protocol 14 | '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|'+ // domain name 15 | '((\\d{1,3}\\.){3}\\d{1,3}))'+ // OR ip (v4) address 16 | '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*'+ // port and path 17 | '(\\?[;&a-z\\d%_.~+=-]*)?'+ // query string 18 | '(\\#[-a-z\\d_]*)?$','i'); // fragment locator 19 | return !!pattern.test(str) || new URL(str).hostname === "localhost"; 20 | } 21 | 22 | const checkbox = document.querySelector(".check") 23 | const input = document.querySelector("input") 24 | 25 | input.value = await get("url") || ""; 26 | checkbox.checked = await get("checked") || false; 27 | 28 | input.onchange = () => { 29 | document.querySelector("p").innerHTML = "" 30 | } 31 | 32 | checkbox.addEventListener("click", async (event) => { 33 | if (await get("checked")) { 34 | // if already checked, no need to run checks 35 | // set checked to new value, which should be false 36 | set("checked", checkbox.checked); 37 | } else { 38 | // if we're turning on checked, we need to run a few checks 39 | if (validURL(input.value)) { 40 | // if the URL is valid, update url and checked to their latest values. 41 | set("url", input.value); 42 | set("checked", checkbox.checked); 43 | } else { 44 | // if the URL is invalid, scream at them until they burst into tears 45 | document.querySelector("p").innerHTML = "Invalid URL"; 46 | checkbox.checked = false; 47 | } 48 | } 49 | }) 50 | })(); -------------------------------------------------------------------------------- /PHEx/status.json: -------------------------------------------------------------------------------- 1 | { 2 | "offline": false 3 | } 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

Hacks are being shut down. Thanks for everything.

2 | 3 |

Our Discord server: discord.gg/2qzTbdXSg9

4 | 5 | 6 |

7 | 8 | Prodigy Math Game Hacking 12 | 13 |

14 | 15 | 16 | 17 | 18 |

19 | 20 | Website 21 | • 22 | Discord 23 | • 24 | Installation 25 | • 26 | YouTube 27 | 28 |

29 | 30 | 31 | 32 | Discord Members 33 | 34 | 35 | 36 | 37 | 38 | 39 |

40 | 41 | 42 | 43 | 60 | 61 | 62 | 63 | 64 | ## Info 65 | 66 | 67 |

68 | This is a fork.
69 | 70 | While the repository isn't techinally a fork, we have made this repository to continue development of 71 | Prodigy-Hacking/ProdigyMathGameHacking, 72 | because that repository is archived. Also, that repository was privated at the time of us making this repostitory, so we could not reference it 73 | at the time of creating this repo. 74 |
75 | 76 | 77 |
78 | We aren't evil.
79 |

We aren't evil. Everything is open source, forever free, and without ads. 80 | 81 | We're not trying to break the game because we're evil. We wanted to help Prodigy become more secure, but they've ignored our emails and our requests to talk. They've even gone as far as to ban a user from their official Zendesk. 82 | 83 | Also they DMCA'd the original hacks, so for that they can go to hell. 84 | 85 | Because of that, we're publicly showing hacks! To be honest, it's just fun ;) 86 | 87 | All of our hacks are open source, and free. No paywalls, no ads, and no viruses.

88 | 89 |
90 | 91 | 92 |

93 | 94 | 95 |

96 | Can you hack for me?
97 |

We're not going to hack your account for you for security reasons. 98 | Giving someone else your credentials allows them to mess around on your account. 99 | Even worse, anyone with your credentials could potentially log into your actual email.

100 |
101 | 102 | 103 |

104 | 105 | 106 |

107 | How do I know you won't steal my account?
108 |

Of course, with trusting any hacks, comes the risk that we're actually bad actors that will steal all your info. 109 | It's impossible to prove with absolute certainty to anyone reading this that we aren't bad faith, but we open source our things. 110 |

111 | 112 | We do not want your account. 113 | 114 |

But what if you steal my personal info? 115 | We do not want your personal info. Please do not share it. Even if we wanted to, there's not much we could do with it. "Wow, John Doe is in 5th grade and has mastered fractions!"

116 |
117 | 118 | 119 |

120 | 121 | 122 |

123 | How do I know what code is running in the hacks?
124 |

Our code is open source, and you're always free to read any of it. If you have trouble understanding what a certain thing does, feel free to ask any of the administrators on our Discord.

125 |
126 | 127 | 128 |

129 | 130 | 131 |

132 | Legal
133 |

If you have any legal problems to us, please email ProdigyPNP@gmail.com

134 |
135 | 136 |
137 | 138 | 139 | 140 | 141 | ## Disclaimer 142 | 143 | We recommend that you use an alternate Prodigy account when using our Prodigy hacks. 144 | Using hacks on your main account could get it hacker-tagged, reset, banned, or most likely broken. 145 | 146 | We are not liable for any damage to your accounts, see our [license](LICENSE.txt) for more information. 147 | 148 | **All hacks are licensed under the Mozilla Public License (MPL) V2.0, unless stated otherwise with a separate license.** 149 | 150 |
151 | 152 | 153 | 154 | ## [The Team](meta/CONTRIBUTORS.md) 155 | 156 | ProdigyMathGameHacking was made by [all the people who have contributed to it](meta/CONTRIBUTORS.md). 157 | 158 |
159 | 160 | 161 | 162 | ## Development 163 | This organization and repo is done for. We're not maintaining anything anymore, since we've shut down. If you're interested in developing with us, join us at [@ProdigyPXP](https://github.com/ProdigyPXP)- where we'll make new software, and perhaps one day new Prodigy hacks. 164 | 165 | 170 |
171 | 172 | 173 | 174 | ## Components 175 | - [P-NP](https://github.com/ProdigyPNP/P-NP) - The serverside part of ProdigyPNP, the reason why we could modify the game code we loaded. 176 | - [ProdigyMathGameHacking](../..) - The ProdigyMathGameHacking Repository 177 | - [PHEx](PHEx/) - The Prodigy Hacking Extension, used to inject our modified game files into Prodigy. 178 | - [cheatGUI](cheatGUI/) - The cheat GUI, for user convenience, and it's pretty. 179 | - [docs](docs/) - Our documentation of Prodigy, used to find functions to build the hacks. However, it may be slightly outdated, since it's not maintained. 180 | - [meta](meta/) - Information on this repository. 181 | 182 |
183 |
184 | 185 |

186 | Jokes Card 187 |

188 | -------------------------------------------------------------------------------- /cheatGUI/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "es6": true 5 | }, 6 | "extends": [ 7 | "eslint:recommended", 8 | "plugin:@typescript-eslint/eslint-recommended", 9 | "standard" 10 | ], 11 | "globals": { 12 | "Atomics": "readonly", 13 | "SharedArrayBuffer": "readonly" 14 | }, 15 | "parser": "@typescript-eslint/parser", 16 | "parserOptions": { 17 | "ecmaVersion": 11, 18 | "sourceType": "module" 19 | }, 20 | "plugins": [ 21 | "@typescript-eslint" 22 | ], 23 | "rules": { 24 | "indent": [ 25 | "error", 26 | "tab" 27 | ], 28 | "linebreak-style": [ 29 | "error", 30 | "windows" 31 | ], 32 | "quotes": [ 33 | "error", 34 | "double" 35 | ], 36 | "semi": [ 37 | "error", 38 | "always" 39 | ], 40 | "no-tabs": "off" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /cheatGUI/.npmrc: -------------------------------------------------------------------------------- 1 | auto-install-peers=true -------------------------------------------------------------------------------- /cheatGUI/README.md: -------------------------------------------------------------------------------- 1 | # Cheat GUI 2 | 3 | 4 | This is the main cheat menu GUI for ProdigyMathGameHacking. 5 | Originally made by [Will](https://github.com/MelnCat) and maintained by [ArcerionDev](https://github.com/ArcerionDev) and [PatheticMustan](https://github.com/PatheticMustan), and now maintained by [ProdigyPNP](https://github.com/ProdigyPNP). 6 | 7 |

8 | 9 | ## Usage 10 | Install the hacks, the dropdown should appear in the top left corner after a moment. 11 | 12 |

13 | 14 | 15 | 16 | ## Development 17 | Install dependencies: 18 | ```shell 19 | pnpm run setup 20 | ``` 21 |
22 | 23 | Compile the menu: 24 | ```shell 25 | pnpm run build 26 | ``` 27 |

28 | 29 | ## Join us! 30 | We are always looking for new contributors to help maintain the hacks and menu! 31 | 32 |

33 | 34 | # Node.js package 35 | The Cheat GUI is available on npmjs at https://npmjs.com/package/cheatgui. 36 | 37 | 38 |
39 | 40 | ### Installing P-NP 41 | Shell 42 | ```shell 43 | pnpm install cheatgui 44 | pnpm install 45 | pnpm update 46 | ``` 47 | 48 |
49 | 50 | ### Uninstalling P-NP 51 | Shell 52 | ```shell 53 | pnpm uninstall cheatgui 54 | pnpm install 55 | pnpm update 56 | ``` 57 | 58 |
59 | 60 | ### Import 61 | ```es6 62 | import CheatGUI from "cheatgui"; 63 | ``` 64 | 65 |
-------------------------------------------------------------------------------- /cheatGUI/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = api => { 2 | api.cache(true); 3 | const presets = [ 4 | [ 5 | "@babel/preset-env", 6 | { 7 | targets: { 8 | esmodules: true, 9 | }, 10 | }, 11 | ], 12 | ]; 13 | const plugins = ["@babel/plugin-proposal-optional-chaining"]; 14 | return { 15 | presets, 16 | plugins, 17 | }; 18 | }; 19 | -------------------------------------------------------------------------------- /cheatGUI/hot-reload.mjs: -------------------------------------------------------------------------------- 1 | import fs from "fs"; 2 | import { Server } from "socket.io"; 3 | import http from "http"; 4 | import { exec } from "child_process"; 5 | 6 | const app = http.createServer(); 7 | 8 | const io = new Server(app, { 9 | cors: { 10 | origin: "*", 11 | methods: ["GET", "POST"], 12 | } 13 | }); 14 | 15 | fs.watch("./src/", { recursive: true }, () => { 16 | exec("pnpm webpack --mode development", (error, stdout) => { 17 | if (error) { 18 | console.log(stdout); 19 | throw error; 20 | } 21 | fs.readFile("./dist/bundle.js", (err, data) => { 22 | if (err) throw err; 23 | io.emit("update", data.toString()); 24 | }); 25 | }); 26 | }); 27 | 28 | app.listen(3001, () => console.log("Listening on port 3001")); 29 | -------------------------------------------------------------------------------- /cheatGUI/loader.cjs: -------------------------------------------------------------------------------- 1 | (async() => { 2 | eval(await (await fetch("https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/master/cheatGUI/dist/bundle.js")).text()) 3 | })() 4 | -------------------------------------------------------------------------------- /cheatGUI/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cheatgui", 3 | "version": "3.0.1", 4 | "description": "Prodigy Hack GUI", 5 | "main": "dist/bundle.js", 6 | "scripts": { 7 | "setup": "pnpm install", 8 | "build": "pnpm webpack --config webpack.config.js", 9 | "server": "node hot-reload.mjs" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "git+https://github.com/ProdigyPNP/ProdigyMathGameHacking.git#master" 14 | }, 15 | "keywords": [], 16 | "author": "ProdigyPNP", 17 | "license": "MPL-2.0", 18 | "dependencies": { 19 | "@babel/core": "^7.20.12", 20 | "@babel/plugin-proposal-optional-chaining": "^7.20.7", 21 | "@babel/preset-env": "^7.20.2", 22 | "babel": "^6.23.0", 23 | "sweetalert2-neutral": "11.6.15-neutral" 24 | }, 25 | "devDependencies": { 26 | "@typescript-eslint/eslint-plugin": "^7.0.2", 27 | "@typescript-eslint/parser": "^7.0.1", 28 | "autoprefixer": "^10.4.13", 29 | "babel-loader": "^9.1.2", 30 | "css-loader": "^7.0.0", 31 | "eslint": "^9.1.0", 32 | "eslint-config-standard": "^17.0.0", 33 | "postcss": "^8.4.21", 34 | "postcss-loader": "^8.0.0", 35 | "sass": "^1.58.0", 36 | "sass-loader": "^14.0.0", 37 | "socket.io": "^4.6.0", 38 | "socket.io-client": "^4.6.0", 39 | "style-loader": "^4.0.0", 40 | "ts-loader": "^9.4.2", 41 | "typescript": "^5.0.2", 42 | "webpack": "^5.75.0", 43 | "webpack-cli": "^5.0.1" 44 | }, 45 | "bugs": { 46 | "url": "https://github.com/ProdigyPNP/ProdigyMathGameHacking/issues" 47 | }, 48 | "homepage": "https://github.com/ProdigyPNP/ProdigyMathGameHacking/tree/master#readme" 49 | } 50 | -------------------------------------------------------------------------------- /cheatGUI/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: [ 3 | require('autoprefixer') 4 | ] 5 | }; -------------------------------------------------------------------------------- /cheatGUI/src/assets/academy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/7221b84ae5a0dad782f06c3cce5be9953fca5162/cheatGUI/src/assets/academy.png -------------------------------------------------------------------------------- /cheatGUI/src/assets/archives.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/7221b84ae5a0dad782f06c3cce5be9953fca5162/cheatGUI/src/assets/archives.png -------------------------------------------------------------------------------- /cheatGUI/src/assets/bonfire_spire.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/7221b84ae5a0dad782f06c3cce5be9953fca5162/cheatGUI/src/assets/bonfire_spire.png -------------------------------------------------------------------------------- /cheatGUI/src/assets/crystal_caverns.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/7221b84ae5a0dad782f06c3cce5be9953fca5162/cheatGUI/src/assets/crystal_caverns.png -------------------------------------------------------------------------------- /cheatGUI/src/assets/darktower.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/7221b84ae5a0dad782f06c3cce5be9953fca5162/cheatGUI/src/assets/darktower.png -------------------------------------------------------------------------------- /cheatGUI/src/assets/dyno.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/7221b84ae5a0dad782f06c3cce5be9953fca5162/cheatGUI/src/assets/dyno.png -------------------------------------------------------------------------------- /cheatGUI/src/assets/earthtower.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/7221b84ae5a0dad782f06c3cce5be9953fca5162/cheatGUI/src/assets/earthtower.png -------------------------------------------------------------------------------- /cheatGUI/src/assets/elemental_guardian.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/7221b84ae5a0dad782f06c3cce5be9953fca5162/cheatGUI/src/assets/elemental_guardian.png -------------------------------------------------------------------------------- /cheatGUI/src/assets/forest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/7221b84ae5a0dad782f06c3cce5be9953fca5162/cheatGUI/src/assets/forest.png -------------------------------------------------------------------------------- /cheatGUI/src/assets/house.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/7221b84ae5a0dad782f06c3cce5be9953fca5162/cheatGUI/src/assets/house.png -------------------------------------------------------------------------------- /cheatGUI/src/assets/lamplight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/7221b84ae5a0dad782f06c3cce5be9953fca5162/cheatGUI/src/assets/lamplight.png -------------------------------------------------------------------------------- /cheatGUI/src/assets/shipwreck_shore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/7221b84ae5a0dad782f06c3cce5be9953fca5162/cheatGUI/src/assets/shipwreck_shore.png -------------------------------------------------------------------------------- /cheatGUI/src/assets/shiverchill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/7221b84ae5a0dad782f06c3cce5be9953fca5162/cheatGUI/src/assets/shiverchill.png -------------------------------------------------------------------------------- /cheatGUI/src/assets/skywatch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/7221b84ae5a0dad782f06c3cce5be9953fca5162/cheatGUI/src/assets/skywatch.png -------------------------------------------------------------------------------- /cheatGUI/src/assets/tower_town.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/7221b84ae5a0dad782f06c3cce5be9953fca5162/cheatGUI/src/assets/tower_town.png -------------------------------------------------------------------------------- /cheatGUI/src/assets/toyzone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/7221b84ae5a0dad782f06c3cce5be9953fca5162/cheatGUI/src/assets/toyzone.png -------------------------------------------------------------------------------- /cheatGUI/src/class/Hack.ts: -------------------------------------------------------------------------------- 1 | import { saveCharacter } from "../utils/util"; 2 | 3 | 4 | 5 | export default class Hack { 6 | public element: HTMLButtonElement; 7 | public name: string; 8 | // @ts-expect-error 9 | private description: String; 10 | 11 | constructor( 12 | public parent: HTMLDivElement, 13 | name?: string, 14 | description?: string 15 | ) { 16 | this.name = ""; 17 | this.description = ""; 18 | this.element = document.createElement("button"); 19 | this.element.classList.add("menu-hack"); 20 | this.parent.append(this.element); 21 | 22 | if (name) 23 | this.setName(name); 24 | if (description) 25 | this.setDesc(description); 26 | } 27 | 28 | setName(name: string) { 29 | this.element.innerText = name; 30 | this.name = name; 31 | return this; 32 | } 33 | 34 | setClick(event: () => unknown) { 35 | this.element.onclick = async () => { 36 | await event(); 37 | saveCharacter(); 38 | console.log(`Triggered ${this.name}.`); 39 | }; 40 | return this; 41 | } 42 | 43 | setDesc(desc: string) { 44 | this.element.title = desc; 45 | this.description = desc; 46 | return this; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /cheatGUI/src/class/Toggler.ts: -------------------------------------------------------------------------------- 1 | import Hack from "./Hack"; 2 | 3 | 4 | 5 | 6 | export default class Toggler extends Hack { 7 | enabled?: () => unknown; 8 | disabled?: () => unknown; 9 | constructor( 10 | public parent: HTMLDivElement, 11 | name?: string, 12 | description?: string 13 | ) { 14 | super(parent, name, description); 15 | this.element.setAttribute("status", "false"); 16 | this.setClick(async () => { 17 | this.status = !this.status; 18 | if (this.status) { 19 | localStorage.setItem(this.name, "true"); 20 | await this.enabled?.(); 21 | } else { 22 | localStorage.setItem(this.name, "false"); 23 | await this.disabled?.(); 24 | } 25 | }); 26 | } 27 | 28 | get status() { 29 | return JSON.parse(this.element.getAttribute("status")!) as boolean; 30 | } 31 | 32 | set status(val) { 33 | this.element.setAttribute("status", val.toString()); 34 | } 35 | 36 | setEnabled(event: () => unknown) { 37 | this.enabled = event; 38 | if (localStorage.getItem(this.name) === "true") { 39 | this.element.click(); 40 | } 41 | return this; 42 | } 43 | 44 | setDisabled(event: () => unknown) { 45 | this.disabled = event; 46 | return this; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /cheatGUI/src/declarations.d.ts: -------------------------------------------------------------------------------- 1 | import {} from "../../typings/pixi"; -------------------------------------------------------------------------------- /cheatGUI/src/hacks/battle.ts: -------------------------------------------------------------------------------- 1 | // Battle Hacks 2 | 3 | 4 | 5 | // BEGIN IMPORTS 6 | import { Toast, NumberInput } from "../utils/swal"; // Import Toast and NumberInput from swal 7 | import { category } from "../index"; // Import the Cheat GUI bases. 8 | import Toggler from "../class/Toggler"; 9 | import Hack from "../class/Hack"; 10 | import { _, prodigy, game, VERY_LARGE_NUMBER, player } from "../utils/util"; // Import prodigy typings 11 | // END IMPORTS 12 | 13 | 14 | 15 | // BEGIN BATTLE HACKS 16 | 17 | 18 | 19 | // Begin Disable Math 20 | new Toggler(category.battle, "Disable math [PvP, PvE]", "Disable math in PvP, PvE, anywhere! This doesn't work in the Floatling town.").setEnabled(async () => { 21 | 22 | // Use Prodigy's debug stuff to set EDUCATION_ENABLED to false 23 | _.constants.constants["GameConstants.Debug.EDUCATION_ENABLED"] = false; 24 | return Toast.fire("Enabled!", "You will no longer do Math!", "success"); 25 | 26 | 27 | }).setDisabled(async () => { 28 | 29 | // Use Prodigy's debug stuff to set EDUCATION_ENABLED to true 30 | _.constants.constants["GameConstants.Debug.EDUCATION_ENABLED"] = true; 31 | return Toast.fire("Disabled!", "You will now do Math!", "success"); 32 | 33 | }); 34 | // End Disable Math 35 | 36 | 37 | 38 | 39 | 40 | 41 | // Begin Instant Kill 42 | new Toggler(category.battle, "Instant Kill [PvE]", "Makes your spells do insane damage in PvE!").setEnabled(async () => { 43 | player.modifiers.damage = VERY_LARGE_NUMBER; 44 | return Toast.fire("Enabled!", "You will now do insane damage in PvE!", "success"); 45 | 46 | }).setDisabled(() => { 47 | player.modifiers.damage = 1; 48 | return Toast.fire("Disabled!", "You will no longer do insane damage in PvE!", "success"); 49 | }); 50 | // End Instant Kill 51 | 52 | 53 | 54 | 55 | 56 | 57 | // Begin PvP Health 58 | new Hack(category.battle, "PvP Health [PvP]", "Increases your HP in PvP by a hell ton.").setClick(async () => { 59 | player.pvpHP = VERY_LARGE_NUMBER; 60 | player.getMaxHearts = () => VERY_LARGE_NUMBER; 61 | return Toast.fire("Success!", "You now have lots of health!", "success"); 62 | }); 63 | // End PvP Health 64 | 65 | 66 | 67 | 68 | 69 | 70 | // Begin Escape Battle 71 | new Hack(category.battle, "Escape Battle [PvP, PvE]", "Escape any battle, PvP or PvE!").setClick(async () => { 72 | const currentState = game.state.current; 73 | if (currentState === "PVP") { 74 | Object.fromEntries(_.instance.game.state.states).PVP.endPVP(); 75 | return Toast.fire( 76 | "Escaped!", 77 | "You have successfully escaped from the PvP battle.", 78 | "success" 79 | ); 80 | } else if (currentState === "CoOp") { 81 | prodigy.world.$(player.data.zone); 82 | return Toast.fire( 83 | "Escaped!", 84 | "You have successfully escaped from the battle.", 85 | "success" 86 | ); 87 | } else if (!["Battle", "SecureBattle"].includes(currentState)) { 88 | return Toast.fire( 89 | "Invalid State.", 90 | "You are currently not in a battle.", 91 | "error" 92 | ); 93 | } else { 94 | Object.fromEntries(_.instance.game.state.states)[currentState].runAwayCallback(); 95 | return Toast.fire( 96 | "Escaped!", 97 | "You have successfully escaped from the PvE battle.", 98 | "success" 99 | ); 100 | } 101 | }); 102 | // End Escape Battle 103 | 104 | 105 | 106 | 107 | 108 | // Begin Win Battle 109 | new Hack(category.battle, "Win Battle [PvE]", "Instantly win a battle in PvE.").setClick(async () => { 110 | 111 | const currentState = game.state.current; 112 | console.log("Current State: " + currentState); 113 | 114 | switch (currentState) { 115 | case "PVP": 116 | case "CoOp": 117 | return Toast.fire( 118 | "Invalid State.", 119 | "PvP is not supported for this hack.", 120 | "error" 121 | ); 122 | case "Battle": 123 | Object.fromEntries(_.instance.game.state.states).Battle.startVictory(); 124 | return Toast.fire( 125 | "Victory!", 126 | "You have successfully won the battle.", 127 | "success" 128 | ); 129 | case "SecureBattle": 130 | Object.fromEntries(_.instance.game.state.states).SecureBattle.battleVictory(); 131 | return Toast.fire( 132 | "Victory!", 133 | "You have successfully won the battle.", 134 | "success" 135 | ); 136 | default: 137 | return Toast.fire( 138 | "Invalid State.", 139 | "You are currently not in a battle.", 140 | "error" 141 | ); 142 | } 143 | 144 | 145 | }); 146 | // End Win Battle 147 | 148 | 149 | 150 | 151 | 152 | 153 | // Begin Set Battle Hearts 154 | new Hack(category.battle, "Set Battle Hearts [PvP, PvE]", "Sets your hearts in battle, automatically raise your max hearts in PvP or PvE.").setClick(async () => { 155 | const hp = await NumberInput.fire("Health Amount", "How much HP do you want?", "question"); 156 | if (hp.value === undefined) return; 157 | player.getMaxHearts = () => +hp.value; 158 | player.pvpHP = +hp.value; 159 | player.data.hp = +hp.value; 160 | return Toast.fire("Success!", "Your hearts have been set.", "success"); 161 | }); 162 | // End Set Battle Hearts 163 | 164 | 165 | 166 | 167 | 168 | // Begin Fill Battle Energy 169 | new Hack(category.battle, "Fill Battle Energy [PvP, PvE]", "Fills up your battle energy, if you are in PvP or PvE.").setClick(async () => { 170 | const state = game.state.getCurrentState(); 171 | if (!("teams" in state)) return Toast.fire("Error", "You are currently not in a battle.", "error"); 172 | state.teams[0].setEnergy(99); 173 | return Toast.fire("Success!", "Your battle energy has been filled.", "success"); 174 | }); 175 | // End Fill Battle Energy 176 | 177 | 178 | // Begin Skip enemy turn 179 | new Toggler(category.battle, "Skip enemy turn").setEnabled(async () => { 180 | _.constants.constants["GameConstants.Battle.SKIP_ENEMY_TURN"] = true; 181 | return Toast.fire("Skipping!", "Enemy turns will now be skipped.", "success"); 182 | }).setDisabled(async () => { 183 | _.constants.constants["GameConstants.Battle.SKIP_ENEMY_TURN"] = false; 184 | return Toast.fire("Disabled", "Enemy turns will no longer be skipped.", "success"); 185 | }); 186 | // End Skip enemy turn 187 | 188 | 189 | 190 | 191 | 192 | 193 | // Begin Heal Team 194 | new Hack(category.battle, "Heal Team [PvE]", "Instantly heals you and your pets, if you are in PvE.").setClick(async () => { 195 | 196 | 197 | const currentState: string = game.state.current; 198 | 199 | 200 | if (currentState === "PVP" || currentState === "CoOp") { 201 | 202 | return Toast.fire("Invalid State.", "PvP is not supported for this hack.", "error"); 203 | 204 | } else if (["Battle", "SecureBattle"].includes(currentState)) { 205 | player.heal(); 206 | return Toast.fire("Success!", "Your team has been healed successfully!", "success"); 207 | } else { 208 | return Toast.fire("Invalid State.", "Your are currently not in a battle.", "error"); 209 | } 210 | }); 211 | // End Heal Team 212 | 213 | 214 | 215 | // END BATTLE HACKS 216 | -------------------------------------------------------------------------------- /cheatGUI/src/hacks/minigame.ts: -------------------------------------------------------------------------------- 1 | // Minigame Hacks 2 | 3 | // BEGIN IMPORTS 4 | import { category } from "../index"; // Import the Cheat GUI bases. 5 | import Toggler from "../class/Toggler"; 6 | import { _ } from "../utils/util"; // Import Prodigy Typings. 7 | import { Toast } from "../utils/swal"; // Import Toast and NumberInput from swal 8 | // END IMPORTS 9 | 10 | 11 | // BEGIN MINIGAME HACKS 12 | 13 | 14 | 15 | // Begin 69x Walk Speed 16 | new Toggler(category.minigames, "69x Walk Speed [Dyno Dig]", "Walk so fast that you're teleporting, in Dyno Dig.").setEnabled(async () => { 17 | _.instance.game.state.states.get("DinoDig").walkSpeed = 69; 18 | return Toast.fire("Enabled!", "You will now walk so fast that you're teleporting in Dyno Dig.", "success"); 19 | 20 | }).setDisabled(async () => { 21 | _.instance.game.state.states.get("DinoDig").walkSpeed = 1.5; 22 | return Toast.fire("Disabled!", "You will now walk at normal speed, in Dyno Dig.", "success"); 23 | }); 24 | // End 69x Walk Speed 25 | 26 | 27 | 28 | // END MINIGAME HACKS 29 | -------------------------------------------------------------------------------- /cheatGUI/src/hacks/misc.ts: -------------------------------------------------------------------------------- 1 | // Miscellaneous Hacks 2 | 3 | 4 | 5 | // BEGIN IMPORTS 6 | import { Toast, Confirm, Swal } from "../utils/swal"; // Import Toast and Confirm from swal 7 | import { category } from "../index"; // Import the Cheat GUI bases. 8 | import Toggler from "../class/Toggler"; 9 | import Hack from "../class/Hack"; 10 | import { current, player, _ } from "../utils/util"; // Import Prodigy typings 11 | import { startFps, stopFps } from "../utils/fps"; 12 | // END IMPORTS 13 | 14 | 15 | // BEGIN MISCELLANEOUS HACKS 16 | 17 | 18 | 19 | // Begin Skip Tutorial 20 | new Hack(category.misc, "Skip Tutorial").setClick(async () => { 21 | const setQuest = (t: string, i: number, n?: unknown, e?: unknown) => { 22 | _.instance.prodigy.world.getZone(t).testQuest(i, n, e); 23 | try { 24 | Object.fromEntries(_.instance.game.state.states).TileScreen.process(); 25 | } catch {} 26 | }; 27 | 28 | setQuest("house", 2); 29 | setQuest("academy", 2); 30 | player.state.set("tutorial-0", 4); 31 | player.backpack.addKeyItem(13, 0); 32 | player.tutorial.data.menus[14] = [1]; 33 | _.instance.prodigy.open.map(true, []); 34 | player.onTutorialComplete(); 35 | player.data.level = Math.max(player.data.level, 5); 36 | }); 37 | // End Skip Tutorial 38 | 39 | 40 | 41 | // Begin Disable Monster Encounters 42 | new Toggler(category.misc, "Disable Monster Encounters").setEnabled(async () => { 43 | _.constants.constants["GameConstants.Debug.SCALE_ENCOUNTER_DISTANCE"] = 0; 44 | return Toast.fire("Enabled!", "Monsters will no longer battle you.", "success"); 45 | 46 | }).setDisabled(() => { 47 | _.constants.constants["GameConstants.Debug.SCALE_ENCOUNTER_DISTANCE"] = 1; 48 | return Toast.fire("Disabled!", "Monsters will now battle you.", "success"); 49 | }); 50 | // End Disable Monster Encounters 51 | 52 | 53 | // Begin FPS Counter 54 | new Toggler(category.beta, "FPS Counter [BETA]", "Shows you a framerate counter").setEnabled(async () => { 55 | startFps(); 56 | }).setDisabled(async() => { 57 | stopFps(); 58 | }); 59 | // End FPS Counter 60 | 61 | 62 | // Begin Unlimited Spins 63 | try { 64 | const canSpinBackup = current.user.source.canSpin; 65 | new Toggler(category.misc, "Unlimited Spins", "Lets you spin the wheel as many times as you want!").setEnabled(async () => { 66 | player.canSpin = (() => { true; }); 67 | return Toast.fire("Enabled!", "You can now spin the wheel as many times as you want!", "success"); 68 | }).setDisabled(async() => { 69 | player.canSpin = canSpinBackup; 70 | return Toast.fire("Disabled!", "You can now spin the wheel only when allowed.", "success"); 71 | }); 72 | // End Unlimited Spins 73 | } catch (error : unknown) { 74 | console.error("Unlimited Spins ERROR: " + error); 75 | } 76 | 77 | 78 | // Begin Bobbify 79 | new Hack(category.misc, "Bobbify", "Converts your account into Bobby Fancywoman.").setClick(async () => { 80 | if (!( 81 | await Confirm.fire("Are you sure you want your account to be turned into Bobby Fancywoman?", "This action is not reversable.") 82 | ).value) return; 83 | 84 | player.name.data.nickname = null; 85 | player.name.data.firstName = 44; 86 | player.name.data.middleName = 754; 87 | player.name.data.lastName = 882; 88 | player.data.stars = -1e22; 89 | player.data.level = 69; 90 | 91 | player.appearance.setGender("male"); 92 | player.appearance.setEyeColor(1); 93 | player.appearance.setFace(4); 94 | player.appearance.setHair(19, 1); 95 | player.appearance.setSkinColor(1); 96 | player.equipment.setFollow(19); 97 | player.equipment.setHat(19); 98 | player.equipment.setBoots(19); 99 | player.equipment.setOutfit(19); 100 | player.equipment.setWeapon(19); 101 | 102 | return Toast.fire("Bobbified!", "You are now Bobby Fancywoman.", "success"); 103 | }); 104 | // End Bobbify 105 | 106 | 107 | 108 | // Begin Reset Account 109 | new Hack(category.misc, "Reset Account", "Completely resets your account.").setClick(async () => { 110 | if (!(await Confirm.fire("Are you sure you want to reset your account?", "This action is not reversible.")).value) return; 111 | player.resetAccount(); 112 | return Swal.fire("Reset!", "Your account has been reset. Reload Prodigy for the full effect.", "success"); 113 | }); 114 | // End Reset Account 115 | 116 | 117 | 118 | // Begin Fix Battle Crash 119 | new Hack(category.misc, "[Fix] Fix Battle Crash").setClick(async () => { 120 | // @ts-expect-error 121 | player.kennel.petTeam.forEach(v => { 122 | if (v && (v as any).assignRandomSpells) (v as any).assignRandomSpells(); 123 | }); 124 | 125 | return Toast.fire("Success!", "Fixed kennel attack bug!", "success"); 126 | }); 127 | // End Fix Battle Crash 128 | 129 | 130 | 131 | // Begin Stuck in Unfinished Tower Fix 132 | new Hack(category.misc, "[Fix] Stuck in Unfinished Tower Fix", "Takes you out of an unfinished tower if you're stuck in one.").setClick(async () => { 133 | _.instance.prodigy.world.zones["house"].teleport("exit"); 134 | return Toast.fire("Success!", "You've been teleported outside of your house.", "success"); 135 | }); 136 | // End Stuck in Unfinished Tower Fix 137 | 138 | 139 | 140 | 141 | // Begin uwu 142 | new Hack(category.misc, "uwu", "OwO").setClick(async () => { 143 | 144 | if (!( 145 | await Confirm.fire("Are you sure that you want to UwU OwO?", "Reload Prodigy to revert UwU.") 146 | ).value) return console.log("uwu cancelled"); 147 | 148 | // @ts-ignore 149 | // eslint-disable-next-line 150 | Object.chance = t => { const e = {}; let r = 0; for (const n of Object.keys(t).sort((t, r) => e[t] - e[r]))e[n] = [], e[n][0] = r + 1, e[n][1] = t[n] + r, r = t[n] + r; return e; }, Object.random = t => { const e = Object.values(t); const r = e[e.length - 1][1]; const n = Math.randint(r); return Object.reverse(t)[e.find(t => n >= t[0] && n <= t[1])]; }, Array.prototype.join = function (t = ",") { return typeof t === "string" ? this.reduce((e, r, n, o) => e + (n < this.length - 1 ? r + t : r), "") : t instanceof Function ? this.reduce((e, r, n, o) => e + (n < this.length - 1 ? r + t(o[n], n, o) : r), "") : void 0; }, Array.prototype.leftJoin = function (t = ",") { return typeof t === "string" ? this.reduce((e, r, n) => e + (n ? t + r : r), "") : t instanceof Function ? this.reduce((e, r, n, o) => e + (n ? t(o[n], n, o) + r : r), "") : void 0; }, String.UWUFX = t => { const e = Object.chance({ "owo :3": 20, "✧w✧": 20, UwU: 20, OwO: 10, rawr: 10, "uwu :3": 5, ":3 meow": 15, ":3": 15, X3: 15, "*purrs*": 15, owo: 15, uwu: 15, "^w^": 15, "x3 rawr": 15, owowowowo: 15 }); return t.split(" ").leftJoin((t, e) => Math.floor(6 * Math.random()) === 0 && /[A-Za-z]/.test(t[0]) ? ` ${t[0]}-` : " ").split(" ").join((t, r) => Math.floor(5 * Math.random()) === 0 ? ` ${Object.random(e)} ` : " "); }, String.UWUTable = { y: "wy", l: "w", r: "w", ss: "zs", n: "nw", ove: "uv", ome: "um", x: "ks", com: "cum", stu: "stew", au: "aw" }, Math.randint = (t, e = 0) => Math.floor(Math.random() * t - e) + e, String.prototype.escapeRegex = function () { return this.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); }, String.prototype.replaceAll = function (t, e) { return this.replace(new RegExp(t.toString().escapeRegex(), "gi"), t => e); }, Object.fromArrays = (t, e) => { const r = {}; return t.forEach((t, n) => { r[t] = e[n]; }), r; }, Object.reverse = t => Object.fromArrays(Object.values(t), Object.keys(t)), String.prototype.bulkReplace = function (t) { let e = this; for (const r in t)e = e.replaceAll(r, t[r]); return e; }, String.UWU = t => String(t).bulkReplace(String.UWUTable); Object.keys(_.localizer.dataSource._languageData).map(x => _.localizer.dataSource._languageData[x] = String.UWUFX(String.UWU(_.localizer.dataSource._languageData[x]))); Object.values(_.gameData).map(x => x.map(y => [y.data.name && (y.data.name = String.UWUFX(String.UWU(y.data.name))), y.name && (y.name = String.UWUFX(String.UWU(y.name))), y.data.flavorText && (y.data.flavorText = String.UWUFX(String.UWU(y.data.flavorText)))])); 151 | return Toast.fire("uwu", "Reload Prodigy to fix uwu.", "success"); 152 | }); 153 | // End uwu 154 | 155 | 156 | 157 | 158 | 159 | // END MISCELLANEOUS HACKS 160 | -------------------------------------------------------------------------------- /cheatGUI/src/hacks/patched.ts: -------------------------------------------------------------------------------- 1 | // Patched Hacks 2 | 3 | 4 | // BEGIN IMPORTS 5 | import { Swal, Confirm, Toast } from "../utils/swal"; 6 | import { category} from "../index"; // Import the Cheat GUI bases. 7 | import Hack from "../class/Hack"; 8 | import { _, prodigy, player } from "../utils/util"; // Import Prodigy typings and VERY_LARGE_NUMBER 9 | // END IMPORTS 10 | 11 | 12 | 13 | 14 | // BEGIN PATCHED HACKS 15 | 16 | 17 | 18 | // Begin Arena Point Increaser 19 | let interval: unknown | null = null; 20 | 21 | new Hack(category.patched, "Arena Point Increaser [Patched]").setClick(async () => { 22 | 23 | 24 | if (interval) { 25 | return Swal.fire("Already Enabled", "Arena Point Increaser is already enabled.", "error"); 26 | } else if (!(await Confirm.fire("This hack is patched.", "Running it will probably do nothing.")).value) { 27 | return console.log("Cancelled"); 28 | } else { 29 | 30 | interval = setInterval(async () => { 31 | const data = await ( 32 | await fetch( 33 | `https://api.prodigygame.com/leaderboard-api/season/${prodigy.pvpNetworkHandler.seasonID}/user/${player.userID}/pvp?userID=${player.userID}`, { 34 | headers: { 35 | // @ts-expect-error 36 | authorization: `Bearer ${prodigy.network.jwtAuthProvider.getToken()}`, 37 | "content-type": "application/x-www-form-urlencoded; charset=UTF-8", 38 | }, 39 | body: `seasonID=${prodigy.pvpNetworkHandler.seasonID}&action=win`, 40 | method: "POST", 41 | mode: "cors", 42 | } 43 | ) 44 | ).text(); 45 | if (data !== "") { 46 | const jsoned: { 47 | points: number; 48 | weeklyPoints: number; 49 | modifiedDate: string; 50 | seasonID: number; 51 | numMatches: number; 52 | } = JSON.parse(data); 53 | console.log(`[API] ${jsoned.points} Points (+100)`); 54 | } else console.log(`[API] Failed to add points.`); 55 | }, 60500); 56 | return Swal.fire("Enabled", "Arena Point Increaser has been enabled.", "success"); 57 | } 58 | }); 59 | // End Arena Point Increaser 60 | 61 | 62 | 63 | 64 | // Begin Disable Timeout Dialog 65 | new Hack(category.patched, "Disable Timeout Dialog [Patched]").setClick(async () => { 66 | if (!(await Confirm.fire("This hack is patched.", "Running it will probably do nothing.")).value) { 67 | return console.log("Cancelled"); 68 | } else { 69 | // @ts-expect-error 70 | prodigy.debugMisc.disableTimeoutDialogue(); 71 | } 72 | return Toast.fire("Enabled", "Timeout Dialog has been disabled.", "success"); 73 | }); 74 | // End Disable Timeout Dialog 75 | 76 | 77 | 78 | 79 | 80 | 81 | /* Old Inventory hacks, replaced by Selector 82 | 83 | const inventoryHack = (name: string, id: BackpackItemType, amount: number = 1) => { 84 | new Hack(category.inventory, `Obtain All ${name}`).setClick(async () => { 85 | if (!(await Confirm.fire(`Are you sure you want to get all ${name}?`)).value) return; 86 | player.backpack.data[id] = itemify(_.gameData[id], amount); 87 | Toast.fire( 88 | `${name} Added!`, 89 | `All ${name.toLowerCase()} have been added to your inventory!`, 90 | "success" 91 | ); 92 | }); 93 | }; 94 | inventoryHack("Boots", "boots"); 95 | inventoryHack("Buddies", "follow"); 96 | inventoryHack("Fossils", "fossil", VERY_LARGE_NUMBER); 97 | inventoryHack("Hats", "hat"); 98 | inventoryHack("Items", "item", VERY_LARGE_NUMBER); 99 | inventoryHack("Key Items", "key", VERY_LARGE_NUMBER); 100 | inventoryHack("Math Town Frames", "mathTownFrame", VERY_LARGE_NUMBER); 101 | inventoryHack("Math Town Interiors", "mathTownInterior", VERY_LARGE_NUMBER); 102 | inventoryHack("Mounts", "mount"); 103 | inventoryHack("Outfits", "outfit"); 104 | inventoryHack("Relics", "relic"); 105 | inventoryHack("Spell Relics", "spellRelic"); 106 | inventoryHack("Weapons", "weapon"); 107 | inventoryHack("Currency", "currency", VERY_LARGE_NUMBER); 108 | 109 | End Old Inventory Hacks */ 110 | 111 | // END PATCHED HACKS 112 | -------------------------------------------------------------------------------- /cheatGUI/src/hacks/pets.ts: -------------------------------------------------------------------------------- 1 | // Pet Hacks 2 | 3 | 4 | // BEGIN IMPORTS 5 | import { Swal, Toast, NumberInput, Confirm } from "../utils/swal"; // Import Swal, Toast, Confirm, Input, and NumberInput from swal 6 | import { category } from "../index"; // Import the Cheat GUI bases. 7 | import Hack from "../class/Hack"; 8 | import { _, VERY_LARGE_NUMBER, player } from "../utils/util"; // Import Prodigy typings and VERY_LARGE_NUMBER 9 | import { getPet } from "../utils/hackify"; // Import getPet 10 | // END IMPORTS 11 | 12 | 13 | // BEGIN PET HACKS 14 | 15 | 16 | // Begin Get All Pets 17 | new Hack(category.pets, "Get All Pets").setClick(async () => { 18 | 19 | 20 | if (!(await Confirm.fire("Would you like to add all pets to your pets?")).value) { 21 | return console.log("Cancelled"); 22 | } 23 | 24 | 25 | // add pets 26 | // @ts-expect-error 27 | _.gameData.pet.forEach(x => { 28 | player.kennel.addPet(x.ID.toString(), VERY_LARGE_NUMBER, 26376, 100); 29 | }); 30 | 31 | 32 | // add encounter info 33 | player.kennel._encounterInfo._data.pets = []; 34 | _.gameData.pet.map((pet: { 35 | ID: number 36 | }) => { 37 | player.kennel._encounterInfo._data.pets.push({ 38 | firstSeenDate: Date.now(), 39 | ID: pet.ID, 40 | timesBattled: 1, 41 | timesRescued: 1 42 | }); 43 | }); 44 | // Fix broken pets 45 | // @ts-expect-error 46 | player.kennel.petTeam.forEach(v => { 47 | if (v && (v as any).assignRandomSpells)(v as any).assignRandomSpells(); 48 | }); 49 | 50 | return Toast.fire("Success!", "All pets have been added!", "success"); 51 | }); 52 | // End Get All Pets 53 | 54 | 55 | 56 | 57 | // Begin Get ALl Legacy Epics 58 | new Hack(category.pets, "Get All Legacy Epics").setClick(async () => { 59 | 60 | 61 | if (!(await Confirm.fire("This may damage your account.", "Attempting to add legacy epics may damage your account. Would you still like to add all legacy epics to your team?", "warning")).value) { 62 | return console.log("Cancelled"); 63 | } 64 | 65 | // @ts-expect-error 66 | const epics = _.gameData.pet.filter(x => [125, 126, 127, 128, 129, 130, 131, 132, 133].includes(x.ID)); 67 | // @ts-expect-error 68 | epics.forEach(x => { 69 | player.kennel.addPet(x.ID.toString(), VERY_LARGE_NUMBER, 26376, 100); 70 | }); 71 | // Fix broken pets 72 | // @ts-expect-error 73 | player.kennel.petTeam.forEach(v => { 74 | if (v && (v as any).assignRandomSpells)(v as any).assignRandomSpells(); 75 | }); 76 | return Toast.fire("Success!", "All legacy epics have been added!", "success"); 77 | }); 78 | // End Get ALl Legacy Epics 79 | 80 | 81 | 82 | 83 | 84 | // Begin Get All Mythical Epics 85 | new Hack(category.pets, "Get All Mythical Epics").setClick(async () => { 86 | 87 | if (!(await Confirm.fire("Would you like to add all mythical epics to your pets?")).value) { 88 | return console.log("Cancelled"); 89 | } 90 | 91 | 92 | // @ts-expect-error 93 | const epics = _.gameData.pet.filter(x => [ 94 | 158, // Magmayhem 95 | 164, // Blast Star 96 | 165, // Vegabloom 97 | 166, // Arcturion 98 | 167, // Aquadile 99 | 168, // Shiver & Scorch 100 | 169, // Riptide 101 | 170, // Lumanight 102 | 171, // Nebula 103 | 189, // B.F. Magmayhem 104 | ].includes(x.ID)); 105 | // @ts-expect-error 106 | epics.forEach(x => { 107 | player.kennel.addPet(x.ID.toString(), VERY_LARGE_NUMBER, 26376, 100); 108 | }); 109 | // Fix broken pets 110 | player.kennel.petTeam.forEach((v: any) => { 111 | if (v && (v as any).assignRandomSpells) (v as any).assignRandomSpells(); 112 | }); 113 | return Toast.fire("Success!", "All mythical epics have been added!", "success"); 114 | }); // btw this hack was made by gemsvidø (afkvido on github) 115 | // End Get ALl Mythical Epics 116 | 117 | 118 | 119 | 120 | 121 | // Begin Clear Pets 122 | new Hack(category.pets, "Clear Pets").setClick(async () => { 123 | 124 | if (!(await Confirm.fire("Would you like to delete all of your pets?")).value) { 125 | return console.log("Cancelled"); 126 | } 127 | 128 | 129 | player.kennel.data.length = 0; 130 | 131 | return Toast.fire("Success!", "Your pets have been cleared!", "success"); 132 | }); 133 | // End Clear Pets 134 | 135 | 136 | 137 | 138 | 139 | // Begin Add Pet 140 | new Hack(category.pets, "Add Pet", "Adds a pet from a list.").setClick(async () => { 141 | // @ts-expect-error 142 | const pet = await Swal.fire({ 143 | input: "select", 144 | // @ts-expect-error 145 | inputOptions: new Map(_.gameData.pet.map(x => [x.ID.toString(), `${x.ID}: ${x.data.name}`])), 146 | title: "Choose Pet", 147 | text: "Which pet do you want to obtain?" 148 | }); 149 | if (pet.value === undefined) return; 150 | player.kennel.addPet(pet.value); 151 | // add encounter data 152 | player.kennel._encounterInfo._data.pets.push({ 153 | firstSeenDate: Date.now(), 154 | ID: pet.value, 155 | timesBattled: 1, 156 | timesRescued: 1 157 | }); 158 | 159 | return Toast.fire("Success!", "Your chosen pet has been added to your pets!", "success"); 160 | }); 161 | // End Add Pet 162 | 163 | 164 | 165 | 166 | 167 | // Begin Uncap pet level 168 | new Hack(category.pets, "Uncap pet level [Client Side]", "Change your pet's level to anything, even over 100. This hack won't save when you reload Prodigy.").setClick(async () => { 169 | const petTeam = player.kennel.petTeam.slice(0); 170 | petTeam.shift(); 171 | // @ts-expect-error 172 | const names = petTeam.map(pet => pet.getName()); 173 | const pet = await Swal.fire({ 174 | title: "Which pet would you like to edit?", 175 | input: "select", 176 | inputOptions: names, 177 | inputPlaceholder: "Select...", 178 | inputValidator: res => res ? "" : "Please select which you'd like to obtain.", 179 | showCancelButton: true 180 | }); 181 | const amt = await NumberInput.fire("Level", "What would you like to set your pet's level to? (Can be set over 100)", "question"); 182 | if (!amt.value) return; 183 | const num = amt.value; 184 | // sorry in advance 185 | eval(`player.kennel.petTeam[parseInt(${pet.value})+1].getLevel = () => {return ${num}}`); 186 | return Toast.fire("Updated!", "The level of your pet was successfully updated. Note: this hack is client-side.", "success"); 187 | }); 188 | // End Uncap pet level 189 | 190 | 191 | 192 | 193 | 194 | // Begin Delete Pet 195 | new Hack(category.pets, "Delete Pet", "Delete a pet.").setClick(async () => { 196 | const pet = await getPet("Which pet do you wish to delete?"); 197 | if (pet === undefined) return; 198 | player.kennel.data.splice(pet, 1); 199 | return Toast.fire("Successfully deleted!", "The selected pet was deleted successfully.", "success"); 200 | }); 201 | // End Delete Pet 202 | 203 | 204 | 205 | 206 | // END PET HACKS 207 | -------------------------------------------------------------------------------- /cheatGUI/src/index.ts: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | // Prodigy Cheat GUI 3 | 4 | import { io } from "socket.io-client"; // Import socket.io-client 5 | import "./style.scss"; // Import SCSS style 6 | import { _ } from "./utils/util"; // Import Prodigy typings 7 | import { statusMessage } from "./utils/status"; // Import status message 8 | import Swal from "sweetalert2"; // Import Swal 9 | import { License, NoLicense } from "./utils/swal"; 10 | import openChat from "./utils/chat"; 11 | 12 | export const menu = document.createElement("div"); // Create cheat menu element 13 | export const wrapper = document.getElementById("game-wrapper"); // Create game wrapper 14 | 15 | document.getElementById("cheat-menu")?.remove(); // Remove any existing menu if present 16 | document.getElementById("menu-toggler")?.remove(); // Remove any existing menu togglers if present 17 | menu.id = "cheat-menu"; // Set menu ID to cheat-menu 18 | 19 | 20 | menu.style = "position: fixed;top: -10%;left: 10%;right: 10%;width: 80%;height: 80%;z-index: 2;background-color: rgba(0, 0, 0, 0.5);backdrop-filter: blur(5px);"; // Set menu style 21 | 22 | wrapper?.prepend(menu); 23 | 24 | export const toggler = document.createElement("button"); // Create menu toggler 25 | toggler.id = "menu-toggler"; 26 | 27 | 28 | let visible = false; 29 | wrapper?.prepend(toggler); 30 | toggler.onclick = () => { 31 | visible = !visible; 32 | 33 | if (visible) { 34 | toggler.innerText = "▼"; 35 | menu.style.top = "-100vh"; 36 | } else { 37 | toggler.innerText = "▲"; 38 | menu.style.top = "10%"; 39 | } 40 | }; 41 | toggler.onclick({} as any); 42 | 43 | const menuleft = document.createElement("DIV"); 44 | menuleft.classList.add("menu-left"); 45 | menu.append(menuleft); 46 | 47 | let firstCategory = true; 48 | function addArea (title: string) { 49 | const area = document.createElement("div"); 50 | 51 | if (firstCategory == false) { 52 | area.append(document.createElement("br")); 53 | area.append(document.createElement("br")); 54 | } else { 55 | firstCategory = false; 56 | } 57 | 58 | 59 | area.classList.add("menu-area"); 60 | area.style.textAlign = "center"; 61 | menuleft.append(area); 62 | 63 | const header = document.createElement("h1"); 64 | header.innerText = title; 65 | header.style.textAlign = "center"; 66 | header.style.color = "white"; 67 | 68 | area.append(header); 69 | return area; 70 | }; 71 | 72 | const title = document.createElement("h1"); 73 | title.classList.add("menu-title"); 74 | title.innerText = "Prodigy Hacks"; 75 | title.style.textAlign = "center"; 76 | menuleft.append(title); 77 | 78 | const disc = document.createElement("h2"); 79 | disc.style.fontSize = "25px"; 80 | disc.style.color = "white"; 81 | disc.innerHTML = "
Press SHIFT to show/hide the menu. Scroll down in the menu for more hacks."; 82 | menuleft.append(disc); 83 | 84 | const subtitle = document.createElement("h3"); 85 | subtitle.style.fontSize = "20px"; 86 | subtitle.innerHTML = ` 87 |

Join our Discord https://dsc.gg/ProdigyPNP!

88 | 89 |
90 | `; 91 | subtitle.style.color = "white"; 92 | menuleft.append(subtitle); 93 | 94 | 95 | 96 | export const category = { 97 | player: addArea("Player Hacks"), 98 | inventory: addArea("Inventory Hacks"), 99 | location: addArea("Location Hacks"), 100 | pets: addArea("Pet Hacks"), 101 | battle: addArea("Battle Hacks"), 102 | minigames: addArea("Minigame Hacks"), 103 | misc: addArea("Miscellaneous Hacks"), 104 | utility: addArea("Utility Hacks"), 105 | beta: addArea("Beta Testing | Beta Hacks may damage your account"), 106 | patched : addArea("Patched Hacks") 107 | }; 108 | 109 | 110 | 111 | // If an item called hasTip is defined in the localStorage 112 | if (!localStorage.hasTip) { 113 | (async () => { 114 | await Swal.fire({ 115 | title: 'Welcome!', 116 | html: `To get started with the hacks, click this dropdown!`, 117 | icon: 'info', 118 | backdrop: ` 119 | url("https://i.imgur.com/CdV9piu.png") 120 | left top 121 | no-repeat 122 | ` 123 | }); 124 | })(); 125 | localStorage.hasTip = true; 126 | console.log("Player was shown the tip."); 127 | } else { 128 | console.log("Player already has tip."); 129 | }; 130 | 131 | 132 | // If an item called "level" is defined in the localStorage 133 | if (localStorage.getItem("level")) { 134 | // Then, override _.player.getLevel with the value in localStorage. 135 | _.player.getLevel = () => localStorage.getItem("level"); 136 | 137 | console.log("Loaded menu from localStorage."); 138 | } 139 | 140 | 141 | let shownMenu : boolean = true; 142 | document.addEventListener("keydown", function (event) { 143 | if (event.key == "Shift") { 144 | 145 | console.log("Shift key was pressed."); 146 | 147 | if (shownMenu == true) { 148 | // Cheats are shown, so let's hide them. 149 | console.log("Hiding cheat menu..."); 150 | document.getElementById("cheat-menu").style.display = "none"; 151 | document.getElementById("menu-toggler").style.display = "none"; 152 | shownMenu = false; 153 | console.log("Hidden cheat menu."); 154 | } else { 155 | // Cheats are hidden, so let's show them. 156 | console.log("Showing cheat menu..."); 157 | document.getElementById("cheat-menu").style.display = "block"; 158 | document.getElementById("menu-toggler").style.display = "block"; 159 | shownMenu = true; 160 | console.log("Shown cheat menu."); 161 | } 162 | } 163 | }); 164 | 165 | 166 | if (process.env.NODE_ENV === "development") { 167 | const socket = io("http://localhost:3001"); 168 | let used = false; 169 | socket.on("update", data => { 170 | if (used) return; 171 | used = true; 172 | socket.disconnect(); 173 | document.getElementById("cheat-menu")?.remove(); 174 | document.getElementById("menu-toggler")?.remove(); 175 | eval(data); 176 | }); 177 | } 178 | 179 | 180 | 181 | 182 | // LICENSE POPUPS 183 | (async () => { 184 | 185 | 186 | 187 | if (!(await License.fire("ProdigyPNP", ` 188 |

189 | This is free and open-source software. 190 | If you paid for this or accessed this behind a paywall/AdFly link, demand a refund. If you sell this software, or otherwise make a commercial advantage from it, you are violating 191 | our license. 192 |

193 | `)).value) { 194 | 195 | if (!(await NoLicense.fire("ProdigyPNP License", ` 196 |

197 | You need to agree to our license to use our hacks. If you changed your mind and now agree to our license, reload Prodigy. 198 |

199 | `)).value) { 200 | 201 | // Play Prodigy without hacks 202 | document.getElementById("cheat-menu")?.remove(); // Remove any existing menu if present 203 | document.getElementById("menu-toggler")?.remove(); // Remove any existing menu togglers if present 204 | 205 | } else { 206 | 207 | // Reload Prodigy 208 | document.location = ""; 209 | } 210 | 211 | 212 | } else { 213 | 214 | 215 | // Display status message. 216 | await statusMessage(); 217 | } 218 | 219 | })(); -------------------------------------------------------------------------------- /cheatGUI/src/style.scss: -------------------------------------------------------------------------------- 1 | @import url("https://fonts.googleapis.com/css?family=Arvo:400,700|Sen:400,700,800&display=swap&subset=latin-ext"); 2 | 3 | #game-wrapper { 4 | font-family: "Sen", sans-serif; 5 | 6 | #cheat-menu { 7 | height: 465px; 8 | background-color: #eeeb; 9 | padding: 2px; 10 | position: absolute; 11 | top: 0px; 12 | left: 0px; 13 | transition: top 0.35s; 14 | padding: 10px; 15 | border: 10px solid rgba(0, 0, 0, 0.1); 16 | border-radius: 15px; 17 | overflow-y: scroll; 18 | resize: none; 19 | overflow: auto; 20 | } 21 | 22 | .menu-left { 23 | width: 100%; 24 | height: 100%; 25 | float: center; 26 | } 27 | 28 | #menu-toggler { 29 | z-index: 1; 30 | position: absolute; 31 | border-radius: 3px; 32 | background-color: #fffb; 33 | transition: background-color 0.15s; 34 | font-size: 23px; 35 | height: 26px; 36 | width: 50px; 37 | border: 1px solid rgba(0, 0, 0, 0.1); 38 | 39 | &:hover { 40 | background-color: #dddb; 41 | } 42 | 43 | &:active { 44 | background-color: #bbbb; 45 | } 46 | } 47 | 48 | #fps-counter { 49 | z-index: 2; 50 | position: absolute; 51 | border-radius: 3px; 52 | background-color: #fffb; 53 | transition: background-color 0.15s; 54 | 55 | width: 130px; 56 | height: 26px; 57 | font-size: 23px; 58 | border: 1px solid rgba(0, 0, 0, 0.1); 59 | margin-left: 83%; 60 | 61 | &:hover { 62 | background-color: #dddb; 63 | } 64 | 65 | &:active { 66 | background-color: #bbbb; 67 | } 68 | } 69 | 70 | 71 | .menu-area { 72 | h1 { 73 | font-family: "Sen", sans-serif; 74 | font-size: 30px; 75 | font-weight: 700; 76 | color: #111; 77 | margin: 10px; 78 | } 79 | 80 | button { 81 | background-color: rgba(0, 0, 0, 0.55); 82 | color: white; 83 | border-radius: 5px; 84 | border: 1px solid #eee; 85 | padding: 1%; 86 | transition: all 0.15s; 87 | margin: 5px 5px; 88 | transition-property: border-color, background-color; 89 | 90 | &:hover { 91 | border-color: #777d; 92 | background-color: #ddd; 93 | } 94 | 95 | &:active { 96 | border-color: #555; 97 | background-color: #bbb; 98 | } 99 | 100 | &[status="true"] { 101 | border-color: #5a5d; 102 | background-color: #9bee9b; 103 | 104 | &:hover { 105 | border-color: #b3bbb0dd; 106 | background-color: #bffebf; 107 | } 108 | 109 | &:active { 110 | border-color: #4e5c50; 111 | background-color: #24be6a; 112 | } 113 | } 114 | 115 | &[status="false"] { 116 | border-color: #766d; 117 | background-color: #9b9b9b; 118 | 119 | &:hover { 120 | border-color: #858585dd; 121 | background-color: #bfbfbf; 122 | } 123 | 124 | &:active { 125 | border-color: #4c3e40; 126 | background-color: #be246a; 127 | } 128 | } 129 | } 130 | } 131 | 132 | .menu-title { 133 | font-family: "Verdana", sans-serif; 134 | font-size: 40px; 135 | font-weight: 900; 136 | color: white; 137 | } 138 | } 139 | 140 | #chat-frame { 141 | width: 12%; 142 | height: 80%; 143 | top: -10%; 144 | bottom: -10%; 145 | left: 80%; 146 | right: 0%; 147 | position: fixed; 148 | z-index: 4; 149 | } 150 | 151 | .radioDiv { 152 | width: 125px; 153 | height: 125px; 154 | display: inline-block; 155 | margin: 7px; 156 | background-color: #5a7e3f; 157 | color: black; 158 | background-size: cover; 159 | outline: black 5px solid; 160 | vertical-align: top; 161 | font-weight: 700; 162 | user-select: none; 163 | -webkit-user-drag: none; 164 | cursor: pointer; 165 | 166 | &:hover { 167 | background-blend-mode: overlay; 168 | color: lightgray; 169 | } 170 | 171 | &:active { 172 | background-blend-mode: multiply; 173 | color: white; 174 | } 175 | 176 | &[checked] { 177 | background-blend-mode: color-dodge; 178 | color: blanchedalmond; 179 | } 180 | 181 | &[checked]:active { 182 | background-blend-mode: color-burn; 183 | color: cyan; 184 | } 185 | } 186 | 187 | .radioSwal { 188 | width: fit-content !important; 189 | min-width: 32em !important; 190 | max-width: 46em !important; 191 | } 192 | 193 | .centeredMenu { 194 | position: fixed; 195 | top: -10%; 196 | left: 10%; 197 | right: 10%; 198 | width: 80%; 199 | height: 80%; 200 | z-index: 2; 201 | background-color: rgba(0, 0, 0, 0.5); 202 | backdrop-filter: blur(5px); 203 | } 204 | -------------------------------------------------------------------------------- /cheatGUI/src/utils/chat.ts: -------------------------------------------------------------------------------- 1 | 2 | let chat : Window | null = null; 3 | 4 | export default function openChat () : void { 5 | 6 | if (chat === null) { 7 | open() 8 | } else { 9 | if (chat.closed) { open() } 10 | else { chat.focus() } 11 | } 12 | 13 | 14 | } 15 | 16 | function open () : void { 17 | // @ts-expect-error 18 | chat = window.open("https://chat.prodigypnp.com:8443/", null, ` 19 | height=800, 20 | width=350, 21 | status=yes, 22 | toolbar=no, 23 | menubar=no, 24 | location=no 25 | `); 26 | } -------------------------------------------------------------------------------- /cheatGUI/src/utils/fps.ts: -------------------------------------------------------------------------------- 1 | import { wrapper } from "../index"; 2 | 3 | const FPSc = document.createElement("button"); // Create menu toggler 4 | var enabled : boolean = false; 5 | 6 | 7 | export function startFps () : void { 8 | enabled = true; 9 | activate(); 10 | } 11 | 12 | export function stopFps () : void { 13 | enabled = false; 14 | document.getElementById("fps-counter")?.remove(); 15 | } 16 | 17 | 18 | function activate () : void { 19 | 20 | FPSc.id = "fps-counter"; 21 | wrapper?.prepend(FPSc); 22 | 23 | 24 | setInterval(() => { 25 | 26 | const fps : number = _.player.game.fps._framerate; 27 | 28 | if (enabled) { 29 | FPSc.innerText = fps.toFixed(2) + " FPS"; 30 | } else { 31 | FPSc.remove(); 32 | return; 33 | } 34 | }, 300); 35 | } -------------------------------------------------------------------------------- /cheatGUI/src/utils/hackify.ts: -------------------------------------------------------------------------------- 1 | import { TODO } from "../../../typings/util"; // Import Prodigy Util typings 2 | import { _ } from "../utils/util"; // Import Prodigy typings and VERY_LARGE_NUMBER 3 | import { Swal, Toast } from "../utils/swal"; // Import Swal, Toast, Confirm, Input, and NumberInput from swal 4 | 5 | 6 | 7 | 8 | // Exports 9 | 10 | 11 | // Item Categories 12 | export const names : string[] = ["Boots", "Buddies", "Fossils", "Hats", "Items", "Key Items", "Tower Town Frames", "Tower Town Interiors", "Mounts", "Outfits", "Relics", "Weapons", "Currencies"]; 13 | 14 | 15 | // Item Category IDs 16 | export const ids : string[] = ["boots", "follow", "fossil", "hat", "item", "key", "mathTownFrame", "mathTownInterior", "mount", "outfit", "spellRelic", "weapon", "currency"]; 17 | 18 | 19 | // Convert item to Item ID map 20 | // @ts-expect-error 21 | export const itemify = (item: Item[], amount: number) => 22 | item.map(x => ({ 23 | ID: x.ID, 24 | N: amount 25 | })).filter(v => v !== undefined); 26 | 27 | 28 | // Convert rune to Rune ID map 29 | // @ts-expect-error 30 | export const runeify = (item, amount) => 31 | // @ts-expect-error 32 | item.map(x => ({ 33 | ID: x.ID, 34 | quantity: amount 35 | // @ts-expect-error 36 | })).filter(v => v !== undefined); 37 | 38 | 39 | // Get member module 40 | export function getMemberModule () { 41 | return _.player.hasMembership.toString().split("\"")[1]; 42 | } 43 | 44 | 45 | 46 | 47 | 48 | // Begin toHouse function 49 | export function toHouse (userID: number) { 50 | if (_.player.userID !== userID) { 51 | const friendCount = _.instance.prodigy.friendsListNetworkHandler.friendsList.length; 52 | const classMates = _.instance.prodigy.friendsListNetworkHandler.classList.length; 53 | 54 | _.instance.prodigy.gameContainer.get("2e1-e659") 55 | .create("house-visit", "click", "hub", friendCount, classMates, null, null, userID) 56 | .broadcast(); 57 | } 58 | const zone = _.instance.prodigy.world.getZone(_.instance.prodigy.world.getCurrentZone()); 59 | if (!zone) return Swal.fire({ title: "Error", text: "You are not in a zone!", icon: "error" }); 60 | return zone.handleLeaving(2, () => teleportToHouse(userID)); 61 | } 62 | // End toHouse function 63 | 64 | 65 | 66 | 67 | 68 | // Begin teleportToHouse function 69 | export function teleportToHouse (userID: number) { 70 | _.instance.prodigy.loading(true); 71 | 72 | const responseCallback = (data: any) => { 73 | const playerData = data !== null && data !== undefined ? data[userID] : null; 74 | 75 | if (playerData !== null && playerData.house !== undefined && playerData.house !== null) { 76 | _.instance.prodigy.loading(false); 77 | const house = _.cloneDeep(_.player.house); 78 | house.setItems(playerData.house); 79 | if (!(playerData.data.allowsHouseVisitors !== undefined && playerData.data.allowsHouseVisitors !== null ? playerData.data.allowsHouseVisitors : false)) { 80 | return Swal.fire(`Teleporting to ${userID} is not allowed.`, "Try another user.", "error"); 81 | } 82 | return _.instance.prodigy.world._("house", null, null, { house, getAllowsHouseVisitors: () => playerData.data.allowsHouseVisitors !== undefined && playerData.data.allowsHouseVisitors !== null ? playerData.data.allowsHouseVisitors : false, setAllowsHouseVisitors: (v: boolean) => { playerData.data.allowsHouseVisitors = v; } }); 83 | } 84 | }; 85 | 86 | _.network.getCharData(userID.toString(), ["house", "data"], responseCallback, responseCallback); 87 | return Toast.fire("Teleported to house", "You have been teleported to the house!", "success"); 88 | } 89 | // End teleportToHouse function 90 | 91 | 92 | 93 | 94 | // Get pet from GUI popup 95 | export const getPet = async (text: string): Promise => { 96 | const pet = await Swal.fire({ 97 | input: "select", 98 | inputOptions: new Map( 99 | _.player.kennel.data.map((x: TODO, i: number) => [ 100 | i.toString(), 101 | // @ts-expect-error 102 | `Level ${x.level} - ${x.nickname ?? _.gameData.pet.find(y => +y.ID === +x.ID)?.data.name ?? "Unknown"}` 103 | ]) as [string, string][] 104 | ), 105 | title: "Choose Pet", 106 | text: text 107 | }); 108 | return pet.value; 109 | }; -------------------------------------------------------------------------------- /cheatGUI/src/utils/keybinds.ts: -------------------------------------------------------------------------------- 1 | import { _ } from "../utils/util"; // Import Prodigy typings 2 | import { Confirm, Toast } from "../utils/swal"; // Import Swal, Toast, Confirm, Input, and NumberInput from swal 3 | 4 | 5 | 6 | 7 | 8 | window.addEventListener("keydown", event => { 9 | 10 | 11 | 12 | 13 | switch (event.key) { 14 | 15 | case "`": 16 | // Close All Popups 17 | _.instance.prodigy.open.menuCloseAll(); 18 | break; 19 | 20 | case "\\": 21 | // Gets you kitted up in Celestial Gear 22 | const k = async () => { 23 | 24 | 25 | 26 | if (!( 27 | await Confirm.fire("Kit", "Would you like to equip Celestial Gear?") 28 | ).value) { 29 | return console.log("Cancelled");; 30 | } 31 | 32 | _.player.equipment.setHat(200); 33 | _.player.equipment.setBoots(93); 34 | _.player.equipment.setOutfit(161); 35 | _.player.equipment.setWeapon(196); 36 | 37 | _.player.appearanceChanged = true; 38 | 39 | Toast.fire("Success!", "You are now wearing Celestial Armor and wielding a Dual Blade.", "success"); 40 | }; 41 | k(); 42 | break; 43 | 44 | } 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | /* 58 | if (event.code === "KeyL") { 59 | Phaser.GAMES[0].state.states.Login._gameObj.user.x = Phaser.GAMES[0].input.mousePointer.position.x; 60 | Phaser.GAMES[0].state.states.Login._gameObj.user.y = Phaser.GAMES[0].input.mousePointer.position.y; 61 | } 62 | if (event.code === "Escape") { 63 | Phaser.GAMES[0].state.states.Login._gameObj.open.menus.map(x => x.close()); 64 | } 65 | if (!Phaser.GAMES[0].state.states.Login._gameObj.open.menus.length) { 66 | if (event.code === "KeyE") { 67 | Phaser.GAMES[0].state.states.Login._gameObj.open.backpack(); 68 | } 69 | if (event.code === "KeyT") { 70 | Phaser.GAMES[0].state.states.Login._gameObj.open.chat(); 71 | } 72 | } 73 | */ 74 | }); 75 | -------------------------------------------------------------------------------- /cheatGUI/src/utils/popupCloser.ts: -------------------------------------------------------------------------------- 1 | import { _ } from "../utils/util"; // Import prodigy thing 2 | 3 | 4 | 5 | var PopupCloser : boolean = false; 6 | 7 | 8 | export function PopupInterval (OnOff : boolean) { 9 | 10 | PopupCloser = OnOff; 11 | } 12 | 13 | 14 | 15 | (async () => { 16 | 17 | setInterval(async () => { 18 | if (PopupCloser) { 19 | _.instance.prodigy.open.menuCloseAll(); 20 | } 21 | }, 200); 22 | 23 | })(); -------------------------------------------------------------------------------- /cheatGUI/src/utils/status.ts: -------------------------------------------------------------------------------- 1 | import { Swal } from "../utils/swal"; // Import Swal 2 | 3 | /* 4 | export async function statusMessage () { 5 | 6 | 7 | const UpdateToMv3 = Swal.mixin({ 8 | title: "PHEx 3.0.0", 9 | icon: "info", 10 | showCancelButton: true, 11 | showConfirmButton: true, 12 | confirmButtonText: "Update to 3.0.0", 13 | cancelButtonText: "I've already updated.", 14 | html: "

WE DID IT!! PHEx 3.0.0 IS NOW RELESED!!!

We've released a new version of PHEx! We strongly reccomend updating to PHEx 3.0.0.

Update now!

" 15 | 16 | }); 17 | 18 | if (await (await UpdateToMv3.fire()).value) { 19 | window.location.href = "https://github.com/ProdigyPNP/ProdigyMathGameHacking/releases/latest"; 20 | }; 21 | 22 | } 23 | */ 24 | 25 | 26 | 27 | 28 | 29 | export function statusMessage () { 30 | 31 | 32 | fetch(`https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/master/cheatGUI/statusmessage.json?updated=${Date.now()}`).then(response => response.json()).then(async data => { 33 | 34 | const enabled = data.enabled; 35 | 36 | if (enabled.value === false) { 37 | return console.log("Status message is disabled."); 38 | } else { 39 | 40 | await Swal.fire({ 41 | title: data.get("title"), 42 | html: data.get("html"), 43 | icon: data.get("icon"), 44 | }); 45 | 46 | } 47 | 48 | }); 49 | 50 | 51 | 52 | }; 53 | -------------------------------------------------------------------------------- /cheatGUI/src/utils/swal.ts: -------------------------------------------------------------------------------- 1 | import swal from "sweetalert2"; 2 | export const Swal = swal; 3 | 4 | // Text Input 5 | export const Input = Swal.mixin({ 6 | input: "text", 7 | showCancelButton: true, 8 | showConfirmButton: true, 9 | toast: false, 10 | }); 11 | // Text Input 12 | 13 | 14 | 15 | // Number Input 16 | export const NumberInput = Input.mixin({ 17 | toast: false, 18 | input: "number" 19 | }); 20 | // Number Input 21 | 22 | 23 | // Toast 24 | export const Toast = Swal.mixin({ 25 | toast: true, 26 | position: "bottom" 27 | }); 28 | // Toast 29 | 30 | 31 | // Confirm 32 | export const Confirm = Swal.mixin({ 33 | icon: "warning", 34 | showCancelButton: true, 35 | toast: false, 36 | confirmButtonText: "Confirm", 37 | cancelButtonText: "Cancel" 38 | }); 39 | // Confirm 40 | 41 | 42 | // Info popup 43 | export const Info = Swal.mixin({ 44 | icon: "info", 45 | showCancelButton: false, 46 | toast: false 47 | }); 48 | // Info popup 49 | 50 | 51 | // License popup 52 | export const License = Swal.mixin({ 53 | icon: "info", 54 | showCancelButton: true, 55 | toast: false, 56 | confirmButtonText: "Agree", 57 | cancelButtonText: "Disagree" 58 | }); 59 | 60 | 61 | // Disagreed to license popup 62 | export const NoLicense = Swal.mixin({ 63 | icon: "error", 64 | showCancelButton: true, 65 | toast: false, 66 | confirmButtonText: "Reload", 67 | cancelButtonText: "Play without hacks" 68 | }); 69 | // Disagreed to license popup 70 | 71 | // @ts-expect-error allow accessing swal from devtools 72 | window.Swal = Swal; -------------------------------------------------------------------------------- /cheatGUI/src/utils/util.ts: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | 3 | import { GameItemKey } from "../../../typings/_.gameData"; 4 | import { gameData as GameData } from "../../../typings/gameData"; 5 | import { Item } from "../../../typings/item"; 6 | import { Prodigy } from "../../../typings/prodigy"; 7 | import { Game } from "../../../typings/game"; 8 | 9 | /** The hack variable. */ 10 | export const _ = window._; 11 | 12 | /** The player variable */ 13 | export const player = _.player; 14 | 15 | /** The alternate hack variable. */ 16 | export const current = window.Boot.prototype.game._state._current; 17 | 18 | const base: { game: Game, prodigy: Prodigy } = _.instance; 19 | 20 | /** game */ 21 | export const game = base.game; 22 | 23 | /** prodigy */ 24 | export const prodigy = base.prodigy; 25 | 26 | /** gameData */ 27 | export const gameData: GameData = _.instance.game.state.states.get("Boot").gameData; 28 | 29 | /** getItem */ 30 | export const getItem = (type: T, id: number): Item | null => 31 | (_.gameData[type].find(x => x.ID === id) as null | Item) ?? null; 32 | 33 | /** 9000000000 */ 34 | export const VERY_LARGE_NUMBER = 9e9; 35 | 36 | /** */ 37 | export const states = Object.fromEntries(_.instance.game.state.states); 38 | 39 | /** Attempts to force the charecter to save. */ 40 | export const saveCharacter = () => { 41 | _.network.processPlayer = true; 42 | _.player.forceSaveCharacter(); 43 | }; 44 | 45 | /** The URL to the assets directory */ 46 | export const assetURL = "https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/master/cheatGUI/src/assets/"; 47 | 48 | /** Gets the full URL of an asset */ 49 | export const joinAsset = (asset: string) => `${assetURL}${asset}`; 50 | 51 | /** Location images */ 52 | export const locations = { 53 | academy: joinAsset("academy.png"), 54 | bonfire_spire: joinAsset("bonfire_spire.png"), 55 | forest: joinAsset("forest.png"), 56 | shipwreck_shore: joinAsset("shipwreck_shore.png"), 57 | shiverchill: joinAsset("shiverchill.png"), 58 | skywatch: joinAsset("skywatch.png"), 59 | dyno: joinAsset("dyno.png"), 60 | elemental_guardian: joinAsset("elemental_guardian.png"), 61 | darktower: joinAsset("darktower.png"), 62 | earthtower: joinAsset("earthtower.png"), 63 | crystal_caverns: joinAsset("crystal_caverns.png"), 64 | archives: joinAsset("archives.png"), 65 | house: joinAsset("house.png"), 66 | toyzone: joinAsset("toyzone.png"), 67 | tower_town: joinAsset("tower_town.png"), 68 | lamplight: joinAsset("lamplight.png") 69 | }; 70 | 71 | /** rando */ 72 | export const pickRandom = (arr: T[]): T => arr[Math.floor(Math.random() * arr.length)]; 73 | -------------------------------------------------------------------------------- /cheatGUI/src/utils/wasd.ts: -------------------------------------------------------------------------------- 1 | import { useWASD } from "../hacks/location"; 2 | import { player } from "./util"; 3 | 4 | 5 | 6 | async function ChangeX (x : number) { 7 | for (let i = 0; i < 100; i++) { 8 | await new Promise(r => setTimeout(r, 2)); 9 | player._playerContainer.x -= x/100;; 10 | } 11 | } 12 | 13 | async function ChangeY (y : number) { 14 | for (let i = 0; i < 100; i++) { 15 | await new Promise(r => setTimeout(r, 2)); 16 | player._playerContainer.y -= y/100;; 17 | } 18 | } 19 | 20 | 21 | 22 | 23 | 24 | window.addEventListener("keydown", event => { 25 | 26 | if (useWASD) { 27 | switch (event.key) { 28 | case "w": 29 | ChangeY(40); 30 | break; 31 | case "s": 32 | ChangeY(-40); 33 | break; 34 | case "a": 35 | ChangeX(40); 36 | break; 37 | case "d": 38 | ChangeX(-40); 39 | break; 40 | } 41 | } 42 | 43 | }); -------------------------------------------------------------------------------- /cheatGUI/statusmessage.json: -------------------------------------------------------------------------------- 1 | { 2 | "enabled": false, 3 | "title": "alr", 4 | "icon": "info", 5 | "html": "" 6 | } 7 | -------------------------------------------------------------------------------- /cheatGUI/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": [ 3 | "./src/**/*", "babel.config.js" 4 | ], 5 | "compilerOptions": { 6 | /* Basic Options */ 7 | // "incremental": true, /* Enable incremental compilation */ 8 | "target": "es2020", 9 | /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ 10 | "module": "amd", 11 | /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ 12 | // "lib": [], /* Specify library files to be included in the compilation. */ 13 | // "allowJs": true, /* Allow javascript files to be compiled. */ 14 | // "checkJs": true, /* Report errors in .js files. */ 15 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ 16 | // "declaration": true, /* Generates corresponding '.d.ts' file. */ 17 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ 18 | "sourceMap": true, 19 | /* Generates corresponding '.map' file. */ 20 | // "outFile": "./dist/index.js", 21 | /* Concatenate and emit output to single file. */ 22 | "outDir": "./dist/", 23 | /* Redirect output structure to the directory. */ 24 | "rootDir": "./src/", 25 | /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ 26 | // "composite": true, /* Enable project compilation */ 27 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ 28 | "removeComments": true, /* Do not emit comments to output. */ 29 | "noEmit": false, /* Do not emit outputs. */ 30 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */ 31 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ 32 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ 33 | 34 | /* Strict Type-Checking Options */ 35 | "strict": true, 36 | /* Enable all strict type-checking options. */ 37 | "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ 38 | "strictNullChecks": true, /* Enable strict null checks. */ 39 | "strictFunctionTypes": true, /* Enable strict checking of function types. */ 40 | "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ 41 | "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ 42 | "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ 43 | "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ 44 | 45 | /* Additional Checks */ 46 | "noUnusedLocals": true, /* Report errors on unused locals. */ 47 | "noUnusedParameters": true, /* Report errors on unused parameters. */ 48 | "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 49 | "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 50 | 51 | /* Module Resolution Options */ 52 | // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ 53 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ 54 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ 55 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ 56 | // "typeRoots": [], /* List of folders to include type definitions from. */ 57 | // "types": [""], /* Type declaration files to be included in compilation. */ 58 | "allowSyntheticDefaultImports": true, 59 | /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ 60 | "esModuleInterop": true, 61 | /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ 62 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ 63 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 64 | 65 | /* Source Map Options */ 66 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ 67 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 68 | // "inlineSourceMap": true, 69 | /* Emit a single file with source maps instead of having a separate file. */ 70 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ 71 | 72 | /* Experimental Options */ 73 | "experimentalDecorators": true, 74 | /* Enables experimental support for ES7 decorators. */ 75 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ 76 | 77 | /* Advanced Options */ 78 | "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ 79 | } 80 | } -------------------------------------------------------------------------------- /cheatGUI/webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require("path"); 2 | const glob = require("glob"); 3 | module.exports = { 4 | mode: "production", 5 | entry: ["./src/index.ts", ...glob.sync(path.join(__dirname, "src/@(hacks|utils)/**/*.ts"))], 6 | module: { 7 | rules: [ 8 | { 9 | test: /\.ts$/i, 10 | use: ["babel-loader", "ts-loader"], 11 | exclude: /node_modules/, 12 | }, 13 | { 14 | test: /\.txt$/i, 15 | use: "raw-loader", 16 | }, 17 | { 18 | test: /\.s[ac]ss$/i, 19 | use: [ 20 | "style-loader", 21 | // Translates CSS into CommonJS 22 | "css-loader", 23 | "postcss-loader", 24 | // Compiles Sass to CSS 25 | "sass-loader", 26 | ], 27 | }, 28 | ], 29 | }, 30 | resolve: { 31 | extensions: [".ts", ".js"], 32 | }, 33 | output: { 34 | filename: "bundle.js", 35 | path: path.resolve(__dirname, "dist"), 36 | }, 37 | }; 38 | -------------------------------------------------------------------------------- /docs/classes/_player_d_.playerdata.md: -------------------------------------------------------------------------------- 1 | [ProdigyMathGameHackingTypings](../README.md) › [Globals](../globals.md) › ["player.d"](../modules/_player_d_.md) › [PlayerData](_player_d_.playerdata.md) 2 | 3 | # Class: PlayerData 4 | 5 | ## Hierarchy 6 | 7 | * **PlayerData** 8 | 9 | ## Index 10 | 11 | ### Properties 12 | 13 | * [allowsHouseVisitors](_player_d_.playerdata.md#allowshousevisitors) 14 | * [arena](_player_d_.playerdata.md#arena) 15 | * [atHomeTimestamp](_player_d_.playerdata.md#athometimestamp) 16 | * [atSchoolTimestamp](_player_d_.playerdata.md#atschooltimestamp) 17 | * [battleCounter](_player_d_.playerdata.md#battlecounter) 18 | * [bountyScore](_player_d_.playerdata.md#bountyscore) 19 | * [daily](_player_d_.playerdata.md#daily) 20 | * [deserter](_player_d_.playerdata.md#deserter) 21 | * [dungeonRunsTimeStamps](_player_d_.playerdata.md#dungeonrunstimestamps) 22 | * [energy](_player_d_.playerdata.md#energy) 23 | * [gold](_player_d_.playerdata.md#gold) 24 | * [hp](_player_d_.playerdata.md#hp) 25 | * [lastArchiveRun](_player_d_.playerdata.md#lastarchiverun) 26 | * [level](_player_d_.playerdata.md#level) 27 | * [memberStarsExpirationDate](_player_d_.playerdata.md#memberstarsexpirationdate) 28 | * [nm](_player_d_.playerdata.md#nm) 29 | * [numSpins1](_player_d_.playerdata.md#numspins1) 30 | * [numSpins2](_player_d_.playerdata.md#numspins2) 31 | * [school](_player_d_.playerdata.md#school) 32 | * [settings](_player_d_.playerdata.md#settings) 33 | * [spellbook](_player_d_.playerdata.md#spellbook) 34 | * [spells](_player_d_.playerdata.md#spells) 35 | * [spinDate1](_player_d_.playerdata.md#spindate1) 36 | * [spinDate2](_player_d_.playerdata.md#spindate2) 37 | * [stars](_player_d_.playerdata.md#stars) 38 | * [startDate](_player_d_.playerdata.md#startdate) 39 | * [storedMemberStars](_player_d_.playerdata.md#storedmemberstars) 40 | * [team](_player_d_.playerdata.md#team) 41 | * [titanID](_player_d_.playerdata.md#titanid) 42 | * [tower](_player_d_.playerdata.md#tower) 43 | * [trialSkipAvailable](_player_d_.playerdata.md#trialskipavailable) 44 | * [trialStartDate](_player_d_.playerdata.md#trialstartdate) 45 | * [versionID](_player_d_.playerdata.md#versionid) 46 | * [win](_player_d_.playerdata.md#win) 47 | * [zone](_player_d_.playerdata.md#zone) 48 | 49 | ## Properties 50 | 51 | ### allowsHouseVisitors 52 | 53 | • **allowsHouseVisitors**: *boolean* 54 | 55 | ___ 56 | 57 | ### arena 58 | 59 | • **arena**: *number* 60 | 61 | ___ 62 | 63 | ### atHomeTimestamp 64 | 65 | • **atHomeTimestamp**: *number* 66 | 67 | ___ 68 | 69 | ### atSchoolTimestamp 70 | 71 | • **atSchoolTimestamp**: *number* 72 | 73 | ___ 74 | 75 | ### battleCounter 76 | 77 | • **battleCounter**: *number* 78 | 79 | ___ 80 | 81 | ### bountyScore 82 | 83 | • **bountyScore**: *number* 84 | 85 | ___ 86 | 87 | ### daily 88 | 89 | • **daily**: *object* 90 | 91 | #### Type declaration: 92 | 93 | * **festivalName**: *string* 94 | 95 | * **isComplete**: *boolean* 96 | 97 | * **lastStarted**: *number* 98 | 99 | * **location**: *string* 100 | 101 | * **monsterID**: *number* 102 | 103 | ___ 104 | 105 | ### deserter 106 | 107 | • **deserter**: *number* 108 | 109 | ___ 110 | 111 | ### dungeonRunsTimeStamps 112 | 113 | • **dungeonRunsTimeStamps**: *object[]* 114 | 115 | ___ 116 | 117 | ### energy 118 | 119 | • **energy**: *number* 120 | 121 | ___ 122 | 123 | ### gold 124 | 125 | • **gold**: *number* 126 | 127 | ___ 128 | 129 | ### hp 130 | 131 | • **hp**: *number* 132 | 133 | ___ 134 | 135 | ### lastArchiveRun 136 | 137 | • **lastArchiveRun**: *number* 138 | 139 | ___ 140 | 141 | ### level 142 | 143 | • **level**: *number* 144 | 145 | ___ 146 | 147 | ### memberStarsExpirationDate 148 | 149 | • **memberStarsExpirationDate**: *number* 150 | 151 | ___ 152 | 153 | ### nm 154 | 155 | • **nm**: *number* 156 | 157 | ___ 158 | 159 | ### numSpins1 160 | 161 | • **numSpins1**: *number* 162 | 163 | ___ 164 | 165 | ### numSpins2 166 | 167 | • **numSpins2**: *number* 168 | 169 | ___ 170 | 171 | ### school 172 | 173 | • **school**: *string* 174 | 175 | ___ 176 | 177 | ### settings 178 | 179 | • **settings**: *object* 180 | 181 | #### Type declaration: 182 | 183 | * **bgmVolume**: *number* 184 | 185 | * **sfxVolume**: *number* 186 | 187 | * **voiceVolume**: *number* 188 | 189 | ___ 190 | 191 | ### spellbook 192 | 193 | • **spellbook**: *number[]* 194 | 195 | ___ 196 | 197 | ### spells 198 | 199 | • **spells**: *number[]* 200 | 201 | ___ 202 | 203 | ### spinDate1 204 | 205 | • **spinDate1**: *number* 206 | 207 | ___ 208 | 209 | ### spinDate2 210 | 211 | • **spinDate2**: *number* 212 | 213 | ___ 214 | 215 | ### stars 216 | 217 | • **stars**: *number* 218 | 219 | ___ 220 | 221 | ### startDate 222 | 223 | • **startDate**: *number* 224 | 225 | ___ 226 | 227 | ### storedMemberStars 228 | 229 | • **storedMemberStars**: *number* 230 | 231 | ___ 232 | 233 | ### team 234 | 235 | • **team**: *number* 236 | 237 | ___ 238 | 239 | ### titanID 240 | 241 | • **titanID**: *number* 242 | 243 | ___ 244 | 245 | ### tower 246 | 247 | • **tower**: *number* 248 | 249 | ___ 250 | 251 | ### trialSkipAvailable 252 | 253 | • **trialSkipAvailable**: *boolean* 254 | 255 | ___ 256 | 257 | ### trialStartDate 258 | 259 | • **trialStartDate**: *string* 260 | 261 | ___ 262 | 263 | ### versionID 264 | 265 | • **versionID**: *number* 266 | 267 | ___ 268 | 269 | ### win 270 | 271 | • **win**: *number* 272 | 273 | ___ 274 | 275 | ### zone 276 | 277 | • **zone**: *string* 278 | -------------------------------------------------------------------------------- /docs/globals.md: -------------------------------------------------------------------------------- 1 | [ProdigyMathGameHackingTypings](README.md) › [Globals](globals.md) 2 | 3 | # ProdigyMathGameHackingTypings 4 | 5 | ## Index 6 | 7 | ### Modules 8 | 9 | * ["game.d"](modules/_game_d_.md) 10 | * ["item.d"](modules/_item_d_.md) 11 | * ["pixi.d"](modules/_pixi_d_.md) 12 | * ["player.d"](modules/_player_d_.md) 13 | * ["prodigy.d"](modules/_prodigy_d_.md) 14 | * ["test"](modules/_test_.md) 15 | * ["util.d"](modules/_util_d_.md) 16 | -------------------------------------------------------------------------------- /docs/interfaces/_game_d_.game.md: -------------------------------------------------------------------------------- 1 | [ProdigyMathGameHackingTypings](../README.md) › [Globals](../globals.md) › ["game.d"](../modules/_game_d_.md) › [Game](_game_d_.game.md) 2 | 3 | # Interface: Game 4 | 5 | ## Hierarchy 6 | 7 | * **Game** 8 | 9 | ## Index 10 | 11 | ### Properties 12 | 13 | * [id](_game_d_.game.md#id) 14 | * [prodigy](_game_d_.game.md#prodigy) 15 | 16 | ## Properties 17 | 18 | ### id 19 | 20 | • **id**: *number* 21 | 22 | ___ 23 | 24 | ### prodigy 25 | 26 | • **prodigy**: *[Prodigy](_prodigy_d_.prodigy.md)* 27 | -------------------------------------------------------------------------------- /docs/interfaces/_pixi_d_.pixi.md: -------------------------------------------------------------------------------- 1 | [ProdigyMathGameHackingTypings](../README.md) › [Globals](../globals.md) › ["pixi.d"](../modules/_pixi_d_.md) › [PIXI](_pixi_d_.pixi.md) 2 | 3 | # Interface: PIXI 4 | 5 | ## Hierarchy 6 | 7 | * **PIXI** 8 | 9 | ## Index 10 | 11 | ### Properties 12 | 13 | * [game](_pixi_d_.pixi.md#game) 14 | 15 | ## Properties 16 | 17 | ### game 18 | 19 | • **game**: *[Game](_game_d_.game.md)* 20 | -------------------------------------------------------------------------------- /docs/interfaces/_player_d_.playername.md: -------------------------------------------------------------------------------- 1 | [ProdigyMathGameHackingTypings](../README.md) › [Globals](../globals.md) › ["player.d"](../modules/_player_d_.md) › [PlayerName](_player_d_.playername.md) 2 | 3 | # Interface: PlayerName 4 | 5 | ## Hierarchy 6 | 7 | * **PlayerName** 8 | 9 | ## Index 10 | 11 | ### Properties 12 | 13 | * [data](_player_d_.playername.md#data) 14 | * [gender](_player_d_.playername.md#gender) 15 | * [localizer](_player_d_.playername.md#localizer) 16 | 17 | ## Properties 18 | 19 | ### data 20 | 21 | • **data**: *object* 22 | 23 | #### Type declaration: 24 | 25 | * **firstName**: *number* 26 | 27 | * **lastName**: *number* 28 | 29 | * **middleName**: *number* 30 | 31 | * **nickname**: *unknown* 32 | 33 | ___ 34 | 35 | ### gender 36 | 37 | • **gender**: *"male" | "female"* 38 | 39 | ___ 40 | 41 | ### localizer 42 | 43 | • **localizer**: *object* 44 | 45 | #### Type declaration: 46 | 47 | * **dataSource**: *[TODO](../modules/_util_d_.md#todo)* 48 | -------------------------------------------------------------------------------- /docs/interfaces/_prodigy_d_.prodigy.md: -------------------------------------------------------------------------------- 1 | [ProdigyMathGameHackingTypings](../README.md) › [Globals](../globals.md) › ["prodigy.d"](../modules/_prodigy_d_.md) › [Prodigy](_prodigy_d_.prodigy.md) 2 | 3 | # Interface: Prodigy 4 | 5 | ## Hierarchy 6 | 7 | * **Prodigy** 8 | 9 | ## Index 10 | 11 | ### Properties 12 | 13 | * [game](_prodigy_d_.prodigy.md#game) 14 | * [player](_prodigy_d_.prodigy.md#player) 15 | * [version](_prodigy_d_.prodigy.md#version) 16 | 17 | ## Properties 18 | 19 | ### game 20 | 21 | • **game**: *[Game](_game_d_.game.md)* 22 | 23 | ___ 24 | 25 | ### player 26 | 27 | • **player**: *[Player](../classes/_player_d_.player.md)* 28 | 29 | ___ 30 | 31 | ### version 32 | 33 | • **version**: *string* 34 | -------------------------------------------------------------------------------- /docs/modules/_game_d_.md: -------------------------------------------------------------------------------- 1 | [ProdigyMathGameHackingTypings](../README.md) › [Globals](../globals.md) › ["game.d"](_game_d_.md) 2 | 3 | # Module: "game.d" 4 | 5 | ## Index 6 | 7 | ### Interfaces 8 | 9 | * [Game](../interfaces/_game_d_.game.md) 10 | -------------------------------------------------------------------------------- /docs/modules/_item_d_.md: -------------------------------------------------------------------------------- 1 | [ProdigyMathGameHackingTypings](../README.md) › [Globals](../globals.md) › ["item.d"](_item_d_.md) 2 | 3 | # Module: "item.d" 4 | 5 | ## Index 6 | 7 | ### Type aliases 8 | 9 | * [Item](_item_d_.md#item) 10 | 11 | ## Type aliases 12 | 13 | ### Item 14 | 15 | Ƭ **Item**: *[TODO](_util_d_.md#todo)* 16 | -------------------------------------------------------------------------------- /docs/modules/_pixi_d_.md: -------------------------------------------------------------------------------- 1 | [ProdigyMathGameHackingTypings](../README.md) › [Globals](../globals.md) › ["pixi.d"](_pixi_d_.md) 2 | 3 | # Module: "pixi.d" 4 | 5 | ## Index 6 | 7 | ### Namespaces 8 | 9 | * [__global](_pixi_d_.md#__global) 10 | 11 | ### Interfaces 12 | 13 | * [PIXI](../interfaces/_pixi_d_.pixi.md) 14 | 15 | ## Namespaces 16 | 17 | ### __global 18 | 19 | • **__global**: 20 | 21 | ### `Const` PIXI 22 | 23 | • **PIXI**: *[PIXI](../interfaces/_pixi_d_.pixi.md)* 24 | -------------------------------------------------------------------------------- /docs/modules/_player_d_.md: -------------------------------------------------------------------------------- 1 | [ProdigyMathGameHackingTypings](../README.md) › [Globals](../globals.md) › ["player.d"](_player_d_.md) 2 | 3 | # Module: "player.d" 4 | 5 | ## Index 6 | 7 | ### Classes 8 | 9 | * [Player](../classes/_player_d_.player.md) 10 | * [PlayerData](../classes/_player_d_.playerdata.md) 11 | 12 | ### Interfaces 13 | 14 | * [PlayerName](../interfaces/_player_d_.playername.md) 15 | 16 | ### Type aliases 17 | 18 | * [ItemType](_player_d_.md#itemtype) 19 | * [Zones](_player_d_.md#zones) 20 | 21 | ## Type aliases 22 | 23 | ### ItemType 24 | 25 | Ƭ **ItemType**: *"follow" | "hat" | "outfit" | "spellRelic" | "weapon" | "boots"* 26 | 27 | ___ 28 | 29 | ### Zones 30 | 31 | Ƭ **Zones**: *"tower_town"* 32 | -------------------------------------------------------------------------------- /docs/modules/_prodigy_d_.md: -------------------------------------------------------------------------------- 1 | [ProdigyMathGameHackingTypings](../README.md) › [Globals](../globals.md) › ["prodigy.d"](_prodigy_d_.md) 2 | 3 | # Module: "prodigy.d" 4 | 5 | ## Index 6 | 7 | ### Interfaces 8 | 9 | * [Prodigy](../interfaces/_prodigy_d_.prodigy.md) 10 | -------------------------------------------------------------------------------- /docs/modules/_test_.md: -------------------------------------------------------------------------------- 1 | [ProdigyMathGameHackingTypings](../README.md) › [Globals](../globals.md) › ["test"](_test_.md) 2 | 3 | # Module: "test" 4 | 5 | 6 | -------------------------------------------------------------------------------- /docs/modules/_util_d_.md: -------------------------------------------------------------------------------- 1 | [ProdigyMathGameHackingTypings](../README.md) › [Globals](../globals.md) › ["util.d"](_util_d_.md) 2 | 3 | # Module: "util.d" 4 | 5 | ## Index 6 | 7 | ### Type aliases 8 | 9 | * [TODO](_util_d_.md#todo) 10 | 11 | ## Type aliases 12 | 13 | ### TODO 14 | 15 | Ƭ **TODO**: *any* 16 | -------------------------------------------------------------------------------- /meta/CONTRIBUTORS.md: -------------------------------------------------------------------------------- 1 |

Hacks are being shut down. Thanks for everything.

2 | 3 |

Our Discord server: discord.gg/2qzTbdXSg9

4 | 5 | 6 | 7 |

ProdigyPNP's Contributors

8 |

Thank you to everyone who made ProdigyPNP possible. It wouldn't be possible without y'all.

9 | 10 | 11 | ## [gemsvidø](https://github.com/afkvido) 12 | Alpha Prime of ProdigyPNP. Successfully implemented [hosted](https://github.com/hostedposted)'s loader into [PHEx 3.0.0](https://github.com/ProdigyPNP/ProdigyMathGameHacking/pull/53#pullrequestreview-1064480572). 13 |

14 | 15 | ## [Natsumi](https://github.com/PatheticMustan) 16 | Original Creator of [ProdigyMathGameHacking](https://github.com/PatheticMustan/ProdigyMathGameHacking). Natsumi, aka PatheticMustan was the [first Prodigy hacker known to the world](https://github.com/Prodigy-Hacking/ProdigyMathGameHacking/tree/0d2b43777c727d8e3cce442fa958ddb05baa5de0). 17 |

18 | 19 | ## [Arcerion](https://github.com/ArcerionDev) 20 | Original Collaborator. ArcerionDev is the owner of the original project's Discord server. 21 |

22 | 23 | ### [donaldli2020](https://github.com/donaldli2020) 24 | One of the ProdigyPNP Alphas, also an original Contributor. 25 |

26 | 27 | ## [Yama](https://github.com/vibinyama) 28 | Original Collaborator. Yama is a very active Admin in the original project's Discord server. 29 |

30 | 31 | ## [BoredFish](https://github.com/BoredFishRE) 32 | Original Collaborator, also the main guy who got fucked by the DMCA. 33 |

34 | 35 | ### [Spacebar](https://github.com/00100000) 36 | Original Collaborator, did some code work. 37 |

38 | 39 | ## [MelnCat](https://github.com/MelnCat) 40 | Original Creator of [Will's Cheat Menu](https://github.com/ProdigyPNP/ProdigyMathGameHacking/tree/f4adfae299bdce3378d75728931cda17655f8ece/willsCheatMenu), the cheat GUI for Prodigy Hacks. 41 |

42 | 43 | ### [Exoticc](https://github.com/Exoticc) 44 | Original Collaborator 45 |

46 | 47 | ## [Rus](https://github.com/UntrustableRus) 48 | Original Creator of PHEx, the Prodigy Hack Extension. 49 |

50 | 51 | ### [Rubberduck55](https://github.com/Rubberduck55) 52 | Original Collaborator. 53 |

54 | 55 | ### [Whimpers](https://github.com/KryptoCrash) 56 | Original Collaborator. 57 |

58 | 59 | ### [ProdigyPNPEnthusiast](https://github.com/ProdigyPNPEnthusiast) 60 | Made a [really nice pull request](https://github.com/ProdigyPNP/P-NP/pull/19) for P-NP that cleaned up it's code. 61 |

62 | 63 | ### [Sacred](https://github.com/sacredofficial) 64 | Contributor. 65 |

66 | 67 | ### [NX721](https://github.com/NX721) 68 | Contributor. 69 |

70 | 71 | ### [HellOnEarth](https://github.com/hellonearth311) 72 | Contributor. 73 |

74 | 75 | ### [Shane](https://github.com/Shane-CS) 76 | Contributor. 77 |

78 | 79 | ### [HackintoshDev](https://github.com/Hackintosh-dev) 80 | Contributor. 81 |

82 | 83 | ### [coolbot123](https://github.com/coolbot123) 84 | Contributor. 85 |

86 | 87 | ### [IhackProdigy](https://github.com/IhackProdigy) 88 | Contributor (if you're reading this, nice username). 89 |

90 | 91 | ### [Finality](https://github.com/TheFinality) 92 | Contributor. 93 |

94 | 95 | ## [Eris](https://github.com/Erisfiregamer1) 96 | Former one of the ProdigyPNP Alphas. Made the biggest contribution to [fixing P-NP](https://github.com/ProdigyPNP/P-NP/pull/2). 97 |

98 | 99 | ### [hostedposted](https://github.com/hostedposted) 100 | Owner of the Prodigy Cheat Dashboard, and a Contributor. [Also attempted to document Prodigy's API](https://github.com/ProdigyAPI). Helped ProdigyPNP with PHEx Mv3. 101 |

102 | -------------------------------------------------------------------------------- /meta/PRIVACY_POLICY.md: -------------------------------------------------------------------------------- 1 |

ProdigyPNP Privacy Policy

2 | 3 |

4 | We're not an 'evil' megacorp. We're not collecting heavy personal data, so we'll keep our practices simple. 5 |

6 |
7 | 8 | 9 |

Summary

10 | 11 | 12 |
13 |
14 |

15 | Your data is never being sold to anyone. 16 |

17 |

18 | We're not selling your IPs, ages, birthdates, or any personal information. 19 |

20 |
21 | 22 | 23 |
24 |
25 |

26 | We don't use or transfer your data. 27 |

28 |

29 | Your data is never used or transferred for purposes that are unrelated to the program's core functionality. 30 |

31 |
32 | 33 | 34 |
35 |
36 |

37 | Nobody "borrows" your data from us. 38 |

39 |

40 | Your data is never being used or transferred to determine creditworthiness, get loans, or for lending purposes. 41 |

42 |
43 | 44 | 45 | 46 | 47 |

48 |

Details

49 | 50 |

We comply with Google Chrome Webstore Approved Data Use Cases.

51 | 52 |

Here's a well-defined list of things we do:

53 | 54 | - We limit our use of user data to providing or improving our single purpose: Hacking Prodigy, the math game. 55 | - We will only transfer data to third parties when necessary to comply with applicable laws, to protect against malware, spam, phishing, or other fraud or abuse, or with your explicit consent. 56 | - We do not allow anyone to read your user data **unless** 57 | - The data is aggregated and anonymized and used for internal operations in accordance with applicable privacy and other jurisdictional legal requirements; 58 | 60 | - It's necessary for security purposes (ex. investigating abuse); 61 | - We need to do so to comply with applicable laws. 62 | 63 | 64 | 65 | 66 |
67 |

We will NEVER

68 | 69 | - Transfer, use, or sell your data for personalized advertisements. 70 | - Transfer or sell your data to third parties like advertising platforms, data brokers, or other information resellers. 71 | - Transfer, use, or sell your data to determine credit-worthiness or for lending purposes. 72 | -------------------------------------------------------------------------------- /meta/TIMELINE.md: -------------------------------------------------------------------------------- 1 | # Timeline of Prodigy Hacks 2 | 3 | 4 | ### PIXI Ages 5 | `9/21/2019 - 03/25/2020` 6 | 7 | During these times, `PIXI.game` was a thing. However, Prodigy hacks were not well known. 8 |


9 | 10 | 11 | 12 | ### Phaser Day 13 | `03/25/2020 - 03/26/2020` 14 | 15 | On this day, we used `Phaser.GAMES[0]`, only for it to be patched the day after. 16 |


17 | 18 | 19 | 20 | ### Login.gameObj Day 21 | `03/26/20 - 03/27/2020` 22 | 23 | An alternative method was found. However, it only supported the player object. It was also patched after a day. 24 |


25 | 26 | 27 | 28 | ### CanvasPool Days 29 | `03/27/20 - 03/30/2020` 30 | 31 | This method worked for longer than the last one, however, it was also quickly patched. Three days... that's kinda quick. 32 |


33 | 34 | 35 | 36 | ### Cheat Dashboard Day 37 | `03/30/2020 - 03/30/2020` 38 | 39 | A cheat dashboard (URL unknown) was developed by [melncat](https://github.com/melncat). The dashboard was a good concept, however it became very buggy due to some game updates, which caused it to be unsupported the day after. A new one was created by [hostedposted](https://github.com/hostedposted) much later. 40 |


41 | 42 | 43 | 44 | ### Dark Ages 45 | `04/01/2020 - 04/07/2020` 46 | 47 | The first week of April was a sad week for Prodigy hacks. All known hacking methods were patched. Had the goal of telling [Prodigy](https://prodigy.com) to make better and more secure code been achived? [No](https://en.wikipedia.org/wiki/No). Hacks would be back up and running on `04/07/2020`. 48 |


49 | 50 | 51 | 52 | ### EnableDebug Days 53 | `04/07/2020 - 04/09/2020` 54 | 55 | A way to enable debug mode was found, and worked for two days. However, debug was removed by [Prodigy](https://prodigy.com) quickly after. 56 |


57 | 58 | 59 | 60 | ### Prodigy Console Prevention 61 | `04/10/2020` 62 | 63 | On this day, [Prodigy](https://prodigy.com) added a [devtool disabler](https://github.com/theajack/disable-devtool), which would cause a [404](https://en.wikipedia.org/wiki/HTTP_404) on [devtool](https://wd.imgix.net/image/dPDCek3EhZgLQPGtEG3y0fTn4v82/HaeLqueTSvpXQQXUwUCk.png?auto=format) open. 64 |


65 | 66 | 67 | 68 | ### Debugger Scope Ages 69 | `04/12/2020 - 04/15/2020` 70 | 71 | On these days, multiple variables were used to obtain the [Prodigy's scopes](https://github.com/ProdigyPNP/ProdigyMathGameHacking/blob/master/docs/classes/_player_d_.player.md), and access the `instance` objects. This revived free membership hacks. 72 |


73 | 74 | 75 | 76 | ### Redirector Ages 77 | `04/15/2020 - 11/13/2020` 78 | 79 | After many days, the [Redirector hack](https://github.com/ProdigyPNP/P-NP) was created, which would use a modified version of prodigy's game files. This would not be patched for a very long time. It was suceeded by the [PHEx extension](https://github.com/ProdigyPNP/ProdigyMathGameHacking/tree/master/PHEx). 80 |


81 | 82 | 83 | 84 | 85 | ### Content Security Patch 86 | `06/10/2020` 87 | 88 | On June 10th, Prodigy added content security headers. This caused the addition of another extension, Anti-CSP, to help with hacks. Having this many extensions for one job was tiring, and later PMGH introduced [PHEx](https://github.com/ProdigyPNP/ProdigyMathGameHacking/tree/master/PHEx). 89 |


90 | 91 | 92 | 93 | ### `hack.instance.prodigy.player` Patch 94 | `07/05/2021 - 07/05/2020` 95 | 96 | On July 5th, Prodigy implemented a patch for `hack.instance.prodigy.player`. This was unpatched by PMGH about 3 hours later. 97 |


98 | 99 | 100 | 101 | ### Script based hacks return 102 | `08/25/2020` 103 | 104 | On August 20th, we found a way to access the [Prodigy API](https://github.com/ProdigyAPI/ProdigyAPIDocs), and use hacks without the [Redirector extension](https://chrome.google.com/webstore/detail/redirector/ocgpenflpmgnfapjedencafcfakcekcd). 105 |


106 | 107 | 108 | 109 | ### `_.instance.prodigy.player` Patch 110 | `09/17/2020 - CURRENT` 111 | On September 18th, Prodigy patched the `hack` variable by redirecting to a 404 page if the `hack` variable was detected. To unpatch this, we renamed the variable to `_`. Prodigy already uses `_`, so they can't delete it. 112 |


113 | 114 | 115 | 116 | ### Chrome Extension Releases 117 | `10/21/2020 - 11/11/20` 118 | 119 | On October 21st, Google accepted the [PHEx (Prodigy Hacking Extension)](https://github.com/ProdigyPNP/ProdigyMathGameHacking/tree/master/PHEx) extension submission to the [Chrome Web Store](https://chrome.google.com/webstore). The extension works exacatly the same as the Redirector Hack, but is much easier as you only have to install our extension without importing the JSON file into Redirector. 120 |


121 | 122 | 123 | 124 | ### Chrome Extension Taken down 125 | `11/11/2020` 126 | 127 | On November 11th, [Prodigy](https://prodigy.com) removed the PMGH Chrome extension via [DMCA](https://www.dmca.com/)[ takedown](https://www.dmca.com/Takedowns.aspx). It was back up some day later. 128 |


129 | 130 | 131 | 132 | ### Prodigy adds SHA256 Integrity Checks 133 | `11/13/2020 - 11/19/2020` 134 | 135 | On November 13th, [Prodigy](https://prodigy.com) added extra security via integrity checking with [SHA256](https://www.n-able.com/blog/sha-256-encryption), breaking the hacks. The SHA256 check still exists, however it was bypassed by [Natsiumi](https://github.com/Patheticmustan) on November 19. 136 |


137 | 138 | 139 | 140 | ### SHA256 Sumchecks bypassed 141 | `11/19/2020` 142 | 143 | On November 19th, [Natsumi](https://github.com/Patheticmustan) bypassed the [SHA256 sumcheck](https://help.ubuntu.com/community/HowToSHA256SUM), which fixed the hacks. 144 |


145 | 146 | 147 | 148 | ### New Dashboard 149 | `07/31/2020 - CURRENT` 150 | 151 | [hostedposted](https://github.com/hostedposted) created a new dashboard on July 31, 2021. It still works to this day, actually. [Try it out.](https://prodigy-dashboard.hostedposted.com) 152 |


153 | 154 | 155 | 156 | ### The end of PMGH 157 | `04/06/2022` 158 | 159 | On April 6, 2022, [Prodigy-Hacking/](https://github.com/Prodigy-Hacking)[ProdigyMathGameHacking](https://github.com/Prodigy-Hacking/ProdigyMathGameHacking) and [Prodigy-Hacking/](https://github.com/Prodigy-Hacking)[P-NP](https://github.com/Prodigy-Hacking/P-NP) were deleted due to a DMCA takedown. [P-NP](https://github.com/Prodigy-Hacking/P-NP) technically hosts a copy of Prodigy's code, except it's modified to allow the running of hacks. [PHEx](https://github.com/ProdigyPNP/ProdigyMathGameHacking/tree/master/PHEx/build) was [taken off the Chrome Web Store](https://chrome.google.com/webstore/detail/gjabpajagbgoifbkflgojeojmnlmioea). 160 |


161 | 162 | 163 | 164 | ### The rise of ProdigyPNP 165 | `04/07/2022` 166 | 167 | Not too late after [Prodigy Hacking Official](https://github.com/Prodigy-Hacking)'s repositories were taken down by the DMCA, [gemsvidø](https://github.com/afkvido), [Eris](https://github.com/Erisfiregamer1), [donaldli2020](https://github.com/donaldli2020), and [Apocalyptic](I forgot your link) came together and formed a new organization called [ProdigyPNP](https://github.com/ProdigyPNP). This organization was dedicated to keeping Prodigy hacks alive, no matter what DMCA comes at us. *bless the demon king that gemsvido had many local clones, also the github fork network is a thing.* 168 |


169 | 170 | 171 | 172 | 173 | ### The return of PHEx 174 | `04/16/2022` 175 | 176 | After fixing the broken P-NP and PHEx, Prodigy hacks were back up, just like before. 177 |


178 | 179 | 180 | 181 | ### Error 48 182 | `08/21/2022` 183 | 184 | Prodigy had made a patch to P-NP, and with only [gemsvidø](https://github.com/afkvido) who doesn't know shit about P-NP to fix it, there was no way ProdigyPNP could continue. However, `_.player` and other lodash things still worked, but it didn't let you play the game with hacks on, making things really inconvenient. 185 |


186 | 187 | 188 | ### The fall of ProdigyPNP 189 | `09/07/2022` 190 | 191 | [ProdigyPNP closed down](https://github.com/ProdigyPNP/ProdigyMathGameHacking/blob/master/.github/ANNOUNCEMENT.md). 192 |


193 | -------------------------------------------------------------------------------- /meta/YOUTUBE_ATTRIBUTION.md: -------------------------------------------------------------------------------- 1 | ## To make a public video on our hacks, please copy the format below 2 | 3 | If you're posting a video with our hacks, please make sure to add this to your video description. 4 | 5 | ```txt 6 | Hacks are by ProdigyPNP - https://github.com/ProdigyPNP 7 | ProdigyPNP Discord - https://dsc.gg/ProdigyPNP 8 | ProdigyPNP Website - https://ProdigyPNP.com 9 | ``` 10 | 11 | *If you'd like an exception, please contact us on [our Discord server](https://dsc.gg/ProdigyPNP). We're friendly, we promise!* 12 | -------------------------------------------------------------------------------- /meta/manual/BRAVE.md: -------------------------------------------------------------------------------- 1 | ## How to hack Prodigy: Brave Browser (Manual Install) 2 | 3 |
4 | 5 | 1. Open **Brave**. 6 | 2. In Brave, enter ``brave://extensions`` in the URL bar. 7 | 3. In the top right of `brave://extensions`, you should see a toggler that says **Developer Mode**. 8 | 4. Enable Developer Mode by clicking the toggler if it was off. You should see some new buttons pop up when you turn on Developer Mode. 9 | 5. Reload ``brave://extensions`` with `Ctrl+R`. 10 | 6. [Download PHEx.zip](https://github.com/ProdigyPNP/ProdigyMathGameHacking/releases/latest). 11 | 7. Drag and drop the downloaded `PHEx.zip` into ``brave://extensions``. 12 | 8. You should see a new extension called `Prodigy Hacking Extension | PHEx` in your extensions. 13 | 9. Go to [Prodigy](https://play.prodigygame.com) (``play.prodigygame.com``). 14 | 10. Log in as usual to Prodigy. REMEMBER THAT WE STILL RECCOMMEND YOU TO LOG IN WITH A SECOND ACCOUNT TO PREVENT ACCEDENTALLY CORRUPTING YOUR MAIN ACCOUNT. 15 | 11. Once you enter a world, wait 5-15 seconds. 16 | 12. In the top left corner of your screen, you should see a dropdown arrow. Click the dropdown arrow to open the hacks. 17 | 13. Congrats, you've successfully achived hacking in the Prodigy Math Game. 18 | 14. Join [our discord server](https://dsc.gg/ProdigyPNP) for more! 19 | -------------------------------------------------------------------------------- /meta/manual/CHROME.md: -------------------------------------------------------------------------------- 1 | ## How to hack Prodigy: Google Chrome (Manual Install) 2 | 3 |
4 | 5 | 1. Open **Google Chrome**. 6 | 2. In Brave, enter ``chrome://extensions`` in the URL bar. 7 | 3. In the top right of `brave://extensions`, you should see a toggler that says **Developer Mode**. 8 | 4. Enable Developer Mode by clicking the toggler if it was off. You should see some new buttons pop up when you turn on Developer Mode. 9 | 5. Reload ``chrome://extensions`` with `Ctrl+R`. 10 | 6. [Download PHEx.zip](https://github.com/ProdigyPNP/ProdigyMathGameHacking/releases/latest). 11 | 7. Drag and drop the downloaded `PHEx.zip` into ``brave://extensions``. 12 | 8. You should see a new extension called `Prodigy Hacking Extension | PHEx` in your extensions. 13 | 9. Go to [Prodigy](https://play.prodigygame.com) (``play.prodigygame.com``). 14 | 10. Log in as usual to Prodigy. REMEMBER THAT WE STILL RECCOMMEND YOU TO LOG IN WITH A SECOND ACCOUNT TO PREVENT ACCEDENTALLY CORRUPTING YOUR MAIN ACCOUNT. 15 | 11. Once you enter a world, wait 5-15 seconds. 16 | 12. In the top left corner of your screen, you should see a dropdown arrow. Click the dropdown arrow to open the hacks. 17 | 13. Congrats, you've successfully achived hacking in the Prodigy Math Game. 18 | 14. Join [our discord server](https://dsc.gg/ProdigyPNP) for more! 19 | -------------------------------------------------------------------------------- /meta/manual/EDGE.md: -------------------------------------------------------------------------------- 1 | ## How to hack Prodigy: Microsoft Edge (Manual Install) 2 | 3 |
4 | 5 | ### WARNING: Sorry, but PHEx currently doesn't work on Edge through manual installation. 6 | ### [You can still use PHEX in Edge through the Edge addons store](../webstores/EDGE.md). 7 | 8 | 9 |
10 | 11 | 1. Open **Edge**. 12 | 2. In Edge, enter ``about:flags`` in the URL bar. 13 | 3. Under **Developer settings**, find `Enable extension developer features (this might put your device at risk)`. 14 | 4. Restart Edge (closing and opening the browser should be enough). 15 | 5. [Download PHEx.zip](https://github.com/ProdigyPNP/ProdigyMathGameHacking/releases/latest) 16 | 6. In your downloads folder, you should find a file that says `x.x.x-PHEx.zip`. **Unzip that file**. 17 | 7. Click on the edge options menu (the three dots under the X). 18 | 8. In the options menu, click on **Extensions**. 19 | 9. In Extensions, click **Load extension**. 20 | 10. Select `x.x.x-PHEx` from your downloads folder. 21 | 11. You should see a new extension called `Prodigy Hacking Extension | PHEx` in your extensions. 22 | 12. Go to [Prodigy](https://play.prodigygame.com) (``play.prodigygame.com``). 23 | 13. Log in as usual to Prodigy. REMEMBER THAT WE STILL RECCOMMEND YOU TO LOG IN WITH A SECOND ACCOUNT TO PREVENT ACCEDENTALLY CORRUPTING YOUR MAIN ACCOUNT. 24 | 14. Once you enter a world, wait 5-15 seconds. 25 | 15. In the top left corner of your screen, you should see a dropdown arrow. Click the dropdown arrow to open the hacks. 26 | 16. Congrats, you've successfully achived hacking in the Prodigy Math Game. 27 | 17. Join [our discord server](https://dsc.gg/ProdigyPNP) for more! 28 | -------------------------------------------------------------------------------- /meta/manual/FIREFOX.md: -------------------------------------------------------------------------------- 1 | ## How to hack Prodigy: Mozilla Firefox (Manual Install) 2 | 3 |
4 | 5 | 1. Open **Firefox**. 6 | 2. In Firefox, enter ``about:debugging#/runtime/this-firefox`` in the URL bar. 7 | 4. Next to **Temporary Extensions**, you should see a button that says **Load Temporary Add-on...**. 8 | 5. [Download PHEx.zip](https://github.com/ProdigyPNP/ProdigyMathGameHacking/releases/latest). 9 | 6. Go back to the add-on debugging page and click **Load Temporary Add-on...**. 10 | 7. Select `x.x.x-PHEx.zip`. 11 | 8. You should see a new extension called `Prodigy Hacking Extension | PHEx` in your extensions. 12 | 9. Go to [Prodigy](https://play.prodigygame.com) (``play.prodigygame.com``). 13 | 10. Log in as usual to Prodigy. REMEMBER THAT WE STILL RECCOMMEND YOU TO LOG IN WITH A SECOND ACCOUNT TO PREVENT ACCEDENTALLY CORRUPTING YOUR MAIN ACCOUNT. 14 | 11. Once you enter a world, wait 5-15 seconds. 15 | 12. In the top left corner of your screen, you should see a dropdown arrow. Click the dropdown arrow to open the hacks. 16 | 13. Congrats, you've successfully achived hacking in the Prodigy Math Game. 17 | 14. Join [our discord server](https://dsc.gg/ProdigyPNP) for more! 18 | -------------------------------------------------------------------------------- /meta/manual/OPERA.md: -------------------------------------------------------------------------------- 1 | ## How to hack Prodigy: Opera, Opera GX, or Opera Cryto Browser (Opera Addons Store) 2 | 3 |
4 | 5 | 1. Open **Opera** (or Opera GX, or Opera Crypto Browser, or...). 6 | 2. In Opera, enter ``opera://extensions`` in the URL bar. 7 | 3. In the top right of `opera://extensions`, you should see a toggler that says **Developer Mode**. 8 | 4. Enable Developer Mode by clicking the toggler if it was off. You should see some new buttons pop up when you turn on Developer Mode. 9 | 5. Reload ``opera://extensions`` with `Ctrl+R`. 10 | 6. [Download PHEx.zip](https://github.com/ProdigyPNP/ProdigyMathGameHacking/releases/latest). 11 | 7. Drag and drop the downloaded `PHEx.zip` into ``opera://extensions``. 12 | 8. You should see a new extension called `Prodigy Hacking Extension | PHEx` in your extensions. 13 | 9. Go to [Prodigy](https://play.prodigygame.com) (``play.prodigygame.com``). 14 | 10. Log in as usual to Prodigy. REMEMBER THAT WE STILL RECCOMMEND YOU TO LOG IN WITH A SECOND ACCOUNT TO PREVENT ACCEDENTALLY CORRUPTING YOUR MAIN ACCOUNT. 15 | 11. Once you enter a world, wait 5-15 seconds. 16 | 12. In the top left corner of your screen, you should see a dropdown arrow. Click the dropdown arrow to open the hacks. 17 | 13. Congrats, you've successfully achived hacking in the Prodigy Math Game. 18 | 14. Join [our discord server](https://dsc.gg/ProdigyPNP) for more! 19 | 20 | -------------------------------------------------------------------------------- /meta/prodigyerrors/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | ## How to contribute more Prodigy errors. 2 | 3 | If you know an error and it's cause: 4 | - [Post about it on our forum.](https://github.com/ProdigyPNP/ProdigyMathGameHacking/discussions/categories/forum) 5 | 6 |
7 | 8 | If you know the error and trigger, and what exactly is happening (Technical knowledge and details): 9 | - [Post about it on our developer forum.](https://github.com/ProdigyPNP/ProdigyMathGameHacking/discussions/categories/developer-forum) 10 | 11 | ------- 12 | 13 | If you know the error code and trigger, what exactly is happening (Technical knowledge and details), and you also know exactly how to format your addition: 14 | - [Open a pull request](https://github.com/ProdigyPNP/ProdigyMathGameHacking/pulls). 15 | -------------------------------------------------------------------------------- /meta/prodigyerrors/README.md: -------------------------------------------------------------------------------- 1 | # Prodigy Errors 2 | 3 | - [Error 20](http20.md) 4 | - [Error 36](http36.md) 5 | - [Error 72](http72.md) 6 | - [Error 84](http84.md) 7 | - [Error 403](http403.md) 8 | - [Error 404](http404.md) 9 | - [Error 418](http418.md) 10 | - [Error 500](http500.md) 11 | - [Inactivity Kick](inactivityKick.md) 12 | 13 | ------- 14 | 15 | 16 | - [Contributing to Prodigy Errors](CONTRIBUTING.md) 17 | - [Prodigy Errors License](LICENSE.txt) 18 | -------------------------------------------------------------------------------- /meta/prodigyerrors/http20.md: -------------------------------------------------------------------------------- 1 | # Prodigy Error 20 2 | - Caused by system clock being offset 2 hrs+. 3 | - Caused by using a used login token. 4 | -------------------------------------------------------------------------------- /meta/prodigyerrors/http36.md: -------------------------------------------------------------------------------- 1 | # Prodigy Error 36 2 | 3 | - Caused by bad internet connection (can be reproduced without hacks). 4 | -------------------------------------------------------------------------------- /meta/prodigyerrors/http403.md: -------------------------------------------------------------------------------- 1 | # Prodigy Error 403 2 | 3 | - Happens after using the **Disbale Inactivity Kick** [Prodigy hack](https://github.com/ProdigyPNP/ProdigyMathGameHacking) and then being inactive. 4 | - Sometimes happens when you close the Inactivity Kick popup. 5 | -------------------------------------------------------------------------------- /meta/prodigyerrors/http404.md: -------------------------------------------------------------------------------- 1 | # Prodigy Error 404 2 | 3 | - This used to happen when someone tried to open the HTML Elements or Javascript console (doesn't happen anymore) 4 | -------------------------------------------------------------------------------- /meta/prodigyerrors/http418.md: -------------------------------------------------------------------------------- 1 | # Prodigy Error 418 2 | HTTP 418 is triggered by an anticheat to prevent people using hacks to spawn in unusual loot. 3 | - Attempting to obtain > 10M gold and then finishing a battle. 4 | - Spawning in OG epic buddies with [Prodigy hacks](https://github.com/ProdigyPNP/ProdigyMathGameHacking) or [the Prodigy Dashboard](https://prodigy-dashboard.hostedposted.com/). 5 | - Getting Member Stars 6 | - Logging into Prodigy with a very hacked account. 7 | -------------------------------------------------------------------------------- /meta/prodigyerrors/http500.md: -------------------------------------------------------------------------------- 1 | # Prodigy Error 500 2 | 3 | - Happens when you use the [Prodigy Dashboard](https://prodigy-dashboard.hostedposted.com/) and sign into an account with pending email confirmation. 4 | - [How to fix this error](fixProdigyDashboard.md). 5 | -------------------------------------------------------------------------------- /meta/prodigyerrors/http72.md: -------------------------------------------------------------------------------- 1 | # Prodigy Error 72 2 | 3 | 4 | - Caused by an ambiguous error due to hacks, usually in console, unsure of consistent cause. 5 | - Confirmed example: Running ``_.player.backpack.data.hat = [null];``, character save, and logging back in. 6 | -------------------------------------------------------------------------------- /meta/prodigyerrors/http84.md: -------------------------------------------------------------------------------- 1 | # Prodigy Error 84 2 | 3 | - `Error loading player spells/skills.` 4 | -------------------------------------------------------------------------------- /meta/prodigyerrors/inactivityKick.md: -------------------------------------------------------------------------------- 1 | # "Inactivity" list 2 | The Inactivity Kick is sometimes used as an anticheat to prevent people from cheating. 3 | 4 | 5 | - Happens when you use `Win Battle` in the Arena and open a chest. 6 | - Attempting to obtain > 10M gold and then finishing a battle. 7 | - Signing in to two accounts without incognito; another profile, browser, computer, etc. 8 | - Also happens when you go AFK for a while. 9 | - Logging into Prodigy with a very hacked account. 10 | -------------------------------------------------------------------------------- /meta/webstores/BRAVE.md: -------------------------------------------------------------------------------- 1 | ## How to hack Prodigy: Brave Browser (Chrome Web Store) 2 | 3 |
4 | 5 | 1. Open **Brave Browser**. 6 | 2. Go to [chrome.google.com/webstore/detail/prodigy-hacking-extension/nmipcbdicnmjoifanpdcjdmifeioglkm](https://chrome.google.com/webstore/detail/prodigy-hacking-extension/nmipcbdicnmjoifanpdcjdmifeioglkm/) 7 | 3. Click **Add to Brave**. 8 | 4. You should see a new extension called `Prodigy Hacking Extension | PHEx` in your addons. 9 | 5. Go to [Prodigy](https://play.prodigygame.com) (``play.prodigygame.com``). 10 | 6. Log in as usual to Prodigy. REMEMBER THAT WE STILL RECCOMMEND YOU TO LOG IN WITH A SECOND ACCOUNT TO PREVENT ACCEDENTALLY CORRUPTING YOUR MAIN ACCOUNT. 11 | 7. Once you enter a world, wait 5-15 seconds. 12 | 8. In the top left corner of your screen, you should see a dropdown arrow. Click the dropdown arrow to open the hacks. 13 | 9. Congrats, you've successfully achived hacking in the Prodigy Math Game. 14 | 10. Join [our discord server](https://dsc.gg/ProdigyPNP) for more! 15 | -------------------------------------------------------------------------------- /meta/webstores/CHROME.md: -------------------------------------------------------------------------------- 1 | ## How to hack Prodigy: Google Chrome (Chrome Web Store) 2 | 3 |
4 | 5 | 1. Open **Google Chrome**. 6 | 2. Go to [chrome.google.com/webstore/detail/prodigy-hacking-extension/nmipcbdicnmjoifanpdcjdmifeioglkm](https://chrome.google.com/webstore/detail/prodigy-hacking-extension/nmipcbdicnmjoifanpdcjdmifeioglkm/) 7 | 3. Click **Add to Chrome**. 8 | 4. You should see a new extension called `Prodigy Hacking Extension | PHEx` in your addons. 9 | 5. Go to [Prodigy](https://play.prodigygame.com) (``play.prodigygame.com``). 10 | 6. Log in as usual to Prodigy. REMEMBER THAT WE STILL RECCOMMEND YOU TO LOG IN WITH A SECOND ACCOUNT TO PREVENT ACCEDENTALLY CORRUPTING YOUR MAIN ACCOUNT. 11 | 7. Once you enter a world, wait 5-15 seconds. 12 | 8. In the top left corner of your screen, you should see a dropdown arrow. Click the dropdown arrow to open the hacks. 13 | 9. Congrats, you've successfully achived hacking in the Prodigy Math Game. 14 | 10. Join [our discord server](https://dsc.gg/ProdigyPNP) for more! 15 | -------------------------------------------------------------------------------- /meta/webstores/EDGE.md: -------------------------------------------------------------------------------- 1 | ## How to hack Prodigy: Microsoft Edge (Microsoft Addons Store) 2 | 3 |
4 | 5 | 1. Open **Microsoft Edge**. 6 | 2. Go to [microsoftedge.microsoft.com/addons/detail/prodigy-hacking-extension/ekoakjipfmjpmlkldiikhoigaflfkjej](https://microsoftedge.microsoft.com/addons/detail/prodigy-hacking-extension/ekoakjipfmjpmlkldiikhoigaflfkjej) 7 | 3. Click **Get**, then **Add Extension**. 8 | 4. You should see a new extension called `Prodigy Hacking Extension | PHEx` in your addons. 9 | 5. [Go to Prodigy](https://play.prodigygame.com) (``play.prodigygame.com``). 10 | 6. Log in as usual to Prodigy. REMEMBER THAT WE STILL RECCOMMEND YOU TO LOG IN WITH A SECOND ACCOUNT TO PREVENT ACCEDENTALLY CORRUPTING YOUR MAIN ACCOUNT. 11 | 7. Once you enter a world, wait 5-15 seconds. 12 | 8. In the top left corner of your screen, you should see a dropdown arrow. Click the dropdown arrow to open the hacks. 13 | 9. Congrats, you've successfully achived hacking in the Prodigy Math Game. 14 | 10. Join [our discord server](https://dsc.gg/ProdigyPNP) for more! 15 | -------------------------------------------------------------------------------- /meta/webstores/FIREFOX.md: -------------------------------------------------------------------------------- 1 | ## How to hack Prodigy: Mozilla Firefox (Firefox Addons Store) 2 | 3 |
4 | 5 | 6 | 1. Open **Mozilla Firefox**. 7 | 2. Go to [addons.mozilla.org/en-US/firefox/addon/phex](https://addons.mozilla.org/en-US/firefox/addon/phex/) 8 | 3. Click **Add to Firefox**. 9 | 4. You should see a new extension called `Prodigy Hacking Extension | PHEx` in your addons. 10 | 5. Go to [Prodigy](https://play.prodigygame.com) (``play.prodigygame.com``). 11 | 6. Log in as usual to Prodigy. REMEMBER THAT WE STILL RECCOMMEND YOU TO LOG IN WITH A SECOND ACCOUNT TO PREVENT ACCEDENTALLY CORRUPTING YOUR MAIN ACCOUNT. 12 | 7. Once you enter a world, wait 5-15 seconds. 13 | 8. In the top left corner of your screen, you should see a dropdown arrow. Click the dropdown arrow to open the hacks. 14 | 9. Congrats, you've successfully achived hacking in the Prodigy Math Game. 15 | 10. Join [our discord server](https://dsc.gg/ProdigyPNP) for more! 16 | -------------------------------------------------------------------------------- /meta/webstores/OPERA.md: -------------------------------------------------------------------------------- 1 | ## How to hack Prodigy: Opera, Opera GX, or Opera Cryto Browser (Opera Addons Store) 2 | 3 |
4 | 5 | ### Sorry, but PHEx is currently not on the Opera Addons store. 6 | ### [You can instead manually install PHEx on an Opera browser](../manual/OPERA.md) 7 | -------------------------------------------------------------------------------- /meta/wiki/QUICKSTART.md: -------------------------------------------------------------------------------- 1 |

Hacks are being shut down. Thanks for everything.

2 | 3 |

Our Discord server: discord.gg/2qzTbdXSg9

4 | 5 | # Quickstart 6 | 7 | ## Google Chrome 8 | - Using Webstore: See [webstores/CHROME.md](../webstores/CHROME.md) 9 | - Manual Install: See [manual/CHROME.md](../manual/CHROME.md) 10 | 11 |
12 | 13 | 14 | ## Brave Browser 15 | - Using Webstore: See [webstores/BRAVE.md](../webstores/BRAVE.md) 16 | - Manual Install: See [manual/BRAVE.md](../manual/BRAVE.md) 17 | 18 |
19 | 20 | ## Mozilla Firefox 21 | - Using Webstore: See [webstores/FIREFOX.md](../webstores/FIREFOX.md) 22 | - Manual Install: See [manual/FIREFOX.md](../manual/FIREFOX.md) 23 | 24 |
25 | 26 | ## Microsoft Edge 27 | - Using Webstore: See [webstores/EDGE.md](../webstores/EDGE.md) 28 | - Manual Install: See [manual/EDGE.md](../manual/EDGE.md) 29 | 30 |
31 | 32 | ## Opera, Opera GX, Opera Crypto Browser 33 | - Using Webstore: See [webstores/OPERA.md](../webstores/OPERA.md) 34 | - Manual Install: See [manual/OPERA.md](../manual/OPERA.md) 35 | -------------------------------------------------------------------------------- /meta/wiki/README.md: -------------------------------------------------------------------------------- 1 | # ProdigyMathGameHacking Wiki 2 | 3 | 4 | 5 |


6 | 7 | # [Quickstart Guide](https://github.com/ProdigyPNP/ProdigyMathGameHacking/blob/master/meta/wiki/QUICKSTART.md) 8 | 9 | Quickstart Guide: https://github.com/ProdigyPNP/ProdigyMathGameHacking/blob/master/meta/wiki/QUICKSTART.md 10 | 11 | 12 | 13 | 14 |


15 | 16 | # [Updating Guide](https://github.com/ProdigyPNP/ProdigyMathGameHacking/blob/master/meta/wiki/UPDATING.md) 17 | 18 | Updating Guide: https://github.com/ProdigyPNP/ProdigyMathGameHacking/blob/master/meta/wiki/UPDATING.md 19 | -------------------------------------------------------------------------------- /meta/wiki/UPDATING.md: -------------------------------------------------------------------------------- 1 |

Hacks are being shut down. Thanks for everything.

2 | 3 |

Our Discord server: discord.gg/2qzTbdXSg9

4 | 5 | 6 |

If you're here because PHEx complained about being outdated, please read the announcement.

7 |

Click here to read the announcement

8 | 9 | 10 | # How to update PHEx 11 | 12 | ## Google Chrome 13 | 14 | 1. Open **Google Chrome**. 15 | 2. In Google Chrome, enter ``chrome://extensions`` in the URL bar. 16 | 3. In the top right of `chrome://extensions`, you should see a toggler that says **Developer Mode**. 17 | 4. Enable Developer Mode by clicking the toggler if it was off. You should see some new buttons pop up when you turn on Developer Mode. 18 | 5. Reload ``chrome://extensions`` with `Ctrl+R`. 19 | 6. Delete PHEx from your extensions. 20 | 7. You've successfully removed the old PHEx. 21 | 8. [Download PHEx.zip](https://github.com/ProdigyPNP/ProdigyMathGameHacking/releases/latest). 22 | 9. Drag and drop the downloaded `PHEx.zip` into ``chrome://extensions``. 23 | 10. You should see a new extension called `Prodigy Hacking Extension (PHEx)` in your extensions. 24 | 11. Go to [Prodigy](https://play.prodigygame.com) (``play.prodigygame.com``). 25 | 12. Log in as usual to Prodigy. 26 | 13. Once you enter a world, wait 5-15 seconds. 27 | 14. In the top left corner of your screen, you should see a dropdown arrow. Click the dropdown arrow to open the hacks. 28 | 15. Congrats, you've successfully achieved hacking in the Prodigy Math Game. 29 | 16. Join [our discord server](https://dsc.gg/ProdigyPNP) for more! 30 | 31 |
32 | 33 | 34 | ## Brave Browser 35 | 36 | 1. Open **Brave**. 37 | 2. In Brave, enter ``brave://extensions`` in the URL bar. 38 | 3. In the top right of `brave://extensions`, you should see a toggler that says **Developer Mode**. 39 | 4. Enable Developer Mode by clicking the toggler if it was off. You should see some new buttons pop up when you turn on Developer Mode. 40 | 5. Reload ``brave://extensions`` with `Ctrl+R`. 41 | 6. Delete PHEx from your extensions. 42 | 7. You've successfully removed the old PHEx. 43 | 8. [Download PHEx.zip](https://github.com/ProdigyPNP/ProdigyMathGameHacking/releases/latest). 44 | 9. Drag and drop the downloaded `PHEx.zip` into ``brave://extensions``. 45 | 10. You should see a new extension called `Prodigy Hacking Extension | PHEx` in your extensions. 46 | 11. Go to [Prodigy](https://play.prodigygame.com) (``play.prodigygame.com``). 47 | 12. Log in as usual to Prodigy. 48 | 13. Once you enter a world, wait 5-15 seconds. 49 | 14. In the top left corner of your screen, you should see a dropdown arrow. Click the dropdown arrow to open the hacks. 50 | 15. Congrats, you've successfully achieved hacking in the Prodigy Math Game. 51 | 16. Join [our discord server](https://dsc.gg/ProdigyPNP) for more! 52 | 53 |
54 | 55 | ## Mozilla Firefox 56 | Coming Soon`TM` 57 | 58 |
59 | 60 | ## Microsoft Edge 61 | 1. Open **Microsoft Edge**. 62 | 2. In Brave, enter ``edge://extensions`` in the URL bar. 63 | 3. In the bottom left of `edge://extensions`, you should see a toggler that says **Developer Mode**. 64 | 4. Enable Developer Mode by clicking the toggler if it was off. You should see some new buttons pop up when you turn on Developer Mode. 65 | 5. A button called **Update** should pop up. 66 | 6. Click the **Update** button. 67 | 7. If PHEx updated to the latest version, congratulations! 68 | 8. If PHEx did not update to the latest version, you may have to wait until our extension for the Edge Webstore updates. 69 | 9. Go to [Prodigy](https://play.prodigygame.com) (``play.prodigygame.com``). 70 | 10. Log in as usual to Prodigy. 71 | 11. Once you enter a world, wait 5-15 seconds. 72 | 12. In the top left corner of your screen, you should see a dropdown arrow. Click the dropdown arrow to open the hacks. 73 | 13. Congrats, you've successfully achieved hacking in the Prodigy Math Game. 74 | 14. Join [our discord server](https://dsc.gg/ProdigyPNP) for more! 75 | -------------------------------------------------------------------------------- /typings/backpack.d.ts: -------------------------------------------------------------------------------- 1 | export declare type BackpackItemType = "item" | "mathTownFrame" | "relic" | "fossil" | "follow" | "mount" | "spellRelic" | "weapon" | "outfit" | "boots" | "hat" | "currency" | "mathTownInterior" | "key"; 2 | export declare interface Backpack { 3 | addKeyItem(ID: number, something: number): void; 4 | updated: boolean; 5 | data: BackpackData 6 | } 7 | export declare interface BackpackItem { 8 | /** Item count. */ 9 | ID: number; 10 | [index: string]: number; 11 | N?: number; 12 | } 13 | export declare type BackpackData = { 14 | [type in BackpackItemType]: BackpackItem[] 15 | } -------------------------------------------------------------------------------- /typings/debugMisc.d.ts: -------------------------------------------------------------------------------- 1 | import { Game } from "./game"; 2 | 3 | export declare interface DebugMisc { 4 | addPlayerTimer: null; 5 | attackDamageCache: unknown; 6 | bountyOverrides: unknown; 7 | fakePlayerActions: unknown[]; 8 | fakePlayers: Map; 9 | game: Game; 10 | generatedRandomPlayers: unknown[]; 11 | hatSwitchEvent: null; 12 | stressTests: { 13 | emitters: unknown[]; 14 | playerContainers: unknown[]; 15 | }; 16 | updatePlayerTimer: null; 17 | _joinDelay: unknown; 18 | _playerLimit: null; 19 | disableTimeoutDialogue(): void; 20 | [index: string]: TODO; 21 | } 22 | -------------------------------------------------------------------------------- /typings/game.d.ts: -------------------------------------------------------------------------------- 1 | import { Prodigy } from "./prodigy"; 2 | import { TODO } from "./util"; 3 | import { gameData } from "./gameData"; 4 | 5 | export declare interface Game { 6 | id: number; // Not sure what this does. Seems to be 0. 7 | state: GameState; 8 | input: TODO; 9 | spriteBatch: TODO; 10 | } 11 | export declare interface GameState { 12 | states: GameStates; 13 | current: GameStates[keyof GameStates]["key"]; 14 | callbackContext: { runAwayCallback(): void }; 15 | getCurrentState(): GameStates[keyof GameStates]; 16 | } 17 | export declare interface GameStates { 18 | Boot: BootState; 19 | Loading: GameStatesState; 20 | PVPLoading: GameStatesState; 21 | TileScreen: TileScreenState; 22 | Login: LoginState; 23 | Battle: BattleState; 24 | PVP: PVPState; 25 | Faint: GameStatesState; 26 | CharSelect: GameStatesState; 27 | CharCreate: GameStatesState; 28 | Museum: GameStatesState & any; 29 | DinoDig: GameStatesState; 30 | DanceDance: GameStatesState; 31 | CoOp: GameStatesState; 32 | TestScreen: GameStatesState; 33 | PrefabScene: GameStatesState; 34 | Battle: BattleState; 35 | Login: LoginState; 36 | } 37 | export declare interface GameStatesState { 38 | key: string; 39 | game: Game; 40 | add?: unknown; 41 | } 42 | export declare interface BootState extends GameStatesState { 43 | key: "Boot"; 44 | _gameData: gameData; 45 | _metricsManager: TODO; 46 | } 47 | export declare interface PVPState extends GameStatesState { 48 | key: "PVP"; 49 | endPVP(): void; 50 | } 51 | export declare interface BattleState extends GameStatesState { 52 | key: "Battle"; 53 | startVictory(): void; 54 | teams: TODO[]; 55 | } 56 | export declare interface LoginState extends GameStatesState { 57 | key: "Login"; 58 | _gameObj: Prodigy; 59 | } 60 | export declare interface TileScreenState extends GameStatesState { 61 | key: "TileScreen"; 62 | process(): void; 63 | } -------------------------------------------------------------------------------- /typings/gameContainer.d.ts: -------------------------------------------------------------------------------- 1 | import { Game } from "./game"; 2 | import { TODO } from "./util"; 3 | 4 | type Bindings = 5 | | "Game" 6 | | "LocalizationService" 7 | | "FeatureFlagProvider" 8 | | "EnvironmentProvider" 9 | | "URLProvider" 10 | | "Assets" 11 | | "Loader" 12 | | "IFSMController" 13 | | "FSMFactories" 14 | | "FSMService" 15 | | "FSMDataProvider" 16 | | "CacheExpirationStrategy" 17 | | "CacheStorageStrategy" 18 | | "StoreDataProvider" 19 | | "ChatManager" 20 | | "StoreService" 21 | | "TimeManager" 22 | | "TechnicalMetricsManager" 23 | | "VoucherDataProvider" 24 | | "VoucherService" 25 | | "JWTAuthProvider" 26 | | "SessionTokenAuthProvider" 27 | | "DungeonService" 28 | | "DungeonDataProvider" 29 | | "PVPNetworkHandler" 30 | | "NetworkManager" 31 | | "NicknameFactory" 32 | | "NicknameController" 33 | | "NicknameProvider" 34 | | "DeviceInfoProvider" 35 | | "SocketService" 36 | | "MultiplayerSocket" 37 | | "GameServerSocket" 38 | | "GameServerService" 39 | | "UUIDProvider" 40 | | "LoggedInPlayer" 41 | | "EventBuilder" 42 | | "SurveyController" 43 | | "OptimizelyWrapper" 44 | | "GameEventReceivers" 45 | | "GameEventBroadcaster" 46 | | "GameAvatarDataFactory" 47 | | "GameBattleDataFactory" 48 | | "GameCompleteDataFactory" 49 | | "GameDiscoveryDataFactory" 50 | | "GameQuestionDataFactory" 51 | | "GameSocialDataFactory" 52 | | "ArchivesDungeonGenerator" 53 | | "TowersDungeonGenerator" 54 | | "GameStartDataFactory" 55 | | "GameSinkDataFactory" 56 | | "GameSourceDataFactory" 57 | | "ExternalMethods" 58 | | "MailExtensionController" 59 | | "MailExtension" 60 | | "PlayerService" 61 | | "InputBlocker" 62 | | "FXController" 63 | | "RemoteLogger" 64 | | "PrefabService" 65 | | "PrefabDataProvider" 66 | | "PrefabLoader" 67 | | "SurveyDataProvider" 68 | | "SurveyService" 69 | | "FeatureRequirements" 70 | | "BreadcrumbManager" 71 | | "Items" 72 | | "HttpClient" 73 | | "DuelInviteService" 74 | | "PvPBattleSocketRoom" 75 | | "BattleApiSocket" 76 | | "GeolocationService" 77 | | "MatchmakingService" 78 | | "BattleRoomService" 79 | | "MathTower" 80 | | "FeatureFlags" 81 | | "Storage" 82 | | "StorageSerializer" 83 | | "StoreManager" 84 | | "TowerTownBreadcrumbManager" 85 | | "DefaultItems" 86 | | "Education" 87 | | "DialogueFactory" 88 | | "Events" 89 | | "Cache" 90 | | "AssetLoader" 91 | | "AppearanceFactory" 92 | | "AnalyticsService"; 93 | export declare interface InversifyContainer { 94 | applyCustomMetadataReader(arg0: unknown): unknown; 95 | applyMiddleware(): unknown; 96 | createChild(): unknown; 97 | get(binding: T): T extends keyof Mapping ? Mapping[T] : TODO; 98 | } 99 | export declare interface GameContainer { 100 | inversifyContainer: InversifyContainer; 101 | hasBinding(binding: T): T extends Bindings ? true : false; 102 | get: InversifyContainer["get"]; 103 | } 104 | export declare interface DialogueFactory { 105 | _game: Game; 106 | _hands: Map; 107 | addGuideHand(arg0: unknown, x: number, y: number): unknown; 108 | createBuilder(): InstanceType; 109 | removeGuideHand(hand: unknown): unknown; 110 | showAllDone(arg0: unknown): void; 111 | showCastSpells(arg0: unknown): void; 112 | showChooseLookOfEachFloor(arg0: unknown): void; 113 | showForceCorrectAnswer(arg0: unknown): void; 114 | showSpeedUpBlockPlacement(arg0: unknown): void; 115 | showSwoopyIntroduction(arg0: unknown, arg1: unknown, arg2: unknown): void; 116 | showTutorialCompleted(arg0: unknown): void; 117 | } 118 | export declare interface Dialogue { 119 | condition: null | (() => boolean); 120 | dialogueConfig: { 121 | blockInput: boolean; 122 | dialogueData: { 123 | audio: { 124 | d: number; 125 | s: number; 126 | tag: string; 127 | }; 128 | avatar: { 129 | animationMod: string; 130 | atlas: string; // The character. 131 | frameName: string; // The expression. 132 | spineAttachment: string; 133 | }; 134 | textKey: string; 135 | callback: () => unknown; 136 | 137 | }; 138 | }; 139 | } 140 | export declare class DialogueBuilder { 141 | _controller: TODO; 142 | _events: Dialogue[]; 143 | _showGuideHand: { 144 | _hands: Map; 145 | _game: Game; 146 | }; 147 | 148 | } 149 | f.createBuilder().addDialogue(20).start(true); 150 | export declare interface Mappings { 151 | DialogueFactory: DialogueFactory; 152 | } 153 | -------------------------------------------------------------------------------- /typings/item.d.ts: -------------------------------------------------------------------------------- 1 | import { TODO } from "./util"; 2 | 3 | export declare interface Item extends PartialItem { 4 | assetID: number; 5 | name: string; 6 | data: Partial 7 | gender: number; 8 | metadata: Partial 9 | } // should have ID, type 10 | export declare interface ItemData { 11 | isPurchaseable: boolean; 12 | items: unknown[]; 13 | name: string; 14 | questions: number; 15 | filename: string; 16 | element: string; 17 | damage: number; 18 | type: number; 19 | foreignSpellPools: number[][] 20 | } 21 | export declare interface ItemMetadata { 22 | vIcon: number; 23 | assets: { default: {v: number} } 24 | } 25 | export declare interface PartialItem { 26 | ID: number; 27 | type: T; 28 | } -------------------------------------------------------------------------------- /typings/open.d.ts: -------------------------------------------------------------------------------- 1 | import { PartialItem } from "./item"; 2 | 3 | export declare interface Open { 4 | PopUpModal(prop0: unknown): unknown; 5 | /** Opens the set last name menu, but does nothing. */ 6 | advancedNameChange(prop0: unknown, prop1: unknown, prop2: unknown): unknown; 7 | alert( 8 | prop0: unknown, 9 | prop1: unknown, 10 | prop2: unknown, 11 | prop3: unknown, 12 | prop4: unknown, 13 | prop5: unknown 14 | ): unknown; 15 | /** Opens a broken archive entrance menu. The buttons don't do anything. */ 16 | archiveEntranceMenu(prop0: unknown, prop1: unknown): void; 17 | /** Opens the inventory screen. */ 18 | backpack(): void; 19 | /** Opens a placeholder popup. */ 20 | bannerDialog(prop0: unknown): void; 21 | /** Opens the use item screen that appears in battle. Broken. */ 22 | battlePotionSelect(prop0: unknown): unknown[]; 23 | /** Opens a "choose your boost!" popup. There are no buttons, softlocking the game. */ 24 | boostSelect(prop0: unknown, prop1: unknown): void; 25 | /** Opens the bounty board. */ 26 | bountyBoard(): void; 27 | /** Opens the bounty store. */ 28 | bountyStore(): void; 29 | /** Unknown functionality. Softlocks the game without arguments. Seems to have something to do with players. */ 30 | card(prop0: unknown, prop1: unknown, prop2: unknown): void; 31 | /** Opens the unused spellbook popup. */ 32 | character(): void; 33 | /** Unknown usage. */ 34 | characterDialogue(prop0: unknown, prop1: unknown, prop2: unknown): void; 35 | /** Opens the chat popup. The arguments are not needed. */ 36 | chat(prop0?: unknown): void; 37 | /** Unknown functionality. */ 38 | choosePet(prop0: unknown, prop1: unknown): void; 39 | /** Opens an unknown popup. */ 40 | classModeMessage( 41 | prop0: unknown, 42 | prop1: unknown, 43 | prop2: unknown, 44 | prop3: unknown, 45 | prop4: unknown, 46 | prop5: unknown, 47 | prop6: unknown, 48 | prop7: unknown 49 | ): void; 50 | /** Unknown functionality. */ 51 | cleanup(): void; 52 | /** Closes a menu. */ 53 | close(index: number): void; 54 | /** Closes the chat menu. */ 55 | closeChat(): void; 56 | /** Softlocks the game. */ 57 | coOpModal(prop0: unknown): unknown; 58 | gotItem(item: PartialItem[], prop1: unknown, prop2: unknown, prop3: unknown, prop4: unknown): unknown; 59 | menus: TODO[]; 60 | map(...args: any[]): void; 61 | } 62 | -------------------------------------------------------------------------------- /typings/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "prodigy-declarations", 3 | "version": "3.0.1", 4 | "description": "Type declarations for Prodigy, the math game.", 5 | "license": "MPL-2.0", 6 | "author": "ProdigyPNP", 7 | "scripts": {}, 8 | "dependencies": { 9 | "typescript": "^5.0.2" 10 | }, 11 | "keywords": [], 12 | "repository": { 13 | "type": "git", 14 | "url": "git+https://github.com/ProdigyPNP/ProdigyMathGameHacking.git#master" 15 | }, 16 | "bugs": { 17 | "url": "https://github.com/ProdigyPNP/ProdigyMathGameHacking/issues" 18 | }, 19 | "homepage": "https://github.com/ProdigyPNP/ProdigyMathGameHacking/tree/master/typings" 20 | } 21 | -------------------------------------------------------------------------------- /typings/pet.d.ts: -------------------------------------------------------------------------------- 1 | export declare interface Pet { 2 | ID: number; 3 | catchDate?: number; 4 | foreignSpells: number[]; 5 | level: number; 6 | levelCaught?: number; 7 | stars: number; 8 | team?: number; 9 | nickname?: string; 10 | } 11 | -------------------------------------------------------------------------------- /typings/pixi.d.ts: -------------------------------------------------------------------------------- 1 | import { Game } from "./game"; 2 | import { Prodigy } from "./prodigy"; 3 | import { Hack } from "../redirect/global"; 4 | import { gameData } from "./gameData"; 5 | export declare interface PIXI {} 6 | export declare interface Phaser {} 7 | declare global { 8 | const PIXI: PIXI; 9 | const Phaser: Phaser; 10 | const _: Hack 11 | } 12 | -------------------------------------------------------------------------------- /typings/prodigy.d.ts: -------------------------------------------------------------------------------- 1 | import { Game } from "./game"; 2 | import { Player } from "./player"; 3 | import { DebugMisc } from "./debugMisc"; 4 | import { TODO } from "./util"; 5 | import { Open } from "./open"; 6 | import { GameContainer } from "./gameContainer"; 7 | 8 | export declare interface Prodigy { 9 | version: string; 10 | game: Game; 11 | // debugMisc: DebugMisc; 12 | world: TODO; 13 | giftBoxController: TODO; 14 | open: Open; 15 | // debugQuests: TODO; 16 | user: TODO; 17 | pvpNetworkHandler: TODO; 18 | // network: TODO; 19 | classModeController: TODO; 20 | gameContainer: GameContainer; 21 | dialogue: TODO; 22 | notifications: TODO; 23 | battle: TODO; 24 | } -------------------------------------------------------------------------------- /typings/test.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ProdigyPNP/ProdigyMathGameHacking/7221b84ae5a0dad782f06c3cce5be9953fca5162/typings/test.ts -------------------------------------------------------------------------------- /typings/util.d.ts: -------------------------------------------------------------------------------- 1 | export type TODO = any; --------------------------------------------------------------------------------