Troubleshooting¶
Most problems in a destruction setup are silent: they look like "nothing happened". The plugin logs a reason for almost every refusal, so start with the Output Log and the console commands below.
Console commands¶
These need a running PIE session or game: the geometry and the grid exist only after BeginPlay.
| command | what it does |
|---|---|
GridDestruction.HashCells |
hashes every wall on every live world and prints a MATCH / MISMATCH verdict, naming the first differing cell |
GridDestruction.CheckPresets |
one line per wall: MATCH or STALE against its preset, plus walls over the late-join size |
GridDestruction.ShowSeams |
draws which walls are joined (green edges, yellow links) and logs each GRIDSEAM |
GridDestruction.RebuildWalls |
rebuilds every wall's visible mesh now |
GridDestruction.DumpGeometry |
audits winding, normals, counts and bounds on every wall |
GridDestruction.ProfileWall |
per-wall mesh statistics, including degen= (should be 0) and dropped= |
GridDestruction.ResetWalls |
every wall back to the damage it started with; on the server or standalone. The sample character's R key asks the server for you |
GridDestruction.CaptureDamage |
writes every wall's damage into its Initial Damage asset (Setup) |
GridNet.Measure |
(development builds, server) per wall: damaged cells per network quarter, bytes now, worst case |
GridNet.ToggleDebug |
(development builds) shows or hides this machine's net panel |
GridNet.CorruptCell <Wall> <Cell> |
(development builds) changes one damaged cell on this machine only, to watch desync detection heal it |
What you see → what to check¶
| what you see | look at |
|---|---|
| A setting does nothing | Press Apply Preset on the wall. The preset overwrites the component, and a value set only on the component is off. CheckPresets lists stale walls. |
| A setting is on the preset and still does nothing | A Blueprint's Class Defaults override the C++ defaults. Check the placed actor's Details, not the source. |
| I call the damage function and nothing happens | It ran on a client. Every entry point is server-only and silent elsewhere. Check Has Authority. |
| Client and server look different | GridDestruction.HashCells. MISMATCH names the first differing cell. |
| A hole reads as a hard square | FractureNoise is 0, usually because the wall has no preset applied. |
| Breaks ignore the texture's pattern | The bake found no height map. The FractureMask log line names what it tried and what to set. |
pixel format BC7 and the mask is refused |
Re-import that texture as BC1 (Default). |
has no texture parameter 'Height' |
The same line lists every parameter the material has. Put one in FractureHeightParameter. |
none of them carry any bytes |
The texture streams and is not resident. Set NeverStream on it, or MipGenSettings = NoMipmaps. |
the texture is flat ... discarded |
The material's height slot holds an engine placeholder, usually T_DefaultDisplacement. The wall falls back to the hash meanwhile, which is correct. |
| The pattern lands in the wrong places | FractureMaskChannel: the height may be in green or blue. |
| Cracks follow brick bodies instead of joints | bInvertFractureMask. |
| The pattern does not line up with the visible joints | FractureMaskTiling must match what the material does with the same texture; leave it at 1 unless the material tiles again inside itself. |
| The pattern is too faint | Raise FractureMaskContrast (ships at 2.0). |
| Thin slivers hang off a hole's rim | See below. |
| A piece of wall hangs in the air | It is held by an anchor: check the wall's Anchor Edges (Setup). |
| A falling chunk freezes in mid-air | A HANGRISK line names the value; see Surface presets → rubble. |
| A chunk never moves at all | GridDestruction.ProfileWall: a non-zero degen= is a bug; send the log line. |
| A lintel falls on the first hit anywhere | MaxOverhangCm is below half the opening's width. |
| A shot at the edge of a window dents the face | Raise CornerChipScale and RevealCrushScale on the preset. |
| The wall's outer edge is open when seen edge-on | Tick the visible sides in CapEdges. |
| Joints between walls flicker | The wall material is two-sided; make it one-sided. |
| A line of sky along a joint | The walls are further apart than SeamToleranceCm (2 cm). ShowSeams shows what was linked. |
| A slab's edge pieces hang in the air | Clear the slab's Anchor Edges; a SLABANCHOR line says so at the first hit. |
| Holes lag under very heavy fire | The byte budget; see Multiplayer. |
| A late joiner gets no damage on one wall | The wall is over the late-join size; see Multiplayer. |
| Debris pieces spin on the floor forever | A custom Niagara system without the freeze-on-contact step; see Effects. show Particles hides all particles, to tell particles from falling wall pieces. |
| Effect count keeps growing | A system that never finishes; see Effects → performance. |
| Frame time is bad on walls nobody shot | The debug lattice is on (bShowDebugCellsInGame on GridVisual). It is off by default. |
| Bots do not path through holes | Set the navmesh's Runtime Generation to Dynamic (Setup). |
Slivers on a hole's rim¶
Why they appear. Every cell resists a little differently, by design: that is what stops small holes reading as squares. At the rim of a blast the bite is close to what a cell has left, so neighbouring cells flip independently and a few tough ones are left standing in the opening.
What removes them: MinSupportingNeighbours and SpikeSuppressionChance on
the preset, shipping at 2 and 0.7. Two standing neighbours remove single spikes
and pieces hanging by one edge, and keep anything with a shoulder on two sides.
The chance is 0.7 rather than 1.0 on purpose: a rim with every spike pruned reads
as machined.
- By default the chance follows the break pattern, so brick cleans up along its
joints and keeps its teeth on the bricks.
SpikeMaskStrengthturns that down. - Do not raise
MinSupportingNeighboursabove 2 to chase floating pieces: at 3 or 4 it strips the rim of every hole. Pieces nothing holds fall on their own;IslandCollapsein the log counts them. - Lowering
FractureNoiseandFractureMaskContrastmakes rim cells behave more alike, at the cost of some raggedness.
The pass costs nothing on the network, and every machine prunes the same pieces. The log says how many pieces it pruned on every hit that removes something:
SpikeSuppression [Wall_0]: pruned 3 piece(s) ... minNeighbours=2 chance=0.70 mask=fracture weights strength=1.00
The wall's own border and the cells beside an authored opening are never pruned.
Reporting a problem¶
Write to annybelogurova@gmail.com with:
- whether you saw it in the server window, the client window or both;
- the output of
GridDestruction.HashCellstyped once while it is happening; - the log lines the plugin printed around it (they start with the wall's name in square brackets);
- the engine version and whether the project is Blueprint-only.