An external Python-based trainer and cheat engine for the Unity Mono game How to Fish (渔力全开).
Powered by pymem, JIT function hooking via Mono runtime interop, and an interactive rich TUI dashboard.
| Hotkey | Feature | Description |
|---|---|---|
| F1 | Lock Health | Blocks all incoming damage (NPC hits, punches, hazards, fire, poison, starvation) & dissipates elemental gauges. Normal jump physics preserved. |
| F2 | Lock Hunger | Prevents fullness meter from dropping over time or during actions. |
| F3 | Infinite Air Jump | Pure movement patch: allows infinite mid-air jumps / air flight (InGodMode is NOT used; health unaffected). |
| F4 | Unlimited Ammo | Infinite ammunition for all firearms without magazine depletion or forced reloads. |
| F5 | Damage Multiplier | Cycles damage multiplier for firearms, melee weapons, and fists: 1x 2x 5x 10x One-Shot Kill (99999). |
| F6 | Add Money (+1w) | Adds +$10,000 (1w) money with sound effect, UI animation, and multiplayer synchronization on keypress. |
| F12 | Switch Language | Toggles trainer interface language between Chinese (中文) and English (EN). |
| F10 | Safe Exit | Restores all modified code/memory and exits the trainer safely. |
- Mono Runtime Interop (
howtofish_cheat.mono.bridge):- Resolves
mono-2.0-bdwgc.dllexports insideHow to Fish.exe. - Attaches remote threads to the Mono root domain with TLS setup.
- Dynamically locates loaded assemblies (
Assembly-CSharp), classes, methods, and static vtables.
- Resolves
- JIT Compilation & Memory Scaling (
howtofish_cheat.mono.patcher):- Lock Health (
F1): JIT-patchesPlayerVitals.TakeDamage,PlayerVitals.LocalHit,PlayerVitals.DamageFromFullness,PlayerVitals.ApplyNewFire, andPlayerVitals.ApplyNewPoison. - Lock Hunger (
F2): JIT-patchesPlayerVitals.LowerFullnessandPlayerVitals.LowerFullnessTick. - Infinite Air Jump (
F3): Installs a direct call trampoline onPlayerMovement.JumpInputpointing straight toPlayerMovement.Jump, enabling unlimited air jumps without touching health or God Mode. - Unlimited Ammo (
F4): JIT-patchesWeapon.set_AmmowithRET(0xC3) and actively locks magazine capacity to999while resetting reload flags. - Damage Multiplier (
F5): Pure real-time in-memory scaling acrossPlayerPunching._damage,Melee._sharpnessUpgradesarray,Attachments._bulletUpgradesarray, andWeaponInfo.ProjectileDamage(1x, 2x, 5x, 10x, One-Shot Kill). - Add Money (
F6): Directly updates authoritative static<Money>k__BackingFieldand FishNetSyncVar<int> _money, invokesPlayerUI.SetMoneyfor floating+$10000text + HUD animated roll, and callsMoneyManager.MoneySoundfor audio feedback. - Disabling any cheat or exiting cleanly restores original machine code bytes and base values.
- Lock Health (
- Interactive Console UI (
howtofish_cheat.ui.console):- Live status display with connection status, active PID, Mono domain pointer, and real-time cheat states.
You can launch the trainer either before or after starting the game:
# Using the quick-launch script with uv
uv run python run_trainer.py
# Or as a module with uv
uv run python -m howtofish_cheat
# Build single standalone executable (dist/HowToFishTrainer.exe)
uv run python build.py
# Run unit tests with uv
uv run pytest -v- Press F1 to toggle Lock Health.
- Press F2 to toggle Lock Hunger.
- Press F3 to toggle Infinite Air Jump.
- Press F4 to toggle Unlimited Ammo.
- Press F5 to cycle Damage Multiplier (
1x$\rightarrow$ 2x$\rightarrow$ 5x$\rightarrow$ 10x$\rightarrow$ One-Shot). - Press F6 to Add Money (+1w / +$10,000) on press.
- Press F12 to Switch Language (中文 / EN) at any time.
- Press F10 or Ctrl+C to cleanly exit the trainer.
For an in-depth breakdown of the reverse engineering, FishNet network architecture, Mono runtime TLS internals, JIT trampolines, and gotchas, see: