commit dc23c58741e09a8448d2af0426c3209eefb9d1c9 Author: yaohunya <1763917516@qq.com> Date: Sun Jul 13 17:08:06 2025 +0800 1.0.0 diff --git a/lib/DemonAPI.jar b/lib/DemonAPI.jar new file mode 100644 index 0000000..352319e Binary files /dev/null and b/lib/DemonAPI.jar differ diff --git a/lib/DemonLevels.jar b/lib/DemonLevels.jar new file mode 100644 index 0000000..b20c7c2 Binary files /dev/null and b/lib/DemonLevels.jar differ diff --git a/lib/DemonWarps.jar b/lib/DemonWarps.jar new file mode 100644 index 0000000..8228041 Binary files /dev/null and b/lib/DemonWarps.jar differ diff --git a/lib/DragonCore.jar b/lib/DragonCore.jar new file mode 100644 index 0000000..6914160 Binary files /dev/null and b/lib/DragonCore.jar differ diff --git a/lib/DragonGPS.jar b/lib/DragonGPS.jar new file mode 100644 index 0000000..ea1b6c0 Binary files /dev/null and b/lib/DragonGPS.jar differ diff --git a/lib/DragonGPSAddon.jar b/lib/DragonGPSAddon.jar new file mode 100644 index 0000000..1eb03bb Binary files /dev/null and b/lib/DragonGPSAddon.jar differ diff --git a/lib/PlaceholderAPI.jar b/lib/PlaceholderAPI.jar new file mode 100644 index 0000000..5471e66 Binary files /dev/null and b/lib/PlaceholderAPI.jar differ diff --git a/libHook/AuItemConvert.jar b/libHook/AuItemConvert.jar new file mode 100644 index 0000000..d9e51f2 Binary files /dev/null and b/libHook/AuItemConvert.jar differ diff --git a/libHook/CitizensCMD.jar b/libHook/CitizensCMD.jar new file mode 100644 index 0000000..a245449 Binary files /dev/null and b/libHook/CitizensCMD.jar differ diff --git a/libHook/DemonFenJie.jar b/libHook/DemonFenJie.jar new file mode 100644 index 0000000..dcb2c7b Binary files /dev/null and b/libHook/DemonFenJie.jar differ diff --git a/libHook/DemonHunHuanSX.jar b/libHook/DemonHunHuanSX.jar new file mode 100644 index 0000000..398e7c3 Binary files /dev/null and b/libHook/DemonHunHuanSX.jar differ diff --git a/libHook/DemonLevelReward.jar b/libHook/DemonLevelReward.jar new file mode 100644 index 0000000..1cd522d Binary files /dev/null and b/libHook/DemonLevelReward.jar differ diff --git a/libHook/DemonLevels.jar b/libHook/DemonLevels.jar new file mode 100644 index 0000000..b20c7c2 Binary files /dev/null and b/libHook/DemonLevels.jar differ diff --git a/libHook/DemonSkills.jar b/libHook/DemonSkills.jar new file mode 100644 index 0000000..79a8dde Binary files /dev/null and b/libHook/DemonSkills.jar differ diff --git a/libHook/MythicMobs.jar b/libHook/MythicMobs.jar new file mode 100644 index 0000000..86b6e2f Binary files /dev/null and b/libHook/MythicMobs.jar differ diff --git a/libHook/WuHunJueXing.jar b/libHook/WuHunJueXing.jar new file mode 100644 index 0000000..e366b12 Binary files /dev/null and b/libHook/WuHunJueXing.jar differ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..8498a7f --- /dev/null +++ b/pom.xml @@ -0,0 +1,42 @@ + + + 4.0.0 + + com.yaohun.guaji.AuGuaJi + QuestStoryline + 1.0-SNAPSHOT + + + 8 + 8 + UTF-8 + + + + + public-rpg + https://repo.aurora-pixels.com/repository/public-rpg/ + + + + + + org.spigotmc + spigot-api + 1.12.2 + + + me.Demon.DemonPlugin + DemonAPI + 2.2.9 + + + eos.moe.dragoncore + DragonCore + 2.6.2.0 + + + + \ No newline at end of file diff --git a/src/main/java/com/yaohun/storyline/PapiExpansion.java b/src/main/java/com/yaohun/storyline/PapiExpansion.java new file mode 100644 index 0000000..369cb6a --- /dev/null +++ b/src/main/java/com/yaohun/storyline/PapiExpansion.java @@ -0,0 +1,123 @@ +package com.yaohun.storyline; + +import com.yaohun.storyline.config.Config; +import com.yaohun.storyline.core.Quest; +import com.yaohun.storyline.data.PlayerData; +import com.yaohun.storyline.manage.PlayerManager; +import com.yaohun.storyline.manage.QuestManager; +import me.clip.placeholderapi.expansion.PlaceholderExpansion; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.util.List; + +/** + * @Author: Baka + * @Date: 2019/12/23 13:20 + */ +public class PapiExpansion extends PlaceholderExpansion { + private Plugin plugin; + + public PapiExpansion(Plugin plugin) { + this.plugin = plugin; + } + + @Override + public boolean persist() { + return true; + } + + @Override + public boolean canRegister() { + return true; + } + + @Override + public String getAuthor() { + return plugin.getDescription().getAuthors().toString(); + } + + @Override + public String getIdentifier() { + return "quests"; + } + + @Override + public String getVersion() { + return plugin.getDescription().getVersion(); + } + + @Override + public String onPlaceholderRequest(Player player, String identifier) { + String playerName = player.getName(); + PlayerManager playerManager = Storyline.getPlayerManager(); + PlayerData playerData = playerManager.getPlayerData(playerName); + if (identifier.equalsIgnoreCase("stats")) { + if(playerData == null){ + return "1500"; + } + if(playerData.isAllCompleted()){ + return "1500"; + } else { + return "0"; + } + } else if (identifier.equalsIgnoreCase("size")) { + if(playerData == null){ + return "0"; + } + return String.valueOf(playerData.getAllQuest().size()); + } else if (identifier.equalsIgnoreCase("current")) { + if(playerData == null){ + return ""; + } + int questID = playerData.getCurrentQuest(); + Quest quest = QuestManager.getQuest(questID); + if(quest == null){ + return ""; + } + return String.valueOf(playerData.getCurrentQuest()); + } else if (identifier.equalsIgnoreCase("world")) { + if(playerData == null){ + return ""; + } + int questID = playerData.getCurrentQuest(); + Quest quest = QuestManager.getQuest(questID); + if(quest == null){ + return ""; + } + return Config.getWorldAlias(quest.getStartingPoint().getWorld().getName()); + } else if (identifier.equalsIgnoreCase("name")) { + if(playerData == null){ + return ""; + } + int questID = playerData.getCurrentQuest(); + Quest quest = QuestManager.getQuest(questID); + if(quest == null){ + return ""; + } + return quest.getDisplayName(); + } else if (identifier.equalsIgnoreCase("key")) { + if(playerData == null){ + return ""; + } + int questID = playerData.getCurrentQuest(); + Quest quest = QuestManager.getQuest(questID); + if(quest == null){ + return ""; + } + int now = playerData.getQuestAmount(quest); + return quest.getDescription().replace("{a}", String.valueOf(now)).replace("{need}",String.valueOf(quest.getTargetAmount())); + } else if (identifier.equalsIgnoreCase("type")) { + if(playerData == null){ + return ""; + } + int questID = playerData.getCurrentQuest(); + Quest quest = QuestManager.getQuest(questID); + if(quest == null){ + return ""; + } + return Config.getQuestTypeAlias(quest.getQuestType().name()); + } + return ""; + } +} \ No newline at end of file diff --git a/src/main/java/com/yaohun/storyline/Storyline.java b/src/main/java/com/yaohun/storyline/Storyline.java new file mode 100644 index 0000000..b56205b --- /dev/null +++ b/src/main/java/com/yaohun/storyline/Storyline.java @@ -0,0 +1,277 @@ +package com.yaohun.storyline; + +import com.yaohun.storyline.config.Config; +import com.yaohun.storyline.core.Quest; +import com.yaohun.storyline.data.PlayerData; +import com.yaohun.storyline.gui.DialogueGui; +import com.yaohun.storyline.listener.PlayerListener; +import com.yaohun.storyline.manage.ExternalManager; +import com.yaohun.storyline.manage.PlayerManager; +import com.yaohun.storyline.manage.QuestManager; +import com.yaohun.storyline.network.DragonChannel; +import com.yaohun.storyline.util.MessageUtil; +import com.yaohun.storyline.util.QuestShow; +import eos.moe.dragoncore.api.CoreAPI; +import eos.moe.dragoncore.api.easygui.EasyScreen; +import eos.moe.dragoncore.api.easygui.component.EasyEntityView; +import eos.moe.dragoncore.network.PacketSender; +import me.Demon.DemonLevels.command.MainCmd; +import me.Demon.DemonPlugin.DemonAPI; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.scheduler.BukkitRunnable; + +public class Storyline extends JavaPlugin { + + private static Storyline instance; + private static PlayerManager playerManager; + + @Override + public void onEnable() { + instance = this; + saveDefaultConfig(); + QuestManager.init(this); + Config.reloadConfig(this); + MessageUtil.init(this); + playerManager = new PlayerManager(); + + getServer().getPluginManager().registerEvents(new DialogueGui(),this); + getServer().getPluginManager().registerEvents(new DragonChannel(),this); + getServer().getPluginManager().registerEvents(new PlayerListener(),this); + + new ExternalManager(this).registerAll(); + if(getServer().getPluginManager().getPlugin("PlaceholderAPI") != null){ + new PapiExpansion(this).register(); + } + } + + @Override + public void onDisable() { + getPlayerManager().saveAllPlayerData(); + } + + @Override + public boolean onCommand(CommandSender sender, Command cmd, String Command, String[] args) { + if (!sender.isOp()) return true; + if (args.length == 0) { + sender.sendMessage(""); + sender.sendMessage("§e------- ======= §6主线任务 §e======= -------"); + sender.sendMessage("§2/quests info §f- §2查看当前任务进度"); + sender.sendMessage("§2/quests reload §f- §2重新载入配置文件"); + sender.sendMessage("§2/quests setloc §e[任务] §f- §2设置任务坐标"); + sender.sendMessage("§2/quests add §e[任务] §2<数量> §f- §2增加任务进度"); + sender.sendMessage("§2/quests js §e[任务ID] §2<玩家> §f- §2接受任务"); + sender.sendMessage("§2/quests tj §e[任务ID] §2<玩家> §f- §2提交任务"); + sender.sendMessage("§e------- ======= §6主线任务 §e======= -------"); + sender.sendMessage(""); + return true; + } + if (args.length == 1 && args[0].equalsIgnoreCase("debug")) { + if(Config.debug){ + Config.debug = false; + DemonAPI.sendMessage(sender,"调试模式: §c关闭"); + } else { + Config.debug = true; + DemonAPI.sendMessage(sender,"调试模式: §a启动"); + } + return true; + } + if (args.length == 2 && args[0].equalsIgnoreCase("create")) { + String name = args[1]; + Player player = Bukkit.getPlayer(name); + if (player == null) return true; + new BukkitRunnable() { + @Override + public void run() { + if(player.getLevel() <= 20){ + getPlayerManager().createPlayerData(player); + DemonAPI.sendMessage(sender,"成功为 "+name+" 玩家创建引导任务档案."); + } else { + System.out.println("创建异常 "+name+" 等级已超过20级,无法创建"); + } + } + }.runTaskLater(this,20L * 3); + return true; + } + if (args.length == 2 && args[0].equalsIgnoreCase("stop")) { + String name = args[1]; + Player player = Bukkit.getPlayer(name); + if (player == null) return true; + getPlayerManager().stopPlayerData(player); + DemonAPI.sendMessage(sender,"玩家 "+name+" 剧情任务已终止."); + return true; + } + if (args.length == 2 && args[0].equalsIgnoreCase("view")) { + PacketSender.setThirdPersonView((Player) sender, Integer.parseInt(args[1])); + DemonAPI.sendMessage(sender,"视角切换: §a"+args[1]); + return true; + } + if (args.length == 1 && args[0].equalsIgnoreCase("reload")) { + QuestManager.reloadQuestConfig(this); + Config.reloadConfig(this); + for (PlayerData playerData : playerManager.getAllPlayerData()) { + playerData.reload(QuestManager.getQuestArrayList()); + } + sender.sendMessage("§c[主线任务] §f任务及配置文件已重载完成."); + return true; + } + if (args.length == 1 && args[0].equalsIgnoreCase("save")) { + getPlayerManager().saveAllPlayerData(); + sender.sendMessage("§c[主线任务] §f所有玩家数据已保存."); + return true; + } + if (args.length >= 1 && args[0].equalsIgnoreCase("reset")) { + String playerName = sender.getName(); + if (args.length == 2) { + playerName = args[1]; + } + Player player = Bukkit.getPlayer(playerName); + if (player == null) { + return true; + } + PlayerData playerData = getPlayerManager().getPlayerData(playerName); + if(playerData == null) return true; + playerData.resetPlayerData(); + sender.sendMessage("§c[主线任务] §f任务数据已重置."); + return true; + } + if (args.length >= 1 && args[0].equalsIgnoreCase("info")) { + String playerName = sender.getName(); + if (args.length == 2) { + playerName = args[1]; + } + Player player = Bukkit.getPlayer(playerName); + if (player == null) { + return true; + } + sender.sendMessage("§7[§6任务§7] §f当前已接受任务: "); + PlayerData playerData = getPlayerManager().getPlayerData(playerName); + if(playerData == null) return true; + for (Quest quest : playerData.getAllQuest()) { + int amount = playerData.getQuestAmount(quest); + QuestShow.Show(sender, quest.getDisplayName(), amount, quest.getTargetAmount()); + } + } + if (args.length >= 2 && args[0].equalsIgnoreCase("add")) { + String idKey = args[1]; + int questID = Integer.parseInt(idKey); + Quest quest = QuestManager.getQuest(questID); + if (quest == null) { + sender.sendMessage("§7[§6任务§7] §f未找到该任务。"); + return true; + } + int addAmount = 1; + if (args.length >= 3) { + addAmount = Integer.parseInt(args[2]); + } + String playerName = sender.getName(); + if (args.length >= 4) { + playerName = args[3]; + } + Player player = Bukkit.getPlayer(playerName); + if (player == null) { + sender.sendMessage("§7[§6任务§7] §f目标玩家不在线。"); + return true; + } + PlayerData data = getPlayerManager().getPlayerData(playerName); + if(data == null) return true; + data.addQuestAmount(quest, addAmount); + sender.sendMessage("§7[§6任务§7] §f目标玩家: " + player.getName()); + sender.sendMessage("§7[§6任务§7] §f任务名称: " + quest.getDisplayName()); + int nowAmount = data.getQuestAmount(quest); + int questAmount = quest.getTargetAmount(); + if (nowAmount >= quest.getTargetAmount()) { + sender.sendMessage("§f当前进度: §a" + questAmount + "§f/§a" + questAmount); + } else { + sender.sendMessage("§f当前进度: §c" + nowAmount + "§f/§c" + questAmount); + } + return true; + } + if (args.length >= 2 && args[0].equalsIgnoreCase("js")) { + String idKey = args[1]; + int questID = Integer.parseInt(idKey); + Quest quest = QuestManager.getQuest(questID); + if (quest == null) { + sender.sendMessage("§7[§6任务§7] §f未找到该任务。"); + return true; + } + String playerName = sender.getName(); + if (args.length >= 3) { + playerName = args[2]; + } + Player player = Bukkit.getPlayer(playerName); + if (player == null) { + return true; + } + PlayerData playerData = getPlayerManager().getPlayerData(playerName); + if(playerData == null) return true; + if (playerData.isReceivedQuest(quest)) { + player.sendMessage("§7[§6任务§7] §f你已接受该任务。"); + return true; + } + playerData.receiveQuest(quest); + player.sendMessage("§7[§6任务§7] §f成功接受任务: " + quest.getDisplayName()); + return true; + } + if (args.length >= 2 && args[0].equalsIgnoreCase("tj")) { + String idKey = args[1]; + int questID = Integer.parseInt(idKey); + Quest quest = QuestManager.getQuest(questID); + if (quest == null) { + sender.sendMessage("§7[§6任务§7] §f未找到该任务。"); + return true; + } + String playerName = sender.getName(); + if (args.length >= 3) { + playerName = args[2]; + } + Player player = Bukkit.getPlayer(playerName); + if (player == null) { + return true; + } + PlayerData playerData = getPlayerManager().getPlayerData(playerName); + if(playerData == null) return true; + if (!playerData.isReceivedQuest(quest)) { + player.sendMessage("§7[§6任务§7] §f你还未接受该任务。"); + return true; + } + if (playerData.isFinishedQuest(quest)) { + player.sendMessage("§7[§6任务§7] §f该任务已完成。"); + return true; + } + if (!playerData.canFinishQuest(quest)) { + player.sendMessage("§7[§6任务§7] §f任务尚未完成,无法提交。"); + return true; + } + playerData.finisheQuest(quest); + player.sendMessage("§7[§6任务§7] §f任务提交成功: " + quest.getDisplayName()); + return true; + } + + if (args.length == 2 && args[0].equalsIgnoreCase("setloc")) { + String idKey = args[1]; + int questID = Integer.parseInt(idKey); + Quest quest = QuestManager.getQuest(questID); + if (quest == null) { + sender.sendMessage("§7[§6任务§7] §f未找到该任务。"); + return true; + } + Player player = (Player) sender; + quest.setStartingPoint(player.getLocation()); + sender.sendMessage("§c[主线任务] §f任务 §e"+quest.getQuestID()+" §f坐标设置完成."); + return true; + } + return false; + } + + public static Storyline inst() { + return instance; + } + + public static PlayerManager getPlayerManager() { + return playerManager; + } +} diff --git a/src/main/java/com/yaohun/storyline/config/Config.java b/src/main/java/com/yaohun/storyline/config/Config.java new file mode 100644 index 0000000..ed53590 --- /dev/null +++ b/src/main/java/com/yaohun/storyline/config/Config.java @@ -0,0 +1,104 @@ +package com.yaohun.storyline.config; + +import com.yaohun.storyline.Storyline; +import com.yaohun.storyline.core.Quest; +import com.yaohun.storyline.data.DialogueData; +import com.yaohun.storyline.manage.QuestManager; +import org.bukkit.Bukkit; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.File; +import java.time.YearMonth; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class Config { + + public static boolean debug = false; + private static String dataPath; + private static HashMap worldAlias = new HashMap<>(); + private static HashMap questTypeAlias = new HashMap<>(); + private static HashMap dialogueData = new HashMap<>(); + public static List dialogueDataList = new ArrayList<>(); + + public static void reloadConfig(Storyline plugin) { + plugin.reloadConfig(); + plugin.saveConfig(); + FileConfiguration config = plugin.getConfig(); + dataPath = config.getString("DataPath","plugins/AuData/ShouLiQuest"); + loadWorldAliasData(config); + loadQuestTypeAliasData(config); + loadNpcDialogueData(); + } + + private static void loadWorldAliasData(FileConfiguration config) { + ConfigurationSection section = config.getConfigurationSection("WorldAlias"); + if(section == null){ + return; + } + for (String world : section.getKeys(false)) { + worldAlias.put(world,section.getString(world).replace("&","§")); + } + } + + private static void loadQuestTypeAliasData(FileConfiguration config) { + ConfigurationSection section = config.getConfigurationSection("QuestType"); + if(section == null){ + return; + } + for (String questType : section.getKeys(false)) { + String name = section.getString(questType); + questTypeAlias.put(questType,name); + } + } + + private static void loadNpcDialogueData(){ + dialogueData.clear(); + Bukkit.getConsoleSender().sendMessage("§c[主线剧情] §f载入任务对话: "); + File file = new File("plugins/QuestStoryline","Dialogue.yml"); + FileConfiguration configuration = YamlConfiguration.loadConfiguration(file); + for (String idKey : configuration.getKeys(false)) { + int questID = Integer.parseInt(idKey); + Quest quest = QuestManager.getQuest(questID); + if(quest == null){ + continue; + } + String name = configuration.getString(questID+".name"); + List stringList = configuration.getStringList(questID+".npcContent"); + String player = configuration.getString(questID+".playerContent"); + String title = configuration.getString(questID+".title"); + String subtitle = configuration.getString(questID+".subTitle"); + dialogueData.put(quest,new DialogueData(questID,name,stringList,player,title,subtitle)); + Bukkit.getConsoleSender().sendMessage(" - QuestID: "+quest.getQuestID()+" 对话: "+name); + dialogueDataList.add(new DialogueData(questID,name,stringList,player,title,subtitle)); + } + } + + public static String getDataPath() { + return dataPath; + } + + public static String getWorldAlias(String world) { + if(worldAlias.containsKey(world)){ + return worldAlias.get(world); + } + return "§c未知世界"; + } + + public static String getQuestTypeAlias(String questType) { + if(questTypeAlias.containsKey(questType)){ + return questTypeAlias.get(questType); + } + return "§c未知类型"; + } + + public static DialogueData getDialogueData(Quest quest) { + if(dialogueData.containsKey(quest)){ + return dialogueData.get(quest); + } + return null; + } +} diff --git a/src/main/java/com/yaohun/storyline/core/Quest.java b/src/main/java/com/yaohun/storyline/core/Quest.java new file mode 100644 index 0000000..d6c42d8 --- /dev/null +++ b/src/main/java/com/yaohun/storyline/core/Quest.java @@ -0,0 +1,120 @@ +package com.yaohun.storyline.core; + +import com.yaohun.storyline.Storyline; +import com.yaohun.storyline.util.QuestType; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Sound; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; + +import java.io.File; +import java.io.IOException; +import java.util.List; + +public class Quest { + + private int questID; // 任务唯一id + private String displayName; // 任务名 + private String description; // 描述信息 + private QuestType questType; // 任务类型 + private String targetName; // 目标名 + private int targetAmount; // 目标次数 + private List rewardList; // 奖励内容 + private List commands; // 奖励命令 + private int nextQuestID; + private Location startingPoint; + private List introduceList; + + public Quest(int questID, String displayName, String description, QuestType questType, String targetName, int targetAmount, List rewardList, List commands, int nextQuestID, Location startingPoint, List introduceList) { + this.questID = questID; + this.displayName = displayName; + this.description = description; + this.questType = questType; + this.targetName = targetName; + this.targetAmount = targetAmount; + this.rewardList = rewardList; + this.commands = commands; + this.nextQuestID = nextQuestID; + this.startingPoint = startingPoint; + this.introduceList = introduceList; + } + + public int getQuestID() { + return questID; + } + + public String getDisplayName() { + return displayName; + } + + public String getDescription() { + return description; + } + + public QuestType getQuestType() { + return questType; + } + + public String getTargetName() { + return targetName; + } + + public int getTargetAmount() { + return targetAmount; + } + + public List getRewardList() { + return rewardList; + } + + public List getCommands() { + return commands; + } + + public int getNextQuestID() { + return nextQuestID; + } + + public Location getStartingPoint() { + return startingPoint; + } + + public void setStartingPoint(Location startingPoint) { + this.startingPoint = startingPoint; + File file = new File(Storyline.inst().getDataFolder(), "Quest.yml"); + FileConfiguration config = YamlConfiguration.loadConfiguration(file); + double x = startingPoint.getX(); + double y = startingPoint.getY(); + double z = startingPoint.getZ(); + float yaw = startingPoint.getYaw(); + float pitch = startingPoint.getPitch(); + String locString = String.format("%.1f",x)+","+String.format("%.1f",y)+","+String.format("%.1f",z)+","+String.format("%.1f",yaw)+","+String.format("%.1f",pitch); + config.set(questID+".location",startingPoint.getWorld().getName()+","+locString); + try { + config.save(file); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public List getIntroduceList() { + return introduceList; + } + + public void carryOutCommands(Player player){ + if(player == null){ + return; + } + for (String s : this.commands) { + if(s.contains("msg:")){ + player.sendMessage(s.replace("msg:","").replace("&","§")); + }else { + String cmd = s.replace("console:","").replace("&","§"); + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), cmd.replace("%player%", player.getName())); + } + } + player.playSound(player.getLocation(), Sound.ENTITY_PLAYER_LEVELUP,1,1); + } +} diff --git a/src/main/java/com/yaohun/storyline/data/DialogueData.java b/src/main/java/com/yaohun/storyline/data/DialogueData.java new file mode 100644 index 0000000..10f0cde --- /dev/null +++ b/src/main/java/com/yaohun/storyline/data/DialogueData.java @@ -0,0 +1,66 @@ +package com.yaohun.storyline.data; + +import com.yaohun.storyline.util.PlaceholderUtil; +import me.Demon.DemonPlugin.DemonAPI; + +import java.time.LocalDate; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.List; + +public class DialogueData { + + private int questID; + private String npcName; + private List npcContent; + private String playerContent; + + private String title; + private String subtitle; + + public DialogueData(int questID, String npcName, List npcContent, String playerContent, String title, String subtitle) { + this.questID = questID; + this.npcName = npcName; + List stringList = new ArrayList<>(npcContent); + for (int i = 0; i < stringList.size(); i++) { + String s = stringList.get(i); + if (s.contains("{day}")) { + stringList.set(i,s.replace("{day}",String.valueOf(getDateDiff("2019-10-25")))); + } + } + this.npcContent = DemonAPI.replaceColorList(stringList); + this.playerContent = playerContent; + this.title = title; + this.subtitle = subtitle; + } + + public int getQuestID() { + return questID; + } + + public String getNpcName() { + return npcName; + } + + public String getPlayerContent() { + return playerContent; + } + + public List getNpcContent() { + return npcContent; + } + + public String getTitle() { + return title; + } + + public String getSubtitle() { + return subtitle; + } + + private long getDateDiff(String format){ + LocalDate pastDate = LocalDate.parse(format); + LocalDate now = LocalDate.now(); + return ChronoUnit.DAYS.between(pastDate, now); + } +} diff --git a/src/main/java/com/yaohun/storyline/data/PlayerData.java b/src/main/java/com/yaohun/storyline/data/PlayerData.java new file mode 100644 index 0000000..f8f1dbd --- /dev/null +++ b/src/main/java/com/yaohun/storyline/data/PlayerData.java @@ -0,0 +1,233 @@ +package com.yaohun.storyline.data; + +import com.yaohun.storyline.core.Quest; +import com.yaohun.storyline.manage.QuestManager; +import com.yaohun.storyline.util.MessageUtil; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Set; + +public class PlayerData { + + private String playerName; + private int currentQuest; + + private HashMap questAmount; + // -1 = 已完成 + // -99 = 未接受 + // 0~100+ = 进度 + + public PlayerData(String playerName){ + this.playerName = playerName; + this.currentQuest = 1; + this.questAmount = new HashMap<>(); + } + + public void resetPlayerData(){ + this.currentQuest = 1; + this.questAmount = new HashMap<>(); + receiveQuest(QuestManager.getQuest(1)); + } + + public void stopPlayerData(){ + this.currentQuest = -10; + this.questAmount = new HashMap<>(); + } + + public PlayerData(String playerName, int currentQuest, HashMap questAmount){ + this.playerName = playerName; + this.currentQuest = currentQuest; + this.questAmount = questAmount; + } + + public int getCurrentQuest() { + return currentQuest; + } + + public void setCurrentQuest(int currentQuest) { + this.currentQuest = currentQuest; + } + + public String getPlayerName() { + return playerName; + } + + public Set getAllQuest(){ + return questAmount.keySet(); + } + + public List getQuestList() { + List questList = new ArrayList<>(); + for (Quest quest : questAmount.keySet()) { + if(isReceivedQuest(quest) && !isFinishedQuest(quest)){ + questList.add(quest); + } + } + return questList; + } + + // 获取任务当前状态 + public int getQuestAmount(Quest quest){ + if(questAmount.containsKey(quest)){ + return questAmount.get(quest); + } + return 0; + } + + // 判断玩家是否已接受任务 + public boolean isReceivedQuest(Quest quest){ + return this.questAmount.containsKey(quest); + } + + // 接受任务 + public void receiveQuest(Quest quest) { + if (!isReceivedQuest(quest)) { + this.questAmount.put(quest, 0); + } + } + + // 放弃任务 + public void removeQuest(Quest quest) { + questAmount.remove(quest); + } + + // 判断玩家是否已提交该任务 true = 已完成 + public boolean isFinishedQuest(Quest quest){ + if(isReceivedQuest(quest)){ + int questStats = getQuestAmount(quest); + if(questStats == -1){ + return true; + } + } + return false; + } + + // 判断任务是否已达到可提交要求 + public boolean canFinishQuest(Quest quest){ + if(isReceivedQuest(quest)){ + int amount = getQuestAmount(quest); + if(amount >= quest.getTargetAmount()){ + return true; + } + } + return false; + } + + // 提交任务 设置状态为完成 同时 执行完成命令 + public void finisheQuest(Quest quest){ + if(!isFinishedQuest(quest)){ + quest.carryOutCommands(Bukkit.getPlayer(playerName)); + this.questAmount.put(quest,-1); + } + } + + // 接受任务,强制完成任务 + public void forcCompleteQuest(Quest quest) { + if (!isFinishedQuest(quest)) { + this.questAmount.put(quest, -1); + int questID = quest.getNextQuestID(); + setCurrentQuest(questID); + receiveQuest(QuestManager.getQuest(questID)); + System.out.println("#[已自动接受] #ID = "+questID); + Player player = Bukkit.getPlayer(playerName); + if(player != null) { + quest.carryOutCommands(player); + player.sendMessage(MessageUtil.getMessage("finishedQuestMessage").replace("{quest}",quest.getDisplayName())); + } + } + } + + public void setQuestAmount(Quest quest, int amount){ + this.questAmount.put(quest, amount); + } + + public void addQuestAmount(Quest quest){ + addQuestAmount(quest, 1); + } + + public void addQuestAmount(Quest quest,int addAmount){ + // 玩家尚未接受任务 拦截返回 + if(!isReceivedQuest(quest)){ + return; + } + // 玩家已提交任务 拦截返回 + if(isFinishedQuest(quest)){ + return; + } + // 获取当前状态 + int questAmount = getQuestAmount(quest); + int newAmount = questAmount + addAmount; + if(newAmount > quest.getTargetAmount()){ + int needAmount = quest.getTargetAmount() - questAmount; + questAmount = questAmount + needAmount; + setQuestAmount(quest,questAmount); + } else { + setQuestAmount(quest,newAmount); + } + // 当任务进度满后自动提交任务 + if(canFinishQuest(quest)){ + forcCompleteQuest(quest); + } + } + + // 获取当前任务进度 + public double getProgress(Quest quest){ + if(!isReceivedQuest(quest)){ + return -99; + } + double amount = getQuestAmount(quest); + double d = (double) amount / quest.getTargetAmount(); + if(d >= 1.0D){ + d = 1.0D; + } else if(d <= 0.0D){ + d = 0.0D; + } + return d; + } + + public String getProgressString(Quest quest){ + double progress = getProgress(quest); + return String.format("%.2f", progress); + } + + + // 重载任务数据 + public void reload(List quests){ + HashMap hashMap = new HashMap<>(); + for (Quest newQuest : quests){ + for (Quest nowQuest : getAllQuest()){ + if(nowQuest == null){ + continue; + } + if(newQuest == null){ + continue; + } + if(newQuest.getQuestID() == nowQuest.getQuestID()){ + hashMap.put(newQuest,this.questAmount.get(nowQuest)); + } + } + } + this.questAmount = hashMap; + } + + public boolean isAllCompleted(){ + if(this.currentQuest <= -1){ + return true; + } + int maxSize = QuestManager.getQuestArrayList().size(); + int nowSize = 0; + for (Quest quest : questAmount.keySet()) { + if(isFinishedQuest(quest)){ + nowSize++; + } + } + if(nowSize >= maxSize){ + return true; + } + return false; + } +} diff --git a/src/main/java/com/yaohun/storyline/gui/DialogueGui.java b/src/main/java/com/yaohun/storyline/gui/DialogueGui.java new file mode 100644 index 0000000..7b17f02 --- /dev/null +++ b/src/main/java/com/yaohun/storyline/gui/DialogueGui.java @@ -0,0 +1,115 @@ +package com.yaohun.storyline.gui; + +import com.yaohun.storyline.Storyline; +import com.yaohun.storyline.config.Config; +import com.yaohun.storyline.core.Quest; +import com.yaohun.storyline.data.DialogueData; +import com.yaohun.storyline.data.PlayerData; +import com.yaohun.storyline.manage.PlayerManager; +import com.yaohun.storyline.manage.QuestManager; +import de.tr7zw.itemnbtapi.NBTItem; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.ArrayList; +import java.util.List; + +public class DialogueGui implements Listener { + + private static String invTitle = "§r§n§p§c§d§h§r"; + + public static void OpenGui(Player player, Quest quest){ + Inventory inv = Bukkit.createInventory(null,18,invTitle+"#"+quest.getQuestID()); + DialogueData dialogueData = Config.getDialogueData(quest); + if(dialogueData == null){ + System.out.println("[主线任务 - 错误] NPC对话任务出现错误 "+quest.getDisplayName()); + return; + } + ItemStack stack = new ItemStack(Material.PAPER); + ItemMeta meta = stack.getItemMeta(); + meta.setDisplayName(dialogueData.getPlayerContent()); + stack.setItemMeta(meta); + NBTItem nbtItem = new NBTItem(stack); + nbtItem.setInteger("dialogueID",quest.getQuestID()); + inv.setItem(17,nbtItem.getItem()); + setNpcDialogueData(inv,dialogueData.getNpcName(),dialogueData.getNpcContent()); + player.openInventory(inv); + } + + + public static void OpenGuiTest(Player player,DialogueData data){ + Inventory inv = Bukkit.createInventory(null,18,invTitle+"#"); + ItemStack stack = new ItemStack(Material.PAPER); + ItemMeta meta = stack.getItemMeta(); + meta.setDisplayName(data.getPlayerContent()); + stack.setItemMeta(meta); + inv.setItem(17,stack); + setNpcDialogueData(inv,data.getNpcName(),data.getNpcContent()); + player.openInventory(inv); + } + + private static void setNpcDialogueData(Inventory inv,String npcName,List strings){ + ItemStack item = new ItemStack(Material.PAPER); + ItemMeta meta = item.getItemMeta(); + meta.setDisplayName(npcName); + meta.setLore(strings); + item.setItemMeta(meta); + inv.setItem(0, item); + int slot = 1; + for (String string : strings){ + ItemStack stack = new ItemStack(Material.PAPER); + ItemMeta meta2 = stack.getItemMeta(); + List stringList = new ArrayList<>(); + stringList.add(string); + meta2.setLore(stringList); + stack.setItemMeta(meta2); + inv.setItem(slot, stack); + slot++; + } + } + + @EventHandler + public void onClick(InventoryClickEvent event){ + int rawSlot = event.getRawSlot(); + Player player = (Player) event.getWhoClicked(); + String playerName = player.getName(); + if(event.getView().getTitle().contains(invTitle)){ + event.setCancelled(true); + if(rawSlot == 17){ + ItemStack item = event.getCurrentItem(); + NBTItem nbtItem = new NBTItem(item); + int questID = nbtItem.getInteger("dialogueID"); + Quest quest = QuestManager.getQuest(questID); + if(quest == null){ + System.out.println("# "+questID+" 任务丢失."); + return; + } + PlayerManager playerManager = Storyline.getPlayerManager(); + PlayerData playerData = playerManager.getPlayerData(playerName); + playerData.forcCompleteQuest(quest); + + player.closeInventory(); + + DialogueData dialogueData = Config.getDialogueData(quest); + if(dialogueData != null) { + String title = dialogueData.getTitle(); + String subtitle = dialogueData.getSubtitle(); + if(title.contains("null")){ + title = " "; + } + if(subtitle.contains("null")){ + subtitle = " "; + } + player.sendTitle(title, subtitle, 15, 60, 15); + } + } + } + } +} diff --git a/src/main/java/com/yaohun/storyline/listener/PlayerListener.java b/src/main/java/com/yaohun/storyline/listener/PlayerListener.java new file mode 100644 index 0000000..2eed7e5 --- /dev/null +++ b/src/main/java/com/yaohun/storyline/listener/PlayerListener.java @@ -0,0 +1,51 @@ +package com.yaohun.storyline.listener; + +import com.yaohun.storyline.Storyline; +import com.yaohun.storyline.core.Quest; +import com.yaohun.storyline.data.PlayerData; +import com.yaohun.storyline.manage.PlayerManager; +import com.yaohun.storyline.manage.QuestManager; +import com.yaohun.storyline.util.MessageUtil; +import me.Demon.DemonWarps.WarpAPI; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.scheduler.BukkitRunnable; + +public class PlayerListener implements Listener { + + @EventHandler + public void onChange(PlayerChangedWorldEvent e) { + Player player = e.getPlayer(); + if(player.getLevel() >= 16){ + return; + } + String playerName = player.getName(); + PlayerManager manager = Storyline.getPlayerManager(); + PlayerData playerData = manager.getPlayerData(playerName); + + if (playerData == null) return; + + // 玩家若已完成所有任务则直接返回 + if(playerData.isAllCompleted()){ + return; + } + + Quest quest = QuestManager.getQuest(playerData.getCurrentQuest()); + if (quest == null) return; + Location questStart = quest.getStartingPoint(); + // 判断是否进入与任务起点不同的世界 + if (!player.getWorld().getName().equals(questStart.getWorld().getName())) { + new BukkitRunnable() { + @Override + public void run() { + // 传送回主线任务起点 + player.teleport(questStart); + MessageUtil.sendMessage(player, "§f[§c主线§f] §a你需要将主线剧情完成才能跳转场景."); + } + }.runTaskLater(Storyline.inst(),15L); + } + } +} diff --git a/src/main/java/com/yaohun/storyline/manage/ExternalManager.java b/src/main/java/com/yaohun/storyline/manage/ExternalManager.java new file mode 100644 index 0000000..c75c10c --- /dev/null +++ b/src/main/java/com/yaohun/storyline/manage/ExternalManager.java @@ -0,0 +1,166 @@ +package com.yaohun.storyline.manage; + +import com.yaohun.storyline.Storyline; +import com.yaohun.storyline.quest.*; +import org.bukkit.Bukkit; +import org.bukkit.plugin.Plugin; + +public class ExternalManager { + + private Storyline plugin; + + public ExternalManager(Storyline plugin) { + this.plugin = plugin; + } + + public void registerAll(){ + Bukkit.getConsoleSender().sendMessage("§e[主线任务] §f正在注册外部插件监听:"); + registerMythicMobsListener(); + registerCommandNpcListener(); + registerDemonSkillsListener(); + registerAuItemConvertListener(); + registerDemonHunHuanSXListener(); + registerDemonFenJieListener(); + registerWuHunJueXingListener(); + registerLevelRewardListener(); + registerDemonWarpsListener(); + registerDemonLevelsListener(); + + + /* registerDemonMmKillsStatsListener(); + registerAuMorefishListener(); + registerAuOnlineRewardListener(); + registerDemonPetsListener(); + + registerDemonLevelsListener(); + registerDemonIntensifyListener(); + registerDemonQuenchListener();*/ + } + + private void registerMythicMobsListener() { + String pluginName = "MythicMobs"; + if (isPluginPresent(pluginName, "io.lumine.xikage.mythicmobs.api.bukkit.events.MythicMobDeathEvent")) { + Bukkit.getPluginManager().registerEvents(new MythicMobsListener(), plugin); + Bukkit.getConsoleSender().sendMessage("§7 - §f注册 §b"+pluginName+" §f监听器成功"); + } + } + + private void registerCommandNpcListener() { + String pluginName = "CitizensCMD"; + if (isPluginPresent(pluginName, "me.messageofdeath.commandnpc.event.NpcInteractEvent")) { + Bukkit.getPluginManager().registerEvents(new NpcInteractListener(), plugin); + Bukkit.getConsoleSender().sendMessage("§7 - §f注册 §b"+pluginName+" §f监听器成功"); + } + } + + private void registerDemonSkillsListener() { + String pluginName = "DemonSkills"; + if (isPluginPresent(pluginName, "com.yaohun.demonskills.event.SkillCastEvent")) { + Bukkit.getPluginManager().registerEvents(new SkillCastListener(), plugin); + Bukkit.getConsoleSender().sendMessage("§7 - §f注册 §b"+pluginName+" §f监听器成功"); + } + } + + private void registerAuItemConvertListener() { + String pluginName = "AuItemConvert"; + if (isPluginPresent(pluginName, "com.yaohun.itemconvert.event.ItemConvertEvent")) { + Bukkit.getPluginManager().registerEvents(new ItemConvertListener(), plugin); + Bukkit.getConsoleSender().sendMessage("§7 - §f注册 §b"+pluginName+" §f监听器成功"); + } + } + + private void registerDemonHunHuanSXListener() { + String pluginName = "DemonHunHuanSX"; + if (isPluginPresent(pluginName, "me.Demon.DemonHunHuanSX.Event.HhXiruEvent")) { + Bukkit.getPluginManager().registerEvents(new HunHuanSXListener(), plugin); + Bukkit.getConsoleSender().sendMessage("§7 - §f注册 §b"+pluginName+" §f监听器成功"); + } + } + + private void registerDemonFenJieListener() { + String pluginName = "DemonFenJie"; + if (isPluginPresent(pluginName, "com.io.yaohun.fenjie.event.ResolveItemEvent")) { + Bukkit.getPluginManager().registerEvents(new FenJieListener(), plugin); + Bukkit.getConsoleSender().sendMessage("§7 - §f注册 §b"+pluginName+" §f监听器成功"); + } + } + + private void registerWuHunJueXingListener() { + String pluginName = "WuHunJueXing"; + if (isPluginPresent(pluginName, "me.Demon.WuHunJueXing.Event.WhJueXingEvent")) { + Bukkit.getPluginManager().registerEvents(new WuHunWakeListener(), plugin); + Bukkit.getConsoleSender().sendMessage("§7 - §f注册 §b"+pluginName+" §f监听器成功"); + } + } + + private void registerLevelRewardListener() { + String pluginName = "DemonLevelReward"; + if (isPluginPresent(pluginName, "me.Demon.DemonLevelReward.Event.LevelRewardReceiveEvent")) { + Bukkit.getPluginManager().registerEvents(new LevelRewardListener(), plugin); + Bukkit.getConsoleSender().sendMessage("§7 - §f注册 §b"+pluginName+" §f监听器成功"); + } + } + + + private void registerDemonWarpsListener() { + String pluginName = "DemonWarps"; + if (isPluginPresent(pluginName, "me.Demon.DemonWarps.event.SendWarpEvent")) { + Bukkit.getPluginManager().registerEvents(new WarpSendListener(), plugin); + Bukkit.getConsoleSender().sendMessage("§7 - §f注册 §b"+pluginName+" §f监听器成功"); + } + } + + private void registerDemonLevelsListener() { + String pluginName = "DemonLevels"; + if (isPluginPresent(pluginName, "me.Demon.DemonLevels.event.ShareExpEvent")) { + Bukkit.getPluginManager().registerEvents(new LevelExpListener(), plugin); + Bukkit.getConsoleSender().sendMessage("§7 - §f注册 §b"+pluginName+" §f监听器成功"); + } + } + +/* private void registerDemonMmKillsStatsListener() { + String pluginName = "DemonMmKillsStats"; + if (isPluginPresent(pluginName, "me.Demon.DemonMmKillsStats.Event.KillsMobsStatsEvent")) { + Bukkit.getPluginManager().registerEvents(new MythicMobsKillsStatsListener(), plugin); + Bukkit.getConsoleSender().sendMessage("§7 - §f注册 §b"+pluginName+" §f监听器成功"); + } + } + + private void registerAuMorefishListener() { + String pluginName = "AuMoreFish"; + if (isPluginPresent(pluginName, "com.yaohun.morefish.event.FishTopEvent")) { + Bukkit.getPluginManager().registerEvents(new MorefishListener(), plugin); + Bukkit.getConsoleSender().sendMessage("§7 - §f注册 §b"+pluginName+" §f监听器成功"); + } + } + + private void registerAuOnlineRewardListener() { + String pluginName = "AuOnlineReward"; + if (isPluginPresent(pluginName, "com.yaohun.onlinereward.event.OnlineRewardEvent")) { + Bukkit.getPluginManager().registerEvents(new OnlineRewardListener(), plugin); + Bukkit.getConsoleSender().sendMessage("§7 - §f注册 §b"+pluginName+" §f监听器成功"); + } + } + + private void registerDemonPetsListener() { + String pluginName = "DemonPets"; + if (isPluginPresent(pluginName, "me.Demon.DemonPets.Event.PetsBuZhuoEvent")) { + Bukkit.getPluginManager().registerEvents(new PetsListener(), plugin); + Bukkit.getConsoleSender().sendMessage("§7 - §f注册 §b"+pluginName+" §f监听器成功"); + } + } +*/ + + + private boolean isPluginPresent(String pluginName, String className) { + Plugin target = Bukkit.getPluginManager().getPlugin(pluginName); + if (target == null) return false; + try { + Class.forName(className); + return true; + } catch (ClassNotFoundException e) { + Bukkit.getConsoleSender().sendMessage("§7 - §f注册 §b"+pluginName+" §c但缺失类 "+className); + return false; + } + } +} diff --git a/src/main/java/com/yaohun/storyline/manage/PlayerManager.java b/src/main/java/com/yaohun/storyline/manage/PlayerManager.java new file mode 100644 index 0000000..0170797 --- /dev/null +++ b/src/main/java/com/yaohun/storyline/manage/PlayerManager.java @@ -0,0 +1,123 @@ +package com.yaohun.storyline.manage; + +import com.yaohun.storyline.config.Config; +import com.yaohun.storyline.core.Quest; +import com.yaohun.storyline.data.PlayerData; +import me.Demon.DemonLevels.api.DLevelAPI; +import me.Demon.DemonPlugin.DemonAPI; +import org.bukkit.Bukkit; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class PlayerManager { + + private HashMap playerDataMap = new HashMap<>(); + + public List getAllPlayerData() { + return new ArrayList<>(playerDataMap.values()); + } + + public void createPlayerData(Player player) { + String playerName = player.getName(); + if(!playerDataMap.containsKey(playerName)) { + File file = new File(Config.getDataPath(), playerName + ".yml"); + if(!file.exists()){ + PlayerData playerData = new PlayerData(playerName); + playerDataMap.put(playerName, playerData); + playerData.receiveQuest(QuestManager.getQuest(1)); + Bukkit.getConsoleSender().sendMessage("§c[主线任务] §a玩家 §e"+playerName+" §a已开启新手引导任务."); + } else { + Bukkit.getConsoleSender().sendMessage("§c[主线任务] §a玩家 §e"+playerName+" §a已创建过引导档案."); + } + } else { + Bukkit.getConsoleSender().sendMessage("§c[主线任务] §a玩家 §e"+playerName+" §a已正在进行引导任务."); + } + } + + public void stopPlayerData(Player player) { + String playerName = player.getName(); + if(playerDataMap.containsKey(playerName)) { + PlayerData playerData = playerDataMap.get(playerName); + playerData.stopPlayerData(); + } else { + Bukkit.getConsoleSender().sendMessage("§c[主线任务] §a玩家 §e"+playerName+" §a貌似并没有进行主题任务."); + } + } + + public PlayerData getPlayerData(String playerName) { + if(!playerDataMap.containsKey(playerName)) { + File file = new File(Config.getDataPath(), playerName + ".yml"); + if(!file.exists()){ + return null; + } + FileConfiguration config = YamlConfiguration.loadConfiguration(file); + int currentQuest = config.getInt("currentQuest",1); + ConfigurationSection section = config.getConfigurationSection("quests"); + HashMap questAmountMap = new HashMap<>(); + if(section != null) { + for (String key : section.getKeys(false)) { + try { + int questID = Integer.parseInt(key); + Quest quest = QuestManager.getQuest(questID); + if(quest != null) { + int amount = section.getInt(key); + questAmountMap.put(quest, amount); + } + } catch (NumberFormatException e) { + e.printStackTrace(); + } + } + } + PlayerData playerData = new PlayerData(playerName, currentQuest,questAmountMap); + playerDataMap.put(playerName, playerData); + return playerData; + } + return playerDataMap.get(playerName); + } + + public void savePlayerData(PlayerData data) { + File file = new File(Config.getDataPath(), data.getPlayerName() + ".yml"); + FileConfiguration config = new YamlConfiguration(); + config.set("SaveTime", DemonAPI.getTime("yyyy/MM/dd HH:mm:ss")); + config.set("currentQuest",data.getCurrentQuest()); + ConfigurationSection section = config.createSection("quests"); + for (Quest quest : data.getAllQuest()){ + // System.out.println("# "+quest.getQuestID()+" "+data.getQuestAmount(quest)); + section.set(String.valueOf(quest.getQuestID()),data.getQuestAmount(quest)); + } + try { + config.save(file); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public void saveAllPlayerData() { + File folder = new File(Config.getDataPath()); + if (!folder.exists()) { + folder.mkdirs(); // 确保路径存在 + } + int successCount = 0; + int failCount = 0; + for (PlayerData data : playerDataMap.values()) { + try { + savePlayerData(data); // 单人保存方法 + successCount++; + } catch (Exception e) { + Bukkit.getLogger().severe("[剧情任务] 保存玩家任务数据失败:" + data.getPlayerName() + " - 错误:" + e.getMessage()); + e.printStackTrace(); + failCount++; + } + } + Bukkit.getLogger().info("[剧情任务] 保存玩家任务数据完成:成功 " + successCount + " 人,失败 " + failCount + " 人。"); + playerDataMap.clear(); + } +} diff --git a/src/main/java/com/yaohun/storyline/manage/QuestManager.java b/src/main/java/com/yaohun/storyline/manage/QuestManager.java new file mode 100644 index 0000000..11e568c --- /dev/null +++ b/src/main/java/com/yaohun/storyline/manage/QuestManager.java @@ -0,0 +1,76 @@ +package com.yaohun.storyline.manage; + +import com.yaohun.storyline.Storyline; +import com.yaohun.storyline.core.Quest; +import com.yaohun.storyline.util.QuestType; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +public class QuestManager { + + private static List questArrayList = new ArrayList<>(); + + public static void init(Storyline plugin) { + reloadQuestConfig(plugin); // 载入每日任务配置 + } + + public static void reloadQuestConfig(Storyline plugin) { + questArrayList = new ArrayList<>(); + File file = new File(plugin.getDataFolder(), "Quest.yml"); + FileConfiguration config = YamlConfiguration.loadConfiguration(file); + int count = 0; + for (String questKey : config.getKeys(false)) { + int questID = Integer.parseInt(questKey); + String displayName = config.getString(questKey+".displayName"); + String description = config.getString(questKey+".description"); + QuestType questType = QuestType.valueOf(config.getString(questKey+".questType")); + String targetName = config.getString(questKey+".target.name"); + int targetAmount = config.getInt(questKey+".target.amount"); + List rewardList = config.getStringList(questKey+".rewards"); + List commandList = config.getStringList(questKey+".finish"); + int nextQuestID = config.getInt(questKey+".nextQuestID"); + Location location = AnalyticalCoordinates(config.getString(questKey+".location")); + List introduce = config.getStringList(questKey+".introduce"); + questArrayList.add(new Quest(questID, displayName, description,questType, targetName, targetAmount, rewardList, commandList,nextQuestID,location,introduce)); + count++; + } + Bukkit.getConsoleSender().sendMessage("§e[手礼任务] §f载入主线任务 ➨ §a"+count+"个"); + } + + private static Location AnalyticalCoordinates(String string){ + String[] split = string.split(","); + if(split.length == 6) { + String worldName = split[0]; + double x = Double.parseDouble(split[1]); + double y = Double.parseDouble(split[2]); + double z = Double.parseDouble(split[3]); + float yaw = Float.parseFloat(split[4]); + float pitch = Float.parseFloat(split[5]); + return new Location(Bukkit.getWorld(worldName), x, y, z, yaw, pitch); + } else { + return null; + } + } + + // 根据任务ID获取任务 + public static Quest getQuest(int id) { + for (Quest quest : questArrayList) { + if (quest.getQuestID() == id) { + return quest; + } + } + return null; + } + + // 获取对应的任务列表 + public static List getQuestArrayList() { + return new ArrayList<>(questArrayList); + } + +} diff --git a/src/main/java/com/yaohun/storyline/network/DragonChannel.java b/src/main/java/com/yaohun/storyline/network/DragonChannel.java new file mode 100644 index 0000000..23bb7c2 --- /dev/null +++ b/src/main/java/com/yaohun/storyline/network/DragonChannel.java @@ -0,0 +1,102 @@ +package com.yaohun.storyline.network; + +import com.yaohun.gpsaddon.api.GPSAPI; +import com.yaohun.storyline.Storyline; +import com.yaohun.storyline.core.Quest; +import com.yaohun.storyline.data.PlayerData; +import com.yaohun.storyline.manage.PlayerManager; +import com.yaohun.storyline.manage.QuestManager; +import de.tr7zw.itemnbtapi.NBTItem; +import eos.moe.dragoncore.DragonCore; +import eos.moe.dragoncore.api.CoreAPI; +import eos.moe.dragoncore.api.easygui.EasyScreen; +import eos.moe.dragoncore.api.gui.event.CustomPacketEvent; +import eos.moe.dragongps.dy; +import eos.moe.dragongps.gq; +import me.Demon.DemonPlugin.DemonAPI; +import me.Demon.DemonPlugin.Util.CDTimeAPI; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class DragonChannel implements Listener { + + @EventHandler + public void message(CustomPacketEvent e) { + // 此处名称尽量独特,避免与其他人的插件相同导致冲突问题 + if (!"Storyline".equals(e.getIdentifier())) { + return; + } + Player player = e.getPlayer(); + UUID uuid = player.getUniqueId(); + String playerName = player.getName(); + if(e.getData().contains("gps")) { // 导航 + if(CDTimeAPI.isCD(uuid,"gps_cd")){ + return; + } + PlayerManager playerManager = Storyline.getPlayerManager(); + PlayerData playerData = playerManager.getPlayerData(playerName); + if(playerData == null) return; + int questID = playerData.getCurrentQuest(); + Quest quest = QuestManager.getQuest(questID); + if (quest != null) { + Location location = quest.getStartingPoint(); + if(location != null) { + player.teleport(location.clone().add(0,1.5,0)); + } + if(questID == 1){ + GPSAPI.enable(player,"初到斗魂帝国"); + } else if(questID == 2){ + GPSAPI.enable(player,"拜访村落长者"); + } else if(questID == 3){ + GPSAPI.enable(player,"老铁匠的考验"); + } else if(questID == 4){ + GPSAPI.enable(player,"再见老铁匠"); + } else if(questID == 5){ + GPSAPI.enable(player,"器魂的觉醒"); + } else if(questID == 6){ + GPSAPI.enable(player,"首次狩猎行动"); + }else if(questID == 7){ + GPSAPI.enable(player,"唐门绝学速成"); + }else if(questID == 8){ + GPSAPI.enable(player,"唐门绝学速成"); + }else if(questID == 9){ + GPSAPI.enable(player,"器魂的进阶"); + }else if(questID == 10){ + GPSAPI.enable(player,"器魂的进阶"); + }else if(questID == 11){ + GPSAPI.enable(player,"百年灵兽讨伐"); + }else if(questID == 12){ + GPSAPI.enable(player,"废物再利用"); + }else if(questID == 13){ + GPSAPI.enable(player,"废物再利用"); + }else if(questID == 14){ + GPSAPI.enable(player,"器魂进阶觉醒"); + }else if(questID == 15){ + GPSAPI.enable(player,"器魂进阶觉醒"); + }else if(questID == 16){ + GPSAPI.enable(player,"萌新福利官"); + }else if(questID == 17){ + GPSAPI.enable(player,"萌新福利官"); + }else if(questID == 18){ + GPSAPI.enable(player,"千年灵兽讨伐"); + }else if(questID == 21){ + GPSAPI.enable(player,"唐门暗器制作"); + }else if(questID == 23){ + GPSAPI.enable(player,"万年灵兽讨伐"); + } + CDTimeAPI.setPlayerCD(uuid,"gps_cd",1000 * 5); + } + } + } +} diff --git a/src/main/java/com/yaohun/storyline/quest/FenJieListener.java b/src/main/java/com/yaohun/storyline/quest/FenJieListener.java new file mode 100644 index 0000000..c327198 --- /dev/null +++ b/src/main/java/com/yaohun/storyline/quest/FenJieListener.java @@ -0,0 +1,49 @@ +package com.yaohun.storyline.quest; + +import com.io.yaohun.fenjie.event.ResolveItemEvent; +import com.yaohun.storyline.Storyline; +import com.yaohun.storyline.core.Quest; +import com.yaohun.storyline.data.PlayerData; +import com.yaohun.storyline.manage.PlayerManager; +import com.yaohun.storyline.manage.QuestManager; +import com.yaohun.storyline.util.QuestType; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +public class FenJieListener implements Listener { + + @EventHandler + public void onHhFenJie(ResolveItemEvent e) { + Player player = e.getPlayer(); + // 获取玩家名称 + String playerName = player.getName(); + + // 通过你的插件系统获取该玩家的任务数据管理器 + PlayerManager playerManager = Storyline.getPlayerManager(); + PlayerData playerData = playerManager.getPlayerData(playerName); + + if(playerData == null) return; + + // 玩家若已完成所有任务则直接返回 + if(playerData.isAllCompleted()){ + return; + } + + // 获取玩家当前任务 + Quest quest = QuestManager.getQuest(playerData.getCurrentQuest()); + if(quest == null){return;} + if(quest.getQuestType() == QuestType.FENJIE) { + String FjName = e.getSchemeKey(); + if (FjName.contains(quest.getTargetName())) { + for (int i = 0; i < e.getStack().getAmount();i++) { + playerData.addQuestAmount(quest); + } + } + } + } +} diff --git a/src/main/java/com/yaohun/storyline/quest/HunHuanSXListener.java b/src/main/java/com/yaohun/storyline/quest/HunHuanSXListener.java new file mode 100644 index 0000000..5b0c566 --- /dev/null +++ b/src/main/java/com/yaohun/storyline/quest/HunHuanSXListener.java @@ -0,0 +1,41 @@ +package com.yaohun.storyline.quest; + +import com.yaohun.storyline.Storyline; +import com.yaohun.storyline.core.Quest; +import com.yaohun.storyline.data.PlayerData; +import com.yaohun.storyline.manage.PlayerManager; +import com.yaohun.storyline.manage.QuestManager; +import com.yaohun.storyline.util.QuestType; +import me.Demon.DemonHunHuanSX.Event.HhXiruEvent; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +import java.util.ArrayList; +import java.util.List; + +public class HunHuanSXListener implements Listener { + + @EventHandler + public void onHunHuan(HhXiruEvent e){ + Player player = e.getPlayer(); + String playerName = player.getName(); + + PlayerManager playerManager = Storyline.getPlayerManager(); + PlayerData playerData = playerManager.getPlayerData(playerName); + + if(playerData == null) return; + + // 玩家若已完成所有任务则直接返回 + if(playerData.isAllCompleted()){ + return; + } + + // 获取玩家当前任务 + Quest quest = QuestManager.getQuest(playerData.getCurrentQuest()); + if(quest == null){return;} + if(quest.getQuestType() == QuestType.HUNHUAN_ENROL){ + playerData.forcCompleteQuest(quest); + } + } +} diff --git a/src/main/java/com/yaohun/storyline/quest/ItemConvertListener.java b/src/main/java/com/yaohun/storyline/quest/ItemConvertListener.java new file mode 100644 index 0000000..13f08b9 --- /dev/null +++ b/src/main/java/com/yaohun/storyline/quest/ItemConvertListener.java @@ -0,0 +1,58 @@ +package com.yaohun.storyline.quest; + +import com.yaohun.itemconvert.event.ItemConvertEvent; +import com.yaohun.storyline.Storyline; +import com.yaohun.storyline.core.Quest; +import com.yaohun.storyline.data.PlayerData; +import com.yaohun.storyline.manage.PlayerManager; +import com.yaohun.storyline.manage.QuestManager; +import com.yaohun.storyline.util.QuestType; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerItemConsumeEvent; + +public class ItemConvertListener implements Listener { + + + @EventHandler + public void onItemConvert(ItemConvertEvent event) { + Player player = event.getPlayer(); + // 获取玩家名称 + String playerName = player.getName(); + + // 通过你的插件系统获取该玩家的任务数据管理器 + PlayerManager playerManager = Storyline.getPlayerManager(); + PlayerData playerData = playerManager.getPlayerData(playerName); + + if(playerData == null) return; + + // 玩家若已完成所有任务则直接返回 + if(playerData.isAllCompleted()){ + return; + } + + // 获取玩家当前任务 + Quest quest = QuestManager.getQuest(playerData.getCurrentQuest()); + if(quest == null){return;} + if(quest.getQuestType() == QuestType.CONVER_FILE) { + String file_Name = quest.getTargetName(); + String type = event.getShopKey(); + if(file_Name.equalsIgnoreCase(type)){ + playerData.addQuestAmount(quest); + } + } else if (quest.getQuestType() == QuestType.CONVER_ITEM) { + if(quest.getTargetName().contains("#")) { + String[] strings = quest.getTargetName().split("#"); + String file_Name = strings[0]; + String Item_Key = strings[1]; + if (event.getShopKey().equalsIgnoreCase(file_Name)) { + if (event.getConvertKey().equalsIgnoreCase(Item_Key)) { + playerData.addQuestAmount(quest); + } + } + } + } + } + +} diff --git a/src/main/java/com/yaohun/storyline/quest/LevelExpListener.java b/src/main/java/com/yaohun/storyline/quest/LevelExpListener.java new file mode 100644 index 0000000..f9a452f --- /dev/null +++ b/src/main/java/com/yaohun/storyline/quest/LevelExpListener.java @@ -0,0 +1,67 @@ +package com.yaohun.storyline.quest; + +import com.yaohun.storyline.Storyline; +import com.yaohun.storyline.core.Quest; +import com.yaohun.storyline.data.PlayerData; +import com.yaohun.storyline.manage.PlayerManager; +import com.yaohun.storyline.manage.QuestManager; +import com.yaohun.storyline.util.QuestType; +import me.Demon.DemonLevels.event.ShareExpEvent; +import me.Demon.DemonLevels.event.UpLevelEvant; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +import java.util.Set; + +public class LevelExpListener implements Listener { + + @EventHandler + public void onTeamExp(UpLevelEvant evant) { + Player player = evant.getPlayer(); + // 获取玩家名称 + String playerName = player.getName(); + // 通过你的插件系统获取该玩家的任务数据管理器 + PlayerManager playerManager = Storyline.getPlayerManager(); + PlayerData playerData = playerManager.getPlayerData(playerName); + if(playerData == null) return; + // 玩家若已完成所有任务则直接返回 + if(playerData.isAllCompleted()){ + return; + } + // 获取玩家当前任务 + Quest quest = QuestManager.getQuest(playerData.getCurrentQuest()); + if(quest == null){return;} + if(quest.getQuestType() == QuestType.PLAYER_LEVEL_UP) { + if(evant.getLevel() >= quest.getTargetAmount()) { + playerData.forcCompleteQuest(quest); + } + } + } + + @EventHandler + public void onTeamExp(ShareExpEvent event) { + Player player = event.getPlayer(); + // 获取玩家名称 + String playerName = player.getName(); + + // 通过你的插件系统获取该玩家的任务数据管理器 + PlayerManager playerManager = Storyline.getPlayerManager(); + PlayerData playerData = playerManager.getPlayerData(playerName); + + if(playerData == null) return; + + // 玩家若已完成所有任务则直接返回 + if(playerData.isAllCompleted()){ + return; + } + + // 获取玩家当前任务 + Quest quest = QuestManager.getQuest(playerData.getCurrentQuest()); + if(quest == null){return;} + if (quest.getQuestType() == QuestType.PLAYER_TEAM_EXP) { + // 增加该任务的完成进度 + playerData.addQuestAmount(quest); + } + } +} diff --git a/src/main/java/com/yaohun/storyline/quest/LevelRewardListener.java b/src/main/java/com/yaohun/storyline/quest/LevelRewardListener.java new file mode 100644 index 0000000..c5aea8a --- /dev/null +++ b/src/main/java/com/yaohun/storyline/quest/LevelRewardListener.java @@ -0,0 +1,49 @@ +package com.yaohun.storyline.quest; + +import com.io.yaohun.fenjie.event.ResolveItemEvent; +import com.yaohun.storyline.Storyline; +import com.yaohun.storyline.core.Quest; +import com.yaohun.storyline.data.PlayerData; +import com.yaohun.storyline.manage.PlayerManager; +import com.yaohun.storyline.manage.QuestManager; +import com.yaohun.storyline.util.QuestType; +import me.Demon.DemonLevelReward.Event.LevelRewardReceiveEvent; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class LevelRewardListener implements Listener { + + @EventHandler + public void onLevelReward(LevelRewardReceiveEvent e) { + Player player = e.getPlayer(); + // 获取玩家名称 + String playerName = player.getName(); + + // 通过你的插件系统获取该玩家的任务数据管理器 + PlayerManager playerManager = Storyline.getPlayerManager(); + PlayerData playerData = playerManager.getPlayerData(playerName); + + if(playerData == null) return; + + // 玩家若已完成所有任务则直接返回 + if(playerData.isAllCompleted()){ + return; + } + + // 获取玩家当前任务 + Quest quest = QuestManager.getQuest(playerData.getCurrentQuest()); + if(quest == null){return;} + if(quest.getQuestType() == QuestType.LEVEL_REWARD_KEY) { + String rewardKey = e.getRewardKey(); + if(rewardKey.contains(quest.getTargetName())){ + playerData.addQuestAmount(quest); + } + } else if(quest.getQuestType() == QuestType.LEVEL_REWARD_VALUE) { + int rewardLevel = e.getLevels(); + if(String.valueOf(rewardLevel).equalsIgnoreCase(quest.getTargetName())){ + playerData.addQuestAmount(quest); + } + } + } +} diff --git a/src/main/java/com/yaohun/storyline/quest/MythicMobsListener.java b/src/main/java/com/yaohun/storyline/quest/MythicMobsListener.java new file mode 100644 index 0000000..fd6bebb --- /dev/null +++ b/src/main/java/com/yaohun/storyline/quest/MythicMobsListener.java @@ -0,0 +1,68 @@ +package com.yaohun.storyline.quest; + +import com.yaohun.storyline.Storyline; +import com.yaohun.storyline.core.Quest; +import com.yaohun.storyline.data.PlayerData; +import com.yaohun.storyline.manage.PlayerManager; +import com.yaohun.storyline.manage.QuestManager; +import com.yaohun.storyline.util.QuestType; +import io.lumine.xikage.mythicmobs.api.bukkit.events.MythicMobDeathEvent; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerMoveEvent; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +public class MythicMobsListener implements Listener { + + @EventHandler + public void onMythicMobsDeath(MythicMobDeathEvent e) { + // 获取击杀者实体 + LivingEntity killer = e.getKiller(); + + // 如果击杀者是玩家才处理 + if (killer instanceof Player) { + // 获取该 MythicMob 的显示名(带颜色代码),并去除颜色代码后存入 displayName + String displayName = e.getMob().getDisplayName().replaceAll("§[a-zA-Z0-9]", ""); + + // 获取该 MythicMob 的内部名(通常用于标识配置中的 mob id) + String internalName = e.getMobType().getInternalName(); + + // 获取玩家名称 + String playerName = killer.getName(); + + // 通过你的插件系统获取该玩家的任务数据管理器 + PlayerManager playerManager = Storyline.getPlayerManager(); + PlayerData playerData = playerManager.getPlayerData(playerName); + if(playerData == null) return; + // 玩家若已完成所有任务则直接返回 + if(playerData.isAllCompleted()){ + return; + } + + // 获取玩家当前任务 + Quest quest = QuestManager.getQuest(playerData.getCurrentQuest()); + if(quest == null){return;} + // 如果是通过 MythicMob "内部名称" 匹配的击杀任务 + if (quest.getQuestType() == QuestType.KILLS_MM_KEY) { + // 判断该怪物的 internalName 是否包含任务目标名称 + if (internalName.contains(quest.getTargetName())) { + // 增加该任务的完成进度 + playerData.addQuestAmount(quest); + } + + // 如果是通过 MythicMob "显示名称" 匹配的击杀任务 + } else if (quest.getQuestType() == QuestType.KILLS_MM_NAME) { + // 判断显示名称是否包含任务目标名称 + if (displayName.contains(quest.getTargetName())) { + // 增加该任务的完成进度 + playerData.addQuestAmount(quest); + } + } + } + } +} diff --git a/src/main/java/com/yaohun/storyline/quest/NpcInteractListener.java b/src/main/java/com/yaohun/storyline/quest/NpcInteractListener.java new file mode 100644 index 0000000..6d01b65 --- /dev/null +++ b/src/main/java/com/yaohun/storyline/quest/NpcInteractListener.java @@ -0,0 +1,109 @@ +package com.yaohun.storyline.quest; + +import com.yaohun.storyline.Storyline; +import com.yaohun.storyline.config.Config; +import com.yaohun.storyline.core.Quest; +import com.yaohun.storyline.data.DialogueData; +import com.yaohun.storyline.data.PlayerData; +import com.yaohun.storyline.gui.DialogueGui; +import com.yaohun.storyline.manage.PlayerManager; +import com.yaohun.storyline.manage.QuestManager; +import com.yaohun.storyline.util.MessageUtil; +import com.yaohun.storyline.util.QuestType; +import me.Demon.DemonPlugin.DemonAPI; +import me.Demon.DemonPlugin.Util.AreaType; +import me.messageofdeath.commandnpc.event.NpcInteractEvent; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerInteractEvent; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +public class NpcInteractListener implements Listener { + + @EventHandler + public void onNpcInteract(NpcInteractEvent event) { + Player player = event.getPlayer(); + String playerName = player.getName(); + + PlayerManager playerManager = Storyline.getPlayerManager(); + PlayerData playerData = playerManager.getPlayerData(playerName); + + if(playerData == null) { + return; + } + + // 玩家若已完成所有任务则直接返回 + if(playerData.isAllCompleted()){ + return; + } + int currentQuestID = playerData.getCurrentQuest(); + // 当前正在进行的任务id小于15时拦截 + if(DemonAPI.getAreaType() == AreaType.DEFAULT) { + if (event.getNpcName().contains("器魂觉醒台")) { + if (currentQuestID < 15) { + event.setCancelled(true); + player.sendTitle("§f[§c⚠警告⚠§f]", "§a请先与§e[冥洛]§a进行对话了解器魂觉醒", 10, 40, 20); + MessageUtil.sendMessage(player, "§f[§c主线§f] §a请先与§e[冥洛]§a进行对话了解器魂觉醒。", Sound.ENTITY_VILLAGER_NO); + return; + } + } + if (event.getNpcName().contains("竹离")) { + if(currentQuestID < 16) { + event.setCancelled(true); + player.sendTitle("§f[§c⚠警告⚠§f]", "§a你需要领取任务[§e来自福利官的激励§a]才能领取", 10, 40, 20); + MessageUtil.sendMessage(player, "§f[§c主线§f] §a你需要领取任务[§e来自福利官的激励§a]才能领取。", Sound.ENTITY_VILLAGER_NO); + return; + } + } + } else { + if (event.getNpcName().contains("器魂覺醒台")) { + if (currentQuestID < 15) { + event.setCancelled(true); + player.sendTitle("§f[§c⚠警告⚠§f]", "§a請先與§e[冥洛]§a進行對話了解器魂覺醒", 10, 40, 20); + MessageUtil.sendMessage(player, "§f[§c主線§f] §a請先與§e[冥洛]§a進行對話了解器魂覺醒。", Sound.ENTITY_VILLAGER_NO); + return; + } + } + if(event.getNpcName().contains("竹離")){ + if(currentQuestID < 16) { + event.setCancelled(true); + player.sendTitle("§f[§c⚠警告⚠§f]", "§a你需要領取任務[§e來自福利官的激勵§a]才能領取", 10, 40, 20); + MessageUtil.sendMessage(player, "§f[§c主線§f] §a你需要領取任務[§e來自福利官的激勵§a]才能領取。", Sound.ENTITY_VILLAGER_NO); + return; + } + } + } + Quest quest = QuestManager.getQuest(currentQuestID); + if(quest != null) { + if (quest.getQuestType() == QuestType.DUI_HUA_NAME) { + String npcName = event.getNpcName(); + if (npcName.contains(quest.getTargetName())) { + DialogueGui.OpenGui(player, quest); + event.setCancelled(true); + } + } + } + } + + + @EventHandler + public void onNpcInteractTest(NpcInteractEvent event) { + Player player = event.getPlayer(); + String playerName = player.getName(); + if(Config.debug){ + List dataList = Config.dialogueDataList; + for (DialogueData dialogueData : dataList) { + String name = dialogueData.getNpcName().replaceAll("§[0-9a-fk-or]", "");; + if(event.getNpcName().contains(name)){ + DialogueGui.OpenGuiTest(player,dialogueData); + event.setCancelled(true); + } + } + } + } +} diff --git a/src/main/java/com/yaohun/storyline/quest/SkillCastListener.java b/src/main/java/com/yaohun/storyline/quest/SkillCastListener.java new file mode 100644 index 0000000..00771f3 --- /dev/null +++ b/src/main/java/com/yaohun/storyline/quest/SkillCastListener.java @@ -0,0 +1,41 @@ +package com.yaohun.storyline.quest; + +import com.yaohun.demonskills.event.SkillCastEvent; +import com.yaohun.storyline.Storyline; +import com.yaohun.storyline.core.Quest; +import com.yaohun.storyline.data.PlayerData; +import com.yaohun.storyline.gui.DialogueGui; +import com.yaohun.storyline.manage.PlayerManager; +import com.yaohun.storyline.manage.QuestManager; +import com.yaohun.storyline.util.QuestType; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +import java.util.ArrayList; +import java.util.List; + +public class SkillCastListener implements Listener { + + @EventHandler + public void onSkillCast(SkillCastEvent e) { + Player player = e.getPlayer(); + String playerName = player.getName(); + + PlayerManager playerManager = Storyline.getPlayerManager(); + PlayerData playerData = playerManager.getPlayerData(playerName); + + if(playerData == null) return; + + // 玩家若已完成所有任务则直接返回 + if(playerData.isAllCompleted()){ + return; + } + /// 获取玩家当前任务 + Quest quest = QuestManager.getQuest(playerData.getCurrentQuest()); + if(quest == null){return;} + if(quest.getQuestType() == QuestType.SKILL_CAST){ + playerData.forcCompleteQuest(quest); + } + } +} diff --git a/src/main/java/com/yaohun/storyline/quest/WarpSendListener.java b/src/main/java/com/yaohun/storyline/quest/WarpSendListener.java new file mode 100644 index 0000000..3a735ab --- /dev/null +++ b/src/main/java/com/yaohun/storyline/quest/WarpSendListener.java @@ -0,0 +1,44 @@ +package com.yaohun.storyline.quest; + +import com.yaohun.storyline.Storyline; +import com.yaohun.storyline.core.Quest; +import com.yaohun.storyline.data.PlayerData; +import com.yaohun.storyline.manage.PlayerManager; +import com.yaohun.storyline.manage.QuestManager; +import com.yaohun.storyline.util.QuestType; +import me.Demon.DemonHunHuanSX.Event.HhXiruEvent; +import me.Demon.DemonWarps.event.SendWarpEvent; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class WarpSendListener implements Listener { + + @EventHandler + public void onHunHuan(SendWarpEvent e){ + Player player = e.getPlayer(); + String playerName = player.getName(); + + PlayerManager playerManager = Storyline.getPlayerManager(); + PlayerData playerData = playerManager.getPlayerData(playerName); + + if(playerData == null) return; + + // 玩家若已完成所有任务则直接返回 + if(playerData.isAllCompleted()){ + return; + } + // 获取玩家当前任务 + Quest quest = QuestManager.getQuest(playerData.getCurrentQuest()); + if(quest == null){return;} + if(quest.getQuestType() == QuestType.WARP_SEND_KEY){ + if(e.getWarpName().contains(quest.getTargetName())){ + playerData.addQuestAmount(quest); + } + } else if(quest.getQuestType() == QuestType.WARP_SEND_WORLD){ + if(e.getWorldName().contains(quest.getTargetName())){ + playerData.addQuestAmount(quest); + } + } + } +} diff --git a/src/main/java/com/yaohun/storyline/quest/WuHunWakeListener.java b/src/main/java/com/yaohun/storyline/quest/WuHunWakeListener.java new file mode 100644 index 0000000..e7a7fe7 --- /dev/null +++ b/src/main/java/com/yaohun/storyline/quest/WuHunWakeListener.java @@ -0,0 +1,40 @@ +package com.yaohun.storyline.quest; + +import com.yaohun.storyline.Storyline; +import com.yaohun.storyline.core.Quest; +import com.yaohun.storyline.data.PlayerData; +import com.yaohun.storyline.manage.PlayerManager; +import com.yaohun.storyline.manage.QuestManager; +import com.yaohun.storyline.util.QuestType; +import me.Demon.WuHunJueXing.Event.WhJueXingEvent; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +import java.util.ArrayList; +import java.util.List; + +public class WuHunWakeListener implements Listener { + + @EventHandler + public void onWake(WhJueXingEvent e){ + Player player = e.getPlayer(); + String playerName = player.getName(); + + PlayerManager playerManager = Storyline.getPlayerManager(); + PlayerData playerData = playerManager.getPlayerData(playerName); + + if(playerData == null) return; + + // 玩家若已完成所有任务则直接返回 + if(playerData.isAllCompleted()){ + return; + } + // 获取玩家当前任务 + Quest quest = QuestManager.getQuest(playerData.getCurrentQuest()); + if(quest == null){return;} + if(quest.getQuestType() == QuestType.WUHUN_WAKE){ + playerData.forcCompleteQuest(quest); + } + } +} diff --git a/src/main/java/com/yaohun/storyline/util/MessageUtil.java b/src/main/java/com/yaohun/storyline/util/MessageUtil.java new file mode 100644 index 0000000..9dc081b --- /dev/null +++ b/src/main/java/com/yaohun/storyline/util/MessageUtil.java @@ -0,0 +1,59 @@ +package com.yaohun.storyline.util; + +import com.yaohun.storyline.Storyline; +import org.bukkit.Bukkit; +import org.bukkit.Sound; +import org.bukkit.command.CommandSender; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; + +import java.io.File; +import java.util.HashMap; + +public class MessageUtil { + + private static HashMap messageMap = new HashMap<>(); + + public static void init(Storyline plugin) { + messageMap.clear(); + File file = new File(plugin.getDataFolder(),"Language.yml"); + // 如果没有这个文件就新建一个~ + if(!file.exists()){ + plugin.saveResource("Language.yml",false); + } + FileConfiguration yml = YamlConfiguration.loadConfiguration(file); + for (String ymlKey : yml.getKeys(false)){ + ConfigurationSection section = yml.getConfigurationSection(ymlKey); + for (String key : section.getKeys(false)){ + String message = section.getString(key); + messageMap.put(key,message.replace("&","§")); + } + } + Bukkit.getConsoleSender().sendMessage("[手礼任务] 已载入语言配置 "+messageMap.size()+" 条"); + } + + public static String getMessage(String key){ + if(messageMap.containsKey(key)){ + return messageMap.get(key); + } + return "§c未找到节点.§7#"+key; + } + + public static void broadcast(String msg) { + Bukkit.getServer().broadcastMessage( msg.replace("&","§")); + } + + public static void sendMessage(CommandSender sender, String message){ + sender.sendMessage(message); + } + + public static void sendMessage(CommandSender sender, String message, Sound sound){ + sender.sendMessage(message); + if(sender instanceof Player){ + Player player = (Player) sender; + player.playSound(player.getLocation(),sound,1,1); + } + } +} diff --git a/src/main/java/com/yaohun/storyline/util/PlaceholderUtil.java b/src/main/java/com/yaohun/storyline/util/PlaceholderUtil.java new file mode 100644 index 0000000..1b2fd3a --- /dev/null +++ b/src/main/java/com/yaohun/storyline/util/PlaceholderUtil.java @@ -0,0 +1,16 @@ +package com.yaohun.storyline.util; + +import me.clip.placeholderapi.PlaceholderAPI; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +public class PlaceholderUtil { + + public static String parsePlaceholders(Player player, String text) { + if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) { + return PlaceholderAPI.setPlaceholders(player, text); + } + return text; + } + +} diff --git a/src/main/java/com/yaohun/storyline/util/QuestShow.java b/src/main/java/com/yaohun/storyline/util/QuestShow.java new file mode 100644 index 0000000..99ea3f8 --- /dev/null +++ b/src/main/java/com/yaohun/storyline/util/QuestShow.java @@ -0,0 +1,29 @@ +package com.yaohun.storyline.util; + +import org.bukkit.command.CommandSender; + +public class QuestShow { + + public static StringBuilder ShowString(int present,int require,int length){ + String color = "§7"; + if(present >= 1){ + color = "§a"; + } + int lost_durability = present * length / require; + StringBuilder builder = new StringBuilder(color); + for (int i = 0; i < lost_durability; i++) { + builder.append('|'); + } + if (lost_durability > 0) { + builder.append("§7"); + } + for (int i = 0; i < length - lost_durability; i++) { + builder.append('|'); + } + return builder; + } + + public static void Show(CommandSender sender, String name, int present, int require){ + sender.sendMessage("§f任务: §e"+name+" §f当前进度: "+ShowString(present,require,15)+" §f[§6"+present+"§f/§6"+require+"§f]"); + } +} diff --git a/src/main/java/com/yaohun/storyline/util/QuestType.java b/src/main/java/com/yaohun/storyline/util/QuestType.java new file mode 100644 index 0000000..6077776 --- /dev/null +++ b/src/main/java/com/yaohun/storyline/util/QuestType.java @@ -0,0 +1,20 @@ +package com.yaohun.storyline.util; + +public enum QuestType { + DUI_HUA_NAME, // 对话任务 检测名字 + DUI_HUA_ID, // 对话任务 检测NPC-ID + KILLS_MM_KEY, // 击杀任务 检测mm key + KILLS_MM_NAME, // 击杀任务 检测mm 名字 + SKILL_CAST, // 技能任务 释放技能 + HUNHUAN_ENROL, // 魂环吸收任务 吸收魂环任务 + FENJIE, // 分解任务 + WUHUN_WAKE, // 武魂觉醒任务 + LEVEL_REWARD_KEY, // 等级礼包领取 + LEVEL_REWARD_VALUE, // 领取指定等级礼包 + PLAYER_LEVEL_UP, // 玩家升级到指定等级任务 + PLAYER_TEAM_EXP, // 玩家需要瓜分多少次组队经验任务 + WARP_SEND_KEY, // 传送到指定坐标任务 + WARP_SEND_WORLD, // 传送到指定世界任务 + CONVER_ITEM, // 在xxx文件中兑换物品 + CONVER_FILE, // 在xxx文件中兑换xx物品任务 +} diff --git a/src/main/resources/Dialogue.yml b/src/main/resources/Dialogue.yml new file mode 100644 index 0000000..badd076 --- /dev/null +++ b/src/main/resources/Dialogue.yml @@ -0,0 +1 @@ +questID: diff --git a/src/main/resources/Language.yml b/src/main/resources/Language.yml new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/Quest.yml b/src/main/resources/Quest.yml new file mode 100644 index 0000000..aed3354 --- /dev/null +++ b/src/main/resources/Quest.yml @@ -0,0 +1,82 @@ +StorylineQuest: + 1: + world: hub,x,y,z + nextQuest: 2 + displayName: §a初到史莱克城 + description: "§f对话目标: §6§l老村长" + introduce: + - §3§l前往史莱克城寻找老村长 + rewards: + - §7- §6面包§7x§f64 + questType: DUI_HUA + target: + name: §6§l老村长 + amount: 1 + finish: + - console:ditem give 面包 64 %player% + 2: + world: hub,x,y,z + nextQuest: 3 + displayName: §6村长的嘱咐 + description: "§f对话目标: §9§l老铁叔" + introduce: + - §3§l前往史莱克城寻找老铁叔 + rewards: + - §7- §6武魂§f·§f咸鱼大宝剑§7x§f1 + questType: DUI_HUA + target: + name: §9§l老铁叔 + amount: 1 + finish: + - console:ditem give 咸鱼大宝剑 1 %player% + 3: + world: hub,x,y,z + nextQuest: 4 + displayName: §6老铁叔的委托 + description: "§f猎杀目标: §8恶狼§f(§a{a}§7/§f{need})" + introduce: + - §3§l前往史莱克城猎杀恶狼 + rewards: + - §7- §6防具§f·§f新人学院头盔§7x§f1 + - §7- §6防具§f·§f新人学院胸甲§7x§f1 + - §7- §6防具§f·§f新人学院护腿§7x§f1 + - §7- §6防具§f·§f新人学院靴子§7x§f1 + questType: KILLS_MM_NAME + target: + name: §8恶狼 + amount: 10 + finish: + - console:ditem give 咸鱼大宝剑 1 %player% + 4: + world: hub,x,y,z + nextQuest: 5 + displayName: §6老铁叔的赠予 + description: "§f对话目标: §9§l老铁叔" + introduce: + - §3§l前往史莱克城寻找老铁叔 + rewards: + - §7- §6防具§f·§f学院项链§7x§f1 + - §7- §6防具§f·§f学院手镯§7x§f1 + - §7- §6防具§f·§f学院戒指§7x§f1 + questType: DUI_HUA + target: + name: §9§l老铁叔 + amount: 1 + finish: + - console:ditem give 咸鱼大宝剑 1 %player% + 5: + world: hub,x,y,z + nextQuest: 6 + displayName: §6器魂的觉醒 + description: "§f对话目标: §d§l素云" + introduce: + - §3§l前往史莱克城寻找老铁叔 + rewards: + - §7- §6器魂§f·§f随机主器魂§7x§f1 + - §7- §9器魂§f·§f随机副器魂§7x§f1 + questType: DUI_HUA + target: + name: §d§l素云 + amount: 1 + finish: + - console:ditem give 咸鱼大宝剑 1 %player% \ No newline at end of file diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml new file mode 100644 index 0000000..82c2708 --- /dev/null +++ b/src/main/resources/config.yml @@ -0,0 +1,89 @@ +DataPath: "plugins/AuData/QuestStoryline" +WorldAlias: + hub: "§6帝国学院" +QuestType: + DUI_HUA: 对话任务 + KILLS_MM_NAME: 狩猎任务 + KILLS_MM_KEY: 狩猎任务 +StorylineQuest: + 1: + location: hub,x,y,z + nextQuest: 2 + displayName: §a初到史莱克城 + description: "§f对话目标: §6§l老村长" + introduce: + - §3§l前往史莱克城寻找老村长 + rewards: + - §7- §6面包§7x§f64 + questType: DUI_HUA + target: + name: §6§l老村长 + amount: 1 + finish: + - console:ditem give 面包 64 %player% + 2: + location: hub,x,y,z + nextQuest: 3 + displayName: §6村长的嘱咐 + description: "§f对话目标: §9§l老铁叔" + introduce: + - §3§l前往史莱克城寻找老铁叔 + rewards: + - §7- §6武魂§f·§f咸鱼大宝剑§7x§f1 + questType: DUI_HUA + target: + name: §9§l老铁叔 + amount: 1 + finish: + - console:ditem give 咸鱼大宝剑 1 %player% + 3: + location: hub,x,y,z + nextQuest: 4 + displayName: §6老铁叔的委托 + description: "§f猎杀目标: §8恶狼§f(§a{a}§7/§f{need})" + introduce: + - §3§l前往史莱克城猎杀恶狼 + rewards: + - §7- §6防具§f·§f新人学院头盔§7x§f1 + - §7- §6防具§f·§f新人学院胸甲§7x§f1 + - §7- §6防具§f·§f新人学院护腿§7x§f1 + - §7- §6防具§f·§f新人学院靴子§7x§f1 + questType: KILLS_MM_NAME + target: + name: §8恶狼 + amount: 10 + finish: + - console:ditem give 咸鱼大宝剑 1 %player% + 4: + location: hub,x,y,z + nextQuest: 5 + displayName: §6老铁叔的赠予 + description: "§f对话目标: §9§l老铁叔" + introduce: + - §3§l前往史莱克城寻找老铁叔 + rewards: + - §7- §6防具§f·§f学院项链§7x§f1 + - §7- §6防具§f·§f学院手镯§7x§f1 + - §7- §6防具§f·§f学院戒指§7x§f1 + questType: DUI_HUA + target: + name: §9§l老铁叔 + amount: 1 + finish: + - console:ditem give 咸鱼大宝剑 1 %player% + 5: + location: hub,x,y,z + nextQuest: 6 + displayName: §6器魂的觉醒 + description: "§f对话目标: §d§l素云" + introduce: + - §3§l前往史莱克城寻找老铁叔 + rewards: + - §7- §6器魂§f·§f随机主器魂§7x§f1 + - §7- §9器魂§f·§f随机副器魂§7x§f1 + questType: DUI_HUA + target: + name: §d§l素云 + amount: 1 + finish: + - console:ditem give 咸鱼大宝剑 1 %player% \ No newline at end of file diff --git a/src/main/resources/playerdata/playerName.yml b/src/main/resources/playerdata/playerName.yml new file mode 100644 index 0000000..be9aa0e --- /dev/null +++ b/src/main/resources/playerdata/playerName.yml @@ -0,0 +1,6 @@ +SaveTime: 2025/05/17 23:14:22 +currentQuest: 1 +quests: + '3': 0 + '2': 0 + '1': 0 \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..4c7f33c --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,13 @@ +name: QuestStoryline +main: com.yaohun.storyline.Storyline +version: 1.4.0 +depend: + - DemonAPI + - MythicMobs +softdepend: + - MultiWorld + - Multiverse-Core +commands: + queststoryline: + aliases: + - quests