Skip to content

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 looks through the whole place for emitters that have a problem. It changes nothing. It does not list emitters that are sound.

StepControlActionResult
1≡ ▸ Tools ▸ Scan AllPressOutput lists every emitter that has a problem, then a summary line.
2The ExplorerReadEvery listed emitter is now selected.
3The right of the viewportReadThe 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:

LineMeaning
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 migrationThe summary. N emitters can be repaired with Fix. M emitters need Upgrade Format.
Part-Icles: Scan complete - no issues foundNothing in the place needs attention.

What a line can report:

Text in the lineMeaning
Missing EmitParent, Missing RenderTemplate, Missing Link, Missing GraphBlenderA part of the emitter that the plugin expects is not there.
N missing config propertiesN rows have no saved value. The rows were added to the plugin after the emitter was made.
Old GraphBlender formatThe 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 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 boxReadsWhat it does
TitleIssues Found, or Migration NeededMigration Needed shows when every listed emitter is in an older form.
CountFor example 2 to fix, 1 to migrateCounts the selected emitters of each kind.
ButtonFixRepairs the emitters counted as to fix. Shown only when there are some.
ButtonUpgrade FormatConverts the emitters counted as to migrate. Shown only when there are some.
ButtonDismissHides 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 puts a copy of the plugin’s module in the workspace.

StepControlActionResult
1≡ ▸ Tools ▸ Insert ModulePressA 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 writes the script that fires the selection in the running game. Exercise 17 uses it for the first time.

ToDo this
Open the panelPress ≡, then Tools, then Emit Code.
Close the panelPress Emit Code again, or press X in the header.
Fold the panel awayPress the minimise button beside X. A chip appears in a row under the HUD.
Copy the scriptPress Select All, then press Ctrl+C.
Try the script without leaving StudioPress 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.

ControlKindWhat it does
Code boxBox, read onlyHolds the script for the current selection.
Select AllButtonSelects all the text in the box, ready for Ctrl+C. The button reads Selected! for a moment.
RunButtonFires 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.

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.SparkBeam
Part_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)
end

The first line loads the module from ReplicatedStorage. The second line starts it. Firing an effect describes AbsoluteEmit.

  • 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 with game and the name of the service, as in game.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 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.

ToDo this
Switch the indicator on or offPress ≡, 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 showsMeaning
GreenA figure up to 30.
YellowA figure from 31 to 60.
RedA figure above 60.
--, dimThe 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.

CauseDetail
More particles alive at onceA 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 typeModels with many parts. Lights, more so with Shadows on. Trail emitters with a long Trail Life. Beams with many segments. Screen effects.
HighlightsRoblox shows at most 31 Highlights at once. The figure climbs steeply past that number.
Lightning, Rocks, Rope, DistortionLightning 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.
ShadowsCastShadow on, on the particle’s RenderTemplate.
TransparencyA particle that is partly see-through.
FlipbooksA flipbook raises the figure, more so with more frames.
High Anim. StepsMore so with Drag above 0, with Rotation Mode Speed, with Dir. Mode Local, or on a Model.
Pool off on a streamAn emitter that emits without a break costs more with Pool off.
NestingThe cost of a nested emitter is multiplied by the number of particles of the emitter that holds it.
Stock emitters in a RenderTemplateA stock ParticleEmitter, Trail or Beam there counts once for every particle emitted.
Stock emitters in the selectionSelected stock ParticleEmitters, Trails and Beams count too.
  • 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 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.

ToDo this
Hide or show the counterPress ≡, then Counter.

The counter shows at the start of every session.

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.

RowKindStarts atAcceptsWhat it does
Settings ▸ Particle CapNumber1000A whole number from 50 to 50000Sets 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.

  • 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.