-
Notifications
You must be signed in to change notification settings - Fork 0
Contributing
If you want to extend ZeusMod — a new cheat, a new debug primitive, UI work, docs — this page covers what to read, how to structure the change, and what reviewers will look for.
Short version. Build from source, add your change, run the manual test plan, open a PR from a feature branch against
main, and wait for review. There is no squash merge — history is kept linear via merge commits so tags stay valid.
- Read Architecture to know which component owns the change.
- Skim Feature Reference and Hook Catalog for examples of how existing cheats are structured.
- Make sure you can build locally — see Build From Source.
- MSVC v143,
/std:c++17,/W4, warnings treated as errors on new files. -
clang-formatrules live in.clang-formatat the repo root. Format before committing: the easiest path is to enable "Format on save" pointing at that file in VS. - Prefer free functions in anonymous namespaces over static methods on helper classes.
- Keep SEH (
__try/__except) contained in helper functions that don't construct C++ objects — MSVC C2712 does not forgive it otherwise. -
UObjectLookupandTrainerResolveown reflection resolution. Don't bypass them with hand-written AOB scans. - One cheat → one file (
Trainer<CheatName>.cpp) if it needs more than a dozen lines of logic. Short cheats can live in the mainTrainer.cpp.
- ES2022, plain
.js. No TypeScript, no JSX. - Preload bridge only — the renderer never touches
fs,net, orchild_process. - Prettier defaults: 4-space indent, single quotes, trailing comma
es5.
- Target:
3.9+. Don't reach for syntax that needs 3.12. - Type hints on function signatures are encouraged.
- Keep optional deps (
rich,capstone,pyreadline3) actually optional — wrap their imports intry/except ImportError. - Every new command must be added to the
COMMANDScatalog with agroup, adesc, ausage, and anexample. This drives both theDBG_PRIMITIVESgate and thehelpsystem.
- Wrap at 76–80 columns where reasonable.
- One
#h1 per page, sub-sections under##and below. - Cross-reference pages with relative links:
[Feature Reference](Feature-Reference).
- Imperative mood, ≤72 chars on the first line.
- Group related changes into a single commit — no "wip" commits in the final PR.
- Example subjects:
Release 1.5.0 — Native injector, AddModifierState hook, …Fix CI: stop electron-builder from auto-publishingAdd Infinite Oxygen cheat
- No co-author trailers and no AI attribution.
- Branch name:
feature/<slug>orfix/<slug>. Release branches arerelease/vX.Y.Z. - PRs target
main. Keep them scoped — one feature per PR. - Use the PR template — in particular, fill the How it was tested checklist honestly. Reviewers will ask if it's empty.
- Merges are always "Create a merge commit". Squash would break release tags.
No automated tests. The expected smoke test for any change is:
- Fresh build (
Release | x64) succeeds. - Fresh
npm ci && npm startlaunches ZeusMod. - Attach to a running Icarus succeeds (50–150 ms).
- The cheat you touched toggles on/off without side-effects.
-
inspect.py -c "character"still returns anOK ...line. - No regression in the other cheats — run through the full UI once before opening the PR.
If you change the pipe protocol or reflection resolution, add a line to the PR description stating so. Reviewers will ask for extra testing on those paths.
Changing a cheat, a hook, or the pipe surface without updating Feature Reference, Hook Catalog, Pipe Protocol, or Memory Layout will get the PR sent back.
For new releases, CHANGELOG.md comes first: the release CI
pulls release notes out of it, so the changelog entry is
user-visible.
- Bugs → bug report.
- Feature ideas → feature request.
- Architecture / strategy discussion → a plain issue. No Discussions tab yet.
- Multiplayer bypasses. ZeusMod is single-player / private research only. We don't accept code that hides from anti-cheat or desynchronises the server's view of the world.
- Exploits targeting other players. Same reason.
-
Closed-source binary blobs. Every binary dependency lives in
native/third_party/fetched from upstream; nothing opaque gets vendored.