This commit is contained in:
yaohunya 2025-07-20 16:28:32 +08:00
commit 8cef5e004f
8 changed files with 456 additions and 0 deletions

47
pom.xml Normal file
View File

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.yaohun.main</groupId>
<artifactId>DemonMmKillsMoney</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<repositories>
<repository>
<id>public-rpg</id>
<url>https://repo.aurora-pixels.com/repository/public-rpg/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.12.2</version>
</dependency>
<dependency>
<groupId>me.Demon.DemonPlugin</groupId>
<artifactId>DemonAPI</artifactId>
<version>2.2.9</version>
</dependency>
<dependency>
<groupId>io.lumine.xikage.mythicmobs</groupId>
<artifactId>MythicMobs</artifactId>
<version>4.11.0-008</version>
</dependency>
<dependency>
<groupId>org.serverct.ersha.jd</groupId>
<artifactId>AttributePlus</artifactId>
<version>2.3.7</version>
</dependency>
</dependencies>
</project>

View File

@ -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;
}
}

View File

@ -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<String,valueData> 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;
}
}
}

View File

@ -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;
}
}

View File

@ -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<String> lore = new ArrayList<>();
lore.add("§8#money");
lore.add("§8"+ RandomUtil.getRandomInt(5000,500000));
meta.setLore(lore);
item.setItemMeta(meta);
return item;
}
}

View File

@ -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<String, KillEcoData> 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);
}
}

View File

@ -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

View File

@ -0,0 +1,9 @@
name: DemonMmKillsMoney
main: me.Demon.DemonMmKillsMoney.Main
version: 1.5.6
depend:
- DemonAPI
- AttributePlus
- MythicMobs
commands:
dmmkm: