RewardKill.java v1.0
玩家击杀给予奖励,并让被击杀者随机丢失物品,支持/un命令控制钻石和铁锭概率
命令列表
- un设置奖励概率命令(/un diamond 概率 或 /un iron 概率)
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("概率配置文件保存失败!");
}
}
}