初始化项目
This commit is contained in:
16
.gitignore
vendored
Normal file
16
.gitignore
vendored
Normal 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
38
pom.xml
Normal 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>
|
||||
159
src/main/java/com/yaohun/onlinereward/AuOnlineReward.java
Normal file
159
src/main/java/com/yaohun/onlinereward/AuOnlineReward.java
Normal 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;
|
||||
}
|
||||
}
|
||||
39
src/main/java/com/yaohun/onlinereward/api/OnlineAPI.java
Normal file
39
src/main/java/com/yaohun/onlinereward/api/OnlineAPI.java
Normal 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;
|
||||
}
|
||||
}
|
||||
39
src/main/java/com/yaohun/onlinereward/config/Config.java
Normal file
39
src/main/java/com/yaohun/onlinereward/config/Config.java
Normal 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);
|
||||
}
|
||||
}
|
||||
130
src/main/java/com/yaohun/onlinereward/data/OnlineData.java
Normal file
130
src/main/java/com/yaohun/onlinereward/data/OnlineData.java
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
140
src/main/java/com/yaohun/onlinereward/data/PlayerData.java
Normal file
140
src/main/java/com/yaohun/onlinereward/data/PlayerData.java
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
50
src/main/java/com/yaohun/onlinereward/gui/OnlineGui.java
Normal file
50
src/main/java/com/yaohun/onlinereward/gui/OnlineGui.java
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
144
src/main/java/com/yaohun/onlinereward/manage/PlayerManager.java
Normal file
144
src/main/java/com/yaohun/onlinereward/manage/PlayerManager.java
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
14
src/main/java/com/yaohun/onlinereward/manage/TimeType.java
Normal file
14
src/main/java/com/yaohun/onlinereward/manage/TimeType.java
Normal 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;
|
||||
}
|
||||
}
|
||||
61
src/main/java/com/yaohun/onlinereward/util/MessageUtil.java
Normal file
61
src/main/java/com/yaohun/onlinereward/util/MessageUtil.java
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
40
src/main/java/com/yaohun/onlinereward/util/StackUtil.java
Normal file
40
src/main/java/com/yaohun/onlinereward/util/StackUtil.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
261
src/main/resources/config.yml
Normal file
261
src/main/resources/config.yml
Normal 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%
|
||||
15
src/main/resources/language.yml
Normal file
15
src/main/resources/language.yml
Normal 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: "这个阶段奖励尚未开启,暂时无法领取。"
|
||||
7
src/main/resources/plugin.yml
Normal file
7
src/main/resources/plugin.yml
Normal file
@@ -0,0 +1,7 @@
|
||||
name: AuOnlineReward
|
||||
main: com.yaohun.onlinereward.AuOnlineReward
|
||||
version: 1.8.0
|
||||
depend:
|
||||
- DemonAPI
|
||||
commands:
|
||||
auonline:
|
||||
Reference in New Issue
Block a user