Make hammer deal actual damage when attacking mobs and make it not spammable

This commit is contained in:
DBotThePony 2023-04-26 17:50:17 +07:00
parent 2feb540076
commit d0ffa85647
Signed by: DBot
GPG Key ID: DCC23B5715498507
2 changed files with 36 additions and 3 deletions

View File

@ -5,6 +5,7 @@ package ru.dbotthepony.mc.otm.core
import com.google.common.collect.ImmutableList import com.google.common.collect.ImmutableList
import com.google.common.collect.ImmutableMap import com.google.common.collect.ImmutableMap
import com.google.common.collect.ImmutableMultimap
import com.google.common.collect.ImmutableSet import com.google.common.collect.ImmutableSet
import com.google.gson.JsonElement import com.google.gson.JsonElement
import com.google.gson.JsonObject import com.google.gson.JsonObject
@ -151,6 +152,12 @@ inline fun <K : Any, V : Any> immutableMap(initializer: ImmutableMap.Builder<K,
return builder.build() return builder.build()
} }
inline fun <K : Any, V : Any> immutableMultimap(initializer: ImmutableMultimap.Builder<K, V>.() -> Unit): ImmutableMultimap<K, V> {
val builder = ImmutableMultimap.Builder<K, V>()
initializer.invoke(builder)
return builder.build()
}
inline fun <V : Any> immutableSet(initializer: Consumer<V>.() -> Unit): ImmutableSet<V> { inline fun <V : Any> immutableSet(initializer: Consumer<V>.() -> Unit): ImmutableSet<V> {
val builder = ImmutableSet.Builder<V>() val builder = ImmutableSet.Builder<V>()
initializer.invoke(builder::add) initializer.invoke(builder::add)

View File

@ -1,5 +1,7 @@
package ru.dbotthepony.mc.otm.item.tool 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 it.unimi.dsi.fastutil.objects.ObjectArraySet
import net.minecraft.ChatFormatting import net.minecraft.ChatFormatting
import net.minecraft.core.BlockPos import net.minecraft.core.BlockPos
@ -9,7 +11,11 @@ import net.minecraft.server.level.ServerLevel
import net.minecraft.server.level.ServerPlayer import net.minecraft.server.level.ServerPlayer
import net.minecraft.world.InteractionHand import net.minecraft.world.InteractionHand
import net.minecraft.world.damagesource.DamageSource import net.minecraft.world.damagesource.DamageSource
import net.minecraft.world.entity.EquipmentSlot
import net.minecraft.world.entity.LivingEntity 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.item.ItemEntity
import net.minecraft.world.entity.player.Player import net.minecraft.world.entity.player.Player
import net.minecraft.world.item.Item 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.entity.player.PlayerInteractEvent
import net.minecraftforge.event.level.BlockEvent import net.minecraftforge.event.level.BlockEvent
import ru.dbotthepony.mc.otm.block.entity.MatteryBlockEntity 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.ItemsConfig
import ru.dbotthepony.mc.otm.config.ToolsConfig import ru.dbotthepony.mc.otm.config.ToolsConfig
import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.core.TranslatableComponent
import ru.dbotthepony.mc.otm.core.damageType import ru.dbotthepony.mc.otm.core.damageType
import ru.dbotthepony.mc.otm.core.getExplosionResistance import ru.dbotthepony.mc.otm.core.getExplosionResistance
import ru.dbotthepony.mc.otm.core.gracefulBlockBreak 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.isExplosion
import ru.dbotthepony.mc.otm.core.math.component1 import ru.dbotthepony.mc.otm.core.math.component1
import ru.dbotthepony.mc.otm.core.math.component2 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.nbt.set
import ru.dbotthepony.mc.otm.core.position import ru.dbotthepony.mc.otm.core.position
import ru.dbotthepony.mc.otm.core.tagNotNull 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.MDamageTypes
import ru.dbotthepony.mc.otm.registry.MRegistry import ru.dbotthepony.mc.otm.registry.MRegistry
import ru.dbotthepony.mc.otm.registry.MatteryDamageSource import ru.dbotthepony.mc.otm.registry.MatteryDamageSource
import ru.dbotthepony.mc.otm.triggers.NailedEntityTrigger 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 { override fun canBeHurtBy(pDamageSource: DamageSource): Boolean {
return super.canBeHurtBy(pDamageSource) && !pDamageSource.isExplosion 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) 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<Attribute, AttributeModifier> {
if (slot != EquipmentSlot.MAINHAND) {
return ImmutableMultimap.of()
}
return attributes
}
fun attackAt(itemStack: ItemStack, attacker: LivingEntity, pos: Vec3, aim: Vec3, hand: InteractionHand) { 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 return
val (ex, ey, ez) = pos val (ex, ey, ez) = pos
@ -149,7 +175,7 @@ class ExplosiveHammerItem(durability: Int = 64) : Item(Properties().stacksTo(1).
val copy = itemStack.copy() val copy = itemStack.copy()
itemStack.hurtAndBreak(1, attacker) { itemStack.hurtAndBreak(level.random.nextInt(1, 20), attacker) {
it.broadcastBreakEvent(hand) it.broadcastBreakEvent(hand)
} }