diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/Ext.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/Ext.kt index 1ebb97476..efbf72a36 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/core/Ext.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/Ext.kt @@ -5,6 +5,7 @@ package ru.dbotthepony.mc.otm.core import com.google.common.collect.ImmutableList import com.google.common.collect.ImmutableMap +import com.google.common.collect.ImmutableMultimap import com.google.common.collect.ImmutableSet import com.google.gson.JsonElement import com.google.gson.JsonObject @@ -151,6 +152,12 @@ inline fun immutableMap(initializer: ImmutableMap.Builder immutableMultimap(initializer: ImmutableMultimap.Builder.() -> Unit): ImmutableMultimap { + val builder = ImmutableMultimap.Builder() + initializer.invoke(builder) + return builder.build() +} + inline fun immutableSet(initializer: Consumer.() -> Unit): ImmutableSet { val builder = ImmutableSet.Builder() initializer.invoke(builder::add) 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 339df1e15..6ae6658f0 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 @@ -1,5 +1,7 @@ package ru.dbotthepony.mc.otm.item.tool +import com.google.common.collect.ImmutableMultimap +import com.google.common.collect.Multimap import it.unimi.dsi.fastutil.objects.ObjectArraySet import net.minecraft.ChatFormatting import net.minecraft.core.BlockPos @@ -9,7 +11,11 @@ import net.minecraft.server.level.ServerLevel import net.minecraft.server.level.ServerPlayer import net.minecraft.world.InteractionHand import net.minecraft.world.damagesource.DamageSource +import net.minecraft.world.entity.EquipmentSlot import net.minecraft.world.entity.LivingEntity +import net.minecraft.world.entity.ai.attributes.Attribute +import net.minecraft.world.entity.ai.attributes.AttributeModifier +import net.minecraft.world.entity.ai.attributes.Attributes import net.minecraft.world.entity.item.ItemEntity import net.minecraft.world.entity.player.Player import net.minecraft.world.item.Item @@ -23,12 +29,15 @@ import net.minecraftforge.common.MinecraftForge 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 @@ -39,12 +48,13 @@ import ru.dbotthepony.mc.otm.core.math.toDoubleVector 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 -class ExplosiveHammerItem(durability: Int = 64) : Item(Properties().stacksTo(1).fireResistant().durability(durability)) { +class ExplosiveHammerItem(durability: Int = 512) : Item(Properties().stacksTo(1).fireResistant().durability(durability)) { override fun canBeHurtBy(pDamageSource: DamageSource): Boolean { return super.canBeHurtBy(pDamageSource) && !pDamageSource.isExplosion } @@ -64,8 +74,24 @@ class ExplosiveHammerItem(durability: Int = 64) : Item(Properties().stacksTo(1). private val aabb = AABB(-0.1, -0.1, -0.1, 0.1, 0.1, 0.1) + val attributes = immutableMultimap { + put(Attributes.ATTACK_DAMAGE, AttributeModifier(BASE_ATTACK_DAMAGE_UUID, "Weapon modifier", 3.0, AttributeModifier.Operation.ADDITION)) + put(Attributes.ATTACK_SPEED, AttributeModifier(BASE_ATTACK_SPEED_UUID, "Weapon modifier", -3.4, AttributeModifier.Operation.ADDITION)) + } + + override fun getAttributeModifiers( + slot: EquipmentSlot, + itemStack: ItemStack + ): Multimap { + if (slot != EquipmentSlot.MAINHAND) { + return ImmutableMultimap.of() + } + + return attributes + } + fun attackAt(itemStack: ItemStack, attacker: LivingEntity, pos: Vec3, aim: Vec3, hand: InteractionHand) { - if (!isPrimed(itemStack) || attacker.level.isClientSide) + if (!isPrimed(itemStack) || attacker.level.isClientSide || attacker is Player && attacker.getAttackStrengthScale(0.4f) < 0.98f) return val (ex, ey, ez) = pos @@ -149,7 +175,7 @@ class ExplosiveHammerItem(durability: Int = 64) : Item(Properties().stacksTo(1). val copy = itemStack.copy() - itemStack.hurtAndBreak(1, attacker) { + itemStack.hurtAndBreak(level.random.nextInt(1, 20), attacker) { it.broadcastBreakEvent(hand) }