commit 9b8cd2dc10a3dd33edd5f5a25dc9f04c38861409 Author: yaohunya <1763917516@qq.com> Date: Sat May 10 06:11:07 2025 +0800 初版 diff --git a/lib/AuItemStackLibrary.jar b/lib/AuItemStackLibrary.jar new file mode 100644 index 0000000..9adeac8 Binary files /dev/null and b/lib/AuItemStackLibrary.jar differ diff --git a/lib/DemonMmKillsDrop.jar b/lib/DemonMmKillsDrop.jar new file mode 100644 index 0000000..8f0041e Binary files /dev/null and b/lib/DemonMmKillsDrop.jar differ diff --git a/lib/DemonMmKillsStats.jar b/lib/DemonMmKillsStats.jar new file mode 100644 index 0000000..de1baa8 Binary files /dev/null and b/lib/DemonMmKillsStats.jar differ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..d3feecf --- /dev/null +++ b/pom.xml @@ -0,0 +1,54 @@ + + + 4.0.0 + + com.yaohun.guaji.AuGuaJi + AuCardBackpack + 1.0-SNAPSHOT + + + 8 + 8 + UTF-8 + + + + + + + public-rpg + https://repo.aurora-pixels.com/repository/public-rpg/ + + + + + + org.spigotmc + spigot-api + 1.12.2 + + + com.yaohun.demonapi + DemonAPI + 2.1.4 + + + com.yaohun.nbtapi + NBT-API + 1.12.2 + + + com.yaohun.itemku + AuItemStackLib + 1.4.4 + + + org.serverct.ersha.jd + AttributePlus + 2.0 + + + + \ No newline at end of file diff --git a/src/README.md b/src/README.md new file mode 100644 index 0000000..0f76c04 --- /dev/null +++ b/src/README.md @@ -0,0 +1,27 @@ +# AuCardBackpack 插件 + +## 插件简介 +一个斗罗RPG常见的魂卡系统,击杀怪掉落魂卡,右键魂卡打开背包并概率吸收魂卡 + +## 玩法关联插件 +- PaperMC 1.12.2 +- DemonAPI (核心前置支持) +- AuItemStackLibrary (存储掉落魂卡的战利品) +- DemonMmKillsStats (击杀怪物后概率掉落魂卡) +- DemonMmKillsDrop (记录魂卡掉落数量日志) +- AuItemUse (掉落的魂卡 手持右键鉴定) +- AuForge (鉴定后输出的装备魂卡) +- DemonFenJie (分解鉴定后的装备魂卡) +- DragonCore (属性字符替换、魂卡材质替换) + +## 功能结构 +- 战利品阶段(击杀同年限的怪概率掉落魂卡) +- 背包阶段(可从背包界面取出魂卡) +- 吸收阶段(确认吸收该魂卡,吸收后关闭背包则触发属性) +----------------------------------- + +# 更新日志 + +## v1.0.0 - 2025-05-10 +- 绑定命令 `/aucard open` 打开魂卡背包 +- 初步已实现功能的安装和实装 diff --git a/src/main/java/com/yaohun/cardbackpack/AuCardBackpack.java b/src/main/java/com/yaohun/cardbackpack/AuCardBackpack.java new file mode 100644 index 0000000..6bdbe9d --- /dev/null +++ b/src/main/java/com/yaohun/cardbackpack/AuCardBackpack.java @@ -0,0 +1,90 @@ +package com.yaohun.cardbackpack; + +import com.yaohun.cardbackpack.config.Config; +import com.yaohun.cardbackpack.gui.CardGui; +import com.yaohun.cardbackpack.gui.ConfirmGui; +import com.yaohun.cardbackpack.listener.KillMobsListener; +import com.yaohun.cardbackpack.listener.PlayerListener; +import com.yaohun.cardbackpack.manage.DataManager; +import org.bukkit.Sound; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; + +public class AuCardBackpack extends JavaPlugin { + + private static AuCardBackpack instance; + private static DataManager dataManager; + + @Override + public void onEnable() { + instance = this; + dataManager = new DataManager(); + Config.reloadConfig(); + getServer().getPluginManager().registerEvents(new CardGui(), this); + getServer().getPluginManager().registerEvents(new ConfirmGui(), this); + getServer().getPluginManager().registerEvents(new PlayerListener(), this); + getServer().getPluginManager().registerEvents(new KillMobsListener(), this); + } + + @Override + public void onDisable() { + getDataManager().SaveAllPlayerData(); + } + + @Override + public boolean onCommand(CommandSender sender, Command cmd, String Command, String[] args) { + if (args.length == 1 && args[0].equalsIgnoreCase("open")) { + CardGui.OpenGui((Player) sender); + return true; + } + if (!sender.isOp()) { + return true; + } + if (args.length == 0) { + sender.sendMessage(""); + sender.sendMessage("§e------- ======= §6魂卡背包 §e======= -------"); + sender.sendMessage("§2/"+Command+" open §f- §2打开背包"); + sender.sendMessage("§2/"+Command+" reload §f- §2重载配置文件"); + sender.sendMessage("§e------- ======= §6魂卡背包 §e======= -------"); + sender.sendMessage(""); + return true; + } + if(args.length == 1 && args[0].equalsIgnoreCase("reload")) { + getDataManager().reloadDataManager(); + sender.sendMessage("§f[§c魂卡§f] §a配置文件已重载."); + return true; + } + return false; + } + + public static AuCardBackpack inst() { + return instance; + } + + public static DataManager getDataManager() { + return dataManager; + } + + public static void sendMessage(CommandSender sender, String message) { + String prefix = Config.langData.getMessage("prefix"); + if(sender instanceof Player){ + Player player = (Player) sender; + player.sendMessage(prefix+message); + } else { + sender.sendMessage(prefix+message); + } + } + + public static void sendMessage(CommandSender sender, String message, Sound sound) { + String prefix = Config.langData.getMessage("prefix"); + if(sender instanceof Player){ + Player player = (Player) sender; + player.sendMessage(prefix+message); + player.playSound(player.getLocation(), sound, 0.5f, 1.2f); + } else { + sender.sendMessage(prefix+message); + } + } +} diff --git a/src/main/java/com/yaohun/cardbackpack/config/Config.java b/src/main/java/com/yaohun/cardbackpack/config/Config.java new file mode 100644 index 0000000..53e0099 --- /dev/null +++ b/src/main/java/com/yaohun/cardbackpack/config/Config.java @@ -0,0 +1,44 @@ +package com.yaohun.cardbackpack.config; + +import com.yaohun.cardbackpack.AuCardBackpack; +import me.Demon.DemonPlugin.DemonAPI; +import me.Demon.DemonPlugin.data.GuiItemData; +import me.Demon.DemonPlugin.data.LangData; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.inventory.ItemStack; + +import java.io.File; +import java.util.HashMap; + +public class Config { + + public static LangData langData; + private static HashMap guiItemDataMap = new HashMap<>(); + + public static void reloadConfig() { + langData = DemonAPI.getLangData("AuCardBackpack"); + guiItemDataMap.clear(); + loadGuiItemData(); + } + + private static void loadGuiItemData(){ + File file = new File("plugins/AuSettings","AuCardBackpack.yml"); + FileConfiguration configuration = YamlConfiguration.loadConfiguration(file); + ConfigurationSection section = configuration.getConfigurationSection("GuiItemData"); + if(section == null){return;} + for (String itemKey : section.getKeys(false)){ + guiItemDataMap.put(itemKey,new GuiItemData(itemKey,section)); + } + } + + public static ItemStack getItemStack(String itemKey) { + if(guiItemDataMap.containsKey(itemKey)){ + return guiItemDataMap.get(itemKey).getItemStack(); + } + return DemonAPI.getErrItems(); + } + + +} diff --git a/src/main/java/com/yaohun/cardbackpack/data/CardData.java b/src/main/java/com/yaohun/cardbackpack/data/CardData.java new file mode 100644 index 0000000..bab2983 --- /dev/null +++ b/src/main/java/com/yaohun/cardbackpack/data/CardData.java @@ -0,0 +1,41 @@ +package com.yaohun.cardbackpack.data; + +import com.yaohun.cardbackpack.util.RandomUtil; + +public class CardData { + + private String cardKey; + private int cardSlot; + public int needMoney; + public double chance; + + public CardData(String cardKey, int cardSlot, int needMoney, double chance) { + this.cardKey = cardKey; + this.cardSlot = cardSlot; + this.needMoney = needMoney; + this.chance = chance; + } + + public String getCardKey() { + return cardKey; + } + + public int getCardSlot() { + return cardSlot; + } + + public boolean isChance(int addRandom){ + if(chance >= 100){ + return true; + } + if(chance <= 0){ + return false; + } + int max = 100 + addRandom; + double rand = RandomUtil.getRandomDouble(0,max,1); + if(rand < chance / 2){ + return true; + } + return false; + } +} diff --git a/src/main/java/com/yaohun/cardbackpack/data/PlayerData.java b/src/main/java/com/yaohun/cardbackpack/data/PlayerData.java new file mode 100644 index 0000000..e4b7ee4 --- /dev/null +++ b/src/main/java/com/yaohun/cardbackpack/data/PlayerData.java @@ -0,0 +1,59 @@ +package com.yaohun.cardbackpack.data; + +import de.tr7zw.itemnbtapi.NBTItem; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.inventory.ItemStack; + +import java.io.File; +import java.io.IOException; +import java.util.HashMap; + +public class PlayerData { + + private String name; + public HashMap itemStackHashMap; + private File file; + private FileConfiguration configuration; + + public PlayerData(String name) { + this.name = name; + this.file = new File("plugins/AuData/BackpackCard", name + ".yml"); + this.configuration = YamlConfiguration.loadConfiguration(this.file); + this.itemStackHashMap = new HashMap<>(); + ConfigurationSection section = this.configuration.getConfigurationSection("Unlock-Slot"); + if(section != null) { + for (String slotKey : section.getKeys(false)) { + int slot = Integer.parseInt(slotKey); + ItemStack itemStack = section.getItemStack(slotKey); + itemStackHashMap.put(slot, itemStack); + } + } + } + + public void SavePlayerData() { + configuration.set("Unlock-Slot",null); + for (Integer key : itemStackHashMap.keySet()) { + ItemStack itemStack = itemStackHashMap.get(key); + configuration.set("Unlock-Slot."+key, itemStack); + } + try { + this.configuration.save(this.file); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public boolean isCardYearsExit(String hunkaKey){ + for (ItemStack itemStack : itemStackHashMap.values()) { + NBTItem nbtItem = new NBTItem(itemStack); + if(nbtItem.hasKey("hunkaKey")){ + if(nbtItem.getString("hunkaKey").equals(hunkaKey)){ + return true; + } + } + } + return false; + } +} diff --git a/src/main/java/com/yaohun/cardbackpack/gui/CardGui.java b/src/main/java/com/yaohun/cardbackpack/gui/CardGui.java new file mode 100644 index 0000000..a08f843 --- /dev/null +++ b/src/main/java/com/yaohun/cardbackpack/gui/CardGui.java @@ -0,0 +1,163 @@ +package com.yaohun.cardbackpack.gui; + +import com.yaohun.cardbackpack.AuCardBackpack; +import com.yaohun.cardbackpack.config.Config; +import com.yaohun.cardbackpack.data.PlayerData; +import com.yaohun.cardbackpack.manage.DataManager; +import com.yaohun.cardbackpack.util.StackUtil; +import de.tr7zw.itemnbtapi.NBTItem; +import me.Demon.DemonPlugin.DemonAPI; +import me.Demon.DemonPlugin.Util.CDTimeAPI; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.serverct.ersha.jd.AttributeAPI; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class CardGui implements Listener { + + private static String invTitle; + + public CardGui() { + invTitle = Config.langData.getMessage("Gui-Title"); + } + + public static void OpenGui(Player player){ + String playerName = player.getName(); + DataManager dataManager = AuCardBackpack.getDataManager(); + PlayerData playerData = dataManager.getPlayerData(playerName); + Inventory inv = Bukkit.createInventory(null,27,invTitle); + inv.setItem(0, DemonAPI.glass(11,"§r")); + inv.setItem(8, DemonAPI.glass(11,"§r")); + for (int i = 9; i < 27;i++){ + inv.setItem(i,DemonAPI.glass(15,"§r")); + } + inv.setItem(21, DemonAPI.glass(15,"§r")); + inv.setItem(22,DemonAPI.glass(0,"§7[§6魂卡背包§7]")); + inv.setItem(23, DemonAPI.glass(15,"§r")); + for (int i : new int[]{18,19,20,24,25,26}) { + inv.setItem(i,DemonAPI.glass(0,"§7[§6魂卡背包§7]")); + } + inv.setItem(1,StackUtil.iconHide("§f十年魂卡槽")); + inv.setItem(2,StackUtil.iconHide("§e百年魂卡槽")); + inv.setItem(3,StackUtil.iconHide("§d千年魂卡槽")); + inv.setItem(4,StackUtil.iconHide("§7万年魂卡槽")); + inv.setItem(5,StackUtil.iconHide("§c十万年魂卡槽")); + inv.setItem(6,StackUtil.iconHide("§r")); + inv.setItem(7,StackUtil.iconHide("§r")); + // 设置已穿戴的魂卡 + HashMap stackHashMap = playerData.itemStackHashMap; + for (Integer slot : stackHashMap.keySet()) { + if (stackHashMap.get(slot) != null) { + ItemStack stack = stackHashMap.get(slot).clone(); + if (!DemonAPI.itemIsNull(stack) && !DemonAPI.itemIsLore(stack)) { + ItemMeta meta = stack.getItemMeta(); + meta.setDisplayName(meta.getDisplayName() + " §c§l[点击取出]"); + stack.setItemMeta(meta); + inv.setItem(slot, stack); + } + } + } + player.openInventory(inv); + } + + @EventHandler + public void onClick(InventoryClickEvent e) { + int rawSlot = e.getRawSlot(); + Player player = (Player) e.getWhoClicked(); + String playerName = player.getName(); + Inventory inventory = e.getInventory(); + if (e.getView().getTitle().equalsIgnoreCase(invTitle)) { + if(rawSlot >= 0 && rawSlot < inventory.getSize()){ + e.setCancelled(true); + // 获取点击的物品 + ItemStack click = e.getCurrentItem(); + // 判断点击的物品是否是卡牌槽 + if(rawSlot == 1 || rawSlot == 2 || rawSlot == 3 || + rawSlot == 4 || rawSlot == 5 || rawSlot == 6 || rawSlot == 7){ + if(DemonAPI.itemIsNull(click))return; + DataManager dataManager = AuCardBackpack.getDataManager(); + PlayerData playerData = dataManager.getPlayerData(playerName); + // 若点击此处并非空白则将物品返还给玩家 + if(!click.getType().equals(Material.BARRIER)) { + if(!DemonAPI.itemIsLore(click)) { + ItemStack itemStack = playerData.itemStackHashMap.get(rawSlot); + player.getInventory().addItem(itemStack); + playerData.itemStackHashMap.remove(rawSlot); + inventory.setItem(rawSlot, StackUtil.iconHide("§c§l请放入魂卡")); + player.playSound(player.getLocation(), Sound.BLOCK_COMPARATOR_CLICK, 1, 1); + // 玩家取出这个卡牌后1分钟内肯定会打算吸一个更厉害的魂卡 + CDTimeAPI.setPlayerCD(player.getUniqueId(),"cardback_fetch",1000L * 60); + } + return; + } + // 获取鼠标上的物品 + ItemStack cursor = e.getCursor(); + if(!DemonAPI.itemIsNull(cursor)){ + NBTItem nbtItem = new NBTItem(cursor); + if(nbtItem.hasKey("hunkaKey")){ + String hunkaKey = nbtItem.getString("hunkaKey"); + if(playerData.isCardYearsExit(hunkaKey)){ + AuCardBackpack.sendMessage(player,Config.langData.getMessage("quantityLimit"),Sound.ENTITY_VILLAGER_NO); + return; + } + e.setCursor(new ItemStack(Material.AIR)); + ConfirmGui.OpenGui(player,cursor,hunkaKey); + // 打开一个新的窗口 + player.playSound(player.getLocation(), Sound.BLOCK_COMPARATOR_CLICK,1,1); + } else { + AuCardBackpack.sendMessage(player,Config.langData.getMessage("typeLimitations"),Sound.ENTITY_VILLAGER_NO); + } + } + } + } + } + } + + @EventHandler + public void onClose(InventoryCloseEvent e){ + Player player = (Player) e.getPlayer(); + String playerName = player.getName(); + Inventory inventory = e.getInventory(); + if(e.getView().getTitle().equalsIgnoreCase(invTitle)){ + String attSource = "cardAttribute"; + AttributeAPI.deleteAttribute(player,attSource); + List statsList = new ArrayList<>(); + PlayerData playerData = AuCardBackpack.getDataManager().getPlayerData(playerName); + for (int i : new int[]{0,1,2,3,4,5,6,7}){ + ItemStack stack = inventory.getItem(i); + if(!DemonAPI.itemIsNull(stack)){ + NBTItem nbtItem = new NBTItem(stack); + if(nbtItem.hasKey("hunkaKey")){ + ItemMeta meta = stack.getItemMeta(); + List lore = meta.getLore(); + for (int l = 0; l < lore.size(); l++) { + String s = lore.get(l); + if(s.contains("繫") || s.contains("龖") || s.contains("儁")){ + statsList.add(s); + } + if(s.contains("鬻 §7物品绑定: §e使用后绑定")){ + lore.set(l,"鬻 §7物品已绑定: §e"+playerName); + meta.setLore(lore); + stack.setItemMeta(meta); + playerData.itemStackHashMap.put(i,stack); + } + } + } + } + } + AttributeAPI.addAttribute(player, attSource, statsList); + } + } +} diff --git a/src/main/java/com/yaohun/cardbackpack/gui/ConfirmGui.java b/src/main/java/com/yaohun/cardbackpack/gui/ConfirmGui.java new file mode 100644 index 0000000..32cc9d9 --- /dev/null +++ b/src/main/java/com/yaohun/cardbackpack/gui/ConfirmGui.java @@ -0,0 +1,115 @@ +package com.yaohun.cardbackpack.gui; + +import com.yaohun.cardbackpack.AuCardBackpack; +import com.yaohun.cardbackpack.config.Config; +import com.yaohun.cardbackpack.data.CardData; +import com.yaohun.cardbackpack.data.PlayerData; +import com.yaohun.cardbackpack.manage.DataManager; +import com.yaohun.cardbackpack.util.StackUtil; +import de.tr7zw.itemnbtapi.NBTItem; +import me.Demon.DemonPlugin.DemonAPI; +import me.Demon.DemonPlugin.Util.CDTimeAPI; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +public class ConfirmGui implements Listener { + + private static String invTitle; + private static String startTitle; + + public ConfirmGui() { + invTitle = Config.langData.getMessage("Confiirm-Title"); + startTitle = invTitle.split("%s")[0]; + } + + public static void OpenGui(Player player, ItemStack cardStack,String hunkaKey){ + DataManager dataManager = AuCardBackpack.getDataManager(); + CardData cardData = dataManager.getCardData(hunkaKey); + if(cardData == null){ + player.closeInventory(); + player.getInventory().addItem(cardStack); + return; + } + String itemName = cardStack.getItemMeta().getDisplayName(); + Inventory inv = Bukkit.createInventory(null,9,invTitle.replace("%s",itemName)); + inv.setItem(1,cardStack); + inv.setItem(6, StackUtil.confirmStack(cardData)); + inv.setItem(8, Config.getItemStack("backStack")); + player.openInventory(inv); + } + + @EventHandler + public void onClick(InventoryClickEvent e) { + int rawSlot = e.getRawSlot(); + Player player = (Player) e.getWhoClicked(); + String playerName = player.getName(); + Inventory inventory = e.getInventory(); + if (e.getView().getTitle().contains(startTitle)) { + e.setCancelled(true); + if(rawSlot == 8){ + CardGui.OpenGui(player); + } + if(rawSlot == 6){ + ItemStack item = e.getCurrentItem(); + NBTItem nbtItem = new NBTItem(item); + if(nbtItem.hasKey("hunka")){ + String hunkaKey = nbtItem.getString("hunka"); + CardData cardData = AuCardBackpack.getDataManager().getCardData(hunkaKey); + if(cardData == null){ + return; + } + // 判断金币 + int needMoney = cardData.needMoney; + if(!DemonAPI.hasMoney(player, needMoney)){ + CardGui.OpenGui(player); + String message = Config.langData.getMessage("moneyNotEnough"); + AuCardBackpack.sendMessage(player,message.replace("%money%",DemonAPI.MoneyFormat(needMoney)),Sound.ENTITY_VILLAGER_NO); + return; + } + int addRandom = 0; + if(CDTimeAPI.isCD(player.getUniqueId(),"cardback_fetch")){ + addRandom = 100; + } + if(cardData.isChance(addRandom)){ + int slot = cardData.getCardSlot(); + PlayerData playerData = AuCardBackpack.getDataManager().getPlayerData(playerName); + ItemStack stack = inventory.getItem(1); + playerData.itemStackHashMap.put(slot,stack); + inventory.setItem(1,new ItemStack(Material.AIR)); + CardGui.OpenGui(player); + String message = Config.langData.getMessage("successfullyInhaled"); + String itemName = stack.getItemMeta().getDisplayName(); + AuCardBackpack.sendMessage(player,message.replace("%itemName%",itemName),Sound.ENTITY_EXPERIENCE_ORB_PICKUP); + } else { + inventory.setItem(1,new ItemStack(Material.AIR)); + player.closeInventory(); + CardGui.OpenGui(player); + String message = Config.langData.getMessage("probabilityFailure"); + AuCardBackpack.sendMessage(player,message,Sound.ENTITY_VILLAGER_NO); + } + } + } + } + } + + @EventHandler + public void onClose(InventoryCloseEvent e) { + Player player = (Player) e.getPlayer(); + String playerName = player.getName(); + Inventory inventory = e.getInventory(); + if (e.getView().getTitle().contains(startTitle)) { + ItemStack itemStack = inventory.getItem(1); + if(!DemonAPI.itemIsNull(itemStack) && !DemonAPI.itemIsLore(itemStack)){ + player.getInventory().addItem(itemStack); + } + } + } +} diff --git a/src/main/java/com/yaohun/cardbackpack/listener/KillMobsListener.java b/src/main/java/com/yaohun/cardbackpack/listener/KillMobsListener.java new file mode 100644 index 0000000..9b56b27 --- /dev/null +++ b/src/main/java/com/yaohun/cardbackpack/listener/KillMobsListener.java @@ -0,0 +1,73 @@ +package com.yaohun.cardbackpack.listener; + +import com.io.yaohun.itemlibrary.api.ItemKuAPI; +import com.yaohun.cardbackpack.util.RandomUtil; +import me.Demon.DemonMmKillsDrop.data.DropLogsData; +import me.Demon.DemonMmKillsDrop.manage.LogsManager; +import me.Demon.DemonMmKillsStats.Event.KillsMobsStatsEvent; +import me.Demon.DemonPlugin.DemonAPI; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.inventory.ItemStack; +import org.serverct.ersha.jd.Ha; + +import java.util.HashMap; + +public class KillMobsListener implements Listener { + + private static HashMap mobLuckyValue = new HashMap<>(); + + private static double getLuckyValue(String mobsType) { + if(!mobLuckyValue.containsKey(mobsType)) { + return 0.0D; + } + return mobLuckyValue.get(mobsType); + } + + private static void addLuckyValue(String mobsType, double luckyValue) { + double nowValue = getLuckyValue(mobsType); + if(!mobLuckyValue.containsKey(mobsType)) { + mobLuckyValue.put(mobsType, nowValue + luckyValue); + } + mobLuckyValue.put(mobsType, nowValue + luckyValue); + } + + @EventHandler + public void onkills(KillsMobsStatsEvent e) { + Player player = e.getPlayer(); + String mobType = e.getMob_type(); + double luckyValue = getLuckyValue(mobType); + double randomChance = RandomUtil.getRandomDouble(0.1D,300.0D,2); + if(luckyValue > randomChance) { + ItemStack stack = getCardStack(mobType); + if(!DemonAPI.itemIsNull(stack)) { + player.getInventory().addItem(stack); + } + mobLuckyValue.put(mobType,0.0D); // 清空幸运值 + } else { + addLuckyValue(mobType, RandomUtil.getRandomDouble(0.1,1.0,1)); + } + } + + public ItemStack getCardStack(String mobsType) { + String itemKey = null; + if(mobsType.contains("百年")){ + itemKey = "百年魂卡"; + }else if(mobsType.contains("千年")){ + itemKey = "千年魂卡"; + }else if(mobsType.contains("万年")){ + itemKey = "万年魂卡"; + }else if(mobsType.contains("十年")){ + itemKey = "十年魂卡"; + } + if(itemKey != null) { + LogsManager logsManager = me.Demon.DemonMmKillsDrop.Main.getDataManager().getLogsManager(); + DropLogsData dropLogsData = logsManager.addDropLogsDataMap(mobsType); + dropLogsData.addDropKeyAmount(itemKey); + return ItemKuAPI.getItemSystemNoLog(itemKey); + } else { + return null; + } + } +} diff --git a/src/main/java/com/yaohun/cardbackpack/listener/PlayerListener.java b/src/main/java/com/yaohun/cardbackpack/listener/PlayerListener.java new file mode 100644 index 0000000..a287c0f --- /dev/null +++ b/src/main/java/com/yaohun/cardbackpack/listener/PlayerListener.java @@ -0,0 +1,32 @@ +package com.yaohun.cardbackpack.listener; + +import com.yaohun.cardbackpack.gui.CardGui; +import de.tr7zw.itemnbtapi.NBTItem; +import me.Demon.DemonPlugin.DemonAPI; +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.player.PlayerInteractEvent; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemStack; + +public class PlayerListener implements Listener { + + @EventHandler + public void onMutual(PlayerInteractEvent event) { + Player player = event.getPlayer(); + if(event.getHand() == EquipmentSlot.HAND){ + Action action = event.getAction(); + if(action == Action.RIGHT_CLICK_AIR || action == Action.RIGHT_CLICK_BLOCK){ + ItemStack stack = player.getInventory().getItemInMainHand(); + if(!DemonAPI.itemIsNull(stack) && !DemonAPI.itemIsLore(stack)){ + NBTItem nbtItem = new NBTItem(stack); + if(nbtItem.hasKey("hunkaKey")){ + CardGui.OpenGui(player); + } + } + } + } + } +} diff --git a/src/main/java/com/yaohun/cardbackpack/manage/DataManager.java b/src/main/java/com/yaohun/cardbackpack/manage/DataManager.java new file mode 100644 index 0000000..ac208f6 --- /dev/null +++ b/src/main/java/com/yaohun/cardbackpack/manage/DataManager.java @@ -0,0 +1,65 @@ +package com.yaohun.cardbackpack.manage; + +import com.yaohun.cardbackpack.config.Config; +import com.yaohun.cardbackpack.data.CardData; +import com.yaohun.cardbackpack.data.PlayerData; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.serverct.ersha.jd.Ha; + +import java.io.File; +import java.util.HashMap; + +public class DataManager { + + private HashMap cardDataMap = new HashMap<>(); + private HashMap playerDataMap = new HashMap<>(); + + + public DataManager(){ + loadCardData(); + } + + public void reloadDataManager(){ + SaveAllPlayerData(); + playerDataMap.clear(); + cardDataMap.clear(); + loadCardData(); + Config.reloadConfig(); + } + + public void loadCardData(){ + File file = new File("plugins/AuSettings","AuCardBackpack.yml"); + FileConfiguration configuration = YamlConfiguration.loadConfiguration(file); + ConfigurationSection section = configuration.getConfigurationSection("CardData"); + if(section != null){ + for (String hunkaKey : section.getKeys(false)){ + int slot = section.getInt(hunkaKey+".slot"); + int money = section.getInt(hunkaKey+".money"); + double chance = section.getDouble(hunkaKey+".chance"); + this.cardDataMap.put(hunkaKey,new CardData(hunkaKey,slot,money,chance)); + } + } + } + + public void SaveAllPlayerData(){ + for (PlayerData playerData : playerDataMap.values()) { + playerData.SavePlayerData(); + } + } + + public PlayerData getPlayerData(String playerName){ + if(!this.playerDataMap.containsKey(playerName)){ + this.playerDataMap.put(playerName, new PlayerData(playerName)); + } + return this.playerDataMap.get(playerName); + } + + public CardData getCardData(String hunkaKey){ + if(this.cardDataMap.containsKey(hunkaKey)){ + return this.cardDataMap.get(hunkaKey); + } + return null; + } +} diff --git a/src/main/java/com/yaohun/cardbackpack/util/RandomUtil.java b/src/main/java/com/yaohun/cardbackpack/util/RandomUtil.java new file mode 100644 index 0000000..e4de99b --- /dev/null +++ b/src/main/java/com/yaohun/cardbackpack/util/RandomUtil.java @@ -0,0 +1,49 @@ +package com.yaohun.cardbackpack.util; + +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.entity.Player; + +import java.util.Random; + +public class RandomUtil { + + public static boolean random(double d) { + return d >= new Random().nextFloat(); + } + + public static int getRandomInt(int min, int max) { + if (min == max) { + return max; + } + Random r = new Random(); + int i = min < max ? min : max; + int a = min < max ? max : min; + return r.nextInt(a - i + 1) + i; + } + + public static double getRandomDouble(double min, double max, int scl) { + int pow = (int) Math.pow(10, scl); + return Math.floor((Math.random() * (max - min) + min) * pow) / pow; + } + + public static Location getRandomLocation(World world, double minX, double maxX, double minY, double maxY, double minZ, double maxZ) { + double rx = getRandomDouble(minX, maxX, 3); + double ry = getRandomDouble(minY, maxY, 3); + double rz = getRandomDouble(minZ, maxZ, 3); + return new Location(world, rx, ry, rz); + } + + public static Location getRandomLocation(Player zhubo, World world, double minX, double maxX, double minY, double maxY, double minZ, double maxZ) { + Location location = zhubo.getLocation().add(getRandomInt(-3,3),0,getRandomInt(-3,3)); + for (int i = 0; i < 10;i++) { + Location loc = new Location(world, getRandomDouble(minX, maxX, 3), getRandomDouble(minY, maxY, 3), getRandomDouble(minZ, maxZ, 3)); + if (loc.distance(zhubo.getLocation()) <= 50) { + location = loc; + break; + } + } + return location; + } + +} diff --git a/src/main/java/com/yaohun/cardbackpack/util/StackUtil.java b/src/main/java/com/yaohun/cardbackpack/util/StackUtil.java new file mode 100644 index 0000000..af15cfc --- /dev/null +++ b/src/main/java/com/yaohun/cardbackpack/util/StackUtil.java @@ -0,0 +1,49 @@ +package com.yaohun.cardbackpack.util; + +import com.yaohun.cardbackpack.AuCardBackpack; +import com.yaohun.cardbackpack.config.Config; +import com.yaohun.cardbackpack.data.CardData; +import com.yaohun.cardbackpack.manage.DataManager; +import de.tr7zw.itemnbtapi.NBTItem; +import me.Demon.DemonPlugin.DemonAPI; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.ArrayList; +import java.util.List; + +public class StackUtil { + + public static ItemStack iconHide(String name){ + ItemStack stack = Config.getItemStack("iconHide").clone(); + ItemMeta meta = stack.getItemMeta(); + meta.setDisplayName(name); + stack.setItemMeta(meta); + NBTItem nbtItem = new NBTItem(stack); + nbtItem.setString("icon","hide"); + nbtItem.setString("stex","icon_air"); + return nbtItem.getItem(); + } + + public static ItemStack confirmStack(CardData cardData){ + ItemStack stack = Config.getItemStack("confirmStack").clone(); + ItemMeta meta = stack.getItemMeta(); + List lore = meta.getLore(); + for (int i = 0; i < lore.size(); i++){ + String string = lore.get(i); + if(string.contains("{chance}")){ + string = string.replace("{chance}",String.valueOf(cardData.chance)); + } + if(string.contains("{money}")){ + string = string.replace("{money}", DemonAPI.MoneyFormat(cardData.needMoney)); + } + lore.set(i, string); + } + meta.setLore(lore); + stack.setItemMeta(meta); + NBTItem nbtItem = new NBTItem(stack); + nbtItem.setString("hunka",cardData.getCardKey()); + return nbtItem.getItem(); + } +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..34b2264 --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,10 @@ +name: AuCardBackpack +main: com.yaohun.cardbackpack.AuCardBackpack +version: 1.0.0 +depend: + - DemonAPI + - DemonMmKillsStats +commands: + aucard: + aliases: + - aucard \ No newline at end of file