From 8cef5e004f4e4c3dae09afedfb0e246e9bb001cc Mon Sep 17 00:00:00 2001 From: yaohunya <1763917516@qq.com> Date: Sun, 20 Jul 2025 16:28:32 +0800 Subject: [PATCH] 1.5.6 --- pom.xml | 47 +++++++ .../java/me/Demon/DemonMmKillsMoney/Main.java | 71 ++++++++++ .../DemonMmKillsMoney/data/KillEcoData.java | 60 +++++++++ .../event/KillsMobsMoneyEvent.java | 41 ++++++ .../DemonMmKillsMoney/listener/KillMobs.java | 121 ++++++++++++++++++ .../DemonMmKillsMoney/manage/DataManager.java | 73 +++++++++++ src/main/resources/config.yml | 34 +++++ src/main/resources/plugin.yml | 9 ++ 8 files changed, 456 insertions(+) create mode 100644 pom.xml create mode 100644 src/main/java/me/Demon/DemonMmKillsMoney/Main.java create mode 100644 src/main/java/me/Demon/DemonMmKillsMoney/data/KillEcoData.java create mode 100644 src/main/java/me/Demon/DemonMmKillsMoney/event/KillsMobsMoneyEvent.java create mode 100644 src/main/java/me/Demon/DemonMmKillsMoney/listener/KillMobs.java create mode 100644 src/main/java/me/Demon/DemonMmKillsMoney/manage/DataManager.java create mode 100644 src/main/resources/config.yml create mode 100644 src/main/resources/plugin.yml diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..c6980c3 --- /dev/null +++ b/pom.xml @@ -0,0 +1,47 @@ + + + 4.0.0 + + com.yaohun.main + DemonMmKillsMoney + 1.0-SNAPSHOT + + + 8 + 8 + UTF-8 + + + + + public-rpg + https://repo.aurora-pixels.com/repository/public-rpg/ + + + + + + org.spigotmc + spigot-api + 1.12.2 + + + me.Demon.DemonPlugin + DemonAPI + 2.2.9 + + + io.lumine.xikage.mythicmobs + MythicMobs + 4.11.0-008 + + + org.serverct.ersha.jd + AttributePlus + 2.3.7 + + + + \ No newline at end of file diff --git a/src/main/java/me/Demon/DemonMmKillsMoney/Main.java b/src/main/java/me/Demon/DemonMmKillsMoney/Main.java new file mode 100644 index 0000000..1b420dd --- /dev/null +++ b/src/main/java/me/Demon/DemonMmKillsMoney/Main.java @@ -0,0 +1,71 @@ +package me.Demon.DemonMmKillsMoney; + +import me.Demon.DemonMmKillsMoney.data.KillEcoData; +import me.Demon.DemonMmKillsMoney.listener.KillMobs; +import me.Demon.DemonMmKillsMoney.manage.DataManager; +import me.Demon.DemonPlugin.DemonAPI; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.plugin.java.JavaPlugin; + +import java.util.*; + +public class Main extends JavaPlugin { + + public static Main plugin; + private static DataManager dataManager; + @Override + public void onEnable() { + plugin = this; + saveDefaultConfig(); + dataManager = new DataManager(); + getServer().getPluginManager().registerEvents(new KillMobs(dataManager), plugin); + Bukkit.getConsoleSender().sendMessage("§b[击杀掉金币] §f插件成功载入Server!"); + Bukkit.getConsoleSender().sendMessage("§b[击杀掉金币] §f妖魂: §a1763917516"); + } + + @Override + public void onDisable() { + getDataManager().saveDataManger(); + Bukkit.getConsoleSender().sendMessage("§b[击杀掉金币] §c插件已正常关闭!"); + } + + @Override + public boolean onCommand(CommandSender sender, Command cmd, String Command, String[] args) { + if (Command.equalsIgnoreCase("dmmkm") && sender.isOp()) { + if (args.length == 0) { + sender.sendMessage(""); + sender.sendMessage("§e------- ======= §6击杀掉落金币 §e======= -------"); + sender.sendMessage("§2/dmmkm stats §f- §2查看经济数据"); + sender.sendMessage("§2/dmmkm reload §f- §2重载配置文件"); + sender.sendMessage("§e------- ======= §6击杀掉落金币 §e======= -------"); + sender.sendMessage(""); + } + if(args.length == 1 && args[0].equalsIgnoreCase("reload")){ + getDataManager().reloadDataManger(); + DemonAPI.sendMessage(sender,"配置文件已重载."); + } + if(args.length == 1 && args[0].equalsIgnoreCase("stats")){ + getDataManager().saveDataManger(); + FileConfiguration yml = getConfig(); + int day = 0; + double totalMoney = 0; + if(yml.getConfigurationSection("DropLog") != null) { + for (String time : yml.getConfigurationSection("DropLog").getKeys(false)) { + double money = yml.getDouble("DropLog." + time); + totalMoney = totalMoney + money; + day++; + } + } + DemonAPI.sendMessage(sender,"据统计§e[" + day + "天]§a内通过击杀掉落金币总计: §6§l"+(int) totalMoney+"金币"); + } + } + return false; + } + + public static DataManager getDataManager() { + return dataManager; + } +} diff --git a/src/main/java/me/Demon/DemonMmKillsMoney/data/KillEcoData.java b/src/main/java/me/Demon/DemonMmKillsMoney/data/KillEcoData.java new file mode 100644 index 0000000..f0426ec --- /dev/null +++ b/src/main/java/me/Demon/DemonMmKillsMoney/data/KillEcoData.java @@ -0,0 +1,60 @@ +package me.Demon.DemonMmKillsMoney.data; + +import me.Demon.DemonPlugin.Util.RandomUtil; +import org.bukkit.configuration.ConfigurationSection; + +import java.util.HashMap; + +public class KillEcoData { + + private HashMap dataHashMap = new HashMap<>(); + + public KillEcoData(String worldName,ConfigurationSection configurationSection){ + ConfigurationSection section = configurationSection.getConfigurationSection(worldName); + for (String key : section.getKeys(false)) { + dataHashMap.put(key,new valueData(section.getString(key))); + } + } + + + // 判断这个怪物是否能掉落金币 + public boolean isKillsMobsDropExit(String customName){ + for (String mmName : dataHashMap.keySet()){ + if(customName.contains(mmName)){ + return true; + } + } + return false; + } + + public double getRandonValue(String customName){ + for (String mmName : dataHashMap.keySet()){ + if(customName.contains(mmName)){ + valueData valueData = this.dataHashMap.get(mmName); + return valueData.getRandomValue(); + } + } + return 1.0; + } + + public class valueData { + private double min; + private double max; + public valueData(String string){ + if(string.contains("~")) { + String[] split = string.split("~"); + min = Double.parseDouble(split[0]); + max = Double.parseDouble(split[1]); + } else { + min = Double.parseDouble(string); + max = Double.parseDouble(string); + } + } + + public double getRandomValue() { + double randomValue = RandomUtil.getRandomDouble(min, max, 2) / 100; + return Math.round(randomValue * 100) / 100.0; + } + + } +} diff --git a/src/main/java/me/Demon/DemonMmKillsMoney/event/KillsMobsMoneyEvent.java b/src/main/java/me/Demon/DemonMmKillsMoney/event/KillsMobsMoneyEvent.java new file mode 100644 index 0000000..23eaf5d --- /dev/null +++ b/src/main/java/me/Demon/DemonMmKillsMoney/event/KillsMobsMoneyEvent.java @@ -0,0 +1,41 @@ +package me.Demon.DemonMmKillsMoney.event; + +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class KillsMobsMoneyEvent extends Event { + + private static HandlerList handlers = new HandlerList(); + private Player player; + private Entity target; + private double dropMoney; + + @Override + public HandlerList getHandlers() {return handlers;} + + public static HandlerList getHandlerList(){return handlers;} + + public KillsMobsMoneyEvent(Player player, Entity target, double dropMoney) { + this.player = player; + this.target = target; + this.dropMoney = dropMoney; + } + + public Player getPlayer() { + return player; + } + + public String getPlayerName() { + return player.getName(); + } + + public Entity getTarget() { + return target; + } + + public double getDropMoney() { + return dropMoney; + } +} diff --git a/src/main/java/me/Demon/DemonMmKillsMoney/listener/KillMobs.java b/src/main/java/me/Demon/DemonMmKillsMoney/listener/KillMobs.java new file mode 100644 index 0000000..1c1818f --- /dev/null +++ b/src/main/java/me/Demon/DemonMmKillsMoney/listener/KillMobs.java @@ -0,0 +1,121 @@ +package me.Demon.DemonMmKillsMoney.listener; + +import io.lumine.xikage.mythicmobs.api.bukkit.events.MythicMobDeathEvent; +import me.Demon.DemonMmKillsMoney.data.KillEcoData; +import me.Demon.DemonMmKillsMoney.Main; +import me.Demon.DemonMmKillsMoney.event.KillsMobsMoneyEvent; +import me.Demon.DemonMmKillsMoney.manage.DataManager; +import me.Demon.DemonPlugin.DemonAPI; +import me.Demon.DemonPlugin.Util.AreaType; +import me.Demon.DemonPlugin.Util.RandomUtil; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Item; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityPickupItemEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.metadata.MetadataValue; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; +import org.serverct.ersha.jd.AttributeAPI; + +import java.util.ArrayList; +import java.util.List; + +public class KillMobs implements Listener { + + private DataManager dataManager; + private String attributeKey = "猎金达人:"; + + public KillMobs(DataManager dataManager) { + this.dataManager = dataManager; + if(DemonAPI.getAreaType() == AreaType.TaiWan){ + attributeKey = "獵金達人:"; + } + } + + @EventHandler + public void onkills(MythicMobDeathEvent e){ + if (e.getKiller() instanceof Player) { + Player player = (Player)e.getKiller(); + Entity entity = e.getEntity(); + if (entity.getCustomName() != null) { + // 击杀掉落金币概率为50% + if(DemonAPI.getRandomInt(100,1) >= 50) { + // 获取玩家所在世界名 + World world = player.getWorld(); + String worldName = world.getName(); + // 判断这个世界是否会掉落金币 + if(dataManager.isWorldDataExit(worldName)){ + // 获取死亡MM怪的自定义名字并去掉颜色符号 + String customName = entity.getCustomName().replaceAll("§[a-zA-Z0-9]", ""); + KillEcoData killEcoData = dataManager.getEcoData(worldName); + // 判断这个怪是否会掉落金币 + if(killEcoData.isKillsMobsDropExit(customName)){ + // 获取本次击杀掉落多少金币 + double value = killEcoData.getRandonValue(customName); + if (AttributeAPI.getAttrData(player).getAttributeValue().get(attributeKey) != null) { + value = value * (1 + (AttributeAPI.getAttrData(player).getAttributeValue().get(attributeKey) / 100.0D)); + } + DemonAPI.giveMoney(player.getUniqueId(),value); + dataManager.addTodayGetGold(value); + + // ************ 疑似卡顿内容~********** + Item item = world.dropItemNaturally(entity.getLocation(),itemMoney(player.getName(),value)); + item.setPickupDelay(0); + item.setMetadata("goldLoot", new FixedMetadataValue(Main.plugin, System.currentTimeMillis())); + // **3秒(60 ticks)后删除物品** + new BukkitRunnable() { + @Override + public void run() { + if (item.isValid() && !item.isDead()) { + item.remove(); + } + } + }.runTaskLater(Main.plugin, 60L); // 60 ticks = 3秒 + + // 玩家点券月卡进行了关联 + KillsMobsMoneyEvent event = new KillsMobsMoneyEvent(player,entity,value); + Bukkit.getPluginManager().callEvent(event); + } + } + } + } + } + } + + @EventHandler + public void onEntityPickupItem(EntityPickupItemEvent event) { + if (event.getEntity() instanceof Player) { + Item item = event.getItem(); + if (item.hasMetadata("goldLoot")) { + event.setCancelled(true); + } + ItemStack stack = item.getItemStack(); + if(!DemonAPI.itemIsNull(stack)) { + if (item.getItemStack().getType() == Material.GOLD_NUGGET) { + event.setCancelled(true); + event.getItem().remove(); + } + } + } + } + + public static ItemStack itemMoney(String playerName,double money){ + ItemStack item = new ItemStack(Material.GOLD_NUGGET); + ItemMeta meta = item.getItemMeta(); + meta.setDisplayName("§p§i§c§k§e$"+String.format("%.1f",money)+" §7[§a"+playerName+"§7]"); + List lore = new ArrayList<>(); + lore.add("§8#money"); + lore.add("§8"+ RandomUtil.getRandomInt(5000,500000)); + meta.setLore(lore); + item.setItemMeta(meta); + return item; + } +} diff --git a/src/main/java/me/Demon/DemonMmKillsMoney/manage/DataManager.java b/src/main/java/me/Demon/DemonMmKillsMoney/manage/DataManager.java new file mode 100644 index 0000000..ce12cc7 --- /dev/null +++ b/src/main/java/me/Demon/DemonMmKillsMoney/manage/DataManager.java @@ -0,0 +1,73 @@ +package me.Demon.DemonMmKillsMoney.manage; + +import me.Demon.DemonMmKillsMoney.data.KillEcoData; +import me.Demon.DemonMmKillsMoney.Main; +import me.Demon.DemonPlugin.DemonAPI; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.File; +import java.io.IOException; +import java.util.HashMap; + +public class DataManager { + + private double todayGetGold = 0.0; + private HashMap ecoDataMap = new HashMap<>(); + + public DataManager() { + loadTodayDropLog(); + FileConfiguration yml = Main.plugin.getConfig(); + ConfigurationSection section = yml.getConfigurationSection("MoneyData"); + if(section == null){return;} + for (String worldName : section.getKeys(false)) { + ecoDataMap.put(worldName, new KillEcoData(worldName,section)); + } + } + + public void loadTodayDropLog(){ + File file = new File(Main.plugin.getDataFolder(),"DropLog.yml"); + FileConfiguration configuration = YamlConfiguration.loadConfiguration(file); + todayGetGold = configuration.getDouble("DropLog."+DemonAPI.getTime("dd")); + } + + public void reloadDataManger(){ + Main.plugin.reloadConfig(); + Main.plugin.saveConfig(); + FileConfiguration yml = Main.plugin.getConfig(); + ConfigurationSection section = yml.getConfigurationSection("MoneyData"); + if(section == null){return;} + for (String worldName : section.getKeys(false)) { + ecoDataMap.put(worldName, new KillEcoData(worldName,section)); + } + } + + public void saveDataManger(){ + File file = new File(Main.plugin.getDataFolder(),"DropLog.yml"); + FileConfiguration configuration = YamlConfiguration.loadConfiguration(file); + String dd = DemonAPI.getTime("dd"); + configuration.set("DropLog."+dd,null); + configuration.set("DropLog."+dd,todayGetGold); + try { + configuration.save(file); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public void addTodayGetGold(double money) { + this.todayGetGold += money; + } + + public boolean isWorldDataExit(String worldName) { + if(ecoDataMap.containsKey(worldName)){ + return true; + } + return false; + } + + public KillEcoData getEcoData(String worldName) { + return ecoDataMap.get(worldName); + } +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml new file mode 100644 index 0000000..4b2ff12 --- /dev/null +++ b/src/main/resources/config.yml @@ -0,0 +1,34 @@ +MoneyData: + #<世界名>: + # 怪物名包含内容: 最小金币~最大金币 + lrzs: + "✪十年灵兽✪": 100~500 + "✪百年灵兽✪": 500~1000 + "✪千年灵兽✪": 1000~8000 + "✪万年灵兽✪": 8000~25000 + xdsl: + "✪十年灵兽✪": 100~500 + "✪百年灵兽✪": 500~1000 + "✪千年灵兽✪": 1000~8000 + "✪万年灵兽✪": 10000~50000 + jhby: + "✪千年灵兽✪": 2000~6000 + "✪万年灵兽✪": 8000~40000 + bhlyy: + "✪珍贵仙草✪": 5000~100000 + "✪万年灵兽✪": 10000~50000 + slds: + "❃异变灵兽❃": 15000~50000 + "✪灵帝✪": 15000~50000 + "✪灵圣✪": 20000~50000 + whd: + "❁器魂殿❁守卫器师": 15000~50000 + "❁器魂殿❁巡逻器师": 20000~50000 + "❁器魂殿❁殿堂器师": 25000~50000 + "❁器魂殿❁精英器师": 30000~60000 + fsjk: + "✪封神九考✪怒血刺蟹": 10000~60000 + "考守护者": 30000~80000 + shenyu: + "✪神域灵兽✪": 20000~60000 + "❁神域❁": 10000~80000 \ 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..de9c63b --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,9 @@ +name: DemonMmKillsMoney +main: me.Demon.DemonMmKillsMoney.Main +version: 1.5.6 +depend: + - DemonAPI + - AttributePlus + - MythicMobs +commands: + dmmkm: \ No newline at end of file