Resolución de problemas
Problemas comunes y cómo arreglarlos.
El mod no aparece en el Mod Manager
Síntoma: colocaste una carpeta en Mods/ pero el editor no la lista.
Lista de comprobación:
-
La ubicación de la carpeta es correcta:
- Proyecto:
<gameRoot>/Plugins/MakerStudio/003_Editor/Mods/<your-mod-id>/ - Global:
%APPDATA%/maker-studio/Mods/<your-mod-id>/ - La carpeta debe estar dentro de
Mods/, no junto a ella.
- Proyecto:
-
manifest.json existe y es JSON válido. Campos requeridos:
id,name,version,apiVersion,main. Error común: coma faltante o coma final en el JSON. -
apiVersion coincide. Debe ser
"1.0.0". Una versión incorrecta como"2.0.0"se rechazará. -
El archivo de entrada coincide con el campo
main. Simaines"index.js", el archivoindex.jsdebe existir en la carpeta del mod. -
Reabre el proyecto o haz clic en Reload en el Mod Manager. El editor solo escanea al abrir el proyecto o al recargar manualmente.
El mod muestra estado “error”
Síntoma: el mod aparece en la lista pero su estado es rojo/con error.
- Abre el Mod Manager, haz clic en la fila del mod para expandir su log. El mensaje de error está ahí.
- Revisa la consola del navegador (
Ctrl+Shift+Ien la ventana del editor) para el stack trace completo. - Causas comunes:
- Error de sintaxis en
index.js— valídalo con un linter. - Falta
export function activate(ctx) { ... }— es obligatorio. - Importar paquetes externos — los mods corren en un contexto aislado. Solo funciona la sintaxis ESM pura. Usa
window.__TAURI__para comandos Tauri en vez de importar@tauri-apps/api. - Error de runtime dentro de
activate()— envuélvelo en try/catch para acotar.
- Error de sintaxis en
El mod carga pero no hace nada
Síntoma: el estado muestra “active” pero los toasts/eventos/elementos de menú no aparecen.
- Revisa el log del mod en el Mod Manager — ¿realmente corrió
activate()? Añadectx.log.info("activate called")como primera línea. - Revisa los nombres de evento — distinguen mayúsculas.
"map.loaded"no"Map.Loaded". - Los elementos de menú necesitan un menú —
menu: "Mods"lo coloca bajo el menú Mods. Una errata crea un nuevo menú de nivel superior que podrías no notar. isEnableddevuelve false — si tu callbackisEnableddevuelve false, el elemento de menú aparece atenuado.
Los cambios en los archivos del mod no surten efecto
Síntoma: editaste index.js pero el comportamiento no cambió.
- Haz clic en Reload en la fila del mod en el Mod Manager. El editor lee los archivos una vez al cargar.
- Comprueba que editas el archivo correcto — si el mismo id de mod existe en las ubicaciones de proyecto y global, la versión de proyecto eclipsa a la global. Revisa la insignia de origen (azul = proyecto, púrpura = global).
- Limpia la caché del navegador — improbable pero posible si cambiaste el manifest.
”Permission denied” en operaciones de archivo
Síntoma: ctx.fs.readProjectFile(...) o ctx.fs.writeModFile(...) lanza PermissionDeniedError.
- El path traversal está bloqueado — los paths que contienen
..o paths absolutos se rechazan. Usa paths relativos. readProjectFile/writeProjectFile— limitados a la raíz del juego. Solo puedes acceder a archivos dentro del proyecto.readModFile/writeModFile— limitados a la propia carpeta de tu mod. No puedes escribir fuera de ella.
El panel del mod no aparece
Síntoma: se llamó a ctx.ui.registerPanel(...) pero no hay panel visible.
- Los paneles empiezan en la posición por defecto — revisa los bordes de la ventana del editor. Puede estar acoplado pero plegado.
- Usa
defaultPosition— ponlo en"left","right","below"o"above". - Revisa la consola — si
render(host)lanza, el contenido del panel queda vacío pero la pestaña debería seguir apareciendo. - Se requiere id único — si otro mod (o el mismo mod recargado) registró el mismo id de panel, el segundo registro se ignora en silencio.
- Marcador “Panel provided by mod … — not loaded” — el hueco del panel persiste en la disposición del usuario mientras tu mod está descargado (hot reload, desactivado, error). Ese marcador es normal; tu contenido vuelve a aparecer cuando el mod re-registra el panel. Si se queda como marcador, tu mod no logró activarse — revisa el log del Mod Manager.
Dos mods entran en conflicto
Síntoma: ambos mods funcionan solos pero se rompen cuando los dos están activos.
- Revisa colisiones de id de comando — los ids de comando son globales. Si ambos mods registran
"export.map", el segundo sobrescribe al primero. Pon un namespace con tu id de mod:"my-mod.export.map". - Revisa el orden de los handlers de evento — los handlers del bus corren en orden de registro. Si ambos cancelan
save.before, gana el primero. - Revisa colisiones de id de herramienta — mismo problema que los comandos. Usa ids de herramienta únicos.
TypeScript / comprobación de tipos
Síntoma: quieres IntelliSense para ctx.
// tsconfig.json en la carpeta de tu mod{ "compilerOptions": { "types": ["../../path/to/editor/src/mod-api"] }}O usa una directiva /// <reference types="..." /> en tu archivo de entrada. Las definiciones de tipo viven en src/mod-api/types.ts en el código fuente del editor.
El elemento de menú contextual no aparece
Síntoma: se llamó a ctx.ui.registerContextMenuItem() pero el elemento no aparece en el menú de clic derecho.
- Revisa el nombre del contexto — debe ser uno de
"map-tile","map-event","tile-palette","tile-palette-extra","layer","map-tree","event-editor". Distingue mayúsculas. - Revisa la ortografía de
parentMenu— si usasparentMenu, la etiqueta del submenú debe coincidir exactamente (distingue mayúsculas). Comprueba el menú contextual del editor para la etiqueta exacta (incluida la elipsis…). - Revisa
isEnabled— si tu callback devuelve false, el elemento aparece atenuado pero sigue visible.
El overlay no se renderiza
Síntoma: se llamó a ctx.ui.registerOverlay() pero no se dibuja nada en el lienzo del mapa.
- Revisa la función de render — asegúrate de estar dibujando realmente en el contexto del canvas (p. ej.
ctx.fillStyle = ...,ctx.fillRect(...)). - Revisa las matemáticas del viewport — las posiciones de tile deben convertirse a coords de pantalla:
(tileCoord * tileSize - viewportOffset) * zoom. Los dibujos fuera del viewport se recortan. - Revisa
zOrder— los overlays con mayorzOrderse dibujan encima. Por defecto es 0. - Revisa
info.mapId— si tu overlay solo dibuja para mapas concretos, verifica que el mapId coincida.
El atajo de teclado no se dispara
Síntoma: se llamó a ctx.ui.registerShortcut() (o al shortcut de un elemento de menú) pero pulsar las teclas no hace nada.
- Revisa el formato de la tecla — debe ser
"Ctrl+Shift+F","Alt+G", etc. Distingue mayúsculas, separado por+. - Revisa conflictos — si tu tecla choca con un atajo integrado o de otro mod, abre el diálogo Keyboard Shortcuts del editor (la sección “Mods” lista cada atajo de menú de mod) y reasigna el lado que quieras. Evita los integrados comunes como
Ctrl+S(guardar) yCtrl+Z(deshacer). - Revisa que el mod esté activo — los atajos solo funcionan mientras el mod está cargado y activado.
Nota: el
shortcutde un elemento de menú (ctx.menu.registerMenuItem({ shortcut })) ahora disparahandlerpor sí solo y es reasignable en el diálogo Keyboard Shortcuts. No necesitas unctx.ui.registerShortcutaparte para él — llamar a ambos doble-registra la tecla.
El import multi-archivo no funciona
Síntoma: import { x } from './utils.js' hace que el mod no cargue.
- Usa solo specifiers relativos — los imports deben empezar con
./o../. Specifiers desnudos como'lodash'o'my-lib'no funcionarán — el editor no empaqueta paquetes npm. - Incluye la extensión
.js— escribe siempre'./utils.js', no'./utils'. La extensión de archivo es obligatoria. - El archivo debe existir en la carpeta del mod — todos los archivos importados deben ser archivos
.jsdentro del directorio del mod (los subdirectorios están bien). El editor descubre archivos escaneando el árbol de directorios. - Revisa errores de sintaxis en archivos importados — cualquier error de sintaxis en cualquier archivo
.jsde la carpeta del mod puede impedir que el mod cargue. Revisa el log del Mod Manager para el archivo y la línea concretos. - Los mods CommonJS son de un solo archivo — si tu entrada usa
module.exports = ..., el fallback denew Functionno admite imports multi-archivo. Usa sintaxis ESM (export function ...) en tu entrada para habilitar el soporte multi-archivo.