Compare commits

..

No commits in common. "Master" and "master" have entirely different histories.

18 changed files with 1229 additions and 28 deletions

26
.gitignore vendored
View File

@ -1,26 +0,0 @@
# ---> Java
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
replay_pid*

View File

@ -1,2 +0,0 @@
# DemonShiTu

67
pom.xml Normal file
View File

@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>DemonShiTu</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<repositories>
<repository>
<id>public-rpg</id>
<url>https://repo.aurora-pixels.com/repository/public-rpg/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.12.2</version>
</dependency>
<dependency>
<groupId>com.yaohun.demonlogintime</groupId>
<artifactId>DemonLoginTime</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>me.Demon.DemonPlugin</groupId>
<artifactId>DemonAPI</artifactId>
<version>2.2.9</version>
</dependency>
<dependency>
<groupId>com.yaohun.onlinereward</groupId>
<artifactId>AuOnlineReward</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>com.yaohun.aurechargedata</groupId>
<artifactId>AuRechargeData</artifactId>
<version>2.0.3</version>
</dependency>
<dependency>
<groupId>org.serverct.ersha.jd</groupId>
<artifactId>AttributePlus</artifactId>
<version>2.3.7</version>
</dependency>
<dependency>
<groupId>me.clip.placeholderapi</groupId>
<artifactId>PlaceholderAPI</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>me.Demon.DemonLevels</groupId>
<artifactId>DemonLevels</artifactId>
<version>2.2.2</version>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,58 @@
package com.yaohun.shitu;
import com.yaohun.shitu.config.Config;
import com.yaohun.shitu.manage.PlayerManager;
import com.yaohun.shitu.util.RankUtil;
import me.Demon.DemonPlugin.DemonAPI;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabCompleter;
import org.bukkit.entity.Player;
import java.util.Collections;
import java.util.List;
public class AdminCommand implements CommandExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if(!sender.isOp()) {
return true;
}
if(args.length == 0){
sender.sendMessage("");
sender.sendMessage("§e------- ======= §6师徒系统 §e======= -------");
sender.sendMessage("§2/"+label+" create §e[玩家名] §f- §2创建师傅档案");
sender.sendMessage("§2/"+label+" top §f- §2查看收徒排行");
sender.sendMessage("§2/"+label+" reload §f- §2重载配置文件");
sender.sendMessage("§e------- ======= §6师徒系统 §e======= -------");
sender.sendMessage("");
}
if(args.length == 1 && "reload".equalsIgnoreCase(args[0])){
Config.reloadConfig(StMain.inst());
sender.sendMessage("[师徒] 配置文件已重载");
return true;
}
if(args.length == 1 && "top".equalsIgnoreCase(args[0])){
RankUtil.checkAcceptingApprenticesTop(sender);
return true;
}
if("create".equalsIgnoreCase(args[0]) && sender.isOp()){
if(args.length == 1){
DemonAPI.sendMessage(sender,"请输入你要创建的师傅名称.");
return true;
}
String masterName = args[1];
PlayerManager playerManager = StMain.getPlayerManager();
if(playerManager.isMaster(masterName)){
DemonAPI.sendMessage(sender,"玩家 §e"+masterName+" §a已存在师傅档案.");
return true;
}
playerManager.createData(masterName);
DemonAPI.sendMessage(sender,"成功为玩家 §e"+masterName+" §a创建出师档案.");
return true;
}
return false;
}
}

View File

