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