以下是一个用Java编写的Bukkit 1.12插件,使用PlotSquared API来管理菜单功能,并包含地皮合并功能,并根据实际情况扣除金币。

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;

import com.plotsquared.bukkit.util.BukkitUtil;
import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.PlotId;
import com.plotsquared.core.plot.flag.GlobalFlag;
import com.plotsquared.core.plot.flag.PlotFlag;
import com.plotsquared.core.plot.flag.registry.FlagRegistry;
import com.plotsquared.core.util.Permission;
import com.plotsquared.core.util.math.MathUtil;

public class PlotManagementPlugin extends JavaPlugin {
    private static final String MENU_TITLE = "Plot Management Menu";
    private static final int MENU_SIZE = 9;

    private FlagRegistry flagRegistry;

    @Override
    public void onEnable() {
        flagRegistry = BukkitUtil.getFlagRegistry();
        registerMergeFlag();
        getLogger().info("Plot Management Plugin enabled.");
    }

    @Override
    public void onDisable() {
        getLogger().info("Plot Management Plugin disabled.");
    }

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if (!(sender instanceof Player)) {
            sender.sendMessage(ChatColor.RED + "Only players can use this command.");
            return true;
        }

        Player player = (Player) sender;

        if (command.getName().equalsIgnoreCase("plotmanage")) {
            if (!player.hasPermission("plotmanagement.menu")) {
                player.sendMessage(ChatColor.RED + "You do not have permission to use this command.");
                return true;
            }

            openManagementMenu(player);
            return true;
        }

        return false;
    }

    private void openManagementMenu(Player player) {
        Inventory menu = Bukkit.createInventory(null, MENU_SIZE, MENU_TITLE);

        ItemStack mergeButton = new ItemStack(Material.IRON_BLOCK);
        ItemStack closeButton = new ItemStack(Material.BARRIER);

        // 设置合并按钮的名称和Lore
        mergeButton.getItemMeta().setDisplayName(ChatColor.GREEN + "Merge Plots");
        mergeButton.getItemMeta().setLore(
                ChatColor.GRAY + "Merge your current plot",
                ChatColor.GRAY + "with an adjacent plot.");

        // 设置关闭按钮的名称
        closeButton.getItemMeta().setDisplayName(ChatColor.RED + "Close");

        // 将按钮添加到菜单中
        menu.setItem(3, mergeButton);
        menu.setItem(8, closeButton);

        player.openInventory(menu);
    }

    private void registerMergeFlag() {
        GlobalFlag mergeFlag = flagRegistry.registerGlobalFlag("merge", Permission.BUILD, "Allow plot merging.");

        mergeFlag.getHandler().register(PlotFlag.CLICK, (plot, player, location, info) -> {
            PlotId mergeTargetId = plot.getIntersectedPlots().stream()
                    .filter(p -> p.isAdded(plot))
                    .findFirst()
                    .map(Plot::getId)
                    .orElse(null);

            if (mergeTargetId == null) {
                player.sendMessage(ChatColor.RED + "There is no adjacent plot to merge with.");
                return false;
            }

            Plot mergeTarget = plot.getArea().getPlot(mergeTargetId);

            if (plot.getArea() != mergeTarget.getArea()) {
                player.sendMessage(ChatColor.RED + "The adjacent plot is not in the same area.");
                return false;
            }

            // 确保两个地皮的所有者相同
            if (!plot.getOwners().equals(mergeTarget.getOwners())) {
                player.sendMessage(ChatColor.RED + "The adjacent plot does not have the same owner.");
                return false;
            }

            // 检查玩家是否有足够的金币来合并地皮
            int mergeCost = 100; // 合并地皮的金币费用
            int playerCoins = 0; // 玩家的金币数量,根据实际情况获取

            if (playerCoins < mergeCost) {
                player.sendMessage(ChatColor.RED + "You do not have enough coins to merge the plots.");
                return false;
            }

            // 扣除金币
            // deductCoins(player, mergeCost); // 根据实际情况扣除金币

            // 合并地皮
            plot.merge(mergeTarget);
            player.sendMessage(ChatColor.GREEN + "Plots merged successfully.");
            return true;
        });
    }
}

请注意,上述代码假设您已经正确设置了PlotSquared插件,并且已经将其添加到您的项目依赖中。在代码中有一些需要根据实际情况进行替换的部分,如获取玩家金币数量和扣除金币的逻辑。您需要根据您自己的经济插件或其他方式来实现这些功能。

此外,您还需要根据您自己的需求更改菜单中按钮的图标和功能。上述代码仅提供了一个示例,您可以根据自己的需求进行修改


原文地址: https://www.cveoy.top/t/topic/h7aX 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录