more tests

This commit is contained in:
DBotThePony 2022-03-14 10:26:02 +07:00
parent 2aed09593c
commit cd745a5e7e
Signed by: DBot
GPG Key ID: DCC23B5715498507
2 changed files with 131 additions and 0 deletions

View File

@ -0,0 +1,112 @@
package ru.dbotthepony.mc.otm.entity
import net.minecraft.core.particles.ParticleTypes
import net.minecraft.world.entity.EntityType
import net.minecraft.world.entity.projectile.Projectile
import net.minecraft.world.entity.projectile.ProjectileUtil
import net.minecraft.world.item.ItemStack
import net.minecraft.world.level.Level
import net.minecraft.world.level.block.Blocks
import net.minecraft.world.level.block.LevelEvent
import net.minecraft.world.phys.BlockHitResult
import net.minecraft.world.phys.EntityHitResult
import net.minecraft.world.phys.HitResult
import net.minecraftforge.event.ForgeEventFactory
import ru.dbotthepony.mc.otm.registry.PlasmaDamageSource
class PlasmaProjectile(type: EntityType<out PlasmaProjectile>, level: Level) : Projectile(type, level) {
var inflictor: ItemStack? = null
var damage = 6.0f
var ttl = 200
override fun defineSynchedData() {
}
override fun onHit(p_37260_: HitResult) {
super.onHit(p_37260_)
if (!level.isClientSide) {
discard()
}
}
override fun onHitEntity(p_37259_: EntityHitResult) {
super.onHitEntity(p_37259_)
if (!level.isClientSide) {
p_37259_.entity.hurt(PlasmaDamageSource(owner, inflictor), damage)
}
}
override fun onHitBlock(p_37258_: BlockHitResult) {
super.onHitBlock(p_37258_)
println("Play sound at ${position()}")
}
override fun tick() {
if (ttl-- <= 0) {
discard()
return
}
super.tick()
val trace = ProjectileUtil.getHitResult(this, this::canHitEntity)
if (trace.type == HitResult.Type.BLOCK) {
val pos = (trace as BlockHitResult).blockPos
val state = level.getBlockState(pos)
if (state.`is`(Blocks.NETHER_PORTAL) || state.`is`(Blocks.END_GATEWAY)) {
onHitBlock(trace)
// don't teleport plasma projectile
if (!level.isClientSide)
discard()
return
}
}
if (trace.type != HitResult.Type.MISS && !ForgeEventFactory.onProjectileImpact(this, trace)) {
onHit(trace)
}
checkInsideBlocks()
val x = x + deltaMovement.x
val y = y + deltaMovement.y
val z = z + deltaMovement.z
if (isInWater) {
// extinguish
for (i in 0 .. 4) {
level.addParticle(
ParticleTypes.BUBBLE,
x - deltaMovement.x * 0.25,
y - deltaMovement.y * 0.25,
z - deltaMovement.z * 0.25,
deltaMovement.x,
deltaMovement.y,
deltaMovement.z,
)
}
if (!level.isClientSide) {
discard()
level.levelEvent(LevelEvent.LAVA_FIZZ, blockPosition(), 0)
}
return
}
setPos(x, y, z)
}
companion object {
}
}

View File

@ -0,0 +1,19 @@
package ru.dbotthepony.mc.otm.registry
import net.minecraft.world.entity.EntityType
import net.minecraft.world.entity.MobCategory
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext
import net.minecraftforge.registries.DeferredRegister
import net.minecraftforge.registries.ForgeRegistries
import ru.dbotthepony.mc.otm.OverdriveThatMatters
import ru.dbotthepony.mc.otm.entity.PlasmaProjectile
object MEntityTypes {
private val registry: DeferredRegister<EntityType<*>> = DeferredRegister.create(ForgeRegistries.ENTITIES, OverdriveThatMatters.MOD_ID)
val PLASMA: EntityType<*> by registry.register(MNames.PLASMA) { EntityType.Builder.of(::PlasmaProjectile, MobCategory.MISC).build(null) }
internal fun register() {
registry.register(FMLJavaModLoadingContext.get().modEventBus)
}
}