diff --git a/src/main/java/chylex/hee/game/block/BlockCorruptedEnergy.kt b/src/main/java/chylex/hee/game/block/BlockCorruptedEnergy.kt index e2af60f9..ac6458bc 100644 --- a/src/main/java/chylex/hee/game/block/BlockCorruptedEnergy.kt +++ b/src/main/java/chylex/hee/game/block/BlockCorruptedEnergy.kt @@ -7,15 +7,15 @@ import chylex.hee.game.block.properties.BlockBuilder import chylex.hee.game.block.properties.Property import chylex.hee.game.entity.CustomCreatureType import chylex.hee.game.entity.living.IImmuneToCorruptedEnergy -import chylex.hee.game.mechanics.damage.CombinedDamage import chylex.hee.game.mechanics.damage.Damage -import chylex.hee.game.mechanics.damage.Damage.Companion.TITLE_MAGIC +import chylex.hee.game.mechanics.damage.IDamageDealer.Companion.TITLE_MAGIC import chylex.hee.game.mechanics.damage.IDamageProcessor.Companion.ARMOR_PROTECTION import chylex.hee.game.mechanics.damage.IDamageProcessor.Companion.DIFFICULTY_SCALING import chylex.hee.game.mechanics.damage.IDamageProcessor.Companion.ENCHANTMENT_PROTECTION import chylex.hee.game.mechanics.damage.IDamageProcessor.Companion.MAGIC_TYPE import chylex.hee.game.mechanics.damage.IDamageProcessor.Companion.NUDITY_DANGER import chylex.hee.game.mechanics.damage.IDamageProcessor.Companion.RAPID_DAMAGE +import chylex.hee.game.mechanics.damage.special.CombinedDamage import chylex.hee.game.particle.ParticleCorruptedEnergy import chylex.hee.game.particle.spawner.ParticleSpawnerCustom import chylex.hee.game.particle.spawner.properties.IOffset.InBox diff --git a/src/main/java/chylex/hee/game/block/BlockEternalFire.kt b/src/main/java/chylex/hee/game/block/BlockEternalFire.kt index 6d091034..811c3645 100644 --- a/src/main/java/chylex/hee/game/block/BlockEternalFire.kt +++ b/src/main/java/chylex/hee/game/block/BlockEternalFire.kt @@ -2,6 +2,7 @@ package chylex.hee.game.block import chylex.hee.client.render.block.IBlockLayerCutout import chylex.hee.game.block.properties.BlockBuilder import chylex.hee.game.mechanics.damage.Damage +import chylex.hee.game.mechanics.damage.IDamageDealer.Companion.TITLE_IN_FIRE import chylex.hee.game.mechanics.damage.IDamageProcessor.Companion.ALL_PROTECTIONS import chylex.hee.game.mechanics.damage.IDamageProcessor.Companion.FIRE_TYPE import chylex.hee.game.mechanics.damage.IDamageProcessor.Companion.PEACEFUL_EXCLUSION @@ -119,7 +120,7 @@ class BlockEternalFire(builder: BlockBuilder) : BlockFire(builder.p), IBlockLaye } override fun onEntityCollision(state: BlockState, world: World, pos: BlockPos, entity: Entity){ - DAMAGE_CONTACT.dealTo(1F, entity, Damage.TITLE_IN_FIRE) + DAMAGE_CONTACT.dealTo(1F, entity, TITLE_IN_FIRE) } @SubscribeEvent diff --git a/src/main/java/chylex/hee/game/block/BlockIgneousRockOre.kt b/src/main/java/chylex/hee/game/block/BlockIgneousRockOre.kt index e0f1f7b8..173ff204 100644 --- a/src/main/java/chylex/hee/game/block/BlockIgneousRockOre.kt +++ b/src/main/java/chylex/hee/game/block/BlockIgneousRockOre.kt @@ -2,6 +2,7 @@ package chylex.hee.game.block import chylex.hee.game.block.properties.BlockBuilder import chylex.hee.game.inventory.doDamage import chylex.hee.game.mechanics.damage.Damage +import chylex.hee.game.mechanics.damage.IDamageDealer.Companion.TITLE_IN_FIRE import chylex.hee.game.mechanics.damage.IDamageProcessor.Companion.FIRE_TYPE import chylex.hee.game.mechanics.damage.IDamageProcessor.Companion.PEACEFUL_EXCLUSION import chylex.hee.game.particle.spawner.ParticleSpawnerVanilla @@ -68,7 +69,7 @@ class BlockIgneousRockOre(builder: BlockBuilder) : BlockSimple(builder){ val heldItem = player.getHeldItem(MAIN_HAND) if ((getToolHarvestLevel(heldItem) ?: 0) < super.getHarvestLevel(state) || EnchantmentHelper.getEnchantmentLevel(Enchantments.SILK_TOUCH, player.getHeldItem(MAIN_HAND)) == 0){ - DAMAGE_MINING.dealTo(2F, player, Damage.TITLE_IN_FIRE) + DAMAGE_MINING.dealTo(2F, player, TITLE_IN_FIRE) } return super.removedByPlayer(state, world, pos, player, willHarvest, fluid) diff --git a/src/main/java/chylex/hee/game/entity/Teleporter.kt b/src/main/java/chylex/hee/game/entity/Teleporter.kt index 7097da34..1931b3bb 100644 --- a/src/main/java/chylex/hee/game/entity/Teleporter.kt +++ b/src/main/java/chylex/hee/game/entity/Teleporter.kt @@ -4,7 +4,7 @@ import chylex.hee.game.entity.Teleporter.FxRange.Extended import chylex.hee.game.entity.Teleporter.FxRange.Normal import chylex.hee.game.entity.Teleporter.FxRange.Silent import chylex.hee.game.mechanics.damage.Damage -import chylex.hee.game.mechanics.damage.Damage.Companion.TITLE_FALL +import chylex.hee.game.mechanics.damage.IDamageDealer.Companion.TITLE_FALL import chylex.hee.game.mechanics.damage.IDamageProcessor.Companion.MAGIC_TYPE import chylex.hee.game.mechanics.instability.Instability import chylex.hee.game.particle.ParticleTeleport diff --git a/src/main/java/chylex/hee/game/entity/item/EntityFallingObsidian.kt b/src/main/java/chylex/hee/game/entity/item/EntityFallingObsidian.kt index 455039ed..18c7de21 100644 --- a/src/main/java/chylex/hee/game/entity/item/EntityFallingObsidian.kt +++ b/src/main/java/chylex/hee/game/entity/item/EntityFallingObsidian.kt @@ -4,7 +4,7 @@ import chylex.hee.game.entity.item.EntityFallingBlockHeavy.PlacementResult.RELOC import chylex.hee.game.entity.item.EntityFallingBlockHeavy.PlacementResult.SUCCESS import chylex.hee.game.entity.selectVulnerableEntities import chylex.hee.game.mechanics.damage.Damage -import chylex.hee.game.mechanics.damage.Damage.Companion.TITLE_FALLING_BLOCK +import chylex.hee.game.mechanics.damage.IDamageDealer.Companion.TITLE_FALLING_BLOCK import chylex.hee.game.mechanics.damage.IDamageProcessor.Companion.ARMOR_PROTECTION import chylex.hee.game.mechanics.damage.IDamageProcessor.Companion.ENCHANTMENT_PROTECTION import chylex.hee.game.mechanics.damage.IDamageProcessor.Companion.PEACEFUL_EXCLUSION diff --git a/src/main/java/chylex/hee/game/item/ItemChorusBerry.kt b/src/main/java/chylex/hee/game/item/ItemChorusBerry.kt index 7ca93100..60245f18 100644 --- a/src/main/java/chylex/hee/game/item/ItemChorusBerry.kt +++ b/src/main/java/chylex/hee/game/item/ItemChorusBerry.kt @@ -2,6 +2,7 @@ package chylex.hee.game.item import chylex.hee.game.entity.Teleporter import chylex.hee.game.entity.posVec import chylex.hee.game.mechanics.damage.Damage +import chylex.hee.game.mechanics.damage.IDamageDealer.Companion.TITLE_MAGIC import chylex.hee.game.mechanics.damage.IDamageProcessor.Companion.MAGIC_TYPE import chylex.hee.game.mechanics.damage.IDamageProcessor.Companion.PEACEFUL_EXCLUSION import chylex.hee.game.potion.makeEffect @@ -107,7 +108,7 @@ class ItemChorusBerry(properties: Properties) : Item(properties){ } if (!teleportEntity(entity, hungerOvercharge, rand)){ - DAMAGE_TELEPORT_FAIL.dealTo(1F, entity, Damage.TITLE_MAGIC) + DAMAGE_TELEPORT_FAIL.dealTo(1F, entity, TITLE_MAGIC) } } } diff --git a/src/main/java/chylex/hee/game/item/ItemVoidSalad.kt b/src/main/java/chylex/hee/game/item/ItemVoidSalad.kt index e136f789..7d840f40 100644 --- a/src/main/java/chylex/hee/game/item/ItemVoidSalad.kt +++ b/src/main/java/chylex/hee/game/item/ItemVoidSalad.kt @@ -5,7 +5,7 @@ import chylex.hee.game.entity.heeTagOrNull import chylex.hee.game.inventory.heeTag import chylex.hee.game.inventory.heeTagOrNull import chylex.hee.game.mechanics.damage.Damage -import chylex.hee.game.mechanics.damage.Damage.Companion.TITLE_STARVE +import chylex.hee.game.mechanics.damage.IDamageDealer.Companion.TITLE_STARVE import chylex.hee.game.mechanics.damage.IDamageProcessor.Companion.MAGIC_TYPE import chylex.hee.game.mechanics.damage.IDamageProcessor.Companion.NON_LETHAL import chylex.hee.game.potion.makeEffect diff --git a/src/main/java/chylex/hee/game/mechanics/damage/Damage.kt b/src/main/java/chylex/hee/game/mechanics/damage/Damage.kt index be26e6a1..1a7b57e8 100644 --- a/src/main/java/chylex/hee/game/mechanics/damage/Damage.kt +++ b/src/main/java/chylex/hee/game/mechanics/damage/Damage.kt @@ -1,11 +1,8 @@ package chylex.hee.game.mechanics.damage -import chylex.hee.system.migration.EntityLivingBase -import chylex.hee.system.migration.EntityPlayer -import chylex.hee.system.migration.EntityThrowable +import chylex.hee.game.mechanics.damage.IDamageDealer.Companion.CANCEL_DAMAGE import net.minecraft.entity.Entity -import net.minecraft.entity.SharedMonsterAttributes.ATTACK_DAMAGE -class Damage(private vararg val processors: IDamageProcessor){ +class Damage(private vararg val processors: IDamageProcessor) : IDamageDealer{ private val properties = DamageProperties().apply { val writer = Writer() processors.forEach { it.setup(writer) } @@ -23,43 +20,15 @@ class Damage(private vararg val processors: IDamageProcessor){ return true } - fun dealTo(amount: Float, target: Entity, title: String = TITLE_GENERIC) = + override fun dealTo(amount: Float, target: Entity, title: String) = dealToInternal(amount, target, null, null, title) - fun dealToFrom(target: Entity, source: EntityLivingBase, title: String = determineTitleDirect(source)) = - dealToInternal(source.getAttribute(ATTACK_DAMAGE).value.toFloat(), target, source, source, title) - - fun dealToFrom(amount: Float, target: Entity, source: Entity, title: String = determineTitleDirect(source)) = + override fun dealToFrom(amount: Float, target: Entity, source: Entity, title: String) = dealToInternal(amount, target, source, source, title) - fun dealToIndirectly(amount: Float, target: Entity, directSource: Entity, remoteSource: Entity?, title: String = determineTitleIndirect(directSource, remoteSource)) = + override fun dealToIndirectly(amount: Float, target: Entity, directSource: Entity, remoteSource: Entity?, title: String) = dealToInternal(amount, target, directSource, remoteSource, title) - companion object{ - const val CANCEL_DAMAGE = 0F - - const val TITLE_GENERIC = "generic" - const val TITLE_PLAYER = "player" - const val TITLE_MOB = "mob" - const val TITLE_THROWN = "thrown" - - const val TITLE_MAGIC = "magic" - const val TITLE_FALL = "fall" - const val TITLE_STARVE = "starve" - const val TITLE_WITHER = "wither" - const val TITLE_IN_FIRE = "inFire" - const val TITLE_FALLING_BLOCK = "fallingBlock" - - fun determineTitleDirect(source: Entity?) = when(source){ - is EntityPlayer -> TITLE_PLAYER - null -> TITLE_GENERIC - else -> TITLE_MOB - } - - fun determineTitleIndirect(directSource: Entity, remoteSource: Entity?) = when(directSource){ - is EntityThrowable -> TITLE_THROWN - else -> determineTitleDirect(remoteSource) - } - } + } diff --git a/src/main/java/chylex/hee/game/mechanics/damage/IDamageDealer.kt b/src/main/java/chylex/hee/game/mechanics/damage/IDamageDealer.kt new file mode 100644 index 00000000..e60abaf5 --- /dev/null +++ b/src/main/java/chylex/hee/game/mechanics/damage/IDamageDealer.kt @@ -0,0 +1,44 @@ +package chylex.hee.game.mechanics.damage +import chylex.hee.system.migration.EntityLivingBase +import chylex.hee.system.migration.EntityPlayer +import chylex.hee.system.migration.EntityThrowable +import net.minecraft.entity.Entity +import net.minecraft.entity.SharedMonsterAttributes.ATTACK_DAMAGE + +interface IDamageDealer{ + fun dealTo(amount: Float, target: Entity, title: String = TITLE_GENERIC): Boolean + fun dealToFrom(amount: Float, target: Entity, source: Entity, title: String = determineTitleDirect(source)): Boolean + fun dealToIndirectly(amount: Float, target: Entity, directSource: Entity, remoteSource: Entity?, title: String = determineTitleIndirect(directSource, remoteSource)): Boolean + + @JvmDefault + fun dealToFrom(target: Entity, source: EntityLivingBase, title: String = determineTitleDirect(source)): Boolean{ + return dealToFrom(source.getAttribute(ATTACK_DAMAGE).value.toFloat(), target, source, title) + } + + companion object{ + const val CANCEL_DAMAGE = 0F + + const val TITLE_GENERIC = "generic" + const val TITLE_PLAYER = "player" + const val TITLE_MOB = "mob" + const val TITLE_THROWN = "thrown" + + const val TITLE_MAGIC = "magic" + const val TITLE_FALL = "fall" + const val TITLE_STARVE = "starve" + const val TITLE_WITHER = "wither" + const val TITLE_IN_FIRE = "inFire" + const val TITLE_FALLING_BLOCK = "fallingBlock" + + fun determineTitleDirect(source: Entity?) = when(source){ + is EntityPlayer -> TITLE_PLAYER + null -> TITLE_GENERIC + else -> TITLE_MOB + } + + fun determineTitleIndirect(directSource: Entity, remoteSource: Entity?) = when(directSource){ + is EntityThrowable -> TITLE_THROWN + else -> determineTitleDirect(remoteSource) + } + } +} diff --git a/src/main/java/chylex/hee/game/mechanics/damage/IDamageProcessor.kt b/src/main/java/chylex/hee/game/mechanics/damage/IDamageProcessor.kt index d70900dc..453157ce 100644 --- a/src/main/java/chylex/hee/game/mechanics/damage/IDamageProcessor.kt +++ b/src/main/java/chylex/hee/game/mechanics/damage/IDamageProcessor.kt @@ -1,6 +1,7 @@ package chylex.hee.game.mechanics.damage import chylex.hee.game.entity.setFireTicks -import chylex.hee.game.mechanics.damage.Damage.Companion.CANCEL_DAMAGE +import chylex.hee.game.mechanics.damage.DamageProperties.Reader +import chylex.hee.game.mechanics.damage.IDamageDealer.Companion.CANCEL_DAMAGE import chylex.hee.system.migration.EntityLivingBase import chylex.hee.system.migration.EntityPlayer import chylex.hee.system.migration.ItemArmor @@ -32,12 +33,16 @@ interface IDamageProcessor{ @JvmStatic fun FIRE_TYPE(setOnFireTicks: Int = 0) = object : IDamageProcessor{ - override fun setup(properties: DamageProperties.Writer) = properties.addType(DamageType.FIRE) + override fun setup(properties: DamageProperties.Writer){ + properties.addType(DamageType.FIRE) + } - override fun afterDamage(target: Entity, properties: DamageProperties.Reader){ + override fun modifyDamage(amount: Float, target: Entity, properties: Reader): Float{ if (setOnFireTicks > 0){ target.setFireTicks(setOnFireTicks) } + + return super.modifyDamage(amount, target, properties) } } diff --git a/src/main/java/chylex/hee/game/mechanics/damage/CombinedDamage.kt b/src/main/java/chylex/hee/game/mechanics/damage/special/CombinedDamage.kt similarity index 69% rename from src/main/java/chylex/hee/game/mechanics/damage/CombinedDamage.kt rename to src/main/java/chylex/hee/game/mechanics/damage/special/CombinedDamage.kt index 689ef561..2d7b9cab 100644 --- a/src/main/java/chylex/hee/game/mechanics/damage/CombinedDamage.kt +++ b/src/main/java/chylex/hee/game/mechanics/damage/special/CombinedDamage.kt @@ -1,9 +1,12 @@ -package chylex.hee.game.mechanics.damage -import chylex.hee.game.mechanics.damage.Damage.Companion.TITLE_GENERIC +package chylex.hee.game.mechanics.damage.special +import chylex.hee.game.mechanics.damage.IDamageDealer +import chylex.hee.game.mechanics.damage.IDamageDealer.Companion.TITLE_GENERIC +import chylex.hee.game.mechanics.damage.IDamageDealer.Companion.determineTitleDirect +import chylex.hee.game.mechanics.damage.IDamageDealer.Companion.determineTitleIndirect import chylex.hee.system.migration.EntityLivingBase import net.minecraft.entity.Entity -class CombinedDamage(private vararg val definitions: Pair<Damage, Float>){ +class CombinedDamage(private vararg val definitions: Pair<IDamageDealer, Float>){ private fun shouldPreventDamage(target: Entity): Boolean{ if (target is EntityLivingBase && target.hurtResistantTime > (target.maxHurtResistantTime / 2F)){ val lastDamage = target.lastDamage @@ -16,7 +19,7 @@ class CombinedDamage(private vararg val definitions: Pair<Damage, Float>){ return false } - private inline fun dealToInternal(target: Entity, damageCall: (Pair<Damage, Float>) -> Boolean): Boolean{ + private inline fun dealToInternal(target: Entity, damageCall: (Pair<IDamageDealer, Float>) -> Boolean): Boolean{ if (shouldPreventDamage(target)){ return false } @@ -39,9 +42,9 @@ class CombinedDamage(private vararg val definitions: Pair<Damage, Float>){ fun dealTo(target: Entity, title: String = TITLE_GENERIC) = dealToInternal(target){ (damage, amount) -> damage.dealTo(amount, target, title) } - fun dealToFrom(target: Entity, source: Entity, title: String = Damage.determineTitleDirect(source)) = + fun dealToFrom(target: Entity, source: Entity, title: String = determineTitleDirect(source)) = dealToInternal(target){ (damage, amount) -> damage.dealToFrom(amount, target, source, title) } - fun dealToIndirectly(target: Entity, triggeringSource: Entity, remoteSource: Entity, title: String = Damage.determineTitleIndirect(triggeringSource, remoteSource)) = + fun dealToIndirectly(target: Entity, triggeringSource: Entity, remoteSource: Entity, title: String = determineTitleIndirect(triggeringSource, remoteSource)) = dealToInternal(target){ (damage, amount) -> damage.dealToIndirectly(amount, target, triggeringSource, remoteSource, title) } } diff --git a/src/main/java/chylex/hee/game/mechanics/damage/special/FallbackDamage.kt b/src/main/java/chylex/hee/game/mechanics/damage/special/FallbackDamage.kt new file mode 100644 index 00000000..8f721bf8 --- /dev/null +++ b/src/main/java/chylex/hee/game/mechanics/damage/special/FallbackDamage.kt @@ -0,0 +1,24 @@ +package chylex.hee.game.mechanics.damage.special +import chylex.hee.game.mechanics.damage.IDamageDealer +import net.minecraft.entity.Entity + +class FallbackDamage(private vararg val definitions: Pair<IDamageDealer, Double>) : IDamageDealer { + private inline fun dealToInternal(amount: Float, damageCall: (IDamageDealer, Float) -> Boolean): Boolean{ + for(definition in definitions){ + if (damageCall(definition.first, (amount * definition.second).toFloat())){ + return true + } + } + + return false + } + + override fun dealTo(amount: Float, target: Entity, title: String) = + dealToInternal(amount){ damage, adjustedAmount -> damage.dealTo(adjustedAmount, target, title) } + + override fun dealToFrom(amount: Float, target: Entity, source: Entity, title: String) = + dealToInternal(amount){ damage, adjustedAmount -> damage.dealToFrom(adjustedAmount, target, source, title) } + + override fun dealToIndirectly(amount: Float, target: Entity, directSource: Entity, remoteSource: Entity?, title: String) = + dealToInternal(amount){ damage, adjustedAmount -> damage.dealToIndirectly(adjustedAmount, target, directSource, remoteSource, title) } +} diff --git a/src/main/java/chylex/hee/game/world/territory/TerritoryVoid.kt b/src/main/java/chylex/hee/game/world/territory/TerritoryVoid.kt index 72155de8..a098e5b3 100644 --- a/src/main/java/chylex/hee/game/world/territory/TerritoryVoid.kt +++ b/src/main/java/chylex/hee/game/world/territory/TerritoryVoid.kt @@ -5,7 +5,7 @@ import chylex.hee.game.block.BlockAbstractPortal import chylex.hee.game.entity.heeTag import chylex.hee.game.entity.posVec import chylex.hee.game.mechanics.damage.Damage -import chylex.hee.game.mechanics.damage.Damage.Companion.TITLE_WITHER +import chylex.hee.game.mechanics.damage.IDamageDealer.Companion.TITLE_WITHER import chylex.hee.game.mechanics.damage.IDamageProcessor.Companion.DEAL_CREATIVE import chylex.hee.game.mechanics.damage.IDamageProcessor.Companion.IGNORE_INVINCIBILITY import chylex.hee.game.particle.ParticleFadingSpot