diff --git a/pom.xml b/pom.xml
index 5106ba4..6f382cf 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0
moe.feo
BBSToper
- 3.5.3
+ 3.6
spigot-repo
diff --git a/resources/config.yml b/resources/config.yml
index 312ddad..1c24062 100644
--- a/resources/config.yml
+++ b/resources/config.yml
@@ -7,7 +7,7 @@
#项目地址: https://github.com/R-Josef/BBSToper
#MCBBS下载地址: https://www.mcbbs.net/thread-789082-1-1.html
#请定期检查这些网址以获取可用的更新
-#Copyright © 2018-2019 R_Josef 版权所有
+#Copyright © 2018-2020 R_Josef 版权所有
#数据库设置
database:
@@ -74,4 +74,38 @@ reward:
#奖励的命令, %PLAYER%代表使用命令的玩家ID
commands:
- 'experience add %PLAYER% 1000'
- - 'eco give %PLAYER% 20'
\ No newline at end of file
+ - 'eco give %PLAYER% 20'
+ #激励奖励
+ #当玩家在无人顶贴超过一定时间之后顶贴, 这些奖励命令会被执行
+ incentivereward:
+ #是否启用
+ enable: false
+ #是否为额外奖励(是否还会给与普通的奖励)
+ extra: true
+ #间隔时间, 单位为分钟
+ #距离上一次有人顶贴多久之后会给与激励奖励
+ period: 30
+ #奖励命令
+ commands:
+ - 'effect give %PLAYER% haste 2'
+ #休息日奖励
+ #当玩家在设定好的休息日顶贴, 这些奖励命令会被执行
+ offdayreward:
+ #是否启用
+ enable: false
+ #是否为额外奖励(是否还会给与普通的奖励)
+ #注意: 当"休息日奖励"与"激励奖励"的"额外奖励"选项都为false时
+ #如果"休息日奖励"与"激励奖励"的条件同时满足, 将只有"休息日奖励"会被发放
+ extra: true
+ #哪些日期会应用于这项设置
+ #表示一个星期中的某一天: SUNDAY(周日), MONDAY(周一), TUESDAY(周二)
+ #WEDNESDAY(周三), THURSDAY(周四), FRIDAY(周五), SATURDAY(周六)
+ #普通日期格式为MM-dd, 例如10-01表示十月一日
+ offdays:
+ - 'SATURDAY'
+ - 'SUNDAY'
+ - '10-01'
+ - '05-01'
+ #奖励命令
+ commands:
+ - 'effect give %PLAYER% speed 2'
diff --git a/resources/lang.yml b/resources/lang.yml
index 80d0082..f9914a4 100644
--- a/resources/lang.yml
+++ b/resources/lang.yml
@@ -34,6 +34,7 @@ nopost: '&4您暂未有新的顶帖记录!'
overtime: '&4很抱歉您每天只能领取 &e%REWARDTIMES% &4次奖励!'
waitamin: '&4连续顶帖间隔必须大于一分钟!'
reward: '&b您在 &f%TIME% &b进行的顶帖已得到回报.'
+extrareward: '&b您还获得了: %EXTRA%.'
rewardgived: '&a奖励发放完毕!'
broadcast: '&b玩家 &e%PLAYER% &b刚刚领取了顶贴奖励, 大家也快来顶贴吧! '
@@ -62,6 +63,7 @@ invalid: '&4命令错误!'
invalidnum: '&4无效的数字!'
playercmd: '&4该命令必须由玩家执行!'
pagenotvisible: '&4宣传帖目前处于不可视状态, 如果您看到这条消息请通知管理员!'
+none: '&4 无'
failedgetweb: '获取网页时错误, 可能是由于网络波动!'
#failedresolveweb中的信息可能在您的宣传帖被移入审核区时反复出现
#您可以通过留空该项来禁用这项提示, 留空的格式应为-failedresolveweb: ''
@@ -79,11 +81,14 @@ gui:
bbsid: '&2绑定账号: &e%BBSID%'
posttimes: '&2顶贴次数: &e%TIMES%'
rewards: '&b奖励信息'
+ incentiverewards: '&b激励奖励'
+ offdayrewards: '&b休息日奖励'
clickget: '&a点击领取奖励'
tops: '&b顶贴排行'
pagestate: '§b宣传帖状态'
pageid: '&2帖子ID: &f%PAGEID%'
lastpost: '&2上一次顶贴: &f%TIME%'
+ extrarewards: '&2现在顶贴可获得: %EXTRA%'
pagenotvisible: '&c宣传帖目前处于不可视状态'
clickopen: '&a点击获取链接'
#这里是自定义GUI中的奖励信息, 留空则直接显示奖励命令 ([]表示留空)
@@ -106,6 +111,8 @@ info:
- '&b本服MCBBS宣传帖链接:'
- '&9%PAGE%'
- '&b对宣传帖使用提升卡将获得丰厚奖励.'
+#额外奖励提醒
+extrainfo: '&b现在顶贴还可以获得 %EXTRA% 哦.'
#帮助
help:
diff --git a/resources/plugin.yml b/resources/plugin.yml
index 6aacc0c..d3222f3 100644
--- a/resources/plugin.yml
+++ b/resources/plugin.yml
@@ -1,6 +1,6 @@
name: BBSToper
main: moe.feo.bbstoper.BBSToper
-version: 3.5.3
+version: 3.6
author: Fengshuai(R_Josef)
website: https://www.mcbbs.net/thread-789082-1-1.html
softdepend: [PlaceholderAPI]
diff --git a/src/moe/feo/bbstoper/CLI.java b/src/moe/feo/bbstoper/CLI.java
index 8141ea9..b0731d7 100644
--- a/src/moe/feo/bbstoper/CLI.java
+++ b/src/moe/feo/bbstoper/CLI.java
@@ -221,7 +221,6 @@ public void task() {
sender.sendMessage(Message.PREFIX.getString() + Message.PAGENOTVISIBLE.getString());
return;
}
- crawler.kickExpiredData();// 剔除过期数据
String bbsname = poster.getBbsname();
List cache = new ArrayList<>();// 这个缓存是用来判断玩家的顶贴粒度是否小于一分钟
boolean issucceed = false;
@@ -249,18 +248,7 @@ public void task() {
poster.setRewardtime(0);
}
if (poster.getRewardtime() < Option.REWARD_TIMES.getInt()) {// 奖励次数小于设定值
- Bukkit.getScheduler().runTask(BBSToper.getInstance(), new Runnable() {
- @Override
- public void run() {
- for (int x = 0; x < Option.REWARD_COMMANDS.getStringList().size(); x++) {
- String cmd = Option.REWARD_COMMANDS.getStringList().get(x)
- .replaceAll("%PLAYER%", sender.getName());
- Bukkit.dispatchCommand(Bukkit.getConsoleSender(), cmd);
- }
- }
- });
- sender.sendMessage(Message.PREFIX.getString()
- + Message.REWARD.getString().replaceAll("%TIME%", crawler.Time.get(i)));
+ new Reward((Player) sender, crawler, i).award();
sql.addTopState(poster.getBbsname(), crawler.Time.get(i));
poster.setRewardtime(poster.getRewardtime() + 1);// rewardtime次数加一
issucceed = true;
diff --git a/src/moe/feo/bbstoper/Crawler.java b/src/moe/feo/bbstoper/Crawler.java
index 9b746f9..a515ff2 100644
--- a/src/moe/feo/bbstoper/Crawler.java
+++ b/src/moe/feo/bbstoper/Crawler.java
@@ -26,6 +26,7 @@ public class Crawler {
public Crawler() {
resolveWebData();
+ kickExpiredData();
}
public void resolveWebData() {
@@ -122,20 +123,8 @@ public void activeReward() {// 主动给玩家发奖励
if (poster.getRewardtime() >= Option.REWARD_TIMES.getInt()) {
continue;// 如果领奖次数已经大于设定值了,那么跳出循环
}
- // 这时候就可以给玩家发奖励了,这里让主线程执行
- Bukkit.getScheduler().runTask(BBSToper.getInstance(), new Runnable() {
- @Override
- public void run() {
- for (int x = 0; x < Option.REWARD_COMMANDS.getStringList().size(); x++) {
- String cmd = Option.REWARD_COMMANDS.getStringList().get(x)
- .replaceAll("%PLAYER%", player.getName());
- Bukkit.dispatchCommand(Bukkit.getConsoleSender(), cmd);
- }
- }
- });
- // 给玩家发个消息表示祝贺
- player.getPlayer().sendMessage(
- Message.PREFIX.getString() + Message.REWARD.getString().replaceAll("%TIME%", time));
+ // 这时候就可以给玩家发奖励了
+ new Reward(olplayer, this, i).award();
sql.addTopState(bbsname, time);
poster.setRewardtime(poster.getRewardtime() + 1);
sql.updatePoster(poster);// 把poster储存起来
diff --git a/src/moe/feo/bbstoper/Message.java b/src/moe/feo/bbstoper/Message.java
index 62bb5cd..cf85c73 100644
--- a/src/moe/feo/bbstoper/Message.java
+++ b/src/moe/feo/bbstoper/Message.java
@@ -16,20 +16,22 @@ public enum Message {
POSTERNUM("posternum"), OVERPAGE("overpage"), NOPLAYER("noplayer"), POSTERTIME("postertime"), PAGEINFO("pageinfo"),
NOPOSTER("noposter"), POSTERPLAYER("posterplayer"), POSTERTOTAL("postertotal"), PAGEINFOTOP("pageinfotop"),
NOTBOUND("notbound"), NOPOST("nopost"), OVERTIME("overtime"), WAITAMIN("waitamin"), REWARD("reward"),
- REWARDGIVED("rewardgived"), BROADCAST("broadcast"), ENTER("enter"), CANCELED("canceled"), REPEAT("repeat"),
- NOTSAME("notsame"), ONCOOLDOWN("oncooldown"), SAMEBIND("samebind"), OWNSAMEBIND("ownsamebind"),
- BINDINGSUCCESS("bindingsuccess"), IDOWNER("idowner"), IDNOTFOUND("idnotfound"), OWNERID("ownerid"),
- OWNERNOTFOUND("ownernotfound"), NOPERMISSION("nopermission"), INVALID("invalid"), INVALIDNUM("invalidnum"),
- PLAYERCMD("playercmd"), PAGENOTVISIBLE("pagenotvisible"), FAILEDGETWEB("failedgetweb"),
- FAILEDRESOLVEWEB("failedresolveweb"), FAILEDUNINSTALLMO("faileduninstallmo"), GUI_TITLE("gui.title"),
- GUI_FRAME("gui.frame"), GUI_SKULL("gui.skull"), GUI_NOTBOUND("gui.notbound"), GUI_CLICKBOUND("gui.clickbound"),
- GUI_CLICKREBOUND("gui.clickrebound"), GUI_BBSID("gui.bbsid"), GUI_POSTTIMES("gui.posttimes"),
- GUI_REWARDS("gui.rewards"), GUI_CLICKGET("gui.clickget"), GUI_TOPS("gui.tops"), GUI_PAGESTATE("gui.pagestate"),
- GUI_PAGEID("gui.pageid"), GUI_LASTPOST("gui.lastpost"), GUI_PAGENOTVISIBLE("gui.pagenotvisible"),
- GUI_CLICKOPEN("gui.clickopen"), GUI_REWARDSINFO("gui.rewardsinfo"), CLICKPOSTICON("clickposticon"),
- DELETESUCCESS("deletesuccess"), INFO("info"), HELP_TITLE("help.title"), HELP_HELP("help.help"),
- HELP_BINDING("help.binding"), HELP_REWARD("help.reward"), HELP_LIST("help.list"), HELP_TOP("help.top"),
- HELP_CHECK("help.check"), HELP_DELETE("help.delete"), HELP_RELOAD("help.reload");
+ EXTRAREWARD("extrareward"), REWARDGIVED("rewardgived"), BROADCAST("broadcast"), ENTER("enter"),
+ CANCELED("canceled"), REPEAT("repeat"), NOTSAME("notsame"), ONCOOLDOWN("oncooldown"), SAMEBIND("samebind"),
+ OWNSAMEBIND("ownsamebind"), BINDINGSUCCESS("bindingsuccess"), IDOWNER("idowner"), IDNOTFOUND("idnotfound"),
+ OWNERID("ownerid"), OWNERNOTFOUND("ownernotfound"), NOPERMISSION("nopermission"), INVALID("invalid"),
+ INVALIDNUM("invalidnum"), PLAYERCMD("playercmd"), PAGENOTVISIBLE("pagenotvisible"), NONE("none"),
+ FAILEDGETWEB("failedgetweb"), FAILEDRESOLVEWEB("failedresolveweb"), FAILEDUNINSTALLMO("faileduninstallmo"),
+ GUI_TITLE("gui.title"), GUI_FRAME("gui.frame"), GUI_SKULL("gui.skull"), GUI_NOTBOUND("gui.notbound"),
+ GUI_CLICKBOUND("gui.clickbound"), GUI_CLICKREBOUND("gui.clickrebound"), GUI_BBSID("gui.bbsid"),
+ GUI_POSTTIMES("gui.posttimes"), GUI_REWARDS("gui.rewards"), GUI_INCENTIVEREWARDS("gui.incentiverewards"),
+ GUI_OFFDAYREWARDS("gui.offdayrewards"), GUI_CLICKGET("gui.clickget"), GUI_TOPS("gui.tops"),
+ GUI_PAGESTATE("gui.pagestate"), GUI_PAGEID("gui.pageid"), GUI_LASTPOST("gui.lastpost"),
+ GUI_EXTRAREWARDS("gui.extrarewards"), GUI_PAGENOTVISIBLE("gui.pagenotvisible"), GUI_CLICKOPEN("gui.clickopen"),
+ GUI_REWARDSINFO("gui.rewardsinfo"), CLICKPOSTICON("clickposticon"), DELETESUCCESS("deletesuccess"), INFO("info"),
+ EXTRAINFO("extrainfo"), HELP_TITLE("help.title"), HELP_HELP("help.help"), HELP_BINDING("help.binding"),
+ HELP_REWARD("help.reward"), HELP_LIST("help.list"), HELP_TOP("help.top"), HELP_CHECK("help.check"),
+ HELP_DELETE("help.delete"), HELP_RELOAD("help.reload");
public String path;
diff --git a/src/moe/feo/bbstoper/Option.java b/src/moe/feo/bbstoper/Option.java
index 4b791ef..a380bbf 100644
--- a/src/moe/feo/bbstoper/Option.java
+++ b/src/moe/feo/bbstoper/Option.java
@@ -21,7 +21,15 @@ public enum Option {
MCBBS_JOINMESSAGE("mcbbs.joinmessage"), GUI_TOPPLAYERS("gui.topplayers"),
GUI_DISPLAYHEADSKIN("gui.displayheadskin"), GUI_USECHATGETID("gui.usechatgetid"),
GUI_CANCELKEYWORDS("gui.cancelkeywords"), REWARD_AUTO("reward.auto"), REWARD_PERIOD("reward.period"),
- REWARD_TIMES("reward.times"), REWARD_COMMANDS("reward.commands");
+ REWARD_TIMES("reward.times"), REWARD_COMMANDS("reward.commands"),
+ REWARD_INCENTIVEREWARD_ENABLE("reward.incentivereward.enable"),
+ REWARD_INCENTIVEREWARD_EXTRA("reward.incentivereward.extra"),
+ REWARD_INCENTIVEREWARD_PERIOD("reward.incentivereward.period"),
+ REWARD_INCENTIVEREWARD_COMMANDS("reward.incentivereward.commands"),
+ REWARD_OFFDAYREWARD_ENABLE("reward.offdayreward.enable"), REWARD_OFFDAYREWARD_EXTRA("reward.offdayreward.extra"),
+ REWARD_OFFDAYREWARD_OFFDAYS("reward.offdayreward.offdays"),
+ REWARD_OFFDAYREWARD_COMMANDS("reward.offdayreward.commands");
+
private static File file;
private static FileConfiguration config;
diff --git a/src/moe/feo/bbstoper/PAPIExpansion.java b/src/moe/feo/bbstoper/PAPIExpansion.java
index 5daa0c3..14e4bda 100644
--- a/src/moe/feo/bbstoper/PAPIExpansion.java
+++ b/src/moe/feo/bbstoper/PAPIExpansion.java
@@ -82,6 +82,13 @@ public String onPlaceholderRequest(Player player, String identifier) {
return Message.GUI_PAGENOTVISIBLE.getString();// 帖子不可视
}
}
+ if (identifier.equals("extrarewards")) {
+ String extra = Util.getExtraReward(new Crawler());
+ if (extra == null) {
+ extra = Message.NONE.getString();
+ }
+ return extra;
+ }
String pattern = "^top_[1-9]\\d*$";// top_正整数的正则表达式
if (Pattern.matches(pattern, identifier)) {// 如果匹配这种格式
int rank = Integer.parseInt(identifier.split("_")[1]);
diff --git a/src/moe/feo/bbstoper/Reminder.java b/src/moe/feo/bbstoper/Reminder.java
index 674e1dd..287d764 100644
--- a/src/moe/feo/bbstoper/Reminder.java
+++ b/src/moe/feo/bbstoper/Reminder.java
@@ -1,6 +1,7 @@
package moe.feo.bbstoper;
import java.text.SimpleDateFormat;
+import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
@@ -15,7 +16,7 @@
import moe.feo.bbstoper.sql.SQLer;
public class Reminder implements Listener {
-
+
private static SQLer sql;
public Reminder(Plugin plugin) {
@@ -34,9 +35,10 @@ public void run() {
task();
Util.removeRunningTaskID(this.getTaskId());
}
+
public void task() {
- boolean isbinded = true;
- boolean isposted = true;
+ boolean isbinded = true;// 是否绑定
+ boolean isposted = true;// 是否有顶贴者
UUID uuid = event.getPlayer().getUniqueId();
Poster poster = sql.getPoster(uuid.toString());
String datenow = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
@@ -47,7 +49,13 @@ public void task() {
isposted = false;
}
if (!isposted) {// 没有顶贴
- List list = Message.INFO.getStringList();
+ List list = new ArrayList();// 提示的信息
+ list.addAll(Message.INFO.getStringList());
+ Crawler crawler = new Crawler();
+ String extra = Util.getExtraReward(crawler);
+ if (extra != null) {// 说明有额外奖励信息
+ list.add(Message.EXTRAINFO.getString().replaceAll("%EXTRA%", extra));
+ }
String url = "https://www.mcbbs.net/thread-" + Option.MCBBS_URL.getString() + "-1-1.html";
for (String msg : list) {
event.getPlayer().sendMessage(Message.PREFIX.getString() + msg.replaceAll("%PAGE%", url));
@@ -59,7 +67,7 @@ public void task() {
}
}.runTaskAsynchronously(BBSToper.getInstance());
}
-
+
public static void setSQLer(SQLer sql) {
Reminder.sql = sql;
}
diff --git a/src/moe/feo/bbstoper/Reward.java b/src/moe/feo/bbstoper/Reward.java
new file mode 100644
index 0000000..a9a88aa
--- /dev/null
+++ b/src/moe/feo/bbstoper/Reward.java
@@ -0,0 +1,158 @@
+package moe.feo.bbstoper;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.regex.Pattern;
+
+import org.bukkit.Bukkit;
+import org.bukkit.entity.Player;
+
+public class Reward {
+ private Player player; // 发放奖励的对象
+ private Crawler crawler; // 一个爬虫对象
+ private int index; // 要发放奖励的那条记录的序号
+
+ // current指需要判断的时间, before指上一个顶贴的时间
+ public static boolean canIncentiveReward(Calendar current, Calendar before) {
+ boolean result = false;
+ if (Option.REWARD_INCENTIVEREWARD_ENABLE.getBoolean() == true) {// 开启了激励奖励
+ Calendar copyofcurrent = (Calendar) before.clone();// 一个上次顶贴时间的副本
+ copyofcurrent.add(Calendar.MINUTE, Option.REWARD_INCENTIVEREWARD_PERIOD.getInt());// 加上设定好的激励时间
+ if (copyofcurrent.before(current)) {// 如果这个时间已经处于"当前领奖的记录"之前
+ result = true;
+ }
+ }
+ return result;
+ }
+
+ // current指需要判断的时间
+ public static boolean canOffDayReward(Calendar current) {
+ boolean result = false;
+ if (Option.REWARD_OFFDAYREWARD_ENABLE.getBoolean() == true) {// 开启了休息日奖励
+ for (String day : Option.REWARD_OFFDAYREWARD_OFFDAYS.getStringList()) {
+ Pattern upcasepattern = Pattern.compile("^[A-Z]+$");// 全大写英文字符串
+ Pattern datepattern = Pattern.compile("^\\d{2}-\\d{2}$");// 00-00格式的字符串
+ if (upcasepattern.matcher(day).matches()) {// 如果是全大写英文字符
+ Class> clazz = Calendar.class;
+ int dayofweek = 0;
+ try {
+ // https://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html
+ // 根据Calendar终态静态变量将字符串转换成星期
+ dayofweek = clazz.getField(day).getInt(null);
+
+ } catch (IllegalArgumentException e) {// 非法参数
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {// 非法访问
+ e.printStackTrace();
+ } catch (NoSuchFieldException e) {// 没有这个属性
+ e.printStackTrace();
+ } catch (SecurityException e) {// 安全
+ e.printStackTrace();
+ }
+ int dayofweekcurrent = current.get(Calendar.DAY_OF_WEEK);// 当前领奖的记录是星期几
+ if (dayofweekcurrent == dayofweek) {// 如果当前就是设定的日子
+ result = true;
+ }
+ } else if (datepattern.matcher(day).matches()) {// 如果是00-00这种字符串
+ SimpleDateFormat offdayformat = new SimpleDateFormat("MM-dd");
+ Calendar offdaycalendar = Calendar.getInstance();// 设定的假日日期(1970年的...)
+ try {
+ Date offdaydate = offdayformat.parse(day);
+ offdaycalendar.setTime(offdaydate);
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+ // 如果当前领奖的记录的月份和日号与设定值一样
+ if (current.get(Calendar.MONTH) == offdaycalendar.get(Calendar.MONTH)
+ && current.get(Calendar.DAY_OF_MONTH) == offdaycalendar.get(Calendar.DAY_OF_MONTH)) {
+ result = true;
+ }
+ }
+ }
+ }
+ return result;
+ }
+
+ public Reward(Player player, Crawler crawler, int index) {
+ this.player = player;
+ this.crawler = crawler;
+ this.index = index;
+ }
+
+ public void award() {
+ List cmds = new ArrayList();
+ boolean incentive = false;// 是否符合激励奖励条件
+ boolean offday = false;// 是否符合休息日奖励条件
+ boolean normal = true;// 是否发放普通奖励
+ SimpleDateFormat bbsformat = new SimpleDateFormat("yyyy-M-d HH:mm");// mcbbs的日期格式
+ Calendar thispost = Calendar.getInstance();// "当前领奖的记录"的时间
+ try {
+ Date thipostdate = bbsformat.parse(crawler.Time.get(index));
+ thispost.setTime(thipostdate);
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+ Calendar lastpost = Calendar.getInstance();// 上一次顶贴的时间
+ if (crawler.Time.size() > index + 1) {// 如果有这一次之前的顶贴记录
+ try {
+ Date lastpostdate = bbsformat.parse(crawler.Time.get(index + 1));// 同理这里应该获取之前那一条记录
+ lastpost.setTime(lastpostdate);
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+ } else {
+ lastpost.setTime(new Date(0));// 没人顶过贴, 将时间设置为1970
+ }
+ if (canIncentiveReward(thispost, lastpost)) {
+ incentive = true;
+ }
+ if (canOffDayReward(thispost)) {
+ offday = true;
+ }
+ String extra = null;
+ if (incentive) {// 如果激励奖励条件达成
+ // 如果休息日奖励也达成了, 并且激励奖励和休息日奖励都不是额外奖励, 不会发放激励奖励(只会发放休息日奖励)
+ if (!(offday && Option.REWARD_INCENTIVEREWARD_EXTRA.getBoolean() == false
+ && Option.REWARD_OFFDAYREWARD_EXTRA.getBoolean() == false)) {
+ cmds.addAll(Option.REWARD_INCENTIVEREWARD_COMMANDS.getStringList());
+ extra = new String(Message.GUI_INCENTIVEREWARDS.getString());
+ }
+ if (Option.REWARD_INCENTIVEREWARD_EXTRA.getBoolean() == false) {
+ // 如果这不是额外奖励, 则普通奖励不会发放
+ normal = false;
+ }
+ }
+ if (offday) {// 如果休息日奖励条件达成
+ cmds.addAll(Option.REWARD_OFFDAYREWARD_COMMANDS.getStringList());
+ if (extra == null) {
+ extra = new String(Message.GUI_OFFDAYREWARDS.getString());
+ } else {
+ extra = extra + "+" + Message.GUI_OFFDAYREWARDS.getString();
+ }
+ if (Option.REWARD_OFFDAYREWARD_EXTRA.getBoolean() == false) {
+ // 如果这不是额外奖励, 则普通奖励不会发放
+ normal = false;
+ }
+ }
+ if (normal) {
+ cmds.addAll(Option.REWARD_COMMANDS.getStringList());
+ }
+ // 让主线程执行
+ Bukkit.getScheduler().runTask(BBSToper.getInstance(), new Runnable() {
+ @Override
+ public void run() {
+ for (String cmd : cmds) {
+ cmd = cmd.replaceAll("%PLAYER%", player.getName());
+ Bukkit.dispatchCommand(Bukkit.getConsoleSender(), cmd);
+ }
+ }
+ });
+ // 给玩家发个消息表示祝贺
+ player.sendMessage(Message.PREFIX.getString() + Message.REWARD.getString().replaceAll("%TIME%", crawler.Time.get(index)));
+ player.sendMessage(Message.PREFIX.getString() + Message.EXTRAREWARD.getString().replaceAll("%EXTRA%", extra));
+ }
+}
diff --git a/src/moe/feo/bbstoper/Util.java b/src/moe/feo/bbstoper/Util.java
index f06a578..8c3972c 100644
--- a/src/moe/feo/bbstoper/Util.java
+++ b/src/moe/feo/bbstoper/Util.java
@@ -1,6 +1,10 @@
package moe.feo.bbstoper;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
import java.util.concurrent.TimeoutException;
import org.bukkit.scheduler.BukkitRunnable;
@@ -37,7 +41,6 @@ public void task() {
Crawler crawler = new Crawler();
if (!crawler.visible)
return;
- crawler.kickExpiredData();
crawler.activeReward();
}
}.runTaskTimerAsynchronously(BBSToper.getInstance(), 0, period);
@@ -68,5 +71,44 @@ public static void removeRunningTaskID(int i) {
if (runningtaskidlist.contains(i))
runningtaskidlist.remove((Integer) i);
}
+
+ public static String getExtraReward(Crawler crawler) {// 获取会获得的额外奖励(可为空)
+ boolean incentive = false;// 是否符合激励奖励条件
+ boolean offday = false;// 是否符合休息日奖励条件
+ Calendar current = Calendar.getInstance();// 当前时间
+ Calendar lastpost = Calendar.getInstance();// 上一次顶贴的时间
+ if (crawler.Time.size() > 0) {// 如果有顶贴记录的话
+ SimpleDateFormat bbsformat = new SimpleDateFormat("yyyy-M-d HH:mm");// mcbbs的日期格式
+ Date lastpostdate = null;
+ try {
+ lastpostdate = bbsformat.parse(crawler.Time.get(0));
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+ lastpost.setTime(lastpostdate);
+ }
+ if (Reward.canIncentiveReward(current, lastpost)) {
+ incentive = true;
+ }
+ if (Reward.canOffDayReward(current)) {
+ offday = true;
+ }
+ String extra = null;
+ if (incentive) {
+ // 如果休息日奖励也达成了, 并且激励奖励和休息日奖励都不是额外奖励, 不会发放激励奖励(只会发放休息日奖励)
+ if (!(offday && Option.REWARD_INCENTIVEREWARD_EXTRA.getBoolean() == false
+ && Option.REWARD_OFFDAYREWARD_EXTRA.getBoolean() == false)) {
+ extra = new String(Message.GUI_INCENTIVEREWARDS.getString());
+ }
+ }
+ if (offday) {
+ if (extra == null) {
+ extra = new String(Message.GUI_OFFDAYREWARDS.getString());
+ } else {
+ extra = extra + "+" + Message.GUI_OFFDAYREWARDS.getString();
+ }
+ }
+ return extra;
+ }
}
diff --git a/src/moe/feo/bbstoper/gui/GUI.java b/src/moe/feo/bbstoper/gui/GUI.java
index 04a0de0..11f8a0c 100644
--- a/src/moe/feo/bbstoper/gui/GUI.java
+++ b/src/moe/feo/bbstoper/gui/GUI.java
@@ -19,6 +19,7 @@
import moe.feo.bbstoper.Message;
import moe.feo.bbstoper.Option;
import moe.feo.bbstoper.Poster;
+import moe.feo.bbstoper.Util;
import moe.feo.bbstoper.sql.SQLer;
public class GUI {
@@ -80,7 +81,15 @@ public void createGui(Player player) {
sunflowermeta.setDisplayName(Message.GUI_REWARDS.getString());
List sunflowerlores = new ArrayList(Message.GUI_REWARDSINFO.getStringList());// 自定义奖励信息
if (sunflowerlores.isEmpty()) {// 如果没有自定义奖励信息
- sunflowerlores = Option.REWARD_COMMANDS.getStringList();// 直接显示命令
+ sunflowerlores.addAll(Option.REWARD_COMMANDS.getStringList());// 直接显示命令
+ if (Option.REWARD_INCENTIVEREWARD_ENABLE.getBoolean()) {
+ sunflowerlores.add(Message.GUI_INCENTIVEREWARDS.getString());// 激励奖励
+ sunflowerlores.addAll(Option.REWARD_INCENTIVEREWARD_COMMANDS.getStringList());// 激励奖励命令
+ }
+ if (Option.REWARD_OFFDAYREWARD_ENABLE.getBoolean()) {
+ sunflowerlores.add(Message.GUI_OFFDAYREWARDS.getString());// 休息日奖励
+ sunflowerlores.addAll(Option.REWARD_OFFDAYREWARD_COMMANDS.getStringList()); // 休息日奖励命令
+ }
}
sunflowerlores.add(Message.GUI_CLICKGET.getString());
sunflowermeta.setLore(sunflowerlores);
@@ -116,6 +125,11 @@ public void createGui(Player player) {
} else {
compasslores.add(Message.GUI_PAGENOTVISIBLE.getString());
}
+ String extra = Util.getExtraReward(crawler);
+ if (extra != null) {
+ String extrarewards = Message.GUI_EXTRAREWARDS.getString().replaceAll("%EXTRA%", extra);
+ compasslores.add(extrarewards);
+ }
compasslores.add(Message.GUI_CLICKOPEN.getString());
compassmeta.setLore(compasslores);
compass.setItemMeta(compassmeta);
@@ -124,6 +138,9 @@ public void createGui(Player player) {
public ItemStack getRandomPane() {// 获取随机一种颜色的玻璃板
short data = (short)(Math.random()* 16);// 这会随机取出0-15的数据值
+ while (data == 8) {// 8号亮灰色染色玻璃板根本没有颜色
+ data = (short)(Math.random()* 16);
+ }
ItemStack frame = new ItemStack(Material.STAINED_GLASS_PANE, 1, data);
ItemMeta framemeta = frame.getItemMeta();
framemeta.setDisplayName(Message.GUI_FRAME.getString());
diff --git a/src/moe/feo/bbstoper/gui/GUIManager.java b/src/moe/feo/bbstoper/gui/GUIManager.java
index 582baac..b3c8734 100644
--- a/src/moe/feo/bbstoper/gui/GUIManager.java
+++ b/src/moe/feo/bbstoper/gui/GUIManager.java
@@ -38,13 +38,13 @@ public void onInventoryClick(InventoryClickEvent event) {
if (rglistener == null) {
new IDListener(player.getUniqueId()).register();// 为此玩家创建一个监听器
String keywords = Arrays.toString(Option.GUI_CANCELKEYWORDS.getStringList().toArray());
- player.sendMessage(Message.ENTER.getString().replaceAll("%KEYWORD%", keywords));
+ player.sendMessage(Message.PREFIX.getString() + Message.ENTER.getString().replaceAll("%KEYWORD%", keywords));
}
}
}
if (Option.GUI_USECHATGETID.getBoolean() == false) {
player.closeInventory();
- player.sendMessage(Message.HELP_BINDING.getString());
+ player.sendMessage(Message.PREFIX.getString() + Message.HELP_BINDING.getString());
}
}
if (event.getRawSlot() == 13) {
diff --git a/src/moe/feo/bbstoper/gui/IDListener.java b/src/moe/feo/bbstoper/gui/IDListener.java
index 2b3d036..9105c5e 100644
--- a/src/moe/feo/bbstoper/gui/IDListener.java
+++ b/src/moe/feo/bbstoper/gui/IDListener.java
@@ -115,7 +115,7 @@ public void onPlayerChat(AsyncPlayerChatEvent event) {// 处理事件
if (cancelkeywords.contains(msg)) {// 如果关键词中包含这次输入的消息
unregister();// 取消监听事件
CLI.getInstance().getCache().put(player.getUniqueId().toString(), null);// 清理这个键
- player.sendMessage(Message.CANCELED.getString());
+ player.sendMessage(Message.PREFIX.getString() + Message.CANCELED.getString());
return;
}
List list = new ArrayList<>(Arrays.asList(msg.split("\\s+")));