commit 9f80419c6a547b6229b927e209eac926d466002e Author: yaohunya <31456652@qq.com> Date: Tue Jul 23 02:54:39 2024 +0800 测试版 diff --git a/.idea/artifacts/DemonShiTu.xml b/.idea/artifacts/DemonShiTu.xml new file mode 100644 index 0000000..18b7ddf --- /dev/null +++ b/.idea/artifacts/DemonShiTu.xml @@ -0,0 +1,8 @@ + + + $PROJECT_DIR$/out/artifacts/DemonShiTu + + + + + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..5903576 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# DemonShiTu +- 玩家之间拜师的系统 +- 师傅可从中获得收益 \ No newline at end of file diff --git a/out/artifacts/DemonShiTu/DemonShiTu.jar b/out/artifacts/DemonShiTu/DemonShiTu.jar new file mode 100644 index 0000000..5c7b0b3 Binary files /dev/null and b/out/artifacts/DemonShiTu/DemonShiTu.jar differ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..a51cf97 --- /dev/null +++ b/pom.xml @@ -0,0 +1,57 @@ + + + 4.0.0 + + org.example + DemonShiTu + 1.0-SNAPSHOT + + + 8 + 8 + + + + + public-rpg + https://repo.aurora-pixels.com/repository/public-rpg/ + + + + + + org.spigotmc + spigot-api + 1.12.2 + + + me.Demon.DemonPlugin + DemonAPI + 1.2.0 + + + com.yaohun.playermanage + PlayerManage + 1.0.1 + + + + me.clip.placeholderapi + PlaceholderAPI + 2.9.2 + + + me.Demon.ItemReference + ItemKuAPI + 1.0.0 + + + me.Demon.DemonLevels + DemonLevels + 1.0.0 + + + + \ No newline at end of file diff --git a/src/main/java/me/Demon/DemonShiTu/Event/DshituEvent.java b/src/main/java/me/Demon/DemonShiTu/Event/DshituEvent.java new file mode 100644 index 0000000..42c8bc1 --- /dev/null +++ b/src/main/java/me/Demon/DemonShiTu/Event/DshituEvent.java @@ -0,0 +1,33 @@ +package me.Demon.DemonShiTu.Event; + +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class DshituEvent extends Event { + + private static HandlerList handlers = new HandlerList(); + private Player player; + private String ShiFuName; + + @Override + public HandlerList getHandlers() { + return handlers; + } + public static HandlerList getHandlerList() { + return handlers; + } + public DshituEvent(Player player, String ShiFuName) { + this.player = player; + this.ShiFuName = ShiFuName; + } + + public Player getPlayer() { + return player; + } + + public String getShiFuName() { + return ShiFuName; + } + +} diff --git a/src/main/java/me/Demon/DemonShiTu/Main.java b/src/main/java/me/Demon/DemonShiTu/Main.java new file mode 100644 index 0000000..9988b7f --- /dev/null +++ b/src/main/java/me/Demon/DemonShiTu/Main.java @@ -0,0 +1,74 @@ +package me.Demon.DemonShiTu; + +import me.Demon.DemonPlugin.DemonAPI; +import me.Demon.DemonShiTu.command.AdminCmd; +import me.Demon.DemonShiTu.command.MainCmd; +import me.Demon.DemonShiTu.guimanager.*; +import me.Demon.DemonShiTu.listener.AttributeLoad; +import me.Demon.DemonShiTu.listener.ChongZhi; +import me.Demon.DemonShiTu.listener.itemUse; +import me.Demon.DemonShiTu.manager.DataManager; +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; + +public class Main extends JavaPlugin { + + public static Main plugin; + public static DataManager dataManager; + + @Override + public void onEnable() { + plugin = this; + DemonAPI.sendConsoleMessage("§f[§6!§f] §aDemonShiTu (2.2.0) §f开始加载"); + dataManager = new DataManager(); + getCommand("st").setExecutor(new MainCmd()); + getCommand("stadmin").setExecutor(new AdminCmd()); + getServer().getPluginManager().registerEvents(new LookDataGui(),this); + getServer().getPluginManager().registerEvents(new TeacherGui(),this); + getServer().getPluginManager().registerEvents(new OnlineTeacherGui(),this); + getServer().getPluginManager().registerEvents(new ThApplyGui(),this); + getServer().getPluginManager().registerEvents(new TudiGui(),this); + + getServer().getPluginManager().registerEvents(new JoinEvent(),this); + + getServer().getPluginManager().registerEvents(new ChongZhi(),this); + getServer().getPluginManager().registerEvents(new AttributeLoad(),this); + getServer().getPluginManager().registerEvents(new itemUse(),this); + if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) { + new ShituExpansion(this).register(); + DemonAPI.sendConsoleMessage("§f[§a!§f] §fPlaceholderAPI §8> §6完成"); + } + DemonAPI.sendConsoleMessage("§f[§6!§f] §aDemonShiTu §f加载完成,祝你使用愉快!"); + DemonAPI.sendConsoleMessage("§f[§6!§f] §b极光像素工作室出品"); + } + + @Override + public void onDisable() { + dataManager.SaveDataManager(); + DemonAPI.sendConsoleMessage("§f[§6!§f] §aDemonShiTu §f卸载完成,欢迎下次使用!"); + } + + @Override + public boolean onCommand(CommandSender sender, Command cmd, String Command, String[] args) { + if (Command.equalsIgnoreCase("stopen") && (sender instanceof Player)) { + //判断玩家是否是师傅 若是 则打开 师傅界面 + String name = sender.getName(); + Player player = (Player) sender; + if (ShiTuAPI.isTeacherExit(name)) { + TeacherGui.OpenGui(player); + } else { + if (dataManager.isPlayerExitTeacher(name)) { + TudiGui.OpenGui(player); + } else { + OnlineTeacherGui.OpenGui(player); + sender.sendMessage("======== §7[§6师徒系统§7] §f========"); + sender.sendMessage("§7/st <玩家名> §6: 让某名玩家成为你的师傅"); + } + } + } + return false; + } +} diff --git a/src/main/java/me/Demon/DemonShiTu/ShiTuAPI.java b/src/main/java/me/Demon/DemonShiTu/ShiTuAPI.java new file mode 100644 index 0000000..32f6f51 --- /dev/null +++ b/src/main/java/me/Demon/DemonShiTu/ShiTuAPI.java @@ -0,0 +1,91 @@ +package me.Demon.DemonShiTu; + +import me.Demon.Compat.VexCompatGui; +import me.Demon.DemonBanK.BankAPI; +import me.Demon.DemonShiTu.data.ShiFuData; +import me.Demon.DemonShiTu.manager.DataManager; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; + +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public abstract class ShiTuAPI { + + + public static void settlementIncome(){ + DataManager dataManager = Main.dataManager; + dataManager.setMonthlyTimeLog(System.currentTimeMillis()); + Bukkit.broadcastMessage("§e§l★ §a师徒激励计划-收益结算"); + for (String sfName : dataManager.getShiFuDataMap().keySet()){ + ShiFuData fuData = dataManager.getTeacherData(sfName); + //获取玩家的收益 + double shouyi = fuData.getEarnings(); + if(shouyi >= 10) { + //获取需要支付给玩家多少软妹币 + int coins = (int) (shouyi * 0.1); + fuData.setEarnings(0); + if(coins >= 100){ + Bukkit.broadcastMessage("§c§l★ §a玩家 §e"+sfName+" §a通过上月激励计划获得 §b"+coins+"软§f(额外奖励20软)"); + coins = coins + 20; + }else{ + Bukkit.broadcastMessage("§c§l★ §a玩家 §e"+sfName+" §a通过上月激励计划获得 §b"+coins+"软"); + } + BankAPI.addCoins(sfName,coins); + } + } + dataManager.SaveDataManager(); + } + + public static void revenueTopList(CommandSender sender){ + DataManager dataManager = Main.dataManager; + HashMap map = new HashMap<>(); + for (String sfName : dataManager.getShiFuDataMap().keySet()) { + ShiFuData fuData = dataManager.getTeacherData(sfName); + double shouyi = fuData.getEarnings(); + map.put(sfName, shouyi); + } + List> list = new ArrayList<>(map.entrySet()); + list.sort((o1, o2) -> o2.getValue().compareTo(o1.getValue())); + sender.sendMessage("§e§l★ §a师徒激励计划-收益排行榜"); + int rank = 1; + for (int i = 0; i < list.size(); i++) { + String sfName = list.get(i).getKey(); + double money = list.get(i).getValue()*0.1; + ShiFuData fuData = dataManager.getTeacherData(sfName); + sender.sendMessage("§a§l★ §7第 §e" + rank + " §7名: §e" + sfName + " §f收益: §6"+new DecimalFormat(",###.##").format(money)+"元 §f徒弟: §e"+fuData.getTudiList().size()+"名"); + ++rank; + } + } + + /* + * 判断这个玩家是否成为师傅 + * */ + public static boolean isTeacherExit(String sfName){ + DataManager dataManager = Main.dataManager; + if(dataManager.getTeacherData(sfName) != null){ + return true; + } + return false; + } + + + public static double getExpDouble(String shifu){ + int top = VexCompatGui.getTop_self(shifu); + if(top <= 1){ + return 50.0; + }else if(top <= 3){ + return 30.0; + }else if(top <= 6){ + return 20.0; + }else if(top <= 10){ + return 10.0; + }else if(top <= 30){ + return 5.0; + } + return 0.0; + } +} diff --git a/src/main/java/me/Demon/DemonShiTu/ShituExpansion.java b/src/main/java/me/Demon/DemonShiTu/ShituExpansion.java new file mode 100644 index 0000000..73e6f0a --- /dev/null +++ b/src/main/java/me/Demon/DemonShiTu/ShituExpansion.java @@ -0,0 +1,57 @@ +package me.Demon.DemonShiTu; + +import me.Demon.DemonShiTu.data.ShiFuData; +import me.Demon.DemonShiTu.manager.DataManager; +import me.clip.placeholderapi.expansion.PlaceholderExpansion; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +public class ShituExpansion extends PlaceholderExpansion { + private Plugin plugin; + + public ShituExpansion(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 "shitu"; + } + + @Override + public String getVersion() { + return plugin.getDescription().getVersion(); + } + + @Override + public String onPlaceholderRequest(Player player, String indentifier) { + DataManager dataManager = Main.dataManager; + if (indentifier.equalsIgnoreCase("shifu")) { + return ""+dataManager.getTeacherName(player.getName()); + }else if (indentifier.equalsIgnoreCase("amount")) { + return ""+dataManager.getApprenticeList(player.getName()).size(); + }else if (indentifier.equalsIgnoreCase("level")) { + if(dataManager.getTeacherData(player.getName()) == null){ + return "0"; + } + ShiFuData shiFuData = dataManager.getTeacherData(player.getName()); + return ""+shiFuData.getLevel(); + } + return ""; + } +} diff --git a/src/main/java/me/Demon/DemonShiTu/command/AdminCmd.java b/src/main/java/me/Demon/DemonShiTu/command/AdminCmd.java new file mode 100644 index 0000000..651b286 --- /dev/null +++ b/src/main/java/me/Demon/DemonShiTu/command/AdminCmd.java @@ -0,0 +1,103 @@ +package me.Demon.DemonShiTu.command; + +import me.Demon.DemonPlugin.DemonAPI; +import me.Demon.DemonShiTu.Main; +import me.Demon.DemonShiTu.ShiTuAPI; +import me.Demon.DemonShiTu.data.ShiFuData; +import me.Demon.DemonShiTu.guimanager.LookDataGui; +import me.Demon.DemonShiTu.manager.DataManager; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.bukkit.entity.HumanEntity; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class AdminCmd implements CommandExecutor , TabCompleter { + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + if (!sender.isOp()) { + return true; + } + if(args.length == 0){ + sender.sendMessage("§r"); + sender.sendMessage("§e------- ======= §6拜师系统 - 管理员 §e======= -------"); + sender.sendMessage("§2/stadmin top §f- §2查看师徒排行"); + sender.sendMessage("§2/stadmin jiesuan §f- §2结算师徒收益"); + sender.sendMessage("§2/stadmin lookall §f- §2查看所有师傅档案"); + sender.sendMessage("§2/stadmin delete §e[玩家名] §f- §2删除师傅档案"); + sender.sendMessage("§2/stadmin kick §e[玩家名] §f- §2将玩家踢出徒弟列表"); + sender.sendMessage("§2/stadmin save §f- §2保存师徒数据"); + sender.sendMessage("§e------- ======= §6拜师系统 - 管理员 §e======= -------"); + sender.sendMessage("§r"); + return true; + } + if(args.length == 1 && args[0].equalsIgnoreCase("save")){ + Main.dataManager.SaveDataManager(); + DemonAPI.sendMessage(sender,"玩家数据已保存."); + return true; + } + if(args.length == 1 && args[0].equalsIgnoreCase("jiesuan")){ + ShiTuAPI.settlementIncome(); + DemonAPI.sendMessage(sender,"已结算上月师徒收益."); + return true; + } + if(args.length == 1 && args[0].equalsIgnoreCase("top")){ + ShiTuAPI.revenueTopList(sender); + return true; + } + if(args.length == 1 && args[0].equalsIgnoreCase("lookall")){ + LookDataGui.OpenGui((Player) sender); + return true; + } + if(args.length == 2 && args[0].equalsIgnoreCase("delete")){ + String sfname = args[1]; + DataManager dataManager = Main.dataManager; + if(!ShiTuAPI.isTeacherExit(sfname)){ + DemonAPI.sendMessage(sender,"玩家 §e"+sfname+" §a并未出师."); + return true; + } + dataManager.removeShiFuData(sfname); + dataManager.SaveDataManager(); + DemonAPI.sendMessage(sender,"玩家 §e"+sfname+" §a的出师档案已清理."); + return true; + } + if(args.length == 2 && args[0].equalsIgnoreCase("kick")){ + String name = args[1]; + DataManager dataManager = Main.dataManager; + if(!dataManager.isPlayerExitTeacher(name)){ + DemonAPI.sendMessage(sender,"玩家 §e"+name+" §a并未拜师."); + return true; + } + String sfName = dataManager.getTeacherName(name); + ShiFuData fuData = dataManager.getTeacherData(sfName); + fuData.removeTudiList(name); // 从师傅的数据中移除该玩家(徒弟)的名字 + fuData.SaveData(); // 保存师傅的数据以反映更改 + DemonAPI.sendMessage(sender,"玩家 §e"+name+" §a已从 §b"+sfName+" §a的徒弟列表脱离."); + return true; + } + return false; + } + + @Override + public List onTabComplete(CommandSender sender, Command command, String label, String[] args) { + List completions = new ArrayList<>(); + if(args.length == 1){ + completions.add("top"); + completions.add("jiesuan"); + completions.add("lookall"); + completions.add("delete"); + completions.add("kick"); + completions.add("save"); + }else if(args.length == 2){ + String[] onlinePlayers = Bukkit.getOnlinePlayers().stream().map(HumanEntity::getName).toArray(String[]::new); + completions.addAll(Arrays.asList(onlinePlayers)); + } + return completions; + } +} diff --git a/src/main/java/me/Demon/DemonShiTu/command/MainCmd.java b/src/main/java/me/Demon/DemonShiTu/command/MainCmd.java new file mode 100644 index 0000000..766579f --- /dev/null +++ b/src/main/java/me/Demon/DemonShiTu/command/MainCmd.java @@ -0,0 +1,75 @@ +package me.Demon.DemonShiTu.command; + +import me.Demon.DemonPlugin.DemonAPI; +import me.Demon.DemonShiTu.Event.DshituEvent; +import me.Demon.DemonShiTu.Main; +import me.Demon.DemonShiTu.ShiTuAPI; +import me.Demon.DemonShiTu.guimanager.OnlineTeacherGui; +import me.Demon.DemonShiTu.manager.DataManager; +import org.bukkit.Bukkit; +import org.bukkit.Sound; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.List; + +public class MainCmd implements CommandExecutor { + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + if(!(sender instanceof Player)){return true;} + Player p = (Player) sender; + if(args.length == 0){ + sender.sendMessage("§r"); + sender.sendMessage("§e------- ======= §6斗魂学院等级系统 §e======= -------"); + sender.sendMessage("§2/st open §f- §2查看在线师傅名单"); + sender.sendMessage("§2/st §e[师傅名] §f- §2向其他玩家拜师"); + sender.sendMessage("§e------- ======= §6斗魂学院等级系统 §e======= -------"); + sender.sendMessage("§r"); + return true; + } + if(args.length == 1 && args[0].equalsIgnoreCase("open")){ + OnlineTeacherGui.OpenGui(p); + return true; + }else{ + String name = p.getName(); + String sfName = args[0]; + long joinTime = p.getFirstPlayed();// 获取玩家加入服务器的时间 + // 计算玩家已加入服务器超过多少天 (当前时间 - 加入时间) + int joinDay = (int) ((System.currentTimeMillis() - joinTime) / 1000 / (24*60*60)); + // 超过天数的阈值 + int maxJoinDays = 15; + if(joinDay >= maxJoinDays){ + DemonAPI.sendMessage(p,"非常抱歉,你已经加入服务器§e<"+maxJoinDays+"天>§a已经不能拜师了.", Sound.ENTITY_VILLAGER_NO); + return true; + } + // 判断玩家是否已经出师 + if(ShiTuAPI.isTeacherExit(name)){ + DemonAPI.sendMessage(p,"非常抱歉,你已 §e出师 §a无法成为其他人的徒弟.", Sound.ENTITY_VILLAGER_NO); + return true; + } + DataManager dataManager = Main.dataManager; + // 判断玩家是否已经拜师 + if(dataManager.isPlayerExitTeacher(name)){ + DemonAPI.sendMessage(p,"非常抱歉,每名玩家只能拜一位师傅.", Sound.ENTITY_VILLAGER_NO); + return true; + } + List applicationList = dataManager.getApplyForList(sfName);// 获取申请列表 + if(applicationList.contains(name)){ + DemonAPI.sendMessage(p,"你已经发送过拜师请求,请耐心等待对方同意。", Sound.ENTITY_VILLAGER_NO); + return true; + } + applicationList.add(name);// 将玩家加入申请列表 + dataManager.setApplyForList(sfName,applicationList); // 刷新申请列表 + DemonAPI.sendMessage(p,"成功发送拜师请求,请耐心等待对方同意。",Sound.ENTITY_EXPERIENCE_ORB_PICKUP); + Player sfPlayer = Bukkit.getPlayer(sfName); + if(sfPlayer != null){ + DemonAPI.sendMessage(sfPlayer,"您新收到有一条拜师请求等待处理.",Sound.ENTITY_VILLAGER_YES); + } + DshituEvent event = new DshituEvent(p,sfName); + Bukkit.getPluginManager().callEvent(event); + } + return false; + } +} diff --git a/src/main/java/me/Demon/DemonShiTu/data/ShiFuData.java b/src/main/java/me/Demon/DemonShiTu/data/ShiFuData.java new file mode 100644 index 0000000..bedfe52 --- /dev/null +++ b/src/main/java/me/Demon/DemonShiTu/data/ShiFuData.java @@ -0,0 +1,99 @@ +package me.Demon.DemonShiTu.data; + +import me.Demon.DemonShiTu.Main; +import org.bukkit.configuration.file.FileConfiguration; + +import java.util.List; + +public class ShiFuData { + + private String name; // 师傅名 + private int level; // 师傅等级 + private double earnings; // 徒弟收益 + private List tudiList; // 徒弟列表 + private long loginTime; + + public ShiFuData(String name, int level, double earnings, List apprenticeList, long loginTime){ + this.name = name; + this.level = level; + this.earnings = earnings; + this.tudiList = apprenticeList; + this.loginTime = loginTime; + } + + public void SaveData(){ + FileConfiguration yml = Main.plugin.getConfig(); + yml.set("ShiTuData."+name,null); + yml.set("ShiTuData."+name+".level",level); + yml.set("ShiTuData."+name+".shouyi",earnings); + yml.set("ShiTuData."+name+".loginTime",loginTime); + yml.set("ShiTuData."+name+".tudi",tudiList); + Main.plugin.saveConfig(); + } + + public int getLevel() { + return level; + } + + public String getName() { + return name; + } + + public double getEarnings() { + return earnings; + } + + public void setEarnings(double earnings) { + this.earnings = earnings; + } + + public void addEarnings(double earnings){ + this.earnings += earnings; + } + + public long getLoginTime() { + return loginTime; + } + + public boolean isLoginOvertime(){ + // 最后一次记录时间距离现在时间超过15天 返回true + // 获取当前时间的时间戳 + long currentTime = System.currentTimeMillis(); + // 7天的毫秒数 + long fifteenDaysInMillis = 15L * 24 * 60 * 60 * 1000; + // 检查上次登录时间是否超过15天 + return (currentTime - this.loginTime) > fifteenDaysInMillis; + } + + public void setLoginTime(long loginTime) { + this.loginTime = loginTime; + } + + public List getTudiList() { + return tudiList; + } + public boolean isTudiListExit(String tudiName){ + if(getTudiList().contains(tudiName)){ + return true; + } + return false; + } + public void addTudiList(String tudiName){ + if(!isTudiListExit(tudiName)) { + List stringList = getTudiList(); + stringList.add(tudiName); + setTudiList(stringList); + } + } + public void removeTudiList(String tudiName){ + if(isTudiListExit(tudiName)) { + List stringList = getTudiList(); + stringList.remove(tudiName); + setTudiList(stringList); + } + } + + public void setTudiList(List tudiList) { + this.tudiList = tudiList; + } +} diff --git a/src/main/java/me/Demon/DemonShiTu/guimanager/JoinEvent.java b/src/main/java/me/Demon/DemonShiTu/guimanager/JoinEvent.java new file mode 100644 index 0000000..f9e7bf1 --- /dev/null +++ b/src/main/java/me/Demon/DemonShiTu/guimanager/JoinEvent.java @@ -0,0 +1,23 @@ +package me.Demon.DemonShiTu.guimanager; + +import me.Demon.DemonShiTu.Main; +import me.Demon.DemonShiTu.ShiTuAPI; +import me.Demon.DemonShiTu.data.ShiFuData; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; + +public class JoinEvent implements Listener { + + @EventHandler + public void onJoin(PlayerJoinEvent e){ + Player p = e.getPlayer(); + String sfName = p.getName(); + // 判断玩家是否是师傅 + if(ShiTuAPI.isTeacherExit(sfName)){ + ShiFuData fuData = Main.dataManager.getTeacherData(sfName); + fuData.setLoginTime(System.currentTimeMillis()); + } + } +} diff --git a/src/main/java/me/Demon/DemonShiTu/guimanager/LookDataGui.java b/src/main/java/me/Demon/DemonShiTu/guimanager/LookDataGui.java new file mode 100644 index 0000000..469152d --- /dev/null +++ b/src/main/java/me/Demon/DemonShiTu/guimanager/LookDataGui.java @@ -0,0 +1,77 @@ +package me.Demon.DemonShiTu.guimanager; + +import me.Demon.Compat.VexCompatGui; +import me.Demon.DemonLevels.api.DLevelAPI; +import me.Demon.DemonOnlineTime.DtimeAPI; +import me.Demon.DemonPlugin.DemonAPI; +import me.Demon.DemonShiTu.Main; +import me.Demon.DemonShiTu.ShiTuAPI; +import me.Demon.DemonShiTu.data.ShiFuData; +import me.Demon.DemonShiTu.manager.DataManager; +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 LookDataGui implements Listener { + + public static String invTitle = "师徒系统 - 查看所有师傅数据"; + + @EventHandler + public void onClick(InventoryClickEvent e){ + Player p = (Player) e.getWhoClicked(); + Inventory inv = e.getInventory(); + int rawSlot = e.getRawSlot(); + ItemStack item = e.getCurrentItem(); + if(inv != null && inv.getTitle().equalsIgnoreCase(invTitle)){ + e.setCancelled(true); + } + } + + public static void OpenGui(Player player){ + Inventory inv = Bukkit.createInventory(null,54,invTitle); + for (int i = 0; i < 9; i++) { + inv.setItem(i, DemonAPI.glass(15,"§a§l↓↓§6已出师的玩家列表§a§l↓↓")); + } + DataManager dataManager = Main.dataManager; + for (String sfName : dataManager.getShiFuDataMap().keySet()){ + ShiFuData shiFuData = dataManager.getTeacherData(sfName); + inv.addItem(ShiFuSkull(shiFuData)); + } + for (int i = 45; i < 54; i++) { + inv.setItem(i, DemonAPI.glass(15,"§a§l↑↑§6已出师的玩家列表§a§l↑↑")); + } + player.openInventory(inv); + } + + public static ItemStack ShiFuSkull(ShiFuData fuData){ + String sfName = fuData.getName(); + ItemStack item = new ItemStack(Material.BOOK); + ItemMeta meta = item.getItemMeta(); + meta.setDisplayName("§b§l★§7名称: §6§l"+fuData.getName()); + List lore = new ArrayList<>(); + int levels = (int) DLevelAPI.getOffPlayer_Level(sfName); + lore.add("§a§l★§7级别: §dLv."+ levels); + int time = DtimeAPI.getTime(sfName); + lore.add("§a§l★§7今日活跃: §a"+ time+"分钟"); + lore.add("§a§l★§7本月收益: §6" + String.format("%.1f",fuData.getEarnings()) + "师徒币"); + lore.add("§a§l★§7收徒数量: §e" + fuData.getTudiList().size() + "名"); + int top = VexCompatGui.getTop_self(sfName); + lore.add("§a§l★§7战力排行: §b" + top + "名"); + lore.add("§a§l★§7经验加成: §d"+ShiTuAPI.getExpDouble(sfName)+"%"); + lore.add("§a§l★§7最后一次上线: §c"+DemonAPI.LongToStringData(fuData.getLoginTime(),"yyyy年MM月dd日 HH:mm")); + lore.add(" "); + lore.add("§9§l★ §6SHIFT+左键 §7点击结算他的收益"); + meta.setLore(lore); + item.setItemMeta(meta); + return item; + } +} diff --git a/src/main/java/me/Demon/DemonShiTu/guimanager/OnlineTeacherGui.java b/src/main/java/me/Demon/DemonShiTu/guimanager/OnlineTeacherGui.java new file mode 100644 index 0000000..3bb9f63 --- /dev/null +++ b/src/main/java/me/Demon/DemonShiTu/guimanager/OnlineTeacherGui.java @@ -0,0 +1,131 @@ +package me.Demon.DemonShiTu.guimanager; + +import me.Demon.Compat.VexCompatGui; +import me.Demon.DemonLevels.api.DLevelAPI; +import me.Demon.DemonOnlineTime.DtimeAPI; +import me.Demon.DemonPlugin.DemonAPI; +import me.Demon.DemonShiTu.Event.DshituEvent; +import me.Demon.DemonShiTu.Main; +import me.Demon.DemonShiTu.ShiTuAPI; +import me.Demon.DemonShiTu.data.ShiFuData; +import me.Demon.DemonShiTu.manager.DataManager; +import me.Demon.DemonShiTu.util.StackLibrary; +import net.minecraft.server.v1_12_R1.NBTTagCompound; +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.ClickType; +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 OnlineTeacherGui implements Listener { + + public static String invTitle = "师徒系统 - 活跃的大师(在线的则会显示)"; + + @EventHandler + public void onClick(InventoryClickEvent e){ + Player p = (Player) e.getWhoClicked(); + String name = p.getName(); + Inventory inv = e.getInventory(); + int rawSlot = e.getRawSlot(); + ItemStack item = e.getCurrentItem(); + if(inv != null && inv.getTitle().equalsIgnoreCase(invTitle)){ + e.setCancelled(true); + if(!DemonAPI.itemIsNull(item) && !DemonAPI.itemIsLore(item)) { + if (rawSlot >= 9 && rawSlot < inv.getSize() - 9) { + if (e.getClick() != ClickType.SHIFT_LEFT) { + DemonAPI.sendMessage(p, "请按下 §eSHIFT+左键 §a进行拜师.", Sound.ENTITY_VILLAGER_NO); + return; + } + p.closeInventory(); + long joinTime = p.getFirstPlayed();// 获取玩家加入服务器的时间 + // 计算玩家已加入服务器超过多少天 (当前时间 - 加入时间) + int joinDay = (int) ((System.currentTimeMillis() - joinTime) / 1000 / (24 * 60 * 60)); + // 超过天数的阈值 + int maxJoinDays = 15; + if (joinDay >= maxJoinDays) { + DemonAPI.sendMessage(p, "非常抱歉,你已经加入服务器§e<" + maxJoinDays + "天>§a已经不能拜师了.", Sound.ENTITY_VILLAGER_NO); + return; + } + // 判断玩家是否已经出师 + if (ShiTuAPI.isTeacherExit(name)) { + DemonAPI.sendMessage(p, "非常抱歉,你已 §e出师 §a无法成为其他人的徒弟.", Sound.ENTITY_VILLAGER_NO); + return; + } + DataManager dataManager = Main.dataManager; + // 判断玩家是否已经拜师 + if (dataManager.isPlayerExitTeacher(name)) { + DemonAPI.sendMessage(p, "非常抱歉,每名玩家只能拜一位师傅.", Sound.ENTITY_VILLAGER_NO); + return; + } + NBTTagCompound nbt = StackLibrary.getNBT(item); + if (nbt.hasKey("sfName")) { + String sfName = nbt.getString("sfName"); + List applicationList = dataManager.getApplyForList(sfName);// 获取申请列表 + if (applicationList.contains(name)) { + DemonAPI.sendMessage(p, "你已经发送过拜师请求,请耐心等待对方同意。", Sound.ENTITY_VILLAGER_NO); + return; + } + applicationList.add(name);// 将玩家加入申请列表 + dataManager.setApplyForList(sfName, applicationList); // 刷新申请列表 + DemonAPI.sendMessage(p, "成功发送拜师请求,请耐心等待对方同意。", Sound.ENTITY_EXPERIENCE_ORB_PICKUP); + Player sfPlayer = Bukkit.getPlayer(sfName); + if (sfPlayer != null) { + DemonAPI.sendMessage(sfPlayer, "您新收到有一条拜师请求等待处理.", Sound.ENTITY_VILLAGER_YES); + } + DshituEvent event = new DshituEvent(p, sfName); + Bukkit.getPluginManager().callEvent(event); + } + } + } + } + } + + public static void OpenGui(Player player){ + Inventory inv = Bukkit.createInventory(null,54,invTitle); + DataManager dataManager = Main.dataManager; + for (String sfName : dataManager.getShiFuDataMap().keySet()){ + Player sfPlayer = Bukkit.getPlayer(sfName); + if(sfPlayer != null) { + ShiFuData shiFuData = dataManager.getTeacherData(sfName); + inv.addItem(ShiFuSkull(shiFuData)); + } + } + for (int i = 0; i < 9; i++) {inv.setItem(i, DemonAPI.glass(15,"§a§l↓↓§6已出师的玩家列表§a§l↓↓"));} + for (int i = 45; i < 54; i++) {inv.setItem(i, DemonAPI.glass(15,"§a§l↑↑§c当日在线60分钟才会显示§a§l↑↑"));} + inv.setItem(4,StackLibrary.tudiInfoShow()); + player.openInventory(inv); + } + + public static ItemStack ShiFuSkull(ShiFuData fuData){ + String sfName = fuData.getName(); + ItemStack item = new ItemStack(Material.BOOK); + ItemMeta meta = item.getItemMeta(); + meta.setDisplayName("§b§l★§7名称: §6§l"+sfName); + List lore = new ArrayList<>(); + int levels = (int) DLevelAPI.getOffPlayer_Level(sfName); + lore.add("§a§l★§7级别: §dLv."+ levels); + int time = DtimeAPI.getTime(sfName); + lore.add("§a§l★§7今日活跃: §a"+ time+"分钟"); + lore.add("§a§l★§7收徒数量: §e" + fuData.getTudiList().size() + "名"); + int top = VexCompatGui.getTop_self(sfName); + lore.add("§a§l★§7战力排行: §b" + top + "名"); + lore.add("§a§l★§7经验加成: §d"+ShiTuAPI.getExpDouble(sfName)+"%"); + lore.add("§a§l★§7最后一次上线: §c"+DemonAPI.LongToStringData(fuData.getLoginTime(),"yyyy年MM月dd日 HH:mm")); + lore.add(" "); + lore.add("§9§l★ §6SHIFT+左键 §7点击拜他为师"); + meta.setLore(lore); + item.setItemMeta(meta); + NBTTagCompound nbt = StackLibrary.getNBT(item); + nbt.setString("sfName",sfName); + return StackLibrary.setNBT(item,nbt); + } +} diff --git a/src/main/java/me/Demon/DemonShiTu/guimanager/TeacherGui.java b/src/main/java/me/Demon/DemonShiTu/guimanager/TeacherGui.java new file mode 100644 index 0000000..baec928 --- /dev/null +++ b/src/main/java/me/Demon/DemonShiTu/guimanager/TeacherGui.java @@ -0,0 +1,275 @@ +package me.Demon.DemonShiTu.guimanager; + +import com.yaohun.aurechargedata.api.RechargeAPI; +import com.yaohun.aurechargedata.util.TimeType; +import me.Demon.DemonLevels.api.DLevelAPI; +import me.Demon.DemonMonethyCard.api.CardAPI; +import me.Demon.DemonOnlineTime.DtimeAPI; +import me.Demon.DemonPlugin.DemonAPI; +import me.Demon.DemonShiTu.Main; +import me.Demon.DemonShiTu.ShiTuAPI; +import me.Demon.DemonShiTu.data.ShiFuData; +import me.Demon.DemonShiTu.manager.DataManager; +import me.Demon.DemonShiTu.util.StackLibrary; +import net.minecraft.server.v1_12_R1.NBTTagCompound; +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.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.time.DayOfWeek; +import java.time.Instant; +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +public class TeacherGui implements Listener { + + public static String invTitle = "师徒系统 - 管理系统"; + + @EventHandler + public void onClick(InventoryClickEvent e){ + Player player = (Player) e.getWhoClicked(); + String sfName = player.getName(); + Inventory inv = e.getInventory(); + int rawSlot = e.getRawSlot(); + ItemStack item = e.getCurrentItem(); + if(inv != null && inv.getTitle().equalsIgnoreCase(invTitle)){ + e.setCancelled(true); + DataManager dataManager = Main.dataManager; + if(e.getRawSlot() == 5){ + // 获取徒弟列表 + ShiFuData fuData = dataManager.getTeacherData(sfName); + List tudiList = fuData.getTudiList(); + if(tudiList.size() < 1) { + DemonAPI.sendMessage(player,"你还没有收徒喔,无法获得任何收益。",Sound.ENTITY_VILLAGER_NO); + return; + } + int time = DtimeAPI.getTime(sfName); + if(time < 60) { + DemonAPI.sendMessage(player,"需要在线达到<§e§l60分钟§a>才能领取收益。",Sound.ENTITY_VILLAGER_NO); + return; + } + int sfLevel = fuData.getLevel(); // 获取师傅的等级 + double defaultBonus = 5; // 默认奖金 + // 根据师傅的等级设置奖金 + if (sfLevel == 2) { + defaultBonus = 10; + } else if (sfLevel == 3) { + defaultBonus = 15; + } else if (sfLevel == 4) { + defaultBonus = 20; + } else if (sfLevel >= 5) { + defaultBonus = 30; + } + int needTime = 180; // 活跃所需在线时间(分钟) + double addMoney = 0; // 粉丝收益(元) + // 遍历徒弟名单 + for (String name : tudiList) { + if (!dataManager.isActiveReward(name)) { // 检查徒弟是否已领取活跃奖励 + int onlineTime = DtimeAPI.getTime(name); // 获取徒弟的在线时间 + + // 如果徒弟在线时间达到要求 + if (onlineTime >= needTime) { + List activeRewardList = dataManager.getActiveReward(); // 获取活跃奖励名单 + activeRewardList.add(name); // 将徒弟添加到活跃奖励名单中 + dataManager.setActiveReward(activeRewardList); // 更新活跃奖励名单 + addMoney += defaultBonus; // 累计奖金 + } + } + } + // 如果累计奖金不足 1 元 + if (addMoney < 1) { + DemonAPI.sendMessage(player, "暂时还没有任何徒弟活跃收益可领取...等等再来吧...", Sound.ENTITY_VILLAGER_NO); + return; + } + // 获取当前日期的星期 + DayOfWeek currentDayOfWeek = LocalDate.now().getDayOfWeek(); + // 如果今天是周一至周五,奖金提高30% + if (currentDayOfWeek != DayOfWeek.SATURDAY && currentDayOfWeek != DayOfWeek.SUNDAY) { + addMoney *= 1.3; + } + //判断玩家是否是月卡用户 并且还有时间 + String yueka_text = ""; + if(CardAPI.isCardHaoHua(sfName)){ + addMoney *= 1.2; + yueka_text = "§7(§e豪华月卡§7) "; + }else if(CardAPI.isCardJingDian(sfName)){ + addMoney *= 1.1; + yueka_text = "§7(§b经典月卡§7) "; + } + // 获取这个师傅上面是否还有师傅 + if(!dataManager.isPlayerExitTeacher(sfName)){ + fuData.addEarnings(addMoney); + fuData.SaveData(); + DemonAPI.sendMessage(player,"成功领取徒弟活跃收益: §6"+addMoney+"师徒币"+yueka_text,Sound.ENTITY_EXPERIENCE_ORB_PICKUP); + System.out.println("[师徒] 活跃激励 玩家 <" + sfName + ">获得" + addMoney + "师徒币奖励"); + }else{ + double newMoney = (addMoney / 2); + fuData.addEarnings(newMoney); + fuData.SaveData(); + DemonAPI.sendMessage(player,"成功领取徒弟活跃收益: §6"+newMoney+"师徒币"+yueka_text,Sound.ENTITY_EXPERIENCE_ORB_PICKUP); + String sfNameB = dataManager.getTeacherName(sfName); + ShiFuData fuDataB = dataManager.getTeacherData(sfNameB); + fuDataB.addEarnings(newMoney); + fuDataB.SaveData(); + Player shifuBPlayer = Bukkit.getPlayer(fuDataB.getName()); + if(shifuBPlayer != null){ + DemonAPI.sendMessage(shifuBPlayer,"获得徒弟的活在线跃激励收益: §6"+newMoney+"师徒币",Sound.ENTITY_EXPERIENCE_ORB_PICKUP); + } + System.out.println("[师徒] 活跃激励 玩家<" + sfName + ">和<"+sfNameB+">各获得" + newMoney + "师徒币奖励"); + } + TeacherGui.OpenGui(player); + } + if(rawSlot == 7){ + ThApplyGui.OpenGui(player); + player.playSound(player.getLocation(), Sound.BLOCK_COMPARATOR_CLICK,1.6F,1.8F); + } + if(rawSlot >= 18 && rawSlot < inv.getSize()){ + if(DemonAPI.itemIsNull(item)){return;} + NBTTagCompound nbt = StackLibrary.getNBT(item); + if(nbt.hasKey("tdName")){ + String name = nbt.getString("tdName"); + // 根据师傅的名字从数据管理器中获取师傅的数据 + ShiFuData fuData = dataManager.getTeacherData(sfName); + // 从师傅的数据中移除该玩家(徒弟)的名字 + fuData.removeTudiList(name); + // 保存师傅的数据以反映更改 + fuData.SaveData(); + Player tDPlayer = Bukkit.getPlayer(name); + if (tDPlayer != null) { + DemonAPI.sendMessage(tDPlayer,"您的师傅 §e" + name + " §a已与你解除师徒关系。",Sound.ENTITY_EXPERIENCE_ORB_PICKUP); + } + DemonAPI.sendMessage(player,"成功与 §e" + name + " §a解除师徒关系。",Sound.ENTITY_EXPERIENCE_ORB_PICKUP); + TeacherGui.OpenGui(player); + } + } + } + } + + public static void OpenGui(Player player){ + Inventory inv = Bukkit.createInventory(null,54,invTitle); + for (int i = 0; i < 9; i++) { + int data = (int) (Math.random() * 6); + inv.setItem(i, DemonAPI.glass(data,"§r ")); + } + for (int i = 9; i < 18; i++) { + inv.setItem(i, DemonAPI.glass(15,"§a§l↓↓§6徒弟列表§a§l↓↓")); + } + DataManager dataManager = Main.dataManager; + ShiFuData shiFuData = dataManager.getTeacherData(player.getName()); + inv.setItem(1,StackLibrary.teacherInfoShow()); + inv.setItem(3,personalInformation(shiFuData)); + inv.setItem(5,earningsRefresh()); + inv.setItem(7,requestProcessing()); + List tuDiList = shiFuData.getTudiList(); + for (String name : tuDiList){ + inv.addItem(apprenticeInformation(name)); + } + long monthlyTimeLog = dataManager.getMonthlyTimeLog(); + // 检查当前时间是否已经是次月并且超过中午12点 + if (isNextMonth(monthlyTimeLog) && isAfterNoon()) { + ShiTuAPI.settlementIncome(); + System.out.println("[调试 - 师徒] 已自动结算每月师徒收益"); + dataManager.setMonthlyTimeLog(System.currentTimeMillis()); + } + long everydayTimeLog = dataManager.getEverydayTimeLog(); + if(!isSameDay(everydayTimeLog,System.currentTimeMillis())){ + System.out.println("[调试 - 师徒] 已清理每日活跃激励奖名单"); + dataManager.setActiveReward(new ArrayList<>()); + dataManager.setEverydayTimeLog(System.currentTimeMillis()); + } + player.openInventory(inv); + } + + private static boolean isSameDay(long timestamp1, long timestamp2) { + LocalDate date1 = Instant.ofEpochMilli(timestamp1).atZone(ZoneId.systemDefault()).toLocalDate(); + LocalDate date2 = Instant.ofEpochMilli(timestamp2).atZone(ZoneId.systemDefault()).toLocalDate(); + return date1.equals(date2); + } + + private static boolean isNextMonth(long lastTimeLog) { + Calendar lastCalendar = Calendar.getInstance(); + lastCalendar.setTimeInMillis(lastTimeLog); + int lastMonth = lastCalendar.get(Calendar.MONTH); + int currentMonth = Calendar.getInstance().get(Calendar.MONTH); + return currentMonth != lastMonth; + } + + private static boolean isAfterNoon() { + Calendar calendar = Calendar.getInstance(); + int hour = calendar.get(Calendar.HOUR_OF_DAY); + return hour >= 12; + } + + public static ItemStack personalInformation(ShiFuData fuData){ + ItemStack item = new ItemStack(449, 1); + ItemMeta meta = item.getItemMeta(); + meta.setDisplayName("§e§l个人收益查看"); + List lore = new ArrayList<>(); + lore.add("§a§l★§7名称: §6§l"+ fuData.getName()); + lore.add("§a§l★§7级别: §6§lLv."+ fuData.getLevel()); + lore.add("§a§l★§7徒弟: §6§l"+ fuData.getTudiList().size() +"名"); + lore.add("§a§l★§7收益: §6§l"+ String.format("%.1f",fuData.getEarnings()) +"师徒币"); + lore.add("§a§l★§7最后一次上线: §c"+DemonAPI.LongToStringData(fuData.getLoginTime(),"yyyy年MM月dd日 HH:mm")); + meta.setLore(lore); + item.setItemMeta(meta); + return item; + } + + public static ItemStack apprenticeInformation(String name){ + ItemStack item = new ItemStack(Material.BOOK); + ItemMeta meta = item.getItemMeta(); + meta.setDisplayName("§a§l★§7名称: §6§l"+name); + List lore = new ArrayList<>(); + int levels = (int) DLevelAPI.getOffPlayer_Level(name); + lore.add("§a§l★§7级别: §dLv."+ levels); + int time = DtimeAPI.getTime(name); + lore.add("§a§l★§7今日活跃: §a"+ time+"分钟"); + if(ShiTuAPI.isTeacherExit(name)) { + ShiFuData fuDataB = Main.dataManager.getTeacherData(name); + lore.add("§a§l★§7收徒数量: §e" + fuDataB.getTudiList().size() + "名"); + }else{ + lore.add("§a§l★§7收徒数量: §e尚未出师"); + } + int rechargeMonth = RechargeAPI.getRechargeData(name, TimeType.MONTHLY); + lore.add("§a§l★§7本月充值: §b" + rechargeMonth + "软妹币"); + lore.add(" "); + lore.add("§e§l★§7点击解除师徒关系"); + meta.setLore(lore); + item.setItemMeta(meta); + NBTTagCompound nbti = StackLibrary.getNBT(item); + nbti.setString("tdName",name); + return StackLibrary.setNBT(item, nbti); + } + + public static ItemStack earningsRefresh(){ + ItemStack item = new ItemStack(347, 1); + ItemMeta meta = item.getItemMeta(); + meta.setDisplayName("§7[§6活跃§7] §a徒弟活跃收益"); + List Lore = new ArrayList<>(); + Lore.add("§7§l★§7点击刷新收益"); + meta.setLore(Lore); + item.setItemMeta(meta); + return item; + } + + public static ItemStack requestProcessing(){ + ItemStack item = new ItemStack(421); + ItemMeta meta = item.getItemMeta(); + meta.setDisplayName("§8« §e处理拜师请求 §8»"); + List lore = new ArrayList<>(); + lore.add("§a§l★ §7点击进行处理 §a§l★"); + meta.setLore(lore); + item.setItemMeta(meta); + return item; + } +} diff --git a/src/main/java/me/Demon/DemonShiTu/guimanager/ThApplyGui.java b/src/main/java/me/Demon/DemonShiTu/guimanager/ThApplyGui.java new file mode 100644 index 0000000..545acbd --- /dev/null +++ b/src/main/java/me/Demon/DemonShiTu/guimanager/ThApplyGui.java @@ -0,0 +1,140 @@ +package me.Demon.DemonShiTu.guimanager; + +import com.yaohun.aurechargedata.api.RechargeAPI; +import com.yaohun.aurechargedata.util.TimeType; +import me.Demon.DemonLevels.api.DLevelAPI; +import me.Demon.DemonOnlineTime.DtimeAPI; +import me.Demon.DemonPlugin.DemonAPI; +import me.Demon.DemonShiTu.Main; +import me.Demon.DemonShiTu.ShiTuAPI; +import me.Demon.DemonShiTu.data.ShiFuData; +import me.Demon.DemonShiTu.manager.DataManager; +import me.Demon.DemonShiTu.util.StackLibrary; +import net.minecraft.server.v1_12_R1.NBTTagCompound; +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.ClickType; +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 ThApplyGui implements Listener { + + public static String invTitle = "师徒系统 - 处理拜师申请"; + + @EventHandler + public void onClick(InventoryClickEvent e){ + Player p = (Player) e.getWhoClicked(); + String sfName = p.getName(); + Inventory inv = e.getInventory(); + int rawSlot = e.getRawSlot(); + ItemStack item = e.getCurrentItem(); + if(inv != null && inv.getTitle().equalsIgnoreCase(invTitle)){ + e.setCancelled(true); + if(!DemonAPI.itemIsNull(item) && !DemonAPI.itemIsLore(item)){ + if (e.getRawSlot() == 31) { + TeacherGui.OpenGui(p); + p.playSound(p.getLocation(), Sound.BLOCK_COMPARATOR_CLICK,1.6F,1.8F); + } + if(rawSlot >= 0 && rawSlot < 27) { + DataManager dataManager = Main.dataManager; + if(!ShiTuAPI.isTeacherExit(sfName)){ + DemonAPI.sendMessage(p,"你需要出师后才能进行操作.",Sound.ENTITY_VILLAGER_NO); + return; + } + ShiFuData fuData = dataManager.getTeacherData(sfName); + NBTTagCompound nbt = StackLibrary.getNBT(item); + if (nbt.hasKey("ApplyName")) { + String name = nbt.getString("ApplyName"); + // 获取申请名单 并清理这个玩家 刷新申请列表 + List applyList = dataManager.getApplyForList(sfName); + applyList.remove(name); + dataManager.setApplyForList(sfName,applyList); + if(e.getClick() == ClickType.LEFT){ + int tudiLimitAmount = 18; + if(fuData.getTudiList().size() >= tudiLimitAmount){ + DemonAPI.sendMessage(p,"您当前最多可收<§e§l"+tudiLimitAmount+"名§a>徒弟.",Sound.ENTITY_VILLAGER_NO); + return; + } + // 检测玩家是否已拜师 + if(dataManager.isPlayerExitTeacher(name)){ + DemonAPI.sendMessage(p,"下手慢了 §e"+name+" §a已经拜其他人为师了.",Sound.ENTITY_VILLAGER_NO); + return; + } + fuData.addTudiList(name); // 将玩家列入徒弟列表 + Player player = Bukkit.getPlayer(name); + if (player != null) { + DemonAPI.sendMessage(player,"§6"+sfName+" §a已同意你的拜师请求."); + player.sendTitle("§a拜师成功!","§b您的师傅: §f"+sfName); + } + DemonAPI.sendMessage(p,"玩家 §e"+name+" §a已成为你的徒弟."); + }else if(e.getClick() == ClickType.RIGHT){ + Player player = Bukkit.getPlayer(name); + if (player != null) { + DemonAPI.sendMessage(player,"§6"+sfName+" §a拒绝了你的拜师请求."); + } + DemonAPI.sendMessage(p,"已婉拒 §e"+name+" §a成为你的徒弟."); + } + ThApplyGui.OpenGui(p); + } + } + } + } + } + + public static void OpenGui(Player player){ + String sfName = player.getName(); + // 检测玩家是否已成为师傅 + if(!ShiTuAPI.isTeacherExit(sfName)){ + DemonAPI.sendMessage(player,"你需要 §e出师 §a后才能查看."); + return; + } + DataManager dataManager = Main.dataManager; + Inventory inv = Bukkit.createInventory(null,54,invTitle); + // 获取申请拜师名单 + List applyList = dataManager.getApplyForList(sfName); + for (String name : applyList){ + inv.addItem(showItems(name)); + } + for (int i = 27; i < 36; i++) { + inv.setItem(i, DemonAPI.glass(15, "§7[[§a▧§c▧§a▧§7]]")); + } + inv.setItem(31, StackLibrary.Back_book()); + player.openInventory(inv); + } + + public static ItemStack showItems(String playName){ + ItemStack item = new ItemStack(Material.BOOK); + ItemMeta meta = item.getItemMeta(); + List lore = new ArrayList<>(); + meta.setDisplayName("§a§l★§7名称: §e"+playName); + Player player = Bukkit.getPlayer(playName); + if(player != null) { + lore.add("§a§l★§7状态: §a§l在线"); + }else{ + lore.add("§a§l★§7状态: §c§l离线"); + } + int levels = (int) DLevelAPI.getOffPlayer_Level(playName); + lore.add("§a§l★§7级别: §dLv."+ levels); + int time = DtimeAPI.getTime(playName); + lore.add("§a§l★§7今日活跃: §a"+ time+"分钟"); + int rechargeMonth = RechargeAPI.getRechargeData(playName, TimeType.MONTHLY); + lore.add("§a§l★§7本月充值: §b" + rechargeMonth + "软妹币"); + lore.add(""); + lore.add("§e§l★§7左键点击通过申请"); + lore.add("§c§l★§7右键点击拒绝申请"); + meta.setLore(lore); + item.setItemMeta(meta); + NBTTagCompound nbt = StackLibrary.getNBT(item); + nbt.setString("ApplyName",playName); + return StackLibrary.setNBT(item,nbt); + } +} diff --git a/src/main/java/me/Demon/DemonShiTu/guimanager/TudiGui.java b/src/main/java/me/Demon/DemonShiTu/guimanager/TudiGui.java new file mode 100644 index 0000000..1ee1b0e --- /dev/null +++ b/src/main/java/me/Demon/DemonShiTu/guimanager/TudiGui.java @@ -0,0 +1,116 @@ +package me.Demon.DemonShiTu.guimanager; + +import me.Demon.Compat.VexCompatGui; +import me.Demon.DemonPlugin.DemonAPI; +import me.Demon.DemonShiTu.Main; +import me.Demon.DemonShiTu.ShiTuAPI; +import me.Demon.DemonShiTu.data.ShiFuData; +import me.Demon.DemonShiTu.manager.DataManager; +import me.Demon.DemonShiTu.util.StackLibrary; +import org.bukkit.Bukkit; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.List; + +public class TudiGui implements Listener { + + public static String invTitle = "师徒系统 - 我的师傅"; + + @EventHandler + public void onClick(InventoryClickEvent e){ + Player p = (Player) e.getWhoClicked(); + Inventory inv = e.getInventory(); + int rawSlot = e.getRawSlot(); + ItemStack item = e.getCurrentItem(); + if(inv != null && inv.getTitle().equalsIgnoreCase(invTitle)){ + e.setCancelled(true); + if(rawSlot == 6){ + p.closeInventory(); + p.playSound(p.getLocation(), Sound.BLOCK_COMPARATOR_CLICK,1.6F,1.8F); + DataManager dataManager = Main.dataManager; + if(!dataManager.isPlayerExitTeacher(p.getName())){ + DemonAPI.sendMessage(p,"你需要拜师后才能解除师徒关系.",Sound.ENTITY_VILLAGER_NO); + return; + } + int level = p.getLevel(); + int price = 50000; + if(level >= 90){ + price = 1000000; + }else if(level >= 80){ + price = 500000; + }else if(level >= 60){ + price = 200000; + }else if(level >= 40){ + price = 100000; + } + String money_format = new DecimalFormat(",###").format(price); + if(!DemonAPI.hasMoney(p,price)){ + DemonAPI.sendMessage(p,"你需要支付§6"+money_format+"金币§a才能解除师徒关系.",Sound.ENTITY_VILLAGER_NO); + return; + } + // 从玩家 p 的账户中扣除金额 price + DemonAPI.takeMoney(p, price); + // 获取玩家 p 的名字 + String name = p.getName(); + // 根据玩家的名字从数据管理器中获取其师傅的名字 + String sfName = dataManager.getTeacherName(name); + // 根据师傅的名字从数据管理器中获取师傅的数据 + ShiFuData fuData = dataManager.getTeacherData(sfName); + // 从师傅的数据中移除该玩家(徒弟)的名字 + fuData.removeTudiList(name); + // 保存师傅的数据以反映更改 + fuData.SaveData(); + Player sfPlayer = Bukkit.getPlayer(sfName); + if(sfPlayer != null){ + DemonAPI.sendMessage(sfPlayer,"您的徒弟 §e"+name+" §a已与你解除师徒关系.",Sound.ENTITY_EXPERIENCE_ORB_PICKUP); + } + DemonAPI.sendMessage(p,"成功与 §e"+sfName+" §a解除师徒关系.",Sound.ENTITY_EXPERIENCE_ORB_PICKUP); + } + } + } + + public static void OpenGui(Player player){ + Inventory inv = Bukkit.createInventory(null,54,invTitle); + inv.setItem(2, StackLibrary.tudiInfoShow()); + DataManager dataManager = Main.dataManager; + if(!dataManager.isPlayerExitTeacher(player.getName())){ + DemonAPI.sendMessage(player,"你需要拜师后才能查看.",Sound.ENTITY_VILLAGER_NO); + player.closeInventory(); + return; + } + String sfName = dataManager.getTeacherName(player.getName()); + ShiFuData fuData = dataManager.getTeacherData(sfName); + inv.setItem(6, HeadlSkull(player.getName(),fuData)); + player.openInventory(inv); + } + + public static ItemStack HeadlSkull(String playName,ShiFuData fuData){ + String sfName = fuData.getName(); + ItemStack item = new ItemStack(449, 1); + ItemMeta meta = item.getItemMeta(); + meta.setDisplayName("§e§l拜师详情查看"); + List lore = new ArrayList<>(); + lore.add("§a§l★§7我的名称: §6"+ playName); + lore.add("§a§l★§7师傅名称: §6"+ sfName); + lore.add("§a§l★§7师门成员: §e"+ fuData.getTudiList().size()+"名"); + int top = VexCompatGui.getTop_self(sfName); + lore.add("§a§l★§7战力排行: §b" + top + "名"); + lore.add("§a§l★§7经验加成: §d"+ShiTuAPI.getExpDouble(sfName)+"%"); + lore.add("§a§l★§7最后一次上线: §c"+DemonAPI.LongToStringData(fuData.getLoginTime(),"yyyy年MM月dd日 HH:mm")); + lore.add("§7#等级大于85级后无法获得经验加成Buff"); + lore.add(" "); + lore.add("§c§l★§7点击与师傅解除关系"); + meta.setLore(lore); + item.setItemMeta(meta); + return item; + } +} diff --git a/src/main/java/me/Demon/DemonShiTu/listener/AttributeLoad.java b/src/main/java/me/Demon/DemonShiTu/listener/AttributeLoad.java new file mode 100644 index 0000000..4b233b9 --- /dev/null +++ b/src/main/java/me/Demon/DemonShiTu/listener/AttributeLoad.java @@ -0,0 +1,48 @@ +package me.Demon.DemonShiTu.listener; + +import me.Demon.DemonShiTu.Main; +import me.Demon.DemonShiTu.ShiTuAPI; +import me.Demon.DemonShiTu.manager.DataManager; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.serverct.ersha.jd.AttributeAPI; + +import java.util.ArrayList; +import java.util.List; + +public class AttributeLoad implements Listener { + + @EventHandler + public void loadApStats(PlayerChangedWorldEvent e) { + Player p = e.getPlayer(); + String name = p.getName(); + // 判断玩家是否有师傅 + DataManager dataManager = Main.dataManager; + if (dataManager.isPlayerExitTeacher(name)) { + if(p.getLevel() <= 85) { + String sfName = dataManager.getTeacherName(name); + if(ShiTuAPI.getExpDouble(sfName) >= 1) { + List apStats = new ArrayList<>(); + apStats.add("经验加成: " + ShiTuAPI.getExpDouble(sfName) + "%"); + AttributeAPI.addAttribute(p, "师徒_ApStats", apStats); + } + } + } + } + + @EventHandler + public void onquit(PlayerQuitEvent e) { + Player p = e.getPlayer(); + String name = p.getName(); + // 判断玩家是否有师傅 + DataManager dataManager = Main.dataManager; + if (dataManager.isPlayerExitTeacher(name)) { + if(p.getLevel() <= 85) { + AttributeAPI.deleteAttribute(p, "师徒_ApStats"); + } + } + } +} diff --git a/src/main/java/me/Demon/DemonShiTu/listener/ChongZhi.java b/src/main/java/me/Demon/DemonShiTu/listener/ChongZhi.java new file mode 100644 index 0000000..3b96af5 --- /dev/null +++ b/src/main/java/me/Demon/DemonShiTu/listener/ChongZhi.java @@ -0,0 +1,90 @@ +package me.Demon.DemonShiTu.listener; + +import com.yaohun.aurechargedata.event.RechargeEvent; +import me.Demon.DemonPlugin.DemonAPI; +import me.Demon.DemonShiTu.Main; +import me.Demon.DemonShiTu.data.ShiFuData; +import me.Demon.DemonShiTu.manager.DataManager; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class ChongZhi implements Listener { + @EventHandler + public void onRecharge(RechargeEvent e){ + DataManager dataManager = Main.dataManager; + String name = e.getPlayerName();// 充值软妹币的玩家名 + // 判断这个玩家是否拜师 + if(dataManager.isPlayerExitTeacher(name)){ + // 获取这个玩家的师傅名 + String sfNameA = dataManager.getTeacherName(name); + // 判断他的师傅是否进行拜师 + if(!dataManager.isPlayerExitTeacher(sfNameA)){ + // 获取他师傅的等级 + ShiFuData shiFuData = dataManager.getTeacherData(sfNameA); + // 若师傅超过15天未上线则不享受此分成 + if(shiFuData.isLoginOvertime()){ + System.out.println("[调试 - 师徒] 师傅 " + sfNameA + " 因长时间未上线,取消本次分成奖励."); + return; + } + int level = shiFuData.getLevel(); + //获取分成比例 + double percentage = getPercentage(level); + double incentivePayments = (e.getMoney() * percentage) * 10; + shiFuData.addEarnings(incentivePayments); // 增加师徒币 + shiFuData.SaveData(); // 保存数据 + System.out.println("[调试 - 师徒] 充值玩家: "+name+" 他的师傅<" + sfNameA + ">获得" + incentivePayments + "师徒币奖励"); + Player sfPlayerA = Bukkit.getPlayer(sfNameA); + if(sfPlayerA != null){ + DemonAPI.sendMessage(sfPlayerA,"获得徒弟的充值激励收益: §6"+incentivePayments+"师徒币"); + } + } else { + // 获取他师傅的等级 + ShiFuData shiFuData = dataManager.getTeacherData(sfNameA); + // 若师傅超过7天未上线则不享受此分成 + if(shiFuData.isLoginOvertime()){ + System.out.println("[调试 - 师徒] 师傅 " + sfNameA + " 因长时间未上线,取消本次分成奖励."); + return; + } + int level = shiFuData.getLevel(); + //获取分成比例 + double percentage = getPercentage(level); + double incentivePayments = ((e.getMoney() * percentage) * 10 )* 0.5; + shiFuData.addEarnings(incentivePayments); // 增加师徒币 + shiFuData.SaveData(); // 保存数据 + System.out.println("[调试 - 师徒] 充值玩家: "+name+" 他的师傅<" + sfNameA + ">获得" + incentivePayments + "师徒币奖励"); + Player sfPlayerA = Bukkit.getPlayer(sfNameA); + if(sfPlayerA != null){ + DemonAPI.sendMessage(sfPlayerA,"获得徒弟的充值激励收益: §6"+incentivePayments+"师徒币"); + } + // 获取他师傅的师傅 + String sfNameB = dataManager.getTeacherName(sfNameA); + ShiFuData shiFuDataB = dataManager.getTeacherData(sfNameB); + // 若师傅超过7天未上线则不享受此分成 + if(shiFuDataB.isLoginOvertime()){ + System.out.println("[调试 - 师徒] 师傅 " + sfNameA + " 因长时间未上线,取消本次分成奖励."); + return; + } + shiFuDataB.addEarnings(incentivePayments);// 增加师徒币 + System.out.println("[调试 - 师徒] 分成玩家: "+sfNameA+" 他的师傅<" + sfNameB + ">获得" + incentivePayments + "师徒币奖励"); + Player sfPlayerB = Bukkit.getPlayer(sfNameB); + if(sfPlayerB != null){ + DemonAPI.sendMessage(sfPlayerB,"获得徒弟的充值激励收益: §6"+incentivePayments+"师徒币"); + } + } + } + } + + public static double getPercentage(int level){ + double percentage = 0.05; + if(level == 2){ + percentage = 0.1; + }else if(level == 3){ + percentage = 0.15; + }else if(level >= 4){ + percentage = 0.2; + } + return percentage; + } +} diff --git a/src/main/java/me/Demon/DemonShiTu/listener/itemUse.java b/src/main/java/me/Demon/DemonShiTu/listener/itemUse.java new file mode 100644 index 0000000..8c15cb3 --- /dev/null +++ b/src/main/java/me/Demon/DemonShiTu/listener/itemUse.java @@ -0,0 +1,86 @@ +package me.Demon.DemonShiTu.listener; + +import me.Demon.DemonPlugin.DemonAPI; +import me.Demon.DemonShiTu.Main; +import me.Demon.DemonShiTu.ShiTuAPI; +import me.Demon.DemonShiTu.data.ShiFuData; +import me.Demon.DemonShiTu.manager.DataManager; +import me.Demon.ItemKuAPI; +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.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemStack; + + +public class itemUse implements Listener { + + @EventHandler + public void onUseJoin(PlayerInteractEvent e){ + Player p = e.getPlayer(); + String name = p.getName(); + ItemStack item = p.getInventory().getItemInMainHand(); + if(e.getHand() == EquipmentSlot.HAND) { + Action action = e.getAction(); + if (action == Action.LEFT_CLICK_AIR || action == Action.RIGHT_CLICK_BLOCK) { + ItemStack needStack = ItemKuAPI.getItems("出师令", 1); + if(DemonAPI.isMainHandItemsLore(p,needStack,1)){ + // 判断这个玩家是否已有师傅档案 + if(ShiTuAPI.isTeacherExit(name)){ + DemonAPI.sendMessage(p,"你已经出师了,无法使用此道具."); + return; + } + if (item.getAmount() == 1) { + p.getInventory().setItemInMainHand(new ItemStack(Material.AIR)); + } else { + item.setAmount(item.getAmount() - 1); + } + // 创建出师档案 + DataManager dataManager = Main.dataManager; + dataManager.createTeacherData(name); + DemonAPI.sendMessage(p,"成功注册出师档案,已完成 §e§l出师!"); + Bukkit.broadcastMessage("§6[§c公告§6] §a玩家 §e"+p.getName()+" §a使用了 §r"+needStack.getItemMeta().getDisplayName()+" §a成功出师,开始收徒。"); + } + } + } + } + + @EventHandler + public void onUseDissolve(PlayerInteractEvent e){ + Player p = e.getPlayer(); + String name = p.getName(); + ItemStack item = p.getInventory().getItemInMainHand(); + if(e.getHand() == EquipmentSlot.HAND) { + Action action = e.getAction(); + if (action == Action.LEFT_CLICK_AIR || action == Action.RIGHT_CLICK_BLOCK) { + ItemStack needStack = ItemKuAPI.getItems("解除令", 1); + if (DemonAPI.isMainHandItemsLore(p, needStack, 1)) { + DataManager dataManager = Main.dataManager; + // 判断这个玩家是否已有师傅档案 + if (dataManager.isPlayerExitTeacher(name)) { + DemonAPI.sendMessage(p, "你还没有拜过师,无法使用此道具."); + return; + } + if (item.getAmount() == 1) { + p.getInventory().setItemInMainHand(new ItemStack(Material.AIR)); + } else { + item.setAmount(item.getAmount() - 1); + } + String sfName = dataManager.getTeacherName(name);// 获取这个玩家的师傅名 + ShiFuData fuData = dataManager.getTeacherData(sfName);// 获取这个玩家的师傅档案 + if (fuData == null) { + DemonAPI.sendMessage(p, "师傅的档案数据出现异常.§7#" + sfName); + return; + } + fuData.removeTudiList(name); // 将玩家从徒弟列表踢出. + fuData.SaveData(); // 保存数据 + DemonAPI.sendMessage(p,"已经和 §e"+sfName+" §a解除师徒关系."); + } + } + } + } +} diff --git a/src/main/java/me/Demon/DemonShiTu/manager/DataManager.java b/src/main/java/me/Demon/DemonShiTu/manager/DataManager.java new file mode 100644 index 0000000..14f271a --- /dev/null +++ b/src/main/java/me/Demon/DemonShiTu/manager/DataManager.java @@ -0,0 +1,162 @@ +package me.Demon.DemonShiTu.manager; + +import me.Demon.DemonPlugin.DemonAPI; +import me.Demon.DemonShiTu.Main; +import me.Demon.DemonShiTu.data.ShiFuData; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class DataManager { + + private long monthlyTimeLog; + private long everydayTimeLog; + private HashMap shiFuDataMap = new HashMap<>(); + private HashMap> apprenticeList = new HashMap<>(); + private HashMap> applyForList = new HashMap<>(); + private List activeReward = new ArrayList<>(); + + public DataManager(){ + FileConfiguration yml = Main.plugin.getConfig(); + monthlyTimeLog = yml.getLong("monthlyTimeLog"); + everydayTimeLog = yml.getLong("everydayTimeLog"); + ConfigurationSection section = yml.getConfigurationSection("ShiTuData"); + if(section == null) {return;} + for (String shifuName : section.getKeys(false)){ + int level = section.getInt(shifuName+".level"); + double shouyi = section.getDouble(shifuName+".shouyi"); + long loginTime = section.getLong(shifuName+".loginTime"); + if(loginTime < 0){ + loginTime = System.currentTimeMillis(); + } + List stringList = section.getStringList(shifuName+".tudi"); + shiFuDataMap.put(shifuName,new ShiFuData(shifuName,level,shouyi,stringList,loginTime)); + apprenticeList.put(shifuName,stringList); + } + DemonAPI.sendConsoleMessage("§f[§a!§f] §f每月结算 §8> §6"+DemonAPI.LongToStringData(monthlyTimeLog,"yyyy年MM月")); + DemonAPI.sendConsoleMessage("§f[§a!§f] §f每日刷新 §8> §6"+DemonAPI.LongToStringData(everydayTimeLog,"MM月dd日")); + DemonAPI.sendConsoleMessage("§f[§a!§f] §f师傅档案 §8> §6"+shiFuDataMap.size()+"名"); + DemonAPI.sendConsoleMessage("§f[§a!§f] §f活跃奖励 §8> §6"+activeReward.size()+"名"); + } + + public void SaveDataManager(){ + FileConfiguration yml = Main.plugin.getConfig(); + yml.set("monthlyTimeLog",monthlyTimeLog); + yml.set("everydayTimeLog",everydayTimeLog); + yml.set("activeReward",null); + yml.set("activeReward",activeReward); + for (String sfName : shiFuDataMap.keySet()){ + ShiFuData fuData = shiFuDataMap.get(sfName); + if(fuData.isLoginOvertime()){ + // yml.set("ShiTuData."+sfName,null); + System.out.println("[调试 - 师徒] 由于玩家 "+sfName+" 长时间未上线,他的师徒档案已清理."); + } + fuData.SaveData(); + } + System.out.println("[调试 - 师徒] 活跃收益 "+activeReward.size()+" 名"); + System.out.println("[调试 - 师徒] 已保存 "+shiFuDataMap.size()+" 师傅的数据档案"); + } + + public long getMonthlyTimeLog() { + return monthlyTimeLog; + } + + public void setMonthlyTimeLog(long monthlyTimeLog) { + this.monthlyTimeLog = monthlyTimeLog; + } + + public long getEverydayTimeLog() { + return everydayTimeLog; + } + + public void setEverydayTimeLog(long everydayTimeLog) { + this.everydayTimeLog = everydayTimeLog; + } + + public HashMap getShiFuDataMap() { + return shiFuDataMap; + } + + public void removeShiFuData(String sfName) { + this.shiFuDataMap.remove(sfName); + FileConfiguration yml = Main.plugin.getConfig(); + yml.set("ShiTuData."+sfName,null); + Main.plugin.saveConfig(); + } + + public List getApplyForList(String sfName) { + List stringList = new ArrayList<>(); + if(this.applyForList.get(sfName) == null){ + return stringList; + } + stringList.addAll(applyForList.get(sfName)); + return stringList; + } + + public void setApplyForList(String sfName,List applyForList) { + this.applyForList.put(sfName,applyForList); + } + + // 获取学徒列表 + public List getApprenticeList(String name){ + if(this.apprenticeList.get(name) != null){ + return apprenticeList.get(name); + } + return new ArrayList<>(); + } + + public boolean isActiveReward(String name){ + if(activeReward.contains(name)){ + return true; + } + return false; + } + + public List getActiveReward() { + return activeReward; + } + + public void setActiveReward(List activeReward) { + this.activeReward = activeReward; + } + + public ShiFuData getTeacherData(String sfName){ + if(this.shiFuDataMap.get(sfName) != null){ + return shiFuDataMap.get(sfName); + } + return null; + } + + public boolean isPlayerExitTeacher(String name){ + for (String teacherName : this.apprenticeList.keySet()){ + List stringList = this.apprenticeList.get(teacherName); + if(stringList.contains(name)){ + return true; + } + } + return false; + } + + public String getTeacherName(String name){ + for (String teacherName : this.apprenticeList.keySet()){ + List stringList = this.apprenticeList.get(teacherName); + if(stringList.contains(name)){ + return teacherName; + } + } + return "无"; + } + + public void createTeacherData(String sfName){ + int level = 1; + double shouyi = 0.0; + long loginTime = System.currentTimeMillis(); + List stringList = new ArrayList<>(); + shiFuDataMap.put(sfName,new ShiFuData(sfName,level,shouyi,stringList,loginTime)); + apprenticeList.put(sfName,stringList); + shiFuDataMap.get(sfName).SaveData(); + } +} diff --git a/src/main/java/me/Demon/DemonShiTu/util/StackLibrary.java b/src/main/java/me/Demon/DemonShiTu/util/StackLibrary.java new file mode 100644 index 0000000..6767f79 --- /dev/null +++ b/src/main/java/me/Demon/DemonShiTu/util/StackLibrary.java @@ -0,0 +1,79 @@ +package me.Demon.DemonShiTu.util; + +import net.minecraft.server.v1_12_R1.NBTTagCompound; +import org.bukkit.Material; +import org.bukkit.craftbukkit.v1_12_R1.inventory.CraftItemStack; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.ArrayList; +import java.util.List; + +public class StackLibrary{ + + public static NBTTagCompound getNBT(ItemStack Equipment) { + net.minecraft.server.v1_12_R1.ItemStack nmsEquipment = CraftItemStack.asNMSCopy(Equipment); + return nmsEquipment.hasTag() && nmsEquipment.getTag() != null ? nmsEquipment.getTag() : new NBTTagCompound(); + } + + public static ItemStack setNBT(ItemStack item, NBTTagCompound nbtEquipment) { + net.minecraft.server.v1_12_R1.ItemStack nmsEquipment = CraftItemStack.asNMSCopy(item); + nmsEquipment.setTag(nbtEquipment); + return CraftItemStack.asBukkitCopy(nmsEquipment); + } + + public static ItemStack tudiInfoShow(){ + ItemStack item = new ItemStack(Material.PAPER); + ItemMeta meta = item.getItemMeta(); + meta.setDisplayName("§6§l师徒激励计划§6玩法介绍"); + List lore = new ArrayList<>(); + lore.add("§a§l★§7师傅 = §a玩家A"); + lore.add("§a§l★§7徒弟 = §b玩家B"); + lore.add("§d§l★§7师徒系统经验加成参考: "); + lore.add("§7- [§a玩家A§7]战力排行§e第一名§7,[§b玩家B§7]可获: §d经验加成50% §r"); + lore.add("§7- [§a玩家A§7]战力排行§e前三名§7,[§b玩家B§7]可获: §d经验加成30%"); + lore.add("§7- [§a玩家A§7]战力排行§e前六名§7,[§b玩家B§7]可获: §d经验加成20%"); + lore.add("§7- [§a玩家A§7]战力排行§e前十名§7,[§b玩家B§7]可获: §d经验加成10%"); + lore.add("§7- [§a玩家A§7]战力排行§e前30名§7,[§b玩家B§7]可获: §d经验加成5%"); + lore.add("§c温馨提示:§b徒弟的等级大于90级后将不享有经验加成。"); + meta.setLore(lore); + item.setItemMeta(meta); + NBTTagCompound nbti = getNBT(item); + nbti.setString("stex","cailiao_124"); + return setNBT(item, nbti); + } + + public static ItemStack teacherInfoShow(){ + ItemStack item = new ItemStack(Material.PAPER); + ItemMeta meta = item.getItemMeta(); + meta.setDisplayName("§6§l师徒激励计划§6玩法介绍"); + List lore = new ArrayList<>(); + lore.add("§a§l★§7师傅 = §a玩家A"); + lore.add("§a§l★§7徒弟 = §b玩家B"); + lore.add("§a§l★§7徒弟的徒弟 = §c玩家C"); + lore.add("§d§l★§7玩法大致介绍: "); + lore.add("§7- [§b玩家B§7]拜[§a玩家A§7]为师傅,然后[§b玩家B§7]每日§3在线游玩3小时§7以上"); + lore.add("§7- [§a玩家A§7]就能获得§620的师徒币§7作为奖励,若[§b玩家B§7]有任意充值"); + lore.add("§7- [§a玩家A§7]还能获得§e20%的等价师徒币§7作为奖励,依次类推[§c玩家C§7]"); + lore.add("§7- 拜玩家[§b玩家B§7]为师当[§b玩家B§7]获得收益的时候,[§a玩家A§7]可获取"); + lore.add("§7- [§b玩家B§7]收益的§e50%§7作为§6激励计划§7平分收益,若§4解除师徒§7关系"); + lore.add("§7- [§b玩家B§7]将不再与[§a玩家A§7§7]平分§6激励计划§7的收益。"); + lore.add("§7- 每周一至周五师徒币会额外增加§e[30%]§7的收益。"); + lore.add("§d§l✪§7此系统正在测试阶段,若有意见可向客服反馈."); + meta.setLore(lore); + item.setItemMeta(meta); + NBTTagCompound nbti = getNBT(item); + nbti.setString("stex","cailiao_124"); + return setNBT(item, nbti); + } + public static ItemStack Back_book(){ + ItemStack item = new ItemStack(340); + ItemMeta meta = item.getItemMeta(); + meta.setDisplayName(" §8« §e返回主页 §8»"); + List lore = new ArrayList<>(); + lore.add("§a§l★ §7返回师徒主页 §a§l★"); + meta.setLore(lore); + item.setItemMeta(meta); + return item; + } +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..6664733 --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,9 @@ +name: DemonShiTu +main: me.Demon.DemonShiTu.Main +depend: + - DemonAPI +version: 2.2.0 +commands: + st: + stopen: + stadmin: \ No newline at end of file diff --git a/target/classes/config.yml b/target/classes/config.yml new file mode 100644 index 0000000..e69de29 diff --git a/target/classes/me/Demon/DemonShiTu/Event/DshituEvent.class b/target/classes/me/Demon/DemonShiTu/Event/DshituEvent.class new file mode 100644 index 0000000..0fa6231 Binary files /dev/null and b/target/classes/me/Demon/DemonShiTu/Event/DshituEvent.class differ diff --git a/target/classes/me/Demon/DemonShiTu/Main.class b/target/classes/me/Demon/DemonShiTu/Main.class new file mode 100644 index 0000000..4d82e31 Binary files /dev/null and b/target/classes/me/Demon/DemonShiTu/Main.class differ diff --git a/target/classes/me/Demon/DemonShiTu/ShiTuAPI.class b/target/classes/me/Demon/DemonShiTu/ShiTuAPI.class new file mode 100644 index 0000000..ea40a6c Binary files /dev/null and b/target/classes/me/Demon/DemonShiTu/ShiTuAPI.class differ diff --git a/target/classes/me/Demon/DemonShiTu/ShituExpansion.class b/target/classes/me/Demon/DemonShiTu/ShituExpansion.class new file mode 100644 index 0000000..fa30ed4 Binary files /dev/null and b/target/classes/me/Demon/DemonShiTu/ShituExpansion.class differ diff --git a/target/classes/me/Demon/DemonShiTu/command/AdminCmd.class b/target/classes/me/Demon/DemonShiTu/command/AdminCmd.class new file mode 100644 index 0000000..7b0b9f1 Binary files /dev/null and b/target/classes/me/Demon/DemonShiTu/command/AdminCmd.class differ diff --git a/target/classes/me/Demon/DemonShiTu/command/MainCmd.class b/target/classes/me/Demon/DemonShiTu/command/MainCmd.class new file mode 100644 index 0000000..2b28cd8 Binary files /dev/null and b/target/classes/me/Demon/DemonShiTu/command/MainCmd.class differ diff --git a/target/classes/me/Demon/DemonShiTu/data/ShiFuData.class b/target/classes/me/Demon/DemonShiTu/data/ShiFuData.class new file mode 100644 index 0000000..a79cb4c Binary files /dev/null and b/target/classes/me/Demon/DemonShiTu/data/ShiFuData.class differ diff --git a/target/classes/me/Demon/DemonShiTu/guimanager/JoinEvent.class b/target/classes/me/Demon/DemonShiTu/guimanager/JoinEvent.class new file mode 100644 index 0000000..e118553 Binary files /dev/null and b/target/classes/me/Demon/DemonShiTu/guimanager/JoinEvent.class differ diff --git a/target/classes/me/Demon/DemonShiTu/guimanager/LookDataGui.class b/target/classes/me/Demon/DemonShiTu/guimanager/LookDataGui.class new file mode 100644 index 0000000..6188757 Binary files /dev/null and b/target/classes/me/Demon/DemonShiTu/guimanager/LookDataGui.class differ diff --git a/target/classes/me/Demon/DemonShiTu/guimanager/OnlineTeacherGui.class b/target/classes/me/Demon/DemonShiTu/guimanager/OnlineTeacherGui.class new file mode 100644 index 0000000..188f4d6 Binary files /dev/null and b/target/classes/me/Demon/DemonShiTu/guimanager/OnlineTeacherGui.class differ diff --git a/target/classes/me/Demon/DemonShiTu/guimanager/TeacherGui.class b/target/classes/me/Demon/DemonShiTu/guimanager/TeacherGui.class new file mode 100644 index 0000000..c1d395c Binary files /dev/null and b/target/classes/me/Demon/DemonShiTu/guimanager/TeacherGui.class differ diff --git a/target/classes/me/Demon/DemonShiTu/guimanager/ThApplyGui.class b/target/classes/me/Demon/DemonShiTu/guimanager/ThApplyGui.class new file mode 100644 index 0000000..4730a42 Binary files /dev/null and b/target/classes/me/Demon/DemonShiTu/guimanager/ThApplyGui.class differ diff --git a/target/classes/me/Demon/DemonShiTu/guimanager/TudiGui.class b/target/classes/me/Demon/DemonShiTu/guimanager/TudiGui.class new file mode 100644 index 0000000..2021285 Binary files /dev/null and b/target/classes/me/Demon/DemonShiTu/guimanager/TudiGui.class differ diff --git a/target/classes/me/Demon/DemonShiTu/listener/AttributeLoad.class b/target/classes/me/Demon/DemonShiTu/listener/AttributeLoad.class new file mode 100644 index 0000000..832afee Binary files /dev/null and b/target/classes/me/Demon/DemonShiTu/listener/AttributeLoad.class differ diff --git a/target/classes/me/Demon/DemonShiTu/listener/ChongZhi.class b/target/classes/me/Demon/DemonShiTu/listener/ChongZhi.class new file mode 100644 index 0000000..c024418 Binary files /dev/null and b/target/classes/me/Demon/DemonShiTu/listener/ChongZhi.class differ diff --git a/target/classes/me/Demon/DemonShiTu/listener/itemUse.class b/target/classes/me/Demon/DemonShiTu/listener/itemUse.class new file mode 100644 index 0000000..ece4a92 Binary files /dev/null and b/target/classes/me/Demon/DemonShiTu/listener/itemUse.class differ diff --git a/target/classes/me/Demon/DemonShiTu/manager/DataManager.class b/target/classes/me/Demon/DemonShiTu/manager/DataManager.class new file mode 100644 index 0000000..12b416d Binary files /dev/null and b/target/classes/me/Demon/DemonShiTu/manager/DataManager.class differ diff --git a/target/classes/me/Demon/DemonShiTu/util/StackLibrary.class b/target/classes/me/Demon/DemonShiTu/util/StackLibrary.class new file mode 100644 index 0000000..9b66927 Binary files /dev/null and b/target/classes/me/Demon/DemonShiTu/util/StackLibrary.class differ diff --git a/target/classes/plugin.yml b/target/classes/plugin.yml new file mode 100644 index 0000000..6664733 --- /dev/null +++ b/target/classes/plugin.yml @@ -0,0 +1,9 @@ +name: DemonShiTu +main: me.Demon.DemonShiTu.Main +depend: + - DemonAPI +version: 2.2.0 +commands: + st: + stopen: + stadmin: \ No newline at end of file