44import java .util .List ;
55import java .util .HashMap ;
66import java .util .ArrayList ;
7- import java .util .concurrent .ThreadLocalRandom ;
87
98import org .bukkit .Bukkit ;
109import org .bukkit .Location ;
@@ -42,6 +41,7 @@ public class ReplaceSpell extends TargetedSpell implements TargetedLocationSpell
4241
4342 private final ConfigData <Boolean > pointBlank ;
4443 private final ConfigData <Boolean > checkPlugins ;
44+ private final ConfigData <Boolean > applyPhysics ;
4545 private final ConfigData <Boolean > replaceRandom ;
4646 private final ConfigData <Boolean > powerAffectsRadius ;
4747 private final ConfigData <Boolean > resolveDurationPerBlock ;
@@ -62,8 +62,9 @@ public ReplaceSpell(MagicConfig config, String spellName) {
6262
6363 pointBlank = getConfigDataBoolean ("point-blank" , false );
6464 checkPlugins = getConfigDataBoolean ("check-plugins" , true );
65- ConfigData < Boolean > replaceRandom = getConfigDataBoolean ("replace-random " , true );
65+ applyPhysics = getConfigDataBoolean ("apply-physics " , true );
6666 powerAffectsRadius = getConfigDataBoolean ("power-affects-radius" , false );
67+ ConfigData <Boolean > replaceRandom = getConfigDataBoolean ("replace-random" , true );
6768 resolveDurationPerBlock = getConfigDataBoolean ("resolve-duration-per-block" , false );
6869
6970 boolean replaceAll = false ;
@@ -160,6 +161,7 @@ public CastResult castAtLocation(SpellData data) {
160161 }
161162
162163 boolean checkPlugins = this .checkPlugins .get (data );
164+ boolean applyPhysics = this .applyPhysics .get (data );
163165 boolean replaceRandom = this .replaceRandom .get (data );
164166 boolean resolveDurationPerBlock = this .resolveDurationPerBlock .get (data );
165167
@@ -181,12 +183,11 @@ public CastResult castAtLocation(SpellData data) {
181183
182184 if (replaceBlacklisted (blockData )) continue ;
183185
184- Block finalBlock = block ;
185186 BlockState previousState = block .getState ();
186187
187188 // Place block.
188- if ( replaceRandom ) block . setBlockData ( replaceWith .get (ThreadLocalRandom . current (). nextInt (replaceWith .size ())) );
189- else block .setBlockData (replaceWith . get ( i ) );
189+ BlockData newData = replaceWith .get (replaceRandom ? random . nextInt (replaceWith .size ()) : i );
190+ block .setBlockData (newData , applyPhysics );
190191
191192 if (checkPlugins && data .caster () instanceof Player player ) {
192193 Block against = target .clone ().add (target .getDirection ()).getBlock ();
@@ -199,14 +200,15 @@ public CastResult castAtLocation(SpellData data) {
199200 }
200201 }
201202
202- SpellData subData = data .location (finalBlock .getLocation ());
203- playSpellEffects (EffectPosition .SPECIAL , finalBlock .getLocation (), subData );
203+ SpellData subData = data .location (block .getLocation ());
204+ playSpellEffects (EffectPosition .SPECIAL , block .getLocation (), subData );
204205
205206 // Break block.
206207 if (resolveDurationPerBlock ) replaceDuration = this .replaceDuration .get (subData );
207208 if (replaceDuration > 0 ) {
208209 blocks .put (block , blockData );
209210
211+ Block finalBlock = block ;
210212 MagicSpells .scheduleDelayedTask (() -> {
211213 BlockData previous = blocks .remove (finalBlock );
212214 if (previous == null ) return ;
@@ -215,7 +217,7 @@ public CastResult castAtLocation(SpellData data) {
215217 EventUtil .call (event );
216218 if (event .isCancelled ()) return ;
217219 }
218- finalBlock .setBlockData (previous );
220+ finalBlock .setBlockData (previous , applyPhysics );
219221 playSpellEffects (EffectPosition .BLOCK_DESTRUCTION , finalBlock .getLocation (), subData );
220222 }, replaceDuration );
221223 }
@@ -228,7 +230,7 @@ public CastResult castAtLocation(SpellData data) {
228230 }
229231
230232 playSpellEffects (data );
231- return new CastResult (replaced ?PostCastAction .HANDLE_NORMALLY : PostCastAction .ALREADY_HANDLED , data );
233+ return new CastResult (replaced ? PostCastAction .HANDLE_NORMALLY : PostCastAction .ALREADY_HANDLED , data );
232234 }
233235
234236 private boolean replaceBlacklisted (BlockData data ) {
0 commit comments