commit a924275cdfc1ea0412e63214f588e9046a14140b
Author: tianyu <32282861@qq.com>
Date: Sat Jul 27 23:08:24 2024 +0800
测试版
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..1884db8
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,40 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### IntelliJ IDEA ###
+.idea/modules.xml
+.idea/jarRepositories.xml
+.idea/compiler.xml
+.idea/libraries/
+*.iws
+*.iml
+*.ipr
+
+### Eclipse ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
+
+### Mac OS ###
+.DS_Store
+/out/
+/.idea/
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..0f9599d
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,42 @@
+
+
+ 4.0.0
+
+ org.example
+ DemonMmKillsDrop
+ 1.0-SNAPSHOT
+
+
+ 8
+ 8
+ UTF-8
+
+
+
+
+ public-rpg
+ https://repo.aurora-pixels.com/repository/public-rpg/
+
+
+
+
+
+ org.spigotmc
+ spigot-api
+ 1.12.2
+
+
+ io.lumine.xikage.mythicmobs
+ MythicMobs
+ 1.12.2
+
+
+ me.Demon.DemonPlugin
+ DemonAPI
+ 1.2.0
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/me/Demon/DemonMmKillsDrop/Event/KillsMobsDropEvent.java b/src/main/java/me/Demon/DemonMmKillsDrop/Event/KillsMobsDropEvent.java
new file mode 100644
index 0000000..3c7e4d3
--- /dev/null
+++ b/src/main/java/me/Demon/DemonMmKillsDrop/Event/KillsMobsDropEvent.java
@@ -0,0 +1,40 @@
+package me.Demon.DemonMmKillsDrop.Event;
+
+import org.bukkit.entity.Player;
+import org.bukkit.event.Event;
+import org.bukkit.event.HandlerList;
+
+public class KillsMobsDropEvent extends Event {
+
+ private static HandlerList handlers = new HandlerList();
+ private Player player;
+ private String item_type;
+ private int item_amount;
+
+ @Override
+ public HandlerList getHandlers(){
+ return handlers;
+ }
+
+ public static HandlerList getHandlerList(){
+ return handlers;
+ }
+
+ public KillsMobsDropEvent(Player player, String item_type, int item_amount){
+ this.player = player;
+ this.item_type = item_type;
+ this.item_amount = item_amount;
+ }
+
+ public Player getPlayer(){
+ return player;
+ }
+
+ public String getItem_type(){
+ return item_type;
+ }
+
+ public int getItem_amount() {
+ return item_amount;
+ }
+}
diff --git a/src/main/java/me/Demon/DemonMmKillsDrop/KillDropAPI.java b/src/main/java/me/Demon/DemonMmKillsDrop/KillDropAPI.java
new file mode 100644
index 0000000..f81b909
--- /dev/null
+++ b/src/main/java/me/Demon/DemonMmKillsDrop/KillDropAPI.java
@@ -0,0 +1,50 @@
+package me.Demon.DemonMmKillsDrop;
+
+import org.bukkit.Material;
+import org.bukkit.configuration.file.FileConfiguration;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.ItemMeta;
+
+import java.util.List;
+
+public abstract class KillDropAPI {
+
+ public static ItemStack getItems(String key, int amount){
+ ItemStack item = new ItemStack(Material.DIAMOND,64);
+ if (Main.ItemsListID.contains(key)) {
+ item = Main.plugin.getConfig().getItemStack("ItemsData."+key).clone();
+ item.setAmount(amount);
+ ItemMeta meta = item.getItemMeta();
+ List lore = meta.getLore();
+ meta.setLore(lore);
+ item.setItemMeta(meta);
+ }
+ return item;
+ }
+
+ //获取今日掉落物数量
+ public static int getDayAmount(String key){
+ int time = Integer.parseInt(Main.getTime("dd"));
+ return Main.dropLogG.getInt("DropItems."+time+"."+key);
+ }
+
+ //增加今日掉落物数量
+ public static void addDayAmount(String key,int amount){
+ int time = Integer.parseInt(Main.getTime("dd"));
+ Main.dropLogG.set("DropItems."+time+"."+key,(getDayAmount(key)+amount));
+ Main.saveDropLogConfig();
+ }
+
+ public static ItemStack getItemData(String key){
+ ItemStack item = new ItemStack(Material.STONE);
+ ItemMeta meta = item.getItemMeta();
+ meta.setDisplayName("§c§l掉落物错误X");
+ item.setItemMeta(meta);
+ FileConfiguration yml = Main.plugin.getConfig();
+ if(yml.getString("ItemsData."+key) != null){
+ item = yml.getItemStack("ItemsData."+key).clone();
+ }
+ return item;
+ }
+
+}
diff --git a/src/main/java/me/Demon/DemonMmKillsDrop/Main.java b/src/main/java/me/Demon/DemonMmKillsDrop/Main.java
new file mode 100644
index 0000000..94408d6
--- /dev/null
+++ b/src/main/java/me/Demon/DemonMmKillsDrop/Main.java
@@ -0,0 +1,252 @@
+package me.Demon.DemonMmKillsDrop;
+
+import me.Demon.DemonMmKillsDrop.listener.ItemBaoHu;
+import me.Demon.DemonMmKillsDrop.listener.KillMobsDrop;
+import org.bukkit.Bukkit;
+import org.bukkit.Material;
+import org.bukkit.Sound;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandSender;
+import org.bukkit.configuration.file.FileConfiguration;
+import org.bukkit.configuration.file.YamlConfiguration;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.inventory.ClickType;
+import org.bukkit.event.inventory.InventoryClickEvent;
+import org.bukkit.inventory.Inventory;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.plugin.java.JavaPlugin;
+
+import java.io.File;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+public class Main extends JavaPlugin implements Listener {
+
+ public static Main plugin;
+ public static double drop_double = 1.0;
+ public static HashMap pps = new HashMap<>();
+ public static HashMap statsMap = new HashMap<>();
+ public static List ItemsListID = new ArrayList<>();
+ public static File Datafile = new File("plugins/DemonMmKillsDrop", "MobsData.yml");
+ public static FileConfiguration DataG = YamlConfiguration.loadConfiguration(Datafile);
+ public static void saveDataConfig(){ try { DataG.save(Datafile); } catch (IOException e) { e.printStackTrace(); } }
+ public static File DropLogfile = new File("plugins/DemonMmKillsDrop", "DropItemLog.yml");
+ public static FileConfiguration dropLogG = YamlConfiguration.loadConfiguration(DropLogfile);
+ public static void saveDropLogConfig(){ try { dropLogG.save(DropLogfile); } catch (IOException e) { e.printStackTrace(); } }
+
+ @Override
+ public void onEnable() {
+ plugin = this;
+ saveDefaultConfig();
+ if(isRefreshUpdata()){
+ dropLogG.set("Todaytime",getTime("yyyy/MM/dd"));
+ int time = Integer.parseInt(getTime("dd"));
+ Main.dropLogG.set("DropItems."+time,null);
+ Main.saveDropLogConfig();
+ Bukkit.getConsoleSender().sendMessage("§d[KillMobDrop] §6已清理今日所有掉落数据~");
+ }
+ Bukkit.getConsoleSender().sendMessage("§b[KillMobDrop] §a插件成功载入Server!");
+ Bukkit.getConsoleSender().sendMessage("§b[KillMobDrop] §a妖魂QQ:1763917516");
+ getServer().getPluginManager().registerEvents(this, this);
+ Bukkit.getPluginManager().registerEvents(new KillMobsDrop(),this);
+ Bukkit.getPluginManager().registerEvents(new ItemBaoHu(),this);
+ if(getConfig().getString("ItemsData") != null) {
+ ItemsListID.addAll(getConfig().getConfigurationSection("ItemsData").getKeys(false));
+ }
+ for (String WorldName : getConfig().getConfigurationSection("MobsDrop").getKeys(false)){
+ int amount = 0;
+ for (String Mob_key : getConfig().getConfigurationSection("MobsDrop."+WorldName).getKeys(false)){
+ Main.pps.put(Mob_key, new MobsPer(Mob_key));
+ amount++;
+ }
+ Bukkit.getConsoleSender().sendMessage("§a- 世界: "+WorldName+" 导入: "+amount+"个怪物");
+ }
+ }
+ public void onDisable() {
+ for (String WorldName : getConfig().getConfigurationSection("MobsDrop").getKeys(false)){
+ int amount = 0;
+ for (String Mob_key : getConfig().getConfigurationSection("MobsDrop."+WorldName).getKeys(false)) {
+ if (Main.pps.get(Mob_key) != null) {
+ Main.pps.get(Mob_key).savePlayerData();
+ amount++;
+ }
+ }
+ Bukkit.getConsoleSender().sendMessage("§a- 世界: "+WorldName+" 已保存: "+amount+"个怪物死亡数据");
+ }
+ Bukkit.getConsoleSender().sendMessage("§b[KillMobDrop] §c插件已正常关闭!");
+ }
+
+ public boolean onCommand(CommandSender sender, Command cmd, String Command, String[] args) {
+ if (Command.equalsIgnoreCase("dmmdrop") && sender.isOp()) {
+ if(args.length == 0){
+ sender.sendMessage("");
+ sender.sendMessage("§e------- ======= §6偙国掉落物 §e======= -------");
+ sender.sendMessage("§2/dmmdrop open §f- §2打开掉落物仓库");
+ sender.sendMessage("§2/dmmdrop stats §f- §2查看材料掉落统计");
+ sender.sendMessage("§2/dmmdrop clear §f- §2清理材料掉落统计");
+ sender.sendMessage("§2/dmmdrop statshh §f- §2查看灵环掉落统计");
+ sender.sendMessage("§2/dmmdrop dropzf §e[倍率] §f- §2设置掉落物倍率");
+ sender.sendMessage("§2/dmmdrop give §e[物品] §2<数量> {玩家} §f- §2给予玩家物品");
+ sender.sendMessage("§e------- ======= §6偙国掉落物 §e======= -------");
+ }
+ if(args.length == 1 && args[0].equalsIgnoreCase("save")){
+ for (String WorldName : getConfig().getConfigurationSection("MobsDrop").getKeys(false)) {
+ for (String Mob_key : getConfig().getConfigurationSection("MobsDrop." + WorldName).getKeys(false)) {
+ if (Main.pps.get(Mob_key) != null) {
+ Main.pps.get(Mob_key).savePlayerData();
+ }
+ }
+ }
+ sender.sendMessage("§7[§c消息§7] §a成功手动保存数据.");
+ }
+ if(args.length == 1 && args[0].equalsIgnoreCase("clear")){
+ FileConfiguration yml = Main.dropLogG;
+ yml.set("DropItems",null);
+ Main.saveDropLogConfig();
+ sender.sendMessage("§7[§c消息§7] §a成功清理历史掉落数据。");
+ }
+ if(args.length == 2 && args[0].equalsIgnoreCase("dropzf")){
+ drop_double = Double.parseDouble(args[1]);
+ sender.sendMessage("§7[§c消息§7] §a当前服务器掉落率增幅为: §e"+((drop_double-1)*100)+"%");
+ }
+ //dmmdrop give [key] [amount]
+ if(args.length == 4 && args[0].equalsIgnoreCase("give")){
+ if (ItemsListID.contains(args[1])) {
+ ItemStack item = getConfig().getItemStack("ItemsData."+args[1]).clone();
+ int amount;
+ try {
+ amount = Integer.parseInt(args[2]);
+ } catch (Exception e) {
+ sender.sendMessage("§7[§6掉落库§7] §c数量参数必须是整数");
+ return true;
+ }
+ Player player = Bukkit.getPlayer(args[3]);
+ if (player == null) {
+ sender.sendMessage("§7[§6掉落库§7] §c目标玩家不在线无法给予");
+ return true;
+ }
+ item.setAmount(amount);
+ player.getInventory().addItem(item);
+ sender.sendMessage("§7[§6掉落库§7] §f成功给予玩家"+ player.getName()+" "+args[1]+" "+amount+"个");
+ }else{
+ sender.sendMessage("§7[§6掉落库§7] §c物品不存在.");
+ }
+ }
+ if(args.length == 1 && args[0].equalsIgnoreCase("open")){
+ OpenItemsGui((Player) sender);
+ }
+ if(args.length == 1 && args[0].equalsIgnoreCase("stats")){
+ FileConfiguration yml = Main.dropLogG;
+ List keyId_List = new ArrayList<>();
+ int day = 0;
+ if(yml.getConfigurationSection("DropItems") != null) {
+ for (String time : yml.getConfigurationSection("DropItems").getKeys(false)) {
+ if (yml.getConfigurationSection("DropItems." + time) != null) {
+ for (String keyId : yml.getConfigurationSection("DropItems." + time).getKeys(false)) {
+ if (!keyId_List.contains(keyId)) {
+ keyId_List.add(keyId);
+ }
+ int amount = yml.getInt("DropItems." + time + "." + keyId);
+ if (Main.statsMap.get(keyId) == null) {
+ Main.statsMap.put(keyId, new StatsPer(keyId));
+ }
+ Main.statsMap.get(keyId).addAmount(amount);
+ }
+ }
+ day++;
+ }
+ sender.sendMessage("§a战争领域§e[" + day + "天]§a内的掉落物数据统计: ");
+ for (int i = 0; i < keyId_List.size(); i++) {
+ String keyId = keyId_List.get(i);
+ int amount = Main.statsMap.get(keyId).getAmount();
+ sender.sendMessage("§7[§b" + keyId + "§7] §f§l- §a" + amount + "个");
+ }
+ sender.sendMessage("§f[§c消息§f] §a目前服务器掉落物总计: §e" + keyId_List.size() + "样");
+ Main.statsMap.clear();
+ }
+ }
+ if(args.length == 1 && args[0].equalsIgnoreCase("reload")){
+ reloadConfig();
+ Main.pps.clear();
+ for (String WorldName : getConfig().getConfigurationSection("MobsDrop").getKeys(false)){
+ int amount = 0;
+ for (String Mob_key : getConfig().getConfigurationSection("MobsDrop."+WorldName).getKeys(false)){
+ Main.pps.put(Mob_key, new MobsPer(Mob_key));
+ amount++;
+ }
+ sender.sendMessage("§a- 世界: "+WorldName+" 导入: "+amount+"个怪物");
+ }
+ sender.sendMessage("§7[§c消息§7] §a重载配置完成.");
+ }
+ }
+ return true;
+ }
+ public static int getRandomInt(int max, int min) {
+ return (int) (Math.random() * (max - min + 1) + min);
+ }
+ public static boolean itemIsNull(ItemStack item){
+ return item == null || item.getType() == Material.AIR;
+ }
+ public static boolean itemIsLore(ItemStack item){ return item.getItemMeta().getLore()==null; }
+ public static String getTime(String Format){
+ Date date = Calendar.getInstance().getTime();
+ SimpleDateFormat datatime = new SimpleDateFormat(Format);
+ return datatime.format(date);
+ }
+
+
+ public void OpenItemsGui(Player p){
+ Inventory inv = Bukkit.createInventory(null,54,"§i§r§m§i§r掉落物集成库");
+ for (String key : getConfig().getConfigurationSection("ItemsData").getKeys(false)) {
+ ItemStack item = getConfig().getItemStack("ItemsData." + key).clone();
+ item.setAmount(1);
+ inv.addItem(item);
+ }
+ p.openInventory(inv);
+ p.playSound(p.getLocation(), Sound.BLOCK_COMPARATOR_CLICK,1,2);
+ }
+
+ @EventHandler
+ public void onclick(InventoryClickEvent e){
+ Player p = (Player) e.getWhoClicked();
+ if(e.getInventory() != null && "§i§r§m§i§r掉落物集成库".equalsIgnoreCase(e.getInventory().getTitle())){
+ e.setCancelled(true);
+ if(e.getRawSlot() >= 0 && e.getRawSlot() < 54){
+ ItemStack item = e.getCurrentItem();
+ if(!itemIsNull(item)) {
+ if(e.getClick() == ClickType.LEFT) {
+ item.setAmount(1);
+ p.getInventory().addItem(item);
+ }else if(e.getClick() == ClickType.RIGHT){
+ item.setAmount(10);
+ p.getInventory().addItem(item);
+ }else if(e.getClick() == ClickType.MIDDLE){
+ item.setAmount(64);
+ p.getInventory().addItem(item);
+ }
+ p.playSound(p.getLocation(), Sound.ENTITY_CHICKEN_EGG,1,2);
+ }
+ }
+ }
+ }
+
+ //獲取上次每周數據刷新的時間 年/月/日
+ public static String getTodaytime() {
+ FileConfiguration yml = Main.dropLogG;
+ if(yml.getString("Todaytime") != null){
+ return yml.getString("Todaytime");
+ }
+ return "2023/06/24";
+ }
+
+ //判斷是否今天是數據刷新的壹天
+ public static boolean isRefreshUpdata() {
+ if(!getTodaytime().equalsIgnoreCase(getTime("yyyy/MM/dd"))) {
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/me/Demon/DemonMmKillsDrop/MobsPer.java b/src/main/java/me/Demon/DemonMmKillsDrop/MobsPer.java
new file mode 100644
index 0000000..d9b3181
--- /dev/null
+++ b/src/main/java/me/Demon/DemonMmKillsDrop/MobsPer.java
@@ -0,0 +1,32 @@
+package me.Demon.DemonMmKillsDrop;
+
+public class MobsPer {
+
+ private String Mobkey;
+ private int killAmount;
+
+ public MobsPer(String Mob_key){
+ this.Mobkey = Mob_key;
+ this.killAmount = Main.DataG.getInt("Kill_Mobs_Data."+Mobkey);;
+
+ }
+
+ public void savePlayerData(){
+ Main.DataG.set("Kill_Mobs_Data."+Mobkey,getKillAmount());
+ Main.saveDataConfig();
+ }
+
+ //小麦
+ public int getKillAmount(){
+ return this.killAmount;
+ }
+ public void addKillAmount(int amount){
+ this.killAmount += amount;
+ }
+ public void takeKillAmount(int amount){
+ this.killAmount -= amount;
+ }
+ public void setKillAmount(int amount){
+ this.killAmount = amount;
+ }
+}
diff --git a/src/main/java/me/Demon/DemonMmKillsDrop/StatsPer.java b/src/main/java/me/Demon/DemonMmKillsDrop/StatsPer.java
new file mode 100644
index 0000000..099ec0e
--- /dev/null
+++ b/src/main/java/me/Demon/DemonMmKillsDrop/StatsPer.java
@@ -0,0 +1,20 @@
+package me.Demon.DemonMmKillsDrop;
+
+public class StatsPer {
+
+ private String DropKey;
+ private int Amount;
+
+ public StatsPer(String DropKey){
+ this.DropKey = DropKey;
+ this.Amount = 0;
+
+ }
+
+ public int getAmount(){
+ return this.Amount;
+ }
+ public void addAmount(int amount){
+ this.Amount += amount;
+ }
+}
diff --git a/src/main/java/me/Demon/DemonMmKillsDrop/listener/ItemBaoHu.java b/src/main/java/me/Demon/DemonMmKillsDrop/listener/ItemBaoHu.java
new file mode 100644
index 0000000..47a40a8
--- /dev/null
+++ b/src/main/java/me/Demon/DemonMmKillsDrop/listener/ItemBaoHu.java
@@ -0,0 +1,71 @@
+package me.Demon.DemonMmKillsDrop.listener;
+
+import io.lumine.xikage.mythicmobs.MythicMobs;
+import me.Demon.DemonMmKillsDrop.manager.DamageManager;
+import org.bukkit.Location;
+import org.bukkit.entity.Entity;
+import org.bukkit.entity.Item;
+import org.bukkit.entity.LivingEntity;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.EventPriority;
+import org.bukkit.event.Listener;
+import org.bukkit.event.entity.EntityDamageByEntityEvent;
+import org.bukkit.event.player.PlayerPickupItemEvent;
+import org.bukkit.metadata.FixedMetadataValue;
+import org.bukkit.metadata.MetadataValue;
+import org.bukkit.plugin.Plugin;
+import org.bukkit.util.Vector;
+
+import java.util.*;
+
+public class ItemBaoHu implements Listener {
+
+ @EventHandler
+ public void onEntityPickupItem(PlayerPickupItemEvent event) {
+ Player player = event.getPlayer();
+ Item item = event.getItem();
+ if (item.hasMetadata("owner") && item.hasMetadata("time")) {
+ String u = null;
+ long time = 0L;
+ for (MetadataValue metadataValue : item.getMetadata("owner")) {
+ u = metadataValue.asString();
+ }
+ for (MetadataValue metadataValue : item.getMetadata("time")) {
+ time = metadataValue.asLong();
+ }
+ if (u == null || time == 0) {
+ return;
+ }
+ UUID uuid = UUID.fromString(u);
+ if (time + (1000L * 10) > System.currentTimeMillis()) {
+ if (!player.getUniqueId().equals(uuid)) {
+ Vector v = player.getLocation().toVector().subtract(item.getLocation().toVector()).normalize().multiply(1).setY(0.1);
+ player.setVelocity(v);
+ player.sendMessage("§7[§6掉落保护§7] §f你无法拾取此物品!!");
+ event.setCancelled(true);
+ }
+ }
+ }
+ }
+
+
+ @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR)
+ public void onDamage(EntityDamageByEntityEvent event) {
+ Entity damager = event.getDamager();
+ if (!(damager instanceof Player)) {
+ return;
+ }
+ Entity entity = event.getEntity();
+ if (!MythicMobs.inst().getAPIHelper().isMythicMob(entity) || !(entity instanceof LivingEntity)) {
+ return;
+ }
+ LivingEntity livingEntity = (LivingEntity) entity;
+ double damage = event.getDamage();
+ if (damage > livingEntity.getHealth()) {
+ damage = livingEntity.getHealth();
+ }
+ DamageManager.damage(damager.getUniqueId(), entity.getUniqueId(), damage);
+ }
+
+}
diff --git a/src/main/java/me/Demon/DemonMmKillsDrop/listener/KillMobsDrop.java b/src/main/java/me/Demon/DemonMmKillsDrop/listener/KillMobsDrop.java
new file mode 100644
index 0000000..ba5d5d0
--- /dev/null
+++ b/src/main/java/me/Demon/DemonMmKillsDrop/listener/KillMobsDrop.java
@@ -0,0 +1,122 @@
+package me.Demon.DemonMmKillsDrop.listener;
+
+import io.lumine.xikage.mythicmobs.adapters.bukkit.BukkitAdapter;
+import io.lumine.xikage.mythicmobs.api.bukkit.events.MythicMobDeathEvent;
+import me.Demon.DemonMmKillsDrop.Event.KillsMobsDropEvent;
+import me.Demon.DemonMmKillsDrop.KillDropAPI;
+import me.Demon.DemonMmKillsDrop.Main;
+import me.Demon.DemonMmKillsDrop.manager.DamageManager;
+import me.Demon.DemonPlugin.DemonAPI;
+import org.bukkit.Bukkit;
+import org.bukkit.Location;
+import org.bukkit.configuration.file.FileConfiguration;
+import org.bukkit.entity.Item;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.metadata.FixedMetadataValue;
+import org.bukkit.util.Vector;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+public class KillMobsDrop implements Listener {
+
+ @EventHandler
+ public void onkills(MythicMobDeathEvent e) {
+ if (e.getKiller() instanceof Player) {
+ Player p = (Player) e.getKiller();
+ if (e.getEntity().getCustomName() != null) {
+ //获取玩家所在世界名
+ String worldName = p.getWorld().getName();
+ //获取怪物的MM代号
+ String mobsKey = e.getMob().getType().getInternalName();
+ if (Main.pps.get(mobsKey) != null) {
+ Main.pps.get(mobsKey).addKillAmount(1);
+ //获取这只魂兽当前被击杀次数
+ int amount = Main.pps.get(mobsKey).getKillAmount();
+ int fujia_gailv = 0;
+ if (amount >= 20) {
+ fujia_gailv = amount;
+ }
+ boolean isdrop = false;
+ List itemStacks = new ArrayList<>();
+ FileConfiguration yml = Main.plugin.getConfig();
+ for (String DropKey : yml.getConfigurationSection("MobsDrop." + worldName + "." + mobsKey).getKeys(false)) {
+ int gailv = yml.getInt("MobsDrop." + worldName + "." + mobsKey + "." + DropKey);
+ double newgailv = (gailv * 0.7) * Main.drop_double;
+ if (p.hasPermission("vip2.use")) {
+ newgailv = (gailv * 0.85) * Main.drop_double;
+ }
+ int random = Main.getRandomInt(1000, 1);
+ double addDrop = 1.0;
+ if (random <= ((newgailv + fujia_gailv) * addDrop)) {
+ isdrop = true;
+ if (DropKey.contains("#")) {
+ String ItemsKey = DropKey.split("#")[0];
+ ItemStack dropItem = KillDropAPI.getItemData(ItemsKey);
+ int max = Integer.parseInt(DropKey.split("#")[1]);
+ int d_amount = Main.getRandomInt(max, 1);
+ dropItem.setAmount(d_amount);
+ itemStacks.add(dropItem);
+ // 事件
+ KillDropAPI.addDayAmount(ItemsKey, d_amount);
+ KillsMobsDropEvent event = new KillsMobsDropEvent(p, ItemsKey, d_amount);
+ Bukkit.getPluginManager().callEvent(event);
+ } else {
+ // 将东西发送至队长背包
+ ItemStack dropItem = KillDropAPI.getItemData(DropKey);
+ itemStacks.add(dropItem);
+ // 事件
+ KillDropAPI.addDayAmount(DropKey, 1);
+ KillsMobsDropEvent event = new KillsMobsDropEvent(p, DropKey, 1);
+ Bukkit.getPluginManager().callEvent(event);
+ }
+ }
+ }
+ if (isdrop) {
+ if (p.hasPermission("vip2.use")) {
+ DemonAPI.sendActionBar(p, "§6§l§k|||§r §b!副本爆率增幅生效中! §6§l§k|||§r");
+ }
+ Main.pps.get(mobsKey).setKillAmount(0);
+ UUID entityUUID = e.getMob().getUniqueId();
+ Map map = DamageManager.getEntityDamageMap(entityUUID);
+ List> list = getEntries(map);
+ Location location = BukkitAdapter.adapt(e.getMob().getLocation());
+ if (!list.isEmpty()) {
+ UUID one = list.get(0).getKey();
+ itemStacks.forEach(i -> {
+ Item item = location.getWorld().dropItem(location, i);
+ item.setPickupDelay(0);
+ item.setMetadata("owner", new FixedMetadataValue(Main.plugin, one.toString()));
+ item.setMetadata("time", new FixedMetadataValue(Main.plugin, System.currentTimeMillis()));
+ item.setVelocity(new Vector(getRandomDouble(0.5), getRandomDouble(0.1), getRandomDouble(0.5)));
+ });
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private static List> getEntries(Map map) {
+ List> list = new ArrayList<>(map.entrySet());
+ list.sort((arg0, arg1) -> {
+ if (arg0.getValue() > arg1.getValue()) {
+ return -1;
+ } else {
+ return 1;
+ }
+ });
+ return list;
+ }
+
+
+ private double getRandomDouble(double max) {
+ int pow = (int) Math.pow(10, 2);
+ return Math.floor((Math.random() * (max - 0.01) + 0.01) * pow) / pow;
+ }
+}
diff --git a/src/main/java/me/Demon/DemonMmKillsDrop/manager/DamageManager.java b/src/main/java/me/Demon/DemonMmKillsDrop/manager/DamageManager.java
new file mode 100644
index 0000000..a432bdf
--- /dev/null
+++ b/src/main/java/me/Demon/DemonMmKillsDrop/manager/DamageManager.java
@@ -0,0 +1,46 @@
+package me.Demon.DemonMmKillsDrop.manager;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+public class DamageManager {
+
+ private static Map> damageMap = new HashMap<>();
+
+ public static Map> getDamageMap() {
+ return damageMap;
+ }
+
+ public static Map getEntityDamageMap(UUID entity) {
+ Map map = new HashMap<>();
+ damageMap.forEach((p, m) -> {
+ if (m.containsKey(entity)) {
+ map.put(p, m.get(entity));
+ }
+ });
+ return map;
+ }
+
+ public static double getDamage(UUID player, UUID entity) {
+ if (!damageMap.containsKey(player)) {
+ return 0;
+ }
+ return damageMap.get(player).getOrDefault(entity, (double) 0);
+ }
+
+ public static void damage(UUID player, UUID entity, double damage) {
+ Map map = damageMap.getOrDefault(player, new HashMap<>());
+ map.put(entity, map.getOrDefault(entity, (double) 0) + damage);
+ damageMap.put(player, map);
+ }
+
+ public static void clearEntity(UUID entity) {
+ damageMap.forEach((p, map)->{
+ if (map.containsKey(entity)) {
+ map.remove(entity);
+ }
+ });
+ }
+
+}
diff --git a/src/main/resources/DropItemLog.yml b/src/main/resources/DropItemLog.yml
new file mode 100644
index 0000000..0b47ffb
--- /dev/null
+++ b/src/main/resources/DropItemLog.yml
@@ -0,0 +1,2 @@
+Todaytime: 2021/03/31
+DropItems: {}
\ No newline at end of file
diff --git a/src/main/resources/MobsData.yml b/src/main/resources/MobsData.yml
new file mode 100644
index 0000000..f76fce6
--- /dev/null
+++ b/src/main/resources/MobsData.yml
@@ -0,0 +1 @@
+Kill_Mobs_Data: {}
\ No newline at end of file
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
new file mode 100644
index 0000000..d1f442b
--- /dev/null
+++ b/src/main/resources/config.yml
@@ -0,0 +1,5 @@
+# 若全服玩家击杀该 怪物 总次数达到50次 该怪物的战利品掉率增加 击杀次数-50 = 附加概率
+# 如果在击杀次数积累过程中有人掉落 则次数重置
+# 材料后面的数字为默认掉率 比例为 1000:1
+MobsDrop: {}
+ItemsData: {}
\ No newline at end of file
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
new file mode 100644
index 0000000..c1fc168
--- /dev/null
+++ b/src/main/resources/plugin.yml
@@ -0,0 +1,5 @@
+name: DemonMmKillsDrop
+main: me.Demon.DemonMmKillsDrop.Main
+version: 1.4.9
+commands:
+ dmmdrop:
\ No newline at end of file