This is an external Mortal Online 2 radar hack made for Linux and written in Python. The code is relatively simple so it should be easy to extend or adapt to other games, especially ones using Unreal Engine.
-
Probably not. You won't get detected - I've used this for thousands of hours. The radar doesn't modify any memory, it reads it externally. Don't be too blatant and you should be fine. With all that said, you cheat at your own risk, etc. etc. Don't blame me if you get caught.
-
Not every game update will break things, but if it does stop working after an update send me a message on UC or open an issue on GitHub and I'll take a look.
-
Don't count on it. I'm focusing on other projects now and don't plan on adding any major features to this, but I'm keeping it updated and might add small features from time to time.
-
If it's related to hacking, I'll try my best. For general Linux questions check out r/linux_gaming or DuckDuckGo first. If you're still stuck, let me know and I'll be happy to help.
-
Not supported. If you want to port it yourself, the only major thing you'll need to do is change
native.py
to useReadProcessMemory
. The rest of the hack will work without changes. I recommend checking out DougTheDruid's project if you're interested in that.
- Python >= 3.8
- Your favorite Linux distribution
- Root privileges
- The ability to use a command line
You don't need to be a programmer or have much experience with Linux to use this hack. It works out of the box with no changes necessary.
Download the code and extract the files to a new directory, then open a terminal in that directory and run:
sh setup.sh
to automatically create a virtual environment for the cheat. On Debian
based distributions, you may need to install the python3-venv
package first
with:
sudo apt install python3-venv
Next, you can launch the cheat by running:
sudo sh launch.sh
I recommend using the Flatpak version of Steam.
The program must be run as root. To start the radar, open a terminal in the directory where you extracted the program and run:
sudo python3 -OO main.py
while the game is running.
You can preview the radar graphics without running the hack ingame by running
demo.py
.
You can close the radar by either pressing Esc
inside the radar window or
Ctrl+C
inside the terminal where you ran the program.
You can zoom in or out by pressing PageUp
and PageDown
or the Up
and
Down
arrow keys inside the radar window.
You can control what gets displayed by editing config.json
. To view the
FNames of actors as they're loaded, enable the debug_fnames
option. When you
see an actor you're interested in, you can add it to the appropriate category
in config.json
.
To show an NPC, the beginning of its FName must be in npc_prefixes
. The two
included by default cover pretty much every NPC in the game, so you shouldn't
need to change it. If an FName begins with a prefix in npc_prefixes
, it's
checked to see if it contains any of the strings in npc
. If it does, a radar
marker will be created.
If the NPC's FName contains a string from show_health
, the radar will display
the NPC's health. Similarly, if it contains a string from invert_label
the
label will be shown underneath the marker instead of above it. This is nice for
mounts because the label won't cover the name of the player riding it.
Here's an example of how it would process the FName
BP_AI_Example_ZombieBear_C
:
-
The FName starts with
BP_AI_
, which is innpc_prefixes
. This means it's an NPC, but we still need to check to see if it's an NPC we want to display. -
The FName contains
Bear
fromnpc
. That's a match, so the radar will show the NPC. -
The FName also contains the tag
Zombie
fromshow_health
, so its health will be shown. -
Finally, it contains
Bear
frominvert_label
, so its label will be inverted.
Of course, you can change the options if you want. I like having a lot of information, so the default config includes almost everything I consider useful. Feel free to turn some things off.
Mesh actors are handled in a much simpler way. The radar just checks to see
if they contain a string in mesh
. For AvatarStaticMesh_LootBagExample_C
:
- The FName contains
AvatarStaticMesh_LootBag
frommesh
, so it's a match and will be displayed. It only needs to be a partial match.
Because it doesn't care as much about what it matches for meshes, try to use
longer strings in the mesh
section of the config to prevent bad matches.
If you'd like to change the font sizes, you'll need to edit
PlayerBlip.FONT_SIZES
, NPCBlip.FONT_SIZES
, or GenericBlip.FONT_SIZES
in
graphics.py
.
-
For being a great educational resource and demonstrating that there's nothing wrong with using Python for externals.
-
For being an excellent Linux hack and providing detailed information on system settings.
-
For letting us all get away with it. :^)