diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/entity/PlasmaProjectile.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/entity/PlasmaProjectile.kt new file mode 100644 index 000000000..0208cc993 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/entity/PlasmaProjectile.kt @@ -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, 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 { + + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MEntityTypes.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MEntityTypes.kt new file mode 100644 index 000000000..6dd6f3267 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MEntityTypes.kt @@ -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> = 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) + } +}