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