diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt index 0f35c3dac..691c4eea9 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt @@ -13,6 +13,7 @@ import net.minecraft.resources.ResourceLocation import net.minecraft.server.level.ServerLevel import net.minecraft.server.level.ServerPlayer import net.minecraft.tags.TagKey +import net.minecraft.world.Container import net.minecraft.world.Difficulty import net.minecraft.world.damagesource.DamageSource import net.minecraft.world.effect.MobEffect @@ -35,7 +36,6 @@ import net.minecraft.world.phys.Vec3 import net.minecraftforge.common.ForgeHooks import net.minecraftforge.common.MinecraftForge import net.minecraftforge.common.capabilities.Capability -import net.minecraftforge.common.capabilities.ForgeCapabilities import net.minecraftforge.common.capabilities.ICapabilityProvider import net.minecraftforge.common.util.INBTSerializable import net.minecraftforge.common.util.LazyOptional @@ -72,7 +72,9 @@ import ru.dbotthepony.mc.otm.client.minecraft import ru.dbotthepony.mc.otm.config.AndroidConfig import ru.dbotthepony.mc.otm.config.ExopackConfig import ru.dbotthepony.mc.otm.container.MatteryContainer +import ru.dbotthepony.mc.otm.container.iterator import ru.dbotthepony.mc.otm.container.stream +import ru.dbotthepony.mc.otm.container.vanishCursedItems import ru.dbotthepony.mc.otm.core.* import ru.dbotthepony.mc.otm.core.collect.UUIDIntModifiersMap import ru.dbotthepony.mc.otm.core.collect.filter @@ -106,6 +108,17 @@ import kotlin.collections.ArrayList import kotlin.collections.HashMap import kotlin.reflect.KMutableProperty1 +private fun Player.dropContainer(container: Container, spill: Boolean = true, setThrower: Boolean = false) { + val iterator = container.iterator() + + for (item in iterator) { + if (item.isNotEmpty) { + drop(item, spill, setThrower) + iterator.remove() + } + } +} + @Suppress("unused") class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerializable { /** @@ -1557,26 +1570,13 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial return } - val iterator = mattery.exoPackContainer.iterator() - - for (item in iterator) { - if (!item.isEmpty) { - inventory.player.drop(item, true, false) - iterator.remove() - } - } + inventory.player.dropContainer(mattery.exoPackContainer) + inventory.player.dropContainer(mattery.exoPackChargeSlots) + inventory.player.dropContainer(mattery.exoPackEnergy.parent) for (smelter in mattery.smelters) { - if (!smelter.input[0].isEmpty) { - inventory.player.drop(smelter.input[0], true, false) - smelter.input[0] = ItemStack.EMPTY - } - - if (!smelter.output[0].isEmpty) { - inventory.player.drop(smelter.output[0], true, false) - smelter.output[0] = ItemStack.EMPTY - } - + inventory.player.dropContainer(smelter.input) + inventory.player.dropContainer(smelter.output) smelter.currentJob = null } } @@ -1590,6 +1590,8 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial } mattery.exoPackContainer.clearContent() + mattery.exoPackChargeSlots.clearContent() + mattery.exoPackEnergy.parent.clearContent() for (smelter in mattery.smelters) { smelter.input.clearContent() @@ -1600,15 +1602,16 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial @JvmStatic fun playerDestroyVanishingCursedItems(player: Player) { - if (player.matteryPlayer?.hasExoPack == false) { - return - } + player.matteryPlayer?.let { + if (it.hasExoPack) { + it.exoPackContainer.vanishCursedItems() + it.exoPackChargeSlots.vanishCursedItems() + it.exoPackEnergy.parent.vanishCursedItems() - val iterator = player.matteryPlayer?.exoPackContainer?.iterator() ?: return - - for (item in iterator) { - if (!item.isEmpty && hasVanishingCurse(item)) { - iterator.remove() + for (smelter in it.smelters) { + smelter.input.vanishCursedItems() + smelter.output.vanishCursedItems() + } } } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/container/Ext.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/container/Ext.kt index 6b279ce3c..3900cd640 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/container/Ext.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/container/Ext.kt @@ -8,6 +8,7 @@ import it.unimi.dsi.fastutil.objects.Object2ObjectFunction import it.unimi.dsi.fastutil.objects.Object2ObjectOpenCustomHashMap import net.minecraft.world.Container import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.enchantment.EnchantmentHelper.hasVanishingCurse import net.minecraftforge.common.capabilities.Capability import net.minecraftforge.fluids.capability.IFluidHandler import ru.dbotthepony.mc.otm.core.addAll @@ -83,6 +84,16 @@ fun Container.addItem(stack: ItemStack, range: IntRange, simulate: Boolean = fal fun Container.addItem(stack: ItemStack, simulate: Boolean): ItemStack = addItem(stack, 0 until containerSize, simulate) +fun Container.vanishCursedItems() { + val iterator = iterator() + + for (item in iterator) { + if (item.isNotEmpty && hasVanishingCurse(item)) { + iterator.remove() + } + } +} + inline fun Container.forEach(cap: Capability, consumer: (Pair) -> Unit) { for (value in iterator(cap)) { consumer(value)