--- a/net/minecraft/client/particle/ParticleManager.java
+++ b/net/minecraft/client/particle/ParticleManager.java
@@ -65,7 +65,7 @@
    private final Queue<EmitterParticle> field_178933_d = Queues.newArrayDeque();
    private final TextureManager field_78877_c;
    private final Random field_78875_d = new Random();
-   private final Int2ObjectMap<IParticleFactory<?>> field_178932_g = new Int2ObjectOpenHashMap<>();
+   private final Map<ResourceLocation, IParticleFactory<?>> field_178932_g = new java.util.HashMap<>();
    private final Queue<Particle> field_187241_h = Queues.newArrayDeque();
    private final Map<ResourceLocation, ParticleManager.AnimatedSpriteImpl> field_215242_i = Maps.newHashMap();
    private final AtlasTexture field_215243_j = new AtlasTexture(AtlasTexture.field_215262_g);
@@ -153,13 +153,13 @@
    }
 
    public <T extends IParticleData> void func_199283_a(ParticleType<T> p_199283_1_, IParticleFactory<T> p_199283_2_) {
-      this.field_178932_g.put(Registry.field_212632_u.func_148757_b(p_199283_1_), p_199283_2_);
+      this.field_178932_g.put(Registry.field_212632_u.func_177774_c(p_199283_1_), p_199283_2_);
    }
 
    public <T extends IParticleData> void func_215234_a(ParticleType<T> p_215234_1_, ParticleManager.IParticleMetaFactory<T> p_215234_2_) {
       ParticleManager.AnimatedSpriteImpl particlemanager$animatedspriteimpl = new ParticleManager.AnimatedSpriteImpl();
       this.field_215242_i.put(Registry.field_212632_u.func_177774_c(p_215234_1_), particlemanager$animatedspriteimpl);
-      this.field_178932_g.put(Registry.field_212632_u.func_148757_b(p_215234_1_), p_215234_2_.create(particlemanager$animatedspriteimpl));
+      this.field_178932_g.put(Registry.field_212632_u.func_177774_c(p_215234_1_), p_215234_2_.create(particlemanager$animatedspriteimpl));
    }
 
    public CompletableFuture<Void> func_215226_a(IFutureReloadListener.IStage p_215226_1_, IResourceManager p_215226_2_, IProfiler p_215226_3_, IProfiler p_215226_4_, Executor p_215226_5_, Executor p_215226_6_) {
@@ -248,7 +248,7 @@
 
    @Nullable
    private <T extends IParticleData> Particle func_199927_b(T p_199927_1_, double p_199927_2_, double p_199927_4_, double p_199927_6_, double p_199927_8_, double p_199927_10_, double p_199927_12_) {
-      IParticleFactory<T> iparticlefactory = (IParticleFactory<T>)this.field_178932_g.get(Registry.field_212632_u.func_148757_b(p_199927_1_.func_197554_b()));
+      IParticleFactory<T> iparticlefactory = (IParticleFactory<T>)this.field_178932_g.get(Registry.field_212632_u.func_177774_c(p_199927_1_.func_197554_b()));
       return iparticlefactory == null ? null : iparticlefactory.func_199234_a(p_199927_1_, this.field_78878_a, p_199927_2_, p_199927_4_, p_199927_6_, p_199927_8_, p_199927_10_, p_199927_12_);
    }
 
@@ -313,16 +313,29 @@
       }
    }
 
+   /**@deprecated Forge: use {@link #renderParticles(MatrixStack, IRenderTypeBuffer.Impl, LightTexture, ActiveRenderInfo, float, net.minecraft.client.renderer.culling.ClippingHelper)} with ClippingHelper as additional parameter*/
+   @Deprecated
    public void func_228345_a_(MatrixStack p_228345_1_, IRenderTypeBuffer.Impl p_228345_2_, LightTexture p_228345_3_, ActiveRenderInfo p_228345_4_, float p_228345_5_) {
+      renderParticles(p_228345_1_, p_228345_2_, p_228345_3_, p_228345_4_, p_228345_5_, null);
+   }
+
+   public void renderParticles(MatrixStack p_228345_1_, IRenderTypeBuffer.Impl p_228345_2_, LightTexture p_228345_3_, ActiveRenderInfo p_228345_4_, float p_228345_5_, @Nullable net.minecraft.client.renderer.culling.ClippingHelper clippingHelper) {
       p_228345_3_.func_205109_c();
+      Runnable enable = () -> {
       RenderSystem.enableAlphaTest();
       RenderSystem.defaultAlphaFunc();
       RenderSystem.enableDepthTest();
       RenderSystem.enableFog();
+         RenderSystem.activeTexture(org.lwjgl.opengl.GL13.GL_TEXTURE2);
+         RenderSystem.enableTexture();
+         RenderSystem.activeTexture(org.lwjgl.opengl.GL13.GL_TEXTURE0);
+      };
       RenderSystem.pushMatrix();
       RenderSystem.multMatrix(p_228345_1_.func_227866_c_().func_227870_a_());
 
-      for(IParticleRenderType iparticlerendertype : field_215241_b) {
+      for(IParticleRenderType iparticlerendertype : this.field_78876_b.keySet()) { // Forge: allow custom IParticleRenderType's
+         if (iparticlerendertype == IParticleRenderType.field_217606_f) continue;
+         enable.run(); //Forge: MC-168672 Make sure all render types have the correct GL state.
          Iterable<Particle> iterable = this.field_78876_b.get(iparticlerendertype);
          if (iterable != null) {
             RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F);
@@ -331,6 +344,7 @@
             iparticlerendertype.func_217600_a(bufferbuilder, this.field_78877_c);
 
             for(Particle particle : iterable) {
+               if (clippingHelper != null && particle.shouldCull() && !clippingHelper.func_228957_a_(particle.func_187116_l())) continue;
                try {
                   particle.func_225606_a_(bufferbuilder, p_228345_4_, p_228345_5_);
                } catch (Throwable throwable) {
@@ -362,7 +376,7 @@
    }
 
    public void func_180533_a(BlockPos p_180533_1_, BlockState p_180533_2_) {
-      if (!p_180533_2_.func_196958_f()) {
+      if (!p_180533_2_.isAir(this.field_78878_a, p_180533_1_) && !p_180533_2_.addDestroyEffects(this.field_78878_a, p_180533_1_, this)) {
          VoxelShape voxelshape = p_180533_2_.func_196954_c(this.field_78878_a, p_180533_1_);
          double d0 = 0.25D;
          voxelshape.func_197755_b((p_228348_3_, p_228348_5_, p_228348_7_, p_228348_9_, p_228348_11_, p_228348_13_) -> {
@@ -434,6 +448,12 @@
       return String.valueOf(this.field_78876_b.values().stream().mapToInt(Collection::size).sum());
    }
 
+   public void addBlockHitEffects(BlockPos pos, net.minecraft.util.math.BlockRayTraceResult target) {
+      BlockState state = field_78878_a.func_180495_p(pos);
+      if (!state.addHitEffects(field_78878_a, target, this))
+         func_180532_a(pos, target.func_216354_b());
+   }
+
    @OnlyIn(Dist.CLIENT)
    class AnimatedSpriteImpl implements IAnimatedSprite {
       private List<TextureAtlasSprite> field_217594_b;
