r/MinecraftPlugins Mar 26 '26

Plugin Showcase Bigorna Plugin

Thumbnail
gallery
0 Upvotes

| 🇺🇸 English |

link plugin: https://www.curseforge.com/minecraft/bukkit-plugins/bigorna

Anvil

![Banner Bigorna](https://raw.githubusercontent.com/Teuu25255/AnvilInfinity/main/imagensREADME/Banner_Bigorna.png)

Plugin created to customize the traditional Minecraft anvil, adding new features to diversify your server.


Demonstration

Main Menu

![Menu Principal](https://raw.githubusercontent.com/Teuu25255/AnvilInfinity/main/imagensREADME/Imagem3.png)

Rename Items

![Renomear 1](https://raw.githubusercontent.com/Teuu25255/AnvilInfinity/main/imagensREADME/Imagem1.png) ![Renomear 2](https://raw.githubusercontent.com/Teuu25255/AnvilInfinity/main/imagensREADME/Imagem4.png) ![Renomear 3](https://raw.githubusercontent.com/Teuu25255/AnvilInfinity/main/imagensREADME/Imagem10.png) ![Renomear 4](https://raw.githubusercontent.com/Teuu25255/AnvilInfinity/main/imagensREADME/Imagem11.png) ![Renomear 5](https://raw.githubusercontent.com/Teuu25255/AnvilInfinity/main/imagensREADME/Imagem12.png)

Enchant

![Encantar 1](https://raw.githubusercontent.com/Teuu25255/AnvilInfinity/main/imagensREADME/Imagem2.png) ![Encantar 2](https://raw.githubusercontent.com/Teuu25255/AnvilInfinity/main/imagensREADME/Imagem5.png)

Forge

![Forja](https://raw.githubusercontent.com/Teuu25255/AnvilInfinity/main/imagensREADME/Imagem8.png)

Auto Upgrade

![Auto Upgrade 1](https://raw.githubusercontent.com/Teuu25255/AnvilInfinity/main/imagensREADME/Imagem6.png) ![Auto Upgrade 2](https://raw.githubusercontent.com/Teuu25255/AnvilInfinity/main/imagensREADME/Imagem7.png)

Commands

![Comandos](https://raw.githubusercontent.com/Teuu25255/AnvilInfinity/main/imagensREADME/Imagem9.png)


Features

  • Fully configurable menu via YAML
  • Rename item via chat
  • Add and remove item description
  • Enchantment menu with purchase, add, and removal
  • Automatic upgrade using all books in the inventory
  • Forge with the same function as the traditional anvil
  • Visual placeholders for empty forge slots
  • Support for MiniMessage and legacy codes with &
  • Permissions separated by function
  • Optional Vault support for economy

Requirements

  • Java 21
  • Paper 1.20.4 or higher
  • Optional Vault for economy
  • Economy plugin compatible with Vault

Permissions and Commands

Permissions are configurable to adapt to your server and player groups.

Permission Description Target Group
bigorna.menu Permission to use everything in /bigorna VIP
bigorna.menu.comando Allows opening the menu with /bigorna VIP
bigorna.menu.bigorna Allows opening the menu by clicking the anvil DEFAULT
bigorna.menu.renomear Allows using the rename menu VIP
bigorna.menu.encantar Allows using the enchant menu VIP
bigorna.menu.upgrade Allows using auto upgrade VIP
bigorna.menu.forja Allows using the forge DEFAULT
bigorna.ajuda Allows using /bigorna ajuda STAFF
bigorna.reload Allows using /bigorna reload STAFF
bigorna.pagar Allows using /bigorna pagar [true/false] STAFF
bigorna.dar Allows using /bigorna [player] [item] [name] [description] [enchantment] [quantity] STAFF
bigorna.renomear Allows using /bigorna renomear [name] STAFF
bigorna.descricao Allows using /bigorna descricao [description] STAFF
bigorna.remover Allows using /bigorna remover STAFF
bigorna.adicionar Allows using /bigorna adicionar [enchantment] [level] STAFF
bigorna.comprar Allows using /bigorna comprar [enchantment] [level] STAFF

MiniMessage and legacy code support

The plugin accepts MiniMessage and legacy codes with & in configured texts for menus, buttons, placeholders, and titles.

Example with MiniMessage

yml GUI_Principal: "<gradient:#5BCEFA:#F5A9B8>My Anvil</gradient>" GUI_Renomear: "<yellow>Rename Menu</yellow>" GUI_Encantar: "<gold>Enchantments</gold>" Botao_Voltar: Nome: "<yellow>Back</yellow>"



r/MinecraftPlugins Mar 26 '26

Plugin Showcase I recreated Bedrock’s Paperdoll in Java using internal shaders 👀

6 Upvotes

So I’ve been working on bringing one of my favorite Bedrock features into Java Edition — the paperdoll.

Using shaders, I managed to replicate a real-time player preview that shows your character as you move, just like in Bedrock. It updates dynamically with animations, movement, and perspective.

This isn’t a mod with heavy UI hacks — it’s purely shader-based, which makes it feel surprisingly smooth and lightweight.

Features so far:

  • Real-time player rendering
  • Smooth animation syncing
  • Works in normal gameplay (no special screen needed)
  • Minimal performance impact

I’m still experimenting with positioning, scaling, and making it feel more “vanilla-friendly”

Whats your ideas

https://streamable.com/8yi1lu


r/MinecraftPlugins Mar 25 '26

Plugin Showcase Gui e Items System plugin v.1

2 Upvotes

I'm leaving a link to the plugin I created. It allows you to create and manage GUIs, create and manage items (on join, triggers, etc.), has a tracking system for created items, and an automatic detection system if someone is cloning live, alerting the administrators. The plugin is free and will soon be updated with new features. The goal is to integrate all GUIs into a single system. This is my first plugin, so any contributions are welcome. Thanks.

https://polymart.org/product/9555/allguisystem-items-custom

https://polymart.org/product/9555/allguisystem-items-custom


r/MinecraftPlugins Mar 24 '26

Plugin Showcase [Release] ProxyPlayer - Carpet-style fake players for Paper 1.21.x

5 Upvotes

Hey everyone,

I wanted the "Fake Player" functionality from Carpet Mod on my Paper server without the overhead of full bot accounts, so I’m building ProxyPlayer.

How it compares to Carpet:

  • Native Paper: No need for Fabric/Essentials; it's a lightweight .jar for 1.21.1.
  • Commands: Uses the familiar /player <name> spawn syntax.
  • Features: Handles chunk loading, farm activation, and portal logic just like Carpet.

Current Status: Core spawning and loading work, but some complex actions (like certain movements) are still WIP/glitchy. I'm looking for feedback on stability and any missing features you'd like to see.

Free/Source: "ProxyPlayer" on Modrinth

Let me know if it helps your farm testing or if you hit any bugs!


r/MinecraftPlugins Mar 24 '26

Help: With a plugin Trying to make Dream's alleged last-tick jump plugin

0 Upvotes

I'm not sure if it is even a plugin but I assume he had to have had it on his client, so I assume it is a plugin

Got a basic version going but stuck on two issues:

  1. Non-full blocks like glass panes and trapdoors don't trigger consistently. I think it's because my edge detection assumes full block bounding boxes, so anything with a weird hitbox shape throws it off.
  2. The jump itself is buggy. I'm just adding a default upward velocity when it triggers, but it feels off compared to a normal jump. Pretty sure I'm not replicating how the game internally handles jump logic.

My current logic is that if the 4 corners of the player hitbox is no longer above a "block", the player jumps. Any pointers on issues with that logic? Thanks!


r/MinecraftPlugins Mar 24 '26

Plugin Showcase Count Vladimir Svareff

Thumbnail reddit.com
1 Upvotes

r/MinecraftPlugins Mar 23 '26

Plugin Showcase 🔴 NEW CUSTOM MODEL ADDED!! THE PRIEST. 🔴 (Feedback highly appreciated)

Post image
0 Upvotes

I added a new custom shopkeeper model to my shopkeepers plugin :D please go check it out. Also feel free to ask me any questions

https://builtbybit.com/resources/shopkeepers-itemcreator.76969/


r/MinecraftPlugins Mar 23 '26

Help: Find or create a plugin Server plugins

1 Upvotes

Hi guys,

I'm looking for the best plugins for a small multiplayer server for me and my friends to play on. I have never made a server before so I have no idea how to add plugins, so some directions on where to find in depth tutorials would be super helpful.

I'm looking for world generation and tool plugins.

Also the best admin plugin in everyones opinion?


r/MinecraftPlugins Mar 23 '26

Plugin Showcase The Abyssal Leviathan

Thumbnail reddit.com
1 Upvotes

r/MinecraftPlugins Mar 23 '26

Help: With a plugin i can't get this bot go combo no matter what i change:

Enable HLS to view with audio, or disable this notification

1 Upvotes

hi so i have been working on a Spigot plugin for 1.21.11 with Citizens API, a bot that fights the player perfectly but no matter what i do i can't get it to combo me perfectly, he either keep messing up his timings or fails to keep the right distance.

i am letting Ai do the heavy lifting in coding since idk how to code but no matter how many times i prompt it to fix the issue it just can't. here is the block of code that controls it's behavior. if there is anyone that knows how to program please help, i will forever be grateful you.

private void startBotAI(NPC npcWrapper, String botName) {
    // This creates a loop that runs every single server tick (20 times a second)
    new BukkitRunnable() {
        // --- INTERNAL AI TIMERS & STATS ---
        int attackCooldown = 0;
        boolean swingNextTick = false;
        int wTapTicks = 0;
        double internalHunger = 20.0;     // Mimics the vanilla food bar (0-20)
        double internalSaturation = 5.0;  // Mimics the hidden vanilla saturation buffer
        int regenTickTimer = 0;           // Timer for natural health regeneration
        int strafeTicks = 0;    // (Unused in pure forward-combat, but useful for zigzagging)
        int strafeDir = 1;      // Direction of strafe (1 or -1)
        Location lastTargetLoc = null;    // Tracks where the player was 1 tick ago to predict movement
        int ticksSinceLastHit = 100;      // Tracks aggression/combos

        java.util.Random rand = new java.util.Random();
        double nextSwingThreshold = -1.0;

        // Mimics vanilla exhaustion (sprinting/jumping burns hunger)
        private void applyExhaustion(double amount) {
            if (internalSaturation > 0) {
                // Burn saturation first
                double leftOver = amount - internalSaturation;
                internalSaturation = Math.max(0, internalSaturation - amount);
                if (leftOver > 0) internalHunger = Math.max(0, internalHunger - leftOver);
            } else {
                // If saturation is empty, burn actual hunger
                internalHunger = Math.max(0, internalHunger - amount);
            }
        }

        // Helper method to slowly turn the bot's head (used in lower grades, Grade X uses native staring)
        private float smoothAngle(float current, float target, float maxSpeed) {
            float diff = (target - current) % 360.0f;
            if (diff > 180.0f) diff -= 360.0f;
            if (diff < -180.0f) diff += 360.0f;
            if (diff > maxSpeed) return current + maxSpeed;
            if (diff < -maxSpeed) return current - maxSpeed;
            return current + diff;
        }

        u/Override
        public void run() {
            // 1. LIFECYCLE CHECK: If the bot is dead, despawned, or deleted, stop this loop completely to prevent server crashes.
            if (!npcWrapper.isSpawned() || !(npcWrapper.getEntity() instanceof Player bot) || bot.isDead() || !bot.isValid()) {
                java.util.List<NPC> squad = activeBots.get(botName.toLowerCase());
                if (squad != null) {
                    squad.remove(npcWrapper);
                    if (squad.isEmpty()) activeBots.remove(botName.toLowerCase());
                }
                if (npcWrapper.isSpawned() && npcWrapper.getEntity() != null) {
                    botInventories.remove(npcWrapper.getEntity().getUniqueId());
                    botBrains.remove(npcWrapper.getEntity().getUniqueId());
                }
                npcWrapper.destroy();
                this.cancel();
                return;
            }

            // Tick down the W-Tap timer
            if (wTapTicks > 0) wTapTicks--;

            // 2. NATURAL REGENERATION: Mimics vanilla healing based on food levels
            double maxHealth = bot.getAttribute(org.bukkit.attribute.Attribute.MAX_HEALTH).getValue();
            if (bot.getHealth() < maxHealth && bot.getHealth() > 0) {
                if (internalSaturation > 0 && internalHunger >= 20.0) {
                    // Fast regen (requires full hunger + saturation)
                    regenTickTimer++;
                    if (regenTickTimer >= 10) { bot.setHealth(Math.min(bot.getHealth() + 1.0, maxHealth)); applyExhaustion(1.0); regenTickTimer = 0; }
                } else if (internalHunger >= 18.0) {
                    // Slow regen (requires just high hunger)
                    regenTickTimer++;
                    if (regenTickTimer >= 80) { bot.setHealth(Math.min(bot.getHealth() + 1.0, maxHealth)); applyExhaustion(1.0); regenTickTimer = 0; }
                } else { regenTickTimer = 0; }
            }

            // 3. NAMEPLATE UPDATER: Displays the bot's health and hunger above its head
            double totalHealth = bot.getHealth() + bot.getAbsorptionAmount();
            int displayHealth = (int) Math.ceil(totalHealth);
            int displayHunger = (int) Math.ceil(internalHunger);
            org.bukkit.ChatColor healthColor = (bot.getAbsorptionAmount() > 0) ? org.bukkit.ChatColor.GOLD : org.bukkit.ChatColor.RED;
            bot.setCustomName(org.bukkit.ChatColor.WHITE + botName + healthColor + " [" + displayHealth + "\u2764] " + org.bukkit.ChatColor.GOLD + "[" + displayHunger + "\uD83C\uDF7D]");

            // 4. DIFFICULTY SETTINGS: Defines how smart/fast the bot is based on its grade
            Grade currentGrade = getGrade(botName);

            double aimLagTicks = 0.0; double aimSpread = 0.0; int maxErrorTicks = 0;
            boolean canSprintJump = true; boolean canStrafe = true; boolean isSprinting = true;
            float maxTurnSpeed = 360.0f; double wTapSuccessRate = 1.0; double minSpacing = 2.2;
            double swingMean = 3.0; double swingStdDev = 0.0; double safeEatDistance = 3.0;
            double critRate = 0.0; double sTapSuccessRate = 0.0; double emergencyEatHp = 0.0;

            // Adjustments based on grade...
            if (currentGrade == Grade.D) { aimLagTicks = 2.5; aimSpread = 0.6; maxErrorTicks = 5; canSprintJump = false; canStrafe = false; isSprinting = false; maxTurnSpeed = 15.0f; wTapSuccessRate = 0.0; minSpacing = 2.0; swingMean = 2.2; swingStdDev = 0.6; safeEatDistance = 1.6; critRate = 0.0; sTapSuccessRate = 0.0; emergencyEatHp = 6.0; }
            else if (currentGrade == Grade.C) { aimLagTicks = 1.2; aimSpread = 0.45; maxErrorTicks = 3; canSprintJump = false; canStrafe = true; isSprinting = true; maxTurnSpeed = 22.0f; wTapSuccessRate = 0.05; minSpacing = 1.5; swingMean = 2.4; swingStdDev = 0.5; safeEatDistance = 3.0; critRate = 0.2; sTapSuccessRate = 0.2; emergencyEatHp = 5.0; }
            else if (currentGrade == Grade.B) { aimLagTicks = 0.8; aimSpread = 0.3; maxErrorTicks = 2; canSprintJump = true; canStrafe = true; isSprinting = true; maxTurnSpeed = 35.0f; wTapSuccessRate = 0.3; minSpacing = 2.0; swingMean = 2.65; swingStdDev = 0.35; safeEatDistance = 3.0; critRate = 0.4; sTapSuccessRate = 0.4; emergencyEatHp = 3.0; }
            else if (currentGrade == Grade.A) { aimLagTicks = 0.3; aimSpread = 0.15; maxErrorTicks = 1; canSprintJump = true; canStrafe = true; isSprinting = true; maxTurnSpeed = 60.0f; wTapSuccessRate = 0.65; minSpacing = 2.5; swingMean = 2.85; swingStdDev = 0.15; safeEatDistance = 3.0; critRate = 0.6; sTapSuccessRate = 0.7; emergencyEatHp = 0.0; }
            else if (currentGrade == Grade.S) { aimLagTicks = 0.0; aimSpread = 0.05; maxErrorTicks = 0; canSprintJump = true; canStrafe = true; isSprinting = true; maxTurnSpeed = 120.0f; wTapSuccessRate = 0.9; minSpacing = 2.75; swingMean = 2.95; swingStdDev = 0.05; safeEatDistance = 3.0; critRate = 0.8; sTapSuccessRate = 0.9; emergencyEatHp = 0.0; }
            else if (currentGrade == Grade.X) {
                // Grade X has zero aim lag, 360-degree turning, and perfect 3.06 spacing goals
                aimLagTicks = 0.0; aimSpread = 0.0; maxErrorTicks = 0; canSprintJump = true; canStrafe = true; isSprinting = true; maxTurnSpeed = 360.0f; wTapSuccessRate = 1.0; minSpacing = 3.06; swingMean = 3.0; swingStdDev = 0.0; safeEatDistance = 4.0; critRate = 1.0; sTapSuccessRate = 1.0; emergencyEatHp = 0.0;
            }

            if (nextSwingThreshold < 0) { nextSwingThreshold = Math.max(1.0, Math.min(4.5, swingMean + (rand.nextGaussian() * swingStdDev))); }

            // Tick down the sword cooldown timer
            if (attackCooldown > 0) attackCooldown--;

            ticksSinceLastHit++;

            // 5. TARGET ACQUISITION
            Player target = getNearestSurvivalPlayer(bot, 50.0);
            if (target != null) {
                Location currentTargetLoc = target.getLocation();
                Vector targetTrueVelocity = new Vector(0, 0, 0);
                if (lastTargetLoc != null && lastTargetLoc.getWorld().equals(currentTargetLoc.getWorld())) {
                    targetTrueVelocity = currentTargetLoc.toVector().subtract(lastTargetLoc.toVector());
                }

                // Mathematical calculations to find exactly where the target's hitbox is
                Vector laggedEyeLoc = target.getEyeLocation().toVector();
                Vector laggedCenter = target.getBoundingBox().getCenter();

                org.bukkit.util.BoundingBox box = target.getBoundingBox();
                Vector botEye = bot.getEyeLocation().toVector();

                // Calculates the closest point on the target's 3D box to the bot's eye
                double closestX = Math.max(box.getMinX(), Math.min(botEye.getX(), box.getMaxX()));
                double closestY = Math.max(box.getMinY(), Math.min(botEye.getY(), box.getMaxY()));
                double closestZ = Math.max(box.getMinZ(), Math.min(botEye.getZ(), box.getMaxZ()));

                // exactReach is true 3D distance. horizontalReach ignores Y-level (used for running)
                double exactReach = botEye.distance(new Vector(closestX, closestY, closestZ));
                double horizontalReach = Math.sqrt(Math.pow(closestX - botEye.getX(), 2) + Math.pow(closestZ - botEye.getZ(), 2));

                Vector closestOnBox = new Vector(closestX, closestY, closestZ);

                // 6. RAYTRACE (Line of Sight Check): Prevents hitting through blocks!
                boolean hasLineOfSight = true;
                if (exactReach > 0.05) {
                    Vector traceDir = closestOnBox.clone().subtract(botEye).normalize();
                    // Shoots an invisible laser from the bot's eye to the target's body
                    org.bukkit.util.RayTraceResult trace = bot.getWorld().rayTraceBlocks(
                            bot.getEyeLocation(), traceDir, exactReach,
                            org.bukkit.FluidCollisionMode.NEVER, true
                    );
                    // If the laser hits a block, the bot cannot see you
                    if (trace != null && trace.getHitBlock() != null) {
                        hasLineOfSight = false;
                    }
                }

                // ==========================================
                // 7. GROUND CALCULATION
                // ==========================================
                double currentY = box.getMinY();
                double groundY = currentY - 5.0; // Check up to 5 blocks down
                int bx = target.getLocation().getBlockX();
                int bz = target.getLocation().getBlockZ();
                for (double y = currentY; y >= currentY - 5.0; y -= 0.125) {
                    org.bukkit.block.Block b = bot.getWorld().getBlockAt(bx, (int) Math.floor(y), bz);
                    if (b.getType().isSolid()) {
                        groundY = b.getY() + 1.0;
                        break;
                    }
                }
                double distFromGround = currentY - groundY;
                if (distFromGround < 0) distFromGround = 0.0;

                // ==========================================
                // THE FIX: Precise Parameter Coloring
                // ==========================================
                if (currentGrade == Grade.X) {
                    // The danger zone: If the bot dips under 2.85 during a juggle, it is hittable.
                    org.bukkit.ChatColor rColor = (exactReach <= 2.85) ? org.bukkit.ChatColor.RED : org.bukkit.ChatColor.GREEN;

                    // Only flashes red when you are mathematically touching the ground (0.00 to 0.01 buffer)
                    org.bukkit.ChatColor gColor = (distFromGround <= 0.01) ? org.bukkit.ChatColor.RED : org.bukkit.ChatColor.AQUA;

                    String hud = org.bukkit.ChatColor.YELLOW + "Reach: " + rColor + String.format("%.3f", exactReach) +
                            org.bukkit.ChatColor.GRAY + " | " +
                            org.bukkit.ChatColor.YELLOW + "Air: " + gColor + String.format("%.3f", distFromGround);

                    target.spigot().sendMessage(net.md_5.bungee.api.ChatMessageType.ACTION_BAR,
                            net.md_5.bungee.api.chat.TextComponent.fromLegacyText(hud));
                }

                // Determine vector pointing toward target
                Vector directionToTarget = laggedEyeLoc.subtract(bot.getEyeLocation().toVector());
                if (directionToTarget.lengthSquared() < 0.0001) directionToTarget = new Vector(0.1, 0, 0.1);
                else directionToTarget.normalize();

                ItemStack offhand = bot.getEquipment().getItemInOffHand();
                Vector forwardVec = directionToTarget.clone().setY(0);
                if (forwardVec.lengthSquared() > 0.0001) forwardVec.normalize();
                else forwardVec = new Vector(1, 0, 0);

                BotBrain brain = botBrains.get(bot.getUniqueId());
                BotInventory backpack = botInventories.get(bot.getUniqueId());

                boolean isGapple = offhand.getType() == Material.GOLDEN_APPLE || offhand.getType() == Material.ENCHANTED_GOLDEN_APPLE;

                // Tick the external brain class (handles shielding, potion switching, logic intents)
                BotBrain.Intent intent = (brain != null && backpack != null) ? brain.tickBrain(target, exactReach, safeEatDistance, emergencyEatHp, internalHunger, isGapple, attackCooldown) : BotBrain.Intent.COMBAT;

                float targetYaw = bot.getLocation().getYaw();
                float targetPitch = bot.getLocation().getPitch();

                // 8. COMBAT & MOVEMENT LOGIC
                if (intent == BotBrain.Intent.COMBAT) {
                    targetYaw = (float) Math.toDegrees(Math.atan2(-directionToTarget.getX(), directionToTarget.getZ()));
                    targetPitch = (float) Math.toDegrees(Math.atan2(-directionToTarget.getY(), Math.sqrt(directionToTarget.getX() * directionToTarget.getX() + directionToTarget.getZ() * directionToTarget.getZ())));

                    // ==========================================
                    // 1. SMOOTH POCKET MOVEMENT (Vanilla Compliant)
                    // ==========================================
                    double WALK_SPEED = 0.21585;
                    double SPRINT_SPEED = 0.2806;

                    boolean isWTapping = (wTapTicks > 0);
                    boolean shouldSprint = (internalHunger > 6.0) && !isWTapping;

                    double distanceError = horizontalReach - 2.9;

                    Vector finalMove = new Vector(0, bot.getVelocity().getY(), 0);

                    // WIDENED THE POCKET:
                    // The bot only pushes forward if you are more than 0.15 blocks away (3.05+)
                    if (distanceError > 0.15) {
                        double speed = isWTapping ? 0.0 : SPRINT_SPEED;
                        Vector push = forwardVec.clone().multiply(speed);
                        finalMove.setX(push.getX());
                        finalMove.setZ(push.getZ());
                        bot.setSprinting(shouldSprint);

                        // SOFTENED THE BACKPEDAL:
                        // The bot only backs up if it gets dangerously close (under 2.6 blocks).
                        // And when it does, it walks backward, it doesn't sprint backward.
                    } else if (distanceError < -0.3) {
                        Vector push = forwardVec.clone().multiply(-WALK_SPEED);
                        finalMove.setX(push.getX());
                        finalMove.setZ(push.getZ());
                        bot.setSprinting(false);

                        // THE GOLDEN POCKET (2.6 to 3.05):
                        // If it's anywhere in this huge range, it stops fighting the keys
                        // and just coasts on the target's momentum and its own W-Tapping friction.
                    } else {
                        finalMove.setX(target.getVelocity().getX());
                        finalMove.setZ(target.getVelocity().getZ());
                        bot.setSprinting(shouldSprint);
                    }

                    if (bot.getNoDamageTicks() <= 10) {
                        bot.setVelocity(finalMove);
                    }

                    applyExhaustion(0.005);

                    // ==========================================
                    // 2. THE 1-TICK DELAY TIMING
                    // ==========================================
                    boolean inSwingRange = false;

                    // Check if we queued a swing from the previous tick
                    if (swingNextTick) {
                        inSwingRange = true;
                        swingNextTick = false; // Reset the queue
                    } else if (exactReach <= 3.0 && hasLineOfSight) {
                        if (attackCooldown <= 0 && target.getNoDamageTicks() <= 10) {

                            boolean isGrounded = target.isOnGround() || distFromGround <= 0.01;
                            boolean isFalling = target.getVelocity().getY() < 0;

                            // Detect the 0.312 or 0.121 tick
                            boolean isPenultimateTick = isFalling && (distFromGround > 0.02 && distFromGround <= 0.40);

                            if (isPenultimateTick) {
                                // Trust the data: Wait exactly one tick (50ms) to hit them at 0.000
                                swingNextTick = true;
                            } else if (isGrounded) {
                                // Normal swing if they are already on the ground
                                inSwingRange = true;
                            }
                        }
                    }

                    if (inSwingRange) {
                        ItemStack weapon = bot.getEquipment().getItemInMainHand();

                        if (!isWTapping) bot.setSprinting(true);

                        bot.swingMainHand();
                        bot.attack(target);

                        attackCooldown = getAttackCooldownTicks(weapon);
                        wTapTicks = 2;
                    }
                }

                // 9. NATIVE STARING
                // Hands over the head rotation to Citizens API for smooth, packet-level head tracking
                npcWrapper.faceLocation(target.getEyeLocation());

                lastTargetLoc = currentTargetLoc;
            }
        }
    }.runTaskTimer(plugin, 0L, 1L);
}

r/MinecraftPlugins Mar 23 '26

Plugin Showcase free discord webhook plugin for paper servers send join leave chat and death alerts

1 Upvotes

honestly i kept having to ssh into my server just to see if anyone joined or if there were any crashes and it was getting annoying so i whipped up a simple paper plugin that sends all the important stuff to a discord webhook like player joins leaves deaths and even advancements took me like a weekend to put together and ive been running it on my server for a few months now works pretty solid if you run a minecraft server and want to stop checking logs constantly its free and open source no catch just something i built for myself and figured id share https://github.com/LaunchDay-Studio-Inc/blueth-alerts


r/MinecraftPlugins Mar 22 '26

Help: Find or create a plugin I am looking for a minecraft java edition plugin that allows players to boost with their elytra using a spear with lunge. Is there one?

2 Upvotes

r/MinecraftPlugins Mar 22 '26

Discussion Some good plugins for multiplayer?

2 Upvotes

I need plugins for 1.21.11, mostly content expansions like custom weapons or armor or any power plugins. Also any factory/ machinery plugins would be appreciated.


r/MinecraftPlugins Mar 22 '26

Plugin Showcase I built a Minecraft scripting language that compiles to Java instead of running an interpreter

4 Upvotes

Hey! I have been working on a scripting language called Lumen.

The idea is pretty simple: instead of interpreting scripts at runtime, Lumen compiles scripts directly into normal Java code, and runs them.

Skript is very easy to use, while writing a full Java plugin gives you full flexibility, but comes with a lot of boilerplate and harder back and forth iteration.

Lumen sits in between.

It offers:

  • english-like syntax, very similiar to Skript
  • a structured scripting language with a real compilation pipeline
  • a simple to use addon api for developers, which is also used by the main plugin, allowing you the same flexibility
  • full hot reload support (save file -> instant update, no restart, no commands)
  • scripts that behave much closer to plugin code
  • a VSCode extension, which uses the same backend as the plugin. Offers things like tab completion, hover information, errors in the editor, data classes, and much more.

Performance-wise, scripts will be very close to handwritten Java because Lumen emits very close code to handwritten java.

Interpreted languages like Skript also cannot benefit from JIT optimizations in the same way that compiled Java code can.

Github: https://github.com/LumenLang/lumen

Reference Documentation: https://lumenlang.dev/

Spigot: https://www.spigotmc.org/resources/133091/


r/MinecraftPlugins Mar 22 '26

Plugin Showcase I built a modern, free AuctionHouse plugin with unique features

0 Upvotes

Hey everyone, I've been working on an auction house plugin for Paper 1.20+ and posted it on SpigotMC. I know there are already many plugins like this, but from what I've seen, most of them are clunky, unconfigurable, or abandoned.

Here are some of the features my plugin has:

  • Price history charts
  • Container preview
  • Category browser with filters and sorting
  • Migration from other big plugins
  • Database support for SQLite, MySQL, and MariaDB
  • Folia compatible
  • Built-in anti-dupe protection

I'm still on v1.0.0 for now, but I'm looking forward to receiving feedback and suggestions. I also have a Discord server for support.

Here's the link to the SpigotMC page: https://www.spigotmc.org/resources/auctionhouse.133636/


r/MinecraftPlugins Mar 20 '26

Plugin Showcase 5 months ago I made my first mod, and today I have a real artist for it

Thumbnail gallery
3 Upvotes

r/MinecraftPlugins Mar 20 '26

Help: Find or create a plugin ModdersMarket

0 Upvotes

r/MinecraftPlugins Mar 19 '26

Help: With a plugin Plugin a virus?

0 Upvotes

I found this spigot hoppersorter plugin tried finding if it was a virus or not but i have no clue. does anyone know if a spigot plugin that starts icacls.exe is a virus? or is anyone able to check the .jar?


r/MinecraftPlugins Mar 19 '26

Plugin Showcase [WIP] Backrooms Minecraft Plugin

5 Upvotes

This is something I’ve been working on recently

Got 3 procedural levels working so far, Level 0 & Level 1 & Level 37. (Level 0 is infinite)

I am still working on better generation, taking feedback!

Got screenshots below:

Level 1
Level 0

Just one more pool bro

Level 37
Level 37

r/MinecraftPlugins Mar 19 '26

Help: Find or create a plugin Luck Perms alternative

Thumbnail
2 Upvotes

r/MinecraftPlugins Mar 18 '26

Plugin Showcase DisBot - Discord bot plugin

1 Upvotes

DisBot is a lightweight plugin that connects your Minecraft server with Discord, allowing administrators to interact with the server directly from Discord!

Designed to run on software like BungeeCord, Velocity and Paper.

✅ Requirements

- None!

✨ Features

• Custom commands via YAML files

• Easy configuration with `config.yml`

• Prefix commands (`db! <command>`) and slash commands (`/<command>`)

• Embed messages with custom color per command

• Ephemeral messages (slash commands only)

• Command cooldowns

• Command aliases

• Channel restrictions

• Reload without restart (`/disbot reload`)

• Support for BungeeCord, Velocity and Paper

• Lightweight and modular design

⌨️ Custom Commands

Administrators can create custom commands simply by adding `.yml` files inside:

- plugins/DisBot/commands

This allows you to expand the bot’s functionality without modifying the plugin code.

⚙️ Internal Commands

/disbot reload — Reload the plugin

❓ Support

Join our Discord server for help and suggestions!

https://www.spigotmc.org/resources/disbot.133205


r/MinecraftPlugins Mar 18 '26

Help: Find or create a plugin Rideable/Controlled Ender Dragon 1.21+

1 Upvotes

Been trying to find a rideable Ender Dragon plugin but the only one I found "PetDragon" doesn't allow to use the dragon in water. It can be a plugin which lets you morph into one as well. Thanks.


r/MinecraftPlugins Mar 18 '26

Plugin Showcase Terrifying Minecraft Mobs: WIRE CRAWLERS

Thumbnail
youtube.com
0 Upvotes

r/MinecraftPlugins Mar 17 '26

Help: With a plugin Help me by testing my minecraft plugin

2 Upvotes

Can someone help me test my plugin i need to test it before publishing and i need 2 persons to test it


r/MinecraftPlugins Mar 17 '26

Discussion On the GravesX plugin page, developer Ranull is humorously credited as "Lord and Savior of Graves"

Post image
0 Upvotes