Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите Эффект ломания блоков

Статус
Закрыто для дальнейших ответов.

just_lofe

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
just_l0fe
Мне нужно, что-бы в радиусе 2-3 блоков от игрока блоки имели фантомный прогресс ломания.
Если игрок отходит - эффект пропадает, обновляется каждую секунду.
Желательно что бы эффект принимали блоки в шарообразном радиусе и имели разную степень.

Ядро - Purpur 1.20.1
 
Последнее редактирование:
Как будто игрок ломает блок

Возьми за основу код ниже. Это мод но суть похожа


Код:
package com.example.autobreakmod;

import net.minecraft.client.Minecraft;
import net.minecraftforge.client.event.PlayerSPPushOutOfBlocksEvent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

@Mod("autobreakmod")
public class AutoBreakMod {
    private static final Logger LOGGER = LogManager.getLogger();

    public AutoBreakMod() {
        MinecraftForge.EVENT_BUS.register(this);
    }

    @Mod.EventBusSubscriber(modid = "autobreakmod", bus = Mod.EventBusSubscriber.Bus.MOD)
    public static class ModEventSubscriber {
        @SubscribeEvent
        public static void onClientSetup(FMLClientSetupEvent event) {
            // Ничего не нужно делать в этом методе
        }

        @SubscribeEvent
        public static void onPlayerSPPushOutOfBlocks(PlayerSPPushOutOfBlocksEvent event) {
            Minecraft mc = Minecraft.getInstance();
            int radius = 3; // Радиус, в котором будут ломаться блоки

            for (int x = -radius; x <= radius; x++) {
                for (int y = -radius; y <= radius; y++) {
                    for (int z = -radius; z <= radius; z++) {
                        int posX = (int) mc.player.getPosX() + x;
                        int posY = (int) mc.player.getPosY() + y;
                        int posZ = (int) mc.player.getPosZ() + z;

                        mc.playerController.onPlayerDestroyBlock(posX, posY, posZ); // Ломаем блоки
                    }
                }
            }
        }
    }
}
(код взял с инета, за работоспособность не ручаюсь)
 
Код:
@EventHandler
public void handlePlayerMoveEvent(PlayerMoveEvent event) {
        Player player = event.getPlayer();
        if(playerMap.get(player) != null) {
            int radius = 3;
            for (int x = -radius; x <= radius; x++) {
                for (int y = -radius; y <= radius; y++) {
                    for (int z = -radius; z <= radius; z++) {
                        int posX = (int) player.getLocation().getX() + x;
                        int posY = (int) player.getLocation().getY() + y;
                        int posZ = (int) player.getLocation().getZ() + z;

                        player.sendBlockDamage(new Location(player.getWorld(), posX, posY, posZ), 0.5f);
                    }
                }
            }
        }
    }
Сделал так, но не видно прогресса, можно заметить как ломаются лишь один-два блока.
 
Сделал так, но не видно прогресса, можно заметить как ломаются лишь один-два блока.

Попробуй так


Код:
 for (Player player : Bukkit.getOnlinePlayers()) {
            int radiusSquared = radius * radius;

            for (int x = -radius; x <= radius; x++) {
                for (int y = -radius; y <= radius; y++) {
                    for (int z = -radius; z <= radius; z++) {
                        if ((x * x) + (y * y) + (z * z) <= radiusSquared) {
                            int posX = (int) player.getLocation().getX() + x;
                            int posY = (int) player.getLocation().getY() + y;
                            int posZ = (int) player.getLocation().getZ() + z;
                            player.sendBlockDamage(new Location(player.getWorld(), posX, posY, posZ), 0.5f);
                        }
                    }
                }
            }
        }
 
Попробуй так


Код:
 for (Player player : Bukkit.getOnlinePlayers()) {
            int radiusSquared = radius * radius;

            for (int x = -radius; x <= radius; x++) {
                for (int y = -radius; y <= radius; y++) {
                    for (int z = -radius; z <= radius; z++) {
                        if ((x * x) + (y * y) + (z * z) <= radiusSquared) {
                            int posX = (int) player.getLocation().getX() + x;
                            int posY = (int) player.getLocation().getY() + y;
                            int posZ = (int) player.getLocation().getZ() + z;

                            player.getWorld().getBlockAt(posX, posY, posZ).breakNaturally();
                        }
                    }
                }
            }
        }
Работать то оно работает, но мне нужно не сломать блок, а создать вид что блок ломается, я поэтому и использовал Player#sendBlockDamage();
 
Работать то оно работает, но мне нужно не сломать блок, а создать вид что блок ломается, я поэтому и использовал Player#sendBlockDamage();
Попробуй в читах с открытыми исходниками поискать код функции Nuker. Там прям точно как ты сказал все работает, но блок ломается. Но я думаю будет реально сделать проверку на то что если блок почти сломался то эффект пойдет заново.
 
Клиент и сервер различаются. Можешь отправлять пакеты разрушения блоков, а как и какой пакет глянь в плагине Block Damage (срц нет, но в целом при декомпиле все остается понятным)
 
Клиент и сервер различаются. Можешь отправлять пакеты разрушения блоков, а как и какой пакет глянь в плагине Block Damage (срц нет, но в целом при декомпиле все остается понятным)
Спасибо, закрыто.
 
Статус
Закрыто для дальнейших ответов.

Поделиться этой страницей

Назад
Верх