v58 · Latest Release

WorldEditor,
the way it
should work.

A drop-in replacement for the traditional M2 WorldEditor binary. Now with native 64-bit support. Fully translated, crash-fixed, with an embedded Python 3.8 scripting API and dozens of tools the original never shipped.

WorldEditorRemix.py — press F5 to run
# lib38\WorldEditorRemix.py
import WorldEditor as we
import dbg
from WorldEditorRemixWrapper import (
  WorldEditorWrapper, terrain_operations,
  show_ui
)

WE = WorldEditorWrapper()

if WE.IsMapReady():
  name = WE.GetMapName()
  cx, cy = WE.GetTerrainCount()
  dbg.LogBox("Map: {} ({}×{})".format(
    name, cx, cy))

# open the overlay UI panel
show_ui()
57Versions Released
35+Bugs Fixed
200+API Functions
Py 3.8Embedded

Fixes, new tools,
and a full scripting API.

Built on top of the original binary with patches accumulated over years of active M2 map development.

🎮
DirectX 9Ex

Modern rendering engine. Migrated from DX8 to DX9Ex for full GPU compatibility and improved resource management.

🐍
Python Scripting

Full Python 3.8 embedded. Press F5 in any scene to run your script live. Access 200+ native API functions.

🔧
Crash Fixes

Buffer overflows, atlas saves, regen load/save, multi-object selection, skybox cleanup — fixed.

↩️
Undo / Redo

Full undo/redo for terrain edits and object operations.

💾
Auto-Backup

Before every save, the entire map folder is cloned to a dated backup directory automatically.

📦
Pack Loading

Read files directly from pack/Index — no extracting assets just to edit.

🗺️
Map Export

One-click export of all loaded map files into a clean release-ready directory.

⌨️
WASD Navigation

WASD + arrow key camera with async diagonal movement. Step size configurable in the .ini.

🎛️
server_attr Generator

Generate server attribute maps with texture pattern auto-detection and configurable flag cleaning.

🌊
Water Tools

Water height pick, set-all, +1z / -1z buttons, and cleanup of orphaned water pixels.

Script the editor.
Automate the tedious parts.

If you can do it by hand in the UI, you can script it. Terrain edits, attribute painting, prop scattering, water cleanup.

terrain_operations.py — attribute painting from texture names Python 3.8
# Paint ATTRIBUTE_BLOCK on "stone" textures, ATTRIBUTE_BANPK on "tile" textures
from WorldEditorRemixWrapper import terrain_operations

terrain_operations.ApplyAttributesByTexturePattern()

# Scatter props across grass-textured tiles, 15 m minimum spacing
MY_CRCS = [802175187, 1030411250]
inserted, skipped = terrain_operations.PlaceObjectsOnSpecificTextures(
    MY_CRCS, "grass", min_distance_meters=15.0
)

# Flatten a region to height 1000
import WorldEditor as we
we.DrawHeightRegion(100, 100, 300, 300, 1000)
we.RefreshTerrain()

Every feature documented.

From first install to advanced scripting — every option, every function, every known issue.

Bug reports. Feature requests.
Full release history.

Distributed as prebuilt binaries — no compilation needed. Download, extract, and run.

release layout — v58
── 32-bit package ──
gran212.dll
WorldEditorRemix.ini ← configure here
WorldEditorRemix_MfcRelease_v58.exe
WorldEditorRemix_MfcDebug_v58.exe
lib38\
  python38.dll ...
  WorldEditorRemix.py ← edit here
  WorldEditorRemixWrapper\

── 64-bit package ──
WorldEditorRemix.ini
WorldEditorRemix_MfcRelease_x64_v58.exe
WorldEditorRemix_MfcDebug_x64_v58.exe
lib38-x64\ ← no gran212.dll needed
  python38.dll ...
  WorldEditorRemix.py
  WorldEditorRemixWrapper\

Follow the thread.

Release announcements, bug reports, and script sharing happen on M2Dev.

M2Dev
Release thread — announcements, discussion, script sharing