Skip to content

Commit edddcda

Browse files
authored
Add explicit block break/place permission checks to the matter cannon. (#8529)
Fixes #8496
1 parent 9db0f34 commit edddcda

2 files changed

Lines changed: 25 additions & 9 deletions

File tree

src/main/java/appeng/items/tools/powered/ColorApplicatorItem.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,6 @@
9393
import appeng.items.tools.powered.powersink.AEBasePoweredItem;
9494
import appeng.me.cells.BasicCellHandler;
9595
import appeng.me.helpers.BaseActionSource;
96-
import appeng.me.helpers.PlayerSource;
9796
import appeng.util.ConfigInventory;
9897
import appeng.util.InteractionUtil;
9998
import appeng.util.Platform;
@@ -164,8 +163,6 @@ public InteractionResult useOn(UseOnContext context) {
164163

165164
var color = this.getColor(is);
166165

167-
var source = new PlayerSource(p);
168-
169166
var inv = StorageCells.getCellInventory(is, null);
170167
if (inv != null) {
171168
if (p != null && !Platform.hasPermissions(new DimensionalBlockPos(level, pos), p)) {

src/main/java/appeng/items/tools/powered/MatterCannonItem.java

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@
5454
import net.minecraft.world.phys.Vec3;
5555
import net.neoforged.api.distmarker.Dist;
5656
import net.neoforged.api.distmarker.OnlyIn;
57+
import net.neoforged.neoforge.common.NeoForge;
58+
import net.neoforged.neoforge.common.util.BlockSnapshot;
59+
import net.neoforged.neoforge.event.EventHooks;
60+
import net.neoforged.neoforge.event.level.BlockEvent;
5761

5862
import appeng.api.config.Actionable;
5963
import appeng.api.config.FuzzyMode;
@@ -263,6 +267,11 @@ private void shootPaintBalls(AEColor color, boolean lit, Level level, @Nullable
263267
return;
264268
}
265269

270+
if (EventHooks.onBlockPlace(p, BlockSnapshot.create(p.level().dimension(), level, hitPos),
271+
blockResult.getDirection())) {
272+
return;
273+
}
274+
266275
final BlockState whatsThere = level.getBlockState(hitPos);
267276
if (whatsThere.canBeReplaced() && level.isEmptyBlock(hitPos)) {
268277
level.setBlock(hitPos, AEBlocks.PAINT.block().defaultBlockState(), 3);
@@ -340,10 +349,11 @@ private void standardAmmo(float penetration, Level level, Player p, Vec3 Vector3
340349
final int dmg = getDamageFromPenetration(penetration);
341350
if (entityHit instanceof LivingEntity el) {
342351
penetration -= dmg;
343-
el.knockback(0, -direction.x, -direction.z);
344-
el.hurt(dmgSrc, dmg);
345-
if (!el.isAlive()) {
346-
hasDestroyed = true;
352+
if (el.hurt(dmgSrc, dmg)) {
353+
el.knockback(0, -direction.x, -direction.z);
354+
if (!el.isAlive()) {
355+
hasDestroyed = true;
356+
}
347357
}
348358
} else if (entityHit instanceof ItemEntity) {
349359
hasDestroyed = true;
@@ -360,8 +370,7 @@ private void standardAmmo(float penetration, Level level, Player p, Vec3 Vector3
360370
final BlockState bs = level.getBlockState(blockPos);
361371

362372
final float hardness = bs.getDestroySpeed(level, blockPos) * 9.0f;
363-
if (hardness >= 0.0 && penetration > hardness
364-
&& Platform.hasPermissions(new DimensionalBlockPos(level, blockPos), p)) {
373+
if (hardness >= 0.0 && penetration > hardness && canDestroyBlock(level, blockPos, p)) {
365374
hasDestroyed = true;
366375
penetration -= hardness;
367376
penetration *= 0.60F;
@@ -373,6 +382,16 @@ private void standardAmmo(float penetration, Level level, Player p, Vec3 Vector3
373382
}
374383
}
375384

385+
private boolean canDestroyBlock(Level level, BlockPos pos, Player player) {
386+
if (!Platform.hasPermissions(new DimensionalBlockPos(level, pos), player)) {
387+
return false;
388+
}
389+
390+
var state = level.getBlockState(pos);
391+
var event = new BlockEvent.BreakEvent(level, pos, state, player);
392+
return !NeoForge.EVENT_BUS.post(event).isCanceled();
393+
}
394+
376395
public static int getDamageFromPenetration(float penetration) {
377396
return (int) Math.ceil(penetration / 20.0f);
378397
}

0 commit comments

Comments
 (0)