├── .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 |
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 |
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 |
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 |
61 |
62 |
63 |
64 |
65 |
66 |
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 | Confirm
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 |
59 |
60 |
61 |
62 |
63 |
64 |
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 | Confirm
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 |
2 |
3 |
4 |
5 |
6 |
14 |
15 |
16 |
17 |
18 |
19 |
20 | Website
21 | •
22 | Discord
23 | •
24 | Installation
25 | •
26 | YouTube
27 |
28 |
29 |
30 |
31 |
32 |
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 |
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 |
2 |
3 | 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;
--------------------------------------------------------------------------------