Skip to content

Commit 9fc1b31

Browse files
committed
feat: Add "apply-physics"
1 parent e3cd1d3 commit 9fc1b31

File tree

1 file changed

+11
-9
lines changed

1 file changed

+11
-9
lines changed

core/src/main/java/com/nisovin/magicspells/spells/targeted/ReplaceSpell.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import java.util.List;
55
import java.util.HashMap;
66
import java.util.ArrayList;
7-
import java.util.concurrent.ThreadLocalRandom;
87

98
import org.bukkit.Bukkit;
109
import 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

Comments
 (0)