RewardKill

RewardKill.java v1.0
玩家击杀给予奖励,并让被击杀者随机丢失物品,支持/un命令控制钻石和铁锭概率
作者: ScriptIrc-Engine

命令列表

  • un设置奖励概率命令(/un diamond 概率 或 /un iron 概率)

权限列表

  • rewardkill.admin设置概率权限
package club.scriptirc.rewardkill;

import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.configuration.file.FileConfiguration;
import java.util.*;
import java.io.File;
import java.io.IOException;

/**
 * @pluginName RewardKill
 * @author ScriptIrc-Engine
 * @version 1.0
 * @description 玩家击杀给予奖励,并让被击杀者随机丢失物品,支持/un命令控制钻石和铁锭概率
 * [command]un|设置奖励概率命令(/un diamond 概率  或 /un iron 概率)[/command]
 * [Permission]rewardkill.admin|设置概率权限[/Permission]
 */
public class RewardKill extends JavaPlugin implements Listener {

    private File configFile;
    private FileConfiguration config;
    // 默认概率
    private double diamondProb = 0.5;
    private double ironProb = 0.5;

    @Override
    public void onEnable() {
        // 注册监听器
        Bukkit.getPluginManager().registerEvents(this, this);
        // 加载配置
        loadConfig();
        getLogger().info("RewardKill插件已启用!");
    }

    @Override
    public void onDisable() {
        saveConfigFile();
        getLogger().info("RewardKill插件已关闭!");
    }

    /**
     * 玩家死亡事件判断击杀
     */
    @EventHandler
    public void onPlayerDeath(PlayerDeathEvent event) {
        Player victim = event.getEntity();
        Player killer = victim.getKiller();
        if (killer == null || killer == victim) return;

        // 奖励发放
        double r = Math.random();
        if (r < diamondProb) {
            killer.getInventory().addItem(new ItemStack(Material.DIAMOND, 1));
            killer.sendMessage("§b击杀奖励:获得 1 颗钻石!");
        } else if (r < diamondProb + ironProb) {
            killer.getInventory().addItem(new ItemStack(Material.IRON_INGOT, 1));
            killer.sendMessage("§7击杀奖励:获得 1 个铁锭!");
        } else {
            // 未获奖励
            killer.sendMessage("§e本次击杀未获得额外物品奖励。");
        }

        // 随机让被杀者丢失一个背包物品
        List<Integer> slotList = new ArrayList<>();
        ItemStack[] items = victim.getInventory().getContents();
        for (int i = 0; i < items.length; i++) {
            ItemStack is = items[i];
            if (is != null && is.getType() != Material.AIR) {
                slotList.add(i);
            }
        }
        if (!slotList.isEmpty()) {
            int randomSlot = slotList.get(new Random().nextInt(slotList.size()));
            ItemStack dropItem = items[randomSlot];
            victim.getInventory().setItem(randomSlot, null); // 移除物品
            victim.getWorld().dropItemNaturally(victim.getLocation(), dropItem); // 掉落到地面
            victim.sendMessage("§c你被击杀,随机丢失了一个背包物品。");
        }
    }

    // 指令: /un diamond 概率   或  /un iron 概率
    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        if (!cmd.getName().equalsIgnoreCase("un")) return false;
        if (args.length != 2) {
            sender.sendMessage("§e用法: /un diamond <概率> 或 /un iron <概率> (概率为0-1之间的小数,例如 0.5)");
            return true;
        }
        if (!(sender.hasPermission("rewardkill.admin") || sender.isOp())) {
            sender.sendMessage("§c你没有权限设置概率!");
            return true;
        }
        String type = args[0].toLowerCase();
        double p;
        try {
            p = Double.parseDouble(args[1]);
        } catch (Exception e) {
            sender.sendMessage("§c概率格式错误,请输入0~1的小数。");
            return true;
        }
        if (p < 0 || p > 1) {
            sender.sendMessage("§c概率必须为0-1之间的小数。");
            return true;
        }
        if (type.equals("diamond")) {
            if (p + ironProb > 1.0) {
                sender.sendMessage("§c钻石概率与铁锭概率之和不能超过1!");
                return true;
            }
            diamondProb = p;
            config.set("reward-prob.diamond", diamondProb);
            saveConfigFile();
            sender.sendMessage("§a已将钻石奖励概率设置为: " + diamondProb);
        } else if (type.equals("iron")) {
            if (diamondProb + p > 1.0) {
                sender.sendMessage("§c钻石概率与铁锭概率之和不能超过1!");
                return true;
            }
            ironProb = p;
            config.set("reward-prob.iron", ironProb);
            saveConfigFile();
            sender.sendMessage("§a已将铁锭奖励概率设置为: " + ironProb);
        } else {
            sender.sendMessage("§c参数错误, 只可设置diamond或iron");
        }
        return true;
    }

    /**
     * 加载本地概率配置
     */
    private void loadConfig() {
        configFile = new File(getDataFolder(), "rewardprob.yml");
        if (!configFile.exists()) {
            // 初次生成
            configFile.getParentFile().mkdirs();
            try {
                configFile.createNewFile();
            } catch (IOException e) {
                getLogger().severe("无法创建配置文件!");
            }
        }
        config = YamlConfiguration.loadConfiguration(configFile);
        diamondProb = config.getDouble("reward-prob.diamond", 0.5);
        ironProb = config.getDouble("reward-prob.iron", 0.5);
        // 检查概率和
        if (diamondProb + ironProb > 1.0) {
            diamondProb = 0.5;
            ironProb = 0.5;
            config.set("reward-prob.diamond", 0.5);
            config.set("reward-prob.iron", 0.5);
            saveConfigFile();
        }
    }

    /**
     * 保存概率配置文件
     */
    private void saveConfigFile() {
        try {
            config.save(configFile);
        } catch (IOException e) {
            getLogger().severe("概率配置文件保存失败!");
        }
    }
}

上一篇: GujiBlock下一篇: UIPosts

举报内容

意见反馈