fixes #1181 Revert "Optimize explosion BlockState caching (#1156)"

This reverts commit 5005268df4.
This commit is contained in:
gnembon committed 2021-11-23 22:46:15 +01:00
1 parent 49dff77ebe
commit 2f7433ecb1
1 file changed
+22 -29
@@ -5,7 +5,6 @@ import java.math.RoundingMode;
import java.text.NumberFormat; import java.text.NumberFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap;
import java.util.List; import java.util.List;
import carpet.logging.logHelpers.ExplosionLogHelper; import carpet.logging.logHelpers.ExplosionLogHelper;
@@ -13,6 +12,7 @@ import carpet.mixins.ExplosionAccessor;
import carpet.CarpetSettings; import carpet.CarpetSettings;
import carpet.utils.Messenger; import carpet.utils.Messenger;
import it.unimi.dsi.fastutil.objects.Object2DoubleOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2DoubleOpenHashMap;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.objects.ObjectArrayList; import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
@@ -58,8 +58,8 @@ public class OptimizedExplosion
// masa's optimizations // masa's optimizations
private static Object2DoubleOpenHashMap<Pair<Vec3d, Box>> densityCache = new Object2DoubleOpenHashMap<>(); private static Object2DoubleOpenHashMap<Pair<Vec3d, Box>> densityCache = new Object2DoubleOpenHashMap<>();
private static MutablePair<Vec3d, Box> pairMutable = new MutablePair<>(); private static MutablePair<Vec3d, Box> pairMutable = new MutablePair<>();
private static HashMap<BlockPos.Mutable, Float> blastResCache = new HashMap<>(); private static Object2ObjectOpenHashMap<BlockPos, BlockState> stateCache = new Object2ObjectOpenHashMap<>();
private static HashMap<BlockPos.Mutable, BlockState> blockStateCache = new HashMap<>(); private static Object2ObjectOpenHashMap<BlockPos, FluidState> fluidCache = new Object2ObjectOpenHashMap<>();
private static BlockPos.Mutable posMutable = new BlockPos.Mutable(0, 0, 0); private static BlockPos.Mutable posMutable = new BlockPos.Mutable(0, 0, 0);
private static ObjectOpenHashSet<BlockPos> affectedBlockPositionsSet = new ObjectOpenHashSet<>(); private static ObjectOpenHashSet<BlockPos> affectedBlockPositionsSet = new ObjectOpenHashSet<>();
private static boolean firstRay; private static boolean firstRay;
@@ -86,8 +86,8 @@ public class OptimizedExplosion
getAffectedPositionsOnPlaneX(e, 15, 1, 14, 0, 15); // east getAffectedPositionsOnPlaneX(e, 15, 1, 14, 0, 15); // east
getAffectedPositionsOnPlaneZ(e, 0, 1, 14, 1, 14); // north getAffectedPositionsOnPlaneZ(e, 0, 1, 14, 1, 14); // north
getAffectedPositionsOnPlaneZ(e, 15, 1, 14, 1, 14); // south getAffectedPositionsOnPlaneZ(e, 15, 1, 14, 1, 14); // south
blastResCache.clear(); stateCache.clear();
blockStateCache.clear(); fluidCache.clear();
e.getAffectedBlocks().addAll(affectedBlockPositionsSet); e.getAffectedBlocks().addAll(affectedBlockPositionsSet);
affectedBlockPositionsSet.clear(); affectedBlockPositionsSet.clear();
@@ -446,7 +446,6 @@ public class OptimizedExplosion
double xInc = (xRel / len) * 0.3; double xInc = (xRel / len) * 0.3;
double yInc = (yRel / len) * 0.3; double yInc = (yRel / len) * 0.3;
double zInc = (zRel / len) * 0.3; double zInc = (zRel / len) * 0.3;
World world = eAccess.getWorld();
float rand = eAccess.getWorld().random.nextFloat(); float rand = eAccess.getWorld().random.nextFloat();
float sizeRand = (CarpetSettings.tntRandomRange >= 0 ? (float) CarpetSettings.tntRandomRange : rand); float sizeRand = (CarpetSettings.tntRandomRange >= 0 ? (float) CarpetSettings.tntRandomRange : rand);
float size = eAccess.getPower() * (0.7F + sizeRand * 0.6F); float size = eAccess.getPower() * (0.7F + sizeRand * 0.6F);
@@ -458,44 +457,38 @@ public class OptimizedExplosion
{ {
posMutable.set(posX, posY, posZ); posMutable.set(posX, posY, posZ);
// Don't query already cached positions again from the world
BlockState state = stateCache.get(posMutable);
FluidState fluid = fluidCache.get(posMutable);
BlockPos posImmutable = null; BlockPos posImmutable = null;
// Don't query already cached positions again from the world if (state == null)
if (!blastResCache.containsKey(posMutable))
{ {
posImmutable = posMutable.toImmutable(); posImmutable = posMutable.toImmutable();
BlockState state = world.getBlockState(posImmutable); state = eAccess.getWorld().getBlockState(posImmutable);
Float resistance = null; stateCache.put(posImmutable, state);
if (!state.isAir()) fluid = eAccess.getWorld().getFluidState(posImmutable);
fluidCache.put(posImmutable, fluid);
}
if (state.getMaterial() != Material.AIR)
{ {
FluidState fluid = world.getFluidState(posImmutable); float resistance = Math.max(state.getBlock().getBlastResistance(), fluid.getBlastResistance());
resistance = Math.max(state.getBlock().getBlastResistance(), fluid.getBlastResistance());
if (eAccess.getEntity() != null) if (eAccess.getEntity() != null)
{ {
resistance = eAccess.getEntity().getEffectiveExplosionResistance(e, world, posMutable, state, fluid, resistance); resistance = eAccess.getEntity().getEffectiveExplosionResistance(e, eAccess.getWorld(), posMutable, state, fluid, resistance);
}
}
blockStateCache.put(posMutable, state);
blastResCache.put(posMutable, resistance);
} }
Float blastRes = blastResCache.get(posMutable); size -= (resistance + 0.3F) * 0.3F;
BlockState state = blockStateCache.get(posMutable); }
if(blastRes != null)
{
size -= (blastRes + 0.3F) * 0.3F;
if (size > 0.0F) if (size > 0.0F)
{ {
if ((eAccess.getEntity() == null || eAccess.getEntity().canExplosionDestroyBlock(e, eAccess.getWorld(), posMutable, state, size))) if ((eAccess.getEntity() == null || eAccess.getEntity().canExplosionDestroyBlock(e, eAccess.getWorld(), posMutable, state, size)))
{
affectedBlockPositionsSet.add(posImmutable != null ? posImmutable : posMutable.toImmutable()); affectedBlockPositionsSet.add(posImmutable != null ? posImmutable : posMutable.toImmutable());
blastResCache.put(posMutable, null);
blockStateCache.remove(posMutable);
} }
} else if (firstRay)
}
if (firstRay)
{ {
rayCalcDone = true; rayCalcDone = true;
return true; return true;