1
0
mirror of https://e.coding.net/circlecloud/MiaoBoard.git synced 2024-11-22 01:49:05 +00:00

fix: 修复记分板闪烁问题

Signed-off-by: 502647092 <admin@yumc.pw>
This commit is contained in:
502647092 2016-12-11 22:40:57 +08:00
parent 5a53213666
commit 73c39d110a
12 changed files with 255 additions and 301 deletions

23
pom.xml
View File

@ -3,11 +3,10 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>pw.yumc</groupId> <groupId>pw.yumc</groupId>
<artifactId>MiaoBoard</artifactId> <artifactId>MiaoBoard</artifactId>
<version>2.2</version> <version>2.3</version>
<name>MiaoBoard</name>
<description>喵式记分板</description> <description>喵式记分板</description>
<build> <build>
<finalName>${project.name}</finalName> <finalName>${project.artifactId}</finalName>
<resources> <resources>
<resource> <resource>
<directory>src/main/resources</directory> <directory>src/main/resources</directory>
@ -41,10 +40,6 @@
<pattern>pw.yumc.YumCore</pattern> <pattern>pw.yumc.YumCore</pattern>
<shadedPattern>${project.groupId}.${project.artifactId}</shadedPattern> <shadedPattern>${project.groupId}.${project.artifactId}</shadedPattern>
</relocation> </relocation>
<relocation>
<pattern>cn.citycraft.PluginHelper</pattern>
<shadedPattern>${project.groupId}.${project.artifactId}</shadedPattern>
</relocation>
</relocations> </relocations>
</configuration> </configuration>
<executions> <executions>
@ -67,7 +62,7 @@
</goals> </goals>
<configuration> <configuration>
<options> <options>
<option>-repackageclasses nul.j.for.t.class.b</option> <option>-repackageclasses \ʼ.ʽ.ʾ.${project.artifactId}</option>
<option>-keep class ${project.groupId}.${project.artifactId}.${project.artifactId}</option> <option>-keep class ${project.groupId}.${project.artifactId}.${project.artifactId}</option>
</options> </options>
<libs> <libs>
@ -90,10 +85,6 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> </properties>
<repositories> <repositories>
<repository>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/groups/public/</url>
</repository>
<repository> <repository>
<id>yumc-repo</id> <id>yumc-repo</id>
<url>http://repo.yumc.pw/content/groups/public/</url> <url>http://repo.yumc.pw/content/groups/public/</url>
@ -113,17 +104,11 @@
<type>jar</type> <type>jar</type>
<version>1.10.2-R0.1-SNAPSHOT</version> <version>1.10.2-R0.1-SNAPSHOT</version>
</dependency> </dependency>
<dependency>
<groupId>cn.citycraft</groupId>
<artifactId>PluginHelper</artifactId>
<type>jar</type>
<version>1.0</version>
</dependency>
<dependency> <dependency>
<groupId>pw.yumc</groupId> <groupId>pw.yumc</groupId>
<artifactId>YumCore</artifactId> <artifactId>YumCore</artifactId>
<type>jar</type> <type>jar</type>
<version>1.0</version> <version>1.5</version>
</dependency> </dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -10,8 +10,8 @@
# -----启用混淆字典----- # -----启用混淆字典-----
-obfuscationdictionary obf.dict -obfuscationdictionary obf.dict
-classobfuscationdictionary class.dict -classobfuscationdictionary obf.dict
-packageobfuscationdictionary class.dict -packageobfuscationdictionary obf.dict
# -----保留所有属性 # -----保留所有属性
-keepattributes ** -keepattributes **
@ -26,22 +26,25 @@
-keepclassmembers class * implements org.bukkit.event.Listener { -keepclassmembers class * implements org.bukkit.event.Listener {
@org.bukkit.event.EventHandler <methods>; @org.bukkit.event.EventHandler <methods>;
} }
-keepclassmembers class * implements net.md_5.bungee.api.plugin.Listener {
@net.md_5.bungee.event.EventHandler <methods>;
}
# -----保护枚举方法的完整性-----
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
# -----保护配置注入不被清理----- # -----保护配置注入不被清理-----
-keepclassmembers class * extends **.config.InjectConfigurationSection { -keepclassmembers class * extends **.config**Inject** {
<fields>;
}
-keepclassmembers class * extends **.config.InjectConfig {
<fields>; <fields>;
} }
# -----保护注解命令方法不被清理----- # -----保护注解命令方法不被清理-----
-keepclassmembers class **.commands.annotation.** { <methods>; } -keepclassmembers class **.commands.annotation.** { <methods>; }
-keepclassmembers class * implements **.commands.CommandExecutor { <methods>; } -keepclassmembers class * implements **.commands**CommandExecutor { <methods>; }
-keepclassmembers class **.commands.HandlerCommand { <methods>; }
-keepclassmembers class * implements **.commands.HandlerCommands {
@**.commands.HandlerCommand <methods>;
@**.commands.HandlerTabComplete <methods>;
}
# -----保护注解NotProguard标记----- # -----保护注解NotProguard标记-----
-keep class **.NotProguard -keep class **.NotProguard
-keep @**.NotProguard class * {*;} -keep @**.NotProguard class * {*;}
@ -49,6 +52,3 @@
@**.NotProguard <fields>; @**.NotProguard <fields>;
@**.NotProguard <methods>; @**.NotProguard <methods>;
} }
# -----保护命令解析正常-----
-keepnames class * extends **.commands.BaseCommand

