You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CLAUDE.md
+45-6Lines changed: 45 additions & 6 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -61,7 +61,7 @@ import sys; [sys.modules.pop(k) for k in list(sys.modules) if "UEFN_Toolbelt" in
61
61
## What This Project Is
62
62
63
63
**UEFN Toolbelt** is a comprehensive Python automation framework for Unreal Editor for Fortnite (UEFN 40.00+, March 2026).
64
-
It runs inside the editor and exposes 171 tools through:
64
+
It runs inside the editor and exposes 204 tools through:
65
65
- A persistent top-menu entry (`Toolbelt ▾`) in the UEFN editor bar
66
66
- An 18-tab PySide6 dark-themed dashboard (`tb.launch_qt()`)
67
67
- An MCP HTTP bridge so Claude Code can control UEFN directly
@@ -103,7 +103,7 @@ This file contains every registered tool with its full Python parameter signatur
103
103
}
104
104
}
105
105
```
106
-
All 171 tools (100%) return `{"status": "ok"/"error", ...}` structured dicts as of Phase 21. Zero `None` returns remain in the codebase — MCP callers can read every result directly without parsing log output.
106
+
All 204 tools (100%) return `{"status": "ok"/"error", ...}` structured dicts as of Phase 21. Zero `None` returns remain in the codebase — MCP callers can read every result directly without parsing log output.
107
107
108
108
**Schema utility functions** (`schema_utils.py`):
109
109
-`schema_utils.validate_property(class_name, prop)` — check if a property exists and is writable
|`align_to_reference`|`axis="Z"`, `reference="first\|last"`| Snap axis to first or last selected actor's position |
468
+
|`distribute_with_gap`|`axis="X"`, `gap=0.0`| Exact cm gap between bounding boxes (not pivot-to-pivot) |
469
+
|`rotate_around_pivot`|`angle_deg=90`, `axis="Z"`, `pivot="center\|first"`| Orbit selection around center-of-bounds or first actor |
470
+
|`align_to_surface`|`offset_z=0.0`| Snap selection to floor with optional Z offset |
471
+
|`match_spacing`|`axis="X"`| Even pivot spacing between first and last (endpoints fixed) |
472
+
|`align_to_grid_two_points`|`grid_size=100.0`| Local grid from two anchor actors, snap rest to it |
473
+
474
+
---
475
+
476
+
### Actor Organization
477
+
478
+
| Tool | Key Params | What it does |
479
+
|---|---|---|
480
+
|`actor_attach_to_parent`| — | Last selected becomes parent of all others (Maya-style) |
481
+
|`actor_detach`| — | Detach selection from parent, preserve world transforms |
482
+
|`actor_move_to_folder`|`folder_name`| Move selection to named World Outliner folder |
483
+
|`actor_move_to_root`| — | Strip folder from selection, move to root |
484
+
|`actor_rename_folder`|`old_folder`, `new_folder`, `dry_run=False`| Re-path all actors from one folder to another |
485
+
|`actor_select_by_folder`|`folder_name`| Select all actors in a named folder |
486
+
|`actor_select_same_folder`| — | Expand selection to all actors sharing the first actor's folder |
487
+
|`actor_select_by_class`|`class_filter`| Select all level actors whose class name contains filter |
488
+
|`actor_folder_list`| — | Full folder map with actor counts — great for auditing level structure |
489
+
|`actor_match_transform`|`copy_location=True`, `copy_rotation=True`, `copy_scale=False`| Copy transform from first selected to all others |
490
+
491
+
---
492
+
463
493
### Foliage / Scatter
464
494
465
495
| Tool | Key Params | What it does |
466
496
|---|---|---|
467
-
|`scatter_props`|`asset_path`, `count`, `radius`, `folder="Scatter"`| Individual actor scatter |
468
-
|`scatter_hism`|`asset_path`, `count`, `radius`, `folder="Scatter"`| HISM (use for 100+) |
497
+
|`scatter_props`|`asset_path`, `count`, `radius`, `center`, `folder="Scatter"`| Individual actor scatter at center |
498
+
|`scatter_hism`|`asset_path`, `count`, `radius`, `center`, `folder="Scatter"`| HISM (use for 100+) at center |
499
+
|`scatter_avoid`|`asset_path`, `count`, `radius`, `center`, `avoid_class`, `avoid_radius`| Poisson scatter — skips positions within avoid_radius of matching actors |
500
+
|`scatter_road_edge`|`asset_path`, `points=[[x,y,z],...]`, `edge_offset`, `spread`| Props along both shoulders of a path. Pass waypoints or select SplineActor |
469
501
|`scatter_along_path`|`asset_path`, `points`, `count_per_point=3`| Along path points |
470
502
|`scatter_export_manifest`| — | Export scatter data to JSON |
471
503
|`scatter_clear`|`folder="Scatter"`| Remove all scattered actors |
|`text_color_cycle`| — | Row of team/color labels |
605
637
|`text_save_style`|`name`, `color`, `size`| Save a named text style |
606
638
|`text_list_styles`| — | Print saved styles |
607
639
|`text_clear_folder`| — | Delete all toolbelt text actors |
640
+
|`sign_spawn_bulk`|`count`, `text`, `prefix`, `location`, `layout="row_x\|row_y\|grid"`, `spacing`, `cols`, `color`, `world_size`| Spawn N TextRenderActor signs in a row/grid. **Not Billboard devices.**|
641
+
|`sign_batch_edit`|`text`, `color`, `world_size`| Edit selected signs — only fields you pass are changed |
642
+
|`sign_batch_set_text`|`texts=[...]`| Assign individual text to each selected sign in order |
|`sign_list`|`folder=""`| List all TextRenderActors with their text |
645
+
|`sign_clear`|`folder="Signs"`, `dry_run=False`| Delete signs in folder |
646
+
|`label_attach`|`offset_z=150`, `yaw=0`, `color`, `world_size`, `use_actor_name=True`| Spawn floating label above each selected actor, parented so it follows. Great for NPC name tags. |
608
647
609
648
---
610
649
@@ -725,7 +764,7 @@ tb.run("config_reset", key="all") # wipe all customisations
725
764
|---|---|---|
726
765
|`plugin_validate_all`| — | Validate all registered tools against schema |
727
766
|`plugin_list_custom`| — | List all loaded third-party tools from `Saved/UEFN_Toolbelt/Custom_Plugins`|
728
-
|`plugin_export_manifest`| — | Export `tool_manifest.json` — machine-readable index of all 171 tools with full parameter signatures (name, type, required, default) for AI-agent and automation use |
767
+
|`plugin_export_manifest`| — | Export `tool_manifest.json` — machine-readable index of all 204 tools with full parameter signatures (name, type, required, default) for AI-agent and automation use |
729
768
730
769
**Online Plugin Hub** — the Plugin Hub dashboard tab fetches `registry.json` live from GitHub.
731
770
-**Core Tools** (green/BUILT-IN): 10 flagship modules by Ocean Bennett, already built in
0 commit comments