diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/tool/ExplosiveHammerItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/tool/ExplosiveHammerItem.kt index 1d1950099..1c7b01120 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/tool/ExplosiveHammerItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/tool/ExplosiveHammerItem.kt @@ -9,7 +9,10 @@ import net.minecraft.network.chat.Component import net.minecraft.network.protocol.game.ClientboundExplodePacket import net.minecraft.server.level.ServerLevel import net.minecraft.server.level.ServerPlayer +import net.minecraft.sounds.SoundEvents +import net.minecraft.sounds.SoundSource import net.minecraft.world.InteractionHand +import net.minecraft.world.InteractionResultHolder import net.minecraft.world.damagesource.DamageSource import net.minecraft.world.entity.EquipmentSlot import net.minecraft.world.entity.LivingEntity @@ -21,38 +24,24 @@ import net.minecraft.world.entity.player.Player import net.minecraft.world.item.Item import net.minecraft.world.item.ItemStack import net.minecraft.world.item.TooltipFlag +import net.minecraft.world.item.UseAnim import net.minecraft.world.level.Explosion import net.minecraft.world.level.Level import net.minecraft.world.phys.AABB import net.minecraft.world.phys.Vec3 import net.minecraftforge.common.MinecraftForge +import net.minecraftforge.common.Tags import net.minecraftforge.event.entity.player.PlayerInteractEvent import net.minecraftforge.event.level.BlockEvent import ru.dbotthepony.mc.otm.block.entity.MatteryBlockEntity -import ru.dbotthepony.mc.otm.capability.matteryEnergy -import ru.dbotthepony.mc.otm.config.ItemsConfig import ru.dbotthepony.mc.otm.config.ToolsConfig -import ru.dbotthepony.mc.otm.core.TranslatableComponent -import ru.dbotthepony.mc.otm.core.damageType -import ru.dbotthepony.mc.otm.core.getExplosionResistance -import ru.dbotthepony.mc.otm.core.gracefulBlockBreak -import ru.dbotthepony.mc.otm.core.immutableMap -import ru.dbotthepony.mc.otm.core.immutableMultimap -import ru.dbotthepony.mc.otm.core.isExplosion -import ru.dbotthepony.mc.otm.core.math.component1 -import ru.dbotthepony.mc.otm.core.math.component2 -import ru.dbotthepony.mc.otm.core.math.component3 -import ru.dbotthepony.mc.otm.core.math.plus -import ru.dbotthepony.mc.otm.core.math.times -import ru.dbotthepony.mc.otm.core.math.toDoubleVector +import ru.dbotthepony.mc.otm.core.* +import ru.dbotthepony.mc.otm.core.math.* import ru.dbotthepony.mc.otm.core.nbt.set -import ru.dbotthepony.mc.otm.core.position -import ru.dbotthepony.mc.otm.core.tagNotNull -import ru.dbotthepony.mc.otm.item.weapon.EnergySwordItem import ru.dbotthepony.mc.otm.registry.MDamageTypes -import ru.dbotthepony.mc.otm.registry.MRegistry import ru.dbotthepony.mc.otm.registry.MatteryDamageSource import ru.dbotthepony.mc.otm.triggers.NailedEntityTrigger +import java.util.function.Predicate class ExplosiveHammerItem(durability: Int = 512) : Item(Properties().stacksTo(1).fireResistant().durability(durability)) { override fun canBeHurtBy(pDamageSource: DamageSource): Boolean { @@ -72,6 +61,11 @@ class ExplosiveHammerItem(durability: Int = 512) : Item(Properties().stacksTo(1) itemStack.tagNotNull["primed"] = false } + fun canPrime(player: Player): Boolean { + return player.inventory.clearOrCountMatchingItems(GUNPOWDER_PREDICATE, 0, player.inventoryMenu.craftSlots) > 0 && + player.inventory.clearOrCountMatchingItems(IRON_NUGGET_PREDICATE, 0, player.inventoryMenu.craftSlots) > 0 + } + private val aabb = AABB(-0.1, -0.1, -0.1, 0.1, 0.1, 0.1) val attributes = immutableMultimap { @@ -228,7 +222,44 @@ class ExplosiveHammerItem(durability: Int = 512) : Item(Properties().stacksTo(1) } } + override fun getUseAnimation(stack: ItemStack): UseAnim { + return if (isPrimed(stack)) super.getUseAnimation(stack) else UseAnim.CROSSBOW + } + + override fun getUseDuration(stack: ItemStack): Int { + return if (isPrimed(stack)) super.getUseDuration(stack) else 20 + } + + override fun use(level: Level, player: Player, hand: InteractionHand): InteractionResultHolder { + val stack = player.getItemInHand(hand) + + if (stack.isEmpty || isPrimed(stack) || !canPrime(player)) + return super.use(level, player, hand) + + player.startUsingItem(hand) + return InteractionResultHolder.consume(stack) + } + + override fun finishUsingItem(stack: ItemStack, level: Level, entity: LivingEntity): ItemStack { + + if (entity is Player && canPrime(entity)) { + if (level is ServerLevel) { + entity.inventory.clearOrCountMatchingItems(GUNPOWDER_PREDICATE, 1, entity.inventoryMenu.craftSlots) + entity.inventory.clearOrCountMatchingItems(IRON_NUGGET_PREDICATE, 1, entity.inventoryMenu.craftSlots) + + prime(stack) + } + + level.playSound(entity, entity.blockPosition(), SoundEvents.CROSSBOW_LOADING_END, SoundSource.PLAYERS, 1.0F, 1.0F) + } + + return super.finishUsingItem(stack, level, entity) + } + companion object { + val GUNPOWDER_PREDICATE = Predicate { stack: ItemStack -> stack.`is`(Tags.Items.GUNPOWDER) } + val IRON_NUGGET_PREDICATE = Predicate { stack: ItemStack -> stack.`is`(Tags.Items.NUGGETS_IRON) } + fun onLeftClickBlock(event: PlayerInteractEvent.LeftClickBlock) { val item = event.itemStack.item diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRegistry.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRegistry.kt index 130956113..10b28e3d4 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRegistry.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRegistry.kt @@ -336,8 +336,16 @@ object MRegistry { } } - ItemProperties.register(MItems.EXPLOSIVE_HAMMER, ResourceLocation(OverdriveThatMatters.MOD_ID, "is_primed")) { stack, _, _, _ -> - if (MItems.EXPLOSIVE_HAMMER.isPrimed(stack)) 1f else 0f + ItemProperties.register(MItems.EXPLOSIVE_HAMMER, ResourceLocation(OverdriveThatMatters.MOD_ID, "is_primed")) { stack, level, entity, _ -> + if (MItems.EXPLOSIVE_HAMMER.isPrimed(stack)) { + 1f + } else { + if ((entity?.useItemRemainingTicks ?: 0) <= 0) { + 0f + } else { + (stack.useDuration - (entity?.useItemRemainingTicks ?: stack.useDuration)).toFloat() / stack.useDuration + } + } } } } diff --git a/src/main/resources/assets/overdrive_that_matters/models/item/explosive_hammer.json b/src/main/resources/assets/overdrive_that_matters/models/item/explosive_hammer.json index 07d693f16..87f5ba7c0 100644 --- a/src/main/resources/assets/overdrive_that_matters/models/item/explosive_hammer.json +++ b/src/main/resources/assets/overdrive_that_matters/models/item/explosive_hammer.json @@ -17,6 +17,7 @@ } }, "overrides": [ + { "predicate": { "overdrive_that_matters:is_primed": 0.01 }, "model": "overdrive_that_matters:item/explosive_hammer_charging" }, { "predicate": { "overdrive_that_matters:is_primed": 1.0 }, "model": "overdrive_that_matters:item/explosive_hammer_primed" } ] } \ No newline at end of file diff --git a/src/main/resources/assets/overdrive_that_matters/models/item/explosive_hammer_charging.json b/src/main/resources/assets/overdrive_that_matters/models/item/explosive_hammer_charging.json new file mode 100644 index 000000000..f1ab82056 --- /dev/null +++ b/src/main/resources/assets/overdrive_that_matters/models/item/explosive_hammer_charging.json @@ -0,0 +1,37 @@ +{ + "loader": "forge:separate_transforms", + "gui_light": "front", + "base": + { + "parent": "overdrive_that_matters:item/explosive_hammer_unprimed", + "display": { + "thirdperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, -10, 5] + }, + "thirdperson_lefthand": { + "rotation": [0, 45, 0], + "translation": [0, -10, 5] + }, + "firstperson_righthand": { + "rotation": [-65, 0, 75], + "translation": [5, -7.5, -10] + }, + "firstperson_lefthand": { + "rotation": [-65, 0, 75], + "translation": [5, -7.5, -10] + } + } + }, + "perspectives": { + "gui": { + "parent": "overdrive_that_matters:item/explosive_hammer_inventory" + }, + "fixed": { + "parent": "overdrive_that_matters:item/explosive_hammer_inventory" + }, + "ground": { + "parent": "overdrive_that_matters:item/explosive_hammer_inventory" + } + } +} \ No newline at end of file