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