diff --git a/src/main/java/com/minelittlepony/unicopia/block/cloud/UnstableCloudBlock.java b/src/main/java/com/minelittlepony/unicopia/block/cloud/UnstableCloudBlock.java index 0f9f0c86..554e20b6 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/cloud/UnstableCloudBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/cloud/UnstableCloudBlock.java @@ -2,13 +2,18 @@ package com.minelittlepony.unicopia.block.cloud; import java.util.Optional; +import com.minelittlepony.unicopia.entity.mob.StormCloudEntity; import com.minelittlepony.unicopia.particle.LightningBoltParticleEffect; +import com.minelittlepony.unicopia.particle.ParticleUtils; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.block.LightningRodBlock; import net.minecraft.entity.Entity; +import net.minecraft.entity.LightningEntity; import net.minecraft.particle.ParticleTypes; +import net.minecraft.server.world.ServerWorld; import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundEvents; import net.minecraft.state.StateManager; @@ -16,7 +21,11 @@ import net.minecraft.state.property.IntProperty; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Box; import net.minecraft.util.math.random.Random; +import net.minecraft.world.Heightmap; import net.minecraft.world.World; +import net.minecraft.world.event.GameEvent; +import net.minecraft.world.poi.PointOfInterestStorage; +import net.minecraft.world.poi.PointOfInterestTypes; public class UnstableCloudBlock extends CloudBlock { private static final int MAX_CHARGE = 6; @@ -59,20 +68,38 @@ public class UnstableCloudBlock extends CloudBlock { world.setBlockState(pos, state.cycle(CHARGE)); } else { world.setBlockState(pos, state.with(CHARGE, 0)); - BlockPos shockPosition = pos.add(world.random.nextInt(10) - 5, -world.random.nextInt(10), world.random.nextInt(10) - 5); - world.addImportantParticle( - new LightningBoltParticleEffect(false, 10, 6, 0.3F, Optional.of(shockPosition.toCenterPos())), - true, - pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, - 0, 0, 0 - ); - world.getOtherEntities(null, new Box(shockPosition).expand(2)).forEach(e -> { - e.damage(entity.getDamageSources().lightningBolt(), 1); - }); - if (world.isAir(shockPosition) && world.getBlockState(shockPosition.down()).isBurnable()) { - world.setBlockState(shockPosition, Blocks.FIRE.getDefaultState()); + if (world instanceof ServerWorld sw) { + Optional lightningRodPos = sw.getPointOfInterestStorage().getNearestPosition( + poiType -> poiType.matchesKey(PointOfInterestTypes.LIGHTNING_ROD), + innerPos -> innerPos.getY() == world.getTopY(Heightmap.Type.WORLD_SURFACE, innerPos.getX(), innerPos.getZ()) - 1, + pos, 10, PointOfInterestStorage.OccupationStatus.ANY + ); + BlockPos shockPosition = lightningRodPos.or(() -> { + return sw.getOtherEntities(entity, new Box(pos.down()).expand(5, 0, 5).stretch(0, -10, 0)).stream().findAny().map(Entity::getBlockPos); + }).orElseGet(() -> StormCloudEntity.findSurfaceBelow(sw, pos.add(world.random.nextInt(10) - 5, -world.random.nextInt(10), world.random.nextInt(10) - 5)).toImmutable()); + + ParticleUtils.spawnParticle(world, + new LightningBoltParticleEffect(false, 10, 6, 0.3F, Optional.of(shockPosition.toCenterPos())), + pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, + 0, 0, 0 + ); + world.getOtherEntities(null, new Box(shockPosition).expand(2)).forEach(e -> { + e.damage(entity.getDamageSources().lightningBolt(), 1); + }); + lightningRodPos.ifPresent(rodPos -> { + BlockState rod = sw.getBlockState(rodPos); + if (rod.isOf(Blocks.LIGHTNING_ROD)) { + ((LightningRodBlock)rod.getBlock()).setPowered(rod, sw, rodPos); + } + }); + LightningEntity.cleanOxidation(world, shockPosition); + entity.emitGameEvent(GameEvent.LIGHTNING_STRIKE); + + if (world.isAir(shockPosition) && world.getBlockState(shockPosition.down()).isBurnable()) { + world.setBlockState(shockPosition, Blocks.FIRE.getDefaultState()); + } } } } diff --git a/src/main/resources/unicopia.aw b/src/main/resources/unicopia.aw index 70f16be3..0b811613 100644 --- a/src/main/resources/unicopia.aw +++ b/src/main/resources/unicopia.aw @@ -17,3 +17,5 @@ accessible field net/minecraft/entity/mob/CreeperEntity IGNITED accessible method net/minecraft/client/render/RenderLayer$MultiPhase getPhases ()Lnet/minecraft/client/render/RenderLayer$MultiPhaseParameters; accessible method net/minecraft/client/render/RenderPhase$TextureBase getId ()Ljava/util/Optional; accessible field net/minecraft/client/render/RenderLayer$MultiPhaseParameters texture Lnet/minecraft/client/render/RenderPhase$TextureBase; + +accessible method net/minecraft/entity/LightningEntity cleanOxidation (Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;)V \ No newline at end of file