Scan and Fix, Insert Module, Emit Code, the Optimization indicator
This page covers the small tools of the Tools menu. Scan All and the Fix box find and repair emitters that have a problem. Insert Module and Emit Code prepare an effect for a script. The Optimization indicator, the particle counter and the Particle Cap show and limit what an effect costs.
What it makes possible:
- The three broken emitters in a large map found in one press. Scan All selects them.
- Emitters brought in from an older project repaired. Fix adds what is missing and keeps every value you set.
- A ready script handed to a scripter. Emit Code writes it for whatever is selected.
- The heavy layer of an effect found. The Optimization indicator gives each selection a figure from 0 to 100.
Scan All
Section titled “Scan All”Scan All looks through the whole place for emitters that have a problem. It changes nothing. It does not list emitters that are sound.
| Step | Control | Action | Result |
|---|---|---|---|
| 1 | ≡ ▸ Tools ▸ Scan All | Press | Output lists every emitter that has a problem, then a summary line. |
| 2 | The Explorer | Read | Every listed emitter is now selected. |
| 3 | The right of the viewport | Read | The Fix box shows, with a count of the selected emitters to repair. |
Scan All looks in Workspace, ReplicatedStorage, ServerStorage, Lighting, StarterGui, StarterPack and ReplicatedFirst.
The lines in Output:
| Line | Meaning |
|---|---|
Part-Icles [Scan]: <path> - <issues> | One line for each emitter with a problem. It gives where the emitter is and what is wrong. |
Part-Icles: Scan found N with issues, M needing migration | The summary. N emitters can be repaired with Fix. M emitters need Upgrade Format. |
Part-Icles: Scan complete - no issues found | Nothing in the place needs attention. |
What a line can report:
| Text in the line | Meaning |
|---|---|
Missing EmitParent, Missing RenderTemplate, Missing Link, Missing GraphBlender | A part of the emitter that the plugin expects is not there. |
N missing config properties | N rows have no saved value. The rows were added to the plugin after the emitter was made. |
Old GraphBlender format | The Blender states are saved in an older form. |
Legacy decal routing (Fix promotes to decal layers) | The decals are set up in an older way. Fix moves them to decal layers. |
Old format (needs conversion to V4) | The whole emitter is saved in an older form. It needs Upgrade Format. |
The Fix box
Section titled “The Fix box”The Fix box is a small box at the right of the viewport. It shows whenever the selection holds an emitter with a problem. A scan is not needed for that. Selecting one old emitter is enough. The box hides when the selection holds no such emitter.
| Part of the box | Reads | What it does |
|---|---|---|
| Title | Issues Found, or Migration Needed | Migration Needed shows when every listed emitter is in an older form. |
| Count | For example 2 to fix, 1 to migrate | Counts the selected emitters of each kind. |
| Button | Fix | Repairs the emitters counted as to fix. Shown only when there are some. |
| Button | Upgrade Format | Converts the emitters counted as to migrate. Shown only when there are some. |
| Button | Dismiss | Hides the box. Nothing is changed. |
Fix adds the missing parts and writes in the missing values. It does not overwrite a value you set. It also sets the light influence of a Beam emitter to 0, and moves older decal setups to decal layers. The repair is one step in Studio’s undo history, named Part-Icles: Fix. Output reads Part-Icles: Fixed N items.
Upgrade Format converts an emitter saved in an older form to the current form. Motion values are rescaled so that the effect looks the same. The conversion is one step in Studio’s undo history, named Part-Icles: Migrate. Output reads Part-Icles: Migrated N items (speed x10, drag/accel adjusted for new physics).
An emitter that is missing newer values still emits. A missing value is read as the row’s starting value. The Fix box in the Why Dictionary gives the reason the box exists.
The shortcut action Repair Selection runs the same repair as Fix on the selected emitters, without the box. An action has no key until one is bound in Shortcuts.
Insert Module
Section titled “Insert Module”Insert Module puts a copy of the plugin’s module in the workspace.
| Step | Control | Action | Result |
|---|---|---|---|
| 1 | ≡ ▸ Tools ▸ Insert Module | Press | A ModuleScript named Part_Icles appears in the workspace and is selected. |
A Part_Icles already in the workspace is removed first, so the new copy replaces it. The press is one step in Studio’s undo history.
This copy is separate from the one in ReplicatedStorage. The plugin keeps a Part_Icles in ReplicatedStorage without being asked. It refreshes that copy when the plugin starts, when the plugin is switched on, and each time the Emit Code panel is shown. A copy in the workspace is refreshed when the plugin starts.
Getting the module into a script describes how a script loads the module.
Emit Code
Section titled “Emit Code”Emit Code writes the script that fires the selection in the running game. Exercise 17 uses it for the first time.
| To | Do this |
|---|---|
| Open the panel | Press ≡, then Tools, then Emit Code. |
| Close the panel | Press Emit Code again, or press X in the header. |
| Fold the panel away | Press the minimise button beside X. A chip appears in a row under the HUD. |
| Copy the script | Press Select All, then press Ctrl+C. |
| Try the script without leaving Studio | Press Run. |
The panel is titled Emit Code. It can be dragged by its header and resized by its edges. Whether the panel is open is kept for the next session. See Panels.
The shortcut action Toggle Emit Code shows and hides the panel.
| Control | Kind | What it does |
|---|---|---|
| Code box | Box, read only | Holds the script for the current selection. |
| Select All | Button | Selects all the text in the box, ready for Ctrl+C. The button reads Selected! for a moment. |
| Run | Button | Fires the current selection once, the way the script would. |
There is no button that copies straight to the clipboard. Select All followed by Ctrl+C does the work.
The two shapes of script
Section titled “The two shapes of script”With one thing selected, the script names it and fires it:
local Part_Icles = require(game.ReplicatedStorage:WaitForChild("Part_Icles"))Part_Icles:Activate()
local VFX = workspace.Sword.SparkBeamPart_Icles:AbsoluteEmit(VFX)With several things selected, the script lists them and fires each in turn:
local Part_Icles = require(game.ReplicatedStorage:WaitForChild("Part_Icles"))Part_Icles:Activate()
local VFX = { workspace.Sword.SparkBeam, workspace.Sword.Glow,}for _, item in VFX do Part_Icles:AbsoluteEmit(item)endThe first line loads the module from ReplicatedStorage. The second line starts it. Firing an effect describes AbsoluteEmit.
What the script lists
Section titled “What the script lists”- The script follows the Studio selection while the panel is open. Select something else and the script changes.
- The script lists whatever is selected, emitter or not.
- When one selected thing is inside another selected thing, only the outer one is listed. Firing the outer one fires what it holds.
- A path in the workspace begins with
workspace. A path elsewhere begins withgameand the name of the service, as ingame.ReplicatedStorage.Explosion. - A name that is not a plain word is written in brackets, as in
workspace["Spark Beam"]. - With nothing selected, the box reads
-- Select items to generate emit code. - Before the panel has been used, the box reads
-- Select Part-Icle items to generate emit code.
The Optimization indicator
Section titled “The Optimization indicator”The Optimization indicator is a label at the bottom left of the viewport, to the right of the particle counter. It reads Optimization: and a percentage. Exercise 20 uses it for the first time.
| To | Do this |
|---|---|
| Switch the indicator on or off | Press ≡, then Tools, then Opt. Indicator. The entry reads bright while the indicator is on. |
The indicator is off at the start of every session.
The figure is an estimate of how heavy the selected emitters would be while they play. It runs from 0 to 100. 0 is light. 100 is very heavy. Lower is lighter.
| The label shows | Meaning |
|---|---|
| Green | A figure up to 30. |
| Yellow | A figure from 31 to 60. |
| Red | A figure above 60. |
--, dim | The selection costs nothing. Nothing is selected, or every selected emitter is idle. |
The figure changes when the selection changes, on undo and redo, and while a row of a selected emitter is edited.
What raises the figure
Section titled “What raises the figure”| Cause | Detail |
|---|---|
| More particles alive at once | A higher Emit count. A higher Rate with a longer Lifetime, while Enabled is on or a Duration runs. Linger adds to the time each particle stays. |
| A heavier emitter type | Models with many parts. Lights, more so with Shadows on. Trail emitters with a long Trail Life. Beams with many segments. Screen effects. |
| Highlights | Roblox shows at most 31 Highlights at once. The figure climbs steeply past that number. |
| Lightning, Rocks, Rope, Distortion | Lightning with many segments, many forks and a fast jitter. Rocks with many chunks. Rope with many segments and a high stiffness. Distortion at a high resolution. |
| Shadows | CastShadow on, on the particle’s RenderTemplate. |
| Transparency | A particle that is partly see-through. |
| Flipbooks | A flipbook raises the figure, more so with more frames. |
| High Anim. Steps | More so with Drag above 0, with Rotation Mode Speed, with Dir. Mode Local, or on a Model. |
| Pool off on a stream | An emitter that emits without a break costs more with Pool off. |
| Nesting | The cost of a nested emitter is multiplied by the number of particles of the emitter that holds it. |
Stock emitters in a RenderTemplate | A stock ParticleEmitter, Trail or Beam there counts once for every particle emitted. |
| Stock emitters in the selection | Selected stock ParticleEmitters, Trails and Beams count too. |
What does not raise it
Section titled “What does not raise it”- An emitter with Enabled off, an Emit count of 0 and a Duration of 0 costs nothing. It would do nothing as it stands.
- An emitter in Animate mode with Loop on counts as one particle.
The particle counter
Section titled “The particle counter”The particle counter is a label at the bottom left of the viewport. It reads N particles. N is the number of the plugin’s particles alive at that moment in the editor.
| To | Do this |
|---|---|
| Hide or show the counter | Press ≡, then Counter. |
The counter shows at the start of every session.
The Particle Cap
Section titled “The Particle Cap”The Particle Cap is the largest number of particles the plugin keeps alive at once while you edit. It is a row of the Settings panel.
| Row | Kind | Starts at | Accepts | What it does |
|---|---|---|---|---|
| Settings ▸ Particle Cap | Number | 1000 | A whole number from 50 to 50000 | Sets the cap. Any other entry is refused, and the box shows the current value again. |
When the number of particles alive reaches the cap, new emits are skipped until some particles end. Output then reads:
[Part-Icles] active particle cap (N) reached - new emits skipped (user Module code still runs).A particle still showing in its Linger time counts toward the cap. The particle counter no longer counts it.
The cap is kept for the next session.
Limits
Section titled “Limits”- Scan All reports problems only. It is not a list of every emitter in the place.
- The Emit Code panel has no copy button. Use Select All, then Ctrl+C.
- The Optimization indicator is off at the start of every session, and the particle counter is on. The Particle Cap is kept.