fix explosions yet again

This commit is contained in:
gnembon committed 2019-12-03 17:30:37 -04:00
1 parent f8fd213612
commit 7802037ab0
1 file changed
+16 -16
@@ -4,13 +4,18 @@ package carpet.helpers;
import java.math.RoundingMode; 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.List; import java.util.List;
import carpet.mixins.ExplosionAccessor; import carpet.mixins.ExplosionAccessor;
import carpet.settings.CarpetSettings; import carpet.settings.CarpetSettings;
import carpet.utils.Messenger; import carpet.utils.Messenger;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import it.unimi.dsi.fastutil.objects.*; 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.ObjectListIterator;
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
import net.minecraft.block.Material; import net.minecraft.block.Material;
@@ -200,8 +205,8 @@ public class OptimizedExplosion
if (damagesTerrain) if (damagesTerrain)
{ {
ObjectArrayList<ItemStack> objectArrayList = new ObjectArrayList<>(); ObjectArrayList<Pair<ItemStack, BlockPos>> objectArrayList = new ObjectArrayList();
List<BlockPos> list = Lists.newArrayList(); Collections.shuffle(e.getAffectedBlocks(), world.random);
for (BlockPos blockpos : e.getAffectedBlocks()) for (BlockPos blockpos : e.getAffectedBlocks())
{ {
@@ -232,10 +237,8 @@ public class OptimizedExplosion
if (state.getMaterial() != Material.AIR) if (state.getMaterial() != Material.AIR)
{ {
if (block.shouldDropItemsOnExplosion(e)) if (block.shouldDropItemsOnExplosion(e) && world instanceof ServerWorld)
{ {
list.add(blockpos.toImmutable());
BlockEntity blockEntity = block.hasBlockEntity() ? world.getBlockEntity(blockpos) : null; BlockEntity blockEntity = block.hasBlockEntity() ? world.getBlockEntity(blockpos) : null;
LootContext.Builder lootBuilder = new LootContext.Builder((ServerWorld) eAccess.getWorld()) LootContext.Builder lootBuilder = new LootContext.Builder((ServerWorld) eAccess.getWorld())
@@ -248,7 +251,7 @@ public class OptimizedExplosion
lootBuilder.put(LootContextParameters.EXPLOSION_RADIUS, eAccess.getPower()); lootBuilder.put(LootContextParameters.EXPLOSION_RADIUS, eAccess.getPower());
state.getDroppedStacks(lootBuilder).forEach((itemStackx) -> { state.getDroppedStacks(lootBuilder).forEach((itemStackx) -> {
method_24023(objectArrayList, itemStackx); method_24023(objectArrayList, itemStackx, blockpos.toImmutable());
}); });
} }
@@ -256,12 +259,8 @@ public class OptimizedExplosion
block.onDestroyedByExplosion(world, blockpos, e); block.onDestroyedByExplosion(world, blockpos, e);
} }
} }
int i = list.size(); objectArrayList.forEach(p -> Block.dropStack(world, p.getRight(), p.getLeft()));
for (ItemStack itemStack : objectArrayList)
{
Block.dropStack(world, list.get(world.random.nextInt(i)), itemStack);
}
} }
if (eAccess.isCreateFire()) if (eAccess.isCreateFire())
@@ -284,21 +283,22 @@ public class OptimizedExplosion
// copied from Explosion, need to move the code to the explosion code anyways and use shadows for // copied from Explosion, need to move the code to the explosion code anyways and use shadows for
// simplicity, its not jarmodding anyways // simplicity, its not jarmodding anyways
private static void method_24023(ObjectArrayList<ItemStack> objectArrayList, ItemStack itemStack) { private static void method_24023(ObjectArrayList<Pair<ItemStack, BlockPos>> objectArrayList, ItemStack itemStack, BlockPos blockPos) {
int i = objectArrayList.size(); int i = objectArrayList.size();
for(int j = 0; j < i; ++j) { for(int j = 0; j < i; ++j) {
ItemStack itemStack2 = (ItemStack)objectArrayList.get(j); Pair<ItemStack, BlockPos> pair = (Pair)objectArrayList.get(j);
ItemStack itemStack2 = pair.getLeft();
if (ItemEntity.method_24017(itemStack2, itemStack)) { if (ItemEntity.method_24017(itemStack2, itemStack)) {
ItemStack itemStack3 = ItemEntity.method_24018(itemStack2, itemStack, 16); ItemStack itemStack3 = ItemEntity.method_24018(itemStack2, itemStack, 16);
objectArrayList.set(j, itemStack3); objectArrayList.set(j, Pair.of(itemStack3, pair.getRight()));
if (itemStack.isEmpty()) { if (itemStack.isEmpty()) {
return; return;
} }
} }
} }
objectArrayList.add(itemStack); objectArrayList.add(Pair.of(itemStack, blockPos));
} }
private static void removeFast(List<Entity> lst, int index) { private static void removeFast(List<Entity> lst, int index) {