View File

@ -1,18 +1,18 @@
package pw.yumc.MiaoBoard; package pw.yumc.MiaoBoard;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import pw.yumc.MiaoBoard.listener.PlayerListener; import pw.yumc.MiaoBoard.listener.PlayerListener;
import pw.yumc.MiaoBoard.misc.Checker; import pw.yumc.MiaoBoard.misc.Checker;
import pw.yumc.MiaoBoard.scoreboard.ScoreBoardManager; import pw.yumc.MiaoBoard.scoreboard.ScoreBoardManager;
import pw.yumc.YumCore.bukkit.Log; import pw.yumc.YumCore.bukkit.Log;
import pw.yumc.YumCore.commands.CommandArgument; import pw.yumc.YumCore.commands.CommandSub;
import pw.yumc.YumCore.commands.CommandExecutor;
import pw.yumc.YumCore.commands.CommandManager;
import pw.yumc.YumCore.commands.annotation.Cmd; import pw.yumc.YumCore.commands.annotation.Cmd;
import pw.yumc.YumCore.commands.annotation.Cmd.Executor;
import pw.yumc.YumCore.commands.annotation.Help; import pw.yumc.YumCore.commands.annotation.Help;
import pw.yumc.YumCore.commands.annotation.Sort; import pw.yumc.YumCore.commands.annotation.Sort;
import pw.yumc.YumCore.commands.interfaces.Executor;
/** /**
* 喵式记分板主类 * 喵式记分板主类
@ -20,27 +20,27 @@ import pw.yumc.YumCore.commands.annotation.Sort;
* @since 2016年6月4日 上午9:08:13 * @since 2016年6月4日 上午9:08:13
* @author * @author
*/ */
public class MiaoBoard extends JavaPlugin implements CommandExecutor { public class MiaoBoard extends JavaPlugin implements Executor {
private ScoreBoardManager scoreBoardManager; private ScoreBoardManager scoreBoardManager;
public ScoreBoardManager getScoreBoardManager() { public ScoreBoardManager getScoreBoardManager() {
return scoreBoardManager; return scoreBoardManager;
} }
@Cmd(permission = "mb.toggle", executor = Executor.PLAYER) @Cmd(permission = "mb.toggle", executor = Cmd.Executor.PLAYER)
@Help("关闭记分板") @Help("关闭记分板")
@Sort(2) @Sort(2)
public void off(final CommandArgument e) { public void off(final Player player) {
Checker.offList.add(e.getSender().getName()); Checker.offList.add(player.getName());
Log.toSender(e.getSender(), "§c记分板已关闭!"); Log.sender(player, "§c记分板已关闭!");
} }
@Cmd(permission = "mb.toggle", executor = Executor.PLAYER) @Cmd(permission = "mb.toggle", executor = Cmd.Executor.PLAYER)
@Help("打开记分板") @Help("打开记分板")
@Sort(1) @Sort(1)
public void on(final CommandArgument e) { public void on(final Player player) {
Checker.offList.remove(e.getSender().getName()); Checker.offList.remove(player.getName());
Log.toSender(e.getSender(), "§a记分板已打开!"); Log.sender(player, "§a记分板已打开!");
} }
@Override @Override
@ -51,7 +51,7 @@ public class MiaoBoard extends JavaPlugin implements CommandExecutor {
@Override @Override
public void onEnable() { public void onEnable() {
scoreBoardManager.start(); scoreBoardManager.start();
new CommandManager("mb").register(this); new CommandSub("mb").register(this);
new PlayerListener(); new PlayerListener();
} }
@ -62,8 +62,8 @@ public class MiaoBoard extends JavaPlugin implements CommandExecutor {
@Cmd(permission = "mb.reload") @Cmd(permission = "mb.reload")
@Help("重新载入配置文件") @Help("重新载入配置文件")
public void reload(final CommandArgument e) { public void reload(final CommandSender sender) {
scoreBoardManager.reload(); scoreBoardManager.reload();
Log.toSender(e.getSender(), "§a配置重载完毕!"); Log.sender(sender, "§a配置重载完毕!");
} }
} }

View File

@ -3,7 +3,7 @@ package pw.yumc.MiaoBoard.config;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import pw.yumc.YumCore.config.InjectConfig; import pw.yumc.YumCore.config.inject.InjectConfig;
/** /**
* 记分板配置文件类 * 记分板配置文件类

View File

@ -12,10 +12,10 @@ import java.util.regex.Pattern;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import cn.citycraft.PluginHelper.kit.StrKit; import me.clip.placeholderapi.PlaceholderAPI;
import cn.citycraft.PluginHelper.pluginapi.PluginAPI;
import pw.yumc.YumCore.bukkit.P; import pw.yumc.YumCore.bukkit.P;
import pw.yumc.YumCore.bukkit.compatible.C; import pw.yumc.YumCore.bukkit.compatible.C;
import pw.yumc.YumCore.kit.StrKit;
public class Replace { public class Replace {
public static List<String> $(final Player p, final List<String> text) { public static List<String> $(final Player p, final List<String> text) {
@ -31,7 +31,7 @@ public class Replace {
} }
private static String p(final Player p, final String text) { private static String p(final Player p, final String text) {
return PluginAPI.PlaceholderAPI(p, SimpleRelpace.$(p, text)); return PlaceholderAPI.setPlaceholders(p, SimpleRelpace.$(p, text));
} }
private static String s(final String text) { private static String s(final String text) {
@ -141,7 +141,7 @@ public class Replace {
try { try {
final long left = df.parse(time).getTime() - System.currentTimeMillis(); final long left = df.parse(time).getTime() - System.currentTimeMillis();
value = String.valueOf(left / 1000); value = String.valueOf(left / 1000);
} catch (final ParseException e) { } catch (final ParseException ignored) {
} }
return value; return value;
} }

View File

@ -5,9 +5,9 @@ import java.util.List;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import pw.yumc.YumCore.config.ConfigNode; import pw.yumc.YumCore.config.annotation.ConfigNode;
import pw.yumc.YumCore.config.InjectConfigurationSection; import pw.yumc.YumCore.config.annotation.Nullable;
import pw.yumc.YumCore.config.Nullable; import pw.yumc.YumCore.config.inject.InjectConfigurationSection;
/** /**
* 记分板数据模型类 * 记分板数据模型类

View File

@ -4,7 +4,7 @@ import java.util.List;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import cn.citycraft.PluginHelper.callback.CallBackReturn; import pw.yumc.YumCore.callback.CallBackReturn;
/** /**
* *

View File

@ -1,45 +0,0 @@
package pw.yumc.MiaoBoard.scoreboard.core;
import org.bukkit.scoreboard.Objective;
import org.bukkit.scoreboard.Score;
import org.bukkit.scoreboard.Team;
public class Entry {
private final SiderbarBoardPage boardPage;
private Team team;
private final String id;
private String last;
private final int index;
public Entry(final SiderbarBoardPage boardPage, final int index) {
this.boardPage = boardPage;
this.id = String.valueOf(index);
this.index = index;
}
public String getId() {
return id;
}
public int getIndex() {
return index;
}
public Team getTeam() {
return team;
}
public void unregister() {
if (this.last != null) {
this.boardPage.getBoard().resetScores(last);
}
}
public void update(final String text, final int score) {
this.unregister();
final Objective objective = boardPage.getObjective();
final Score scoreObject = objective.getScore(text);
scoreObject.setScore(score);
this.last = text;
}
}

View File

@ -1,14 +1,8 @@
package pw.yumc.MiaoBoard.scoreboard.core; package pw.yumc.MiaoBoard.scoreboard.core;
import java.util.ArrayList;
import java.util.List;
import java.util.TreeMap;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import org.bukkit.scoreboard.Objective;
/** /**
* *
@ -16,15 +10,6 @@ import org.bukkit.scoreboard.Objective;
* @author 尘曲 * @author 尘曲
*/ */
public class SidebarBoard extends Board { public class SidebarBoard extends Board {
private static final TreeMap<Integer, String> coloursById = new TreeMap<>();
static {
int i = 0;
for (final ChatColor chatColor : ChatColor.values()) {
coloursById.put(i++, chatColor.toString());
}
}
public SidebarBoard(final Plugin plugin, final BoardUpdateFunction updateFunction) { public SidebarBoard(final Plugin plugin, final BoardUpdateFunction updateFunction) {
super(plugin, updateFunction); super(plugin, updateFunction);
} }
@ -42,9 +27,7 @@ public class SidebarBoard extends Board {
@Override @Override
public void update(final Player player) { public void update(final Player player) {
final SiderbarBoardPage boardPage = this.getBoardPage(player); final SiderbarBoardPage boardPage = this.getBoardPage(player);
if (boardPage == null) { if (boardPage == null) { return; }
return;
}
String title = null; String title = null;
if (this.getUpdateFunction().getTitleFunction() != null) { if (this.getUpdateFunction().getTitleFunction() != null) {
title = this.getUpdateFunction().getTitleFunction().run(player); title = this.getUpdateFunction().getTitleFunction().run(player);
@ -53,41 +36,8 @@ public class SidebarBoard extends Board {
player.setScoreboard(Bukkit.getScoreboardManager().getMainScoreboard()); player.setScoreboard(Bukkit.getScoreboardManager().getMainScoreboard());
return; return;
} }
final List<String> newContents = this.getUpdateFunction().getBodyFunction().run(player); boardPage.setTitle(title);
this.formatBody(newContents); boardPage.setBody(getUpdateFunction().getBodyFunction().run(player));
final Objective objective = boardPage.getObjective();
objective.setDisplayName(title);
for (int i = 0; i < newContents.size(); i++) {
objective.getScore(newContents.get(i)).setScore(newContents.size() - i);
}
int index = 0;
if (boardPage.getLastEntries() != null) {
for (; index < boardPage.getLastEntries().size() && index < newContents.size(); index++) {
final Entry entry = boardPage.getLastEntries().get(index);
entry.update(newContents.get(index), newContents.size() - index - 1);
}
while (index < boardPage.getLastEntries().size()) {
final Entry entry = boardPage.getLastEntries().remove(index);
entry.unregister();
}
}
if (boardPage.getLastEntries() == null) {
boardPage.setLastEntries(new ArrayList<Entry>());
}
for (; index < newContents.size(); index++) {
final String line = newContents.get(index);
final Entry entry = new Entry(boardPage, index);
entry.update(line, newContents.size() - index - 1);
boardPage.getLastEntries().add(entry);
}
player.setScoreboard(boardPage.getBoard()); player.setScoreboard(boardPage.getBoard());
} }
private void formatBody(final List<String> texts) {
for (int i = 0; i < texts.size(); i++) {
final String line = texts.get(i);
texts.set(i, line + coloursById.get(i));
}
}
} }

View File

@ -1,9 +1,15 @@
package pw.yumc.MiaoBoard.scoreboard.core; package pw.yumc.MiaoBoard.scoreboard.core;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Objects;
import org.apache.commons.lang.Validate;
import org.bukkit.ChatColor;
import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.DisplaySlot;
import org.bukkit.scoreboard.Objective; import org.bukkit.scoreboard.Objective;
import org.bukkit.scoreboard.Team;
/** /**
* *
@ -13,24 +19,93 @@ import org.bukkit.scoreboard.Objective;
public class SiderbarBoardPage extends BoardPage { public class SiderbarBoardPage extends BoardPage {
private final Objective objective; private final Objective objective;
private List<Entry> lastEntries;
private static final List<ChatColor> colors = Arrays.asList(ChatColor.values()); //所有颜色
private final List<BoardLine> boardLines = new ArrayList<>();// ""
public SiderbarBoardPage() { public SiderbarBoardPage() {
super(); super();
objective = getBoard().registerNewObjective("default", "dummy"); objective = getBoard().registerNewObjective("default", "dummy");
objective.setDisplaySlot(DisplaySlot.SIDEBAR); objective.setDisplaySlot(DisplaySlot.SIDEBAR);
for (int i = 0; i < colors.size(); i++) { //循环所有的颜色
final ChatColor color = colors.get(i);
final Team team = getBoard().registerNewTeam("MiaoboardLine" + i); //为每个颜色注册一个队伍
team.addEntry(color.toString()); //为队伍设置一个""
boardLines.add(new BoardLine(color, team)); //""添加至列表
} }
public List<Entry> getLastEntries() {
return lastEntries;
} }
public Objective getObjective() { public Objective getObjective() {
return objective; return objective;
} }
public void setLastEntries(final List<Entry> lastEntries) { public void setTitle(String title) {
this.lastEntries = lastEntries; objective.setDisplayName(title);
}
public void setValue(int line, String value) {
final BoardLine boardLine = getBoardLine(line); //得到我们的""
Validate.notNull(boardLine, "Unable to find BoardLine with index of " + line + "."); //确认是否存在
objective.getScore(boardLine.getColor().toString()).setScore(line); //设置""
String prefix = value;
String suffix = null;
//分割字符串为前16个和后16个
if (value.length() > 16) {
prefix = value.substring(0, 16);
if (ChatColor.getLastColors(prefix) != null && !Objects.equals(ChatColor.getLastColors(prefix), "") && !Objects.equals(ChatColor.getLastColors(prefix), " ")) {
//继承前16个字符的颜色
suffix = ChatColor.getLastColors(prefix) + value.substring(16, value.length());
} else {
suffix = ChatColor.RESET + value.substring(16, value.length());
}
}
boardLine.getTeam().setPrefix(prefix); //设置前16个字符
if (suffix != null) {
boardLine.getTeam().setSuffix(suffix);//"设置后16个字符"
}
}
public void clear(int size) {
if (size < boardLines.size()) {
for (int i = size; i < boardLines.size(); i++) {
removeLine(i);
}
}
}
public void removeLine(int line) {
final BoardLine boardLine = getBoardLine(line);
Validate.notNull(boardLine, "Unable to find BoardLine with index of " + line + "."); //确认是否存在
getBoard().resetScores(boardLine.getColor().toString()); //删除这个""
}
private BoardLine getBoardLine(int line) {
return boardLines.get(line);
}
public void setBody(List<String> newContents) {
for (int i = 0; i < newContents.size(); i++) {
setValue(newContents.size() - i, newContents.get(i));
}
clear(newContents.size());
}
class BoardLine {
private final ChatColor color;
private final Team team;
public BoardLine(ChatColor color, Team team) {
this.color = color;
this.team = team;
}
public ChatColor getColor() {
return color;
}
public Team getTeam() {
return team;
} }
} }
}

View File

@ -1,17 +1,16 @@
package pw.yumc.MiaoBoard.scoreboard.updater; package pw.yumc.MiaoBoard.scoreboard.updater;
import java.util.Collections; import java.util.Collections;
import java.util.Iterator;
import java.util.List; import java.util.List;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import cn.citycraft.PluginHelper.callback.CallBackReturn;
import pw.yumc.MiaoBoard.MiaoBoard; import pw.yumc.MiaoBoard.MiaoBoard;
import pw.yumc.MiaoBoard.misc.Checker; import pw.yumc.MiaoBoard.misc.Checker;
import pw.yumc.MiaoBoard.misc.Replace; import pw.yumc.MiaoBoard.misc.Replace;
import pw.yumc.MiaoBoard.model.BoardModel; import pw.yumc.MiaoBoard.model.BoardModel;
import pw.yumc.YumCore.bukkit.P; import pw.yumc.YumCore.bukkit.P;
import pw.yumc.YumCore.callback.CallBackReturn;
/** /**
* 记分板行更新类 * 记分板行更新类
@ -24,12 +23,8 @@ public class BodyUpdater extends CallBackReturn.One<Player, List<String>> {
@Override @Override
public List<String> run(final Player param) { public List<String> run(final Player param) {
final Iterator<BoardModel> iterator = plugin.getScoreBoardManager().getModels().iterator(); for (BoardModel bmodel : plugin.getScoreBoardManager().getModels()) {
while (iterator.hasNext()) { if (Checker.$(param, bmodel)) { return Replace.$(param, bmodel.lines); }
final BoardModel bmodel = iterator.next();
if (Checker.$(param, bmodel)) {
return Replace.$(param, bmodel.lines);
}
} }
return Collections.emptyList(); return Collections.emptyList();
} }

View File

@ -1,15 +1,13 @@
package pw.yumc.MiaoBoard.scoreboard.updater; package pw.yumc.MiaoBoard.scoreboard.updater;
import java.util.Iterator;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import cn.citycraft.PluginHelper.callback.CallBackReturn;
import pw.yumc.MiaoBoard.MiaoBoard; import pw.yumc.MiaoBoard.MiaoBoard;
import pw.yumc.MiaoBoard.misc.Checker; import pw.yumc.MiaoBoard.misc.Checker;
import pw.yumc.MiaoBoard.misc.Replace; import pw.yumc.MiaoBoard.misc.Replace;
import pw.yumc.MiaoBoard.model.BoardModel; import pw.yumc.MiaoBoard.model.BoardModel;
import pw.yumc.YumCore.bukkit.P; import pw.yumc.YumCore.bukkit.P;
import pw.yumc.YumCore.callback.CallBackReturn;
/** /**
* 记分板标题更新类 * 记分板标题更新类
@ -22,12 +20,8 @@ public class TitleUpdater extends CallBackReturn.One<Player, String> {
@Override @Override
public String run(final Player param) { public String run(final Player param) {
final Iterator<BoardModel> iterator = plugin.getScoreBoardManager().getModels().iterator(); for (BoardModel bmodel : plugin.getScoreBoardManager().getModels()) {
while (iterator.hasNext()) { if (Checker.$(param, bmodel)) { return Replace.$(param, bmodel.title); }
final BoardModel bmodel = iterator.next();
if (Checker.$(param, bmodel)) {
return Replace.$(param, bmodel.title);
}
} }
return null; return null;
} }