forked from Upstream/ExcellentEnchants-spigot
69 lines
3.0 KiB
Java
69 lines
3.0 KiB
Java
package su.nightexpress.excellentenchants.nms.v1_19_R2;
|
|
|
|
import net.minecraft.core.BlockPos;
|
|
import net.minecraft.network.protocol.game.ClientboundAnimatePacket;
|
|
import net.minecraft.server.level.ServerLevel;
|
|
import net.minecraft.world.entity.Entity;
|
|
import net.minecraft.world.level.block.Blocks;
|
|
import net.minecraft.world.level.block.LiquidBlock;
|
|
import net.minecraft.world.level.block.state.BlockState;
|
|
import net.minecraft.world.phys.shapes.CollisionContext;
|
|
import org.bukkit.Location;
|
|
import org.bukkit.block.Block;
|
|
import org.bukkit.craftbukkit.v1_19_R2.CraftWorld;
|
|
import org.bukkit.craftbukkit.v1_19_R2.entity.CraftLivingEntity;
|
|
import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer;
|
|
import org.bukkit.craftbukkit.v1_19_R2.event.CraftEventFactory;
|
|
import org.bukkit.entity.LivingEntity;
|
|
import org.bukkit.entity.Player;
|
|
import org.jetbrains.annotations.NotNull;
|
|
import su.nightexpress.excellentenchants.nms.EnchantNMS;
|
|
|
|
import java.util.HashSet;
|
|
import java.util.Set;
|
|
|
|
public class V1_19_R2 implements EnchantNMS {
|
|
|
|
@Override
|
|
public void sendAttackPacket(@NotNull Player player, int id) {
|
|
CraftPlayer craftPlayer = (CraftPlayer) player;
|
|
Entity entity = craftPlayer.getHandle();
|
|
ClientboundAnimatePacket packet = new ClientboundAnimatePacket(entity, id);
|
|
craftPlayer.getHandle().connection.send(packet);
|
|
}
|
|
|
|
@Override
|
|
@NotNull
|
|
public Set<Block> handleFlameWalker(@NotNull LivingEntity bukkitEntity, @NotNull Location location, int level) {
|
|
Entity entity = ((CraftLivingEntity) bukkitEntity).getHandle();
|
|
BlockPos pos = new BlockPos(location.getX(), location.getY(), location.getZ());
|
|
ServerLevel world = ((CraftWorld) bukkitEntity.getWorld()).getHandle();
|
|
|
|
float radius = Math.min(16F, 2F + level);
|
|
BlockState bStone = Blocks.MAGMA_BLOCK.defaultBlockState();
|
|
BlockPos.MutableBlockPos posAbove = new BlockPos.MutableBlockPos();
|
|
|
|
Set<Block> blocks = new HashSet<>();
|
|
for (BlockPos posNear : BlockPos.betweenClosed(pos.offset(-radius, -1.0, -radius), pos.offset(radius, -1.0, radius))) {
|
|
if (!posNear.closerThan(entity.blockPosition(), radius)) continue;
|
|
|
|
posAbove.set(posNear.getX(), posNear.getY() + 1, posNear.getZ());
|
|
|
|
BlockState bLavaAbove = world.getBlockState(posAbove);
|
|
BlockState bLava = world.getBlockState(posNear);
|
|
|
|
if (!bLavaAbove.isAir()) continue;
|
|
if (!bLava.getBlock().equals(Blocks.LAVA)) continue;
|
|
if (bLava.getValue(LiquidBlock.LEVEL) != 0) continue;
|
|
if (!bStone.canSurvive(world, posNear)) continue;
|
|
if (!world.isUnobstructed(bStone, posNear, CollisionContext.empty())) continue;
|
|
if (!CraftEventFactory.handleBlockFormEvent(world, posNear, bStone, entity)) continue;
|
|
//world.scheduleTick(posNear, Blocks.STONE, Rnd.get(60, 120));
|
|
|
|
Location bukkitLoc = new Location(world.getWorld(), posNear.getX(), posNear.getY(), posNear.getZ());
|
|
blocks.add(bukkitLoc.getBlock());
|
|
}
|
|
return blocks;
|
|
}
|
|
}
|