Troubleshooting
First check the status column and the detail line below it in Tools › Plugin Manager…. Then look for [Plugin <id>] lines in the Output Log. The meaning of each state is in Loading and lifecycle.
Loading
Section titled “Loading”| Symptom | Cause | Fix |
|---|---|---|
| Not in the manager list | plugin.json is not directly in the folder (it is one level deeper) | Move it so the layout is plugins\<folder>\plugin.json. |
| Not in the manager list | The folders were not rescanned after adding the folder | Click Rescan. |
| Not in the manager list | The folder was put somewhere else | Put it in the folder opened by Tools › Open plugin folder. The top of the manager window lists every folder that is scanned. |
| Stays Pending | Don’t load this time was clicked in the first-run warning | Clear and re-check the Enable checkbox to show the warning again. It also appears after restarting the editor. Click Trusted — load. |
Error (file) Invalid id format | Starts with an uppercase letter · - · a digit | Start with a lowercase letter and use only lowercase letters, digits, _ and .. |
Error (file) Invalid version format | Two parts, as in 1.0 | Write three parts, as in 1.0.0. |
Error (file) Missing sdk … · Invalid sdk version | The sdk field is missing or invalid | Write it in the form "^1.0". |
Error (file) dll must be next to plugin.json … | .. or an absolute path in dll | Write a path relative to plugin.json. |
Error (file) dll not found | Not built, or a different name | Match the dll field to the dll name in the build output. |
Error (isolated) Load failed: … entry type not found | Wrong namespace or class name in entry | Write the full Namespace.Class name, with matching case. |
Error (isolated) Load failed: … No INpEditorPlugin implementation | No entry class, or it is abstract · lacks a public parameterless constructor | Give public sealed class Plugin : INpEditorPlugin a parameterless constructor. |
Error (isolated) Load failed: … is not an INpEditorPlugin (parameterless constructor) | The entry class does not implement INpEditorPlugin or lacks a public parameterless constructor | Check the implementation and constructor. |
Error (file) Id … already exists | The same id in another folder | Delete one of them or change the id. |
Version mismatch Requires SDK ^1.3 — this editor has 1.2.0 | The sdk range is higher than the editor SDK | Update the editor, or lower sdk to match the features you use. |
Version mismatch Load failed: MissingMethodException and similar | Built with a newer SDK but sdk set too low | Raise sdk to the version of the features you actually use. |
Error (isolated) Load failed: … | Exception in Register | Fix the exception from the Output Log. See the “Registration” table below. |
Registration
Section titled “Registration”| Symptom | Cause | Fix |
|---|---|---|
Error (isolated) … is empty right after enabling | Id · Name · Kind · shortcut name · key is an empty string | Fill in the empty field. |
Error (isolated) Can't parse shortcut key | Key strings such as "1~8" · "W/E/R" · "Ctrl++" | Write it in the form "Ctrl+Alt+H". See the key table in Registration points. |
| Error (isolated) related to a scene event type | The same Type already exists in the same role (built-in cinematic and so on) | Prefix Type with your own name. |
| A console command does not appear | A command with the same name already exists · the name contains spaces | Prefix the name with your own name and remove the spaces. |
| A menu appears in the wrong place | Typo in the Menu name (a new menu is created) | Use one of "파일" · "편집" · "창" · "도구" · "빌드" · "도움말". |
| The panel is not visible | Panels are created closed | Turn the panel on in the Window menu. |
| The mode is not visible in the mode row | Modes after the first 8 are in More | Open More at the end of the mode row. |
| Symbols in menu or tab names disappear | Pictographic characters are stripped on screen | Use text only, and give icons as an icon name in the Icon field. |
Runtime
Section titled “Runtime”| Symptom | Cause | Fix |
|---|---|---|
| Error (isolated) during use | Exception in a callback (menu · command · event · panel text · Simulate) | Read Error → isolated — <where>: … in the Output Log, fix it, then click Reload (selected) |
InvalidOperationException from World.Edit | Another large edit (fill · terrain) is in progress | Try again after it finishes. Catch the exception and turn it into a notification. |
| Blocks do not change · the return value is small | Locked cells (Co-building lock · locked actor · cell guard) | Check with the return value (number of changed cells). |
| Blocks show a purple and black checkerboard | Typo in the block state string · missing namespace | Write it precisely, as in minecraft:stone_bricks. |
| Ctrl+Z must be pressed several times to revert | Edit was called multiple times | Wrap one operation in a single Edit. |
| Drawings or state from the previous world remain in a new world | Not cleared in WorldChanged | host.WorldChanged += _ => { …Clear(); host.Draw.Clear(); }; |
| The editor stutters while editing | The Committed handler is heavy | Only count, and do heavy work later. |
| The editor stutters when the panel is open | Live text (Label(() => …)) scans the world | Keep values in fields and only read them in the text. |
| A panel number field differs from the saved value | The panel is built once on enable | Read Settings first at the start of Register. |
SetCamera returns false | Not in Play · the value is NaN | Check host.View.Playing first. |
host.WorldChanged -= … has no effect | Host events do not support -= | Filter with a flag inside the handler. |
| Settings disappeared | The settings file was corrupt, so it started with empty settings | Check plugin_settings\<id>.json.bad. |
Reload · disable
Section titled “Reload · disable”| Symptom | Cause | Fix |
|---|---|---|
| A rebuild is not reflected | The old dll remains in the plugin folder · not reloaded | Overwrite with the new dll and click Reload (selected) |
| Rescan does not reflect changes | Plugins already on are not reloaded | Use Reload (selected). |
| Not unloaded from memory after disabling | Your objects remain in static events · timers · threads | Release them in IDisposable.Dispose. |
| Background work keeps running after disabling | Task.Run work was not stopped | Stop it with a CancellationToken in Dispose. |
Pre-release checklist
Section titled “Pre-release checklist”-
plugin.json:idrules · three-partversion·sdk= minimum version of the features used ·dll·entrynames are correct. - The folder does not contain
NP.Editor.Sdk.dll(csprojPrivate=false). - It becomes On with Rescan when placed in a clean plugin folder.
- No exception lines in the Output Log.
- Menus, panels and modes are not duplicated or left behind after enable → disable → enable.
- No previous state remains after a new world or opening another world (
WorldChanged). - One use of a feature reverts with one Ctrl+Z.
- No exceptions with no selection or an empty world.
- Command names, world logic types and actor kinds start with your own name.
- No emoji or pictographic characters in on-screen text.
- Shortcuts do not collide with built-in keys (no red rows in Tools › Shortcuts…).
- If you added world logic types, the server-side (NP Scene) handlers are ready too.
-
Disposereleases background work and static events. - No secret keys, tokens or personal paths in code or files.