commit 1862217941aed95dedf6a9fa635c8470ed204ef9
Author: yhy <1763917516@qq.com>
Date: Tue Jun 2 14:41:11 2026 +0800
初始化项目
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..6d0414d
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,16 @@
+target/
+out/
+lib/
+libs/
+.vscode/
+.codex/
+.idea/
+*.iml
+*.class
+*.log
+logs/
+*.db
+*.sqlite
+*.sqlite3
+.DS_Store
+Thumbs.db
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..c202c0a
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,38 @@
+
+
+ 4.0.0
+
+ org.example
+ AuOnlineReward
+ 1.0-SNAPSHOT
+
+
+ 8
+ 8
+ UTF-8
+
+
+
+
+
+ public-rpg
+ https://repo.aurora-pixels.com/repository/public-rpg/
+
+
+
+
+
+ org.spigotmc
+ spigot-api
+ 1.12.2
+
+
+ me.Demon.DemonPlugin
+ DemonAPI
+ 2.3.3
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/com/yaohun/onlinereward/AuOnlineReward.java b/src/main/java/com/yaohun/onlinereward/AuOnlineReward.java
new file mode 100644
index 0000000..539e80a
--- /dev/null
+++ b/src/main/java/com/yaohun/onlinereward/AuOnlineReward.java
@@ -0,0 +1,159 @@
+package com.yaohun.onlinereward;
+
+import com.yaohun.onlinereward.config.Config;
+import com.yaohun.onlinereward.data.PlayerData;
+import com.yaohun.onlinereward.gui.OnlineGui;
+import com.yaohun.onlinereward.listener.GuiClickListener;
+import com.yaohun.onlinereward.listener.PlayerListener;
+import com.yaohun.onlinereward.manage.PlayerManager;
+import com.yaohun.onlinereward.manage.TimeType;
+import com.yaohun.onlinereward.util.MessageUtil;
+import com.yaohun.onlinereward.util.TimeCheckUtil;
+import me.Demon.DemonPlugin.DemonAPI;
+import me.Demon.DemonPlugin.Util.DataRefreshUtil;
+import me.Demon.DemonPlugin.Util.Ranking;
+import me.Demon.DemonPlugin.settings.RefreshData;
+import org.bukkit.Bukkit;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.bukkit.plugin.java.JavaPlugin;
+
+import java.util.HashMap;
+
+public class AuOnlineReward extends JavaPlugin {
+
+ private static AuOnlineReward instance;
+ private static PlayerManager playerManager;
+
+ @Override
+ public void onEnable() {
+ instance = this;
+ saveDefaultConfig();
+ Config.reloadConfig(this,false);
+ MessageUtil.init(this);
+ playerManager = new PlayerManager();
+ getServer().getPluginManager().registerEvents(new GuiClickListener(playerManager), this);
+ getServer().getPluginManager().registerEvents(new PlayerListener(playerManager), this);
+
+ DataRefreshUtil.createRefreshDataRecord("OnlineDaily");
+ DataRefreshUtil.createRefreshDataRecord("OnlineMonth");
+
+ Bukkit.getScheduler().runTaskLater(this, this::startOnlineTimeTask, 20L * 5);
+ Bukkit.getScheduler().runTaskLater(this, () -> {
+ getPlayerManager().loadOnlineAllPlayer();
+ }, 20L * 10);
+
+ }
+
+ public void startOnlineTimeTask() {
+ Bukkit.getScheduler().runTaskTimerAsynchronously(this, () -> {
+ RefreshData refreshData = DataRefreshUtil.getSetting("OnlineDaily");
+ if(refreshData != null && !refreshData.isSameDayAsRecord()){
+ refreshData.setRecordTime(System.currentTimeMillis());
+ DataRefreshUtil.SaveRefreshDataRecord(refreshData);
+ // 每日数据刷新处理
+ getPlayerManager().clearAllPlayerData();
+ return;
+ }
+ if(TimeCheckUtil.isMonthlySettleAccounts()){
+ getPlayerManager().clearAllPlayerData();
+ return;
+ }
+ HashMap dataMap = getPlayerManager().getPlayerDataMap();
+ if(!dataMap.isEmpty()) {
+ for (PlayerData playerData : dataMap.values()) {
+ playerData.updataOnlineData();
+ }
+ }
+ }, 20L * 5, 1200L);
+ }
+
+ @Override
+ public void onDisable() {
+ getPlayerManager().saveAllPlayerData();
+ }
+
+ @Override
+ public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ if(args.length == 1 && args[0].equalsIgnoreCase("open")){
+ OnlineGui.OpenGui((Player) sender);
+ return true;
+ }
+ if(!sender.isOp()) {
+ return true;
+ }
+ if(args.length==0){
+ sender.sendMessage("");
+ sender.sendMessage("§e------- ======= §6在线福利 §e======= -------");
+ sender.sendMessage("§2/"+label+" open §f- §2打开界面");
+ sender.sendMessage("§2/"+label+" topDay §f- §2获取今日在线排行");
+ sender.sendMessage("§2/"+label+" info §e[玩家] §f- §2查看玩家数据");
+ sender.sendMessage("§2/"+label+" dayrefresh §f- §2刷新每日数据");
+ sender.sendMessage("§2/"+label+" dayrefresh §e[玩家] §f- §2刷新数据");
+ sender.sendMessage("§2/"+label+" reload §f- §2重载配置文件");
+ sender.sendMessage("§e------- ======= §6在线福利 §e======= -------");
+ sender.sendMessage("");
+ return true;
+ }
+ String prefix = "§f[§c在线§f] §a";
+ if(args.length==1 && args[0].equalsIgnoreCase("reload")){
+ MessageUtil.init(this);
+ Config.reloadConfig(this,true);
+ sender.sendMessage(prefix+"配置文件已重载.");
+ return true;
+ }
+ if("dayrefresh".equalsIgnoreCase(args[0])){
+ if(args.length == 1) {
+ getPlayerManager().refreshLocalPlayerData(TimeType.DAILY);
+ sender.sendMessage("§f[§c在线§f] §a每日数据已清理.");
+ return true;
+ }
+ if(args.length == 2){
+ String name = args[1];
+ getPlayerManager().refreshLocalPlayerData(name,TimeType.DAILY);
+ sender.sendMessage("§f[§c在线§f] §a玩家 §e"+name+" §a每日数据已清理.");
+ }
+ return true;
+ }
+ if("info".equalsIgnoreCase(args[0]) || "look".equalsIgnoreCase(args[0])){
+ String playerName = sender.getName();
+ if(args.length == 2){
+ playerName = args[1];
+ }
+ PlayerData playerData = getPlayerManager().getPlayerData(playerName);
+ sender.sendMessage("§r累积在线: §b"+ playerData.totalOnline+"秒");
+ sender.sendMessage("§r本月在线: §b"+ playerData.monthOnline+"秒");
+ sender.sendMessage("§r今日在线: §b"+ playerData.todayOnline+"秒");
+ sender.sendMessage("§r总计满勤打卡: §b"+ playerData.totalSignAmount+"次");
+ sender.sendMessage("§r满勤打卡: §b"+ playerData.signAmount+"次");
+ sender.sendMessage("§r最后一次上线时间: §e"+ DemonAPI.LongToStringData(playerData.offlineTime,"yyyy-MM-dd HH:mm"));
+ return true;
+ }
+ if("top".equalsIgnoreCase(args[0]) || "topDay".equalsIgnoreCase(args[0])){
+ HashMap hashMap = new HashMap<>();
+ for (PlayerData playerData : getPlayerManager().getPlayerDataMap().values()) {
+ hashMap.put(playerData.getPlayerName(),playerData.todayOnline);
+ }
+ Ranking ranking = new Ranking(hashMap);
+ sender.sendMessage(" ");
+ sender.sendMessage("§e§l★ §a"+DemonAPI.getTime("yyyy-MM-dd")+"在线排行榜 §7(不定时更新数据)");
+ for (int rank = 1; rank < 15; rank++) {
+ String rankingPlayer = ranking.getRankingPlayer(rank, "name");
+ String onlineTime = ranking.getRankingPlayer(rank, "value");
+ sender.sendMessage("§a§l★ §7第 §e" + rank + " §7名: §e" + rankingPlayer + "§7累积在线: §e"+onlineTime+"分钟");
+ }
+ sender.sendMessage(" ");
+ return true;
+ }
+ return false;
+ }
+
+ public static AuOnlineReward inst() {
+ return instance;
+ }
+
+ public static PlayerManager getPlayerManager() {
+ return playerManager;
+ }
+}
diff --git a/src/main/java/com/yaohun/onlinereward/api/OnlineAPI.java b/src/main/java/com/yaohun/onlinereward/api/OnlineAPI.java
new file mode 100644
index 0000000..5c5799a
--- /dev/null
+++ b/src/main/java/com/yaohun/onlinereward/api/OnlineAPI.java
@@ -0,0 +1,39 @@
+package com.yaohun.onlinereward.api;
+
+import com.yaohun.onlinereward.AuOnlineReward;
+import com.yaohun.onlinereward.data.PlayerData;
+import com.yaohun.onlinereward.manage.PlayerManager;
+
+public class OnlineAPI {
+/**
+ *
+ public int totalOnline; // 单位: 秒
+ public int monthOnline; // 单位: 秒
+ public int todayOnline; // 单位: 秒
+
+ **/
+ // 获取玩家今日在线
+ public static int getTime(String playerName){
+ return getTimeMinute(playerName,"default");
+ }
+
+ public static int getTimeMonth(String playerName){
+ return getTimeMinute(playerName,"month");
+ }
+
+ public static int getTimeTotal(String playerName){
+ return getTimeMinute(playerName,"total");
+ }
+
+
+ public static int getTimeMinute(String playerName,String type){
+ PlayerManager playerManager = AuOnlineReward.getPlayerManager();
+ PlayerData playerData = playerManager.getPlayerData(playerName);
+ if("total".equalsIgnoreCase(type)){
+ return playerData.totalOnline / 60;
+ } else if("month".equalsIgnoreCase(type)){
+ return playerData.monthOnline / 60;
+ }
+ return playerData.todayOnline / 60;
+ }
+}
diff --git a/src/main/java/com/yaohun/onlinereward/config/Config.java b/src/main/java/com/yaohun/onlinereward/config/Config.java
new file mode 100644
index 0000000..997ac64
--- /dev/null
+++ b/src/main/java/com/yaohun/onlinereward/config/Config.java
@@ -0,0 +1,39 @@
+package com.yaohun.onlinereward.config;
+
+import com.yaohun.onlinereward.AuOnlineReward;
+import com.yaohun.onlinereward.data.OnlineData;
+import org.bukkit.configuration.ConfigurationSection;
+import org.bukkit.configuration.file.FileConfiguration;
+
+import java.util.HashMap;
+
+public class Config {
+
+ private static HashMap onlineDataMap = new HashMap<>();
+
+ public static void reloadConfig(AuOnlineReward plugin,boolean reload){
+ if(reload){
+ plugin.reloadConfig();
+ plugin.saveConfig();
+ }
+ FileConfiguration config = plugin.getConfig();
+ loadRewardData(config);
+ }
+
+ private static void loadRewardData(FileConfiguration config){
+ ConfigurationSection section = config.getConfigurationSection("RewardData");
+ if(section != null) {
+ for (String key : section.getKeys(false)) {
+ onlineDataMap.put(key, new OnlineData(key, section));
+ }
+ }
+ }
+
+ public static HashMap getOnlineDataMap() {
+ return onlineDataMap;
+ }
+
+ public static OnlineData getOnlineData(String key) {
+ return onlineDataMap.get(key);
+ }
+}
diff --git a/src/main/java/com/yaohun/onlinereward/data/OnlineData.java b/src/main/java/com/yaohun/onlinereward/data/OnlineData.java
new file mode 100644
index 0000000..2f57738
--- /dev/null
+++ b/src/main/java/com/yaohun/onlinereward/data/OnlineData.java
@@ -0,0 +1,130 @@
+package com.yaohun.onlinereward.data;
+
+import com.yaohun.onlinereward.AuOnlineReward;
+import com.yaohun.onlinereward.util.MessageUtil;
+import me.Demon.DemonPlugin.DemonAPI;
+import me.Demon.DemonPlugin.data.NbtItem;
+import org.bukkit.Bukkit;
+import org.bukkit.configuration.ConfigurationSection;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.ItemMeta;
+
+import java.util.List;
+
+public class OnlineData {
+
+ private String rewardKey;
+ public int slot;
+ public int needOnline;
+ public int needOnlineTime;
+ private ItemStack itemStack;
+ private List commands;
+
+ public OnlineData(String rewardKey, ConfigurationSection section){
+ this.rewardKey = rewardKey;
+ this.slot = section.getInt(rewardKey+".slot",10);
+ this.needOnline = section.getInt(rewardKey+".needOnline",30);
+ this.needOnlineTime = section.getInt(rewardKey+".needOnlineTime",60);
+ this.itemStack = section.getItemStack(rewardKey+".itemStack");
+ if(!DemonAPI.itemIsNull(this.itemStack)){
+ NbtItem nbtItem = new NbtItem(itemStack);
+ nbtItem.setString("onlineKey", rewardKey);
+ this.itemStack = nbtItem.getItem();
+ }
+ this.commands = section.getStringList(rewardKey+".commands");
+ }
+
+ public String getRewardKey() {
+ return rewardKey;
+ }
+
+ public boolean isReceivingConditions(long collectionTime){
+ // 获取当前时间
+ long now = System.currentTimeMillis();
+ // 获取时间差 当前时间 - 上一次领取奖励时间 = 时间差额
+ long lastTime = now - collectionTime;
+ // 是否已满足领取条件
+ if(lastTime >= this.needOnline * 1000L){
+ return true;
+ }
+ return false;
+ }
+
+ public ItemStack getItemStack(PlayerData playerData) {
+ if(this.rewardKey.contains("MinuteReward_")) {
+ long collectionTime = playerData.collectionTime;
+ ItemStack stack = itemStack.clone();
+ ItemMeta meta = itemStack.getItemMeta();
+ List lore = meta.getLore();
+ for (int i = 0; i < lore.size(); i++) {
+ String s = lore.get(i);
+ if (s.contains("%time%")) {
+ if(playerData.isPlayerMinuteRewardExit(this.rewardKey)) {
+ lore.set(i, MessageUtil.getLanguage("Received"));
+ break;
+ }
+ if (!playerData.currentReward.equalsIgnoreCase(this.rewardKey)) {
+ lore.set(i, MessageUtil.getLanguage("Not-Started"));
+ break;
+ }
+ if(isReceivingConditions(collectionTime)){
+ lore.set(i, MessageUtil.getLanguage("Pending"));
+ } else {
+ long minute = needOnline - ((System.currentTimeMillis() - playerData.collectionTime) / 1000);
+ lore.set(i, s.replace("%time%", minute+"秒"));
+ }
+ break;
+ }
+ }
+ meta.setLore(lore);
+ stack.setItemMeta(meta);
+ // 若满足要求则添加nbt信息 方便直接领取奖励
+ if(isReceivingConditions(collectionTime)){
+ NbtItem nbtItem = new NbtItem(stack);
+ nbtItem.setString("onlineKey", this.rewardKey);
+ return nbtItem.getItem();
+ }
+ return stack;
+ } else {
+ ItemStack stack = itemStack.clone();
+ ItemMeta meta = itemStack.getItemMeta();
+ List lore = meta.getLore();
+ for (int i = 0; i < lore.size(); i++) {
+ String s = lore.get(i);
+ if(s.contains("%amounut%")){
+ if(playerData.isPlayerPermanentRewardExit(this.rewardKey)){
+ lore.set(i, MessageUtil.getLanguage("Received"));
+ break;
+ }
+ int signAmount = playerData.signAmount;
+ if(signAmount >= this.needOnline){
+ lore.set(i, MessageUtil.getLanguage("Pending"));
+ } else {
+ lore.set(i, s.replace("%amounut%", (this.needOnline - signAmount)+"次"));
+ }
+ break;
+ }
+ }
+ meta.setLore(lore);
+ stack.setItemMeta(meta);
+ NbtItem nbtItem = new NbtItem(stack);
+ nbtItem.setString("rewardKey", this.rewardKey);
+ return nbtItem.getItem();
+ }
+ }
+
+ public void carryOut(Player player){
+ String playerName = player.getName();
+ String itemName = this.itemStack.getItemMeta().getDisplayName();
+ for (String cmd : commands) {
+ cmd = cmd.replace("%player%", playerName);
+ cmd = cmd.replace("%itemName%", itemName);
+ if (cmd.contains("msg:")) {
+ player.sendMessage(cmd.replace("msg:","").replace("&","§"));
+ } else {
+ Bukkit.dispatchCommand(Bukkit.getConsoleSender(), cmd);
+ }
+ }
+ }
+}
diff --git a/src/main/java/com/yaohun/onlinereward/data/PlayerData.java b/src/main/java/com/yaohun/onlinereward/data/PlayerData.java
new file mode 100644
index 0000000..1da6e9a
--- /dev/null
+++ b/src/main/java/com/yaohun/onlinereward/data/PlayerData.java
@@ -0,0 +1,140 @@
+package com.yaohun.onlinereward.data;
+
+import org.bukkit.Bukkit;
+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;
+import java.util.Locale;
+
+public class PlayerData {
+
+ private String playerName;
+ public int totalOnline; // 单位: 秒
+ public int monthOnline; // 单位: 秒
+ public int todayOnline; // 单位: 秒
+ public int totalSignAmount;
+ public int signAmount;
+ public String currentReward;
+ public long collectionTime;
+ public long loginTime = System.currentTimeMillis();
+ public long offlineTime;
+ private List receivedList;
+ private List permanentReceivedList;
+ private File file;
+ private FileConfiguration configuration;
+
+ public PlayerData(String playerName) {
+ this.playerName = playerName;
+ this.file = new File("plugins/AuData/AuOnlineReward", playerName + ".yml");
+ if (!file.getParentFile().exists()) {
+ this.file.getParentFile().mkdirs();
+ this.configuration = YamlConfiguration.loadConfiguration(file);
+ } else {
+ this.configuration = YamlConfiguration.loadConfiguration(file);
+ }
+ String path = "OnlineData.";
+ this.totalOnline = this.configuration.getInt(path+"totalOnline",60 * 60 *5);
+ this.monthOnline = this.configuration.getInt(path+"monthOnline",60 * 60 *3);
+ this.todayOnline = this.configuration.getInt(path+"todayOnline",0);
+ this.totalSignAmount = this.configuration.getInt(path+"totalSign",0);
+ this.signAmount = this.configuration.getInt(path+"signAmount",0);
+ this.currentReward = this.configuration.getString(path+"currentReward","MinuteReward_30");
+ this.collectionTime = this.configuration.getLong(path+"collectionTime",System.currentTimeMillis() - (1000 * 60 * 30));
+ this.offlineTime = this.configuration.getLong(path+"offlineTime",System.currentTimeMillis());
+ this.receivedList = this.configuration.getStringList(path+"receivedList");
+ this.permanentReceivedList = this.configuration.getStringList(path+"permanentReceived");
+ }
+
+ public void updataLoginTime() {
+ this.loginTime = System.currentTimeMillis();
+ }
+
+ public void updataOnlineData(){
+ // 获取当前时间 - 上线时间
+ long valueLong = (System.currentTimeMillis() - this.loginTime) / 1000;
+ this.loginTime = System.currentTimeMillis();
+ this.todayOnline += (int) valueLong;
+ this.totalOnline += (int) valueLong;
+ this.monthOnline += (int) valueLong;
+ }
+
+ public void SavePlayerData() {
+ this.configuration.set("OnlineData.todayOnline", this.todayOnline);
+ this.configuration.set("OnlineData.totalOnline", this.totalOnline);
+ this.configuration.set("OnlineData.monthOnline", this.monthOnline);
+ this.configuration.set("OnlineData.totalSign", this.totalSignAmount);
+ this.configuration.set("OnlineData.signAmount", this.signAmount);
+ this.configuration.set("OnlineData.currentReward", this.currentReward);
+ this.configuration.set("OnlineData.collectionTime", this.collectionTime);
+ this.configuration.set("OnlineData.offlineTime", this.offlineTime);
+ this.configuration.set("OnlineData.receivedList", this.receivedList);
+ this.configuration.set("OnlineData.permanentReceived", this.permanentReceivedList);
+ try {
+ this.configuration.save(this.file);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public String getPlayerName() {
+ return playerName;
+ }
+
+ public void setOfflineTime(long offlineTime) {
+ this.offlineTime = offlineTime;
+ }
+
+ public boolean isPlayerMinuteRewardExit(String rewardKey) {
+ if(this.receivedList.contains(rewardKey)){
+ return true;
+ }
+ return false;
+ }
+
+ public void addPlayerMinuteReward(String rewardKey) {
+ this.receivedList.add(rewardKey);
+ }
+
+
+ public boolean isPlayerPermanentRewardExit(String rewardKey) {
+ if(this.permanentReceivedList.contains(rewardKey)){
+ return true;
+ }
+ return false;
+ }
+
+ public void addPlayerPermanentReward(String rewardKey) {
+ this.permanentReceivedList.add(rewardKey);
+ }
+
+ public void setplayerPermanentReward(List rewardList) {
+ this.permanentReceivedList = rewardList;
+ }
+
+ public void setCurrentReward(){
+ if(this.currentReward.equalsIgnoreCase("MinuteReward_30")){
+ this.currentReward = "MinuteReward_60";
+ } else if(this.currentReward.equalsIgnoreCase("MinuteReward_60")){
+ this.currentReward = "MinuteReward_120";
+ } else if(this.currentReward.equalsIgnoreCase("MinuteReward_120")){
+ this.currentReward = "MinuteReward_240";
+ } else if(this.currentReward.equalsIgnoreCase("MinuteReward_240")){
+ this.currentReward = "MinuteReward_MAX";
+ }
+ }
+
+ public void refreshDailyData(){
+ this.todayOnline = 0;
+ this.currentReward = "MinuteReward_30";
+ this.collectionTime = System.currentTimeMillis();
+ this.receivedList = new ArrayList<>();
+ }
+ public void refreshMonthlyData(){
+ this.monthOnline = 0;
+ }
+}
diff --git a/src/main/java/com/yaohun/onlinereward/event/OnlineRewardEvent.java b/src/main/java/com/yaohun/onlinereward/event/OnlineRewardEvent.java
new file mode 100644
index 0000000..8c17c46
--- /dev/null
+++ b/src/main/java/com/yaohun/onlinereward/event/OnlineRewardEvent.java
@@ -0,0 +1,40 @@
+package com.yaohun.onlinereward.event;
+
+import com.yaohun.onlinereward.data.OnlineData;
+import org.bukkit.entity.Player;
+import org.bukkit.event.Event;
+import org.bukkit.event.HandlerList;
+
+public class OnlineRewardEvent extends Event {
+
+ private static HandlerList handlers = new HandlerList();
+
+ private Player player;
+ private OnlineData onlineData;
+
+ @Override
+ public HandlerList getHandlers() {
+ return handlers;
+ }
+
+ public static HandlerList getHandlerList() {
+ return handlers;
+ }
+
+ public OnlineRewardEvent(Player player, OnlineData rewardTime) {
+ this.player = player;
+ this.onlineData = rewardTime;
+ }
+
+ public Player getPlayer() {
+ return player;
+ }
+
+ public String getPlayerName() {
+ return player.getName();
+ }
+
+ public OnlineData getOnlineData() {
+ return onlineData;
+ }
+}
diff --git a/src/main/java/com/yaohun/onlinereward/gui/OnlineGui.java b/src/main/java/com/yaohun/onlinereward/gui/OnlineGui.java
new file mode 100644
index 0000000..fbb5bbe
--- /dev/null
+++ b/src/main/java/com/yaohun/onlinereward/gui/OnlineGui.java
@@ -0,0 +1,50 @@
+package com.yaohun.onlinereward.gui;
+
+import com.yaohun.onlinereward.AuOnlineReward;
+import com.yaohun.onlinereward.config.Config;
+import com.yaohun.onlinereward.data.OnlineData;
+import com.yaohun.onlinereward.data.PlayerData;
+import com.yaohun.onlinereward.manage.PlayerManager;
+import com.yaohun.onlinereward.util.MessageUtil;
+import com.yaohun.onlinereward.util.StackUtil;
+import com.yaohun.onlinereward.util.TimeCheckUtil;
+import me.Demon.DemonPlugin.DemonAPI;
+import me.Demon.DemonPlugin.Util.DataRefreshUtil;
+import me.Demon.DemonPlugin.settings.RefreshData;
+import org.bukkit.Bukkit;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.Inventory;
+
+import java.util.HashMap;
+
+public class OnlineGui {
+
+ private static String invTitle = MessageUtil.getLanguage("Title");
+
+ public static void OpenGui(Player player){
+ PlayerManager playerManager = AuOnlineReward.getPlayerManager();
+ RefreshData refreshData = DataRefreshUtil.getSetting("OnlineDaily");
+ if(refreshData != null && !refreshData.isSameDayAsRecord()){
+ refreshData.setRecordTime(System.currentTimeMillis());
+ DataRefreshUtil.SaveRefreshDataRecord(refreshData);
+ // 每日数据刷新处理
+ playerManager.clearAllPlayerData();
+ return;
+ }
+ if(!TimeCheckUtil.isAfter0020()){
+ DemonAPI.sendMessage(player,"此系统受晚间数据保护§e[00:10]§a才能打开.");
+ return;
+ }
+ String playerName = player.getName();
+ PlayerData playerData = playerManager.getPlayerData(playerName);
+ playerData.updataOnlineData();
+ Inventory inv = Bukkit.createInventory(null, 36, invTitle);
+ inv.setItem(4, StackUtil.showSignStats(playerData));
+ HashMap dataMap = Config.getOnlineDataMap();
+ for (String key : dataMap.keySet()) {
+ OnlineData data = dataMap.get(key);
+ inv.setItem(data.slot,data.getItemStack(playerData));
+ }
+ player.openInventory(inv);
+ }
+}
diff --git a/src/main/java/com/yaohun/onlinereward/listener/GuiClickListener.java b/src/main/java/com/yaohun/onlinereward/listener/GuiClickListener.java
new file mode 100644
index 0000000..f8ed39d
--- /dev/null
+++ b/src/main/java/com/yaohun/onlinereward/listener/GuiClickListener.java
@@ -0,0 +1,135 @@
+package com.yaohun.onlinereward.listener;
+
+import com.yaohun.onlinereward.config.Config;
+import com.yaohun.onlinereward.data.OnlineData;
+import com.yaohun.onlinereward.data.PlayerData;
+import com.yaohun.onlinereward.event.OnlineRewardEvent;
+import com.yaohun.onlinereward.gui.OnlineGui;
+import com.yaohun.onlinereward.manage.PlayerManager;
+import com.yaohun.onlinereward.util.MessageUtil;
+import me.Demon.DemonPlugin.DemonAPI;
+import me.Demon.DemonPlugin.Util.AreaType;
+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.inventory.Inventory;
+import org.bukkit.inventory.ItemStack;
+
+import java.util.ArrayList;
+
+public class GuiClickListener implements Listener {
+
+ private PlayerManager playerManager;
+
+ public GuiClickListener(PlayerManager playerManager) {
+ this.playerManager = playerManager;
+ }
+
+ private static String invTitle = MessageUtil.getLanguage("Title");
+
+ @EventHandler
+ public void onClick(InventoryClickEvent e){
+ int rawSlot = e.getRawSlot();
+ Player player = (Player) e.getWhoClicked();
+ String playerName = player.getName();
+ Inventory inventory = e.getInventory();
+ if(e.getView().getTitle().equalsIgnoreCase(invTitle)){
+ e.setCancelled(true);
+ ItemStack stack = e.getCurrentItem();
+ if(!DemonAPI.itemIsNull(stack)){
+ PlayerData playerData = playerManager.getPlayerData(playerName);
+ NbtItem nbtItem = new NbtItem(stack);
+ if(nbtItem.hasKey("rewardKey")){
+ String onlineKey = nbtItem.getString("rewardKey");
+ OnlineData onlineData = Config.getOnlineData(onlineKey);
+ // 获取玩家已累积打卡多少次
+ int signAmount = playerData.signAmount;
+ // 获取领取此奖励需要累积领取奖励
+ int needAmount = onlineData.needOnline;
+ if(signAmount < needAmount){
+ int showAmount = needAmount - signAmount;
+ DemonAPI.sendMessage(player, MessageUtil.getLanguage("Reward-Progress").replace("%amount%",String.valueOf(showAmount)), Sound.ENTITY_VILLAGER_NO);
+ return;
+ }
+ // 判断玩家是否已领取该奖励
+ if(playerData.isPlayerPermanentRewardExit(onlineKey)){
+ DemonAPI.sendMessage(player,MessageUtil.getLanguage("Already-Claimed"), Sound.ENTITY_VILLAGER_NO);
+ return;
+ }
+ // 当玩家领取了 SignReward_Max 这个奖励时重置本轮
+ if(onlineKey.equalsIgnoreCase("SignReward_Max")){
+ playerData.signAmount = 0;
+ playerData.setplayerPermanentReward(new ArrayList<>());
+ // 执行领取命令后重新打开Gui界面
+ onlineData.carryOut(player);
+ } else {
+ // 添加玩家已领取印记
+ playerData.addPlayerPermanentReward(onlineKey);
+ // 执行领取命令后重新打开Gui界面
+ onlineData.carryOut(player);
+ }
+ playerData.SavePlayerData();
+ OnlineGui.OpenGui(player);
+ player.playSound(player.getLocation(),Sound.ENTITY_EXPERIENCE_ORB_PICKUP,1,1);
+ OnlineRewardEvent onlineRewardEvent = new OnlineRewardEvent(player,onlineData);
+ Bukkit.getPluginManager().callEvent(onlineRewardEvent);
+ return;
+ }
+ if(nbtItem.hasKey("onlineKey")){
+ String onlineKey = nbtItem.getString("onlineKey");
+ OnlineData onlineData = Config.getOnlineData(onlineKey);
+ // 获取玩家是否已领取该奖励
+ if(playerData.isPlayerMinuteRewardExit(onlineKey)){
+ DemonAPI.sendMessage(player,MessageUtil.getLanguage("Already-Claimed"), Sound.ENTITY_VILLAGER_NO);
+ return;
+ }
+ // 判断玩家领取奖励和当前领取奖励是否一致
+ if(!playerData.currentReward.equalsIgnoreCase(onlineKey)){
+ DemonAPI.sendMessage(player,MessageUtil.getLanguage("Not-Available"), Sound.ENTITY_VILLAGER_NO);
+ return;
+ }
+ // 获取玩家举例上次领取奖励已经相差多少时间
+ long receiveTime = (System.currentTimeMillis() - playerData.collectionTime) / 1000;
+ // 获取领取此奖励需要累积在线多少时间
+ long needTime = onlineData.needOnline; // 30
+ if(receiveTime < needTime){
+ long showTime = needTime - receiveTime;
+ DemonAPI.sendMessage(player, MessageUtil.getLanguage("Wait-Time").replace("%time%",String.valueOf(showTime)),Sound.ENTITY_VILLAGER_NO);
+ return;
+ }
+ // 判断玩家今日在线是否达到要求
+ // 获取玩家今日累积在线时长 单位: 秒
+ int onlineTime = playerData.todayOnline;
+ // 获取要求累积在线时长 单位: 秒
+ int needOnlineTime = onlineData.needOnlineTime;
+ if(onlineTime >= needOnlineTime){
+ // 添加玩家领取印记
+ playerData.signAmount += 1;
+ playerData.addPlayerMinuteReward(onlineKey);
+ // 设置相关参数
+ playerData.setCurrentReward();
+ if(DemonAPI.getAreaType() == AreaType.DEFAULT) {
+ if (player.getLevel() < 100) {
+ playerData.collectionTime = System.currentTimeMillis();
+ }
+ }
+ // 执行命令并重新打开Gui界面
+ onlineData.carryOut(player);
+ OnlineGui.OpenGui(player);
+ player.playSound(player.getLocation(),Sound.ENTITY_EXPERIENCE_ORB_PICKUP,1,1);
+ OnlineRewardEvent onlineRewardEvent = new OnlineRewardEvent(player,onlineData);
+ Bukkit.getPluginManager().callEvent(onlineRewardEvent);
+ }else {
+ int remainingTime = needOnlineTime - onlineTime;
+ DemonAPI.sendMessage(player,MessageUtil.getLanguage("Daily-Requirement").replace("%time%",String.valueOf(remainingTime)),Sound.ENTITY_VILLAGER_NO);
+ player.closeInventory();
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/com/yaohun/onlinereward/listener/PlayerListener.java b/src/main/java/com/yaohun/onlinereward/listener/PlayerListener.java
new file mode 100644
index 0000000..22bb6a6
--- /dev/null
+++ b/src/main/java/com/yaohun/onlinereward/listener/PlayerListener.java
@@ -0,0 +1,46 @@
+package com.yaohun.onlinereward.listener;
+
+import com.yaohun.onlinereward.AuOnlineReward;
+import com.yaohun.onlinereward.data.PlayerData;
+import com.yaohun.onlinereward.manage.PlayerManager;
+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;
+import org.bukkit.scheduler.BukkitRunnable;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+public class PlayerListener implements Listener {
+
+ private PlayerManager playerManager;
+
+ public PlayerListener(PlayerManager playerManager){
+ this.playerManager = playerManager;
+ }
+
+ @EventHandler
+ public void onPlayerJoin(PlayerJoinEvent e){
+ Player player = e.getPlayer();
+ String playerName = player.getName();
+ new BukkitRunnable() {
+ @Override
+ public void run() {
+ PlayerData playerData = playerManager.getPlayerData(playerName);
+ playerData.updataLoginTime();
+ }
+ }.runTaskLater(AuOnlineReward.inst(),20L);
+ }
+
+ @EventHandler
+ public void onPlayerQuit(PlayerQuitEvent event) {
+ Player player = event.getPlayer();
+ String playerName = player.getName();
+ playerManager.removePlayerData(playerName);
+ }
+
+}
diff --git a/src/main/java/com/yaohun/onlinereward/manage/PlayerManager.java b/src/main/java/com/yaohun/onlinereward/manage/PlayerManager.java
new file mode 100644
index 0000000..c6d086b
--- /dev/null
+++ b/src/main/java/com/yaohun/onlinereward/manage/PlayerManager.java
@@ -0,0 +1,144 @@
+package com.yaohun.onlinereward.manage;
+
+import com.yaohun.onlinereward.data.PlayerData;
+import org.bukkit.Bukkit;
+import org.bukkit.configuration.file.FileConfiguration;
+import org.bukkit.configuration.file.YamlConfiguration;
+import org.bukkit.entity.Arrow;
+import org.bukkit.entity.Player;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+
+public class PlayerManager {
+
+ private HashMap playerDataMap = new HashMap<>();
+
+ public void loadOnlineAllPlayer(){
+ int count = 0;
+ for (Player player : Bukkit.getOnlinePlayers()){
+ String playerName = player.getName();
+ PlayerData playerData = getPlayerData(playerName);
+ playerData.updataLoginTime();
+ playerData.updataOnlineData();
+ count++;
+ }
+ Bukkit.getConsoleSender().sendMessage("[日志 - 在线福利] 已载入<"+count+"名>在线玩家数据");
+ }
+
+ public PlayerData getPlayerData(String playerName){
+ PlayerData playerData = playerDataMap.get(playerName);
+ if(playerData == null){
+ playerData = new PlayerData(playerName);
+ playerDataMap.put(playerName, playerData);
+ }
+ return playerData;
+ }
+
+ public void clearAllPlayerData(){
+ for (PlayerData playerData : playerDataMap.values()){
+ playerData.SavePlayerData();
+ }
+ playerDataMap.clear();
+ }
+
+ public void saveAllPlayerData(){
+ for (PlayerData playerData : playerDataMap.values()){
+ playerData.SavePlayerData();
+ }
+ }
+
+ public void removePlayerData(String playerName){
+ getPlayerData(playerName).SavePlayerData();
+ playerDataMap.remove(playerName);
+ }
+
+ public void setPlayerData(String playerName, PlayerData playerData){
+ playerDataMap.put(playerName, playerData);
+ }
+
+ public HashMap getPlayerDataMap() {
+ return playerDataMap;
+ }
+
+ public void refreshLocalPlayerData(TimeType timeType){
+ String folderPath = "plugins/AuData/AuOnlineReward";
+ File folder = new File(folderPath);
+ if (!folder.exists() || !folder.isDirectory()) {
+ return;
+ }
+ File[] files = folder.listFiles((dir, name) -> name.endsWith(".yml"));
+ if (files == null || files.length == 0) {
+ return;
+ }
+ long nowTime = System.currentTimeMillis();
+ int count = 0;
+ // 2. 统计玩家今日在线总计时长
+ HashMap integerHashMap = new HashMap<>();
+ for (File file : files) {
+ String playerName = file.getName().replace(".yml", "");
+ FileConfiguration config = YamlConfiguration.loadConfiguration(file);
+ if(timeType.equals(TimeType.DAILY)){
+ int todayOnline = config.getInt("OnlineData.todayOnline");
+ if(todayOnline >= 600){
+ integerHashMap.put(playerName, todayOnline);
+ }
+ config.set("OnlineData.todayOnline", 0);
+ config.set("OnlineData.currentReward", "MinuteReward_30");
+ config.set("OnlineData.collectionTime", nowTime);
+ config.set("OnlineData.receivedList", new ArrayList<>());
+ try {
+ config.save(file);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ count++;
+ } else if(timeType.equals(TimeType.MONTHLY)){
+ int monthOnline = config.getInt("OnlineData.monthOnline");
+ if(monthOnline >= 600 * 180){
+ integerHashMap.put(playerName, monthOnline);
+ }
+ config.set("OnlineData.monthOnline", 0);
+ try {
+ config.save(file);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ count++;
+ }
+ }
+ if(timeType.equals(TimeType.DAILY)) {
+ Bukkit.getConsoleSender().sendMessage("[日志 - 在线福利] 昨日在线时长大于1小时的玩家:");
+ for (String playerName : integerHashMap.keySet()) {
+ int value = integerHashMap.get(playerName);
+ Bukkit.getConsoleSender().sendMessage(" - " + playerName + ": " + (value / 60) + "分钟");
+ }
+ Bukkit.getConsoleSender().sendMessage("[日志 - 在线福利] 每日在线数据已刷新<" + count + "名>玩家数据");
+ }
+ if(timeType.equals(TimeType.MONTHLY)){
+ Bukkit.getConsoleSender().sendMessage("[日志 - 在线福利] 上月在线时长大于180小时的玩家:");
+ for (String playerName : integerHashMap.keySet()) {
+ int value = integerHashMap.get(playerName);
+ Bukkit.getConsoleSender().sendMessage(" - " + playerName + ": " + (value / 600) + "小时");
+ }
+ Bukkit.getConsoleSender().sendMessage("[日志 - 在线福利] 每月在线数据已刷新<" + count + "名>玩家数据");
+ }
+ // 重新载入在线玩家
+ loadOnlineAllPlayer();
+ }
+
+ public void refreshLocalPlayerData(String playerName,TimeType timeType){
+ PlayerData playerData = getPlayerData(playerName);
+ if(timeType.equals(TimeType.DAILY)) {
+ playerData.refreshDailyData();
+ playerData.SavePlayerData();
+ } else if(timeType.equals(TimeType.MONTHLY)){
+ playerData.refreshMonthlyData();
+ playerData.SavePlayerData();
+ }
+ }
+}
diff --git a/src/main/java/com/yaohun/onlinereward/manage/TimeType.java b/src/main/java/com/yaohun/onlinereward/manage/TimeType.java
new file mode 100644
index 0000000..94bf151
--- /dev/null
+++ b/src/main/java/com/yaohun/onlinereward/manage/TimeType.java
@@ -0,0 +1,14 @@
+package com.yaohun.onlinereward.manage;
+
+public enum TimeType {
+
+ DAILY("每日"),
+ WEEKLY("每周"),
+ MONTHLY("每月");
+
+ public final String name;
+
+ TimeType(String name){
+ this.name = name;
+ }
+}
diff --git a/src/main/java/com/yaohun/onlinereward/util/MessageUtil.java b/src/main/java/com/yaohun/onlinereward/util/MessageUtil.java
new file mode 100644
index 0000000..eb2c767
--- /dev/null
+++ b/src/main/java/com/yaohun/onlinereward/util/MessageUtil.java
@@ -0,0 +1,61 @@
+package com.yaohun.onlinereward.util;
+
+import com.yaohun.onlinereward.AuOnlineReward;
+import org.bukkit.Sound;
+import org.bukkit.command.CommandSender;
+import org.bukkit.configuration.ConfigurationSection;
+import org.bukkit.configuration.file.FileConfiguration;
+import org.bukkit.configuration.file.YamlConfiguration;
+import org.bukkit.entity.Player;
+
+import java.io.File;
+import java.util.HashMap;
+
+public class MessageUtil {
+
+ private static HashMap languageMap = new HashMap<>();
+
+ public static HashMap getLanguageMap() {
+ return languageMap;
+ }
+
+ public static void init(AuOnlineReward plugin) {
+ File file = new File(plugin.getDataFolder(), "language.yml");
+ if (!file.exists()) {
+ plugin.saveResource("language.yml", false);
+ }
+ FileConfiguration config = YamlConfiguration.loadConfiguration(file);
+ for (String key : config.getKeys(false)){
+ ConfigurationSection section = config.getConfigurationSection(key);
+ for (String key2 : section.getKeys(false)){
+ String message = section.getString(key2).replace("&","§");
+ languageMap.put(key2,message);
+ }
+ }
+ }
+
+ public static String getLanguage(String key){
+ HashMap hashMap = MessageUtil.getLanguageMap();
+ if(hashMap.containsKey(key)){
+ return hashMap.get(key);
+ }
+ return "缺少参数.§7"+key;
+ }
+
+ public static void sendMessageKey(CommandSender sender, String key, Sound sound){
+ String message = getLanguage(key);
+ sender.sendMessage(message);
+ if(sender instanceof Player){
+ Player player = (Player) sender;
+ player.playSound(player.getLocation(),sound,0.8f,1.2f);
+ }
+ }
+
+ public static void sendMessage(CommandSender sender, String message, Sound sound){
+ sender.sendMessage(message);
+ if(sender instanceof Player){
+ Player player = (Player) sender;
+ player.playSound(player.getLocation(),sound,0.8f,1.2f);
+ }
+ }
+}
diff --git a/src/main/java/com/yaohun/onlinereward/util/StackUtil.java b/src/main/java/com/yaohun/onlinereward/util/StackUtil.java
new file mode 100644
index 0000000..a13a151
--- /dev/null
+++ b/src/main/java/com/yaohun/onlinereward/util/StackUtil.java
@@ -0,0 +1,40 @@
+package com.yaohun.onlinereward.util;
+
+import com.yaohun.onlinereward.AuOnlineReward;
+import com.yaohun.onlinereward.data.PlayerData;
+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 showSignStats(PlayerData playerData){
+ ItemStack stack = new ItemStack(Material.SIGN);
+ ItemMeta meta = stack.getItemMeta();
+ meta.setDisplayName("§6§l我的在线信息");
+ List lore = new ArrayList<>();
+ lore.add(MessageUtil.getLanguage("Total-Online").replace("%time%",formatOnlineTime(playerData.totalOnline)));
+ lore.add(MessageUtil.getLanguage("Monthly-Online").replace("%time%",formatOnlineTime(playerData.monthOnline)));
+ lore.add(MessageUtil.getLanguage("Daily-Online").replace("%time%",formatOnlineTime(playerData.todayOnline)));
+ lore.add(MessageUtil.getLanguage("Total-Rewards").replace("%amount%",String.valueOf(playerData.totalSignAmount)));
+ meta.setLore(lore);
+ stack.setItemMeta(meta);
+ return stack;
+ }
+
+ public static String formatOnlineTime(int timeInSeconds) {
+ int minutes = timeInSeconds / 60; // 转换为分钟
+ int seconds = timeInSeconds % 60; // 剩余秒数
+ int hours = minutes / 60; // 如果超过60分钟,则转换为小时
+ minutes = minutes % 60; // 剩余的分钟数
+ if (hours > 0) {
+ return String.format("%d小时 %d分钟", hours, minutes);
+ } else {
+ return String.format("%d分钟 %d秒", minutes, seconds);
+ }
+ }
+
+}
diff --git a/src/main/java/com/yaohun/onlinereward/util/TimeCheckUtil.java b/src/main/java/com/yaohun/onlinereward/util/TimeCheckUtil.java
new file mode 100644
index 0000000..ae3382c
--- /dev/null
+++ b/src/main/java/com/yaohun/onlinereward/util/TimeCheckUtil.java
@@ -0,0 +1,47 @@
+package com.yaohun.onlinereward.util;
+
+import me.Demon.DemonPlugin.Util.DataRefreshUtil;
+import me.Demon.DemonPlugin.settings.RefreshData;
+import org.bukkit.Bukkit;
+
+import java.time.*;
+
+public class TimeCheckUtil {
+ public static boolean isAfter0020() {
+ // 服务器本机时间
+ LocalTime now = LocalTime.now();
+ LocalTime target = LocalTime.of(0, 10);
+ return !now.isBefore(target);
+ }
+
+ public static boolean isMonthlySettleAccounts() {
+ RefreshData refreshDataMonthly = DataRefreshUtil.getSetting("OnlineMonth");
+ if (refreshDataMonthly == null) {
+ return false;
+ }
+
+ ZoneId zone = ZoneId.systemDefault();
+ LocalDate today = LocalDate.now(zone);
+
+ long lastTs = refreshDataMonthly.getRecordTime();
+
+ if (lastTs <= 0) {
+ refreshDataMonthly.setRecordTime(System.currentTimeMillis());
+ DataRefreshUtil.SaveRefreshDataRecord(refreshDataMonthly);
+ return true;
+ }
+
+ LocalDate recordDate = Instant.ofEpochMilli(lastTs)
+ .atZone(zone)
+ .toLocalDate();
+
+ YearMonth thisMonth = YearMonth.from(today);
+ YearMonth recordedMonth = YearMonth.from(recordDate);
+ if (!thisMonth.equals(recordedMonth)) {
+ refreshDataMonthly.setRecordTime(System.currentTimeMillis());
+ DataRefreshUtil.SaveRefreshDataRecord(refreshDataMonthly);
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
new file mode 100644
index 0000000..6ac44a9
--- /dev/null
+++ b/src/main/resources/config.yml
@@ -0,0 +1,261 @@
+RewardData:
+ MinuteReward_30:
+ slot: 10
+ needOnline: 1800
+ needOnlineTime: 1800
+ itemStack:
+ ==: org.bukkit.inventory.ItemStack
+ type: IRON_INGOT
+ meta:
+ ==: ItemMeta
+ meta-type: UNSPECIFIC
+ display-name: §6§l 阶段奖励 I §r
+ lore:
+ - §7§m §f<§d信息§f>§7§m §r
+ - §c§l★ §7还差 §c%time% §7才能领取
+ - §7§m §f<§a奖励§f>§7§m §r
+ - §e金币 §e*500
+ - §d经验 §e*10,000
+ - §b远古深海秘药 §e*1
+ - §7[§a普通§7]§6灵宠果实 §e*1
+ - §6斗魂积分§7[§b10-30§7] §e*1
+ commands:
+ - eco give %player% 500
+ - dlevel give %player% 10000
+ - dpotion give 远古深海秘药 1 %player%
+ - dpet apple %player% 1
+ - pvptitle %player% 10~30
+ - ditem give 普通时装币 1 %player%
+ - bcm &c&l★ &a玩家 &e%player% &a领取了 &b在线阶段 I &a的奖励
+ MinuteReward_60:
+ slot: 12
+ needOnline: 1800
+ needOnlineTime: 3600
+ itemStack:
+ ==: org.bukkit.inventory.ItemStack
+ type: GOLD_INGOT
+ meta:
+ ==: ItemMeta
+ meta-type: UNSPECIFIC
+ display-name: §6§l 阶段奖励 II §r
+ lore:
+ - §7§m §f<§d信息§f>§7§m §r
+ - §c§l★ §7还差 §c%time% §7才能领取
+ - §7§m §f<§a奖励§f>§7§m §r
+ - §d点券 §e*10
+ - §e金币 §e*1,000
+ - §d经验 §e*20,000
+ - §d远古精灵秘药 §e*1
+ - §e月牙灵石§c[绑定] §e*3
+ - §b流萤枫影§6[活动] §e*1
+ - §d时装币 §e*1
+ - §a活动§f·§6百万凶兽密钥 §e*1
+ commands:
+ - points give %player% 10
+ - eco give %player% 1000
+ - dlevel give %player% 20000
+ - dpotion give 远古精灵的秘药 1 %player%
+ - ditem give 月牙灵石 3 %player%
+ - ditem give 流萤枫影 1 %player%
+ - ditem give 时装币 1 %player%
+ - acrusade give %player% 1
+ - bcm &c&l★ &a玩家 &e%player% &a领取了 &b在线阶段 II &a的奖励
+ MinuteReward_120:
+ slot: 14
+ needOnline: 3600
+ needOnlineTime: 7200
+ itemStack:
+ ==: org.bukkit.inventory.ItemStack
+ type: EMERALD
+ meta:
+ ==: ItemMeta
+ meta-type: UNSPECIFIC
+ display-name: §6§l 阶段奖励 III §r
+ lore:
+ - §7§m §f<§d信息§f>§7§m §r
+ - §c§l★ §7还差 §c%time% §7才能领取
+ - §7§m §f<§a奖励§f>§7§m §r
+ - §d点券 §e*30
+ - §e金币 §e*2,000
+ - §d经验 §e*30,000
+ - §e圣辉陨母§c[绑定] §e*1
+ - §b做梦抽奖箱 §e*2
+ - §c灵环夺宝钥匙§c[绑定] §e*2
+ - §a活动§f·§6百万凶兽密钥 §e*1
+ commands:
+ - points give %player% 30
+ - eco give %player% 2000
+ - dlevel give %player% 30000
+ - ditem give 圣辉陨母 1 %player% true
+ - ditem give 做梦抽奖箱 2 %player%
+ - ditem give 魂环抽奖箱钥匙 2 %player% true
+ - acrusade give %player% 1
+ - bcm &c&l★ &a玩家 &e%player% &a领取了 &b在线阶段 III &a的奖励
+ MinuteReward_240:
+ slot: 16
+ needOnline: 3600
+ needOnlineTime: 1440
+ itemStack:
+ ==: org.bukkit.inventory.ItemStack
+ type: DIAMOND
+ meta:
+ ==: ItemMeta
+ meta-type: UNSPECIFIC
+ display-name: §6§l 阶段奖励 IV §r
+ lore:
+ - §7§m §f<§d信息§f>§7§m §r
+ - §c§l★ §7还差 §c%time% §7才能领取
+ - §7§m §f<§a奖励§f>§7§m §r
+ - §d点券 §e*60
+ - §e金币 §e*3,000
+ - §d经验 §e*50,000
+ - §e圣辉陨母§c[绑定] §e*1
+ - §f银质增幅保护券§c[绑定] §e*1
+ - §c灵环夺宝钥匙§c[绑定] §e*2
+ - §b流萤枫影§6[活动] §e*1
+ - §d时装币 §e*2
+ - §c十万年挑战密钥§6[团本] §e*1
+ - §7(密钥仅限当天有效)
+ commands:
+ - points give %player% 60
+ - eco give %player% 3000
+ - dlevel give %player% 50000
+ - ditem give 圣辉陨母 1 %player% true
+ - ditem give 银质增幅保护券 1 %player% true
+ - ditem give 魂环抽奖箱钥匙 2 %player% true
+ - ditem give 流萤枫影 1 %player%
+ - ditem give 时装币 2 %player%
+ - dtitem give 十万年挑战密钥时效 1 %player% 1
+ - bcm &c&l★ &a玩家 &e%player% &a领取了 &b在线阶段 Iv &a的奖励
+ SignReward_15:
+ slot: 29
+ needOnline: 25
+ itemStack:
+ ==: org.bukkit.inventory.ItemStack
+ type: CHEST
+ meta:
+ ==: ItemMeta
+ meta-type: TILE_ENTITY
+ display-name: §r §6§l累积打卡奖励 I §r
+ lore:
+ - §7§m §f<§d信息§f>§7§m §r
+ - §c§l★ §7还需领取 §c%amounut% §7奖励
+ - §7§m §f<§a奖励§f>§7§m §r
+ - §e金币 §e*10,000
+ - §d经验 §e*100,000
+ - §e次元§5精灵§d秘药§c[绑定] §e*1
+ - §d唐门绝学天赋点 §e*1
+ - §e精§b美§e时§b装§e币 §e*2
+ - §e灵环抽奖箱钥匙§c[绑定] §e*3
+ - §b流萤枫影§6[活动] §e*1
+ blockMaterial: CHEST
+ commands:
+ - eco give %player% 10000
+ - dlevel give %player% 100000
+ - autalent give %player% 1
+ - dpotion give 次元精灵秘药 1 %player%
+ - ditem give 精美时装币 2 %player%
+ - ditem give 魂环抽奖箱钥匙 3 %player%
+ - ditem give 流萤枫影 1 %player%
+ SignReward_25:
+ slot: 30
+ needOnline: 50
+ itemStack:
+ ==: org.bukkit.inventory.ItemStack
+ type: CHEST
+ meta:
+ ==: ItemMeta
+ meta-type: TILE_ENTITY
+ display-name: §r §6§l累积打卡奖励 II §r
+ lore:
+ - §7§m §f<§d信息§f>§7§m §r
+ - §c§l★ §7还需领取 §c%amounut% §7奖励
+ - §7§m §f<§a奖励§f>§7§m §r
+ - §e金币 §e*15,000
+ - §d经验 §e*300,000
+ - §e次元§5精灵§d秘药§c[绑定] §e*1
+ - §d唐门绝学天赋点 §e*1
+ - §e精§b美§e时§b装§e币 §e*2
+ - §e灵环抽奖箱钥匙§c[绑定] §e*5
+ - §b流萤枫影§6[活动] §e*2
+ blockMaterial: CHEST
+ commands:
+ - eco give %player% 15000
+ - dlevel give %player% 300000
+ - autalent give %player% 1
+ - dpotion give 次元精灵秘药 1 %player%
+ - ditem give 精美时装币 2 %player%
+ - ditem give 魂环抽奖箱钥匙 5 %player%
+ - ditem give 流萤枫影 2 %player%
+ SignReward_40:
+ slot: 32
+ needOnline: 75
+ itemStack:
+ ==: org.bukkit.inventory.ItemStack
+ type: CHEST
+ meta:
+ ==: ItemMeta
+ meta-type: TILE_ENTITY
+ display-name: §r §6§l累积打卡奖励 III §r
+ lore:
+ - §7§m §f<§d信息§f>§7§m §r
+ - §c§l★ §7还需领取 §c%amounut% §7奖励
+ - §7§m §f<§a奖励§f>§7§m §r
+ - §e金币 §e*30,000
+ - §d经验 §e*500,000
+ - §e次元§5精灵§d秘药§c[绑定] §e*1
+ - §d唐门绝学天赋点 §e*2
+ - §e精§b美§e时§b装§e币 §e*3
+ - §e灵环抽奖箱钥匙§c[绑定] §e*10
+ - §e幸运夺宝箱钥匙§c[绑定] §e*1
+ - §7[§b增幅§7]§e圣天使陨母§c[绑定] §e*1
+ - §c十万年兽骨抽奖箱 §e*1
+ - §b流萤枫影§6[活动] §e*3
+ blockMaterial: CHEST
+ commands:
+ - eco give %player% 30000
+ - dlevel give %player% 500000
+ - autalent give %player% 2
+ - dpotion give 次元精灵秘药 1 %player%
+ - ditem give 精美时装币 3 %player%
+ - ditem give 魂环抽奖箱钥匙 10 %player%
+ - ditem give 幸运夺宝钥匙 1 %player%
+ - ditem give 圣天使陨母 1 %player% true
+ - ditem give 十万兽骨抽奖箱 1 %player% true
+ - ditem give 流萤枫影 3 %player%
+ SignReward_Max:
+ slot: 33
+ needOnline: 100
+ itemStack:
+ ==: org.bukkit.inventory.ItemStack
+ type: CHEST
+ meta:
+ ==: ItemMeta
+ meta-type: TILE_ENTITY
+ display-name: §r §6§l累积打卡奖励 IV §r
+ lore:
+ - §7§m §f<§d信息§f>§7§m §r
+ - §c§l★ §7还需领取 §c%amounut% §7奖励
+ - §7§m §f<§a奖励§f>§7§m §r
+ - §e金币 §e*50,000
+ - §d经验 §e*800,000
+ - §b§l终极§9精灵§b秘药§c[绑定] §e*1
+ - §d唐门绝学天赋点 §e*2
+ - §e精§b美§e时§b装§e币 §e*5
+ - §e灵环抽奖箱钥匙§c[绑定] §e*20
+ - §e幸运夺宝箱钥匙§c[绑定] §e*1
+ - §7[§b增幅§7]§e圣天使陨母§c[绑定] §e*1
+ - §c十万年灵环抽奖箱 §e*1
+ - §b流萤枫影§6[活动] §e*3
+ blockMaterial: CHEST
+ commands:
+ - eco give %player% 50000
+ - dlevel give %player% 800000
+ - autalent give %player% 2
+ - dpotion give 终极精灵秘药 1 %player%
+ - ditem give 精美时装币 5 %player%
+ - ditem give 魂环抽奖箱钥匙 20 %player%
+ - ditem give 幸运夺宝钥匙 1 %player%
+ - ditem give 圣天使陨母 1 %player% true
+ - ditem give 十万魂环抽奖箱 1 %player% true
+ - ditem give 流萤枫影 3 %player%
diff --git a/src/main/resources/language.yml b/src/main/resources/language.yml
new file mode 100644
index 0000000..61b55d7
--- /dev/null
+++ b/src/main/resources/language.yml
@@ -0,0 +1,15 @@
+Online-Gui:
+ Title: "§r日常福利 - 累积在线豪礼相赠"
+ Received: "§a§l★ §7领取状态: §a已领取"
+ Not-Started: "§c§l★ §7领取状态: §c未开始"
+ Pending: "§b§l★ §7领取状态: §b待领取"
+ Total-Online: "§7累积在线: §a%time%"
+ Monthly-Online: "§7本月在线: §a%time%"
+ Daily-Online: "§7今日在线: §a%time%"
+ Total-Rewards: "§7总计领取奖励: §a%amount%次"
+Message:
+ Reward-Progress: "你还需要获取§e[%amount%次]§a阶段奖励才能领取奖励。"
+ Wait-Time: "您还需要等待§e[%time%秒]§a才能领取该奖励。"
+ Daily-Requirement: "你需要今日在线§e[%time%秒]§a才能领取该奖励。"
+ Already-Claimed: "你已经领取过这个累积奖励。"
+ Not-Available: "这个阶段奖励尚未开启,暂时无法领取。"
\ No newline at end of file
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
new file mode 100644
index 0000000..363fc09
--- /dev/null
+++ b/src/main/resources/plugin.yml
@@ -0,0 +1,7 @@
+name: AuOnlineReward
+main: com.yaohun.onlinereward.AuOnlineReward
+version: 1.8.0
+depend:
+ - DemonAPI
+commands:
+ auonline:
\ No newline at end of file