@ -0,0 +1,210 @@
package com.yaohun.shitu;
import com.yaohun.demonlogintime.api.LoginTimeAPI;
import com.yaohun.shitu.config.Config;
import com.yaohun.shitu.data.PlayerData;
import com.yaohun.shitu.gui.MasterGui;
import com.yaohun.shitu.listsener.PlayerListener;
import com.yaohun.shitu.listsener.RechargeListener;
import com.yaohun.shitu.manage.InviteManager;
import com.yaohun.shitu.manage.PlayerManager;
import me.Demon.DemonPlugin.DemonAPI;
import org.bukkit.Bukkit;
import org.bukkit.Sound;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
public class StMain extends JavaPlugin {
private static StMain instance;
private static PlayerManager playerManager;
@Override
public void onEnable() {
instance = this;
Config.reloadConfig(this);
playerManager = new PlayerManager();
getServer().getPluginManager().registerEvents(new MasterGui(),this);
getServer().getPluginManager().registerEvents(new PlayerListener(),this);
getServer().getPluginManager().registerEvents(new RechargeListener(),this);
AdminCommand adminCommand = new AdminCommand();
Bukkit.getPluginCommand("stadmin").setExecutor(adminCommand);
}
@Override
public void onDisable() {
getPlayerManager().saveDataAll();
Bukkit.getConsoleSender().sendMessage("§f[§6!§f] §aDemonShiTu §f已卸载");
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if(args.length == 0){
Player player = (Player) sender;
String playerName = player.getName();
if(getPlayerManager().isMaster(playerName)){
sender.sendMessage("§r ");
sender.sendMessage("§c§m §r §c师傅命令 §c§m §r");
sender.sendMessage("§a/"+label+" open §8- §7打开师徒系统");
sender.sendMessage("§a/"+label+" invite §e[玩家名] §8- §7邀请对方成为徒弟");
sender.sendMessage("§a/"+label+" remove §e[徒弟名] §8- §7解除师徒关系");
sender.sendMessage("§r ");
return true;
}
if(getPlayerManager().isDisciple(playerName)){
sender.sendMessage("§r ");
sender.sendMessage("§c§m §r §c徒弟命令 §c§m §r");
sender.sendMessage("§a/"+label+" jiechu §8- §7解除师徒关系§4(暂未开放)");
sender.sendMessage("§r ");
return true;
}
sender.sendMessage("§r ");
sender.sendMessage("§c§m §r §c玩家命令 §c§m §r");
sender.sendMessage("§a/"+label+" accept §8- §7接受拜师邀请");
sender.sendMessage("§a/"+label+" deny §8- §7拒绝拜师邀请");
sender.sendMessage("§r ");
return true;
}
if("jiechu".equalsIgnoreCase(args[0])) {
return true;
}
if("remove".equalsIgnoreCase(args[0])) {
if(args.length < 2){
DemonAPI.sendMessage(sender,"正确用法: §e/"+label+" remove [玩家名]",Sound.ENTITY_VILLAGER_NO);
return true;
}
String masterName = sender.getName();
PlayerData playerData = getPlayerManager().getPlayerData(masterName);
String targetName = args[1];
if(!playerData.isApprenticeExit(targetName)){
DemonAPI.sendMessage(sender,"玩家 §e"+targetName+" §a貌似不是你的徒弟.",Sound.ENTITY_VILLAGER_NO);
return true;
}
int quitTimeDays = LoginTimeAPI.getQuitTimeDays(targetName);
int offlineDays = Config.master_remove_after_offline;
if(quitTimeDays < offlineDays){
DemonAPI.sendMessage(sender,"解除失败,徒弟 §e"+targetName+" §a尚未离线超过 §b"+offlineDays+"",Sound.ENTITY_VILLAGER_NO);
return true;
}
playerData.removeApprentice(targetName);
playerData.saveData();
DemonAPI.sendMessage(sender,"成功解除与 §e"+targetName+" §a的师徒关系.",Sound.ENTITY_EXPERIENCE_ORB_PICKUP);
return true;
}
if("invite".equalsIgnoreCase(args[0])) {
if(args.length < 2){
DemonAPI.sendMessage(sender,"正确用法: §e/"+label+" invite [玩家名]",Sound.ENTITY_VILLAGER_NO);
return true;
}
Player master = (Player) sender;
int masterLevel = master.getLevel();
int needLevel = Config.master_level_limit;
if(masterLevel < needLevel){
DemonAPI.sendMessage(sender,"你需要将等级提升至 §e§lLv."+needLevel+" §a才能进行收徒.",Sound.ENTITY_VILLAGER_NO);
return true;
}
// 获取玩家已加入服务器多少天
int masterJoinDays = Config.master_join_days;
long firstTime = master.getFirstPlayed() + (1000L * 60 * 60 * 24 * masterJoinDays);
if(System.currentTimeMillis() < firstTime){
DemonAPI.sendMessage(sender,"你需要加入服务器 §e§l"+masterJoinDays+"天 §a后才能进行收徒.",Sound.ENTITY_VILLAGER_NO);
return true;
}
String masterName = master.getName();
PlayerData masterData = getPlayerManager().getPlayerData(masterName);
int maxDiscipleSize = Config.master_max_disciple_size;
if(masterData.getApprenticeSize() >= maxDiscipleSize){
DemonAPI.sendMessage(sender,"发送失败,你最多可以收徒 §e§l"+maxDiscipleSize+"",Sound.ENTITY_VILLAGER_NO);
return true;
}
String targetName = args[1];
Player target = Bukkit.getPlayer(targetName);
if (target == null || !target.isOnline()) {
DemonAPI.sendMessage(sender,"玩家 §e"+targetName+" §a貌似不在线.",Sound.ENTITY_VILLAGER_NO);
return true;
}
if(target == master){
DemonAPI.sendMessage(sender,"发送失败,目标玩家不能是自己.",Sound.ENTITY_VILLAGER_NO);
return true;
}
if(getPlayerManager().isDisciple(targetName)){
DemonAPI.sendMessage(sender,"发送失败,目标玩家已拜其他人为师.",Sound.ENTITY_VILLAGER_NO);
return true;
}
int playerLevel = target.getLevel();
int levelLimit = Config.disciple_level_limit;
if(playerLevel > levelLimit){
DemonAPI.sendMessage(sender,"发送失败,对方等级已超过 §eLv."+levelLimit+"级 §a无法成为你的徒弟.",Sound.ENTITY_VILLAGER_NO);
return true;
}
int targetJoinDays = Config.disciple_join_days;
long targetFirstTime = target.getFirstPlayed() + (1000L * 60 * 60 * 24 * targetJoinDays);
if(System.currentTimeMillis() >= targetFirstTime){
DemonAPI.sendMessage(sender,"发送失败,对方已经加入本服超 §e"+targetJoinDays+"天 §a无法成为你的徒弟.",Sound.ENTITY_VILLAGER_NO);
return true;
}
InviteManager.sendInvite(master, target);
return true;
}
if("accept".equalsIgnoreCase(args[0])){
InviteManager.acceptInvite((Player) sender);
return true;
}
if("deny".equalsIgnoreCase(args[0])){
InviteManager.denyInvite((Player) sender);
return true;
}
if(args.length == 1 && "open".equalsIgnoreCase(args[0])){
String masterName = sender.getName();
if(!getPlayerManager().isMaster(masterName)){
DemonAPI.sendMessage(sender,"打开失败,你还没有宗师档案.", Sound.ENTITY_VILLAGER_NO);
return true;
}
MasterGui.openGui((Player) sender,1);
return true;
}
if("create".equalsIgnoreCase(args[0])){
Player player = (Player) sender;
String masterName = player.getName();
if(getPlayerManager().isMaster(masterName)){
DemonAPI.sendMessage(sender,"创建失败,你已存在出师档案.",Sound.ENTITY_VILLAGER_NO);
return true;
}
if(getPlayerManager().isDisciple(masterName)){
DemonAPI.sendMessage(sender,"创建失败,你需要先解除师徒关系.",Sound.ENTITY_VILLAGER_NO);
return true;
}
int masterLevel = player.getLevel();
int needLevel = Config.master_level_limit;
if(masterLevel < needLevel){
DemonAPI.sendMessage(sender,"创建失败,你需要将等级提升至§e§lLv."+needLevel,Sound.ENTITY_VILLAGER_NO);
return true;
}
// 获取玩家已加入服务器多少天
int masterJoinDays = Config.master_join_days;
long firstTime = player.getFirstPlayed() + (1000L * 60 * 60 * 24 * masterJoinDays);
if(System.currentTimeMillis() < firstTime){
DemonAPI.sendMessage(sender,"创建失败,你需要加入服务器§e§l"+masterJoinDays+"",Sound.ENTITY_VILLAGER_NO);
return true;
}
getPlayerManager().createData(masterName);
DemonAPI.sendMessage(sender,"创建成功,你已经完成了出师已拥有宗师档案.",Sound.ENTITY_EXPERIENCE_ORB_PICKUP);
MasterGui.openGui(player,1);
return true;
}
return false;
}
public static StMain inst() {
return instance;
}
public static PlayerManager getPlayerManager() {
return playerManager;
}
}

