Skip to content

Commit 2889912

Browse files
authored
Add explicit block break/place permission checks to the matter cannon. (#8530)
Fixes #8496
1 parent 6fd885a commit 2889912

1 file changed

Lines changed: 25 additions & 8 deletions

File tree

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

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@
5555
import net.minecraft.world.phys.Vec3;
5656
import net.minecraftforge.api.distmarker.Dist;
5757
import net.minecraftforge.api.distmarker.OnlyIn;
58+
import net.minecraftforge.common.MinecraftForge;
59+
import net.minecraftforge.common.util.BlockSnapshot;
60+
import net.minecraftforge.event.ForgeEventFactory;
61+
import net.minecraftforge.event.level.BlockEvent;
5862

5963
import appeng.api.config.Actionable;
6064
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 (ForgeEventFactory.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);
@@ -339,12 +348,11 @@ private void standardAmmo(float penetration, Level level, Player p, Vec3 Vector3
339348
final int dmg = getDamageFromPenetration(penetration);
340349
if (entityHit instanceof LivingEntity el) {
341350
penetration -= dmg;
342-
el.knockback(0, -direction.x, -direction.z);
343-
// el.knockBack( p, 0, Vector3d.x,
344-
// Vector3d.z );
345-
el.hurt(dmgSrc, dmg);
346-
if (!el.isAlive()) {
347-
hasDestroyed = true;
351+
if (el.hurt(dmgSrc, dmg)) {
352+
el.knockback(0, -direction.x, -direction.z);
353+
if (!el.isAlive()) {
354+
hasDestroyed = true;
355+
}
348356
}
349357
} else if (entityHit instanceof ItemEntity) {
350358
hasDestroyed = true;
@@ -361,8 +369,7 @@ private void standardAmmo(float penetration, Level level, Player p, Vec3 Vector3
361369
final BlockState bs = level.getBlockState(blockPos);
362370

363371
final float hardness = bs.getDestroySpeed(level, blockPos) * 9.0f;
364-
if (hardness >= 0.0 && penetration > hardness
365-
&& Platform.hasPermissions(new DimensionalBlockPos(level, blockPos), p)) {
372+
if (hardness >= 0.0 && penetration > hardness && canDestroyBlock(level, blockPos, p)) {
366373
hasDestroyed = true;
367374
penetration -= hardness;
368375
penetration *= 0.60;
@@ -374,6 +381,16 @@ private void standardAmmo(float penetration, Level level, Player p, Vec3 Vector3
374381
}
375382
}
376383

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

0 commit comments

Comments
 (0)