Compare commits
10 Commits
WorldBossH
...
master
Author | SHA1 | Date | |
---|---|---|---|
916d4fd0c6 | |||
|
e0ccdfc871 | ||
|
e22728ab08 | ||
|
60f7c9891d | ||
|
adf354267a | ||
|
3d515230cd | ||
|
6eb4772436 | ||
|
242a88c99d | ||
|
8b7880a1b0 | ||
|
effbed02d1 |
47
pom.xml
47
pom.xml
|
@ -14,36 +14,47 @@
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<repositories>
|
<repositories>
|
||||||
<repository>
|
|
||||||
<id>spigotmc-repo</id>
|
|
||||||
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
|
|
||||||
</repository>
|
|
||||||
<repository>
|
|
||||||
<id>sonatype</id>
|
|
||||||
<url>https://oss.sonatype.org/content/groups/public/</url>
|
|
||||||
</repository>
|
|
||||||
<repository>
|
<repository>
|
||||||
<id>public-rpg</id>
|
<id>public-rpg</id>
|
||||||
<url>https://repo.aurora-pixels.com/repository/public-rpg/</url>
|
<url>https://repo.aurora-pixels.com/repository/public-rpg/</url>
|
||||||
</repository>
|
</repository>
|
||||||
<repository>
|
|
||||||
<id>public</id>
|
|
||||||
<url>https://repo.aurora-pixels.com/repository/public/</url>
|
|
||||||
</repository>
|
|
||||||
</repositories>
|
</repositories>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.spigotmc</groupId>
|
<groupId>org.spigotmc</groupId>
|
||||||
<artifactId>spigot-api</artifactId>
|
<artifactId>spigot-api</artifactId>
|
||||||
<version>1.12.2-R0.1-SNAPSHOT</version>
|
<version>1.12.2</version>
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.fastasyncworldedit.bukkit</groupId>
|
<groupId>me.Demon.DemonPlugin</groupId>
|
||||||
<artifactId>FastAsyncWorldEdit</artifactId>
|
<artifactId>DemonAPI</artifactId>
|
||||||
<version>2.9.1</version>
|
<version>1.2.0</version>
|
||||||
<classifier>660</classifier>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>me.Demon.DemonBank</groupId>
|
||||||
|
<artifactId>DemonBank</artifactId>
|
||||||
|
<version>1.4</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.lumine.xikage.mythicmobs</groupId>
|
||||||
|
<artifactId>MythicMobs</artifactId>
|
||||||
|
<version>1.12.2</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>me.Demon.DemonLevels</groupId>
|
||||||
|
<artifactId>DemonLevels</artifactId>
|
||||||
|
<version>1.0.0</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>me.Demon.DemonHunHuanSx</groupId>
|
||||||
|
<artifactId>DemonHunHuanSx</artifactId>
|
||||||
|
<version>1.12.2</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.vexview.api</groupId>
|
||||||
|
<artifactId>vexview</artifactId>
|
||||||
|
<version>1.12.2</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
|
|
97
src/main/java/com/io/yaohun/worldbosshurt/Main.java
Normal file
97
src/main/java/com/io/yaohun/worldbosshurt/Main.java
Normal file
|
@ -0,0 +1,97 @@
|
||||||
|
package com.io.yaohun.worldbosshurt;
|
||||||
|
|
||||||
|
import com.io.yaohun.worldbosshurt.command.BossSpawnerCmd;
|
||||||
|
import com.io.yaohun.worldbosshurt.listener.*;
|
||||||
|
import com.io.yaohun.worldbosshurt.mangage.BossManage;
|
||||||
|
import com.io.yaohun.worldbosshurt.mangage.RewardManage;
|
||||||
|
import com.io.yaohun.worldbosshurt.util.BossStack;
|
||||||
|
import com.io.yaohun.worldbosshurt.util.BossUtil;
|
||||||
|
import me.Demon.DemonPlugin.DemonAPI;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
public class Main extends JavaPlugin {
|
||||||
|
|
||||||
|
public static Main plugin;
|
||||||
|
public static BossManage bossManage;
|
||||||
|
public static RewardManage rewardManage;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onEnable() {
|
||||||
|
plugin = this;
|
||||||
|
reloadMobDataYml();
|
||||||
|
getCommand("bossspawner").setExecutor(new BossSpawnerCmd());
|
||||||
|
getServer().getPluginManager().registerEvents(new BossSpawnLogs(),this);
|
||||||
|
getServer().getPluginManager().registerEvents(new BossArmor(),this);
|
||||||
|
getServer().getPluginManager().registerEvents(new BossDamageByPlayer(),this);
|
||||||
|
getServer().getPluginManager().registerEvents(new BossKillsDeath(),this);
|
||||||
|
getServer().getPluginManager().registerEvents(new BossDeathEvent(),this);
|
||||||
|
getServer().getPluginManager().registerEvents(new BossProveEvent(),this);
|
||||||
|
Bukkit.getConsoleSender().sendMessage("§b[BossHurt] §f插件成功载入Server!");
|
||||||
|
Bukkit.getConsoleSender().sendMessage("§b[BossHurt] §f妖魂QQ:1763917516");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void reloadMobDataYml(){
|
||||||
|
File Datafile = new File("plugins/WorldBossHurt", "MobData.yml");
|
||||||
|
bossManage = new BossManage(YamlConfiguration.loadConfiguration(Datafile));
|
||||||
|
rewardManage = new RewardManage(YamlConfiguration.loadConfiguration(Datafile));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onCommand(CommandSender sender, Command cmd, String Command, String[] args) {
|
||||||
|
if(Command.equalsIgnoreCase("bossreload") && sender.isOp()){
|
||||||
|
if(args.length == 1 && args[0].equalsIgnoreCase("test")){
|
||||||
|
BossUtil.settlementRankingRewards();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
reloadMobDataYml();
|
||||||
|
DemonAPI.sendMessage(sender,"配置文件已重载.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if(Command.equalsIgnoreCase("bosspz")){ // /bosspz
|
||||||
|
if(args.length >= 2 && args[0].equalsIgnoreCase("give") && sender.isOp()){
|
||||||
|
String bossName = args[1];
|
||||||
|
if(args.length == 2) {
|
||||||
|
Player player = (Player) sender;
|
||||||
|
ItemStack pingzheng = BossStack.BossSlashProof(bossName).clone();
|
||||||
|
DemonAPI.giveItem(player,pingzheng);
|
||||||
|
DemonAPI.sendMessage(player,"恭喜你获得了 "+pingzheng.getItemMeta().getDisplayName());
|
||||||
|
}
|
||||||
|
if(args.length == 3) {
|
||||||
|
String playName = args[2];
|
||||||
|
Player player = Bukkit.getPlayer(playName);
|
||||||
|
if (player == null) {
|
||||||
|
DemonAPI.sendMessage(sender, "目标玩家不在线无法发送凭证。");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
ItemStack pingzheng = BossStack.BossSlashProof(bossName).clone();
|
||||||
|
DemonAPI.giveItem(player,pingzheng);
|
||||||
|
DemonAPI.sendMessage(player,"恭喜你获得了 "+pingzheng.getItemMeta().getDisplayName());
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if(args.length == 2 && args[0].equalsIgnoreCase("tpall") && sender.isOp()){
|
||||||
|
Player p = (Player) sender;
|
||||||
|
for (Entity entity : p.getWorld().getEntities()){
|
||||||
|
if(entity.getCustomName() != null) {
|
||||||
|
String customName = entity.getCustomName().replaceAll("§[a-zA-Z0-9]", "");
|
||||||
|
if (customName.contains(args[1])) {
|
||||||
|
entity.teleport(p.getLocation());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sender.sendMessage("操作执行成功.#"+args[1]);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,65 @@
|
||||||
|
package com.io.yaohun.worldbosshurt.api;
|
||||||
|
|
||||||
|
import com.io.yaohun.worldbosshurt.Main;
|
||||||
|
import com.io.yaohun.worldbosshurt.mangage.BossManage;
|
||||||
|
import org.bukkit.configuration.file.FileConfiguration;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import java.text.DecimalFormat;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public abstract class BossHurtAPI {
|
||||||
|
|
||||||
|
// 判断这个怪是否是世界boss
|
||||||
|
public static boolean isBossExist(String customName){
|
||||||
|
BossManage bossManage = Main.bossManage;
|
||||||
|
if(bossManage.isCustomNameContains(customName)){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//获取本月猎杀排行榜排行榜
|
||||||
|
public static void sendTimeMonthTopMessage(Player p){
|
||||||
|
FileConfiguration yml = Main.plugin.getConfig();
|
||||||
|
double totalAmount = 0;
|
||||||
|
HashMap<String, Integer> map = new HashMap<>();
|
||||||
|
for (String playName : yml.getConfigurationSection("MonthlyKillsTop").getKeys(false)) {
|
||||||
|
int amount = yml.getInt("MonthlyKillsTop."+playName);
|
||||||
|
map.put(playName, amount);
|
||||||
|
totalAmount = totalAmount + amount;
|
||||||
|
}
|
||||||
|
List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet());
|
||||||
|
list.sort((o1, o2) -> o2.getValue().compareTo(o1.getValue()));
|
||||||
|
int count = Math.min(list.size(), 10);
|
||||||
|
int rank = 1;
|
||||||
|
p.sendMessage("§c§M §6§m §e§m §a§m §b§m §C§L▍ §c§l猎§6§l杀§E§L统§A§l计§B§L表 §C§l▍§b§M §a§M §e§M §6§m §c§m §r");
|
||||||
|
p.sendMessage("§e本月世界级boss猎杀排名如下:");
|
||||||
|
for (int i = 0; i < count; i++) {
|
||||||
|
if (rank == 11) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
String top_Name = list.get(i).getKey();
|
||||||
|
p.sendMessage("§e第" + rank + "名 - §c" + top_Name + " §e总计猎杀: §c" + list.get(i).getValue() + "只 §e猎杀占总比: §c" + new DecimalFormat("0.00").format(list.get(i).getValue() / totalAmount * 100) + "%");
|
||||||
|
++rank;
|
||||||
|
}
|
||||||
|
p.sendMessage("§c§M §6§m §e§m §a§m §b§m §C§L▍ §c§l猎§6§l杀§E§L统§A§l计§B§L表 §C§l▍§b§M §a§M §e§M §6§m §c§m §r");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<Map.Entry<String, Integer>> getTimeMonthTopHashMap(){
|
||||||
|
FileConfiguration yml = Main.plugin.getConfig();
|
||||||
|
double totalAmount = 0;
|
||||||
|
HashMap<String, Integer> map = new HashMap<>();
|
||||||
|
for (String playName : yml.getConfigurationSection("MonthlyKillsTop").getKeys(false)) {
|
||||||
|
int amount = yml.getInt("MonthlyKillsTop."+playName);
|
||||||
|
map.put(playName, amount);
|
||||||
|
totalAmount = totalAmount + amount;
|
||||||
|
}
|
||||||
|
List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet());
|
||||||
|
list.sort((o1, o2) -> o2.getValue().compareTo(o1.getValue()));
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,122 @@
|
||||||
|
package com.io.yaohun.worldbosshurt.command;
|
||||||
|
|
||||||
|
import com.io.yaohun.worldbosshurt.Main;
|
||||||
|
import com.io.yaohun.worldbosshurt.data.BossData;
|
||||||
|
import com.io.yaohun.worldbosshurt.event.WorldBossSpawnEvent;
|
||||||
|
import com.io.yaohun.worldbosshurt.mangage.BossManage;
|
||||||
|
import com.io.yaohun.worldbosshurt.listener.BossDamageByPlayer;
|
||||||
|
import com.io.yaohun.worldbosshurt.util.BossSpawnUtil;
|
||||||
|
import com.io.yaohun.worldbosshurt.util.BossUtil;
|
||||||
|
import lk.vexview.api.VexViewAPI;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandExecutor;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.command.TabCompleter;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.entity.Item;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class BossSpawnerCmd implements CommandExecutor , TabCompleter {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||||
|
if(BossUtil.isTimeMonthly()){
|
||||||
|
BossUtil.settlementRankingRewards();
|
||||||
|
}
|
||||||
|
if(args.length == 0 && sender.isOp()){
|
||||||
|
sender.sendMessage("§r");
|
||||||
|
sender.sendMessage("§e------- ======= §6世界BOSS §e======= -------");
|
||||||
|
sender.sendMessage("§2/bossspawner §e[代号] §f- §2生成Boss");
|
||||||
|
sender.sendMessage("§e------- ======= §6世界BOSS §e======= -------");
|
||||||
|
sender.sendMessage("§r");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if(args.length >= 1 && sender.isOp()){
|
||||||
|
BossManage bossManage = Main.bossManage;
|
||||||
|
if(bossManage.isBossSurvive()){
|
||||||
|
Bukkit.getConsoleSender().sendMessage("[日志-世界Boss] 系统尝试多次执行召唤boss已被拦截.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
BossDamageByPlayer.damageMap.clear(); // 清理之前的伤害数据缓存
|
||||||
|
|
||||||
|
boolean antiSpawn = false;
|
||||||
|
if(args.length == 1) {
|
||||||
|
String stats_type = BossSpawnUtil.getTheCurrentServerPlayerStatus();
|
||||||
|
if (stats_type.equalsIgnoreCase("NoPlayer")) {
|
||||||
|
Bukkit.broadcastMessage("§6[§4公告§6] §a世界BOSS召唤失败,在线器师人数过低无法挑战.");
|
||||||
|
antiSpawn = true;
|
||||||
|
}
|
||||||
|
if (stats_type.equalsIgnoreCase("NoLevel")) {
|
||||||
|
Bukkit.broadcastMessage("§6[§4公告§6] §a世界BOSS召唤失败,在线器师无一人达到90级封号斗魂.");
|
||||||
|
antiSpawn = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!antiSpawn){
|
||||||
|
String bossKey = args[0];
|
||||||
|
BossData bossData = bossManage.getBossData(bossKey);
|
||||||
|
if(bossData != null){
|
||||||
|
Location spawnLoc = bossData.getLocation();// 获取生成点坐标
|
||||||
|
// 获取坐标周围30格范围内是否存在生物,若存在则清除
|
||||||
|
List<String> stringList = new ArrayList<>();
|
||||||
|
for (Entity entity : spawnLoc.getWorld().getNearbyEntities(spawnLoc,30,25,30)){
|
||||||
|
if(!(entity instanceof Item)) {
|
||||||
|
if(!(entity instanceof Player)){
|
||||||
|
if(entity.getCustomName() != null) {
|
||||||
|
stringList.add(entity.getCustomName());
|
||||||
|
entity.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(stringList.size() >= 1){
|
||||||
|
Bukkit.getConsoleSender().sendMessage("[日志-世界Boss] 清理周边怪物: "+stringList);
|
||||||
|
}
|
||||||
|
bossManage.setBossSurvive(true);
|
||||||
|
String bossName = bossData.getBossName();// 获取boss的自定义名字
|
||||||
|
String broadcast = bossData.getBc().replace("%mobs%",bossName); // 获取bc公告信息
|
||||||
|
Bukkit.broadcastMessage(broadcast);
|
||||||
|
Bukkit.broadcastMessage(broadcast);
|
||||||
|
// 发送VexViewAPI的信息
|
||||||
|
for (Player allp : Bukkit.getOnlinePlayers()) {
|
||||||
|
if (allp.getLevel() >= 40) {
|
||||||
|
// 发送Vex信息
|
||||||
|
String bc_vv = bossData.getBc_vv().replace("%mobs%", bossName);
|
||||||
|
VexViewAPI.sendFlowView(allp, bc_vv, 16, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
new BukkitRunnable() {
|
||||||
|
private int seconds = 0;
|
||||||
|
public void run() {
|
||||||
|
if(seconds == 2){
|
||||||
|
bossManage.setBossSurvive(false);
|
||||||
|
}
|
||||||
|
if(seconds >= 20){
|
||||||
|
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "mythicmobs mobs spawn " + bossKey + " 1 " + bossData.getLocString());
|
||||||
|
cancel();
|
||||||
|
}
|
||||||
|
seconds++;
|
||||||
|
}
|
||||||
|
}.runTaskTimer(Main.plugin,0, 20L);
|
||||||
|
WorldBossSpawnEvent event = new WorldBossSpawnEvent(bossName);
|
||||||
|
Bukkit.getPluginManager().callEvent(event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> onTabComplete(CommandSender sender, Command command, String label, String[] args) {
|
||||||
|
List<String> completions = new ArrayList<>();
|
||||||
|
if(args.length == 1){
|
||||||
|
completions.addAll(Main.bossManage.getBossKeyList());
|
||||||
|
}
|
||||||
|
return completions;
|
||||||
|
}
|
||||||
|
}
|
68
src/main/java/com/io/yaohun/worldbosshurt/data/BossData.java
Normal file
68
src/main/java/com/io/yaohun/worldbosshurt/data/BossData.java
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
package com.io.yaohun.worldbosshurt.data;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.configuration.file.FileConfiguration;
|
||||||
|
|
||||||
|
public class BossData {
|
||||||
|
private String bossKey;
|
||||||
|
private String bossName;
|
||||||
|
private int bossArmor;
|
||||||
|
private String killsReward;
|
||||||
|
private String topReward;
|
||||||
|
private String locString;
|
||||||
|
private String bc;
|
||||||
|
private String bc_vv;
|
||||||
|
|
||||||
|
public BossData(String bossKey,FileConfiguration yml){
|
||||||
|
String str = "BossData."+bossKey+".";
|
||||||
|
this.bossKey = bossKey;
|
||||||
|
this.bossName = yml.getString(str+"name").replace("&","§");
|
||||||
|
this.bossArmor = yml.getInt(str+"boss_armor") * 10000;
|
||||||
|
this.killsReward = null;
|
||||||
|
if(yml.getString(str+"reward_kills") != null) {
|
||||||
|
this.killsReward = yml.getString(str + "reward_kills");
|
||||||
|
}
|
||||||
|
this.topReward = null;
|
||||||
|
if(yml.getString(str+"reward_top") != null){
|
||||||
|
this.topReward = yml.getString(str+"reward_top");
|
||||||
|
}
|
||||||
|
this.locString = yml.getString(str+"loc");
|
||||||
|
this.bc = yml.getString(str+"bc").replace("&","§");
|
||||||
|
this.bc_vv = yml.getString(str+"bc_vv").replace("&","§");
|
||||||
|
}
|
||||||
|
|
||||||
|
public Location getLocation() {
|
||||||
|
String[] sp = this.locString.split(",");
|
||||||
|
String worldName = sp[0];
|
||||||
|
World world = Bukkit.getWorld(worldName);
|
||||||
|
int x = Integer.parseInt(sp[1]);
|
||||||
|
int y = Integer.parseInt(sp[2]);
|
||||||
|
int z = Integer.parseInt(sp[3]);
|
||||||
|
return new Location(world,x,y,z);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getBossKey() {return bossKey;}
|
||||||
|
|
||||||
|
public int getBossArmor() {
|
||||||
|
return bossArmor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getKillsReward() {
|
||||||
|
return killsReward;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTopReward() {
|
||||||
|
return topReward;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getBossName() {return bossName;}
|
||||||
|
|
||||||
|
public String getLocString() {
|
||||||
|
return locString;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getBc() {return bc;}
|
||||||
|
public String getBc_vv() {return bc_vv;}
|
||||||
|
}
|
|
@ -0,0 +1,90 @@
|
||||||
|
package com.io.yaohun.worldbosshurt.data;
|
||||||
|
|
||||||
|
import me.Demon.DemonPlugin.DemonAPI;
|
||||||
|
import org.bukkit.configuration.file.FileConfiguration;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class RewardData {
|
||||||
|
|
||||||
|
private String rewardKey;
|
||||||
|
|
||||||
|
private List<String> killsList;
|
||||||
|
|
||||||
|
private List<String> damageList;
|
||||||
|
|
||||||
|
private HashMap<String,List<String>> topList;
|
||||||
|
|
||||||
|
public RewardData(String rewardKey,FileConfiguration yml){
|
||||||
|
this.rewardKey = rewardKey;
|
||||||
|
String str = "RewardGroup."+rewardKey+".";
|
||||||
|
this.killsList = new ArrayList<>();
|
||||||
|
if(yml.getString(str+"kills") != null){
|
||||||
|
List<String> stringList = yml.getStringList(str+"kills");
|
||||||
|
for (String s : stringList){
|
||||||
|
if(s.contains(";")){
|
||||||
|
this.killsList.add(s);
|
||||||
|
}else {
|
||||||
|
this.killsList.add(s);
|
||||||
|
this.killsList.add(s);
|
||||||
|
this.killsList.add(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.damageList = new ArrayList<>();
|
||||||
|
if(yml.getString(str+"damage") != null){
|
||||||
|
this.damageList = yml.getStringList(str+"damage");
|
||||||
|
}
|
||||||
|
HashMap<String,List<String>> hashMap = new HashMap<>();
|
||||||
|
if(yml.getConfigurationSection(str+"top") != null) {
|
||||||
|
for (String top : yml.getConfigurationSection(str + "top").getKeys(false)) {
|
||||||
|
List<String> stringList = yml.getStringList(str + "top." + top);
|
||||||
|
hashMap.put(top, stringList);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.topList = hashMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRewardKey() {
|
||||||
|
if(rewardKey != null) {
|
||||||
|
return rewardKey;
|
||||||
|
}
|
||||||
|
return "无奖励";
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取最终击杀命令
|
||||||
|
public List<String> getKillsCmdList(){
|
||||||
|
int suijishu = (DemonAPI.getRandomInt(killsList.size(), 1) - 1);
|
||||||
|
String cmdsp = killsList.get(suijishu);
|
||||||
|
List<String> commands = Collections.singletonList(cmdsp);
|
||||||
|
if(cmdsp.contains(";")) {
|
||||||
|
commands = DemonAPI.StringConvertStringList(cmdsp, ";");
|
||||||
|
}
|
||||||
|
/*for (String s : commands){
|
||||||
|
Bukkit.getConsoleSender().sendMessage("#Text = "+s);
|
||||||
|
}*/
|
||||||
|
return commands;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取排名奖励
|
||||||
|
public List<String> getTopCmdList(int top){
|
||||||
|
String topKey = String.valueOf(top);
|
||||||
|
if(this.topList.get(topKey) != null) {
|
||||||
|
return this.topList.get(topKey);
|
||||||
|
}
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取排名奖励数量
|
||||||
|
public int getTopCmdSize(){
|
||||||
|
return this.topList.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取累积伤害奖励
|
||||||
|
public List<String> getDamageCmdList(){
|
||||||
|
return this.damageList;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
package com.io.yaohun.worldbosshurt.event;
|
||||||
|
|
||||||
|
import com.io.yaohun.worldbosshurt.data.BossData;
|
||||||
|
import com.io.yaohun.worldbosshurt.data.RewardData;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.Event;
|
||||||
|
import org.bukkit.event.HandlerList;
|
||||||
|
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
|
||||||
|
public class WorldBossDamageEvent extends Event {
|
||||||
|
|
||||||
|
private static HandlerList handlers = new HandlerList();
|
||||||
|
private Player player;
|
||||||
|
private double damage;
|
||||||
|
private BossData bossData;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HandlerList getHandlers() {
|
||||||
|
return handlers;
|
||||||
|
}
|
||||||
|
public static HandlerList getHandlerList() {
|
||||||
|
return handlers;
|
||||||
|
}
|
||||||
|
public WorldBossDamageEvent(Player player,BossData bossData,double damage) {
|
||||||
|
this.player = player;
|
||||||
|
this.bossData = bossData;
|
||||||
|
this.damage = damage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Player getPlayer() {return player;}
|
||||||
|
public String getBossKey(){return bossData.getBossKey();}
|
||||||
|
public String getMobName() {
|
||||||
|
return bossData.getBossName();
|
||||||
|
}
|
||||||
|
public BossData getBossData() {
|
||||||
|
return bossData;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getDamage() {
|
||||||
|
return damage * 1000;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,47 @@
|
||||||
|
package com.io.yaohun.worldbosshurt.event;
|
||||||
|
|
||||||
|
import com.io.yaohun.worldbosshurt.data.BossData;
|
||||||
|
import com.io.yaohun.worldbosshurt.data.RewardData;
|
||||||
|
import org.bukkit.event.Event;
|
||||||
|
import org.bukkit.event.HandlerList;
|
||||||
|
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
|
||||||
|
public class WorldBossDeathEvent extends Event {
|
||||||
|
|
||||||
|
private static HandlerList handlers = new HandlerList();
|
||||||
|
private BossData bossData;
|
||||||
|
private RewardData rewardData;
|
||||||
|
private LinkedHashMap<String, Double> sortedMap;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HandlerList getHandlers() {
|
||||||
|
return handlers;
|
||||||
|
}
|
||||||
|
public static HandlerList getHandlerList() {
|
||||||
|
return handlers;
|
||||||
|
}
|
||||||
|
public WorldBossDeathEvent(BossData bossData,RewardData rewardData,LinkedHashMap<String, Double> sortedMap) {
|
||||||
|
this.bossData = bossData;
|
||||||
|
this.rewardData = rewardData;
|
||||||
|
this.sortedMap = sortedMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getBossKey(){
|
||||||
|
return bossData.getBossKey();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMobName() {
|
||||||
|
return bossData.getBossName();
|
||||||
|
}
|
||||||
|
public BossData getBossData() {
|
||||||
|
return bossData;
|
||||||
|
}
|
||||||
|
|
||||||
|
public RewardData getRewardData() {
|
||||||
|
return rewardData;
|
||||||
|
}
|
||||||
|
public LinkedHashMap<String, Double> getSortedMap() {
|
||||||
|
return sortedMap;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
package com.io.yaohun.worldbosshurt.event;
|
||||||
|
|
||||||
|
import org.bukkit.event.Event;
|
||||||
|
import org.bukkit.event.HandlerList;
|
||||||
|
|
||||||
|
public class WorldBossSpawnEvent extends Event {
|
||||||
|
|
||||||
|
private static HandlerList handlers = new HandlerList();
|
||||||
|
private String mobName;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HandlerList getHandlers() {
|
||||||
|
return handlers;
|
||||||
|
}
|
||||||
|
public static HandlerList getHandlerList() {
|
||||||
|
return handlers;
|
||||||
|
}
|
||||||
|
public WorldBossSpawnEvent(String mobName) {
|
||||||
|
this.mobName = mobName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMobName() {
|
||||||
|
return mobName;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,101 @@
|
||||||
|
package com.io.yaohun.worldbosshurt.listener;
|
||||||
|
|
||||||
|
import com.io.yaohun.worldbosshurt.Main;
|
||||||
|
import com.io.yaohun.worldbosshurt.data.BossData;
|
||||||
|
import com.io.yaohun.worldbosshurt.mangage.BossManage;
|
||||||
|
import me.Demon.DemonPlugin.DemonAPI;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.entity.Projectile;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
public class BossArmor implements Listener {
|
||||||
|
|
||||||
|
private HashMap<UUID,Double> bossHurtMap = new HashMap<>();
|
||||||
|
|
||||||
|
private double getBossHurtDamage(UUID uuid){
|
||||||
|
if(bossHurtMap.get(uuid) == null){
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
return bossHurtMap.get(uuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addPlayerDamage(UUID uuid, double damage){
|
||||||
|
if(bossHurtMap.get(uuid) == null){
|
||||||
|
bossHurtMap.put(uuid,damage);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
double newDamage = damage + bossHurtMap.get(uuid);
|
||||||
|
bossHurtMap.put(uuid,newDamage);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean butt_hurt = false;
|
||||||
|
|
||||||
|
@EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR)
|
||||||
|
public void EntityDamageByEntity(EntityDamageByEntityEvent e) {
|
||||||
|
if(!(e.getEntity() instanceof Player)) {
|
||||||
|
Entity entity = e.getEntity(); // 获取受伤生物
|
||||||
|
String customName = entity.getCustomName(); // 获取生物自定义名
|
||||||
|
BossManage bossManage = Main.bossManage; // 获取boss管理
|
||||||
|
if (customName != null && bossManage.isCustomNameContains(customName)) {
|
||||||
|
BossData bossData = bossManage.getNameToData(customName);
|
||||||
|
DamageEvent(e, bossData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DamageEvent(EntityDamageByEntityEvent e, BossData dataAPI){
|
||||||
|
double damage = e.getDamage();
|
||||||
|
if(butt_hurt){
|
||||||
|
int start_armor_boss = dataAPI.getBossArmor();
|
||||||
|
int damage_limit_1 = (int) (start_armor_boss * 0.1); // 200W
|
||||||
|
int damage_limit_2 = (int) (start_armor_boss * 0.01); // 20W
|
||||||
|
int damage_limit_3 = (int) (start_armor_boss * 0.001); // 2W
|
||||||
|
if(damage >= damage_limit_1){
|
||||||
|
int rand_damage = DemonAPI.getRandomInt((damage_limit_2*5), damage_limit_2);
|
||||||
|
e.setDamage(rand_damage);
|
||||||
|
}else if(damage >= damage_limit_2){
|
||||||
|
int rand_damage = DemonAPI.getRandomInt(damage_limit_2*3, damage_limit_3);
|
||||||
|
e.setDamage(rand_damage);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(damage <= dataAPI.getBossArmor()) {
|
||||||
|
Entity entity = e.getEntity();
|
||||||
|
UUID uuid = entity.getUniqueId();
|
||||||
|
if (bossHurtMap.get(entity.getUniqueId()) != null) {
|
||||||
|
addPlayerDamage(uuid,damage);
|
||||||
|
double boss_armonr = getBossHurtDamage(uuid);
|
||||||
|
if (boss_armonr >= dataAPI.getBossArmor()) {
|
||||||
|
StartBossArmor("累伤触发");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
addPlayerDamage(uuid,damage);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
StartBossArmor("瞬伤触发");
|
||||||
|
e.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void StartBossArmor(String type){
|
||||||
|
butt_hurt = true;
|
||||||
|
int s = DemonAPI.getRandomInt(25, 10);
|
||||||
|
Bukkit.getConsoleSender().sendMessage("开启保护 开启保护 开启保护 开启保护#"+s+"s || "+type);
|
||||||
|
Bukkit.getScheduler().runTaskLater(Main.plugin, (Runnable) new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
butt_hurt = false;
|
||||||
|
bossHurtMap.clear();
|
||||||
|
Bukkit.getConsoleSender().sendMessage("关闭保护 关闭保护 关闭保护 关闭保护 ");
|
||||||
|
}
|
||||||
|
}, (long) 20*s);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,96 @@
|
||||||
|
package com.io.yaohun.worldbosshurt.listener;
|
||||||
|
|
||||||
|
import com.io.yaohun.worldbosshurt.Main;
|
||||||
|
import me.Demon.DemonPlugin.DemonAPI;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.entity.Projectile;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
||||||
|
|
||||||
|
import java.text.DecimalFormat;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
public class BossDamageByPlayer implements Listener {
|
||||||
|
|
||||||
|
public static HashMap<Player,Double> damageMap = new HashMap<>();
|
||||||
|
|
||||||
|
private void addPlayerDamage(Player player,double damage){
|
||||||
|
double newDamage = damage / 1000;
|
||||||
|
if(damageMap.get(player) == null){
|
||||||
|
damageMap.put(player,newDamage);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
double addDamage = newDamage + damageMap.get(player);
|
||||||
|
damageMap.put(player,addDamage);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR)
|
||||||
|
public void onEntityDamageByPlayer(EntityDamageByEntityEvent e) {
|
||||||
|
if(e.getDamager() instanceof Player){
|
||||||
|
Entity entity = e.getEntity();
|
||||||
|
String customName = entity.getCustomName();
|
||||||
|
if(customName != null && Main.bossManage.isCustomNameContains(customName)){
|
||||||
|
Player p = (Player) e.getDamager();
|
||||||
|
String worldName = p.getWorld().getName();
|
||||||
|
if(!worldName.equalsIgnoreCase("teamDungee")) {
|
||||||
|
if(customName.contains("§t§e§a§m")){
|
||||||
|
e.getEntity().remove();
|
||||||
|
Bukkit.getConsoleSender().sendMessage("[世界boss-日志] 因 "+customName+" §r离开团队副本,此Boss已清理.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
boolean isBossName = false;
|
||||||
|
for (String bossName : BossSpawnLogs.WhiteBossList){
|
||||||
|
if(customName.contains(bossName)){
|
||||||
|
isBossName = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!isBossName){
|
||||||
|
e.getEntity().remove();
|
||||||
|
Bukkit.broadcastMessage("§6[§4公告§6] §a"+customName+"§a被卷入了异次元时空.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
double damage = e.getDamage();
|
||||||
|
DemonAPI.sendTitle(p, 5, 20, 5, "", "§c§l造成伤害: §a§l+" + new DecimalFormat("0.00").format(damage));
|
||||||
|
addPlayerDamage(p,e.getDamage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR)
|
||||||
|
public void onEntityDamageByProjectile(EntityDamageByEntityEvent e) {
|
||||||
|
if (e.getDamager() instanceof Projectile) {
|
||||||
|
Projectile projectile = (Projectile) e.getDamager();
|
||||||
|
if (projectile.getShooter() instanceof Player) {
|
||||||
|
Entity entity = e.getEntity();
|
||||||
|
String customName = entity.getCustomName();
|
||||||
|
if (customName != null && Main.bossManage.isCustomNameContains(customName)) {
|
||||||
|
Player p = (Player) projectile.getShooter();
|
||||||
|
String worldName = p.getWorld().getName();
|
||||||
|
if (!worldName.equalsIgnoreCase("teamDungee")) {
|
||||||
|
if (customName.contains("§t§e§a§m")) {
|
||||||
|
e.getEntity().remove();
|
||||||
|
Bukkit.getConsoleSender().sendMessage("[世界boss-日志] 因 " + customName + " §r离开团队副本,此Boss已清理.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
UUID Mob_uuid = e.getEntity().getUniqueId();
|
||||||
|
if (!BossSpawnLogs.WhiteBossList.contains(Mob_uuid)) {
|
||||||
|
e.getEntity().remove();
|
||||||
|
Bukkit.broadcastMessage("§6[§4公告§6] §a" + customName + "§a被卷入了异次元时空.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
double damage = e.getDamage();
|
||||||
|
DemonAPI.sendTitle(p, 5, 20, 5, "", "§c§l造成伤害: §a§l+" + new DecimalFormat("0.00").format(damage));
|
||||||
|
addPlayerDamage(p, e.getDamage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
package com.io.yaohun.worldbosshurt.listener;
|
||||||
|
|
||||||
|
import com.io.yaohun.worldbosshurt.data.RewardData;
|
||||||
|
import com.io.yaohun.worldbosshurt.event.WorldBossDeathEvent;
|
||||||
|
import me.Demon.DemonPlugin.DemonAPI;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class BossDeathEvent implements Listener {
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onBossDeath(WorldBossDeathEvent e){
|
||||||
|
RewardData rewardData = e.getRewardData();
|
||||||
|
LinkedHashMap<String, Double> hashMap = e.getSortedMap();
|
||||||
|
int rank = 1;
|
||||||
|
for (String name : hashMap.keySet()) {
|
||||||
|
if (rank >= 6) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
List<String> rankRewardList = rewardData.getTopCmdList(rank);
|
||||||
|
if (rankRewardList.size() >= 1) {
|
||||||
|
Player onlinePlayer = Bukkit.getPlayer(name);
|
||||||
|
if (onlinePlayer != null && onlinePlayer.isOnline()) {
|
||||||
|
DemonAPI.ConsoleOutCommandList(onlinePlayer, rankRewardList);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rank++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,156 @@
|
||||||
|
package com.io.yaohun.worldbosshurt.listener;
|
||||||
|
|
||||||
|
import com.io.yaohun.worldbosshurt.Main;
|
||||||
|
import com.io.yaohun.worldbosshurt.data.BossData;
|
||||||
|
import com.io.yaohun.worldbosshurt.data.RewardData;
|
||||||
|
import com.io.yaohun.worldbosshurt.event.WorldBossDamageEvent;
|
||||||
|
import com.io.yaohun.worldbosshurt.event.WorldBossDeathEvent;
|
||||||
|
import com.io.yaohun.worldbosshurt.mangage.BossManage;
|
||||||
|
import com.io.yaohun.worldbosshurt.util.BossStack;
|
||||||
|
import com.io.yaohun.worldbosshurt.util.BossUtil;
|
||||||
|
import io.lumine.xikage.mythicmobs.api.bukkit.events.MythicMobDeathEvent;
|
||||||
|
import me.Demon.DemonPlugin.DemonAPI;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
|
||||||
|
import java.text.DecimalFormat;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
public class BossKillsDeath implements Listener {
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onkilldrop(MythicMobDeathEvent e){
|
||||||
|
if(e.getKiller() instanceof Player) { // 判断斩杀者是玩家
|
||||||
|
Entity entity = e.getEntity();
|
||||||
|
BossManage bossManage = Main.bossManage;
|
||||||
|
String customName = entity.getCustomName();
|
||||||
|
if(customName != null && bossManage.isCustomNameContains(customName)){
|
||||||
|
BossData bossData = bossManage.getNameToData(customName);
|
||||||
|
if(bossData == null){return;}
|
||||||
|
String worldName = entity.getWorld().getName();
|
||||||
|
if (!worldName.equalsIgnoreCase("teamDungee")) {
|
||||||
|
Player player = ((Player) e.getKiller()).getPlayer();
|
||||||
|
String message = BossUtil.getFinallyKills().replace("%p%", player.getName()); // 获取最终击杀提示
|
||||||
|
Bukkit.broadcastMessage(message.replace("%mobs%",bossData.getBossName())); // 发送最终击杀提示
|
||||||
|
BossUtil.addMonthlyKillBoss(player.getName()); // 为玩家累积最终斩杀次数
|
||||||
|
String Kills_Group_Key = bossData.getKillsReward(); // 获取击杀奖励组名
|
||||||
|
RewardData killsRewardData = Main.rewardManage.getRewardData(Kills_Group_Key);
|
||||||
|
// 执行命令并发放奖励
|
||||||
|
if(bossData.getKillsReward() != null){
|
||||||
|
if (!Kills_Group_Key.equalsIgnoreCase("魂环")) {
|
||||||
|
List<String> commands = killsRewardData.getKillsCmdList();
|
||||||
|
DemonAPI.ConsoleOutCommandList(player, commands);
|
||||||
|
}else{
|
||||||
|
sendRingRewards(player,bossData,killsRewardData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
new BukkitRunnable() {
|
||||||
|
public void run() {
|
||||||
|
statisticalSettlementOfDamages(bossData,Main.rewardManage.getRewardData(bossData.getTopReward()));
|
||||||
|
cancel();
|
||||||
|
}
|
||||||
|
}.runTaskLater(Main.plugin, 20L);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 将对boss造成伤害的存进Hash
|
||||||
|
* 并进行排序随后发送全服公告
|
||||||
|
* */
|
||||||
|
public static void statisticalSettlementOfDamages(BossData bossData,RewardData rewardData) {
|
||||||
|
double totalDamage = 0; // 获取本次造成总伤害
|
||||||
|
HashMap<String, Double> hashMap = new HashMap<>();
|
||||||
|
Map<Player, Double> damageMap = BossDamageByPlayer.damageMap;
|
||||||
|
List<Player> playerList = new ArrayList<>();
|
||||||
|
for (Player player : damageMap.keySet()) {
|
||||||
|
if (player != null && player.isOnline()) {
|
||||||
|
double damage = damageMap.get(player); // 获取该玩家造成伤害
|
||||||
|
totalDamage += damage; // 统计玩家造成总计伤害
|
||||||
|
hashMap.put(player.getName(), damage); // 将玩家名和伤害存储
|
||||||
|
playerList.add(player); // 将玩家存入在线玩家列表
|
||||||
|
WorldBossDamageEvent worldBossDamageEvent = new WorldBossDamageEvent(player,bossData,damage);
|
||||||
|
Bukkit.getPluginManager().callEvent(worldBossDamageEvent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (hashMap.size() < 1) { return; }
|
||||||
|
LinkedHashMap<String, Double> sortedMap = hashMap.entrySet()
|
||||||
|
.stream()
|
||||||
|
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
|
||||||
|
.collect(Collectors.toMap(
|
||||||
|
Map.Entry::getKey,
|
||||||
|
Map.Entry::getValue,
|
||||||
|
(e1, e2) -> e1,
|
||||||
|
LinkedHashMap::new
|
||||||
|
));
|
||||||
|
Bukkit.broadcastMessage("§c§M §6§m §e§m §a§m §b§m §C§L▍ §c§l伤§6§l害§E§L统§A§l计§B§L表 §C§l▍§b§M §a§M §e§M §6§m §c§m §r");
|
||||||
|
Bukkit.broadcastMessage("§e世界级Boss: "+bossData.getBossName()+" §e伤害排名如下:");
|
||||||
|
int rank = 1;
|
||||||
|
for (String top_Name : sortedMap.keySet()){
|
||||||
|
if(rank == 6){break;}
|
||||||
|
double damage = sortedMap.get(top_Name);
|
||||||
|
Bukkit.broadcastMessage("§e第" + rank + "名 - §c" + top_Name + " §e总计伤害: §c" + new DecimalFormat("00.00").format(damage) + "k §e伤害占总比: §c" + new DecimalFormat("0.00").format(damage / totalDamage * 100) + "%");
|
||||||
|
rank++;
|
||||||
|
}
|
||||||
|
Bukkit.broadcastMessage("§c§M §6§m §e§m §a§m §b§m §C§L▍ §c§l伤§6§l害§E§L统§A§l计§B§L表 §C§l▍§b§M §a§M §e§M §6§m §c§m §r");
|
||||||
|
for (Player player : playerList){
|
||||||
|
if(BossDamageByPlayer.damageMap.get(player) != null) {
|
||||||
|
double damage = BossDamageByPlayer.damageMap.get(player); // 获取玩家造成伤害
|
||||||
|
player.sendMessage("§e您造成的总伤害: §c" + new DecimalFormat(",###.00").format(damage) + "k §e伤害占总比: §c" + new DecimalFormat("0.00").format(damage / totalDamage * 100) + "%");
|
||||||
|
if(rewardData != null) {
|
||||||
|
// 判断玩家造成伤害是否达到100K并发放奖励
|
||||||
|
if (damage >= 10) {
|
||||||
|
List<String> damageRewardList = rewardData.getDamageCmdList();
|
||||||
|
DemonAPI.ConsoleOutCommandList(player, damageRewardList);
|
||||||
|
} else {
|
||||||
|
DemonAPI.sendMessage(player, "你造成的总伤害不足§4100,000§a无法获得参与奖。");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
WorldBossDeathEvent worldBossDeathEvent = new WorldBossDeathEvent(bossData,rewardData,sortedMap);
|
||||||
|
Bukkit.getPluginManager().callEvent(worldBossDeathEvent);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendRingRewards(Player player,BossData bossData,RewardData rewardData) {
|
||||||
|
String name = player.getName();
|
||||||
|
if(DemonAPI.getRandomInt(100,1) >= 10){
|
||||||
|
DemonAPI.sendMessage(player,"很遗憾,这只灵兽的最终一击并未掉落任何奖励。");
|
||||||
|
}else{
|
||||||
|
String bossKey = bossData.getBossKey();
|
||||||
|
if (DemonAPI.getRandomInt(100,1) >= 2) {
|
||||||
|
if (DemonAPI.getRandomInt(100, 1) > 10) {
|
||||||
|
player.getInventory().addItem(BossStack.BossSlashProof(bossKey));
|
||||||
|
Bukkit.broadcastMessage("§6[§4公告§6] §e"+name+" §a通过最终一击获得了 §c§l猎杀凭证 §f("+bossKey+")");
|
||||||
|
} else {
|
||||||
|
if(rewardData.getRewardKey().contains("百万年")){
|
||||||
|
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "mythicmobs items give " + name + " 百万年" + bossKey + "灵环无献祭");
|
||||||
|
DemonAPI.sendMessage(player,"恭喜你获得了 §6§l百万年灵环 §f(" + bossKey + ")");
|
||||||
|
Bukkit.broadcastMessage("§6[§4公告§6] §e" + name + " §a通过最终一击获得了 §6§l百万年灵环 §f(" + bossKey + ")");
|
||||||
|
} else {
|
||||||
|
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "mythicmobs items give " + name + " 十万年" + bossKey + "灵环无献祭");
|
||||||
|
DemonAPI.sendMessage(player,"恭喜你获得了 §c§l十万年灵环 §f(" + bossKey + ")");
|
||||||
|
Bukkit.broadcastMessage("§6[§4公告§6] §e" + name + " §a通过最终一击获得了 §c§l十万年灵环 §f(" + bossKey + ")");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(rewardData.getRewardKey().contains("百万年")){
|
||||||
|
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "mythicmobs items give " + name + " 百万年" + bossKey + "灵环");
|
||||||
|
DemonAPI.sendMessage(player,"恭喜你获得了 §6§l百万年灵环 §f(" + bossKey + ")§d[含献祭]");
|
||||||
|
Bukkit.broadcastMessage("§6[§4公告§6] §e" + name + " §a通过最终一击获得了 §6§l百万年灵环 §f(" + bossKey + ")§d[含献祭]");
|
||||||
|
}else {
|
||||||
|
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "mythicmobs items give " + name + " 十万年" + bossKey + "灵环");
|
||||||
|
DemonAPI.sendMessage(player,"恭喜你获得了 §c§l十万年灵环 §f(" + bossKey + ")§d[含献祭]");
|
||||||
|
Bukkit.broadcastMessage("§6[§4公告§6] §e" + name + " §a通过最终一击获得了 §c§l十万年灵环 §f(" + bossKey + ")§d[含献祭]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,164 @@
|
||||||
|
package com.io.yaohun.worldbosshurt.listener;
|
||||||
|
|
||||||
|
import com.io.yaohun.worldbosshurt.util.BossStack;
|
||||||
|
import me.Demon.DemonHunHuanSX.HunHuanAPI;
|
||||||
|
import me.Demon.DemonHunHuanSX.Main;
|
||||||
|
import me.Demon.DemonPlugin.DemonAPI;
|
||||||
|
import me.Demon.ItemKuAPI;
|
||||||
|
import net.minecraft.server.v1_12_R1.NBTTagCompound;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Sound;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.block.Action;
|
||||||
|
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||||
|
import org.bukkit.event.player.PlayerInteractEvent;
|
||||||
|
import org.bukkit.inventory.EquipmentSlot;
|
||||||
|
import org.bukkit.inventory.Inventory;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class BossProveEvent implements Listener {
|
||||||
|
|
||||||
|
public static String invTitle = "斗魂偙国 - 十万年凭证兑换";
|
||||||
|
/*
|
||||||
|
* 交换兑换十万年魂环
|
||||||
|
* */
|
||||||
|
@EventHandler
|
||||||
|
public void onclick(InventoryClickEvent e){
|
||||||
|
int rawSlot = e.getRawSlot();
|
||||||
|
Player p = (Player) e.getWhoClicked();
|
||||||
|
Inventory inv = e.getInventory();
|
||||||
|
ItemStack item = e.getCurrentItem();
|
||||||
|
if(inv != null && invTitle.equalsIgnoreCase(inv.getTitle())){
|
||||||
|
e.setCancelled(true);
|
||||||
|
if(!DemonAPI.itemIsNull(item) && !DemonAPI.itemIsLore(item)){
|
||||||
|
p.playSound(p.getLocation(),Sound.BLOCK_COMPARATOR_CLICK,1.6F,1.8F);
|
||||||
|
NBTTagCompound nbt = BossStack.getNBT(item);
|
||||||
|
if(nbt.hasKey("hhkey")){
|
||||||
|
String hhkey = nbt.getString("hhkey");
|
||||||
|
p.closeInventory(); // 关闭界面
|
||||||
|
ItemStack needStack = BossStack.BossSlashProof(hhkey);
|
||||||
|
if(!DemonAPI.isPlayerItemsLore(p,needStack,8)){
|
||||||
|
DemonAPI.sendMessage(p,"兑换失败,缺少该十万年灵兽的猎杀凭证。",Sound.ENTITY_VILLAGER_NO);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ItemStack laborStack = ItemKuAPI.getItems("劳动者结晶",1);
|
||||||
|
if(!DemonAPI.isPlayerItemsLore(p,laborStack,2)){
|
||||||
|
DemonAPI.sendMessage(p,"兑换失败,缺少劳动者结晶。",Sound.ENTITY_VILLAGER_NO);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
DemonAPI.removePlayerItemsLore(p,needStack,8); // 扣除凭证
|
||||||
|
DemonAPI.removePlayerItemsLore(p,laborStack,2); // 扣除劳动者结晶
|
||||||
|
ItemStack hh_item = HunHuanAPI.getHHItems("十万年_"+hhkey+"灵环");
|
||||||
|
p.getInventory().addItem(hh_item);
|
||||||
|
p.sendMessage(Main.prefix+"兑换成功,你获得了 "+hh_item.getItemMeta().getDisplayName());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(nbt.hasKey("hhkeypro")){
|
||||||
|
String hhkey = nbt.getString("hhkeypro");
|
||||||
|
p.closeInventory(); // 关闭界面
|
||||||
|
ItemStack needStack = BossStack.BossSlashProof(hhkey);
|
||||||
|
if(!DemonAPI.isPlayerItemsLore(p,needStack,12)){
|
||||||
|
DemonAPI.sendMessage(p,"兑换失败,缺少该十万年灵兽的猎杀凭证。",Sound.ENTITY_VILLAGER_NO);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 获取灵环精片
|
||||||
|
ItemStack spermTablets = ItemKuAPI.getItems("灵环精片",1);
|
||||||
|
if(!DemonAPI.isPlayerItemsLore(p,spermTablets,64)){
|
||||||
|
DemonAPI.sendMessage(p,"兑换失败,缺少灵环精片。",Sound.ENTITY_VILLAGER_NO);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ItemStack laborStack = ItemKuAPI.getItems("劳动者结晶",1);
|
||||||
|
if(!DemonAPI.isPlayerItemsLore(p,laborStack,10)){
|
||||||
|
DemonAPI.sendMessage(p,"兑换失败,缺少劳动者结晶。",Sound.ENTITY_VILLAGER_NO);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
DemonAPI.removePlayerItemsLore(p,needStack,12); // 扣除凭证
|
||||||
|
DemonAPI.removePlayerItemsLore(p,laborStack,10); // 扣除劳动者结晶
|
||||||
|
DemonAPI.removePlayerItemsLore(p,spermTablets,64); // 扣除灵环精片
|
||||||
|
ItemStack hh_item = HunHuanAPI.getHHItems("十万年_"+hhkey+"灵环");
|
||||||
|
ItemMeta meta = hh_item.getItemMeta();
|
||||||
|
List<String> lore = meta.getLore();
|
||||||
|
lore.add("§d十万年灵兽自愿献祭标识");
|
||||||
|
meta.setLore(lore);
|
||||||
|
hh_item.setItemMeta(meta);
|
||||||
|
p.getInventory().addItem(hh_item);
|
||||||
|
p.sendMessage(Main.prefix+"兑换成功,你获得了 "+hh_item.getItemMeta().getDisplayName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* 玩家手持凭证打开兑换界面
|
||||||
|
* */
|
||||||
|
@EventHandler
|
||||||
|
public void onUse(PlayerInteractEvent e){
|
||||||
|
Player player = e.getPlayer();
|
||||||
|
ItemStack item = player.getInventory().getItemInMainHand();
|
||||||
|
if(e.getHand() == EquipmentSlot.HAND){
|
||||||
|
if(e.getAction() == Action.RIGHT_CLICK_AIR || e.getAction() == Action.RIGHT_CLICK_BLOCK){
|
||||||
|
if(BossStack.isItemBossProve(item)){
|
||||||
|
e.setCancelled(true);
|
||||||
|
BossProveEvent.OpenGui(player);
|
||||||
|
player.playSound(player.getLocation(), Sound.BLOCK_COMPARATOR_CLICK,1.6F,1.8F);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void OpenGui(Player p){
|
||||||
|
Inventory inv = Bukkit.createInventory(null,27,invTitle);
|
||||||
|
inv.setItem(0,Show_Items("巨兽泰坦"));
|
||||||
|
inv.setItem(1,Show_Items("青天牛马"));
|
||||||
|
inv.setItem(2,Show_Items("奇灵舞魅兔"));
|
||||||
|
inv.setItem(3,Show_Items("冰封魔焰虎"));
|
||||||
|
inv.setItem(4,Show_Items("噬魂蛛皇"));
|
||||||
|
inv.setItem(5,Show_Items("雷暴狮王"));
|
||||||
|
inv.setItem(18,Hd_Items("巨兽泰坦"));
|
||||||
|
inv.setItem(19,Hd_Items("青天牛马"));
|
||||||
|
inv.setItem(20,Hd_Items("奇灵舞魅兔"));
|
||||||
|
inv.setItem(21,Hd_Items("冰封魔焰虎"));
|
||||||
|
inv.setItem(22,Hd_Items("噬魂蛛皇"));
|
||||||
|
inv.setItem(23,Hd_Items("雷暴狮王"));
|
||||||
|
p.openInventory(inv);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ItemStack Show_Items(String keyName){
|
||||||
|
ItemStack item = HunHuanAPI.getHHItems("十万年_"+keyName+"灵环");
|
||||||
|
ItemMeta meta = item.getItemMeta();
|
||||||
|
List<String> lore = meta.getLore();
|
||||||
|
lore.add(" ");
|
||||||
|
lore.add("§7-----[兑换需求材料]-----");
|
||||||
|
lore.add("§c§l猎杀凭证 §f("+keyName+") §7x 8");
|
||||||
|
lore.add("§2§l劳动者结晶 §7x 2");
|
||||||
|
lore.add("§a§l✔§f左键点击兑换");
|
||||||
|
meta.setLore(lore);
|
||||||
|
item.setItemMeta(meta);
|
||||||
|
NBTTagCompound nbt = BossStack.getNBT(item);
|
||||||
|
nbt.setString("hhkey",keyName);
|
||||||
|
return BossStack.setNBT(item,nbt);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ItemStack Hd_Items(String keyName){
|
||||||
|
ItemStack item = HunHuanAPI.getHHItems("十万年_"+keyName+"灵环");
|
||||||
|
ItemMeta meta = item.getItemMeta();
|
||||||
|
List<String> lore = meta.getLore();
|
||||||
|
lore.add("§d十万年灵兽自愿献祭标识");
|
||||||
|
lore.add(" ");
|
||||||
|
lore.add("§7-----[兑换需求材料]-----");
|
||||||
|
lore.add("§c§l猎杀凭证 §f("+keyName+") §7x 12");
|
||||||
|
lore.add("§b§l灵环精片 §7x 64");
|
||||||
|
lore.add("§2§l劳动者结晶 §7x 10");
|
||||||
|
lore.add("§a§l✔§f左键点击兑换");
|
||||||
|
lore.add("§b#活动期间限时开放");
|
||||||
|
meta.setLore(lore);
|
||||||
|
item.setItemMeta(meta);
|
||||||
|
NBTTagCompound nbt = BossStack.getNBT(item);
|
||||||
|
nbt.setString("hhkeypro",keyName);
|
||||||
|
return BossStack.setNBT(item,nbt);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
package com.io.yaohun.worldbosshurt.listener;
|
||||||
|
|
||||||
|
import com.io.yaohun.worldbosshurt.event.WorldBossSpawnEvent;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class BossSpawnLogs implements Listener {
|
||||||
|
|
||||||
|
public static List<String> WhiteBossList = new ArrayList<>();
|
||||||
|
@EventHandler
|
||||||
|
public void onSpawnBlockEvent(WorldBossSpawnEvent e) {
|
||||||
|
String customName = e.getMobName();
|
||||||
|
WhiteBossList.add(customName);
|
||||||
|
Bukkit.getConsoleSender().sendMessage("[日志-UUID导入] Boss "+customName+" §r已被录入List");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,18 +0,0 @@
|
||||||
package com.io.yaohun.worldbosshurt;
|
|
||||||
|
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
|
||||||
|
|
||||||
public class main extends JavaPlugin {
|
|
||||||
|
|
||||||
private static main instance;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onEnable() {
|
|
||||||
instance = this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static main getInstance() {
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -0,0 +1,74 @@
|
||||||
|
package com.io.yaohun.worldbosshurt.mangage;
|
||||||
|
|
||||||
|
import com.io.yaohun.worldbosshurt.Main;
|
||||||
|
import com.io.yaohun.worldbosshurt.data.BossData;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.configuration.file.FileConfiguration;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class BossManage {
|
||||||
|
|
||||||
|
private boolean bossSurvive;
|
||||||
|
private final List<String> bossKeyList = new ArrayList<>(); // 获取boss名列表
|
||||||
|
private final List<String> customNameList = new ArrayList<>(); // 获取boss名列表
|
||||||
|
private final HashMap<String, BossData> bossDataMap = new HashMap<>();
|
||||||
|
|
||||||
|
public BossManage(FileConfiguration yml) {
|
||||||
|
this.bossSurvive = false;
|
||||||
|
for (String bossKey : yml.getConfigurationSection("BossData").getKeys(false)) {
|
||||||
|
bossDataMap.put(bossKey, new BossData(bossKey, yml));
|
||||||
|
String customName = yml.getString("BossData." + bossKey + ".name");
|
||||||
|
customNameList.add(customName);
|
||||||
|
bossKeyList.add(bossKey);
|
||||||
|
}
|
||||||
|
Bukkit.getConsoleSender().sendMessage("§b[BossHurt] §f已导入Boss: §a" + customNameList.size() + "只");
|
||||||
|
}
|
||||||
|
|
||||||
|
public BossData getBossData(String bossKey) {
|
||||||
|
if (bossDataMap.get(bossKey) == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return bossDataMap.get(bossKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
public BossData getNameToData(String customName) {
|
||||||
|
for (String bossKey : bossDataMap.keySet()) {
|
||||||
|
BossData data = bossDataMap.get(bossKey);
|
||||||
|
String bossName = data.getBossName();
|
||||||
|
if (customName.contains(bossName)) {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isBossSurvive() {
|
||||||
|
return bossSurvive;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBossSurvive(boolean butt) {
|
||||||
|
bossSurvive = butt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> getBossKeyList() {
|
||||||
|
return bossKeyList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isCustomNameContains(String customName) {
|
||||||
|
// 检查 customName 是否为 null
|
||||||
|
if (customName == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// 遍历 customNameList 检查是否有任何名称包含 customName
|
||||||
|
for (String name : this.customNameList) {
|
||||||
|
// 检查 name 是否为 null
|
||||||
|
if (name != null && customName.contains(name)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
package com.io.yaohun.worldbosshurt.mangage;
|
||||||
|
|
||||||
|
import com.io.yaohun.worldbosshurt.data.RewardData;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.configuration.file.FileConfiguration;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
public class RewardManage {
|
||||||
|
|
||||||
|
private final HashMap<String, RewardData> rewardDataMap = new HashMap<>();
|
||||||
|
public RewardManage(FileConfiguration yml) {
|
||||||
|
if(yml.getConfigurationSection("RewardGroup") != null) {
|
||||||
|
for (String rewardKey : yml.getConfigurationSection("RewardGroup").getKeys(false)){
|
||||||
|
rewardDataMap.put(rewardKey,new RewardData(rewardKey,yml));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Bukkit.getConsoleSender().sendMessage("§b[BossHurt] §f已导入奖励方案: §a" + rewardDataMap.size() + "个");
|
||||||
|
}
|
||||||
|
|
||||||
|
public RewardData getRewardData(String string) {
|
||||||
|
if(rewardDataMap.get(string) != null){
|
||||||
|
return rewardDataMap.get(string);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
package com.io.yaohun.worldbosshurt.util;
|
||||||
|
|
||||||
|
import me.Demon.DemonLevels.api.DLevelAPI;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
public class BossSpawnUtil {
|
||||||
|
|
||||||
|
public static String getTheCurrentServerPlayerStatus(){
|
||||||
|
// 如果服务器没有玩家在线则无法召唤
|
||||||
|
int online_size = Bukkit.getOnlinePlayers().size();
|
||||||
|
if(online_size <= 0){
|
||||||
|
return "NoPlayer";
|
||||||
|
}
|
||||||
|
// 在线人数小于15人 但有90级玩家 可召唤
|
||||||
|
if (online_size <= 14) {
|
||||||
|
for (Player p : Bukkit.getOnlinePlayers()){
|
||||||
|
double level = DLevelAPI.getOffPlayer_Level(p.getName());
|
||||||
|
Bukkit.getConsoleSender().sendMessage("[世界BOSS-输出日志] 玩家 "+p.getName()+" 等级: "+level+" 需求等级: 90级");
|
||||||
|
if(level >= 90) {
|
||||||
|
return "Start";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 在线人数大于15人 可召唤
|
||||||
|
if (online_size >= 15) {
|
||||||
|
return "Start";
|
||||||
|
}
|
||||||
|
return "NoLevel";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,61 @@
|
||||||
|
package com.io.yaohun.worldbosshurt.util;
|
||||||
|
|
||||||
|
import com.io.yaohun.worldbosshurt.Main;
|
||||||
|
import me.Demon.DemonPlugin.DemonAPI;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.configuration.file.FileConfiguration;
|
||||||
|
import org.bukkit.craftbukkit.v1_12_R1.inventory.CraftItemStack;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
|
import net.minecraft.server.v1_12_R1.NBTTagCompound;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
public class BossStack {
|
||||||
|
|
||||||
|
|
||||||
|
public static NBTTagCompound getNBT(ItemStack Equipment) {
|
||||||
|
net.minecraft.server.v1_12_R1.ItemStack nmsEquipment = CraftItemStack.asNMSCopy(Equipment);
|
||||||
|
return nmsEquipment.hasTag() && nmsEquipment.getTag() != null ? nmsEquipment.getTag() : new NBTTagCompound();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ItemStack setNBT(ItemStack item, NBTTagCompound nbtEquipment) {
|
||||||
|
net.minecraft.server.v1_12_R1.ItemStack nmsEquipment = CraftItemStack.asNMSCopy(item);
|
||||||
|
nmsEquipment.setTag(nbtEquipment);
|
||||||
|
return CraftItemStack.asBukkitCopy(nmsEquipment);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 增加玩家每月Boss击杀数
|
||||||
|
* */
|
||||||
|
public static ItemStack BossSlashProof(String bossName){
|
||||||
|
ItemStack item = new ItemStack(Material.PAPER,1);
|
||||||
|
ItemMeta meta = item.getItemMeta();
|
||||||
|
meta.setDisplayName("§c§l猎杀凭证 §f("+bossName+")");
|
||||||
|
List<String> lore = new ArrayList<>();
|
||||||
|
lore.add("§c§l★§7通过猎杀§c十万年级§7以上");
|
||||||
|
lore.add("§7灵兽§a掉落§7的凭证,§a集齐多张");
|
||||||
|
lore.add("§7可兑换§c十万年级§7以上灵环!");
|
||||||
|
lore.add("§b§l✪§7务必要妥善保管此凭证!");
|
||||||
|
meta.setLore(lore);
|
||||||
|
item.setItemMeta(meta);
|
||||||
|
NBTTagCompound nbt = getNBT(item);
|
||||||
|
nbt.setString("stex","cailiao_68");
|
||||||
|
return setNBT(item,nbt);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isItemBossProve(ItemStack item){
|
||||||
|
if(DemonAPI.itemIsNull(item) || DemonAPI.itemIsLore(item)){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
ItemMeta meta = item.getItemMeta();
|
||||||
|
if(meta.getDisplayName().contains("§c§l猎杀凭证")){
|
||||||
|
if(meta.getLore().contains("§7灵兽§a掉落§7的凭证,§a集齐多张")){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
106
src/main/java/com/io/yaohun/worldbosshurt/util/BossUtil.java
Normal file
106
src/main/java/com/io/yaohun/worldbosshurt/util/BossUtil.java
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
package com.io.yaohun.worldbosshurt.util;
|
||||||
|
|
||||||
|
import com.io.yaohun.worldbosshurt.Main;
|
||||||
|
import me.Demon.DemonBanK.BankAPI;
|
||||||
|
import me.Demon.DemonPlugin.DemonAPI;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.configuration.file.FileConfiguration;
|
||||||
|
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
public class BossUtil {
|
||||||
|
|
||||||
|
public static String finallyKills = "§6[§4公告§6] §a玩家 §c%p% §a夺取了 §r%mobs% §6§l最终一击!";
|
||||||
|
|
||||||
|
public static String getFinallyKills() {
|
||||||
|
return finallyKills;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 增加玩家每月Boss击杀数
|
||||||
|
* */
|
||||||
|
public static void addMonthlyKillBoss(String name){
|
||||||
|
FileConfiguration yml = Main.plugin.getConfig();
|
||||||
|
int killAmount = yml.getInt("MonthlyKillsTop."+name);
|
||||||
|
yml.set("MonthlyKillsTop."+name,(killAmount+1));
|
||||||
|
Main.plugin.saveConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 获取每月数据刷新时间
|
||||||
|
* */
|
||||||
|
public static String getTimeMonthly(){
|
||||||
|
FileConfiguration yml = Main.plugin.getConfig();
|
||||||
|
if(yml.getString("TimeMonth") != null){
|
||||||
|
return yml.getString("TimeMonth");
|
||||||
|
}
|
||||||
|
return "2022/04";
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 判断本月数据是否刷新
|
||||||
|
* */
|
||||||
|
public static boolean isTimeMonthly(){
|
||||||
|
if(!getTimeMonthly().equalsIgnoreCase(DemonAPI.getTime("yyyy/MM"))){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 结算上月累积击杀十万年次数排行
|
||||||
|
* */
|
||||||
|
public static void settlementRankingRewards() {
|
||||||
|
FileConfiguration yml = Main.plugin.getConfig();
|
||||||
|
yml.set("TimeMonth", DemonAPI.getTime("yyyy/MM")); // 设置本月时间
|
||||||
|
HashMap<String, Integer> hashMap = new HashMap<>(); // 统计击杀boss次数
|
||||||
|
if (yml.getConfigurationSection("MonthlyKillsTop") != null) {
|
||||||
|
for (String name : yml.getConfigurationSection("MonthlyKillsTop").getKeys(false)){
|
||||||
|
int killAmount = yml.getInt("MonthlyKillsTop."+name); // 获取击杀boss次数
|
||||||
|
hashMap.put(name,killAmount); // put次数
|
||||||
|
}
|
||||||
|
yml.set("MonthlyKillsTop",null); // 清理本地数据
|
||||||
|
}
|
||||||
|
if(hashMap.size() >= 1){
|
||||||
|
// 为HashMap中数值进行降序排序
|
||||||
|
LinkedHashMap<String, Integer> sortedMap = hashMap.entrySet()
|
||||||
|
.stream()
|
||||||
|
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
|
||||||
|
.collect(Collectors.toMap(
|
||||||
|
Map.Entry::getKey,
|
||||||
|
Map.Entry::getValue,
|
||||||
|
(e1, e2) -> e1,
|
||||||
|
LinkedHashMap::new
|
||||||
|
));
|
||||||
|
// 遍历sortedMap中的数据
|
||||||
|
int rank = 1;
|
||||||
|
for (String name : sortedMap.keySet()){
|
||||||
|
int kill_amount = sortedMap.get(name);
|
||||||
|
if(rank == 1) {
|
||||||
|
Bukkit.broadcastMessage("§6[§4灵兽猎杀排行§6] §a玩家 §e" + name + " §a上月总计猎杀: §6" + kill_amount + "只 §a获得奖励: §d§l点券§fx1000");
|
||||||
|
BankAPI.addPoints(name,1000);
|
||||||
|
}else if(rank == 2){
|
||||||
|
Bukkit.broadcastMessage("§6[§4灵兽猎杀排行§6] §a玩家 §e" + name + " §a上月总计猎杀: §6" + kill_amount + "只 §a获得奖励: §d§l点券§fx750");
|
||||||
|
BankAPI.addPoints(name,750);
|
||||||
|
}else if(rank == 3){
|
||||||
|
Bukkit.broadcastMessage("§6[§4灵兽猎杀排行§6] §a玩家 §e" + name + " §a上月总计猎杀: §6" + kill_amount + "只 §a获得奖励: §d§l点券§fx500");
|
||||||
|
BankAPI.addPoints(name,500);
|
||||||
|
}else if(rank == 4){
|
||||||
|
Bukkit.broadcastMessage("§6[§4灵兽猎杀排行§6] §a玩家 §e" + name + " §a上月总计猎杀: §6" + kill_amount + "只 §a获得奖励: §d§l点券§fx250");
|
||||||
|
BankAPI.addPoints(name,250);
|
||||||
|
}else if(rank == 5){
|
||||||
|
Bukkit.broadcastMessage("§6[§4灵兽猎杀排行§6] §a玩家 §e" + name + " §a上月总计猎杀: §6" + kill_amount + "只 §a获得奖励: §d§l点券§fx100");
|
||||||
|
BankAPI.addPoints(name,100);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
rank++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Main.plugin.saveConfig(); // 保存本地数据
|
||||||
|
Bukkit.getConsoleSender().sendMessage("[日志 - 世界BOSS] 成功结算上月玩家的Boss总击杀榜.");
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,6 +1,7 @@
|
||||||
name: WorldBossHurt
|
name: WorldBossHurt
|
||||||
main: com.io.yaohun.worldbosshurt.main
|
main: com.io.yaohun.worldbosshurt.Main
|
||||||
version: 1.0.0
|
version: 1.0.2
|
||||||
commands:
|
commands:
|
||||||
bosspz:
|
bosspz:
|
||||||
|
bossreload:
|
||||||
bossspawner:
|
bossspawner:
|
Loading…
Reference in New Issue
Block a user