View File

@ -0,0 +1,39 @@
package com.yaohun.shitu.api;
import com.yaohun.shitu.StMain;
import com.yaohun.shitu.data.PlayerData;
import com.yaohun.shitu.manage.PlayerManager;
import org.bukkit.SandstoneType;
public class ShituAPI {
public static boolean hasPlayerMaster(String name){
PlayerManager playerManager = StMain.getPlayerManager();
if(playerManager.isMaster(name)){
return true;
}
return false;
}
public static int getMasterApprenticeSize(String name){
PlayerManager playerManager = StMain.getPlayerManager();
PlayerData playerData = playerManager.getPlayerData(name);
if(playerData == null){
return 0;
}
return playerData.getApprenticeSize();
}
public static boolean hasPlayerApprentice(String name){
PlayerManager playerManager = StMain.getPlayerManager();
if(playerManager.isDisciple(name)){
return true;
}
return false;
}
public static String getPlayerMaster(String name){
PlayerManager playerManager = StMain.getPlayerManager();
return playerManager.getMasterName(name);
}
}

View File

@ -0,0 +1,58 @@
package com.yaohun.shitu.config;
import com.yaohun.shitu.StMain;
import org.bukkit.configuration.file.FileConfiguration;
import java.util.ArrayList;
import java.util.List;
public class Config {
public static String pathData = "plugins/AuData/ShiTuData";
public static double reward_recharge_scale;
public static int reward_level_target;
public static List<String> reward_attribute = new ArrayList<>();
public static List<String> reward_commands1 = new ArrayList<>();
public static List<String> reward_commands2 = new ArrayList<>();
public static List<String> reward_commands3 = new ArrayList<>();
public static int disciple_auto_remove_days;
public static int disciple_level_limit;
public static int disciple_join_days;
public static int master_level_limit;
public static int master_join_days;
public static int master_max_disciple_size;
public static int master_remove_after_offline;
public static void reloadConfig(StMain plugin){
plugin.reloadConfig();
plugin.saveConfig();
FileConfiguration config = plugin.getConfig();
loadRewardSettings(config);
loadDiscipleSettings(config);
loadMasterSettings(config);
}
private static void loadRewardSettings(FileConfiguration config){
reward_attribute = config.getStringList("rewards.attributeList");
reward_level_target = config.getInt("rewards.levelTarget",80);
reward_recharge_scale = config.getDouble("rewards.rechargeScale",0.05);
reward_commands1 = config.getStringList("rewards.rewardList_1");
reward_commands2 = config.getStringList("rewards.rewardList_2");
reward_commands3 = config.getStringList("rewards.rewardList_3");
}
private static void loadDiscipleSettings(FileConfiguration config){
disciple_auto_remove_days = config.getInt("disciple.autoRemoveDays",30);
disciple_level_limit = config.getInt("disciple.maxLevelLimit",80);
disciple_join_days = config.getInt("disciple.maxJoinDays",30);
}
private static void loadMasterSettings(FileConfiguration config){
master_level_limit = config.getInt("master.levelLimit",90);
master_join_days = config.getInt("master.joinDaysLimit",30);
master_max_disciple_size = config.getInt("master.maxDiscipleSize",25);
master_remove_after_offline = config.getInt("master.removeAfterOffline",3);
}
}

View File

