5454import net .minecraft .world .phys .Vec3 ;
5555import net .neoforged .api .distmarker .Dist ;
5656import 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
5862import appeng .api .config .Actionable ;
5963import 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