import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.TickEvent.Phase; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.Mod; import net.minecraft.block.Blocks; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.TextFormatting; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @Mod.EventBusSubscriber(modid = "jjk_xopi") public class DomeGenerator { private static final int DOME_RADIUS = 20; private static boolean isGenerating = false; private static int tickCounter = 0; @SubscribeEvent public static void onPlayerTick(TickEvent.PlayerTickEvent event) { if (event.phase == Phase.END) { if (isGenerating) { tickCounter++; if (tickCounter >= 5 * 20) { // 5 seconds (20 ticks per second) generateDome(event.player); isGenerating = false; tickCounter = 0; } } } } @SubscribeEvent public static void onPlayerInteract(PlayerInteractEvent.RightClickEmpty event) { if (event.getPlayer() != null && event.getPlayer().isCreative()) { if (!isGenerating && event.getPlayer().getHeldItemMainhand().getItem() == Items.Barrier_block) { isGenerating = true; tickCounter = 0; } } } private static void generateDome(PlayerEntity player) { World world = player.world; BlockPos playerPos = player.getPosition(); for (int x = -DOME_RADIUS; x <= DOME_RADIUS; x++) { for (int y = -DOME_RADIUS; y <= DOME_RADIUS; y++) { for (int z = -DOME_RADIUS; z <= DOME_RADIUS; z++) { if (x * x + y * y + z * z <= DOME_RADIUS * DOME_RADIUS) { BlockPos pos = playerPos.add(x, y, z); if (world.isAirBlock(pos)) { world.setBlockState(pos, Blocks.Barrier_block.getDefaultState()); } } } } } player.sendMessage(new StringTextComponent("Dome of barriers generated!").mergeStyle(TextFormatting.GREEN)); } }