@ -0,0 +1,118 @@
package com.yaohun.shitu.data;
import com.yaohun.shitu.StMain;
import com.yaohun.shitu.config.Config;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class PlayerData {
private final String playerName;
private final File file;
private final FileConfiguration config;
private double incomeValue;
private long loginTime;
private HashMap<String,Boolean> apprenticeMap = new HashMap<>();
private List<String> challengeGoals = new ArrayList<>();
public PlayerData(String name){
this.playerName = name;
File path = new File(Config.pathData);
if(!path.exists()){
path.mkdirs();
}
this.file = new File(path, name + ".yml");
if(!file.exists()){
try {
file.createNewFile();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
this.config= YamlConfiguration.loadConfiguration(this.file);
loadData();
}
private void loadData(){
this.loginTime = config.getLong("loginTime", System.currentTimeMillis());
this.incomeValue = config.getDouble("incomeValue", 0);
ConfigurationSection section = config.getConfigurationSection("Apprentice");
if(section != null){
for(String key : section.getKeys(false)){
this.apprenticeMap.put(key, section.getBoolean(key));
}
}
}
public String getPlayerName() {
return playerName;
}
public long getLoginTime() {
return loginTime;
}
public double getIncomeValue() {
return incomeValue;
}
public void addIncomeValue(double value){
this.incomeValue += value;
}
public void removeApprentice(String name){
apprenticeMap.remove(name);
}
public List<String> getApprenticeList() {
return new ArrayList<>(apprenticeMap.keySet());
}
public int getApprenticeSize(){
return apprenticeMap.size();
}
public boolean isApprenticeExit(String name){
return apprenticeMap.containsKey(name);
}
public boolean isActiveReward(String name){
if(apprenticeMap.containsKey(name)){
return apprenticeMap.get(name);
}
return false;
}
public void setActivePlayer(String name,boolean isActive){
apprenticeMap.put(name, isActive);
}
public boolean isChallengeGoal(String name){
return challengeGoals.contains(name);
}
public void addChallengeGoal(String name){
challengeGoals.add(name);
}
public void saveData(){
config.set("loginTime", System.currentTimeMillis());
config.set("incomeValue", incomeValue);
config.set("Apprentice",null);
for (String playerName : apprenticeMap.keySet()){
config.set("Apprentice." + playerName, apprenticeMap.get(playerName));
}
try {
config.save(file);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}

View File

@ -0,0 +1,163 @@
package com.yaohun.shitu.gui;
import com.yaohun.onlinereward.api.OnlineAPI;
import com.yaohun.shitu.StMain;
import com.yaohun.shitu.config.Config;
import com.yaohun.shitu.data.PlayerData;
import com.yaohun.shitu.manage.PlayerManager;
import com.yaohun.shitu.util.StackUtil;
import me.Demon.DemonLevels.api.DLevelAPI;
import me.Demon.DemonPlugin.DemonAPI;
import me.Demon.DemonPlugin.data.NbtItem;
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.event.inventory.InventoryCloseEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Deque;
import java.util.HashMap;
import java.util.List;
public class MasterGui implements Listener {
private static String invTitle = "斗魂帝国 - 师徒系统";
public static void openGui(Player player,int page){
String masterName = player.getName();
PlayerManager playerManager = StMain.getPlayerManager();
PlayerData masterData = playerManager.getPlayerData(masterName);
Inventory inv = Bukkit.createInventory(null,54,invTitle);
inv.setItem(2, StackUtil.getApprenticeSize(masterData));
inv.setItem(4,StackUtil.getRewardChest());
inv.setItem(6,StackUtil.getPointsShop());
inv.setItem(0,StackUtil.turnThePage("上一页",page));
inv.setItem(8,StackUtil.turnThePage("下一页",page));
List<String> apprenticeList = masterData.getApprenticeList();
int apprenticesPerPage = 5;
// 当前页起始下标
int startIndex = (page - 1) * apprenticesPerPage;
// 当前页结束下标不含
int endIndex = Math.min(startIndex + apprenticesPerPage, apprenticeList.size());
int slot = 9;
for (int i = startIndex; i < endIndex; i++) {
String name = apprenticeList.get(i);
inv.setItem(slot, StackUtil.getApprentice(name));
inv.setItem(slot + 1, StackUtil.getActiveIncome(masterData, name));
slot += 9;
}
player.openInventory(inv);
}
private final List<String> settlementIncomeD = new ArrayList<>();
@EventHandler
public void onClick(InventoryClickEvent e){
int rawSlot = e.getRawSlot();
Player player = (Player) e.getWhoClicked();
String playerName = player.getName();
Inventory inv = e.getInventory();
if(e.getView().getTitle().contains(invTitle)){
e.setCancelled(true);
if(rawSlot == 4){
// 打开奖励界面
player.closeInventory();
DemonAPI.sendMessage(player,"宗师奖励礼包即将开放.",Sound.ENTITY_VILLAGER_NO);
}
if(rawSlot == 6){
player.closeInventory();
DemonAPI.sendMessage(player,"师徒商店尚未开放.",Sound.ENTITY_VILLAGER_NO);
}
int page = inv.getItem(0).getAmount();
if(rawSlot == 0) {
// 上一页按钮组件
if(page >= 2 && page <= 5){
openGui(player,page - 1);
} else {
DemonAPI.sendMessage(player,"已经是第一页了.",Sound.ENTITY_VILLAGER_NO);
}
}
if(rawSlot == 8) {
// 下一页按钮组件
if(page >= 1 && page <= 4){
openGui(player,page + 1);
} else {
DemonAPI.sendMessage(player,"已经是最后一页了.",Sound.ENTITY_VILLAGER_NO);
}
}
if(rawSlot >= 9 && rawSlot <= 53) {
ItemStack stack = e.getCurrentItem();
if (!DemonAPI.itemIsNull(stack)) {
NbtItem nbt = new NbtItem(stack);
if (!nbt.hasKey("apprenticeName")) {
return;
}
String apprenticeName = nbt.getString("apprenticeName");
PlayerManager playerManager = StMain.getPlayerManager();
PlayerData playerData = playerManager.getPlayerData(playerName);
if(!playerData.isApprenticeExit(apprenticeName)){
player.closeInventory();
DemonAPI.sendMessage(player,"这个玩家貌似已经不是你的徒弟了喔~",Sound.ENTITY_VILLAGER_NO);
return;
}
int onlineTime = OnlineAPI.getTime(apprenticeName);
if(onlineTime < 120){
int valueTime = 120 - onlineTime;
DemonAPI.sendMessage(player,"你的徒弟 §e"+apprenticeName+" §a还需要活跃 §b"+valueTime+"分钟 §a才能结算活跃收益.",Sound.ENTITY_VILLAGER_NO);
return;
}
if(playerData.isActiveReward(apprenticeName)){
DemonAPI.sendMessage(player,"结算失败,每名徒弟每天只能结算一次活跃收益。",Sound.ENTITY_VILLAGER_NO);
return;
}
double defaultBonus = 5;
// 若玩家是贵族6 将获得积分 8点
// 若玩家是贵族8 将获得积分 10点
// 获取当前日期的星期
DayOfWeek currentDayOfWeek = LocalDate.now().getDayOfWeek();
// 如果今天是周一至周五奖金提高30%
if (currentDayOfWeek != DayOfWeek.SATURDAY && currentDayOfWeek != DayOfWeek.SUNDAY) {
defaultBonus *= 1.3;
}
// 增加收益
settlementIncomeD.add(playerName);
playerData.addIncomeValue(defaultBonus);
playerData.setActivePlayer(apprenticeName,true);
DemonAPI.sendMessage(player,"结算成功,获得徒弟活跃收益: §b§l"+String.format("%.2f",defaultBonus)+"师徒币",Sound.ENTITY_EXPERIENCE_ORB_PICKUP);
System.out.println("[师徒] 活跃激励 玩家 <" + playerName + ">获得" + String.format("%.2f",defaultBonus) + "师徒币奖励");
if(!playerData.isChallengeGoal(apprenticeName)){
int levelTarget = Config.reward_level_target;
int level = (int) DLevelAPI.getOffPlayer_Level(apprenticeName);
if(level >= levelTarget) {
playerData.addChallengeGoal(apprenticeName);
// 玩家完成一次挑战目标
System.out.println("[师徒] 成就目标 玩家 <" + playerName + "> 将 " + apprenticeName + " 已带至 Lv."+levelTarget);
Bukkit.broadcastMessage("§c§l★ §a宗师 §e"+playerName+" §a已将他的徒弟 §6"+apprenticeName+" §a培养成了 §r鑄");
}
}
}
}
}
}
@EventHandler
public void onClose(InventoryCloseEvent e){
Player player = (Player) e.getPlayer();
if(e.getView().getTitle().equalsIgnoreCase(invTitle)){
String playerName = player.getName();
if(settlementIncomeD.contains(playerName)){
PlayerManager playerManager = StMain.getPlayerManager();
PlayerData playerData = playerManager.getPlayerData(playerName);
playerData.saveData();
settlementIncomeD.remove(playerName);
}
}
}
}

View File

@ -0,0 +1,45 @@
package com.yaohun.shitu.listsener;
import com.yaohun.shitu.StMain;
import com.yaohun.shitu.config.Config;
import com.yaohun.shitu.data.PlayerData;
import com.yaohun.shitu.manage.PlayerManager;
import com.yaohun.shitu.util.AttributeUtil;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
public class PlayerListener implements Listener {
@EventHandler
public void onJoin(PlayerJoinEvent e){
Player player = e.getPlayer();
String playerName = player.getName();
PlayerManager playerManager = StMain.getPlayerManager();
if(playerManager.isDisciple(playerName)) {
// 计算玩家是否已进入服务器超过60天
int limitDay = Config.disciple_auto_remove_days;
long firstTime = player.getFirstPlayed() + (1000L * 60 * 60 * 24 * limitDay);
long nowTime = System.currentTimeMillis();
if (nowTime >= firstTime) {
// 执行师徒关系解除
String masterName = playerManager.getMasterName(playerName);
PlayerData playerData = playerManager.getPlayerData(masterName);
playerData.removeApprentice(playerName);
System.out.printf("[师徒] 玩家 " + playerName + " 因加入服务器超过<" + limitDay + "天> 已与(" + masterName + ")解除师徒关系.");
} else {
AttributeUtil.addAttribute(player);
}
}
}
@EventHandler
public void onPlayerQuit(PlayerQuitEvent event) {
Player player = event.getPlayer();
AttributeUtil.removeAttribute(player);
PlayerManager playerManager = StMain.getPlayerManager();
playerManager.saveData(player.getName(), true);
}
}

View File

@ -0,0 +1,34 @@
package com.yaohun.shitu.listsener;
import com.yaohun.aurechargedata.event.RechargeEvent;
import com.yaohun.shitu.StMain;
import com.yaohun.shitu.config.Config;
import com.yaohun.shitu.data.PlayerData;
import com.yaohun.shitu.manage.PlayerManager;
import me.Demon.DemonPlugin.DemonAPI;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class RechargeListener implements Listener {
@EventHandler
public void onRecharge(RechargeEvent event) {
if(event.getMoney() >= 30) {
String playerName = event.getPlayerName();
PlayerManager playerManager = StMain.getPlayerManager();
if (playerManager.isDisciple(playerName)) {
String masterName = playerManager.getMasterName(playerName);
PlayerData playerData = playerManager.getPlayerData(masterName);
double pointsValue = Math.round(event.getMoney() * Config.reward_recharge_scale);
playerData.addIncomeValue(pointsValue);
Player mentorPlayer = Bukkit.getPlayerExact(masterName);
System.out.println("[调试 - 师徒] 充值玩家: " + playerName + " 他的师傅<" + masterName + ">获得" + pointsValue + "师徒币奖励");
if (mentorPlayer != null && mentorPlayer.isOnline()) {
DemonAPI.sendMessage(mentorPlayer, "获得徒弟的充值激励收益: §6" + pointsValue + "师徒币");
}
}
}
}
}

View File

@ -0,0 +1,91 @@
package com.yaohun.shitu.manage;
import com.yaohun.shitu.StMain;
import com.yaohun.shitu.config.Config;
import com.yaohun.shitu.data.PlayerData;
import com.yaohun.shitu.util.AttributeUtil;
import me.Demon.DemonPlugin.DemonAPI;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.chat.ComponentBuilder;
import net.md_5.bungee.api.chat.HoverEvent;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.Bukkit;
import org.bukkit.Sound;
import org.bukkit.entity.Player;
import java.util.HashMap;
import java.util.Map;
public class InviteManager {
private static final Map<String, String> inviteMap = new HashMap<>();
public static void sendInvite(Player master,Player target){
String masterName = master.getName();
String targetName = target.getName();
inviteMap.put(targetName,masterName);
DemonAPI.sendMessage(master,"发送成功,已向 §e" + targetName + " §a发出拜师邀请.", Sound.ENTITY_EXPERIENCE_ORB_PICKUP);
DemonAPI.sendMessage(target,"你收到了来自 §e" + masterName + " §a发出的拜师邀请.",Sound.ENTITY_CAT_AMBIENT);
sendClickMessage(target,"§r §a§l【点击同意】 §r", "shitu accept");
sendClickMessage(target,"§r §c§l【点击拒绝】 §r", "shitu deny");
}
private static void sendClickMessage(Player player, String message,String commadns) {
TextComponent tomessage = new TextComponent(message);
tomessage.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/"+commadns));
tomessage.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("§a斗§b魂§c帝§d国").create()));
player.spigot().sendMessage(tomessage);
}
// 玩家处理拜师邀请
public static boolean acceptInvite(Player player) {
String playerName = player.getName();
String masterName = inviteMap.get(playerName);
if(masterName == null){
DemonAPI.sendMessage(player,"没有需要处理的拜师邀请.",Sound.ENTITY_VILLAGER_NO);
return false;
}
PlayerManager playerManager = StMain.getPlayerManager();
if(masterName.equalsIgnoreCase(playerName)){
DemonAPI.sendMessage(player,"无法同意自己的拜师请求.",Sound.ENTITY_VILLAGER_NO);
return false;
}
if(playerManager.isDisciple(playerName)){
DemonAPI.sendMessage(player,"接受失败,你已经有师傅了.",Sound.ENTITY_VILLAGER_NO);
return false;
}
PlayerData masterData = playerManager.getPlayerData(masterName);
if(masterData.getApprenticeSize() >= Config.master_max_disciple_size){
DemonAPI.sendMessage(player,"接受失败,对方已收徒弟数量达到上限.",Sound.ENTITY_VILLAGER_NO);
return false;
}
masterData.setActivePlayer(playerName,true);
masterData.saveData();
playerManager.setApprenticeMap(playerName,masterName);
DemonAPI.sendMessage(player,"恭喜你已经成为 §e"+masterName+" §a的徒弟之一.",Sound.ENTITY_EXPERIENCE_ORB_PICKUP);
AttributeUtil.addAttribute(player);
Player master = Bukkit.getPlayer(masterName);
if(master != null && master.isOnline()){
DemonAPI.sendMessage(master,"玩家 §e"+playerName+" §a已同意你的拜师邀请.",Sound.ENTITY_EXPERIENCE_ORB_PICKUP);
}
return true;
}
public static boolean denyInvite(Player player) {
String playerName = player.getName();
String masterName = inviteMap.get(playerName);
if(masterName == null){
DemonAPI.sendMessage(player,"没有需要处理的拜师邀请.",Sound.ENTITY_VILLAGER_NO);
return false;
}
DemonAPI.sendMessage(player,"你已拒绝 §e"+masterName+" §a的拜师邀请.",Sound.ENTITY_BLAZE_DEATH);
Player master = Bukkit.getPlayer(masterName);
if(master != null && master.isOnline()){
DemonAPI.sendMessage(master,"玩家 §e"+playerName+" §a已拒绝你的拜师邀请.",Sound.ENTITY_BLAZE_DEATH);
}
return true;
}
}

View File

@ -0,0 +1,89 @@
package com.yaohun.shitu.manage;
import com.yaohun.shitu.StMain;
import com.yaohun.shitu.config.Config;
import com.yaohun.shitu.data.PlayerData;
import me.Demon.DemonPlugin.DemonAPI;
import org.bukkit.Bukkit;
import org.serverct.ersha.jd.Ha;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class PlayerManager {
private HashMap<String, PlayerData> playerDatas = new HashMap<>();
private HashMap<String ,String > apprenticeMap = new HashMap<>();
public PlayerManager(){
// 载入所有师傅的数据
File folder = new File(Config.pathData);
if (!folder.exists() || !folder.isDirectory()) {
return;
}
List<File> ymlFiles = new ArrayList<>();
DemonAPI.collectYmlFiles(folder, ymlFiles);
if (ymlFiles .isEmpty()) {
return;
}
// 逐个加载文件并提取 statistics 内容
for (File file : ymlFiles) {
String fileName = file.getName();
String playerName = fileName.substring(0, fileName.length() - 4);
playerDatas.put(playerName, new PlayerData(playerName));
}
for (PlayerData playerData : playerDatas.values()){
List<String> stringList = playerData.getApprenticeList();
for (String name : stringList) {
apprenticeMap.put(name, playerData.getPlayerName());
}
}
Bukkit.getConsoleSender().sendMessage("§6[师徒系统] §7已出师玩家: §f"+playerDatas.size()+"");
Bukkit.getConsoleSender().sendMessage("§6[师徒系统] §7已拜师玩家: §f"+apprenticeMap.size()+"");
}
public void createData(String masterName){
PlayerData playerData = new PlayerData(masterName);
playerDatas.put(masterName, playerData);
playerData.saveData();
}
public PlayerData getPlayerData(String masterName) {
return playerDatas.get(masterName);
}
public void saveData(String playerName, boolean unload) {
if (!playerDatas.containsKey(playerName)) {
return;
}
PlayerData playerData = playerDatas.remove(playerName);
playerData.saveData();
if (unload) {
playerDatas.remove(playerName);
}
}
public void saveDataAll() {
for(PlayerData playerData : playerDatas.values()){
playerData.saveData();
}
}
public boolean isMaster(String name){
return playerDatas.containsKey(name);
}
public void setApprenticeMap(String name, String mentorName){
apprenticeMap.put(name, mentorName);
}
public boolean isDisciple(String name){
return apprenticeMap.containsKey(name);
}
public String getMasterName(String name){
return apprenticeMap.get(name);
}
}

View File

@ -0,0 +1,37 @@
package com.yaohun.shitu.util;
import com.yaohun.shitu.StMain;
import com.yaohun.shitu.config.Config;
import com.yaohun.shitu.manage.PlayerManager;
import org.bukkit.entity.Player;
import org.serverct.ersha.jd.AttributeAPI;
import org.serverct.ersha.jd.attribute.AttributeData;
import java.util.Arrays;
public class AttributeUtil {
private static String ATTRIBUTE_SOURCE_NAME = "aumaster_exp";
public static void checkPlayer(Player player) {
AttributeData attributeData = AttributeAPI.getAttrData(player);
PlayerManager playerManager = StMain.getPlayerManager();
boolean hasAttribute = attributeData.getApiAttributeList(ATTRIBUTE_SOURCE_NAME) != null;
if (playerManager.isDisciple(player.getName())) {
if (!hasAttribute) {
addAttribute(player);
}
} else if (hasAttribute) {
removeAttribute(player);
}
}
public static void addAttribute(Player player) {
AttributeAPI.addAttribute(player, ATTRIBUTE_SOURCE_NAME, Config.reward_attribute);
}
public static void removeAttribute(Player player) {
AttributeAPI.deleteAttribute(player, ATTRIBUTE_SOURCE_NAME);
}
}

View File

@ -0,0 +1,69 @@
package com.yaohun.shitu.util;
import com.yaohun.shitu.config.Config;
import com.yaohun.shitu.data.PlayerData;
import me.Demon.DemonPlugin.DemonAPI;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.serverct.ersha.jd.Ya;
import org.yaml.snakeyaml.Yaml;
import java.io.File;
import java.text.DecimalFormat;
import java.util.*;
import java.util.stream.Collectors;
public class RankUtil {
public static void checkAcceptingApprenticesTop(CommandSender sender){
File folder = new File(Config.pathData);
if (!folder.exists() || !folder.isDirectory()) {
sender.sendMessage("[师徒] 还没有玩家进行出师");
return;
}
List<File> ymlFiles = new ArrayList<>();
DemonAPI.collectYmlFiles(folder, ymlFiles);
if (ymlFiles .isEmpty()) {
sender.sendMessage("[师徒] 还没有玩家进行出师");
return;
}
HashMap<String,Double> valueMap = new HashMap<>();
HashMap<String,Integer> hashMap = new HashMap<>();
// 逐个加载文件并提取 statistics 内容
for (File file : ymlFiles) {
String fileName = file.getName();
String playerName = fileName.substring(0, fileName.length() - 4);
FileConfiguration config = YamlConfiguration.loadConfiguration(file);
double incomeValue = config.getDouble("incomeValue");
ConfigurationSection section = config.getConfigurationSection("Apprentice");
if(section == null){
continue;
}
int amount = section.getKeys(false).size();
hashMap.put(playerName,amount);
valueMap.put(playerName,incomeValue);
}
LinkedHashMap<String, Integer> sortedMap = hashMap.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(e1, e2) -> e1,
LinkedHashMap::new
));
sender.sendMessage("");
sender.sendMessage("§e§l★ §a师徒激励计划-收益排行榜");
int rank = 1;
for (String playerName : sortedMap.keySet()){
double value = Math.round(valueMap.get(playerName) / 10);
int amount = sortedMap.get(playerName);
sender.sendMessage("§a§l★ §7第 §e" + rank + " §7名: §e" + playerName + " §f收益: §6"+new DecimalFormat(",###.##").format(value)+"元 §f徒弟: §e"+amount+"");
rank++;
}
sender.sendMessage("");
}
}

