You might want to look at WorldEventListeners, they aren’t cancelable, and don’t have write access to a world, but you can probably do an instanceof WorldServer and cast. You need to be efficient if you use this method, as it is called every BlockState change.
You can see an example in WorldRenderer/RenderGlobal and at https://github.com/Cadiboo/NoCubes/blob/396d3e731da4c3f7f6b8dd3107877ea442f09fe0/src/main/java/io/github/cadiboo/nocubes/world/ModWorldEventListener.java#L26. My code increases the chunk update distance when a block is placed from 1 block to 2 blocks to remove seams that form in my world caused by outdated meshes.