Please add a native pre-movement validation point for map access requirements that can evaluate Regular Level only, without adding Master Level. This is necessary for servers that keep Master Level and Master Skill Tree after character reset while still requiring players to rebuild their regular level before they can access higher-progression maps.
Current behavior and limitation
The current Lua API provides these movement callbacks:
- onCharacterJoinMap
- onMoveMap
- onMapTeleport
- onTeleport
- onTeleportMagicUse
They are asynchronous callbacks. They run after the game server has already accepted and completed the movement. Lua can then move the player back with Move.ToMap, but it cannot deny the original transition before entry. onUseCommand, onNpcTalk, and onItemUse are synchronous, but they cover only specific movement routes and cannot provide one authoritative validation point for all sources.
Requested native configuration
Add a map-move level validation mode to the MapMove / gate requirement system:
<MapMoveRequirements LevelRequirementMode="0" />
Proposed values:
- 0 = Regular Level only (Character.Level)
- 1 = Master Level only (Character.MasterLevel)
- 2 = Regular Level + Master Level (current combined behavior where applicable)
A per-entry override would also be useful:
<Move ClientName="Ferea" MinLevel="400" LevelRequirementMode="0" />
With LevelRequirementMode="0", the native implementation should validate:
if (lpObj->Level < requiredLevel) { return false; }
and must not use a combined value such as:
lpObj->Level + lpObj->MasterLevel
Requested Lua callback
Please also expose a synchronous callback that runs before the C++ move is committed:
function onCheckMapMove(oPlayer, targetMap, targetX, targetY, gateNumber, moveSource) return 0 -- allow -- return 1 -- deny end
Required execution contract
- | Property | Requirement |
- | Type | Synchronous | |
- Timing | Before any map transition is committed | |
- Return 0 / nil | Allow native movement | |
- Return 1 | Deny native movement and keep the player in the current position | |
- Performance | Must be lightweight; no blocking I/O required |
Required parameters
- | Parameter | Description |
- | oPlayer | Player object | |
- targetMap | Final map number | |
- targetX, targetY | Final coordinates | |
- gateNumber | Gate index, or -1 where no gate is used | |
- moveSource | MAP_MOVE, COMMAND, GATE, NPC, ITEM, EVENT, SCRIPT, TELEPORT_MAGIC | |
- mapMoveEntryId (optional) | Native MapMove rule/entry ID if available |
Why this matters
A native regular-level-only option enables the following valid configuration:
<Settings MoveToCharSelectWindow="0" ResetMasterLevel="0" ResetMasterSkillTree="0" />
The character can remain connected after reset and keep Master Level progression, but cannot use Master Level as a shortcut to enter maps such as Aida [2], Ferea, Raklion, Swamp of Calmness, Lost Tower upper floors, or Karutan [2] before rebuilding the required regular level. This improves player experience by removing the forced character-selection interruption while preserving progression integrity.
Compatibility expectation
The validation must apply uniformly to every native movement path:
- Map Move UI
- /move and equivalent commands
- gates and portals
- NPC transfers
- teleport items
- event entry routes
scripted Move.Gate / Move.ToMap operations, with an optional explicit bypass flag for trusted server-side events
teleport magic when it crosses a restricted area boundary
Temporary Lua workaround
Until a pre-move API exists, servers can use asynchronous callbacks to detect a forbidden destination and immediately return the player to a safe map. This is useful but not equivalent to a true deny because the player briefly enters the target map before correction. A native pre-move check or built-in LevelRequirementMode="0" is the reliable long-term solution.

Recommended Comments
There are no comments to display.