View File

@ -0,0 +1,113 @@
package com.yaohun.shitu.util;
import com.yaohun.aurechargedata.api.RechargeAPI;
import com.yaohun.aurechargedata.util.TimeType;
import com.yaohun.demonlogintime.api.LoginTimeAPI;
import com.yaohun.onlinereward.api.OnlineAPI;
import com.yaohun.shitu.data.PlayerData;
import me.Demon.DemonLevels.api.DLevelAPI;
import me.Demon.DemonPlugin.DemonAPI;
import me.Demon.DemonPlugin.data.NbtItem;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import java.util.ArrayList;
import java.util.List;
public class StackUtil {
public static ItemStack getApprenticeSize(PlayerData playerData){
ItemStack stack = new ItemStack(Material.DIAMOND);
ItemMeta meta = stack.getItemMeta();
int value = (int) playerData.getIncomeValue() / 10;
meta.setDisplayName("§l"+value);
List<String> lore = new ArrayList<>();
lore.add("§l"+playerData.getApprenticeSize());
meta.setLore(lore);
stack.setItemMeta(meta);
return stack;
}
public static ItemStack getRewardChest(){
ItemStack stack = new ItemStack(Material.CHEST);
ItemMeta meta = stack.getItemMeta();
meta.setDisplayName("Reward Chest");
stack.setItemMeta(meta);
return stack;
}
public static ItemStack getPointsShop(){
ItemStack stack = new ItemStack(Material.ENDER_CHEST);
ItemMeta meta = stack.getItemMeta();
meta.setDisplayName("Points Shop");
stack.setItemMeta(meta);
return stack;
}
public static ItemStack turnThePage(String name,int page){
ItemStack stack = new ItemStack(Material.ARROW);
stack.setAmount(page);
ItemMeta meta = stack.getItemMeta();
meta.setDisplayName(name);
stack.setItemMeta(meta);
return stack;
}
public static ItemStack getApprentice(String name){
ItemStack stack = new ItemStack(Material.GOLD_SWORD);
ItemMeta meta = stack.getItemMeta();
meta.setDisplayName("§l"+name);
List<String> lore = new ArrayList<>();
lore.add("§a§l★§7名称: §6§l"+name);
int level = (int) DLevelAPI.getOffPlayer_Level(name);
lore.add("§a§l★§7等级: §dLv."+level);
int minute = OnlineAPI.getTime(name);
lore.add("§a§l★§7今日活跃: §a"+minute+"分钟");
int recharge = RechargeAPI.getRechargeData(name, TimeType.MONTHLY);
lore.add("§a§l★§7本月储值: §b"+recharge+"软妹币");
long loginTime = LoginTimeAPI.getLoginTime(name);
lore.add("§a§l★§7最后上线: §5"+ DemonAPI.LongToStringData(loginTime,"yyyy年MM月dd日 HH:mm"));
meta.setLore(lore);
stack.setItemMeta(meta);
NbtItem nbtItem = new NbtItem(stack);
if(level >= 90){
nbtItem.setString("bottomMap","Tudi_1");
} else if(level >= 60){
nbtItem.setString("bottomMap","Tudi_2");
} else {
nbtItem.setString("bottomMap","Tudi_3");
}
return nbtItem.getItem();
}
public static ItemStack getActiveIncome(PlayerData playerData,String name){
int minute = OnlineAPI.getTime(name);
ItemStack stack = new ItemStack(Material.WATCH);
double progress = (double) minute / 120;
if(progress >= 1){
progress = 1;
} else {
progress = Math.round(progress * 100.0) / 100.0;
}
// 若奖励已领取则设置为2
if(playerData.isActiveReward(name)) {
stack.setAmount(2);
} else {
stack.setAmount(1);
}
ItemMeta meta = stack.getItemMeta();
meta.setDisplayName(String.valueOf(progress));
List<String> lore = new ArrayList<>();
lore.add("§a§l★§7名称: §6§l"+name);
int totalMinute = OnlineAPI.getTimeTotal(name);
lore.add("§a§l★§7今日活跃: §a"+minute+"分钟");
lore.add("§a§l★§7总计活跃: §c"+totalMinute+"分钟");
meta.setLore(lore);
stack.setItemMeta(meta);
NbtItem nbtItem = new NbtItem(stack);
nbtItem.setString("apprenticeName", name);
return nbtItem.getItem();
}
}

