初始化项目

This commit is contained in:
yhy
2026-06-02 14:41:11 +08:00
commit 1862217941
19 changed files with 1421 additions and 0 deletions

16
.gitignore vendored Normal file
View File

@@ -0,0 +1,16 @@
target/
out/
lib/
libs/
.vscode/
.codex/
.idea/
*.iml
*.class
*.log
logs/
*.db
*.sqlite
*.sqlite3
.DS_Store
Thumbs.db

38
pom.xml Normal file
View File

@@ -0,0 +1,38 @@
<?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>AuOnlineReward</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>me.Demon.DemonPlugin</groupId>
<artifactId>DemonAPI</artifactId>
<version>2.3.3</version>
</dependency>
</dependencies>
</project>

View File

@@ -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<String, PlayerData> 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<String,Integer> 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;
}
}

View File

@@ -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;
}
}

View File

@@ -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<String, OnlineData> 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<String, OnlineData> getOnlineDataMap() {
return onlineDataMap;
}
public static OnlineData getOnlineData(String key) {
return onlineDataMap.get(key);
}
}

View File

@@ -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<String> 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<String> 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<String> 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);
}
}
}
}

View File

@@ -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<String> receivedList;
private List<String> 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<String> 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;
}
}

View File

@@ -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;
}
}

View File

@@ -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<String,OnlineData> dataMap = Config.getOnlineDataMap();
for (String key : dataMap.keySet()) {
OnlineData data = dataMap.get(key);
inv.setItem(data.slot,data.getItemStack(playerData));
}
player.openInventory(inv);
}
}

View File

@@ -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();
}
}
}
}
}
}

View File

@@ -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);
}
}

View File

@@ -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<String, PlayerData> 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<String, PlayerData> 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<String,Integer> 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();
}
}
}

View File

@@ -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;
}
}

View File

@@ -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<String ,String > languageMap = new HashMap<>();
public static HashMap<String, String> 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<String,String > 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);
}
}
}

View File

@@ -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<String> 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);
}
}
}

View File

@@ -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;
}
}

View File

@@ -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%

View File

@@ -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: "这个阶段奖励尚未开启,暂时无法领取。"

View File

@@ -0,0 +1,7 @@
name: AuOnlineReward
main: com.yaohun.onlinereward.AuOnlineReward
version: 1.8.0
depend:
- DemonAPI
commands:
auonline: