世界BOSS

This commit is contained in:
yaohunya 2024-07-14 00:20:59 +08:00
parent 6eb4772436
commit 3d515230cd
9 changed files with 433 additions and 7 deletions

View File

@ -46,6 +46,11 @@
<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>

View File

@ -1,16 +1,18 @@
package com.io.yaohun.worldbosshurt;
import com.io.yaohun.worldbosshurt.listener.BossArmor;
import com.io.yaohun.worldbosshurt.listener.BossDamageByPlayer;
import com.io.yaohun.worldbosshurt.listener.BossKillsDeath;
import com.io.yaohun.worldbosshurt.listener.BossSpawnLogs;
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 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;
@ -25,10 +27,13 @@ public class Main extends JavaPlugin {
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");
}
@ -46,8 +51,41 @@ public class Main extends JavaPlugin {
DemonAPI.sendMessage(sender,"配置文件已重载.");
return true;
}
if(Command.equalsIgnoreCase("bosspz")){
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;
}

View File

@ -1,13 +1,18 @@
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() {
@ -16,8 +21,10 @@ public class WorldBossDeathEvent extends Event {
public static HandlerList getHandlerList() {
return handlers;
}
public WorldBossDeathEvent(BossData bossData) {
public WorldBossDeathEvent(BossData bossData,RewardData rewardData,LinkedHashMap<String, Double> sortedMap) {
this.bossData = bossData;
this.rewardData = rewardData;
this.sortedMap = sortedMap;
}
public String getBossKey(){
@ -27,4 +34,14 @@ public class WorldBossDeathEvent extends Event {
public String getMobName() {
return bossData.getBossName();
}
public BossData getBossData() {
return bossData;
}
public RewardData getRewardData() {
return rewardData;
}
public LinkedHashMap<String, Double> getSortedMap() {
return sortedMap;
}
}

View File

@ -0,0 +1,33 @@
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++;
}
}
}

View File

@ -1,6 +1,148 @@
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.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.getBossData(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 rewardData = Main.rewardManage.getRewardData(Kills_Group_Key);
// 执行命令并发放奖励
if(bossData.getKillsReward() != null){
if (!Kills_Group_Key.equalsIgnoreCase("魂环")) {
List<String> commands = rewardData.getKillsCmdList();
DemonAPI.ConsoleOutCommandList(player, commands);
}else{
sendRingRewards(player,bossData,rewardData);
}
}
new BukkitRunnable() {
public void run() {
statisticalSettlementOfDamages(bossData,rewardData);
}
}.runTaskLater(Main.plugin, 10L);
}
}
}
}
/*
* 将对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); // 将玩家存入在线玩家列表
}
}
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){
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) + "%");
// 判断玩家造成伤害是否达到100K并发放奖励
if(damage >= 100){
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[含献祭]");
}
}
}
}
}

View File

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

View File

@ -2,6 +2,7 @@ package com.io.yaohun.worldbosshurt.mangage;
import com.io.yaohun.worldbosshurt.data.BossData;
import com.io.yaohun.worldbosshurt.data.RewardData;
import com.sun.xml.internal.txw2.output.StreamSerializer;
import org.bukkit.Bukkit;
import org.bukkit.configuration.file.FileConfiguration;
@ -20,4 +21,11 @@ public class RewardManage {
}
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;
}
}

View File

@ -45,4 +45,17 @@ public class BossStack {
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;
}
}

View File

@ -14,6 +14,12 @@ 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击杀数
* */