View File

@ -0,0 +1,31 @@
disciple:
# 徒弟入服超过 N 天后自动解除关系
autoRemoveDays: 30
# 玩家等级 ≤ 该值时才允许拜师
maxLevelLimit: 80
# 玩家入服时间 ≤ N 天(单位:天)才允许拜师
maxJoinDays: 30
master:
# 玩家等级 ≥ 该值时才可收徒
levelLimit: 90
# 玩家注册时间 ≥ N 天时才可收徒
joinDaysLimit: 30
# 每位师傅最多拥有的徒弟数量
maxDiscipleSize: 25
# 徒弟离线超过 3 天后,师傅可解除关系
removeAfterOffline: 3
rewards:
# 徒弟单笔充值超过30元师傅可以获得返利 X %
rechargeScale: 0.05
# 徒弟达到 X 级后则算完成1个成就目标
levelTarget: 80
# 徒弟上线时可获得的属性加成
attributeList:
- '经验加成: 15%'
# 当徒弟达到指定人数要求后给予师傅的奖励命令组
rewardList_1:
- "eco give %player% 100"
rewardList_2:
- "eco give %player% 100"
rewardList_3:
- "eco give %player% 100"

View File

@ -0,0 +1,7 @@
name: DemonShiTu
main: com.yaohun.shitu.StMain
version: 3.0.2
commands:
shitu:
aliases: [st]
stadmin: