Update vanish/clear/drop inventory hooks

This commit is contained in:
DBotThePony 2023-07-09 00:09:49 +07:00
parent 024a25f72a
commit db99fb339c
Signed by: DBot
GPG Key ID: DCC23B5715498507
2 changed files with 41 additions and 27 deletions

View File

@ -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<CompoundTag> {
/**
@ -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()
}
}
}
}

View File

@ -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 <T> Container.forEach(cap: Capability<T>, consumer: (Pair<ItemStack, T>) -> Unit) {
for (value in iterator(cap)) {
consumer(value)