Capabilities

UNSTUCK_CHARACTER

Move a stuck character to recovery coordinates

Moves a character that can no longer move itself back to a town. It is offered to players as a self-service button, so it has to be safe to press without a GM watching.

ResultMeaning
UNSTUCKThe character was moved, or the move was queued
CHARACTER_ONLINERefused: this setup can only move a logged-out character
CHARACTER_OFFLINERefused: this setup can only move a character who is in the world
NOT_FOUNDThat account does not own that character
FAILEDThe operation could not be completed

Always match on both the account and the character id. A character id alone is guessable, and nothing else downstream checks whose character it is.

Implementing it

String unstuck(String accountName, int characterId) throws Exception;

Check the character is offline, then update its saved coordinates. Both reference implementations read the destination from config/portal.propertiesUnstuck.X, Unstuck.Y, Unstuck.Z, defaulting to Giran on retail coordinates:

config/portal.properties
#Unstuck.X=82698
#Unstuck.Y=148638
#Unstuck.Z=-3473

The connector core parses them for you: after PortalConfig.load() they sit on the public fields PortalConfig.UNSTUCK_X, PortalConfig.UNSTUCK_Y and PortalConfig.UNSTUCK_Z, defaults included — no properties parsing in the bridge:

final int x = net.forgeport.connector.PortalConfig.UNSTUCK_X;
final int y = net.forgeport.connector.PortalConfig.UNSTUCK_Y;
final int z = net.forgeport.connector.PortalConfig.UNSTUCK_Z;

Moving the town is a config edit, not a rebuild — a town that exists on one chronicle is open water on another, so check the coordinates against your own map. A bridge that hardcodes its own still works.

Only while the character is logged out

A logged-in player owns its position in memory and writes it back on the next save, so a move applied underneath it is silently discarded — or worse, half-applied. CHARACTER_ONLINE is a refusal, not a failure: the request worked and the answer was no.

Verification

Connector check runs the real operation. An offline test character will be moved, so use one you do not mind relocating. Where the setup refuses an online character, that refusal comes back as CHARACTER_ONLINE and confirms the round trip without touching anything.

On this page