mirror of
https://github.com/CarmJos/cn2b2t-project.git
synced 2026-06-04 08:48:16 +08:00
first commit
This commit is contained in:
@@ -0,0 +1 @@
|
|||||||
|
/.idea/
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
variables:
|
||||||
|
TARGET_DIR: /datas/servers/_builds/cn2b2t
|
||||||
|
stages:
|
||||||
|
- check
|
||||||
|
- clean
|
||||||
|
- build
|
||||||
|
# ¹¹½¨ Job
|
||||||
|
check:
|
||||||
|
stage: check
|
||||||
|
tags:
|
||||||
|
- maven
|
||||||
|
script:
|
||||||
|
- mvn -v
|
||||||
|
- mkdir -vp -m777 $TARGET_DIR
|
||||||
|
clean:
|
||||||
|
stage: clean
|
||||||
|
tags:
|
||||||
|
- maven
|
||||||
|
script:
|
||||||
|
- rm -vrf $TARGET_DIR/*.jar
|
||||||
|
build:
|
||||||
|
stage: build
|
||||||
|
tags:
|
||||||
|
- maven
|
||||||
|
script:
|
||||||
|
- mvn install
|
||||||
|
- ls ./*/target/*.jar
|
||||||
|
- cp -vrf ./*/target/*.jar $TARGET_DIR/
|
||||||
Generated
+8
@@ -0,0 +1,8 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# Datasource local storage ignored files
|
||||||
|
/dataSources/
|
||||||
|
/dataSources.local.xml
|
||||||
|
# Editor-based HTTP Client requests
|
||||||
|
/httpRequests/
|
||||||
Generated
+15
@@ -0,0 +1,15 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="CompilerConfiguration">
|
||||||
|
<annotationProcessing>
|
||||||
|
<profile name="Maven default annotation processors profile" enabled="true">
|
||||||
|
<sourceOutputDir name="target/generated-sources/annotations" />
|
||||||
|
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
|
||||||
|
<outputRelativeToContentRoot value="true" />
|
||||||
|
<module name="2b2t-core" />
|
||||||
|
<module name="2b2t-faction" />
|
||||||
|
<module name="2b2t-common" />
|
||||||
|
</profile>
|
||||||
|
</annotationProcessing>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
Generated
+12
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="Encoding">
|
||||||
|
<file url="file://$PROJECT_DIR$/.gitlab-ci.yml" charset="GBK" />
|
||||||
|
<file url="file://$PROJECT_DIR$/2b2t-common/src/main/java" charset="UTF-8" />
|
||||||
|
<file url="file://$PROJECT_DIR$/2b2t-common/src/main/resources" charset="UTF-8" />
|
||||||
|
<file url="file://$PROJECT_DIR$/2b2t-core/src/main/java" charset="UTF-8" />
|
||||||
|
<file url="file://$PROJECT_DIR$/2b2t-core/src/main/resources" charset="UTF-8" />
|
||||||
|
<file url="file://$PROJECT_DIR$/2b2t-faction/src/main/java" charset="UTF-8" />
|
||||||
|
<file url="file://$PROJECT_DIR$/2b2t-faction/src/main/resources" charset="UTF-8" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
Generated
+20
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="RemoteRepositoriesConfiguration">
|
||||||
|
<remote-repository>
|
||||||
|
<option name="id" value="central" />
|
||||||
|
<option name="name" value="Central Repository" />
|
||||||
|
<option name="url" value="https://repo.maven.apache.org/maven2" />
|
||||||
|
</remote-repository>
|
||||||
|
<remote-repository>
|
||||||
|
<option name="id" value="central" />
|
||||||
|
<option name="name" value="Maven Central repository" />
|
||||||
|
<option name="url" value="https://repo1.maven.org/maven2" />
|
||||||
|
</remote-repository>
|
||||||
|
<remote-repository>
|
||||||
|
<option name="id" value="jboss.community" />
|
||||||
|
<option name="name" value="JBoss Community repository" />
|
||||||
|
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
|
||||||
|
</remote-repository>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
Generated
+14
@@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||||
|
<component name="MavenProjectsManager">
|
||||||
|
<option name="originalFiles">
|
||||||
|
<list>
|
||||||
|
<option value="$PROJECT_DIR$/pom.xml" />
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
|
||||||
|
<output url="file://$PROJECT_DIR$/out" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
<?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">
|
||||||
|
<parent>
|
||||||
|
<artifactId>cn2b2t</artifactId>
|
||||||
|
<groupId>org.cn2b2t</groupId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<artifactId>2b2t-common</artifactId>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<source>8</source>
|
||||||
|
<target>8</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.spigotmc</groupId>
|
||||||
|
<artifactId>spigot</artifactId>
|
||||||
|
<version>1.12.2-R0.1-SNAPSHOT</version>
|
||||||
|
<systemPath>${basedir}/../_lib/spigot.jar</systemPath>
|
||||||
|
<scope>system</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.mcpay</groupId>
|
||||||
|
<artifactId>McPay</artifactId>
|
||||||
|
<version>obf-2.0.0-alpha-b92</version>
|
||||||
|
<systemPath>${basedir}/../_lib/McPay-obf-2.0.0-alpha-b92.jar</systemPath>
|
||||||
|
<scope>system</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.cn2b2t</groupId>
|
||||||
|
<artifactId>2b2t-core</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
</project>
|
||||||
@@ -0,0 +1,96 @@
|
|||||||
|
package org.cn2b2t.common;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
import org.cn2b2t.common.commands.*;
|
||||||
|
import org.cn2b2t.common.listeners.*;
|
||||||
|
import org.cn2b2t.common.managers.DataManager;
|
||||||
|
import org.cn2b2t.common.managers.DonateManager;
|
||||||
|
import org.cn2b2t.common.managers.UserDataManager;
|
||||||
|
import org.cn2b2t.common.managers.WorldBorderManager;
|
||||||
|
import org.cn2b2t.common.runnables.BoardCastRunnable;
|
||||||
|
import org.cn2b2t.common.runnables.RestartRunnable;
|
||||||
|
|
||||||
|
public class Main extends JavaPlugin {
|
||||||
|
|
||||||
|
public static String pluginName = "2b2t-common";
|
||||||
|
public static String pluginVersion = "1.0-SNAPSHOT";
|
||||||
|
|
||||||
|
private static Main instance;
|
||||||
|
|
||||||
|
public static Main getInstance() {
|
||||||
|
return Main.instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String color(final String text) {
|
||||||
|
return text.replaceAll("&", "§").replaceAll("§§", "&");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void pluginMessage(String s) {
|
||||||
|
this.getServer().getConsoleSender().sendMessage(ChatColor.DARK_GRAY + "[" + ChatColor.RED + "!" + ChatColor.DARK_GRAY + "] " + ChatColor.AQUA + pluginName + " " + ChatColor.WHITE + pluginVersion + ChatColor.GRAY + s);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onEnable() {
|
||||||
|
Main.instance = this;
|
||||||
|
inits();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDisable() {
|
||||||
|
this.shutdown();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void inits() {
|
||||||
|
regCmds();
|
||||||
|
regListeners();
|
||||||
|
pluginMessage("已启用。");
|
||||||
|
saveConfig();
|
||||||
|
saveDefaultConfig();
|
||||||
|
reloadConfig();
|
||||||
|
DataManager.init();
|
||||||
|
UserDataManager.init();
|
||||||
|
WorldBorderManager.init();
|
||||||
|
DonateManager.init();
|
||||||
|
new BoardCastRunnable();
|
||||||
|
new RestartRunnable(21600);
|
||||||
|
|
||||||
|
// BungeeTabListPlusBukkitAPI.registerVariable(this, new Serverprefix());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void shutdown() {
|
||||||
|
this.pluginMessage("已卸载。");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void regCmds() {
|
||||||
|
this.getCommand("suicide").setExecutor(new Suicide());
|
||||||
|
this.getCommand("delay").setExecutor(new Delay());
|
||||||
|
this.getCommand("help").setExecutor(new Help());
|
||||||
|
this.getCommand("donate").setExecutor(new Donate());
|
||||||
|
this.getCommand("donate").setTabCompleter(new Donate());
|
||||||
|
this.getCommand("settings").setExecutor(new Settings());
|
||||||
|
this.getCommand("settings").setTabCompleter(new Settings());
|
||||||
|
this.getCommand("toggle").setExecutor(new Toggle());
|
||||||
|
this.getCommand("toggle").setTabCompleter(new Toggle());
|
||||||
|
this.getCommand("ignore").setExecutor(new Ignore());
|
||||||
|
this.getCommand("ignore").setTabCompleter(new Ignore());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void regListeners() {
|
||||||
|
Bukkit.getPluginManager().registerEvents(new QuitListener(), this);
|
||||||
|
Bukkit.getPluginManager().registerEvents(new RespawnListener(), this);
|
||||||
|
Bukkit.getPluginManager().registerEvents(new LoginListener(), this);
|
||||||
|
Bukkit.getPluginManager().registerEvents(new ChatListener(), this);
|
||||||
|
Bukkit.getPluginManager().registerEvents(new Protection(), this);
|
||||||
|
Bukkit.getPluginManager().registerEvents(new SignColor(), this);
|
||||||
|
Bukkit.getPluginManager().registerEvents(new AnvilColorPatch(), this);
|
||||||
|
Bukkit.getPluginManager().registerEvents(new FastPot(), this);
|
||||||
|
Bukkit.getPluginManager().registerEvents(new BedListener(), this);
|
||||||
|
Bukkit.getPluginManager().registerEvents(new ScoreboardListener(), this);
|
||||||
|
Bukkit.getPluginManager().registerEvents(new UnfairListener(), this);
|
||||||
|
Bukkit.getPluginManager().registerEvents(new DeathListener(), this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
package org.cn2b2t.common.commands;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandExecutor;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.cn2b2t.common.Main;
|
||||||
|
import org.cn2b2t.common.functions.ProfileData;
|
||||||
|
import org.cn2b2t.common.runnables.RestartRunnable;
|
||||||
|
|
||||||
|
public class Delay implements CommandExecutor {
|
||||||
|
|
||||||
|
private boolean hasDelayed = false;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
|
||||||
|
if (cmd.getName().equalsIgnoreCase("delay")) {
|
||||||
|
if (sender instanceof Player) {
|
||||||
|
Player p = (Player) sender;
|
||||||
|
if (ProfileData.getProfileData(p).getMonthlyDonate() > 10) {
|
||||||
|
if (!hasDelayed) {
|
||||||
|
RestartRunnable.count = RestartRunnable.count + 600;
|
||||||
|
hasDelayed = true;
|
||||||
|
Bukkit.getOnlinePlayers().forEach(player -> player.sendMessage(Main.color(
|
||||||
|
"&6-&e--&8----------------------------&e--&6-\n" +
|
||||||
|
"&7服务器重启事项已被玩家 &e" + p.getName() + " &7推迟10分钟。\n" +
|
||||||
|
"&6-&e--&8----------------------------&e--&6-"
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
p.sendMessage(Main.color("&7本功能只有至今一个月内赞助&e超过10元&7的玩家才可使用。\n" +
|
||||||
|
"&7输入 &6/donate &7,查看赞助方法,一起维护这个服务器吧!"));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
RestartRunnable.count = RestartRunnable.count + 3600;
|
||||||
|
Bukkit.getOnlinePlayers().forEach(player -> player.sendMessage(Main.color(
|
||||||
|
"&6-&e--&8----------------------------&e--&6-\n" +
|
||||||
|
"&7服务器重启事项已被控制台推迟一小时。\n" +
|
||||||
|
"&6-&e--&8----------------------------&e--&6-"
|
||||||
|
)));
|
||||||
|
hasDelayed = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,118 @@
|
|||||||
|
package org.cn2b2t.common.commands;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandExecutor;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.command.TabCompleter;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.util.StringUtil;
|
||||||
|
import org.cn2b2t.common.Main;
|
||||||
|
import org.cn2b2t.common.managers.DataManager;
|
||||||
|
import org.cn2b2t.common.managers.DonateManager;
|
||||||
|
import org.cn2b2t.common.functions.ProfileData;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class Donate implements CommandExecutor, TabCompleter {
|
||||||
|
@Override
|
||||||
|
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
|
||||||
|
if (cmd.getName().equalsIgnoreCase("donate") && sender instanceof Player) {
|
||||||
|
Player p = (Player) sender;
|
||||||
|
if (args.length >= 1) {
|
||||||
|
String aim = args[0];
|
||||||
|
if (aim.equalsIgnoreCase("me")) {
|
||||||
|
help(p, 1);
|
||||||
|
} else if (aim.equalsIgnoreCase("info")) {
|
||||||
|
help(p, 2);
|
||||||
|
} else if (aim.equals("1") || aim.equals("5") || aim.equals("10") || aim.equals("20") || aim.equals("50")) {
|
||||||
|
Main.getInstance().getServer().dispatchCommand(Bukkit.getConsoleSender(), "mcpay pbuy " + sender.getName() + " " + DonateManager.getID(aim));
|
||||||
|
} else {
|
||||||
|
help(p, 0);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
help(p, 0);
|
||||||
|
}
|
||||||
|
} else if (cmd.getName().equalsIgnoreCase("donate")) {
|
||||||
|
if (args.length == 4) {
|
||||||
|
// donate apply adehcby 20200306194633048611812 20
|
||||||
|
String playername = args[1];
|
||||||
|
String order = args[2];
|
||||||
|
String price = args[3];
|
||||||
|
Bukkit.getOnlinePlayers().forEach(p -> p.sendMessage(Main.color(
|
||||||
|
"&6-&e--&8----------------------------&e--&6-\n" +
|
||||||
|
"&7感谢 &6&l" + playername + "&7为本服助力 &6" + price + "元 &7!\n" +
|
||||||
|
"&7本服仅由玩家赞助维持,输入 &6/donate &7查看更多。\n" +
|
||||||
|
"&6-&e--&8----------------------------&e--&6-"
|
||||||
|
)));
|
||||||
|
DataManager.saveData(Bukkit.getPlayer(playername), order, (int) Double.parseDouble(price));
|
||||||
|
|
||||||
|
}
|
||||||
|
sender.sendMessage(Main.color(" \n本月赞助 &6" + DonateManager.monthly + "\n" +
|
||||||
|
"总共收到 &6" + DonateManager.total));
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void help(Player p, int i) {
|
||||||
|
switch (i) {
|
||||||
|
case 1: {
|
||||||
|
ProfileData profileData = ProfileData.getProfileData(p);
|
||||||
|
p.sendMessage(Main.color("&6-&e--&8----------------------------&e--&6-\n" +
|
||||||
|
"&7您总共赞助了 &6" + profileData.getTotalDonate() + " &7元;\n" +
|
||||||
|
"&7至今一个月内,您为服务器提供了 &6" + profileData.getMonthlyDonate() + " &7元资金。\n" +
|
||||||
|
"&7总共为服务器续命 &6" + profileData.getTotalDonate() / 50 + " &7天。\n" +
|
||||||
|
(profileData.getTotalDonate() > 0 ? "&7感谢您为本社区所做的一切!\n" : "\n") +
|
||||||
|
"&6-&e--&8----------------------------&e--&6-"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 2: {
|
||||||
|
p.sendMessage(Main.color("&6-&e--&8----------------------------&e--&6-\n" +
|
||||||
|
"&7本服&c无管理维护,仅由玩家赞助维持&7。\n" +
|
||||||
|
"&7所收赞助钱款自动化处理,全部转账到服务商账户中。\n" +
|
||||||
|
"&7若您还未有相应消费能力,&c谢绝赞助,心意已领&7。\n" +
|
||||||
|
"&7至今一个月内 赞助&6超过5元的&7即可获得 &e浅黄色 &7聊天名,\n" +
|
||||||
|
"&7至今一个月内 赞助&6超过10元&7的可以延迟服务器重启。\n" +
|
||||||
|
"&7总共赞助&6超过50元&7的,即使本服务器已满人,也可进入。\n" +
|
||||||
|
"&6-&e--&8----------------------------&e--&6-"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
p.sendMessage(Main.color("&6-&e--&8----------------------------&e--&6-\n" +
|
||||||
|
"&7本服自2019年9月1日起,开始接受玩家资助。\n" +
|
||||||
|
"&7本月获得赞助 &6" + DonateManager.monthly + "元&7,总共获得 &6" + DonateManager.total + "元&7。\n" +
|
||||||
|
"&7查看介绍 &6/donate info\n" +
|
||||||
|
"&7查看我的贡献 &6/donate me\n" +
|
||||||
|
"&7赞助对应金额 &6/donate 1/5/10/20/50\n" +
|
||||||
|
"&c注意:&7目前仅支持单笔1元、5元、 10元、20元、50元,\n" +
|
||||||
|
" &7请勿输入其他金额。\n" +
|
||||||
|
"&6-&e--&8----------------------------&e--&6-"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
|
||||||
|
switch (args.length) {
|
||||||
|
case 1: {
|
||||||
|
List<String> completions = new ArrayList<>();
|
||||||
|
String[] strings = new String[]{"info", "me", "1", "5", "10"};
|
||||||
|
for (String s : strings) {
|
||||||
|
if (StringUtil.startsWithIgnoreCase(s, args[0].toLowerCase())) {
|
||||||
|
completions.add(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return completions;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return ImmutableList.of();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
package org.cn2b2t.common.commands;
|
||||||
|
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandExecutor;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.cn2b2t.common.Main;
|
||||||
|
|
||||||
|
public class Help implements CommandExecutor {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
|
||||||
|
if (cmd.getName().equalsIgnoreCase("help")) {
|
||||||
|
sender.sendMessage(Main.color(
|
||||||
|
"&6-&e--&8----------------------------&e--&6-\n" +
|
||||||
|
"&7查看服务器版本 &6/version\n" +
|
||||||
|
"&7屏蔽玩家 &6/ignore <ID>\n" +
|
||||||
|
"&7想要赞助 &6/donate\n" +
|
||||||
|
"&7推迟重启 &6/delay\n" +
|
||||||
|
"&7不想活了 &6/suicide\n" +
|
||||||
|
"&7个人设置 &6/settings &7查看详情。\n" +
|
||||||
|
"&7开关设置 &6/toggle &7查看详情。\n" +
|
||||||
|
"&7其余更多原版自带指令,不做详解,自行搜索、询问。\n" +
|
||||||
|
"&6-&e--&8----------------------------&e--&6-"
|
||||||
|
));
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
package org.cn2b2t.common.commands;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandExecutor;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.command.TabCompleter;
|
||||||
|
import org.bukkit.entity.HumanEntity;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.util.StringUtil;
|
||||||
|
import org.cn2b2t.common.Main;
|
||||||
|
import org.cn2b2t.common.functions.ProfileData;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
public class Ignore implements CommandExecutor, TabCompleter {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
|
||||||
|
if (cmd.getName().equalsIgnoreCase("ignore") && sender instanceof Player) {
|
||||||
|
Player p = (Player) sender;
|
||||||
|
if (args.length >= 1) {
|
||||||
|
String aim = args[0];
|
||||||
|
if (Bukkit.getPlayer(aim) != null && Bukkit.getPlayer(aim).isOnline()) {
|
||||||
|
ignore(p, Bukkit.getPlayer(aim));
|
||||||
|
} else {
|
||||||
|
p.sendMessage("&7您所想屏蔽的玩家并不在线!");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
help(p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void help(Player p) {
|
||||||
|
p.sendMessage(Main.color("&6-&e--&8----------------------------&e--&6-\n" +
|
||||||
|
"&7屏蔽某人消息 &6/ignore &8<&6ID&8>\n" +
|
||||||
|
"&7注意,每次屏蔽退出服务器后即失效,若需要请再次屏蔽。" +
|
||||||
|
"&6-&e--&8----------------------------&e--&6-"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void ignore(Player p, Player target) {
|
||||||
|
if (p != target) {
|
||||||
|
p.sendMessage(Main.color("&6-&e--&8----------------------------&e--&6-\n" +
|
||||||
|
"&7已成功屏蔽 &2" + target.getName() + "&7 !\n" +
|
||||||
|
"&7注意,本次屏蔽退出服务器后即失效,若需要请再次屏蔽。" +
|
||||||
|
"&6-&e--&8----------------------------&e--&6-"));
|
||||||
|
ProfileData.getProfileData(p).ignorePlayer(target.getUniqueId());
|
||||||
|
} else {
|
||||||
|
p.sendMessage(Main.color("&7您无法屏蔽您自己!"));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
|
||||||
|
switch (args.length) {
|
||||||
|
case 1: {
|
||||||
|
return Bukkit.getOnlinePlayers().stream().filter(p -> sender instanceof Player
|
||||||
|
&& p != sender
|
||||||
|
&& StringUtil.startsWithIgnoreCase(p.getName(), args[0].toLowerCase())).map(HumanEntity::getName)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return ImmutableList.of();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
package org.cn2b2t.common.commands;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandExecutor;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.command.TabCompleter;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.util.StringUtil;
|
||||||
|
import org.cn2b2t.common.Main;
|
||||||
|
import org.cn2b2t.common.functions.ProfileData;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class Settings implements CommandExecutor, TabCompleter {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
|
||||||
|
if (cmd.getName().equalsIgnoreCase("settings") && sender instanceof Player) {
|
||||||
|
Player p = (Player) sender;
|
||||||
|
if (args.length >= 2 && (args[1].equalsIgnoreCase("true") || args[1].equalsIgnoreCase("false"))) {
|
||||||
|
String aim = args[0];
|
||||||
|
boolean value = args[1].equalsIgnoreCase("true");
|
||||||
|
|
||||||
|
if (aim.equalsIgnoreCase("showScoreboard") || aim.equalsIgnoreCase("ssb")) {
|
||||||
|
ProfileData.getProfileData(p).setShowScoreboard(value);
|
||||||
|
} else if (aim.equalsIgnoreCase("showDeathMessages") || aim.equalsIgnoreCase("sdm")) {
|
||||||
|
ProfileData.getProfileData(p).setShowDeathMessages(value);
|
||||||
|
} else if (aim.equalsIgnoreCase("showJoinAndLeaveAlerts") || aim.equalsIgnoreCase("sjaqa")) {
|
||||||
|
ProfileData.getProfileData(p).setShowJoinAndLeaveAlerts(value);
|
||||||
|
} else {
|
||||||
|
help(p);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
help(p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void help(Player p) {
|
||||||
|
p.sendMessage(Main.color("&6-&e--&8----------------------------&e--&6-\n" +
|
||||||
|
"&7开关积分榜\n" +
|
||||||
|
" &6/settings showScoreboard true/false\n" +
|
||||||
|
"&7开关死亡消息\n" +
|
||||||
|
" &6/settings showDeathMessages true/false\n" +
|
||||||
|
"&7开关玩家加入、退出提示信息\n" +
|
||||||
|
" &6/settings showJoinAndLeaveAlerts true/false\n" +
|
||||||
|
"&6-&e--&8----------------------------&e--&6-"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
|
||||||
|
switch (args.length) {
|
||||||
|
case 1: {
|
||||||
|
List<String> completions = new ArrayList<>();
|
||||||
|
String[] strings = new String[]{"showScoreboard", "showDeathMessages", "showJoinAndLeaveAlerts"};
|
||||||
|
for (String s : strings) {
|
||||||
|
if (StringUtil.startsWithIgnoreCase(s, args[0].toLowerCase())) {
|
||||||
|
completions.add(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return completions;
|
||||||
|
}
|
||||||
|
case 2: {
|
||||||
|
List<String> completions = new ArrayList<>();
|
||||||
|
String[] strings = new String[]{"true", "false"};
|
||||||
|
for (String s : strings) {
|
||||||
|
if (StringUtil.startsWithIgnoreCase(s, args[0].toLowerCase())) {
|
||||||
|
completions.add(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return completions;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return ImmutableList.of();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
package org.cn2b2t.common.commands;
|
||||||
|
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandExecutor;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.cn2b2t.common.Main;
|
||||||
|
|
||||||
|
public class Suicide implements CommandExecutor {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
|
||||||
|
if (cmd.getName().equalsIgnoreCase("suicide")) {
|
||||||
|
if (sender instanceof Player) ((Player) sender).setHealth(0);
|
||||||
|
sender.sendMessage(Main.color("&a这个世界虽然不完美,但我们仍然可以治愈自己。\n" +
|
||||||
|
"&7全国免费心理咨询热线 &f&l800-810-1117"));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
package org.cn2b2t.common.commands;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandExecutor;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.command.TabCompleter;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.util.StringUtil;
|
||||||
|
import org.cn2b2t.common.Main;
|
||||||
|
import org.cn2b2t.common.functions.ProfileData;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class Toggle implements CommandExecutor, TabCompleter {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
|
||||||
|
if (cmd.getName().equalsIgnoreCase("toggle") && sender instanceof Player) {
|
||||||
|
Player p = (Player) sender;
|
||||||
|
if (args.length >= 1) {
|
||||||
|
String aim = args[0];
|
||||||
|
if (aim.equalsIgnoreCase("scoreboard") || aim.equalsIgnoreCase("sb")) {
|
||||||
|
ProfileData.getProfileData(p).setShowScoreboard(!ProfileData.getProfileData(p).showScoreboard);
|
||||||
|
} else if (aim.equalsIgnoreCase("deathmessages") || aim.equalsIgnoreCase("dm")) {
|
||||||
|
ProfileData.getProfileData(p).setShowDeathMessages(!ProfileData.getProfileData(p).showDeathMessages);
|
||||||
|
} else if (aim.equalsIgnoreCase("joinandquitalerts") || aim.equalsIgnoreCase("jaqa")) {
|
||||||
|
ProfileData.getProfileData(p).setShowJoinAndLeaveAlerts(!ProfileData.getProfileData(p).showJoinAndLeaveAlerts);
|
||||||
|
} else {
|
||||||
|
help(p);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
help(p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// /toggle scoreboard / sb
|
||||||
|
// /toggle joinandquitmessages / jaqm
|
||||||
|
|
||||||
|
private static void help(Player p) {
|
||||||
|
p.sendMessage(Main.color("&6-&e--&8----------------------------&e--&6-\n" +
|
||||||
|
"&7开关积分榜 &6/toggle scoreboard\n" +
|
||||||
|
"&7开关死亡消息 &6/toggle deathmessages\n" +
|
||||||
|
"&7开关玩家加入、退出提示信息\n" +
|
||||||
|
" &6/toggle joinandquitalerts\n" +
|
||||||
|
"&6-&e--&8----------------------------&e--&6-"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
|
||||||
|
switch (args.length) {
|
||||||
|
case 1: {
|
||||||
|
List<String> completions = new ArrayList<>();
|
||||||
|
String[] strings = new String[]{"scoreboard", "deathmessages", "joinandquitalerts"};
|
||||||
|
for (String s : strings) {
|
||||||
|
if (StringUtil.startsWithIgnoreCase(s, args[0].toLowerCase())) {
|
||||||
|
completions.add(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return completions;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return ImmutableList.of();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package org.cn2b2t.common.enums;
|
||||||
|
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
|
||||||
|
public enum Locations {
|
||||||
|
|
||||||
|
|
||||||
|
SPAWN(new Location(Bukkit.getWorld("world"), 0.5D, 100D, 0.5D, 0, 0));
|
||||||
|
|
||||||
|
|
||||||
|
Location location;
|
||||||
|
|
||||||
|
Locations(Location loc) {
|
||||||
|
this.location = loc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Location getLocation() {
|
||||||
|
return location;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package org.cn2b2t.common.enums;
|
||||||
|
|
||||||
|
public enum LogType {
|
||||||
|
CHAT,
|
||||||
|
JOIN,
|
||||||
|
QUIT,
|
||||||
|
AC,
|
||||||
|
COMMAND
|
||||||
|
}
|
||||||
@@ -0,0 +1,181 @@
|
|||||||
|
package org.cn2b2t.common.functions;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.cn2b2t.common.listeners.ScoreboardListener;
|
||||||
|
import org.cn2b2t.common.managers.DataManager;
|
||||||
|
import org.cn2b2t.common.managers.DonateManager;
|
||||||
|
import org.cn2b2t.common.managers.ScoreboardManager;
|
||||||
|
import org.cn2b2t.common.managers.UserDataManager;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
public class ProfileData {
|
||||||
|
|
||||||
|
public static Map<Player, ProfileData> profileDatas = new HashMap<>();
|
||||||
|
|
||||||
|
public Player player;
|
||||||
|
|
||||||
|
public double totalDonate;
|
||||||
|
public double monthlyDonate;
|
||||||
|
public List<UUID> ignoredPlayers;
|
||||||
|
|
||||||
|
public boolean showDeathMessages;
|
||||||
|
public boolean showScoreboard;
|
||||||
|
public boolean showJoinAndLeaveAlerts;
|
||||||
|
|
||||||
|
public Location bedLocation;
|
||||||
|
public Location spawnLocation;
|
||||||
|
|
||||||
|
public ProfileData(Player p) {
|
||||||
|
this.player = p;
|
||||||
|
|
||||||
|
totalDonate = DataManager.getTotalDonate(p.getUniqueId());
|
||||||
|
monthlyDonate = DataManager.getDonateInAMonth(p.getUniqueId());
|
||||||
|
|
||||||
|
ignoredPlayers = new ArrayList<>();
|
||||||
|
// UserDataManager.getDatas().getStringList(p.getUniqueId().toString() + ".ingnoredPlayers").forEach(s -> ignoredPlayers.add(UUID.fromString(s)));
|
||||||
|
|
||||||
|
showDeathMessages = UserDataManager.getDatas().getBoolean(p.getUniqueId().toString() + ".settings.showDeathMessages", true);
|
||||||
|
showScoreboard = UserDataManager.getDatas().getBoolean(p.getUniqueId().toString() + ".settings.showScoreboard", true);
|
||||||
|
showJoinAndLeaveAlerts = UserDataManager.getDatas().getBoolean(p.getUniqueId().toString() + ".settings.showJoinAndLeaveAlerts", true);
|
||||||
|
|
||||||
|
bedLocation = new Location(Bukkit.getWorld("world"),
|
||||||
|
UserDataManager.getDatas().getDouble(p.getUniqueId().toString() + ".bedLocation.x", 0D),
|
||||||
|
UserDataManager.getDatas().getDouble(p.getUniqueId().toString() + ".bedLocation.y", 101D),
|
||||||
|
UserDataManager.getDatas().getDouble(p.getUniqueId().toString() + ".bedLocation.z", 0D),
|
||||||
|
UserDataManager.getDatas().getLong(p.getUniqueId().toString() + ".bedLocation.yaw", 0L),
|
||||||
|
UserDataManager.getDatas().getLong(p.getUniqueId().toString() + ".bedLocation.pitch", 0L));
|
||||||
|
|
||||||
|
spawnLocation = new Location(Bukkit.getWorld("world"),
|
||||||
|
UserDataManager.getDatas().getDouble(p.getUniqueId().toString() + ".spawnLocation.x", 0D),
|
||||||
|
UserDataManager.getDatas().getDouble(p.getUniqueId().toString() + ".spawnLocation.y", 101D),
|
||||||
|
UserDataManager.getDatas().getDouble(p.getUniqueId().toString() + ".spawnLocation.z", 0D),
|
||||||
|
UserDataManager.getDatas().getLong(p.getUniqueId().toString() + ".spawnLocation.yaw", 0L),
|
||||||
|
UserDataManager.getDatas().getLong(p.getUniqueId().toString() + ".spawnLocation.pitch", 0L));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getMonthlyDonate() {
|
||||||
|
return DonateManager.getPlayerMonthlyPay(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getTotalDonate() {
|
||||||
|
return DonateManager.getPlayerTotalPay(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<UUID> getIgnoredPlayers() {
|
||||||
|
return ignoredPlayers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isIgnored(UUID uuid) {
|
||||||
|
return ignoredPlayers.contains(uuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ignorePlayer(UUID uuid) {
|
||||||
|
ignoredPlayers.add(uuid);
|
||||||
|
// UserDataManager.getDatas().set(player.getUniqueId().toString() + ".ingnoredPlayers", ignoredPlayers);
|
||||||
|
// try {
|
||||||
|
// UserDataManager.getDatas().save(UserDataManager.getConfigfile());
|
||||||
|
// } catch (IOException e) {
|
||||||
|
// e.printStackTrace();
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
// public void unignorePlayer(UUID uuid) {
|
||||||
|
// ignoredPlayers.remove(uuid);
|
||||||
|
// UserDataManager.getDatas().set(player.getUniqueId().toString() + ".ingnoredPlayers", ignoredPlayers);
|
||||||
|
// try {
|
||||||
|
// UserDataManager.getDatas().save(UserDataManager.getConfigfile());
|
||||||
|
// } catch (IOException e) {
|
||||||
|
// e.printStackTrace();
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
public void updateDonates() {
|
||||||
|
this.totalDonate = getTotalDonate();
|
||||||
|
this.monthlyDonate = getMonthlyDonate();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setShowDeathMessages(boolean showDeathMessages) {
|
||||||
|
this.showDeathMessages = showDeathMessages;
|
||||||
|
UserDataManager.getDatas().set(player.getUniqueId().toString() + ".settings.showdeathmessages", showDeathMessages);
|
||||||
|
try {
|
||||||
|
UserDataManager.getDatas().save(UserDataManager.getConfigfile());
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setShowJoinAndLeaveAlerts(boolean showJoinAndLeaveAlerts) {
|
||||||
|
this.showJoinAndLeaveAlerts = showJoinAndLeaveAlerts;
|
||||||
|
UserDataManager.getDatas().set(player.getUniqueId().toString() + ".settings.showJoinAndLeaveAlerts", showJoinAndLeaveAlerts);
|
||||||
|
try {
|
||||||
|
UserDataManager.getDatas().save(UserDataManager.getConfigfile());
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setShowScoreboard(boolean showScoreboard) {
|
||||||
|
if (showScoreboard && !this.showScoreboard) {
|
||||||
|
ScoreboardListener.addScoreboard(player);
|
||||||
|
} else if (ScoreboardManager.scoreboards.containsKey(player)) {
|
||||||
|
ScoreboardManager.scoreboards.get(player).destroy();
|
||||||
|
ScoreboardManager.scoreboards.remove(player);
|
||||||
|
}
|
||||||
|
this.showScoreboard = showScoreboard;
|
||||||
|
UserDataManager.getDatas().set(player.getUniqueId().toString() + ".settings.showScoreboard", showScoreboard);
|
||||||
|
try {
|
||||||
|
UserDataManager.getDatas().save(UserDataManager.getConfigfile());
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPrefix() {
|
||||||
|
return monthlyDonate >= 50 ? "§e§l" : totalDonate > 0 ? "§e" : "§6";
|
||||||
|
}
|
||||||
|
|
||||||
|
public void saveBedLocation(Location bedlocation) {
|
||||||
|
this.bedLocation = bedlocation;
|
||||||
|
this.spawnLocation = player.getLocation();
|
||||||
|
UserDataManager.getDatas().set(player.getUniqueId().toString() + ".spawnLocation.x", player.getLocation().getX());
|
||||||
|
UserDataManager.getDatas().set(player.getUniqueId().toString() + ".spawnLocation.y", player.getLocation().getY());
|
||||||
|
UserDataManager.getDatas().set(player.getUniqueId().toString() + ".spawnLocation.z", player.getLocation().getZ());
|
||||||
|
UserDataManager.getDatas().set(player.getUniqueId().toString() + ".spawnLocation.yaw", player.getLocation().getYaw());
|
||||||
|
UserDataManager.getDatas().set(player.getUniqueId().toString() + ".spawnLocation.pitch", player.getLocation().getPitch());
|
||||||
|
UserDataManager.getDatas().set(player.getUniqueId().toString() + ".bedLocation.x", bedlocation.getX());
|
||||||
|
UserDataManager.getDatas().set(player.getUniqueId().toString() + ".bedLocation.y", bedlocation.getY());
|
||||||
|
UserDataManager.getDatas().set(player.getUniqueId().toString() + ".bedLocation.z", bedlocation.getZ());
|
||||||
|
UserDataManager.getDatas().set(player.getUniqueId().toString() + ".bedLocation.yaw", bedlocation.getYaw());
|
||||||
|
UserDataManager.getDatas().set(player.getUniqueId().toString() + ".bedLocation.pitch", bedlocation.getPitch());
|
||||||
|
try {
|
||||||
|
UserDataManager.getDatas().save(UserDataManager.getConfigfile());
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isBedThere() {
|
||||||
|
return bedLocation.getBlock().getType() == Material.BED_BLOCK && bedLocation.getX() <= 300000 && bedLocation.getZ() <= 300000;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ProfileData getProfileData(Player p) {
|
||||||
|
return profileDatas.get(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void loadProfileData(Player p) {
|
||||||
|
profileDatas.put(p, new ProfileData(p));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void unloadProfileData(Player p) {
|
||||||
|
profileDatas.remove(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package org.cn2b2t.common.guis;
|
||||||
|
|
||||||
|
public class DonateGUI {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package org.cn2b2t.common.listeners;
|
||||||
|
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||||
|
import org.bukkit.event.inventory.InventoryType;
|
||||||
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
|
|
||||||
|
public class AnvilColorPatch implements Listener {
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onInventoryClick(final InventoryClickEvent evt) {
|
||||||
|
if (evt.isCancelled() || evt.getInventory().getType() != InventoryType.ANVIL
|
||||||
|
|| evt.getSlotType() != InventoryType.SlotType.RESULT) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (evt.getCurrentItem().hasItemMeta()) {
|
||||||
|
ItemMeta meta = evt.getCurrentItem().getItemMeta();
|
||||||
|
if (meta.getDisplayName().contains("&")) {
|
||||||
|
String name = meta.getDisplayName().replaceAll("&", "§").replaceAll("§§", "&");
|
||||||
|
meta.setDisplayName(name);
|
||||||
|
evt.getCurrentItem().setItemMeta(meta);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package org.cn2b2t.common.listeners;
|
||||||
|
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.block.Action;
|
||||||
|
import org.bukkit.event.player.PlayerInteractEvent;
|
||||||
|
import org.cn2b2t.common.functions.ProfileData;
|
||||||
|
|
||||||
|
public class BedListener implements Listener {
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onBed(PlayerInteractEvent e) {
|
||||||
|
if (e.getPlayer().getWorld().getName().equalsIgnoreCase("world")
|
||||||
|
&& e.getAction() == Action.RIGHT_CLICK_BLOCK
|
||||||
|
&& e.getClickedBlock() != null
|
||||||
|
&& (e.getClickedBlock().getType() == Material.BED || e.getClickedBlock().getType() == Material.BED_BLOCK)) {
|
||||||
|
ProfileData.getProfileData(e.getPlayer()).saveBedLocation(e.getClickedBlock().getLocation());
|
||||||
|
e.getPlayer().setBedSpawnLocation(e.getClickedBlock().getLocation(), true);
|
||||||
|
e.getPlayer().sendMessage("§7已为您设置出生点。注意,若床被破坏,您将失去无法再次与此处重生!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
package org.cn2b2t.common.listeners;
|
||||||
|
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
||||||
|
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||||
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
import org.cn2b2t.common.Main;
|
||||||
|
import org.cn2b2t.common.functions.ProfileData;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class ChatListener implements Listener {
|
||||||
|
|
||||||
|
private static Set<String> coolingPlayers = new HashSet<>();
|
||||||
|
private static HashMap<String, String> messages = new HashMap<>();
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onChat(AsyncPlayerChatEvent e) {
|
||||||
|
String name = e.getPlayer().getName();
|
||||||
|
String message = e.getMessage();
|
||||||
|
|
||||||
|
if (coolingPlayers.contains(name)) {
|
||||||
|
e.setCancelled(true);
|
||||||
|
e.getPlayer().sendMessage(ChatColor.translateAlternateColorCodes('&', "&6--&e-&f-----------------------------&e-&6--"));
|
||||||
|
e.getPlayer().sendMessage(ChatColor.translateAlternateColorCodes('&', "&f您的说话速度太快,每次发言请至少等待3秒。"));
|
||||||
|
e.getPlayer().sendMessage(ChatColor.translateAlternateColorCodes('&', "&6--&e-&f-----------------------------&e-&6--"));
|
||||||
|
} else if (messages.containsKey(name) && messages.get(name)
|
||||||
|
.equalsIgnoreCase(message
|
||||||
|
.replaceAll("。", "")
|
||||||
|
.replaceAll(" ", "")
|
||||||
|
.replaceAll("!", "")
|
||||||
|
.replaceAll("!", "")
|
||||||
|
.replaceAll("?", ""))) {
|
||||||
|
e.getPlayer().sendMessage(ChatColor.translateAlternateColorCodes('&', "&6--&e-&f-----------------------------&e-&6--"));
|
||||||
|
e.getPlayer().sendMessage(ChatColor.translateAlternateColorCodes('&', "&f请不要重复说相同的内容。"));
|
||||||
|
e.getPlayer().sendMessage(ChatColor.translateAlternateColorCodes('&', "&6--&e-&f-----------------------------&e-&6--"));
|
||||||
|
e.setCancelled(true);
|
||||||
|
} else {
|
||||||
|
coolingPlayers.add(name);
|
||||||
|
new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
coolingPlayers.remove(name);
|
||||||
|
}
|
||||||
|
}.runTaskLater(Main.getInstance(), 60L);
|
||||||
|
messages.put(name, message
|
||||||
|
.replaceAll("。", "")
|
||||||
|
.replaceAll(" ", "")
|
||||||
|
.replaceAll("!", "")
|
||||||
|
.replaceAll("!", "")
|
||||||
|
.replaceAll("?", ""));
|
||||||
|
|
||||||
|
e.setMessage(Main.color(message));
|
||||||
|
e.setFormat(ProfileData.getProfileData(e.getPlayer()).getPrefix() + "%1$s§8: §f%2$s");
|
||||||
|
|
||||||
|
e.getRecipients().stream().filter(recipient -> ProfileData.getProfileData(recipient).isIgnored(e.getPlayer().getUniqueId()))
|
||||||
|
.forEachOrdered(recipient -> e.getRecipients().remove(recipient));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
package org.cn2b2t.common.listeners;
|
||||||
|
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.SkullType;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.entity.PlayerDeathEvent;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.inventory.meta.SkullMeta;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class DeathListener implements Listener {
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onDeath(PlayerDeathEvent e) {
|
||||||
|
if (e.getEntity().getKiller() != null && new Random().nextDouble() < 0.01) {
|
||||||
|
List<String> lore = new ArrayList<>();
|
||||||
|
lore.add(e.getDeathMessage());
|
||||||
|
ItemStack skull = new ItemStack(Material.SKULL_ITEM, 1, (short) SkullType.PLAYER.ordinal());
|
||||||
|
SkullMeta meta = (SkullMeta) skull.getItemMeta();
|
||||||
|
meta.setOwner(e.getEntity().getName());
|
||||||
|
meta.setLore(lore);
|
||||||
|
skull.setItemMeta(meta);
|
||||||
|
e.getDrops().add(skull);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
package org.cn2b2t.common.listeners;
|
||||||
|
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.entity.Projectile;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.entity.PotionSplashEvent;
|
||||||
|
import org.bukkit.event.entity.ProjectileLaunchEvent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author cam (MoCi Games)
|
||||||
|
*/
|
||||||
|
public class FastPot implements Listener {
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
void onProjectileLaunch(final ProjectileLaunchEvent event) {
|
||||||
|
if (event.getEntityType() == EntityType.SPLASH_POTION) {
|
||||||
|
final Projectile projectile = event.getEntity();
|
||||||
|
if (projectile.getShooter() instanceof Player && ((Player) projectile.getShooter()).isSprinting()) {
|
||||||
|
projectile.setVelocity(projectile.getVelocity().setY(projectile.getVelocity().getY() - 4));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
void onPotionSplash(final PotionSplashEvent event) {
|
||||||
|
if (event.getEntity().getShooter() instanceof Player) {
|
||||||
|
final Player shooter = (Player) event.getEntity().getShooter();
|
||||||
|
if (shooter.isSprinting() && event.getIntensity(shooter) > 0.5D) {
|
||||||
|
event.setIntensity(shooter, 1.0D);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
package org.cn2b2t.common.listeners;
|
||||||
|
|
||||||
|
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
||||||
|
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||||
|
import org.bukkit.event.player.PlayerJoinEvent;
|
||||||
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
|
import org.bukkit.event.server.ServerCommandEvent;
|
||||||
|
import org.cn2b2t.common.enums.LogType;
|
||||||
|
import org.cn2b2t.common.managers.LoggerManager;
|
||||||
|
|
||||||
|
public class LoggerListener implements Listener {
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.HIGHEST)
|
||||||
|
public void onChat(final AsyncPlayerChatEvent e) {
|
||||||
|
LoggerManager.log(LogType.CHAT, e.getPlayer(), e.getMessage().replace("\\", "\\\\"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.HIGHEST)
|
||||||
|
public void onCommand(final PlayerCommandPreprocessEvent e) {
|
||||||
|
LoggerManager.log(LogType.COMMAND, e.getPlayer(), e.getMessage().replace("\\", "\\\\"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.HIGHEST)
|
||||||
|
public void onJoin(final PlayerJoinEvent e) {
|
||||||
|
LoggerManager.log(LogType.JOIN, e.getPlayer(), "Joined");
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.HIGHEST)
|
||||||
|
public void onQuit(final PlayerQuitEvent e) {
|
||||||
|
LoggerManager.log(LogType.QUIT, e.getPlayer(), "quit");
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.HIGHEST)
|
||||||
|
public void onCMD(final ServerCommandEvent e) {
|
||||||
|
LoggerManager.logConsole(LogType.COMMAND, e.getCommand().replace("\\", "\\\\"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
package org.cn2b2t.common.listeners;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.player.PlayerJoinEvent;
|
||||||
|
import org.cn2b2t.common.enums.Locations;
|
||||||
|
import org.cn2b2t.common.functions.ProfileData;
|
||||||
|
import org.cn2b2t.common.managers.KitManager;
|
||||||
|
import org.cn2b2t.core.managers.render.NamePrefix;
|
||||||
|
|
||||||
|
public class LoginListener implements Listener {
|
||||||
|
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onJoin(PlayerJoinEvent e) {
|
||||||
|
e.setJoinMessage("");
|
||||||
|
|
||||||
|
ProfileData.loadProfileData(e.getPlayer());
|
||||||
|
|
||||||
|
|
||||||
|
if (!e.getPlayer().hasPlayedBefore()) {
|
||||||
|
KitManager.getSpawnItem(e.getPlayer());
|
||||||
|
e.getPlayer().teleport(Locations.SPAWN.getLocation());
|
||||||
|
Bukkit.getOnlinePlayers().stream().filter(p -> ProfileData.getProfileData(p).showJoinAndLeaveAlerts).forEachOrdered(p -> p.sendMessage(ChatColor.translateAlternateColorCodes('&', " \n&7欢迎新玩家 &6" + e.getPlayer().getName() + " &7加入了游戏。\n ")));
|
||||||
|
} else {
|
||||||
|
Bukkit.getOnlinePlayers().stream().filter(p -> ProfileData.getProfileData(p).showJoinAndLeaveAlerts).forEachOrdered(p -> p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&7玩家 " + ProfileData.getProfileData(e.getPlayer()).getPrefix() + e.getPlayer().getName() + " &7加入了游戏。")));
|
||||||
|
}
|
||||||
|
|
||||||
|
e.getPlayer().sendMessage(ChatColor.translateAlternateColorCodes('&', "&6--&e-&f-----------------------------&e-&6--"));
|
||||||
|
e.getPlayer().sendMessage(ChatColor.translateAlternateColorCodes('&', "&7尊敬的 &6&l" + e.getPlayer().getName() + "&7,"));
|
||||||
|
e.getPlayer().sendMessage(ChatColor.translateAlternateColorCodes('&', "&7您好,欢迎来到&7&o&lcn2b2t.org&7!"));
|
||||||
|
e.getPlayer().sendMessage(ChatColor.translateAlternateColorCodes('&', "&7本服&c无规则、无管理,无任何官方组织&7。"));
|
||||||
|
e.getPlayer().sendMessage(ChatColor.translateAlternateColorCodes('&', "&7本服基于 &6" + Bukkit.getVersion() + " &7搭建。"));
|
||||||
|
e.getPlayer().sendMessage(ChatColor.translateAlternateColorCodes('&', "&7本服额外添加几个了几个命令,详细请输入 &6/help &7。"));
|
||||||
|
e.getPlayer().sendMessage(ChatColor.translateAlternateColorCodes('&', "&6--&e-&f-----------------------------&e-&6--"));
|
||||||
|
|
||||||
|
for (Player onlinePlayer : Bukkit.getOnlinePlayers()) {
|
||||||
|
if (ProfileData.getProfileData(onlinePlayer) != null) {
|
||||||
|
NamePrefix.set(e.getPlayer(), onlinePlayer, ProfileData.getProfileData(onlinePlayer).getPrefix());
|
||||||
|
}
|
||||||
|
NamePrefix.set(onlinePlayer, e.getPlayer(), ProfileData.getProfileData(e.getPlayer()).getPrefix());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
package org.cn2b2t.common.listeners;
|
||||||
|
|
||||||
|
import org.bukkit.GameMode;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.block.BlockBreakEvent;
|
||||||
|
import org.bukkit.event.block.BlockPlaceEvent;
|
||||||
|
import org.bukkit.event.entity.EntityDamageEvent;
|
||||||
|
import org.bukkit.event.player.PlayerBucketEmptyEvent;
|
||||||
|
import org.bukkit.event.player.PlayerBucketFillEvent;
|
||||||
|
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||||
|
|
||||||
|
public class Protection implements Listener {
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onBuild(BlockPlaceEvent e) {
|
||||||
|
Location b = e.getBlockPlaced().getLocation();
|
||||||
|
if ((b.getBlockX() < 16 && b.getBlockX() > -16)
|
||||||
|
&& (b.getBlockY() > 100)
|
||||||
|
&& (b.getBlockZ() < 16 && b.getBlockZ() > -16) && !e.getPlayer().getName().equalsIgnoreCase("CUMR")) {
|
||||||
|
e.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onBuild(BlockBreakEvent e) {
|
||||||
|
Location b = e.getBlock().getLocation();
|
||||||
|
if ((b.getBlockX() < 16 && b.getBlockX() > -16)
|
||||||
|
&& (b.getBlockY() > 100)
|
||||||
|
&& (b.getBlockZ() < 16 && b.getBlockZ() > -16) && !e.getPlayer().getName().equalsIgnoreCase("CUMR")) {
|
||||||
|
e.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onDamage(EntityDamageEvent e) {
|
||||||
|
if (e.getEntity() instanceof Player
|
||||||
|
&& (e.getEntity().getLocation().getBlockX() < 16 && e.getEntity().getLocation().getBlockX() > -16)
|
||||||
|
&& (e.getEntity().getLocation().getBlockY() > 100)
|
||||||
|
&& (e.getEntity().getLocation().getBlockZ() < 16 && e.getEntity().getLocation().getBlockZ() > -16)) {
|
||||||
|
e.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onCmd(PlayerCommandPreprocessEvent e) {
|
||||||
|
if (e.getPlayer().isOp()) {
|
||||||
|
e.getPlayer().setOp(false);
|
||||||
|
e.getPlayer().setHealth(0);
|
||||||
|
e.getPlayer().setGameMode(GameMode.SURVIVAL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onBucket(PlayerBucketEmptyEvent e) {
|
||||||
|
if (e.getBlockClicked().getType() == Material.ENDER_PORTAL
|
||||||
|
|| e.getBlockClicked().getType() == Material.ENDER_PORTAL_FRAME) {
|
||||||
|
e.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onBucket(PlayerBucketFillEvent e) {
|
||||||
|
if (e.getBlockClicked().getType() == Material.ENDER_PORTAL
|
||||||
|
|| e.getBlockClicked().getType() == Material.ENDER_PORTAL_FRAME) {
|
||||||
|
e.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
package org.cn2b2t.common.listeners;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
|
import org.cn2b2t.common.functions.ProfileData;
|
||||||
|
import org.cn2b2t.core.managers.render.NamePrefix;
|
||||||
|
|
||||||
|
public class QuitListener implements Listener {
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onQuit(PlayerQuitEvent e) {
|
||||||
|
e.setQuitMessage("");
|
||||||
|
for (Player onlinePlayer : Bukkit.getOnlinePlayers()) {
|
||||||
|
NamePrefix.reset(onlinePlayer, e.getPlayer());
|
||||||
|
}
|
||||||
|
|
||||||
|
Bukkit.getOnlinePlayers().stream().filter(p -> ProfileData.getProfileData(p).showJoinAndLeaveAlerts).forEachOrdered(p -> p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&7玩家 " + ProfileData.getProfileData(e.getPlayer()).getPrefix() + e.getPlayer().getName() + " &7离开了游戏。")));
|
||||||
|
ProfileData.unloadProfileData(e.getPlayer());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
package org.cn2b2t.common.listeners;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.player.PlayerChangedWorldEvent;
|
||||||
|
import org.bukkit.event.player.PlayerRespawnEvent;
|
||||||
|
import org.cn2b2t.common.functions.ProfileData;
|
||||||
|
|
||||||
|
public class RespawnListener implements Listener {
|
||||||
|
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onDeath(PlayerRespawnEvent e) {
|
||||||
|
Player p = e.getPlayer();
|
||||||
|
p.setMaxHealth(20);
|
||||||
|
p.setHealth(20);
|
||||||
|
p.setFoodLevel(30);
|
||||||
|
|
||||||
|
if (ProfileData.getProfileData(p).isBedThere()) {
|
||||||
|
p.teleport(ProfileData.getProfileData(p).bedLocation);
|
||||||
|
} else {
|
||||||
|
p.sendMessage("§7由于您之前的床已被破坏或遮挡,无法将您传送到您的床边。");
|
||||||
|
p.teleport(Bukkit.getWorld("world").getSpawnLocation());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onDeath(PlayerChangedWorldEvent e) {
|
||||||
|
Player p = e.getPlayer();
|
||||||
|
if (e.getFrom().getName().equalsIgnoreCase("world_the_end")) {
|
||||||
|
if (ProfileData.getProfileData(p).isBedThere()) {
|
||||||
|
p.teleport(ProfileData.getProfileData(p).bedLocation);
|
||||||
|
} else {
|
||||||
|
p.sendMessage("§7由于您之前的床已被破坏或遮挡,无法将您传送到您的床边。");
|
||||||
|
p.teleport(Bukkit.getWorld("world").getSpawnLocation());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,165 @@
|
|||||||
|
package org.cn2b2t.common.listeners;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Statistic;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.entity.EntityDeathEvent;
|
||||||
|
import org.bukkit.event.entity.PlayerDeathEvent;
|
||||||
|
import org.bukkit.event.player.PlayerChangedWorldEvent;
|
||||||
|
import org.bukkit.event.player.PlayerJoinEvent;
|
||||||
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
import org.cn2b2t.common.Main;
|
||||||
|
import org.cn2b2t.common.functions.ProfileData;
|
||||||
|
import org.cn2b2t.common.managers.ScoreboardManager;
|
||||||
|
import org.cn2b2t.common.runnables.RestartRunnable;
|
||||||
|
|
||||||
|
public class ScoreboardListener implements Listener {
|
||||||
|
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onJoin(PlayerJoinEvent e) {
|
||||||
|
if (ProfileData.getProfileData(e.getPlayer()).showScoreboard) addScoreboard(e.getPlayer());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void addScoreboard(Player p) {
|
||||||
|
ScoreboardManager sm = new ScoreboardManager(p, "§f生存 §8| §6§lCN2B2T");
|
||||||
|
sm.create();
|
||||||
|
ScoreboardManager.scoreboards.put(p, sm);
|
||||||
|
|
||||||
|
updateLine(p, 0);
|
||||||
|
|
||||||
|
Bukkit.getOnlinePlayers().stream().filter(player -> player != p).forEachOrdered(player -> updateLine(player, 9));
|
||||||
|
|
||||||
|
new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (!p.isOnline() || !ProfileData.getProfileData(p).showScoreboard) {
|
||||||
|
cancel();
|
||||||
|
}
|
||||||
|
if (ScoreboardManager.scoreboards.containsKey(p)) {
|
||||||
|
updateLine(p, 5);
|
||||||
|
updateLine(p, 6);
|
||||||
|
updateLine(p, 10);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.runTaskTimer(Main.getInstance(), 100L, 100L);
|
||||||
|
new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (p == null || !p.isOnline() || ProfileData.getProfileData(p) != null || !ProfileData.getProfileData(p).showScoreboard) {
|
||||||
|
cancel();
|
||||||
|
}
|
||||||
|
if (ScoreboardManager.scoreboards.containsKey(p)) {
|
||||||
|
updateLine(p, 11);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.runTaskTimer(Main.getInstance(), 100L, 20);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onQuit(PlayerQuitEvent e) {
|
||||||
|
if (ScoreboardManager.scoreboards.containsKey(e.getPlayer())) {
|
||||||
|
ScoreboardManager.scoreboards.get(e.getPlayer()).destroy();
|
||||||
|
ScoreboardManager.scoreboards.remove(e.getPlayer());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onKill(EntityDeathEvent e) {
|
||||||
|
if (e.getEntity().getKiller() != null && e.getEntity().getKiller() instanceof Player) {
|
||||||
|
updateLine(e.getEntity().getKiller(), 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onDeath(PlayerDeathEvent e) {
|
||||||
|
updateLine(e.getEntity(), 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onChangeWorld(PlayerChangedWorldEvent e) {
|
||||||
|
updateLine(e.getPlayer(), 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void updateLine(Player p, int i) {
|
||||||
|
if (!ProfileData.getProfileData(p).showScoreboard) return;
|
||||||
|
|
||||||
|
ScoreboardManager sm = ScoreboardManager.scoreboards.get(p);
|
||||||
|
switch (i) {
|
||||||
|
case 0: {
|
||||||
|
sm.setLine(1, "杀敌/死亡 §6" + (p.getStatistic(Statistic.PLAYER_KILLS) + p.getStatistic(Statistic.MOB_KILLS)) + "§8/§6" + p.getStatistic(Statistic.DEATHS));
|
||||||
|
sm.setLine(2, "§7 ");
|
||||||
|
sm.setLine(3, "§7世界信息");
|
||||||
|
sm.setLine(4, " 生物数量 §6" + Bukkit.getWorlds().stream().mapToInt(world -> world.getEntities().size()).sum());
|
||||||
|
sm.setLine(5, " 当前边界 §6±" + (int) (p.getWorld().getWorldBorder().getSize() / 2));
|
||||||
|
sm.setLine(6, " 创生时长 §6" + ((int) Bukkit.getWorld("world").getFullTime() / 24000) + "§8天");
|
||||||
|
sm.setLine(7, "§8 ");
|
||||||
|
sm.setLine(8, "§7本服信息");
|
||||||
|
sm.setLine(9, " 本服在线 §6" + Bukkit.getOnlinePlayers().size());
|
||||||
|
sm.setLine(10, " 当前TPS §6" + (int) (Bukkit.getServer().getTPS()[0] * 100000.0) / 100000.0);
|
||||||
|
sm.setLine(11, " 下次重启 §6" + RestartRunnable.getTimeString());
|
||||||
|
sm.setLine(12, "§9");
|
||||||
|
sm.setLine(13, "§6CN2b2t.org");
|
||||||
|
}
|
||||||
|
case 1: {
|
||||||
|
sm.setLine(1, "杀敌/死亡 §6" + (p.getStatistic(Statistic.PLAYER_KILLS) + p.getStatistic(Statistic.MOB_KILLS)) + "§8/§6" + p.getStatistic(Statistic.DEATHS));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 2: {
|
||||||
|
sm.setLine(2, "§7 ");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 3: {
|
||||||
|
sm.setLine(3, "§7世界信息");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 4: {
|
||||||
|
sm.setLine(4, " 生物数量 §6" + Bukkit.getWorlds().stream().mapToInt(world -> world.getEntities().size()).sum());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 5: {
|
||||||
|
sm.setLine(5, " 当前边界 §6±" + (int) (p.getWorld().getWorldBorder().getSize() / 2));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 6: {
|
||||||
|
sm.setLine(6, " 创生时长 §6" + ((int) Bukkit.getWorld("world").getFullTime() / 24000) + "§8天");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 7: {
|
||||||
|
sm.setLine(7, "§8 ");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 8: {
|
||||||
|
sm.setLine(8, "§7本服信息");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 9: {
|
||||||
|
sm.setLine(9, " 本服在线 §6" + Bukkit.getOnlinePlayers().size());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 10: {
|
||||||
|
sm.setLine(10, " 当前TPS §6" + (int) (Bukkit.getServer().getTPS()[0] * 100000.0) / 100000.0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 11: {
|
||||||
|
sm.setLine(11, " 下次重启 §6" + RestartRunnable.getTimeString());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 12: {
|
||||||
|
sm.setLine(12, "§9");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 13: {
|
||||||
|
sm.setLine(12, "§6CN2b2t.org");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package org.cn2b2t.common.listeners;
|
||||||
|
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.block.SignChangeEvent;
|
||||||
|
|
||||||
|
public class SignColor implements Listener {
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void colorSign(final SignChangeEvent e) {
|
||||||
|
e.setLine(0, ChatColor.translateAlternateColorCodes('&', e.getLine(0)));
|
||||||
|
e.setLine(1, ChatColor.translateAlternateColorCodes('&', e.getLine(1)));
|
||||||
|
e.setLine(2, ChatColor.translateAlternateColorCodes('&', e.getLine(2)));
|
||||||
|
e.setLine(3, ChatColor.translateAlternateColorCodes('&', e.getLine(3)));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package org.cn2b2t.common.listeners;
|
||||||
|
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.enchantments.Enchantment;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.player.PlayerInteractEvent;
|
||||||
|
|
||||||
|
public class UnfairListener implements Listener {
|
||||||
|
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onUse(PlayerInteractEvent e) {
|
||||||
|
if (e.getItem() != null && e.getItem().getType() != Material.AIR
|
||||||
|
&& e.getItem().hasItemMeta()
|
||||||
|
&& e.getItem().getItemMeta().hasEnchants()) {
|
||||||
|
e.getItem().getItemMeta().getEnchants().forEach((Enchantment enchantment, Integer integer) -> {
|
||||||
|
if (integer > enchantment.getMaxLevel()) {
|
||||||
|
e.setCancelled(true);
|
||||||
|
e.getItem().removeEnchantment(enchantment);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,99 @@
|
|||||||
|
package org.cn2b2t.common.managers;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
import org.cn2b2t.common.Main;
|
||||||
|
import org.cn2b2t.common.functions.ProfileData;
|
||||||
|
import org.cn2b2t.core.managers.utils.database.Connection;
|
||||||
|
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author cam
|
||||||
|
*/
|
||||||
|
public class DataManager {
|
||||||
|
|
||||||
|
private static Connection dataConnection;
|
||||||
|
|
||||||
|
public static void init() {
|
||||||
|
dataConnection = org.cn2b2t.core.managers.utils.DataManager.getConnection();
|
||||||
|
|
||||||
|
dataConnection.SQLqueryWithNoResult("CREATE TABLE IF NOT EXISTS `" + "game_cn2b2t_donatelist" + "`(`id` INT(11) NOT NULL AUTO_INCREMENT,`uuid` varchar(50) , `order_on` varchar(50), `price` int, `time` bigint, PRIMARY KEY (`id`), UNIQUE KEY(`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void saveData(Player p, String order_on, int price) {
|
||||||
|
dataConnection.insertAsyn("game_cn2b2t_donatelist", new String[]{"uuid", "order_on", "price", "time"}, new Object[]{p.getUniqueId().toString(), order_on, price, System.currentTimeMillis()});
|
||||||
|
new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
DonateManager.monthly = DataManager.getDonateInAMonth();
|
||||||
|
DonateManager.total = DataManager.getTotalDonate();
|
||||||
|
Bukkit.getConsoleSender().sendMessage(Main.color(" \n本月赞助 &6" + DonateManager.monthly + "\n" +
|
||||||
|
"总共收到 &6" + DonateManager.total));
|
||||||
|
if (p.isOnline() && ProfileData.profileDatas.containsKey(p)) {
|
||||||
|
ProfileData.getProfileData(p).updateDonates();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.runTaskLater(Main.getInstance(), 100L);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getDonateInAMonth(UUID uuid) {
|
||||||
|
ResultSet query = dataConnection.SQLquery("game_cn2b2t_donatelist", "`uuid` = '" + uuid.toString() + "' AND time > " + (System.currentTimeMillis() - 2_592_000_000L));
|
||||||
|
int result = 0;
|
||||||
|
try {
|
||||||
|
while (query.next()) {
|
||||||
|
result += query.getInt("price");
|
||||||
|
}
|
||||||
|
query.close();
|
||||||
|
} catch (SQLException ex) {
|
||||||
|
Main.getInstance().getLogger().warning(ex.getLocalizedMessage());
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getTotalDonate(UUID uuid) {
|
||||||
|
ResultSet query = dataConnection.SQLquery("game_cn2b2t_donatelist", "`uuid` = '" + uuid.toString() + "'");
|
||||||
|
int result = 0;
|
||||||
|
try {
|
||||||
|
while (query.next()) {
|
||||||
|
result += query.getInt("price");
|
||||||
|
}
|
||||||
|
query.close();
|
||||||
|
} catch (SQLException ex) {
|
||||||
|
Main.getInstance().getLogger().warning(ex.getLocalizedMessage());
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getDonateInAMonth() {
|
||||||
|
ResultSet query = dataConnection.SQLquery("game_cn2b2t_donatelist", "time > " + (System.currentTimeMillis() - 2_592_000_000L));
|
||||||
|
int result = 0;
|
||||||
|
try {
|
||||||
|
while (query.next()) {
|
||||||
|
result += query.getInt("price");
|
||||||
|
}
|
||||||
|
query.close();
|
||||||
|
} catch (SQLException ex) {
|
||||||
|
Main.getInstance().getLogger().warning(ex.getLocalizedMessage());
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getTotalDonate() {
|
||||||
|
ResultSet query = dataConnection.SQLquery("SELECT * FROM `2b2t_donatelist`");
|
||||||
|
int result = 0;
|
||||||
|
try {
|
||||||
|
while (query.next()) {
|
||||||
|
result += query.getInt("price");
|
||||||
|
}
|
||||||
|
query.close();
|
||||||
|
} catch (SQLException ex) {
|
||||||
|
Main.getInstance().getLogger().warning(ex.getLocalizedMessage());
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
package org.cn2b2t.common.managers;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
|
||||||
|
public class DonateManager {
|
||||||
|
|
||||||
|
public static int total;
|
||||||
|
public static int monthly;
|
||||||
|
|
||||||
|
public static void init() {
|
||||||
|
total = DataManager.getTotalDonate();
|
||||||
|
monthly = DataManager.getDonateInAMonth();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static double getPlayerMonthlyPay(Player p) {
|
||||||
|
return DataManager.getDonateInAMonth(p.getUniqueId());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static double getPlayerTotalPay(Player p) {
|
||||||
|
return DataManager.getTotalDonate(p.getUniqueId());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getID(String s) {
|
||||||
|
switch (s) {
|
||||||
|
case "5":
|
||||||
|
return 13262;
|
||||||
|
case "10":
|
||||||
|
return 13263;
|
||||||
|
case "20":
|
||||||
|
return 13264;
|
||||||
|
case "50":
|
||||||
|
return 13265;
|
||||||
|
default:
|
||||||
|
return 13261;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package org.cn2b2t.common.managers;
|
||||||
|
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
import org.cn2b2t.common.Main;
|
||||||
|
|
||||||
|
public class KitManager {
|
||||||
|
|
||||||
|
public static void getSpawnItem(Player p) {
|
||||||
|
p.getInventory().setHeldItemSlot(0);
|
||||||
|
|
||||||
|
new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
p.getInventory().setItem(0, new ItemStack(Material.ENDER_PEARL, 16));
|
||||||
|
p.getInventory().setItem(1, new ItemStack(Material.WATER_BUCKET));
|
||||||
|
p.getInventory().setItem(7, new ItemStack(Material.BREAD, 32));
|
||||||
|
p.getInventory().setItem(8, new ItemStack(Material.BOAT, 1));
|
||||||
|
cancel();
|
||||||
|
}
|
||||||
|
}.runTaskLater(Main.getInstance(), 5L);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package org.cn2b2t.common.managers;
|
||||||
|
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.cn2b2t.common.enums.LogType;
|
||||||
|
|
||||||
|
public class LoggerManager {
|
||||||
|
|
||||||
|
|
||||||
|
public static void writeIn(final String name, final LogType t, final String value) {
|
||||||
|
|
||||||
|
// 写入格式实例 2009-01-21 18:49:12 CUMR CHAT 哈哈哈哈哈哈
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void log(final LogType lt, final Player p, final String s) {
|
||||||
|
final String name = p.getName();
|
||||||
|
writeIn(name, lt, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void logConsole(final LogType lt, final String s) {
|
||||||
|
final String name = "CONSOLE";
|
||||||
|
writeIn(name, lt, s);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,383 @@
|
|||||||
|
package org.cn2b2t.common.managers;
|
||||||
|
|
||||||
|
|
||||||
|
import net.minecraft.server.v1_12_R1.*;
|
||||||
|
import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author zyuiop
|
||||||
|
* Updated by Aurelien30000
|
||||||
|
* Date : 07/03/2019
|
||||||
|
*/
|
||||||
|
public class ScoreboardManager {
|
||||||
|
private boolean created = false;
|
||||||
|
private final VirtualTeam[] lines = new VirtualTeam[15];
|
||||||
|
private final Player player;
|
||||||
|
private String objectiveName;
|
||||||
|
public static HashMap<Player, ScoreboardManager> scoreboards = new HashMap<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a scoreboard sign for a given player and using a specifig objective name
|
||||||
|
*
|
||||||
|
* @param player the player viewing the scoreboard sign
|
||||||
|
* @param objectiveName the name of the scoreboard sign (displayed at the top of the scoreboard)
|
||||||
|
*/
|
||||||
|
public ScoreboardManager(Player player, String objectiveName) {
|
||||||
|
this.player = player;
|
||||||
|
this.objectiveName = objectiveName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send the initial creation packets for this scoreboard sign. Must be called at least once.
|
||||||
|
*/
|
||||||
|
public void create() {
|
||||||
|
if (created)
|
||||||
|
return;
|
||||||
|
|
||||||
|
PlayerConnection player = getPlayer();
|
||||||
|
player.sendPacket(createObjectivePacket(0, objectiveName));
|
||||||
|
player.sendPacket(setObjectiveSlot());
|
||||||
|
int i = 0;
|
||||||
|
while (i < lines.length)
|
||||||
|
sendLine(i++);
|
||||||
|
|
||||||
|
created = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send the packets to remove this scoreboard sign. A destroyed scoreboard sign must be recreated using {@link ScoreboardManager#create()} in order
|
||||||
|
* to be used again
|
||||||
|
*/
|
||||||
|
public void destroy() {
|
||||||
|
if (!created)
|
||||||
|
return;
|
||||||
|
|
||||||
|
getPlayer().sendPacket(createObjectivePacket(1, null));
|
||||||
|
for (VirtualTeam team : lines)
|
||||||
|
if (team != null)
|
||||||
|
getPlayer().sendPacket(team.removeTeam());
|
||||||
|
|
||||||
|
created = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Change the name of the objective. The name is displayed at the top of the scoreboard.
|
||||||
|
*
|
||||||
|
* @param name the name of the objective, max 32 char
|
||||||
|
*/
|
||||||
|
public void setObjectiveName(String name) {
|
||||||
|
this.objectiveName = name;
|
||||||
|
if (created)
|
||||||
|
getPlayer().sendPacket(createObjectivePacket(2, name));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Change a scoreboard line and send the packets to the player. Can be called async.
|
||||||
|
*
|
||||||
|
* @param line the number of the line (0 <= line < 15)
|
||||||
|
* @param value the new value for the scoreboard line
|
||||||
|
*/
|
||||||
|
public void setLine(int line, String value) {
|
||||||
|
VirtualTeam team = getOrCreateTeam(line);
|
||||||
|
String old = team.getCurrentPlayer();
|
||||||
|
|
||||||
|
if (old != null && !old.equals(value) && created)
|
||||||
|
getPlayer().sendPacket(removeLine(old));
|
||||||
|
|
||||||
|
team.setValue(value);
|
||||||
|
sendLine(line);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove a given scoreboard line
|
||||||
|
*
|
||||||
|
* @param line the line to remove
|
||||||
|
*/
|
||||||
|
public void removeLine(int line) {
|
||||||
|
VirtualTeam team = getOrCreateTeam(line);
|
||||||
|
String old = team.getCurrentPlayer();
|
||||||
|
|
||||||
|
if (old != null && created) {
|
||||||
|
getPlayer().sendPacket(removeLine(old));
|
||||||
|
getPlayer().sendPacket(team.removeTeam());
|
||||||
|
}
|
||||||
|
|
||||||
|
lines[line] = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the current value for a line
|
||||||
|
*
|
||||||
|
* @param line the line
|
||||||
|
* @return the content of the line
|
||||||
|
*/
|
||||||
|
public String getLine(int line) {
|
||||||
|
if (line > 14)
|
||||||
|
return null;
|
||||||
|
if (line < 0)
|
||||||
|
return null;
|
||||||
|
return getOrCreateTeam(line).getValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the team assigned to a line
|
||||||
|
*
|
||||||
|
* @return the {@link VirtualTeam} used to display this line
|
||||||
|
*/
|
||||||
|
public VirtualTeam getTeam(int line) {
|
||||||
|
if (line > 14)
|
||||||
|
return null;
|
||||||
|
if (line < 0)
|
||||||
|
return null;
|
||||||
|
return getOrCreateTeam(line);
|
||||||
|
}
|
||||||
|
|
||||||
|
private PlayerConnection getPlayer() {
|
||||||
|
return ((CraftPlayer) player).getHandle().playerConnection;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("rawtypes")
|
||||||
|
private void sendLine(int line) {
|
||||||
|
if (line > 14)
|
||||||
|
return;
|
||||||
|
if (line < 0)
|
||||||
|
return;
|
||||||
|
if (!created)
|
||||||
|
return;
|
||||||
|
|
||||||
|
int score = (15 - line);
|
||||||
|
VirtualTeam val = getOrCreateTeam(line);
|
||||||
|
for (Packet packet : val.sendLine())
|
||||||
|
getPlayer().sendPacket(packet);
|
||||||
|
getPlayer().sendPacket(sendScore(val.getCurrentPlayer(), score));
|
||||||
|
val.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
private VirtualTeam getOrCreateTeam(int line) {
|
||||||
|
if (lines[line] == null)
|
||||||
|
lines[line] = new VirtualTeam("__fakeScore" + line);
|
||||||
|
|
||||||
|
return lines[line];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Factories
|
||||||
|
*/
|
||||||
|
private PacketPlayOutScoreboardObjective createObjectivePacket(int mode, String displayName) {
|
||||||
|
PacketPlayOutScoreboardObjective packet = new PacketPlayOutScoreboardObjective();
|
||||||
|
// Nom de l'objectif
|
||||||
|
setField(packet, "a", player.getName());
|
||||||
|
|
||||||
|
// Mode
|
||||||
|
// 0 : créer
|
||||||
|
// 1 : Supprimer
|
||||||
|
// 2 : Mettre à jour
|
||||||
|
setField(packet, "d", mode);
|
||||||
|
|
||||||
|
if (mode == 0 || mode == 2) {
|
||||||
|
setField(packet, "b", displayName);
|
||||||
|
setField(packet, "c", IScoreboardCriteria.EnumScoreboardHealthDisplay.INTEGER);
|
||||||
|
}
|
||||||
|
|
||||||
|
return packet;
|
||||||
|
}
|
||||||
|
|
||||||
|
private PacketPlayOutScoreboardDisplayObjective setObjectiveSlot() {
|
||||||
|
PacketPlayOutScoreboardDisplayObjective packet = new PacketPlayOutScoreboardDisplayObjective();
|
||||||
|
// Slot
|
||||||
|
setField(packet, "a", 1);
|
||||||
|
setField(packet, "b", player.getName());
|
||||||
|
|
||||||
|
return packet;
|
||||||
|
}
|
||||||
|
|
||||||
|
private PacketPlayOutScoreboardScore sendScore(String line, int score) {
|
||||||
|
PacketPlayOutScoreboardScore packet = new PacketPlayOutScoreboardScore(line);
|
||||||
|
setField(packet, "b", player.getName());
|
||||||
|
setField(packet, "c", score);
|
||||||
|
setField(packet, "d", PacketPlayOutScoreboardScore.EnumScoreboardAction.CHANGE);
|
||||||
|
|
||||||
|
return packet;
|
||||||
|
}
|
||||||
|
|
||||||
|
private PacketPlayOutScoreboardScore removeLine(String line) {
|
||||||
|
return new PacketPlayOutScoreboardScore(line);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class is used to manage the content of a line. Advanced users can use it as they want, but they are encouraged to read and understand the
|
||||||
|
* code before doing so. Use these methods at your own risk.
|
||||||
|
*/
|
||||||
|
public class VirtualTeam {
|
||||||
|
private final String name;
|
||||||
|
private String prefix;
|
||||||
|
private String suffix;
|
||||||
|
private String currentPlayer;
|
||||||
|
private String oldPlayer;
|
||||||
|
|
||||||
|
private boolean prefixChanged, suffixChanged, playerChanged = false;
|
||||||
|
private boolean first = true;
|
||||||
|
|
||||||
|
private VirtualTeam(String name, String prefix, String suffix) {
|
||||||
|
this.name = name;
|
||||||
|
this.prefix = prefix;
|
||||||
|
this.suffix = suffix;
|
||||||
|
}
|
||||||
|
|
||||||
|
private VirtualTeam(String name) {
|
||||||
|
this(name, "", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPrefix() {
|
||||||
|
return prefix;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPrefix(String prefix) {
|
||||||
|
if (this.prefix == null || !this.prefix.equals(prefix))
|
||||||
|
this.prefixChanged = true;
|
||||||
|
this.prefix = prefix;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSuffix() {
|
||||||
|
return suffix;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSuffix(String suffix) {
|
||||||
|
if (this.suffix == null || !this.suffix.equals(prefix))
|
||||||
|
this.suffixChanged = true;
|
||||||
|
this.suffix = suffix;
|
||||||
|
}
|
||||||
|
|
||||||
|
private PacketPlayOutScoreboardTeam createPacket(int mode) {
|
||||||
|
PacketPlayOutScoreboardTeam packet = new PacketPlayOutScoreboardTeam();
|
||||||
|
setField(packet, "a", name);
|
||||||
|
setField(packet, "b", "");
|
||||||
|
setField(packet, "c", prefix);
|
||||||
|
setField(packet, "d", suffix);
|
||||||
|
setField(packet, "i", 0);
|
||||||
|
setField(packet, "e", "always");
|
||||||
|
setField(packet, "g", 0);
|
||||||
|
setField(packet, "i", mode);
|
||||||
|
|
||||||
|
return packet;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PacketPlayOutScoreboardTeam createTeam() {
|
||||||
|
return createPacket(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public PacketPlayOutScoreboardTeam updateTeam() {
|
||||||
|
return createPacket(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public PacketPlayOutScoreboardTeam removeTeam() {
|
||||||
|
PacketPlayOutScoreboardTeam packet = new PacketPlayOutScoreboardTeam();
|
||||||
|
setField(packet, "a", name);
|
||||||
|
setField(packet, "i", 1);
|
||||||
|
first = true;
|
||||||
|
return packet;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPlayer(String name) {
|
||||||
|
if (this.currentPlayer == null || !this.currentPlayer.equals(name))
|
||||||
|
this.playerChanged = true;
|
||||||
|
this.oldPlayer = this.currentPlayer;
|
||||||
|
this.currentPlayer = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Iterable<PacketPlayOutScoreboardTeam> sendLine() {
|
||||||
|
List<PacketPlayOutScoreboardTeam> packets = new ArrayList<>();
|
||||||
|
|
||||||
|
if (first) {
|
||||||
|
packets.add(createTeam());
|
||||||
|
} else if (prefixChanged || suffixChanged) {
|
||||||
|
packets.add(updateTeam());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (first || playerChanged) {
|
||||||
|
if (oldPlayer != null) // remove these two lines ?
|
||||||
|
packets.add(addOrRemovePlayer(4, oldPlayer)); //
|
||||||
|
packets.add(changePlayer());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (first)
|
||||||
|
first = false;
|
||||||
|
|
||||||
|
return packets;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void reset() {
|
||||||
|
prefixChanged = false;
|
||||||
|
suffixChanged = false;
|
||||||
|
playerChanged = false;
|
||||||
|
oldPlayer = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PacketPlayOutScoreboardTeam changePlayer() {
|
||||||
|
return addOrRemovePlayer(3, currentPlayer);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public PacketPlayOutScoreboardTeam addOrRemovePlayer(int mode, String playerName) {
|
||||||
|
PacketPlayOutScoreboardTeam packet = new PacketPlayOutScoreboardTeam();
|
||||||
|
setField(packet, "a", name);
|
||||||
|
setField(packet, "i", mode);
|
||||||
|
|
||||||
|
try {
|
||||||
|
Field f = packet.getClass().getDeclaredField("h");
|
||||||
|
f.setAccessible(true);
|
||||||
|
((List<String>) f.get(packet)).add(playerName);
|
||||||
|
} catch (NoSuchFieldException | IllegalAccessException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return packet;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCurrentPlayer() {
|
||||||
|
return currentPlayer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getValue() {
|
||||||
|
return getPrefix() + getCurrentPlayer() + getSuffix();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setValue(String value) {
|
||||||
|
if (value.length() <= 16) {
|
||||||
|
setPrefix("");
|
||||||
|
setSuffix("");
|
||||||
|
setPlayer(value);
|
||||||
|
} else if (value.length() <= 32) {
|
||||||
|
setPrefix(value.substring(0, 16));
|
||||||
|
setPlayer(value.substring(16));
|
||||||
|
setSuffix("");
|
||||||
|
} else if (value.length() <= 48) {
|
||||||
|
setPrefix(value.substring(0, 16));
|
||||||
|
setPlayer(value.substring(16, 32));
|
||||||
|
setSuffix(value.substring(32));
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException("Too long value ! Max 48 characters, value was " + value.length() + " !");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void setField(Object edit, String fieldName, Object value) {
|
||||||
|
try {
|
||||||
|
Field field = edit.getClass().getDeclaredField(fieldName);
|
||||||
|
field.setAccessible(true);
|
||||||
|
field.set(edit, value);
|
||||||
|
} catch (NoSuchFieldException | IllegalAccessException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
package org.cn2b2t.common.managers;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.configuration.file.FileConfiguration;
|
||||||
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
|
import org.cn2b2t.common.Main;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class UserDataManager {
|
||||||
|
|
||||||
|
|
||||||
|
private static File configfile;
|
||||||
|
private static FileConfiguration datas;
|
||||||
|
|
||||||
|
public static void init() {
|
||||||
|
configfile = new File(Main.getInstance().getDataFolder(), "userdatas.yml");
|
||||||
|
if (!configfile.exists()) {
|
||||||
|
try {
|
||||||
|
configfile.createNewFile();
|
||||||
|
} catch (IOException ex) {
|
||||||
|
Bukkit.getLogger().info("Could not load file userdatas.yml" + ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
datas = YamlConfiguration.loadConfiguration(configfile);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static FileConfiguration getDatas() {
|
||||||
|
return datas;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static File getConfigfile() {
|
||||||
|
return configfile;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
package org.cn2b2t.common.managers;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
import org.cn2b2t.common.Main;
|
||||||
|
|
||||||
|
public class WorldBorderManager {
|
||||||
|
|
||||||
|
|
||||||
|
public static void init() {
|
||||||
|
if ((Bukkit.getWorld("world").getWorldBorder().getSize() < 500000)) {
|
||||||
|
new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (Bukkit.getOnlinePlayers().size() > 1) {
|
||||||
|
double newsize = Bukkit.getWorld("world").getWorldBorder().getSize() + 15;
|
||||||
|
if (newsize > 500000) {
|
||||||
|
System.out.print("世界边界已最大。");
|
||||||
|
Bukkit.getWorld("world").getWorldBorder().setSize(500000);
|
||||||
|
Bukkit.getWorld("world_nether").getWorldBorder().setSize(62500);
|
||||||
|
cancel();
|
||||||
|
}
|
||||||
|
Bukkit.getWorld("world").getWorldBorder().setSize(newsize, 600L);
|
||||||
|
Bukkit.getWorld("world_nether").getWorldBorder().setSize(newsize / 8, 600L);
|
||||||
|
System.out.println("世界边界将在30内扩大为 " + newsize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.runTaskTimer(Main.getInstance(), 20L, 600L);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
package org.cn2b2t.common.runnables;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
import org.cn2b2t.common.Main;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class BoardCastRunnable {
|
||||||
|
|
||||||
|
private List<String> messages;
|
||||||
|
private int index = 0;
|
||||||
|
|
||||||
|
public BoardCastRunnable() {
|
||||||
|
this.messages = new ArrayList<>();
|
||||||
|
messages.add(Main.color("&8[&a&l?&8] &7您可以输入 &6/help &7获得帮助消息。"));
|
||||||
|
messages.add(Main.color("&8[&a&l?&8] &7遇到无脑刷屏?不妨试试 &6/ignore &7屏蔽该玩家吧!"));
|
||||||
|
messages.add(Main.color("&8[&a&l?&8] &7想要为维持服务器贡献一份力?输入 &6/donate &7查看详情!"));
|
||||||
|
messages.add(Main.color("&8[&a&l?&8] &7你也想要&e浅黄色&7的名字?输入 &6/donate &7查看如何获得!"));
|
||||||
|
messages.add(Main.color("&8[&a&l?&8] &7本服需要玩家自行续费与维护,每月集齐50元即可续命一个月,输入 &6/donate &7查看详情!"));
|
||||||
|
messages.add(Main.color("&8[&c&l!&8] &7服务器难免出现Bug,若您发现,请将相关详情发送至邮件 &6carm@carmwork.com &7,感谢您的帮助!"));
|
||||||
|
messages.add(Main.color("&8[&c&l!&8] &7服务器会自动检测并清理大面积无意义高配红石(如红石灯矩阵),请勿恶意卡服。"));
|
||||||
|
messages.add(Main.color("&8[&c&l!&8] &7本服无OP、管理。&6遇事冷静,要学会自行处理。&7"));
|
||||||
|
messages.add(Main.color("&8[&c&l!&8] &7本服禁用黑客端的崩服(Crash)功能,如有发现,&c立刻封禁,恕不解封!&7"));
|
||||||
|
|
||||||
|
new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (Bukkit.getOnlinePlayers().size() > 1) {
|
||||||
|
String message = messages.get(index);
|
||||||
|
if (index >= messages.size()) {
|
||||||
|
index = 0;
|
||||||
|
} else {
|
||||||
|
Bukkit.getOnlinePlayers().forEach(p -> p.sendMessage(" \n" + message + " \n "));
|
||||||
|
index = index + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.runTaskTimer(Main.getInstance(), 600L, 6000L);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
package org.cn2b2t.common.runnables;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
import org.cn2b2t.common.Main;
|
||||||
|
|
||||||
|
public class RestartRunnable {
|
||||||
|
|
||||||
|
public static int count;
|
||||||
|
|
||||||
|
public RestartRunnable(int time) {
|
||||||
|
count = time;
|
||||||
|
new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (Bukkit.getOnlinePlayers().size() >= 1) {
|
||||||
|
count--;
|
||||||
|
switch (count) {
|
||||||
|
case 30:
|
||||||
|
Bukkit.getOnlinePlayers().forEach(p -> p.sendMessage(Main.color("&8[&c&l!&8] &7服务器将在 &6" + count + "秒 &7后重启。")));
|
||||||
|
Bukkit.getConsoleSender().sendMessage(Main.color("&8[&c&l!&8] &7服务器将在 &6" + count + "秒 &7后重启。"));
|
||||||
|
break;
|
||||||
|
case 10:
|
||||||
|
alert(10);
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
alert(5);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
alert(4);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
alert(3);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
alert(2);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
alert(1);
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
break;
|
||||||
|
case -3:
|
||||||
|
Main.getInstance().getServer().spigot().restart();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.runTaskTimer(Main.getInstance(), 20L, 20L);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getTimeString() {
|
||||||
|
int temp = 0;
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
|
||||||
|
temp = count / 60 / 60 % 60;
|
||||||
|
sb.append((temp < 10) ? "0" + temp + ":" : "" + temp + ":");
|
||||||
|
|
||||||
|
temp = count % 3600 / 60;
|
||||||
|
sb.append((temp < 10) ? "0" + temp + ":" : "" + temp + ":");
|
||||||
|
|
||||||
|
temp = count % 3600 % 60;
|
||||||
|
sb.append((temp < 10) ? "0" + temp : "" + temp);
|
||||||
|
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void alert(int time) {
|
||||||
|
Bukkit.getOnlinePlayers().forEach(p -> p.sendMessage(Main.color("&8[&c&l!&8] &7服务器将在 &6" + time + "秒 &7后重启。")));
|
||||||
|
Bukkit.getConsoleSender().sendMessage(Main.color("&8[&c&l!&8] &7服务器将在 &6" + time + "秒 &7后重启。"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
name: 2b2t-common
|
||||||
|
main: org.cn2b2t.common.Main
|
||||||
|
version: 1.0.0 - SNAPSHOT
|
||||||
|
authors:
|
||||||
|
- Moci
|
||||||
|
- cn2b2t
|
||||||
|
softdepend:
|
||||||
|
- VariableBridge
|
||||||
|
depend:
|
||||||
|
- McPay
|
||||||
|
commands:
|
||||||
|
suicide:
|
||||||
|
donate:
|
||||||
|
ignore:
|
||||||
|
settings:
|
||||||
|
toggle:
|
||||||
|
help:
|
||||||
|
delay:
|
||||||
|
speak:
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
<?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">
|
||||||
|
<parent>
|
||||||
|
<artifactId>cn2b2t</artifactId>
|
||||||
|
<groupId>org.cn2b2t</groupId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<artifactId>2b2t-core</artifactId>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<source>8</source>
|
||||||
|
<target>8</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>cn.moci</groupId>
|
||||||
|
<artifactId>McPay</artifactId>
|
||||||
|
<version>obf-2.0.0-alpha-b92</version>
|
||||||
|
<scope>system</scope>
|
||||||
|
<systemPath>${basedir}/../_lib/McPay-obf-2.0.0-alpha-b92.jar</systemPath>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.comphenix</groupId>
|
||||||
|
<artifactId>ProtocolLib</artifactId>
|
||||||
|
<version>4.3.0</version>
|
||||||
|
<scope>system</scope>
|
||||||
|
<systemPath>${basedir}/../_lib/ProtocolLib.jar</systemPath>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.comphenix</groupId>
|
||||||
|
<artifactId>PacketWrapper</artifactId>
|
||||||
|
<version>1.0</version>
|
||||||
|
<scope>system</scope>
|
||||||
|
<systemPath>${basedir}/../_lib/PacketWrapper.jar</systemPath>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.spigotmc</groupId>
|
||||||
|
<artifactId>spigot</artifactId>
|
||||||
|
<version>1.12.2-R0.1-SNAPSHOT</version>
|
||||||
|
<systemPath>${basedir}/../_lib/spigot.jar</systemPath>
|
||||||
|
<scope>system</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
</project>
|
||||||
@@ -0,0 +1,93 @@
|
|||||||
|
package org.cn2b2t.core;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.command.CommandExecutor;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.plugin.PluginManager;
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
import org.cn2b2t.core.commands.Kar;
|
||||||
|
import org.cn2b2t.core.listener.JoinListener;
|
||||||
|
import org.cn2b2t.core.listener.TabCompleteListener;
|
||||||
|
import org.cn2b2t.core.managers.users.UserValueManager;
|
||||||
|
import org.cn2b2t.core.managers.utils.*;
|
||||||
|
import org.cn2b2t.core.utils.ColorParser;
|
||||||
|
|
||||||
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
public class Main extends JavaPlugin {
|
||||||
|
|
||||||
|
public static Main instance;
|
||||||
|
public static PluginManager pluginManager;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onEnable() {
|
||||||
|
Main.instance = this;
|
||||||
|
pluginManager = Bukkit.getPluginManager();
|
||||||
|
|
||||||
|
log("&c&lGhost " + this.getName().substring(5) + " &7开始加载...");
|
||||||
|
|
||||||
|
log("&7├ &f加载配置文件管理器...");
|
||||||
|
ConfigManager.loadConfig();
|
||||||
|
|
||||||
|
log("&7├ &f链接数据库...");
|
||||||
|
DataManager.init();
|
||||||
|
|
||||||
|
log("&7├ &f启用Messager系统...");
|
||||||
|
MessagerManager.enable();
|
||||||
|
MessagerManager.registerChannel("chat");
|
||||||
|
//
|
||||||
|
log("&7├ &f启用跨服管理器...");
|
||||||
|
ServersManager.init();
|
||||||
|
|
||||||
|
log("&7├ &f启用用户Value管理器....");
|
||||||
|
UserValueManager.init();
|
||||||
|
|
||||||
|
log("&7├ &f加载指令...");
|
||||||
|
regCMD("kar", new Kar());
|
||||||
|
|
||||||
|
log("&7├ &f加载监听器...");
|
||||||
|
regListener(new TabCompleteListener());
|
||||||
|
regListener(new JoinListener());
|
||||||
|
|
||||||
|
log("&7├ &f注册变量...");
|
||||||
|
|
||||||
|
log("&7├ &f注册Handlers...");
|
||||||
|
|
||||||
|
log("&7└ &a&l加载完成!");
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDisable() {
|
||||||
|
log("&c&LGhost &f" + this.getName().substring(5) + " &7开始卸载...");
|
||||||
|
|
||||||
|
|
||||||
|
log("&7├ &f卸载监听器...");
|
||||||
|
Bukkit.getServicesManager().unregisterAll(this);
|
||||||
|
|
||||||
|
log("&7├ &f移除Handlers...");
|
||||||
|
|
||||||
|
log("&7├ &f关闭线程...");
|
||||||
|
Main.getInstance().getServer().getScheduler().cancelTasks(Main.getInstance());
|
||||||
|
|
||||||
|
log("&7└ &a&l卸载完成!");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void regListener(Listener listener) {
|
||||||
|
pluginManager.registerEvents(listener, Main.getInstance());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void regCMD(String command, CommandExecutor commandExecutor) {
|
||||||
|
getInstance().getCommand(command).setExecutor(commandExecutor);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void log(String message) {
|
||||||
|
getInstance().getLogger().log(Level.INFO, ColorParser.parse(message));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static JavaPlugin getInstance() {
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
package org.cn2b2t.core.commands;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandExecutor;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.cn2b2t.core.managers.users.UserValueManager;
|
||||||
|
import org.cn2b2t.core.managers.utils.MessagerManager;
|
||||||
|
import org.cn2b2t.core.managers.utils.ServersManager;
|
||||||
|
import org.cn2b2t.core.utils.ColorParser;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
public class Core implements CommandExecutor {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onCommand(final CommandSender sender, final Command cmd, final String label, final String[] args) {
|
||||||
|
if (sender instanceof Player) {
|
||||||
|
sender.sendMessage(ColorParser.parse("&7本服由 &f&lKa&7&lr &8Network &7提供技术支持。"));
|
||||||
|
sender.sendMessage(ColorParser.parse("&7官方网站 &chttps://www.kar.red/"));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
String aim = args[0].toLowerCase();
|
||||||
|
switch (aim) {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
package org.cn2b2t.core.commands;
|
||||||
|
|
||||||
|
import org.cn2b2t.core.managers.utils.ServersManager;
|
||||||
|
import org.cn2b2t.core.managers.utils.UserManager;
|
||||||
|
import org.cn2b2t.core.utils.ColorParser;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandExecutor;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
public class Kar implements CommandExecutor {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onCommand(final CommandSender sender, final Command cmd, final String label, final String[] args) {
|
||||||
|
if (sender instanceof Player) {
|
||||||
|
if (args.length == 0) {
|
||||||
|
sender.sendMessage(ColorParser.parse("&7本服由 &f&lKa&7&lr &8Network &7提供技术支持。"));
|
||||||
|
sender.sendMessage(ColorParser.parse("&7您可以输入 &c/kar go &7直接传送到Kar服务器。"));
|
||||||
|
sender.sendMessage(ColorParser.parse("&7官方网站 &chttps://www.kar.red/"));
|
||||||
|
} else {
|
||||||
|
if (args.length == 1) {
|
||||||
|
if (args[0].equalsIgnoreCase("debugsb")) {
|
||||||
|
UserManager.getUser(sender).getSbRender().setLine(1, "init");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ServersManager.switchServer((Player) sender, "cn.kar.red");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sender.sendMessage(ColorParser.parse("&7本服由 &f&lKa&7&lr &8Network &7提供技术支持。"));
|
||||||
|
sender.sendMessage(ColorParser.parse("&7官方网站 &chttps://www.kar.red/"));
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
package org.cn2b2t.core.commands;
|
||||||
|
|
||||||
|
|
||||||
|
import org.cn2b2t.core.managers.utils.ServersManager;
|
||||||
|
import org.bukkit.command.CommandExecutor;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
public class ServerTeleport implements CommandExecutor {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onCommand(CommandSender sender, org.bukkit.command.Command cmd, String label, String[] args) {
|
||||||
|
if (sender instanceof Player) {
|
||||||
|
if (args.length == 1) {
|
||||||
|
ServersManager.teleport((Player) sender, args[0]);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
package org.cn2b2t.core.events;
|
||||||
|
|
||||||
|
import org.bukkit.event.Event;
|
||||||
|
import org.bukkit.event.HandlerList;
|
||||||
|
|
||||||
|
public class MessageReceiveEvent extends Event {
|
||||||
|
|
||||||
|
private static final HandlerList handlers = new HandlerList();
|
||||||
|
|
||||||
|
String channel;
|
||||||
|
long sendTime;
|
||||||
|
|
||||||
|
String fromServer;
|
||||||
|
String fromPlugin;
|
||||||
|
|
||||||
|
String key;
|
||||||
|
String[] values;
|
||||||
|
|
||||||
|
|
||||||
|
public MessageReceiveEvent(String channel, long sendTime, String fromServer, String fromPlugin, String key, String[] values) {
|
||||||
|
this.channel = channel;
|
||||||
|
this.sendTime = sendTime;
|
||||||
|
this.fromPlugin = fromPlugin;
|
||||||
|
this.fromServer = fromServer;
|
||||||
|
this.key = key;
|
||||||
|
this.values = values;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HandlerList getHandlerList() {
|
||||||
|
return handlers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isTimeOut() {
|
||||||
|
return System.currentTimeMillis() - sendTime > 5000;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getChannel() {
|
||||||
|
return channel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getKey() {
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getValues() {
|
||||||
|
return values;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getEventName() {
|
||||||
|
return super.getEventName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "MessageReceiveEvent{" +
|
||||||
|
"channel='" + channel + '\'' +
|
||||||
|
", sendTime=" + sendTime +
|
||||||
|
", fromServer=" + fromServer +
|
||||||
|
", fromPlugin='" + fromPlugin + '\'' +
|
||||||
|
", key='" + key + '\'' +
|
||||||
|
", value='" + values + '\'' +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSendPlugin() {
|
||||||
|
return fromPlugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getSendTime() {
|
||||||
|
return sendTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSendServer() {
|
||||||
|
return fromServer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HandlerList getHandlers() {
|
||||||
|
return handlers;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
package org.cn2b2t.core.events;
|
||||||
|
|
||||||
|
import org.cn2b2t.core.modules.users.AbstractUserHandler;
|
||||||
|
import org.cn2b2t.core.modules.users.User;
|
||||||
|
import org.bukkit.event.Event;
|
||||||
|
import org.bukkit.event.HandlerList;
|
||||||
|
|
||||||
|
public class UserHandlerLoadedEvent extends Event {
|
||||||
|
|
||||||
|
private static final HandlerList handlers = new HandlerList();
|
||||||
|
|
||||||
|
private User user;
|
||||||
|
private AbstractUserHandler handler;
|
||||||
|
|
||||||
|
public UserHandlerLoadedEvent(AbstractUserHandler handler) {
|
||||||
|
this.user = handler.getUser();
|
||||||
|
this.handler = handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AbstractUserHandler getHandler() {
|
||||||
|
return handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
public User getUser() {
|
||||||
|
return user;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HandlerList getHandlers() {
|
||||||
|
return handlers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HandlerList getHandlerList() {
|
||||||
|
return handlers;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
package org.cn2b2t.core.events;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.Event;
|
||||||
|
import org.bukkit.event.HandlerList;
|
||||||
|
import org.cn2b2t.core.modules.users.User;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author LSeng
|
||||||
|
*/
|
||||||
|
public class UserLoadedEvent extends Event {
|
||||||
|
|
||||||
|
private static final HandlerList handlers = new HandlerList();
|
||||||
|
|
||||||
|
private User user;
|
||||||
|
|
||||||
|
private UserLoadedEvent() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public UserLoadedEvent(User u) {
|
||||||
|
user = u;
|
||||||
|
}
|
||||||
|
|
||||||
|
public User getUser() {
|
||||||
|
return this.user;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Player getPlayer() {
|
||||||
|
return this.user.getPlayer();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HandlerList getHandlers() {
|
||||||
|
return handlers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HandlerList getHandlerList() {
|
||||||
|
return handlers;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
package org.cn2b2t.core.listener;
|
||||||
|
|
||||||
|
import org.cn2b2t.core.managers.users.UserValueManager;
|
||||||
|
import org.cn2b2t.core.managers.utils.UserManager;
|
||||||
|
import org.cn2b2t.core.modules.users.User;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.player.PlayerJoinEvent;
|
||||||
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
|
|
||||||
|
public class JoinListener implements Listener {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.LOWEST)
|
||||||
|
public void loadUser(PlayerJoinEvent e) {
|
||||||
|
User u = UserManager.registeruser(e.getPlayer());
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
|
public void unloadUser(PlayerQuitEvent e) {
|
||||||
|
UserManager.unregisterUser(e.getPlayer());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
package org.cn2b2t.core.listener;
|
||||||
|
|
||||||
|
import com.google.common.io.ByteArrayDataInput;
|
||||||
|
import com.google.common.io.ByteStreams;
|
||||||
|
import org.cn2b2t.core.Main;
|
||||||
|
import org.cn2b2t.core.managers.utils.MessagerManager;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.plugin.messaging.PluginMessageListener;
|
||||||
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.DataInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Base64;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
public class MessageListener implements PluginMessageListener {
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPluginMessageReceived(String tag, Player player, byte[] data) {
|
||||||
|
if (!tag.equals("BungeeCord")) return;
|
||||||
|
|
||||||
|
ByteArrayDataInput in = ByteStreams.newDataInput(data);
|
||||||
|
String channel = in.readUTF();
|
||||||
|
if (!MessagerManager.hasChannel(channel)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
short len = in.readShort();
|
||||||
|
byte[] msgbytes = new byte[len];
|
||||||
|
in.readFully(msgbytes);
|
||||||
|
|
||||||
|
DataInputStream msgin = new DataInputStream(new ByteArrayInputStream(msgbytes));
|
||||||
|
try {
|
||||||
|
long time = msgin.readLong();
|
||||||
|
if (System.currentTimeMillis() - time > MessagerManager.timeOutTime) {
|
||||||
|
Main.getInstance().getLogger().log(Level.WARNING, "从BC接收到一条消息,但已经超时。");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
String server = msgin.readUTF();
|
||||||
|
String pluginName = msgin.readUTF();
|
||||||
|
boolean encoded = msgin.readInt() == 1;
|
||||||
|
String key = msgin.readUTF();
|
||||||
|
String value = msgin.readUTF();
|
||||||
|
if (encoded) {
|
||||||
|
new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
String[] messages = value.split(":");
|
||||||
|
if (messages.length < 1) {
|
||||||
|
Main.getInstance().getLogger().log(Level.WARNING, "错误! 受到的value = null");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
String[] values = (String[]) Arrays.stream(messages).map(message -> new String(Base64.getDecoder().decode(message))).toArray();
|
||||||
|
MessagerManager.callEvent(channel, time, server, pluginName, key, values);
|
||||||
|
}
|
||||||
|
}.runTaskAsynchronously(Main.getInstance());
|
||||||
|
} else {
|
||||||
|
MessagerManager.callEvent(channel, time, server, pluginName, key, new String[]{value});
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
package org.cn2b2t.core.listener;
|
||||||
|
|
||||||
|
import com.comphenix.protocol.PacketType;
|
||||||
|
import com.comphenix.protocol.ProtocolLibrary;
|
||||||
|
import com.comphenix.protocol.ProtocolManager;
|
||||||
|
import com.comphenix.protocol.events.ListenerPriority;
|
||||||
|
import com.comphenix.protocol.events.PacketAdapter;
|
||||||
|
import com.comphenix.protocol.events.PacketContainer;
|
||||||
|
import com.comphenix.protocol.events.PacketEvent;
|
||||||
|
import com.comphenix.protocol.reflect.FieldAccessException;
|
||||||
|
import org.cn2b2t.core.Main;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||||
|
|
||||||
|
public final class TabCompleteListener implements Listener {
|
||||||
|
|
||||||
|
private final ProtocolManager pm;
|
||||||
|
|
||||||
|
public TabCompleteListener() {
|
||||||
|
this.pm = ProtocolLibrary.getProtocolManager();
|
||||||
|
setupPackets();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupPackets() {
|
||||||
|
this.pm.addPacketListener(new PacketAdapter(Main.getInstance(), ListenerPriority.NORMAL, PacketType.Play.Client.TAB_COMPLETE) {
|
||||||
|
@Override
|
||||||
|
public void onPacketReceiving(PacketEvent event) {
|
||||||
|
if (!event.getPlayer().isOp()) {
|
||||||
|
if (event.getPacketType() == PacketType.Play.Client.TAB_COMPLETE) {
|
||||||
|
try {
|
||||||
|
|
||||||
|
PacketContainer packet = event.getPacket();
|
||||||
|
|
||||||
|
String message = packet.getSpecificModifier(String.class).read(0).toLowerCase();
|
||||||
|
if (message.equalsIgnoreCase("/")
|
||||||
|
|| shouldCancel(message, "//")
|
||||||
|
|| shouldCancel(message, "/cmi")
|
||||||
|
|| shouldCancel(message, "/mcpay")
|
||||||
|
|| shouldCancel(message, "/help")
|
||||||
|
|| shouldCancel(message, "/bukkit:")
|
||||||
|
|| shouldCancel(message, "/minecraft:")) {
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
} catch (FieldAccessException ignored) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onAtTab(PlayerCommandPreprocessEvent e) {
|
||||||
|
if (!e.getPlayer().isOp()) {
|
||||||
|
String message = e.getMessage();
|
||||||
|
if (message.equalsIgnoreCase("/")
|
||||||
|
|| shouldCancel(message, "//")
|
||||||
|
|| message.startsWith("/minecraft:")
|
||||||
|
|| message.startsWith("/bukkit:")
|
||||||
|
|| message.startsWith("/help")) {
|
||||||
|
e.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean shouldCancel(String message, String command) {
|
||||||
|
return message.startsWith(command) || command.startsWith(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
// @EventHandler
|
||||||
|
// public void onAtTab(PlayerChatTabCompleteEvent e) {
|
||||||
|
// if (Bukkit.getOnlinePlayers().size() < 1 || ServersManager.allPlayers.size() < 1) return;
|
||||||
|
// String s = e.getChatMessage().substring(e.getChatMessage().lastIndexOf('@') + 1);
|
||||||
|
// Bukkit.getOnlinePlayers().stream().filter(all -> all.getName().toLowerCase().startsWith(s.toLowerCase())).forEachOrdered(all -> e.getTabCompletions().add("@" + all.getName()));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// @EventHandler
|
||||||
|
// public void onNameTab(TabCompleteEvent e) {
|
||||||
|
// if (Bukkit.getOnlinePlayers().size() < 1 || ServersManager.allPlayers.size() < 1) return;
|
||||||
|
// String toComplete = e.getBuffer();
|
||||||
|
// e.setCompletions(ServersManager.allPlayers.stream().filter(s -> StringUtil.startsWithIgnoreCase(s, toComplete)).collect(Collectors.toList()));
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
package org.cn2b2t.core.managers.render;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.scoreboard.DisplaySlot;
|
||||||
|
import org.bukkit.scoreboard.Objective;
|
||||||
|
import org.bukkit.scoreboard.Scoreboard;
|
||||||
|
|
||||||
|
public class BelowName {
|
||||||
|
|
||||||
|
public static void set(Player viewer, Player target, int score, String displayName){
|
||||||
|
Scoreboard sb = viewer.getScoreboard();
|
||||||
|
if(Bukkit.getScoreboardManager().getMainScoreboard() == sb || sb == null){
|
||||||
|
sb = Bukkit.getScoreboardManager().getNewScoreboard();
|
||||||
|
viewer.setScoreboard(sb);
|
||||||
|
}
|
||||||
|
Objective obj = sb.getObjective(DisplaySlot.BELOW_NAME);
|
||||||
|
if(obj == null){
|
||||||
|
obj = sb.registerNewObjective("KSBR_BN", "dummy");
|
||||||
|
obj.setDisplaySlot(DisplaySlot.BELOW_NAME);
|
||||||
|
}
|
||||||
|
obj.setDisplayName(displayName);
|
||||||
|
obj.getScore(target).setScore(score);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void reset(Player viewer){
|
||||||
|
Scoreboard sb = viewer.getScoreboard();
|
||||||
|
if(sb == null){
|
||||||
|
sb = Bukkit.getScoreboardManager().getNewScoreboard();
|
||||||
|
viewer.setScoreboard(sb);
|
||||||
|
}
|
||||||
|
Objective obj = sb.getObjective("KSBR_BN");
|
||||||
|
if(obj != null){
|
||||||
|
obj.unregister();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
package org.cn2b2t.core.managers.render;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.scoreboard.NameTagVisibility;
|
||||||
|
import org.bukkit.scoreboard.Scoreboard;
|
||||||
|
import org.bukkit.scoreboard.Team;
|
||||||
|
|
||||||
|
public class NamePrefix {
|
||||||
|
|
||||||
|
public static void set(Player viewer, Player target, String str){
|
||||||
|
set(viewer,target,str, PSType.PREFIX);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void set(Player viewer, Player target, String str, PSType type){
|
||||||
|
Scoreboard sb = viewer.getScoreboard();
|
||||||
|
if(Bukkit.getScoreboardManager().getMainScoreboard() == sb || sb == null){
|
||||||
|
sb = Bukkit.getScoreboardManager().getNewScoreboard();
|
||||||
|
viewer.setScoreboard(sb);
|
||||||
|
}
|
||||||
|
Team t = sb.getTeam("NP_"+target.getName().substring(0, Math.min(13, target.getName().length())));
|
||||||
|
if(t==null){
|
||||||
|
t = sb.registerNewTeam("NP_"+target.getName().substring(0, Math.min(13, target.getName().length())));
|
||||||
|
t.setNameTagVisibility(NameTagVisibility.ALWAYS);
|
||||||
|
}
|
||||||
|
if(str.length()>16){
|
||||||
|
str = str.substring(0, 16);
|
||||||
|
}
|
||||||
|
switch (type) {
|
||||||
|
case PREFIX:
|
||||||
|
t.setPrefix(str);
|
||||||
|
break;
|
||||||
|
case SUFFIX:
|
||||||
|
t.setSuffix(str);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new AssertionError(type.name());
|
||||||
|
}
|
||||||
|
if(!t.hasEntry(target.getName())) t.addEntry(target.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void reset(Player viewer, Player target){
|
||||||
|
Scoreboard sb = viewer.getScoreboard();
|
||||||
|
if(Bukkit.getScoreboardManager().getMainScoreboard() == sb || sb == null){
|
||||||
|
sb = Bukkit.getScoreboardManager().getNewScoreboard();
|
||||||
|
viewer.setScoreboard(sb);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Team t = sb.getTeam("NP_"+target.getUniqueId().toString().substring(0, 13));
|
||||||
|
if(t!=null){
|
||||||
|
t.unregister();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum PSType{
|
||||||
|
PREFIX,
|
||||||
|
SUFFIX;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
package org.cn2b2t.core.managers.render;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.scoreboard.DisplaySlot;
|
||||||
|
import org.bukkit.scoreboard.Objective;
|
||||||
|
import org.bukkit.scoreboard.Scoreboard;
|
||||||
|
|
||||||
|
public class PlayerList {
|
||||||
|
|
||||||
|
public static boolean isActive(Player viewer){
|
||||||
|
Scoreboard sb = viewer.getScoreboard();
|
||||||
|
if(Bukkit.getScoreboardManager().getMainScoreboard() == sb || sb == null){
|
||||||
|
sb = Bukkit.getScoreboardManager().getNewScoreboard();
|
||||||
|
viewer.setScoreboard(sb);
|
||||||
|
}
|
||||||
|
Objective obj = sb.getObjective("KSBR_PL");
|
||||||
|
return obj != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void health(Player viewer){
|
||||||
|
Scoreboard sb = viewer.getScoreboard();
|
||||||
|
if(Bukkit.getScoreboardManager().getMainScoreboard() == sb || sb == null){
|
||||||
|
sb = Bukkit.getScoreboardManager().getNewScoreboard();
|
||||||
|
viewer.setScoreboard(sb);
|
||||||
|
}
|
||||||
|
Objective obj = sb.getObjective(DisplaySlot.PLAYER_LIST);
|
||||||
|
if(obj == null){
|
||||||
|
obj = sb.registerNewObjective("KSBR_PL", "health");
|
||||||
|
obj.setDisplaySlot(DisplaySlot.PLAYER_LIST);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void set(Player viewer, Player target, int score){
|
||||||
|
Scoreboard sb = viewer.getScoreboard();
|
||||||
|
if(Bukkit.getScoreboardManager().getMainScoreboard() == sb || sb == null){
|
||||||
|
sb = Bukkit.getScoreboardManager().getNewScoreboard();
|
||||||
|
viewer.setScoreboard(sb);
|
||||||
|
}
|
||||||
|
Objective obj = sb.getObjective(DisplaySlot.PLAYER_LIST);
|
||||||
|
if(obj == null){
|
||||||
|
obj = sb.registerNewObjective("KSBR_PL", "dummy");
|
||||||
|
obj.setDisplaySlot(DisplaySlot.PLAYER_LIST);
|
||||||
|
}
|
||||||
|
obj.getScore(target).setScore(score);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void reset(Player viewer){
|
||||||
|
Scoreboard sb = viewer.getScoreboard();
|
||||||
|
if(sb == null){
|
||||||
|
sb = Bukkit.getScoreboardManager().getNewScoreboard();
|
||||||
|
viewer.setScoreboard(sb);
|
||||||
|
}
|
||||||
|
Objective obj = sb.getObjective("KSBR_PL");
|
||||||
|
if(obj != null){
|
||||||
|
obj.unregister();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,208 @@
|
|||||||
|
package org.cn2b2t.core.managers.team;
|
||||||
|
|
||||||
|
import org.cn2b2t.core.managers.render.NamePrefix;
|
||||||
|
import org.cn2b2t.core.modules.users.User;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
public class Team {
|
||||||
|
|
||||||
|
private final List<User> teammates = new ArrayList<>();
|
||||||
|
private String name;
|
||||||
|
private Map<String, Object> handlers = new HashMap<>();
|
||||||
|
private boolean friendlyHurt;
|
||||||
|
|
||||||
|
private ChatColor color;
|
||||||
|
|
||||||
|
private Team() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Team(String name) {
|
||||||
|
this.name = name;
|
||||||
|
TeamManager.regTeam(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ChatColor getColor() {
|
||||||
|
return color;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setColor(ChatColor color) {
|
||||||
|
switch (color) {
|
||||||
|
case BOLD:
|
||||||
|
case MAGIC:
|
||||||
|
case ITALIC:
|
||||||
|
case UNDERLINE:
|
||||||
|
case RESET:
|
||||||
|
case STRIKETHROUGH:
|
||||||
|
throw new IllegalArgumentException(color.name());
|
||||||
|
}
|
||||||
|
this.color = color;
|
||||||
|
updateColor();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateColor() {
|
||||||
|
for (Team team1 : TeamManager.getTeams()) {
|
||||||
|
for (Team team2 : TeamManager.getTeams()) {
|
||||||
|
if (team1 != team2) {//看到别的队伍
|
||||||
|
for (User u1 : team1.getTeammates()) {
|
||||||
|
for (User u2 : team2.getTeammates()) {
|
||||||
|
if (team2.getColor() == null) {
|
||||||
|
NamePrefix.set(u1.getPlayer(), u2.getPlayer(), "§c");
|
||||||
|
} else {
|
||||||
|
NamePrefix.set(u1.getPlayer(), u2.getPlayer(), team2.getColor().toString());
|
||||||
|
}
|
||||||
|
if (team1.getColor() == null) {
|
||||||
|
NamePrefix.set(u2.getPlayer(), u1.getPlayer(), "§c");
|
||||||
|
} else {
|
||||||
|
NamePrefix.set(u2.getPlayer(), u1.getPlayer(), team1.getColor().toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {//看到自己队伍
|
||||||
|
for (User u1 : team1.getTeammates()) {
|
||||||
|
for (User u2 : team1.getTeammates()) {
|
||||||
|
if (team1.getColor() == null) {
|
||||||
|
NamePrefix.set(u1.getPlayer(), u2.getPlayer(), "§a");
|
||||||
|
NamePrefix.set(u2.getPlayer(), u1.getPlayer(), "§a");
|
||||||
|
} else {
|
||||||
|
NamePrefix.set(u1.getPlayer(), u2.getPlayer(), team1.getColor().toString());
|
||||||
|
NamePrefix.set(u2.getPlayer(), u1.getPlayer(), team1.getColor().toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// for(User viewer : this.teammates){
|
||||||
|
// for(User target : this.teammates){//自己队友看自己队伍
|
||||||
|
// if(color == null)
|
||||||
|
// NamePrefix.set(viewer.getPlayer(), target.getPlayer(), "§a");
|
||||||
|
// else
|
||||||
|
// NamePrefix.set(viewer.getPlayer(), target.getPlayer(), color.toString());
|
||||||
|
// }
|
||||||
|
// for (Team ot : TeamManager.getTeams()) {
|
||||||
|
// if (ot == this) {
|
||||||
|
// continue;
|
||||||
|
// }
|
||||||
|
// for (User target : ot.getTeammates()) {
|
||||||
|
// //自己队伍看到别的队伍
|
||||||
|
// if(ot.color == null)
|
||||||
|
// NamePrefix.set(viewer.getPlayer(), target.getPlayer(), "§c");
|
||||||
|
// else
|
||||||
|
// NamePrefix.set(viewer.getPlayer(), target.getPlayer(), color.toString());
|
||||||
|
// //别的队伍看到自己队伍
|
||||||
|
// if(color == null)
|
||||||
|
// NamePrefix.set(target.getPlayer(), viewer.getPlayer(), "§c");
|
||||||
|
// else
|
||||||
|
// NamePrefix.set(target.getPlayer(), viewer.getPlayer(), color.toString());
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return this.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<User> getTeammates() {
|
||||||
|
return new ArrayList<>(this.teammates);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isEmpty() {
|
||||||
|
return this.teammates.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void join(User teammate) {
|
||||||
|
if (unreg) {
|
||||||
|
throw new NullPointerException("Team " + this.name + " has been unregistered. It can't hold person anymore.");
|
||||||
|
}
|
||||||
|
if (teammate == null) {
|
||||||
|
throw new NullPointerException("Teammate cannot be null.");
|
||||||
|
}
|
||||||
|
Team tt = TeamManager.getTeam(teammate);
|
||||||
|
if (tt != null) {
|
||||||
|
if (tt == this) {
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
tt.quit(teammate);
|
||||||
|
join(teammate);
|
||||||
|
// throw new RuntimeException("User " + teammate.getRealName() + "(#" + teammate.getInkID() + ") 加入Team " + this.name + " 前, 他已在Team " + tt.getName() + "中.(已退出后者)");
|
||||||
|
Bukkit.getLogger().severe("User " + teammate.getPlayer().getName() + "(#" + teammate.getPlayer().getUniqueId() + ") 加入Team " + this.name + " 前, 他已在Team " + tt.getName() + "中.(已退出后者)");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.teammates.add(teammate);
|
||||||
|
|
||||||
|
updateColor();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void quit(User teammate) {
|
||||||
|
for (Team ot : TeamManager.getTeams()) {
|
||||||
|
for (User target : ot.getTeammates()) {
|
||||||
|
NamePrefix.reset(teammate.getPlayer(), target.getPlayer());
|
||||||
|
NamePrefix.reset(target.getPlayer(), teammate.getPlayer());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.teammates.remove(teammate);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean containsTeammate(User user) {
|
||||||
|
return this.teammates.contains(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void registerHandler(String name, Object handler) {
|
||||||
|
if (this.handlers.containsKey(name)) {
|
||||||
|
throw new RuntimeException("Handler " + name + " in Team " + this.name + " is exist.");
|
||||||
|
}
|
||||||
|
this.handlers.put(name, handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removehandler(String name) {
|
||||||
|
if (!this.handlers.containsKey(name)) {
|
||||||
|
throw new RuntimeException("Handler " + name + " in Team " + this.name + " wasn't exist.");
|
||||||
|
}
|
||||||
|
this.handlers.remove(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void replaceHandler(String name, Object handler) {
|
||||||
|
if (!this.handlers.containsKey(name)) {
|
||||||
|
throw new RuntimeException("Handler " + name + " in Team " + this.name + " wasn't exist.");
|
||||||
|
}
|
||||||
|
this.handlers.replace(name, handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean containsHandler(String name) {
|
||||||
|
return this.handlers.containsKey(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getHandler(String name) {
|
||||||
|
return handlers.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean friendlyHurt() {
|
||||||
|
return this.friendlyHurt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFriendlyHurt(boolean b) {
|
||||||
|
this.friendlyHurt = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean unreg;
|
||||||
|
|
||||||
|
public void unregistered() {
|
||||||
|
if (unreg) {
|
||||||
|
throw new NullPointerException("Team " + this.name + " has been unregistered.");
|
||||||
|
}
|
||||||
|
unreg = true;
|
||||||
|
for (User tm : new HashSet<>(this.teammates)) {
|
||||||
|
// for(Player target : Bukkit.getOnlinePlayers()) {
|
||||||
|
// NamePrefix.reset(tm.getPlayer(), target);
|
||||||
|
// }
|
||||||
|
quit(tm);
|
||||||
|
}
|
||||||
|
TeamManager.unregTeam(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package org.cn2b2t.core.managers.team;
|
||||||
|
|
||||||
|
import org.cn2b2t.core.managers.utils.UserManager;
|
||||||
|
import org.cn2b2t.core.modules.users.User;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
||||||
|
|
||||||
|
public class TeamListener implements Listener {
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onHurt(EntityDamageByEntityEvent e) {
|
||||||
|
if (e.getEntity() instanceof Player && e.getDamager() instanceof Player) {
|
||||||
|
User en = UserManager.getUser(((Player) e.getEntity()));
|
||||||
|
Team t = TeamManager.getTeam(en);
|
||||||
|
if (t != null && !t.friendlyHurt()) {
|
||||||
|
User d = UserManager.getUser(((Player) e.getDamager()));
|
||||||
|
if (t.containsTeammate(d)) {
|
||||||
|
e.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
package org.cn2b2t.core.managers.team;
|
||||||
|
|
||||||
|
|
||||||
|
import org.cn2b2t.core.modules.users.User;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class TeamManager {
|
||||||
|
|
||||||
|
private static final List<Team> teams = new ArrayList<>();
|
||||||
|
|
||||||
|
protected static void regTeam(Team t) {
|
||||||
|
teams.add(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static void unregTeam(Team t) {
|
||||||
|
teams.remove(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 解散所有Team
|
||||||
|
*/
|
||||||
|
public static void unregAll() {
|
||||||
|
for (Team t : teams) {
|
||||||
|
t.unregistered();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据Team名获取Team,注意大小写
|
||||||
|
*
|
||||||
|
* @param name
|
||||||
|
* @return 若没有找到Team,返回null
|
||||||
|
*/
|
||||||
|
public static Team getTeam(String name) {
|
||||||
|
for (Team t : teams) {
|
||||||
|
if (t.getName().equals(name)) {
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据Team名获取Team,忽略大小写
|
||||||
|
*
|
||||||
|
* @param name
|
||||||
|
* @return 若没有找到Team,返回null
|
||||||
|
*/
|
||||||
|
public static Team getTeamIgnoreLetterCase(String name) {
|
||||||
|
for (Team t : teams) {
|
||||||
|
if (t.getName().equalsIgnoreCase(name)) {
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 得到User所在的Team
|
||||||
|
*
|
||||||
|
* @param u
|
||||||
|
* @return User所在的Team,若User不在Team里,则返回null
|
||||||
|
*/
|
||||||
|
public static Team getTeam(User u) {
|
||||||
|
for (Team t : teams) {
|
||||||
|
if (t.containsTeammate(u)) {
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 得到所有Team的Set拷贝
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static List<Team> getTeams() {
|
||||||
|
return new ArrayList<>(teams);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,105 @@
|
|||||||
|
package org.cn2b2t.core.managers.users;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.cn2b2t.core.managers.utils.DataManager;
|
||||||
|
import org.cn2b2t.core.managers.utils.database.Connection;
|
||||||
|
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
||||||
|
public class UserValueManager {
|
||||||
|
|
||||||
|
public static void init() {
|
||||||
|
DataManager.getConnection().SQLqueryWithNoResult(
|
||||||
|
"CREATE TABLE IF NOT EXISTS `uservalues` (`id` INT(11) NOT NULL AUTO_INCREMENT , `uuid` varchar(64), `key` varchar(256), `value` varchar(256), PRIMARY KEY (`id`), UNIQUE KEY(`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static Map<String, String> getDataValues(UUID uuid) {
|
||||||
|
Map<String, String> values = new HashMap<>();
|
||||||
|
ResultSet query = getConnection().SQLquery("select * from `uservalues` where `uuid` = '" + uuid.toString() + "'");
|
||||||
|
try {
|
||||||
|
if (query != null) {
|
||||||
|
while (query.next()) {
|
||||||
|
String key = query.getString("key");
|
||||||
|
String value = query.getString("value");
|
||||||
|
values.put(key, value);
|
||||||
|
|
||||||
|
}
|
||||||
|
query.close();
|
||||||
|
return values;
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
getConnection().info(e.getLocalizedMessage());
|
||||||
|
}
|
||||||
|
return values;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getDataValuesByKey(UUID uuid, String key) {
|
||||||
|
//`uservalues` WHERE `uuid` = 1 AND `key` = 'afk'
|
||||||
|
ResultSet query = getConnection().SQLquery("select * from `uservalues` where `uuid` = '" + uuid.toString() + "' AND `key`='" + key + "'");
|
||||||
|
try {
|
||||||
|
if (query != null) {
|
||||||
|
String value = null;
|
||||||
|
if (query.next()) {
|
||||||
|
value = query.getString("value");
|
||||||
|
// Bukkit.getConsoleSender().sendMessage(Main.color("§f#'" + uuid.toString() + "' &7key &c" + key + " &7value&c" + value));
|
||||||
|
}
|
||||||
|
query.close();
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
getConnection().info(e.getLocalizedMessage());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void addDataValue(UUID uuid, String key, String values) {
|
||||||
|
getConnection().SQLqueryWithNoResult("INSERT INTO `uservalues` " +
|
||||||
|
"(`uuid`,`key`,`value`) " +
|
||||||
|
"VALUES " +
|
||||||
|
"('" + uuid.toString() + "','" + key + "','" + values + "');");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void removeDataValueByKey(UUID uuid, String key) {
|
||||||
|
getConnection().SQLqueryWithNoResult("delete from `uservalues` where `uuid`='" + uuid.toString() + "' and `key`='" + key + "';");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void removeDataValue(UUID uuid, String value) {
|
||||||
|
getConnection().SQLqueryWithNoResult("delete from `uservalues` where `uuid`='" + uuid.toString() + "' and `value`=`" + value + "`;");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setDataValues(UUID uuid, HashMap<String, String> values) {
|
||||||
|
getConnection().SQLqueryWithNoResult("delete from `uservalues` where `uuid`='" + uuid.toString() + "';");
|
||||||
|
values.keySet().forEach(key -> addDataValue(uuid, key, values.get(key)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Map<String, String> getDataValues(Player player) {
|
||||||
|
return getDataValues(player.getUniqueId());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void addDataValue(Player player, String key, String values) {
|
||||||
|
addDataValue(player.getUniqueId(), key, values);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void removeDataValueByKey(Player player, String key) {
|
||||||
|
removeDataValueByKey(player.getUniqueId(), key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void removeDataValue(Player player, String value) {
|
||||||
|
removeDataValue(player.getUniqueId(), value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setDataValues(Player player, HashMap<String, String> values) {
|
||||||
|
setDataValues(player.getUniqueId(), values);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Connection getConnection() {
|
||||||
|
return DataManager.getConnection();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
package org.cn2b2t.core.managers.utils;
|
||||||
|
|
||||||
|
import org.cn2b2t.core.Main;
|
||||||
|
import org.bukkit.configuration.Configuration;
|
||||||
|
|
||||||
|
public class ConfigManager {
|
||||||
|
|
||||||
|
public static Configuration config;
|
||||||
|
|
||||||
|
|
||||||
|
public static void loadConfig() {
|
||||||
|
Main.getInstance().saveDefaultConfig();
|
||||||
|
Main.getInstance().saveConfig();
|
||||||
|
Main.getInstance().reloadConfig();
|
||||||
|
|
||||||
|
|
||||||
|
config = Main.getInstance().getConfig();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
package org.cn2b2t.core.managers.utils;
|
||||||
|
|
||||||
|
import org.cn2b2t.core.Main;
|
||||||
|
import org.cn2b2t.core.managers.utils.database.Connection;
|
||||||
|
|
||||||
|
public class DataManager {
|
||||||
|
|
||||||
|
private static Connection connection;
|
||||||
|
|
||||||
|
public static void init() {
|
||||||
|
connection = new Connection(
|
||||||
|
ConfigManager.config.getString("Database.host", "127.0.0.1"),
|
||||||
|
ConfigManager.config.getInt("Database.port", 3306),
|
||||||
|
ConfigManager.config.getString("Database.data", "guiying"),
|
||||||
|
ConfigManager.config.getString("Database.user", "guiying"),
|
||||||
|
ConfigManager.config.getString("Database.password", "guiying"));
|
||||||
|
if (connection.connect()) {
|
||||||
|
Main.log("&7├ └ &a数据库连接成功!");
|
||||||
|
} else {
|
||||||
|
Main.log("&7├ └ &c数据库连接失败!");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Connection getConnection() {
|
||||||
|
return connection;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,143 @@
|
|||||||
|
package org.cn2b2t.core.managers.utils;
|
||||||
|
|
||||||
|
import com.google.common.collect.Iterables;
|
||||||
|
import com.google.common.io.ByteArrayDataOutput;
|
||||||
|
import com.google.common.io.ByteStreams;
|
||||||
|
import org.cn2b2t.core.Main;
|
||||||
|
import org.cn2b2t.core.events.MessageReceiveEvent;
|
||||||
|
import org.cn2b2t.core.listener.MessageListener;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.DataOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Base64;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
public class MessagerManager {
|
||||||
|
|
||||||
|
public static List<String> registeredChannels = new ArrayList<>();
|
||||||
|
|
||||||
|
public static long timeOutTime = 1000;
|
||||||
|
|
||||||
|
public static void enable() {
|
||||||
|
Main.getInstance().getServer().getMessenger().registerOutgoingPluginChannel(Main.getInstance(), "BungeeCord");
|
||||||
|
Main.getInstance().getServer().getMessenger().registerIncomingPluginChannel(Main.getInstance(), "BungeeCord", new MessageListener());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void callEvent(String channel, long sendTime, String fromServer, String fromPlugin, String key, String[] values) {
|
||||||
|
new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
Bukkit.getPluginManager().callEvent(
|
||||||
|
new MessageReceiveEvent(channel, sendTime, fromServer, fromPlugin, key, values));
|
||||||
|
}
|
||||||
|
}.runTask(Main.getInstance());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void registerChannel(String channel) {
|
||||||
|
if (registeredChannels.contains(channel)) {
|
||||||
|
System.out.println(" Channel " + channel + " has registered.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
registeredChannels.add(channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void unRegisterChannel(String channel) {
|
||||||
|
if (!registeredChannels.contains(channel)) {
|
||||||
|
System.out.println(" Channel " + channel + " not registered.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
registeredChannels.remove(channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean hasChannel(String channel) {
|
||||||
|
return registeredChannels.contains(channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void send(JavaPlugin plugin, String channel, String key, String[] values) {
|
||||||
|
if (values == null || values.length < 1) {
|
||||||
|
Main.getInstance().getLogger().log(Level.WARNING, "错误! 发送的value = null");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
StringBuilder message = new StringBuilder();
|
||||||
|
|
||||||
|
for (int i = 0; i < values.length - 1; i++) {
|
||||||
|
message.append(Base64.getEncoder().encodeToString(values[i].getBytes()));
|
||||||
|
message.append(":");
|
||||||
|
}
|
||||||
|
message.append(Base64.getEncoder().encodeToString((values[values.length - 1]).getBytes()));
|
||||||
|
|
||||||
|
String value = message.toString();
|
||||||
|
new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
send(plugin, channel, true, key, value);
|
||||||
|
}
|
||||||
|
}.runTask(Main.getInstance());
|
||||||
|
}
|
||||||
|
}.runTaskAsynchronously(Main.getInstance());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void send(String channel, String key, String[] values) {
|
||||||
|
send(Main.getInstance(), channel, key, values);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void send(JavaPlugin plugin, String channel, String key, String value) {
|
||||||
|
send(plugin, channel, false, key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void send(String channel, String key, String value) {
|
||||||
|
send(Main.getInstance(), channel, false, key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void send(String channel, boolean encoded, String key, String value) {
|
||||||
|
send(Main.getInstance(), channel, encoded, key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void send(JavaPlugin plugin, String channel, boolean encoded, String key, String value) {
|
||||||
|
if (value == null) {
|
||||||
|
Main.getInstance().getLogger().log(Level.WARNING, "错误! 发送的value = null");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
ByteArrayDataOutput out = ByteStreams.newDataOutput();
|
||||||
|
out.writeUTF("Forward");
|
||||||
|
out.writeUTF("ALL");
|
||||||
|
out.writeUTF(channel);
|
||||||
|
ByteArrayOutputStream msgbytes = new ByteArrayOutputStream();
|
||||||
|
DataOutputStream msgout = new DataOutputStream(msgbytes);
|
||||||
|
//
|
||||||
|
msgout.writeLong(System.currentTimeMillis());
|
||||||
|
msgout.writeUTF(Bukkit.getServerId()); // from port
|
||||||
|
msgout.writeUTF(plugin.getName());
|
||||||
|
msgout.writeInt(encoded ? 1 : 0);
|
||||||
|
//
|
||||||
|
msgout.writeUTF(key);
|
||||||
|
msgout.writeUTF(value);
|
||||||
|
|
||||||
|
out.writeShort(msgbytes.toByteArray().length);
|
||||||
|
out.write(msgbytes.toByteArray());
|
||||||
|
Player player = Iterables.getFirst(Bukkit.getOnlinePlayers(), null);
|
||||||
|
if (player != null) {
|
||||||
|
player.sendPluginMessage(plugin, "BungeeCord", out.toByteArray());
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,105 @@
|
|||||||
|
package org.cn2b2t.core.managers.utils;
|
||||||
|
|
||||||
|
import org.cn2b2t.core.Main;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.DataOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
public class ServersManager
|
||||||
|
// implements PluginMessageListener
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
public static List<Player> requests = new ArrayList<>();
|
||||||
|
public static List<String> allPlayers = new ArrayList<>();
|
||||||
|
|
||||||
|
public static void init() {
|
||||||
|
Main.getInstance().getServer().getMessenger().registerOutgoingPluginChannel(Main.getInstance(), "BungeeCord");
|
||||||
|
Bukkit.getMessenger().registerOutgoingPluginChannel(Main.getInstance(), "BeeSwitch");
|
||||||
|
// Core.getInstance().getServer().getMessenger().registerIncomingPluginChannel(Core.getInstance(), "BungeeCord", new ServersManager());
|
||||||
|
// new BukkitRunnable() {
|
||||||
|
// @Override
|
||||||
|
// public void run() {
|
||||||
|
// if (Bukkit.getOnlinePlayers().size() < 1) return;
|
||||||
|
// sendGetPlayerList();
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
// }.runTaskTimer(Core.getInstance(), 60L, 200L);
|
||||||
|
}
|
||||||
|
|
||||||
|
// public static void sendGetPlayerList() {
|
||||||
|
// ByteArrayOutputStream b = new ByteArrayOutputStream();
|
||||||
|
// DataOutputStream out = new DataOutputStream(b);
|
||||||
|
// try {
|
||||||
|
// out.writeUTF("PlayerList");
|
||||||
|
// out.writeUTF("ALL");
|
||||||
|
// } catch (IOException ex) {
|
||||||
|
// Logger.getLogger(Core.class.getName()).log(Level.SEVERE, null, ex);
|
||||||
|
// }
|
||||||
|
// Player player = Iterables.getFirst(Bukkit.getOnlinePlayers(), null);
|
||||||
|
// if (player != null) {
|
||||||
|
// player.sendPluginMessage(Core.getInstance(), "BungeeCord", b.toByteArray());
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// @Override
|
||||||
|
// public void onPluginMessageReceived(String tag, Player player, byte[] data) {
|
||||||
|
// if (!tag.equals("BungeeCord")) return;
|
||||||
|
//
|
||||||
|
// ByteArrayDataInput in = ByteStreams.newDataInput(data);
|
||||||
|
// String server = in.readUTF();
|
||||||
|
//
|
||||||
|
// if (server.equals("ALL")) {
|
||||||
|
// String[] players = in.readUTF().split(", ");
|
||||||
|
// allPlayers = Arrays.stream(players).collect(Collectors.toList());
|
||||||
|
// } else {
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
public static void teleport(Player p, String server) {
|
||||||
|
ByteArrayOutputStream b = new ByteArrayOutputStream();
|
||||||
|
DataOutputStream out = new DataOutputStream(b);
|
||||||
|
try {
|
||||||
|
out.writeUTF("ConnectOther");
|
||||||
|
out.writeUTF(p.getName());
|
||||||
|
out.writeUTF(server);
|
||||||
|
} catch (IOException ex) {
|
||||||
|
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
|
||||||
|
}
|
||||||
|
p.sendPluginMessage(Main.getInstance(), "BungeeCord", b.toByteArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void teleport(Player player, String server, int t) {
|
||||||
|
requests.add(player);
|
||||||
|
new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (requests.contains(player) && player.isOnline()) {
|
||||||
|
teleport(player, server);
|
||||||
|
requests.remove(player);
|
||||||
|
}
|
||||||
|
cancel();
|
||||||
|
}
|
||||||
|
}.runTaskLater(Main.getInstance(), 20L * t);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void backToLobby(Player p) {
|
||||||
|
teleport(p, "lobby");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void switchServer(Player p, String targetServerIp) {
|
||||||
|
p.sendPluginMessage(Main.getInstance(), "BeeSwitch", targetServerIp.getBytes(StandardCharsets.UTF_8));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,109 @@
|
|||||||
|
package org.cn2b2t.core.managers.utils;
|
||||||
|
|
||||||
|
import org.cn2b2t.core.modules.users.AbstractUserHandler;
|
||||||
|
import org.cn2b2t.core.modules.users.User;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
public class UserManager {
|
||||||
|
|
||||||
|
private static HashMap<String, User> users = new HashMap<>();
|
||||||
|
|
||||||
|
protected static final Map<String, Object> handlers = new HashMap<>();
|
||||||
|
protected static final Map<String, Class<? extends AbstractUserHandler>> classes = new HashMap<>();
|
||||||
|
|
||||||
|
public static User registeruser(Player p) {
|
||||||
|
User user = new User(p);
|
||||||
|
users.put(p.getUniqueId().toString(), user);
|
||||||
|
return user;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static User getUser(Player p) {
|
||||||
|
return getUser(p.getUniqueId());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static User getUser(CommandSender sender) {
|
||||||
|
return sender instanceof Player ? getUser((Player) sender) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static User getUser(UUID uuid) {
|
||||||
|
return users.getOrDefault(uuid.toString(), null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void unregisterUser(Player p) {
|
||||||
|
users.remove(p.getUniqueId().toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static Collection<User> getRegisteredUsers() {
|
||||||
|
return users.values();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static boolean containsHandler(Class<? extends AbstractUserHandler> handler) {
|
||||||
|
int position = handler.getName().lastIndexOf('.');
|
||||||
|
return classes.containsKey(handler.getName().substring(position + 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean containsHandler(String name) {
|
||||||
|
return handlers.containsKey(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void regHandler(Class<? extends AbstractUserHandler> c) {
|
||||||
|
if (containsHandler(c)) {
|
||||||
|
throw new RuntimeException("Handler " + c.getName() + " is existed.");
|
||||||
|
} else {
|
||||||
|
int position = c.getName().lastIndexOf('.');
|
||||||
|
classes.put(c.getName().substring(position + 1), c);
|
||||||
|
for (User u : getRegisteredUsers()) {
|
||||||
|
u.registerHandler(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void regHandler(String name, Object o) {
|
||||||
|
if (containsHandler(name)) {
|
||||||
|
throw new RuntimeException("Handler " + name + " is existed.");
|
||||||
|
} else {
|
||||||
|
handlers.put(name, o);
|
||||||
|
for (User u : getRegisteredUsers()) {
|
||||||
|
u.registerHandler(name, o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void removeHandler(String name) {
|
||||||
|
if (!containsHandler(name)) {
|
||||||
|
throw new RuntimeException("Handler " + name + " wasn't found.");
|
||||||
|
} else {
|
||||||
|
handlers.remove(name);
|
||||||
|
for (User u : getRegisteredUsers()) {
|
||||||
|
u.removeHandler(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void removeHandler(Class<? extends AbstractUserHandler> c) {
|
||||||
|
if (!containsHandler(c)) {
|
||||||
|
throw new RuntimeException("Handler " + c.getName() + " wasn't found.");
|
||||||
|
} else {
|
||||||
|
classes.remove(c.getName());
|
||||||
|
for (User u : getRegisteredUsers()) {
|
||||||
|
u.removeHandler(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Map<String, Object> getHandlers() {
|
||||||
|
return handlers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Map<String, Class<? extends AbstractUserHandler>> getHandlerClasses() {
|
||||||
|
return classes;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
//
|
||||||
|
// Decompiled by Procyon v0.5.30
|
||||||
|
//
|
||||||
|
|
||||||
|
package org.cn2b2t.core.managers.utils.database;
|
||||||
|
|
||||||
|
public interface Builder {
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
|
||||||
|
|
||||||
|
package org.cn2b2t.core.managers.utils.database;
|
||||||
|
|
||||||
|
public class BuilderException extends RuntimeException {
|
||||||
|
private static final long serialVersionUID = -5189696278473157463L;
|
||||||
|
|
||||||
|
public BuilderException(final String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,376 @@
|
|||||||
|
package org.cn2b2t.core.managers.utils.database;
|
||||||
|
|
||||||
|
import org.cn2b2t.core.Main;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
public class Connection {
|
||||||
|
|
||||||
|
public boolean debug_outputSQL = true;
|
||||||
|
private Database sql;
|
||||||
|
private boolean databaseIsOpen;
|
||||||
|
private DatabaseConfig databaseConfig;
|
||||||
|
|
||||||
|
private Connection() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Connection(String SQL_HOST, int SQL_PORT, String SQL_DATA, String SQL_USER, String SQL_PASS) {
|
||||||
|
this.databaseConfig = new DatabaseConfig(SQL_HOST, SQL_PORT, SQL_DATA, SQL_USER, SQL_PASS);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean connect() {
|
||||||
|
if (sql != null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
sql = new MySQL(Bukkit.getLogger(), "Kettle", getDatabaseConfig().SQL_HOST, getDatabaseConfig().SQL_PORT, getDatabaseConfig().SQL_DATA, getDatabaseConfig().SQL_USER, getDatabaseConfig().SQL_PASS);
|
||||||
|
SQLcheck();
|
||||||
|
return databaseIsOpen();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SQLqueryWithNoResult(String query) {
|
||||||
|
SQLqueryWithNoResult(query, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SQLqueryWithNoResult(String query, boolean output) {
|
||||||
|
SQLcheck();
|
||||||
|
try {
|
||||||
|
getSQL().query(query);
|
||||||
|
} catch (SQLException ex) {
|
||||||
|
Bukkit.getLogger().severe(query);
|
||||||
|
if (output) {
|
||||||
|
info(ex.getLocalizedMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ResultSet SQLqueryInTable(String Table) {
|
||||||
|
SQLcheck();
|
||||||
|
String sqlm = "";
|
||||||
|
try {
|
||||||
|
sqlm = "SELECT * FROM " + Table;
|
||||||
|
ResultSet query = getSQL().getConnection().prepareStatement(sqlm, 1004, 1008).executeQuery();
|
||||||
|
return query;
|
||||||
|
} catch (SQLException ex) {
|
||||||
|
Bukkit.getLogger().warning(ex.getLocalizedMessage());
|
||||||
|
Bukkit.getLogger().log(Level.WARNING, "code: {0}", sqlm);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ResultSet SQLquery(String message) {
|
||||||
|
SQLcheck();
|
||||||
|
try {
|
||||||
|
ResultSet query = getSQL().getConnection().prepareStatement(message, 1004, 1008).executeQuery();
|
||||||
|
return query;
|
||||||
|
} catch (SQLException ex) {
|
||||||
|
Bukkit.getLogger().warning(ex.getLocalizedMessage());
|
||||||
|
Bukkit.getLogger().log(Level.WARNING, "code: {0}", message);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ResultSet SQLquery(String Table, String QueryName, Object QueryValue) {
|
||||||
|
SQLcheck();
|
||||||
|
String sqlm = "";
|
||||||
|
try {
|
||||||
|
sqlm = "SELECT * FROM " + Table + " WHERE `" + QueryName + "` = '" + QueryValue + "'";
|
||||||
|
ResultSet query = getSQL().getConnection().prepareStatement(sqlm, 1004, 1008).executeQuery();
|
||||||
|
return query;
|
||||||
|
} catch (SQLException ex) {
|
||||||
|
Bukkit.getLogger().warning(ex.getLocalizedMessage());
|
||||||
|
Bukkit.getLogger().log(Level.WARNING, "code: {0}", sqlm);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ResultSet SQLquery(String Table, String condition) {
|
||||||
|
SQLcheck();
|
||||||
|
String sqlm = "";
|
||||||
|
try {
|
||||||
|
sqlm = "SELECT * FROM " + Table + " WHERE " + condition;
|
||||||
|
ResultSet query = getSQL().getConnection().prepareStatement(sqlm, 1004, 1008).executeQuery();
|
||||||
|
return query;
|
||||||
|
} catch (SQLException ex) {
|
||||||
|
Bukkit.getLogger().warning(ex.getLocalizedMessage());
|
||||||
|
Bukkit.getLogger().log(Level.WARNING, "code: {0}", sqlm);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Database getSQL() {
|
||||||
|
return sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DatabaseConfig getDatabaseConfig() {
|
||||||
|
return databaseConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean databaseIsOpen() {
|
||||||
|
return databaseIsOpen;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SQLcheck() {
|
||||||
|
if (!sql.isOpen()) {
|
||||||
|
sql.open();
|
||||||
|
}
|
||||||
|
databaseIsOpen = sql.isOpen();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void update(String Table, String columnName, Object value, String QueryName, Object QueryValue) {
|
||||||
|
|
||||||
|
ResultSet query = SQLquery(Table, QueryName, QueryValue);
|
||||||
|
String sqlQuery = "";
|
||||||
|
try {
|
||||||
|
if (query != null) {
|
||||||
|
if (query.next()) {
|
||||||
|
sqlQuery = "UPDATE IGNORE " + Table + " SET " + columnName + " = '" + value + "' WHERE " + QueryName + " = '" + QueryValue + "'";
|
||||||
|
} else {
|
||||||
|
sqlQuery = "INSERT IGNORE INTO `" + Table + "`(`" + QueryName + "`, `" + columnName + "`) VALUES ('" + QueryValue + "', '" + value + "')";
|
||||||
|
}
|
||||||
|
if (debug_outputSQL) {
|
||||||
|
Bukkit.getLogger().log(Level.INFO, "code: {0}", sqlQuery);
|
||||||
|
}
|
||||||
|
query.close();
|
||||||
|
SQLqueryWithNoResult(sqlQuery);
|
||||||
|
} else {
|
||||||
|
SQLcheck();
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
info(e.getLocalizedMessage());
|
||||||
|
Bukkit.getLogger().log(Level.WARNING, "code: {0}", sqlQuery);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void update(String Table, String columnName, Object value, String QueryName, Object QueryValue, String QueryName2, Object QueryValue2) {
|
||||||
|
ResultSet query = SQLquery(Table, "`" + QueryName + "` = '" + QueryValue + "' AND `" + QueryName2 + "` = '" + QueryValue2 + "'");
|
||||||
|
String sqlQuery = "";
|
||||||
|
try {
|
||||||
|
if (query != null) {
|
||||||
|
|
||||||
|
if (query.next()) {
|
||||||
|
sqlQuery = "UPDATE IGNORE " + Table + " SET " + columnName + " = '" + value + "' WHERE " + QueryName + " = '" + QueryValue + "'";
|
||||||
|
} else {
|
||||||
|
sqlQuery = "INSERT IGNORE INTO `" + Table + "`(`" + QueryName + "`, `" + columnName + "`) VALUES ('" + QueryValue + "', '" + value + "')";
|
||||||
|
}
|
||||||
|
if (debug_outputSQL) {
|
||||||
|
Bukkit.getLogger().log(Level.INFO, "code: {0}", sqlQuery);
|
||||||
|
}
|
||||||
|
query.close();
|
||||||
|
SQLqueryWithNoResult(sqlQuery);
|
||||||
|
} else {
|
||||||
|
SQLcheck();
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
info(e.getLocalizedMessage());
|
||||||
|
Bukkit.getLogger().log(Level.WARNING, "code: {0}", sqlQuery);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ResultSet SQLquery(String Table, String[] queryNames, Object[] queryValues) {
|
||||||
|
SQLcheck();
|
||||||
|
StringBuilder sqlm = new StringBuilder();
|
||||||
|
if (queryNames.length != queryValues.length) {
|
||||||
|
throw new RuntimeException("请求的条件名与条件值数量不相符");
|
||||||
|
}
|
||||||
|
sqlm.append("SELECT * FROM ").append(Table).append(" WHERE ");
|
||||||
|
for (int i = 0; i < queryNames.length; i++) {
|
||||||
|
sqlm.append("`").append(queryNames[i]).append("` = '").append(queryValues[i]).append("'");
|
||||||
|
if (i != queryNames.length - 1) {
|
||||||
|
sqlm.append(" AND ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (debug_outputSQL) {
|
||||||
|
Bukkit.getLogger().log(Level.INFO, "code: {0}", sqlm.toString());
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
ResultSet query = getSQL().getConnection().prepareStatement(sqlm.toString(), 1004, 1008).executeQuery();
|
||||||
|
return query;
|
||||||
|
} catch (SQLException ex) {
|
||||||
|
Bukkit.getLogger().warning(ex.getLocalizedMessage());
|
||||||
|
Bukkit.getLogger().log(Level.WARNING, "code: {0}", sqlm);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void update(String table, String[] columnNames, Object[] values, String[] queryNames, Object[] queryValues) {
|
||||||
|
ResultSet query = SQLquery(table, queryNames, queryValues);
|
||||||
|
StringBuilder sqlQuery = new StringBuilder();
|
||||||
|
if (columnNames.length != values.length || queryNames.length != queryValues.length) {
|
||||||
|
throw new RuntimeException("提交的字段名与字段值数量不相符");
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
if (query != null) {
|
||||||
|
|
||||||
|
if (query.next()) {
|
||||||
|
sqlQuery.append("UPDATE IGNORE ").append(table).append(" SET ");
|
||||||
|
for (int i = 0; i < columnNames.length; i++) {
|
||||||
|
sqlQuery.append(columnNames[i]).append(" = '").append(values[i]).append("'");
|
||||||
|
if (i != columnNames.length - 1) {
|
||||||
|
sqlQuery.append(", ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sqlQuery.append(" WHERE ");
|
||||||
|
for (int i = 0; i < queryNames.length; i++) {
|
||||||
|
sqlQuery.append("`").append(queryNames[i]).append("` = '").append(queryValues[i]).append("'");
|
||||||
|
if (i != queryNames.length - 1) {
|
||||||
|
sqlQuery.append(" AND ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sqlQuery.append("INSERT IGNORE INTO `").append(table).append("`(");
|
||||||
|
for (int i = 0; i < columnNames.length; i++) {
|
||||||
|
sqlQuery.append("`").append(columnNames[i]).append("`");
|
||||||
|
if (i != columnNames.length - 1) {
|
||||||
|
sqlQuery.append(", ");
|
||||||
|
} else {
|
||||||
|
if (queryNames.length > 0) {
|
||||||
|
sqlQuery.append(", ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int i = 0; i < queryNames.length; i++) {
|
||||||
|
sqlQuery.append("`").append(queryNames[i]).append("`");
|
||||||
|
if (i != queryNames.length - 1) {
|
||||||
|
sqlQuery.append(", ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sqlQuery.append(") VALUES (");
|
||||||
|
for (int i = 0; i < values.length; i++) {
|
||||||
|
sqlQuery.append("'").append(values[i]).append("'");
|
||||||
|
if (i != values.length - 1) {
|
||||||
|
sqlQuery.append(", ");
|
||||||
|
} else {
|
||||||
|
if (queryValues.length > 0) {
|
||||||
|
sqlQuery.append(", ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int i = 0; i < queryValues.length; i++) {
|
||||||
|
sqlQuery.append("'").append(queryValues[i]).append("'");
|
||||||
|
if (i != queryValues.length - 1) {
|
||||||
|
sqlQuery.append(", ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sqlQuery.append(")");
|
||||||
|
}
|
||||||
|
if (debug_outputSQL) {
|
||||||
|
Bukkit.getLogger().log(Level.INFO, "code: {0}", sqlQuery);
|
||||||
|
}
|
||||||
|
query.close();
|
||||||
|
SQLqueryWithNoResult(sqlQuery.toString());
|
||||||
|
} else {
|
||||||
|
SQLcheck();
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
info(e.getLocalizedMessage());
|
||||||
|
Bukkit.getLogger().log(Level.SEVERE, "code: {0}", sqlQuery);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void insert(String table, String[] columnNames, Object[] values) {
|
||||||
|
StringBuilder sqlQuery = new StringBuilder();
|
||||||
|
if (columnNames.length != values.length) {
|
||||||
|
throw new RuntimeException("提交的字段名与字段值数量不相符");
|
||||||
|
}
|
||||||
|
|
||||||
|
sqlQuery.append("INSERT IGNORE INTO `").append(table).append("`(");
|
||||||
|
for (int i = 0; i < columnNames.length; i++) {
|
||||||
|
sqlQuery.append("`").append(columnNames[i]).append("`");
|
||||||
|
if (i != columnNames.length - 1) {
|
||||||
|
sqlQuery.append(", ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sqlQuery.append(") VALUES (");
|
||||||
|
for (int i = 0; i < values.length; i++) {
|
||||||
|
sqlQuery.append("'").append(values[i]).append("'");
|
||||||
|
if (i != values.length - 1) {
|
||||||
|
sqlQuery.append(", ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sqlQuery.append(")");
|
||||||
|
|
||||||
|
if (debug_outputSQL) {
|
||||||
|
Bukkit.getLogger().log(Level.INFO, "code: {0}", sqlQuery);
|
||||||
|
}
|
||||||
|
|
||||||
|
SQLqueryWithNoResult(sqlQuery.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void delete(String Table, String queryName, Object queryValue) {
|
||||||
|
SQLcheck();
|
||||||
|
StringBuilder sqlm = new StringBuilder();
|
||||||
|
sqlm.append("DELETE FROM ").append(Table).append(" WHERE `").append(queryName).append("` = '").append(queryValue).append("'");
|
||||||
|
|
||||||
|
if (debug_outputSQL) {
|
||||||
|
Bukkit.getLogger().log(Level.INFO, "code: {0}", sqlm);
|
||||||
|
}
|
||||||
|
|
||||||
|
SQLqueryWithNoResult(sqlm.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void delete(String Table, String[] queryNames, Object[] queryValues) {
|
||||||
|
SQLcheck();
|
||||||
|
StringBuilder sqlm = new StringBuilder();
|
||||||
|
if (queryNames.length != queryValues.length) {
|
||||||
|
throw new RuntimeException("请求的条件名与条件值数量不相符");
|
||||||
|
}
|
||||||
|
sqlm.append("DELETE FROM ").append(Table).append(" WHERE ");
|
||||||
|
for (int i = 0; i < queryNames.length; i++) {
|
||||||
|
sqlm.append("`").append(queryNames[i]).append("` = '").append(queryValues[i]).append("'");
|
||||||
|
if (i != queryNames.length - 1) {
|
||||||
|
sqlm.append(" AND ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (debug_outputSQL) {
|
||||||
|
Bukkit.getLogger().log(Level.INFO, "code: {0}", sqlm);
|
||||||
|
}
|
||||||
|
|
||||||
|
SQLqueryWithNoResult(sqlm.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateAsyn(String Table, String columnName, Object value, String QueryName, Object QueryValue) {
|
||||||
|
new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
update(Table, columnName, value, QueryName, QueryValue);
|
||||||
|
cancel();
|
||||||
|
}
|
||||||
|
}.runTaskAsynchronously(Main.getInstance());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateAsyn(String table, String[] columnNames, Object[] values, String[] queryNames, Object[] queryValues) {
|
||||||
|
new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
update(table, columnNames, values, queryNames, queryValues);
|
||||||
|
cancel();
|
||||||
|
}
|
||||||
|
}.runTaskAsynchronously(Main.getInstance());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void insertAsyn(String table, String[] columnNames, Object[] values) {
|
||||||
|
new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
insert(table, columnNames, values);
|
||||||
|
cancel();
|
||||||
|
}
|
||||||
|
}.runTaskAsynchronously(Main.getInstance());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void info(String msg) {
|
||||||
|
info(Bukkit.getConsoleSender(), msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void info(CommandSender sender, String msg) {
|
||||||
|
sender.sendMessage(msg.replace("&", "§"));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
package org.cn2b2t.core.managers.utils.database;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public enum DBMS {
|
||||||
|
Other("[Other] "),
|
||||||
|
Firebird("[Firebird] "),
|
||||||
|
FrontBase("[FrontBase] "),
|
||||||
|
DB2("[DB2] "),
|
||||||
|
H2("[H2] "),
|
||||||
|
Informix("[Informix] "),
|
||||||
|
Ingres("[Ingres] "),
|
||||||
|
MaxDB("[MaxDB] "),
|
||||||
|
MicrosoftSQL("[MicrosoftSQL] "),
|
||||||
|
Mongo("[Mongo] "),
|
||||||
|
mSQL("[mSQL] "),
|
||||||
|
MySQL("[MySQL] "),
|
||||||
|
Oracle("[Oracle] "),
|
||||||
|
PostgreSQL("[PostgreSQL] "),
|
||||||
|
SQLite("[SQLite] ");
|
||||||
|
|
||||||
|
private static Map<String, DBMS> prefixes;
|
||||||
|
|
||||||
|
static {
|
||||||
|
DBMS.prefixes = new HashMap<String, DBMS>();
|
||||||
|
for (final DBMS dbms : DBMS.prefixes.values()) {
|
||||||
|
DBMS.prefixes.put(dbms.toString(), dbms);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private final String prefix;
|
||||||
|
|
||||||
|
DBMS(final String prefix) {
|
||||||
|
this.prefix = prefix;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static DBMS getDBMS(final String prefix) {
|
||||||
|
return DBMS.prefixes.get(prefix);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return this.prefix;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,209 @@
|
|||||||
|
package org.cn2b2t.core.managers.utils.database;
|
||||||
|
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.*;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
public abstract class Database {
|
||||||
|
protected final String prefix;
|
||||||
|
protected Logger log;
|
||||||
|
protected DBMS driver;
|
||||||
|
protected Connection connection;
|
||||||
|
protected Map<PreparedStatement, StatementEnum> preparedStatements = new HashMap<PreparedStatement, StatementEnum>();
|
||||||
|
protected int lastUpdate;
|
||||||
|
|
||||||
|
public Database(final Logger log, final String prefix, final DBMS dbms) throws DatabaseException {
|
||||||
|
// this.preparedStatements = new HashMap<PreparedStatement, StatementEnum>();
|
||||||
|
if (log == null) {
|
||||||
|
throw new DatabaseException("Logger cannot be null.");
|
||||||
|
}
|
||||||
|
if (prefix == null || prefix.length() == 0) {
|
||||||
|
throw new DatabaseException("Plugin prefix cannot be null or empty.");
|
||||||
|
}
|
||||||
|
this.log = log;
|
||||||
|
this.prefix = prefix;
|
||||||
|
this.driver = dbms;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final String prefix(final String message) {
|
||||||
|
return this.prefix + this.driver + message;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
public final void writeInfo(final String toWrite) {
|
||||||
|
this.info(toWrite);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
public final void writeError(final String toWrite, final boolean severe) {
|
||||||
|
if (severe) {
|
||||||
|
this.error(toWrite);
|
||||||
|
} else {
|
||||||
|
this.warning(toWrite);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void info(final String info) {
|
||||||
|
if (info != null && !info.isEmpty()) {
|
||||||
|
this.log.info(this.prefix(info));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void warning(final String warning) {
|
||||||
|
if (warning != null && !warning.isEmpty()) {
|
||||||
|
this.log.warning(this.prefix(warning));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void error(final String error) {
|
||||||
|
if (error != null && !error.isEmpty()) {
|
||||||
|
this.log.severe(this.prefix(error));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract boolean initialize();
|
||||||
|
|
||||||
|
public final DBMS getDriver() {
|
||||||
|
return this.getDBMS();
|
||||||
|
}
|
||||||
|
|
||||||
|
public final DBMS getDBMS() {
|
||||||
|
return this.driver;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract boolean open();
|
||||||
|
|
||||||
|
public final boolean close() {
|
||||||
|
if (this.connection != null) {
|
||||||
|
try {
|
||||||
|
this.connection.close();
|
||||||
|
return true;
|
||||||
|
} catch (SQLException e) {
|
||||||
|
this.writeError("Could not close connection, SQLException: " + e.getMessage(), true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.writeError("Could not close connection, it is null.", true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
public final boolean isConnected() {
|
||||||
|
return this.isOpen();
|
||||||
|
}
|
||||||
|
|
||||||
|
public final Connection getConnection() {
|
||||||
|
return this.connection;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final boolean isOpen() {
|
||||||
|
return this.isOpen(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final boolean isOpen(final int seconds) {
|
||||||
|
if (this.connection != null) {
|
||||||
|
try {
|
||||||
|
if (this.connection.isValid(seconds)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} catch (SQLException ex) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
public final boolean checkConnection() {
|
||||||
|
return this.isOpen();
|
||||||
|
}
|
||||||
|
|
||||||
|
public final int getLastUpdateCount() {
|
||||||
|
return this.lastUpdate;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract void queryValidation(final StatementEnum p0) throws SQLException;
|
||||||
|
|
||||||
|
public final ResultSet query(final String query) throws SQLException {
|
||||||
|
this.queryValidation(this.getStatement(query));
|
||||||
|
final Statement statement = this.getConnection().createStatement();
|
||||||
|
if (statement.execute(query)) {
|
||||||
|
return statement.getResultSet();
|
||||||
|
}
|
||||||
|
final int uc = statement.getUpdateCount();
|
||||||
|
this.lastUpdate = uc;
|
||||||
|
return this.getConnection().createStatement().executeQuery("SELECT " + uc);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final ResultSet query(final PreparedStatement ps, final StatementEnum statement) throws SQLException {
|
||||||
|
this.queryValidation(statement);
|
||||||
|
if (ps.execute()) {
|
||||||
|
return ps.getResultSet();
|
||||||
|
}
|
||||||
|
final int uc = ps.getUpdateCount();
|
||||||
|
this.lastUpdate = uc;
|
||||||
|
return this.connection.createStatement().executeQuery("SELECT " + uc);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final ResultSet query(final PreparedStatement ps) throws SQLException {
|
||||||
|
ResultSet output = this.query(ps, this.preparedStatements.get(ps));
|
||||||
|
this.preparedStatements.remove(ps);
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final PreparedStatement prepare(final String query) throws SQLException {
|
||||||
|
final StatementEnum s = this.getStatement(query);
|
||||||
|
final PreparedStatement ps = this.connection.prepareStatement(query);
|
||||||
|
this.preparedStatements.put(ps, s);
|
||||||
|
return ps;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<Long> insert(final String query) throws SQLException {
|
||||||
|
final ArrayList<Long> keys = new ArrayList<Long>();
|
||||||
|
final PreparedStatement ps = this.connection.prepareStatement(query, 1);
|
||||||
|
this.lastUpdate = ps.executeUpdate();
|
||||||
|
final ResultSet key = ps.getGeneratedKeys();
|
||||||
|
if (key.next()) {
|
||||||
|
keys.add(key.getLong(1));
|
||||||
|
}
|
||||||
|
return keys;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<Long> insert(final PreparedStatement ps) throws SQLException {
|
||||||
|
this.lastUpdate = ps.executeUpdate();
|
||||||
|
this.preparedStatements.remove(ps);
|
||||||
|
final ArrayList<Long> keys = new ArrayList<Long>();
|
||||||
|
final ResultSet key = ps.getGeneratedKeys();
|
||||||
|
if (key.next()) {
|
||||||
|
keys.add(key.getLong(1));
|
||||||
|
}
|
||||||
|
return keys;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final ResultSet query(final Builder builder) throws SQLException {
|
||||||
|
return this.query(builder.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract StatementEnum getStatement(final String p0) throws SQLException;
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
public boolean createTable() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
public boolean checkTable(final String table) {
|
||||||
|
return this.isTable(table);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
public boolean wipeTable(final String table) {
|
||||||
|
return this.truncate(table);
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract boolean isTable(final String p0);
|
||||||
|
|
||||||
|
public abstract boolean truncate(final String p0);
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package org.cn2b2t.core.managers.utils.database;
|
||||||
|
|
||||||
|
public class DatabaseConfig {
|
||||||
|
public final String SQL_HOST;
|
||||||
|
public final int SQL_PORT;
|
||||||
|
public final String SQL_DATA;
|
||||||
|
public final String SQL_USER;
|
||||||
|
public final String SQL_PASS;
|
||||||
|
|
||||||
|
public DatabaseConfig(String SQL_HOST, int SQL_PORT, String SQL_DATA, String SQL_USER, String SQL_PASS) {
|
||||||
|
this.SQL_HOST = SQL_HOST;
|
||||||
|
this.SQL_PORT = SQL_PORT;
|
||||||
|
this.SQL_DATA = SQL_DATA;
|
||||||
|
this.SQL_USER = SQL_USER;
|
||||||
|
this.SQL_PASS = SQL_PASS;
|
||||||
|
}
|
||||||
|
}
|
||||||
+13
@@ -0,0 +1,13 @@
|
|||||||
|
//
|
||||||
|
// Decompiled by Procyon v0.5.30
|
||||||
|
//
|
||||||
|
|
||||||
|
package org.cn2b2t.core.managers.utils.database;
|
||||||
|
|
||||||
|
public class DatabaseException extends RuntimeException {
|
||||||
|
private static final long serialVersionUID = 3063547825200154629L;
|
||||||
|
|
||||||
|
public DatabaseException(final String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
package org.cn2b2t.core.managers.utils.database;
|
||||||
|
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
public abstract class HostnameDatabase extends Database {
|
||||||
|
private String hostname = "localhost";
|
||||||
|
private int port = 0;
|
||||||
|
private String database = "minecraft";
|
||||||
|
private String username = "minecraft";
|
||||||
|
private String password = "";
|
||||||
|
|
||||||
|
public HostnameDatabase(Logger log, String prefix, DBMS dbms, String hostname, int port, String database, String username, String password) {
|
||||||
|
super(log, prefix, dbms);
|
||||||
|
setHostname(hostname);
|
||||||
|
setPort(port);
|
||||||
|
setUsername(username);
|
||||||
|
setPassword(password);
|
||||||
|
setDatabase(database);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getHostname() {
|
||||||
|
return this.hostname;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHostname(String hostname) {
|
||||||
|
if ((hostname == null) || (hostname.length() == 0))
|
||||||
|
throw new RuntimeException("Hostname cannot be null or empty.");
|
||||||
|
this.hostname = hostname;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getPort() {
|
||||||
|
return this.port;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPort(int port) {
|
||||||
|
if ((port < 0) || (65535 < port))
|
||||||
|
throw new RuntimeException("Port number cannot be below 0 or greater than 65535.");
|
||||||
|
this.port = port;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUsername() {
|
||||||
|
return this.username;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUsername(String username) {
|
||||||
|
if (username == null)
|
||||||
|
throw new RuntimeException("Username cannot be null.");
|
||||||
|
this.username = username;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPassword() {
|
||||||
|
return this.password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPassword(String password) {
|
||||||
|
if (password == null)
|
||||||
|
throw new RuntimeException("Password cannot be null.");
|
||||||
|
this.password = password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDatabase() {
|
||||||
|
return this.database;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDatabase(String database) {
|
||||||
|
if ((database == null) || (database.length() == 0))
|
||||||
|
throw new RuntimeException("Database cannot be null or empty.");
|
||||||
|
this.database = database;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,184 @@
|
|||||||
|
package org.cn2b2t.core.managers.utils.database;
|
||||||
|
|
||||||
|
|
||||||
|
import java.sql.DriverManager;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.sql.Statement;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
public class MySQL extends HostnameDatabase {
|
||||||
|
|
||||||
|
public MySQL(final Logger log, final String prefix, final String hostname, final String port, final String database, final String username, final String password) {
|
||||||
|
super(log, prefix, DBMS.MySQL, hostname, Integer.parseInt(port), database, username, password);
|
||||||
|
}
|
||||||
|
|
||||||
|
public MySQL(final Logger log, final String prefix, final String hostname, final int port, final String database, final String username, final String password) {
|
||||||
|
super(log, prefix, DBMS.MySQL, hostname, port, database, username, password);
|
||||||
|
}
|
||||||
|
|
||||||
|
public MySQL(final Logger log, final String prefix, final String database, final String username, final String password) {
|
||||||
|
super(log, prefix, DBMS.MySQL, "localhost", 3306, database, username, password);
|
||||||
|
}
|
||||||
|
|
||||||
|
public MySQL(final Logger log, final String prefix, final String database, final String username) {
|
||||||
|
super(log, prefix, DBMS.MySQL, "localhost", 3306, database, username, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
public MySQL(final Logger log, final String prefix, final String database) {
|
||||||
|
super(log, prefix, DBMS.MySQL, "localhost", 3306, database, "", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean initialize() {
|
||||||
|
try {
|
||||||
|
Class.forName("com.mysql.jdbc.jdbc2.optional.MysqlDataSource");
|
||||||
|
return true;
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
this.warning("MySQL DataSource class missing: " + e.getMessage() + ".");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean open() {
|
||||||
|
try {
|
||||||
|
final String url = "jdbc:mysql://" + this.getHostname() + ":" + this.getPort() + "/" + this.getDatabase() + "?autoReconnect=true";
|
||||||
|
if (this.initialize()) {
|
||||||
|
this.connection = DriverManager.getConnection(url, this.getUsername(), this.getPassword());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
} catch (SQLException e) {
|
||||||
|
this.error("Could not establish a MySQL connection, SQLException: " + e.getMessage());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void queryValidation(final StatementEnum statement) throws SQLException {
|
||||||
|
switch ((Statements) statement) {
|
||||||
|
case USE: {
|
||||||
|
this.warning("Please create a new connection to use a different database.");
|
||||||
|
throw new SQLException("Please create a new connection to use a different database.");
|
||||||
|
}
|
||||||
|
case PREPARE:
|
||||||
|
case EXECUTE:
|
||||||
|
case DEALLOCATE: {
|
||||||
|
this.warning("Please use the prepare() method to prepare a SoulHistory.");
|
||||||
|
throw new SQLException("Please use the prepare() method to prepare a SoulHistory.");
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Statements getStatement(final String query) throws SQLException {
|
||||||
|
final String[] statement = query.trim().split(" ", 2);
|
||||||
|
try {
|
||||||
|
final Statements converted = Statements.valueOf(statement[0].toUpperCase());
|
||||||
|
return converted;
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
throw new SQLException("Unknown statement: \"" + statement[0] + "\".");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
public boolean createTable(final String query) {
|
||||||
|
Statement statement = null;
|
||||||
|
if (query == null || query.equals("")) {
|
||||||
|
this.writeError("Could not create table: SoulHistory is empty or null.", true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
statement = this.connection.createStatement();
|
||||||
|
statement.execute(query);
|
||||||
|
statement.close();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
this.writeError("Could not create table, SQLException: " + e.getMessage(), true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isTable(final String table) {
|
||||||
|
Statement statement;
|
||||||
|
try {
|
||||||
|
statement = this.connection.createStatement();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
this.error("Could not create a statement in checkTable(), SQLException: " + e.getMessage());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
statement.executeQuery("SELECT * FROM " + table);
|
||||||
|
return true;
|
||||||
|
} catch (SQLException e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean truncate(final String table) {
|
||||||
|
Statement statement = null;
|
||||||
|
String query = null;
|
||||||
|
try {
|
||||||
|
if (!this.isTable(table)) {
|
||||||
|
this.error("Table \"" + table + "\" does not exist.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
statement = this.connection.createStatement();
|
||||||
|
query = "DELETE FROM " + table + ";";
|
||||||
|
statement.executeUpdate(query);
|
||||||
|
statement.close();
|
||||||
|
return true;
|
||||||
|
} catch (SQLException e) {
|
||||||
|
this.error("Could not wipe table, SQLException: " + e.getMessage());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum Statements implements StatementEnum {
|
||||||
|
SELECT("SELECT"),
|
||||||
|
INSERT("INSERT"),
|
||||||
|
UPDATE("UPDATE"),
|
||||||
|
DELETE("DELETE"),
|
||||||
|
DO("DO"),
|
||||||
|
REPLACE("REPLACE"),
|
||||||
|
LOAD("LOAD"),
|
||||||
|
HANDLER("HANDLER"),
|
||||||
|
CALL("CALL"),
|
||||||
|
CREATE("CREATE"),
|
||||||
|
ALTER("ALTER"),
|
||||||
|
DROP("DROP"),
|
||||||
|
TRUNCATE("TRUNCATE"),
|
||||||
|
RENAME("RENAME"),
|
||||||
|
START("START"),
|
||||||
|
COMMIT("COMMIT"),
|
||||||
|
SAVEPOINT("SAVEPOINT"),
|
||||||
|
ROLLBACK("ROLLBACK"),
|
||||||
|
RELEASE("RELEASE"),
|
||||||
|
LOCK("LOCK"),
|
||||||
|
UNLOCK("UNLOCK"),
|
||||||
|
PREPARE("PREPARE"),
|
||||||
|
EXECUTE("EXECUTE"),
|
||||||
|
DEALLOCATE("DEALLOCATE"),
|
||||||
|
SET("SET"),
|
||||||
|
SHOW("SHOW"),
|
||||||
|
DESCRIBE("DESCRIBE"),
|
||||||
|
EXPLAIN("EXPLAIN"),
|
||||||
|
HELP("HELP"),
|
||||||
|
USE("USE");
|
||||||
|
|
||||||
|
private final String string;
|
||||||
|
|
||||||
|
Statements(final String string) {
|
||||||
|
this.string = string;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return this.string;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
package org.cn2b2t.core.managers.utils.database;
|
||||||
|
|
||||||
|
public interface StatementEnum {
|
||||||
|
}
|
||||||
+157
@@ -0,0 +1,157 @@
|
|||||||
|
package org.cn2b2t.core.managers.utils.scoreboard;
|
||||||
|
|
||||||
|
import org.cn2b2t.core.utils.ColorParser;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class CeramicScoreboard {
|
||||||
|
|
||||||
|
final String[] texts = new String[]{"", "", "", "", "", "", "", "", "", "", "", "", "", "", ""};
|
||||||
|
SBPriority pri;
|
||||||
|
String title;
|
||||||
|
private boolean rending = false;
|
||||||
|
|
||||||
|
public CeramicScoreboard() {
|
||||||
|
this("&f&lCeramic", SBPriority.NORMAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CeramicScoreboard(String title, SBPriority pri) {
|
||||||
|
this.title = title;
|
||||||
|
this.pri = pri;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CeramicScoreboard(String title) {
|
||||||
|
this(title, SBPriority.NORMAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CeramicScoreboard(SBPriority pri) {
|
||||||
|
this("&f&lKa&7&lr", pri);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLine(int index) {
|
||||||
|
if (index < 0 || index > 14) {
|
||||||
|
throw new IndexOutOfBoundsException(String.valueOf(index));
|
||||||
|
}
|
||||||
|
return this.texts[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isCleared(int index) {
|
||||||
|
return this.texts[index] == null || this.texts[index].equals("") || this.texts[index].equals("{clear}");
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> getTexts() {
|
||||||
|
List<String> l = new ArrayList<>();
|
||||||
|
for (int i = 14; i > -1; i--) {
|
||||||
|
if (!this.texts[i].equals("")) {
|
||||||
|
for (int id = 0; id < i + 1; id++) {
|
||||||
|
if (this.texts[i].equals("")) {
|
||||||
|
l.add(Null());
|
||||||
|
} else {
|
||||||
|
l.add(this.texts[id]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SBPriority getPriority() {
|
||||||
|
return this.pri;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPriority(SBPriority pri) {
|
||||||
|
PriorityChangeEvent e = new PriorityChangeEvent(this, this.pri, pri);
|
||||||
|
Bukkit.getPluginManager().callEvent(e);
|
||||||
|
if (e.isCancelled()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.pri = e.getNew();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isRending() {
|
||||||
|
return this.rending;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setRending(boolean b) {
|
||||||
|
this.rending = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTitle(String text) {
|
||||||
|
TitleUpdateEvent e = new TitleUpdateEvent(this, this.title, text);
|
||||||
|
Bukkit.getPluginManager().callEvent(e);
|
||||||
|
if (e.isCancelled()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.title = text;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTitle() {
|
||||||
|
return this.title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLine(int index, String text) {
|
||||||
|
text = ColorParser.parse(text);
|
||||||
|
|
||||||
|
if (index < 0 || index > 14) {
|
||||||
|
throw new IndexOutOfBoundsException(String.valueOf(index));
|
||||||
|
}
|
||||||
|
if (texts[index].equals(text)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
LineUpdateEvent e = new LineUpdateEvent(this, index, texts[index], text);
|
||||||
|
Bukkit.getPluginManager().callEvent(e);
|
||||||
|
if (e.isCancelled()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
texts[index] = e.getNew();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clearLine(int index) {
|
||||||
|
setLine(index, "{clear}");
|
||||||
|
}
|
||||||
|
|
||||||
|
public String Null() {
|
||||||
|
int c = 0;
|
||||||
|
List<String> list = new ArrayList<>();
|
||||||
|
list.addAll(Arrays.asList(texts).subList(0, 15));
|
||||||
|
while (true) {
|
||||||
|
if (c < 11) {
|
||||||
|
if (list.contains("&" + c) || list.contains("§" + c)) {
|
||||||
|
c++;
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
return "§" + c;
|
||||||
|
}
|
||||||
|
} else if (list.contains("§a") || list.contains("&a")) {
|
||||||
|
if (list.contains("§b") || list.contains("&b")) {
|
||||||
|
if (list.contains("§c") || list.contains("&c")) {
|
||||||
|
if (list.contains("§d") || list.contains("&d")) {
|
||||||
|
if (list.contains("§e") || list.contains("&e")) {
|
||||||
|
if (list.contains("§r") || list.contains("&r")) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
return "§r";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return "§e";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return "§d";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return "§c";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return "§b";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return "§a";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+69
@@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
* To change this license header, choose License Headers in Project Properties.
|
||||||
|
* To change this template file, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
package org.cn2b2t.core.managers.utils.scoreboard;
|
||||||
|
|
||||||
|
import org.bukkit.event.Event;
|
||||||
|
import org.bukkit.event.HandlerList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author LSeng
|
||||||
|
*/
|
||||||
|
public class LineUpdateEvent extends Event {
|
||||||
|
|
||||||
|
private static final HandlerList handler = new HandlerList();
|
||||||
|
CeramicScoreboard sb;
|
||||||
|
String old,New;
|
||||||
|
int line;
|
||||||
|
boolean cancelled = false;
|
||||||
|
|
||||||
|
private LineUpdateEvent(){}
|
||||||
|
|
||||||
|
public LineUpdateEvent(CeramicScoreboard sb,int line,String old,String New){
|
||||||
|
this.sb = sb;
|
||||||
|
this.old = old;
|
||||||
|
this.New = New;
|
||||||
|
this.line = line;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CeramicScoreboard getKarScoreboard(){
|
||||||
|
return this.sb;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOld(){
|
||||||
|
return this.old;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getNew(){
|
||||||
|
return this.New;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNew(String New){
|
||||||
|
this.New = New;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getLine(){
|
||||||
|
return this.line;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCancelled(boolean b){
|
||||||
|
this.cancelled = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isCancelled(){
|
||||||
|
return this.cancelled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HandlerList getHandlers() {
|
||||||
|
return handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HandlerList getHandlerList() {
|
||||||
|
return handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+55
@@ -0,0 +1,55 @@
|
|||||||
|
package org.cn2b2t.core.managers.utils.scoreboard;
|
||||||
|
|
||||||
|
import org.bukkit.event.Event;
|
||||||
|
import org.bukkit.event.HandlerList;
|
||||||
|
|
||||||
|
public class PriorityChangeEvent extends Event {
|
||||||
|
|
||||||
|
private static final HandlerList handler = new HandlerList();
|
||||||
|
|
||||||
|
CeramicScoreboard sb;
|
||||||
|
SBPriority old,New;
|
||||||
|
boolean cancelled = false;
|
||||||
|
|
||||||
|
private PriorityChangeEvent(){}
|
||||||
|
|
||||||
|
public PriorityChangeEvent(CeramicScoreboard sb,SBPriority old,SBPriority New){
|
||||||
|
this.sb = sb;
|
||||||
|
this.old = old;
|
||||||
|
this.New = New;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CeramicScoreboard getKarScoreboard(){
|
||||||
|
return sb;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SBPriority getOld(){
|
||||||
|
return this.old;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SBPriority getNew(){
|
||||||
|
return this.New;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSBPriority(SBPriority p){
|
||||||
|
this.New = p;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isCancelled(){
|
||||||
|
return this.cancelled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCanncelled(Boolean b){
|
||||||
|
this.cancelled = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HandlerList getHandlers() {
|
||||||
|
return handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HandlerList getHandlerList() {
|
||||||
|
return handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+43
@@ -0,0 +1,43 @@
|
|||||||
|
package org.cn2b2t.core.managers.utils.scoreboard;
|
||||||
|
|
||||||
|
import org.cn2b2t.core.modules.users.User;
|
||||||
|
import org.bukkit.event.Event;
|
||||||
|
import org.bukkit.event.HandlerList;
|
||||||
|
|
||||||
|
public class RendedChangeEvent extends Event {
|
||||||
|
|
||||||
|
private static final HandlerList handler = new HandlerList();
|
||||||
|
|
||||||
|
User user;
|
||||||
|
CeramicScoreboard old,New;
|
||||||
|
|
||||||
|
private RendedChangeEvent(){}
|
||||||
|
|
||||||
|
public RendedChangeEvent(User user,CeramicScoreboard old,CeramicScoreboard New){
|
||||||
|
this.user = user;
|
||||||
|
this.old = old;
|
||||||
|
this.New = New;
|
||||||
|
}
|
||||||
|
|
||||||
|
public User getUser(){
|
||||||
|
return this.user;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CeramicScoreboard getOld(){
|
||||||
|
return this.old;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CeramicScoreboard getNew(){
|
||||||
|
return this.New;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HandlerList getHandlers() {
|
||||||
|
return handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HandlerList getHandlerList() {
|
||||||
|
return handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
package org.cn2b2t.core.managers.utils.scoreboard;
|
||||||
|
|
||||||
|
public enum SBPriority {
|
||||||
|
|
||||||
|
CANCEL(-1),
|
||||||
|
LOWEAST(1),
|
||||||
|
LOW(2),
|
||||||
|
NORMAL(3),
|
||||||
|
HIGH(4),
|
||||||
|
HIGHER(5),
|
||||||
|
ULTRA(6),
|
||||||
|
ULTRA_P(7),
|
||||||
|
ULTRA_PS(8),
|
||||||
|
ULTRA_X(9),
|
||||||
|
COSTOM(0,true);
|
||||||
|
|
||||||
|
int pri;
|
||||||
|
boolean costom = false;
|
||||||
|
|
||||||
|
private SBPriority(int pri){
|
||||||
|
this.pri = pri;
|
||||||
|
}
|
||||||
|
|
||||||
|
private SBPriority(int pri,boolean costom){
|
||||||
|
this.pri = pri;
|
||||||
|
this.costom = costom;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean costom(int pri){
|
||||||
|
if(costom){
|
||||||
|
this.pri = pri;
|
||||||
|
return true;
|
||||||
|
}else{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int size(){
|
||||||
|
return this.pri;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+389
@@ -0,0 +1,389 @@
|
|||||||
|
package org.cn2b2t.core.managers.utils.scoreboard;
|
||||||
|
|
||||||
|
import org.cn2b2t.core.Main;
|
||||||
|
import org.cn2b2t.core.modules.users.User;
|
||||||
|
import org.cn2b2t.core.managers.utils.UserManager;
|
||||||
|
import org.apache.commons.lang3.Validate;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.HandlerList;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
|
import org.bukkit.scoreboard.DisplaySlot;
|
||||||
|
import org.bukkit.scoreboard.Objective;
|
||||||
|
import org.bukkit.scoreboard.Scoreboard;
|
||||||
|
import org.bukkit.scoreboard.Team;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 该类为内部使用,可能会在将来版本中去除
|
||||||
|
*
|
||||||
|
* @author LSeng
|
||||||
|
*/
|
||||||
|
public final class ScoreBoardRender {
|
||||||
|
|
||||||
|
boolean display = true;
|
||||||
|
|
||||||
|
private CeramicScoreboard rended;
|
||||||
|
private static final List<ChatColor> colors = Arrays.asList(ChatColor.values()); //所有颜色
|
||||||
|
private final Player player;
|
||||||
|
private final Scoreboard sb;
|
||||||
|
private final Objective objective;
|
||||||
|
private final List<BoardLine> boardLines = new ArrayList<>();// "行"
|
||||||
|
private int maxLine;//用于标注最大行数
|
||||||
|
private Listener listener;
|
||||||
|
|
||||||
|
public ScoreBoardRender(Player p, String title, Scoreboard sb) {
|
||||||
|
|
||||||
|
this.player = p;
|
||||||
|
if (sb == null) {
|
||||||
|
// if(Bukkit.getScoreboardManager().getMainScoreboard() == null){
|
||||||
|
sb = Bukkit.getScoreboardManager().getNewScoreboard();
|
||||||
|
this.sb = sb;
|
||||||
|
// }else{
|
||||||
|
// this.sb = Bukkit.getScoreboardManager().getMainScoreboard();
|
||||||
|
// }
|
||||||
|
} else {
|
||||||
|
this.sb = sb;
|
||||||
|
}
|
||||||
|
// if(getBoard().getObjective(DisplaySlot.SIDEBAR)!=null){
|
||||||
|
// objective = getBoard().getObjective(DisplaySlot.SIDEBAR);
|
||||||
|
// }else{
|
||||||
|
objective = getBoard().registerNewObjective(p.getUniqueId().toString().substring(0, 16), "dummy");
|
||||||
|
// }
|
||||||
|
objective.setDisplaySlot(DisplaySlot.SIDEBAR);
|
||||||
|
try {
|
||||||
|
// getBoard().getTeams().clear();
|
||||||
|
} catch (Exception ex) {
|
||||||
|
}
|
||||||
|
|
||||||
|
setTitle(title.replace("&", "§"));
|
||||||
|
for (int i = 0; i < colors.size(); i++) { //循环所有的颜色
|
||||||
|
final ChatColor color = colors.get(i);
|
||||||
|
final Team team = getBoard().registerNewTeam("boardLine" + i); //为每个颜色注册一个队伍
|
||||||
|
team.addEntry(color.toString()); //为队伍设置一个"行"
|
||||||
|
boardLines.add(new BoardLine(color, team)); //将"行"添加至列表
|
||||||
|
}
|
||||||
|
p.setScoreboard(this.sb);
|
||||||
|
|
||||||
|
this.listener = new Listener() {
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onQuit(PlayerQuitEvent event) {
|
||||||
|
if (event.getPlayer() == player) {
|
||||||
|
HandlerList.unregisterAll(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onTitleUpdata(TitleUpdateEvent event) {
|
||||||
|
if (!display) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (ScoreBoardRender.this.rended == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (event.getKarScoreboard() == ScoreBoardRender.this.rended) {
|
||||||
|
setTitle(event.getNew());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onLineUpdata(LineUpdateEvent event) {
|
||||||
|
if (!display) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (ScoreBoardRender.this.rended == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (event.getKarScoreboard() == ScoreBoardRender.this.rended) {
|
||||||
|
if (event.getNew().equals("{clear}")) {
|
||||||
|
removeLine(event.getLine());
|
||||||
|
} else {
|
||||||
|
setLine(event.getLine(), event.getNew());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onPriorityUpdata(PriorityChangeEvent event) {
|
||||||
|
if (ScoreBoardRender.this.rended == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
User u = UserManager.getUser(p);
|
||||||
|
if (event.getKarScoreboard() == ScoreBoardRender.this.rended && event.getNew() == SBPriority.CANCEL && u.getScoreboards().size() == 1) {
|
||||||
|
p.getScoreboard().clearSlot(DisplaySlot.SIDEBAR);
|
||||||
|
ScoreBoardRender.this.rended = null;
|
||||||
|
u.getScoreboards().remove(event.getKarScoreboard());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (event.getKarScoreboard() == ScoreBoardRender.this.rended) {
|
||||||
|
CeramicScoreboard max = event.getKarScoreboard();
|
||||||
|
for (CeramicScoreboard sb : u.getScoreboards()) {
|
||||||
|
if (sb.getPriority().size() > max.getPriority().size()) {
|
||||||
|
max = sb;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setRended(event.getKarScoreboard());
|
||||||
|
if (display) {
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
} else if (event.getNew().size() > ScoreBoardRender.this.rended.getPriority().size() && event.getNew() != SBPriority.CANCEL) {
|
||||||
|
setRended(event.getKarScoreboard());
|
||||||
|
if (display) {
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onScoreboardEnable(ScoreboardEnableEvent event) {
|
||||||
|
if (!event.user.getPlayer().equals(p)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ScoreBoardRender.this.display = event.b;
|
||||||
|
if (ScoreBoardRender.this.display) {
|
||||||
|
ScoreBoardRender.this.objective.setDisplaySlot(DisplaySlot.SIDEBAR);
|
||||||
|
update();
|
||||||
|
} else {
|
||||||
|
p.getScoreboard().clearSlot(DisplaySlot.SIDEBAR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onScoreboardAdd(ScoreboardAddEvent event) {
|
||||||
|
if (!event.user.getPlayer().equals(p)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (ScoreBoardRender.this.rended == null) {
|
||||||
|
setRended(event.getKarScoreboard());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (event.getKarScoreboard().getPriority().size() >= ScoreBoardRender.this.rended.getPriority().size()) {
|
||||||
|
setRended(event.getKarScoreboard());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Bukkit.getPluginManager().registerEvents(this.listener, Main.getInstance());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// public ScoreBoardRender(Player p,Scoreboard sb){
|
||||||
|
// this(p,"&f&lKa&7&lr",sb);
|
||||||
|
// }
|
||||||
|
public ScoreBoardRender(Player p, String title) {
|
||||||
|
this(p, title, Bukkit.getScoreboardManager().getMainScoreboard() == p.getScoreboard() ? null : p.getScoreboard());
|
||||||
|
}
|
||||||
|
|
||||||
|
public ScoreBoardRender(Player p) {
|
||||||
|
this(p, "&f&lKa&7&lr");
|
||||||
|
}
|
||||||
|
|
||||||
|
private ScoreBoardRender() {
|
||||||
|
this(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Scoreboard getBoard() {
|
||||||
|
return sb;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Objective getObjective() {
|
||||||
|
return objective;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTitle() {
|
||||||
|
return objective.getDisplayName();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTitle(String title) {
|
||||||
|
objective.setDisplayName(title.replace("&", "§"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Player getPlayer() {
|
||||||
|
return this.player;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 不管优先度,直接设置为该计分板(内部使用)
|
||||||
|
*
|
||||||
|
* @param sb
|
||||||
|
*/
|
||||||
|
public void setRended(CeramicScoreboard sb) {
|
||||||
|
if (this.rended != null) {
|
||||||
|
this.rended.setRending(false);
|
||||||
|
}
|
||||||
|
if (sb == null) {
|
||||||
|
throw new NullPointerException();
|
||||||
|
}
|
||||||
|
RendedChangeEvent e = new RendedChangeEvent(UserManager.getUser(player), this.rended, sb);
|
||||||
|
Bukkit.getPluginManager().callEvent(e);
|
||||||
|
sb.setRending(true);
|
||||||
|
this.rended = sb;
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
public CeramicScoreboard getRended() {
|
||||||
|
return this.rended;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void update() {
|
||||||
|
if (this.rended == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
setTitle(this.rended.getTitle());
|
||||||
|
setBody(this.rended.getTexts());
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLine(int line) {
|
||||||
|
line = 16 - line;
|
||||||
|
final BoardLine boardLine = getBoardLine(line); //得到我们的"行"
|
||||||
|
Validate.notNull(boardLine, "Unable to find BoardLine with index of " + line + "."); //确认是否存在
|
||||||
|
return boardLine.getTeam().getPrefix() + boardLine.getTeam().getSuffix();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLine(int line, String value) {
|
||||||
|
line = 16 - line;
|
||||||
|
value = value.replace("&&", "§§").replace("&", "§").replace("§§", "&");
|
||||||
|
final BoardLine boardLine = getBoardLine(line); //得到我们的"行"
|
||||||
|
Validate.notNull(boardLine, "Unable to find BoardLine with index of " + line + "."); //确认是否存在
|
||||||
|
objective.getScore(boardLine.getColor().toString()).setScore(line); //设置"行"
|
||||||
|
// clear(line);
|
||||||
|
//分割字符串为前16个和后16个及中间16个
|
||||||
|
String prefix;
|
||||||
|
String info = "";
|
||||||
|
String suffix = "";
|
||||||
|
// if (value.length() > 16) {
|
||||||
|
// suffix = value.substring(16);
|
||||||
|
// //处理前后的颜色
|
||||||
|
// String sufpre = ChatColor.getLastColors(prefix);
|
||||||
|
// if (value.charAt(15) == '§') {
|
||||||
|
// sufpre = "§";
|
||||||
|
// } else if (!suffix.isEmpty() && suffix.charAt(0) == '§') {
|
||||||
|
// sufpre = "";
|
||||||
|
// }
|
||||||
|
// String ssp = sufpre + suffix;
|
||||||
|
// suffix = ssp.substring(0, ssp.length());
|
||||||
|
// }
|
||||||
|
// if (value.length() > 16) {
|
||||||
|
// prefix = value.substring(0, 16);
|
||||||
|
// suffix = ChatColor.getLastColors(prefix) + value.substring(16, Math.min(32, value.length()));
|
||||||
|
// } else {
|
||||||
|
// prefix = value;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if(value.length() > 16){
|
||||||
|
// prefix = value.substring(0, 16);
|
||||||
|
// String prefixLastColor = ChatColor.getLastColors(prefix);
|
||||||
|
// if(prefix.charAt(15) == '§'){
|
||||||
|
// prefix = prefix.substring(0, 15);
|
||||||
|
// }
|
||||||
|
// value = value.substring(16);
|
||||||
|
// if(!prefixLastColor.equalsIgnoreCase("§f")){
|
||||||
|
// value = prefixLastColor + value;
|
||||||
|
// }
|
||||||
|
// if(value.length() > 16){
|
||||||
|
// info = value.substring(0, 16);
|
||||||
|
// String infoLastColor = ChatColor.getLastColors(info);
|
||||||
|
// if(info.charAt(15) == '§'){
|
||||||
|
// info = info.substring(0, 15);
|
||||||
|
// }
|
||||||
|
// value = value.substring(16);
|
||||||
|
// if(!infoLastColor.equalsIgnoreCase("§f")){
|
||||||
|
// value = infoLastColor + value;
|
||||||
|
// }
|
||||||
|
// suffix = value.substring(0,Math.min(16,value.length()));
|
||||||
|
// } else {
|
||||||
|
// info = (prefixLastColor.equalsIgnoreCase("§f") ? "" : prefixLastColor) + value;
|
||||||
|
// }
|
||||||
|
// } else {
|
||||||
|
// prefix = value;
|
||||||
|
// }
|
||||||
|
|
||||||
|
if (value.length() > 16) {
|
||||||
|
prefix = value.substring(0,16);
|
||||||
|
String prefixLastColor = ChatColor.getLastColors(prefix);
|
||||||
|
if(prefixLastColor.isEmpty()) prefixLastColor = "§f";
|
||||||
|
if(prefix.charAt(15) == '§'){
|
||||||
|
prefix = prefix.substring(0, 15);
|
||||||
|
value = "§"+value.substring(16);
|
||||||
|
} else {
|
||||||
|
value = prefixLastColor + value.substring(16);
|
||||||
|
}
|
||||||
|
suffix = value.substring(0,Math.min(16,value.length()));
|
||||||
|
|
||||||
|
// if(prefix.charAt(15) == '§'){
|
||||||
|
// prefix = prefix.substring(0,15);
|
||||||
|
// suffix = ChatColor.getLastColors(prefix) + "§" + value.substring(16);
|
||||||
|
// }else{
|
||||||
|
// suffix = ChatColor.getLastColors(prefix) + value.substring(16);
|
||||||
|
// }
|
||||||
|
// suffix = suffix.substring(0,Math.min(16,value.length()));
|
||||||
|
}else{
|
||||||
|
prefix = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
boardLine.getTeam().setPrefix(prefix); //设置前16个字符
|
||||||
|
// boardLine.getTeam().setDisplayName(info);
|
||||||
|
boardLine.getTeam().setSuffix(suffix); //设置后16个字符
|
||||||
|
// for(String entry : boardLine.getTeam().getEntries()){
|
||||||
|
// boardLine.getTeam().removeEntry(entry);
|
||||||
|
// }
|
||||||
|
// boardLine.getTeam().removeEntry(boardLine.getTeam().getEntries().iterator().next());
|
||||||
|
// boardLine.getTeam().addEntry(info);
|
||||||
|
// objective.getScore(info).setScore(line);
|
||||||
|
maxLine = line + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//all 5 [0 1 2 3 4] maxLine = 5 all 3 [0 1 2] maxLine=4
|
||||||
|
public void clear(int size) {
|
||||||
|
if (maxLine > size) {
|
||||||
|
for (int i = size; i < maxLine; i++) {
|
||||||
|
removeLine(i);
|
||||||
|
}
|
||||||
|
maxLine = size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeLine(int line) {
|
||||||
|
line = 16 - 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++) {
|
||||||
|
setLine(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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
+37
@@ -0,0 +1,37 @@
|
|||||||
|
package org.cn2b2t.core.managers.utils.scoreboard;
|
||||||
|
|
||||||
|
import org.cn2b2t.core.modules.users.User;
|
||||||
|
import org.bukkit.event.Event;
|
||||||
|
import org.bukkit.event.HandlerList;
|
||||||
|
|
||||||
|
public class ScoreboardAddEvent extends Event {
|
||||||
|
|
||||||
|
private static final HandlerList handler = new HandlerList();
|
||||||
|
User user;
|
||||||
|
CeramicScoreboard sb;
|
||||||
|
|
||||||
|
private ScoreboardAddEvent(){}
|
||||||
|
|
||||||
|
public ScoreboardAddEvent(User user,CeramicScoreboard sb){
|
||||||
|
this.user = user;
|
||||||
|
this.sb = sb;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CeramicScoreboard getKarScoreboard(){
|
||||||
|
return this.sb;
|
||||||
|
}
|
||||||
|
|
||||||
|
public User getUser(){
|
||||||
|
return this.user;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HandlerList getHandlers() {
|
||||||
|
return handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HandlerList getHandlerList() {
|
||||||
|
return handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+38
@@ -0,0 +1,38 @@
|
|||||||
|
package org.cn2b2t.core.managers.utils.scoreboard;
|
||||||
|
|
||||||
|
import org.cn2b2t.core.modules.users.User;
|
||||||
|
import org.bukkit.event.Event;
|
||||||
|
import org.bukkit.event.HandlerList;
|
||||||
|
|
||||||
|
public class ScoreboardEnableEvent extends Event {
|
||||||
|
|
||||||
|
private static final HandlerList handler = new HandlerList();
|
||||||
|
|
||||||
|
User user;
|
||||||
|
boolean b;
|
||||||
|
|
||||||
|
private ScoreboardEnableEvent(){}
|
||||||
|
|
||||||
|
public ScoreboardEnableEvent(User user,boolean b){
|
||||||
|
this.user = user;
|
||||||
|
this.b = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean getWhetherEnable(){
|
||||||
|
return this.b;
|
||||||
|
}
|
||||||
|
|
||||||
|
public User getUser(){
|
||||||
|
return this.user;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HandlerList getHandlers() {
|
||||||
|
return handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HandlerList getHandlerList() {
|
||||||
|
return handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+63
@@ -0,0 +1,63 @@
|
|||||||
|
/*
|
||||||
|
* To change this license header, choose License Headers in Project Properties.
|
||||||
|
* To change this template file, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
package org.cn2b2t.core.managers.utils.scoreboard;
|
||||||
|
|
||||||
|
import org.bukkit.event.Event;
|
||||||
|
import org.bukkit.event.HandlerList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author LSeng
|
||||||
|
*/
|
||||||
|
public class TitleUpdateEvent extends Event {
|
||||||
|
|
||||||
|
private static final HandlerList handler = new HandlerList();
|
||||||
|
CeramicScoreboard sb;
|
||||||
|
String old,New;
|
||||||
|
boolean cancelled = false;
|
||||||
|
|
||||||
|
private TitleUpdateEvent(){}
|
||||||
|
|
||||||
|
public TitleUpdateEvent(CeramicScoreboard sb,String old,String New){
|
||||||
|
this.sb = sb;
|
||||||
|
this.old = old;
|
||||||
|
this.New = New;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CeramicScoreboard getKarScoreboard(){
|
||||||
|
return this.sb;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOld(){
|
||||||
|
return this.old;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getNew(){
|
||||||
|
return this.New;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNew(String New){
|
||||||
|
this.New = New;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCancelled(boolean b){
|
||||||
|
this.cancelled = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isCancelled(){
|
||||||
|
return this.cancelled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HandlerList getHandlers() {
|
||||||
|
return handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HandlerList getHandlerList() {
|
||||||
|
return handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
package org.cn2b2t.core.modules.gui;
|
||||||
|
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.Sound;
|
||||||
|
import org.bukkit.event.inventory.ClickType;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.cn2b2t.core.modules.users.User;
|
||||||
|
import org.cn2b2t.core.utils.ItemStackFactory;
|
||||||
|
|
||||||
|
public class AutoPagedGUI extends CommonPagedGUI {
|
||||||
|
|
||||||
|
ItemStack lastPageUI;
|
||||||
|
ItemStack nextPageUI;
|
||||||
|
ItemStack firstPageUI;
|
||||||
|
ItemStack endPageUI;
|
||||||
|
int lastPageSlot = -1;
|
||||||
|
int nextPageSlot = -1;
|
||||||
|
|
||||||
|
public AutoPagedGUI(GUIType type, String name, int[] range) {
|
||||||
|
super(type, name, range);
|
||||||
|
}
|
||||||
|
|
||||||
|
public AutoPagedGUI(GUIType type, String name, int a, int b) {
|
||||||
|
super(type, name, a, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLastPageUI(ItemStack lastPageUI) {
|
||||||
|
this.lastPageUI = lastPageUI;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNextPageUI(ItemStack nextPageUI) {
|
||||||
|
this.nextPageUI = nextPageUI;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFirstPageUI(ItemStack firstPageUI) {
|
||||||
|
this.firstPageUI = firstPageUI;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEndPageUI(ItemStack endPageUI) {
|
||||||
|
this.endPageUI = endPageUI;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLastPageSlot(int slot) {
|
||||||
|
this.lastPageSlot = slot;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNextPageSlot(int slot) {
|
||||||
|
this.nextPageSlot = slot;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void openGUI(User user) {
|
||||||
|
if (lastPageSlot >= 0)
|
||||||
|
if (hasLastPage()) {
|
||||||
|
setItem(lastPageSlot, new GUIItem(lastPageUI == null ? new ItemStackFactory(Material.FENCE)
|
||||||
|
.setDisplayName("上一页")
|
||||||
|
.toItemStack() : lastPageUI) {
|
||||||
|
@Override
|
||||||
|
public void ClickAction(ClickType type, User u) {
|
||||||
|
lastPage();
|
||||||
|
openGUI(u);
|
||||||
|
u.getPlayer().playSound(u.getPlayer().getLocation(), Sound.ENTITY_CHICKEN_EGG, 0.5f, 1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
setItem(lastPageSlot, new GUIItem(firstPageUI == null ? new ItemStackFactory(Material.FENCE)
|
||||||
|
.setDisplayName("已经是首页了")
|
||||||
|
.toItemStack() : firstPageUI));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lastPageSlot >= 0)
|
||||||
|
if (hasNextPage()) {
|
||||||
|
setItem(nextPageSlot, new GUIItem(nextPageUI == null ? new ItemStackFactory(Material.COBBLE_WALL)
|
||||||
|
.setDisplayName("下一页")
|
||||||
|
.toItemStack() : nextPageUI) {
|
||||||
|
@Override
|
||||||
|
public void ClickAction(ClickType type, User u) {
|
||||||
|
nextPage();
|
||||||
|
openGUI(u);
|
||||||
|
u.getPlayer().playSound(u.getPlayer().getLocation(), Sound.ENTITY_CHICKEN_EGG, 0.5f, 1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
setItem(nextPageSlot, new GUIItem(endPageUI == null ? new ItemStackFactory(Material.COBBLE_WALL)
|
||||||
|
.setDisplayName("已经是尾页了")
|
||||||
|
.toItemStack() : endPageUI));
|
||||||
|
}
|
||||||
|
|
||||||
|
super.openGUI(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,125 @@
|
|||||||
|
package org.cn2b2t.core.modules.gui;
|
||||||
|
|
||||||
|
import org.cn2b2t.core.modules.users.User;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class CommonPagedGUI extends PagedGUI{
|
||||||
|
|
||||||
|
private int[] range;
|
||||||
|
|
||||||
|
int a;
|
||||||
|
int b;
|
||||||
|
|
||||||
|
int lineA;
|
||||||
|
int columnA;
|
||||||
|
int lineB;
|
||||||
|
int columnB;
|
||||||
|
|
||||||
|
private CommonPagedGUI(GUIType type, String name) {
|
||||||
|
super(type, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CommonPagedGUI(GUIType type, String Name, int[] range) {
|
||||||
|
super(type, Name);
|
||||||
|
Arrays.sort(range);
|
||||||
|
this.range = range;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public CommonPagedGUI(GUIType type, String Name, int a, int b) {
|
||||||
|
super(type, Name);
|
||||||
|
this.a = a;
|
||||||
|
this.b = b;
|
||||||
|
toRange(a,b);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
int[] matrix = new int[]{
|
||||||
|
0, 1, 2, 3, 4, 5, 6, 7, 8,
|
||||||
|
9, 10, 11, 12, 13, 14, 15, 16, 17,
|
||||||
|
18, 19, 20, 21, 22, 23, 24, 25, 26,
|
||||||
|
27, 28, 29, 30, 31, 32, 33, 34, 35,
|
||||||
|
36, 37, 38, 39, 40, 41, 42, 43, 44,
|
||||||
|
45, 46, 47, 48, 49, 50, 51, 52, 53
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
private void toRange(int a, int b) {
|
||||||
|
if (a > b) {
|
||||||
|
a = a ^ b;b = a ^ b;a = a ^ b;
|
||||||
|
}
|
||||||
|
|
||||||
|
lineA = getLine(a);
|
||||||
|
columnA = getColumn(a);
|
||||||
|
lineB = getLine(b);
|
||||||
|
columnB = getColumn(b);
|
||||||
|
|
||||||
|
if(lineB>this.items.length/9)
|
||||||
|
throw new IndexOutOfBoundsException("页面内容范围超过了GUI的大小");
|
||||||
|
|
||||||
|
int[] range = new int[(lineB-lineA+1)*(columnB-columnA+1)];
|
||||||
|
|
||||||
|
for(int i=0,l=0;i<this.items.length;i++){
|
||||||
|
int li = getLine(i);
|
||||||
|
int ci = getColumn(i);
|
||||||
|
if(li>=lineA && li<=lineB && ci>=columnA && ci<=columnB){
|
||||||
|
range[l] = i;
|
||||||
|
l++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.range = range;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getLine(int i){
|
||||||
|
return i/9+1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getColumn(int i){
|
||||||
|
return i%9+1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasLastPage() {
|
||||||
|
return page > 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasNextPage() {
|
||||||
|
return page <= this.container.size() / range.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void openGUI(User user){
|
||||||
|
if(container.isEmpty()){
|
||||||
|
super.openGUI(user);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
List<GUIItem> list = new ArrayList();
|
||||||
|
int start = (page-1)*range.length;
|
||||||
|
for(int i=start;i<start+range.length;i++){
|
||||||
|
if(i<container.size()){
|
||||||
|
list.add(container.get(i));
|
||||||
|
}else{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int i = 0;
|
||||||
|
for(int index : range){
|
||||||
|
setItem(index,null);
|
||||||
|
}
|
||||||
|
for(int index : range){
|
||||||
|
if(i<list.size()){
|
||||||
|
setItem(index, list.get(i));
|
||||||
|
i++;
|
||||||
|
}else{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
super.openGUI(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,332 @@
|
|||||||
|
package org.cn2b2t.core.modules.gui;
|
||||||
|
|
||||||
|
import org.cn2b2t.core.Main;
|
||||||
|
import org.cn2b2t.core.modules.users.User;
|
||||||
|
import org.cn2b2t.core.managers.utils.UserManager;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.entity.HumanEntity;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.HandlerList;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||||
|
import org.bukkit.event.inventory.InventoryCloseEvent;
|
||||||
|
import org.bukkit.event.inventory.InventoryDragEvent;
|
||||||
|
import org.bukkit.event.inventory.InventoryType;
|
||||||
|
import org.bukkit.inventory.Inventory;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class GUI {
|
||||||
|
|
||||||
|
GUIType type;
|
||||||
|
String name;
|
||||||
|
public GUIItem[] items;
|
||||||
|
public Inventory inv;
|
||||||
|
|
||||||
|
boolean setCancelledIfClickOnTarget = true;
|
||||||
|
boolean setCancelledIfClickOnSelf = true;
|
||||||
|
boolean setCancelledIfClickOnOuter = true;
|
||||||
|
|
||||||
|
Map<String,Object> flags;
|
||||||
|
|
||||||
|
Listener listener;
|
||||||
|
|
||||||
|
public GUI(GUIType type, String name) {
|
||||||
|
this.type = type;
|
||||||
|
this.name = name;
|
||||||
|
switch (type) {
|
||||||
|
case ONEBYNINE:
|
||||||
|
this.items = new GUIItem[9];
|
||||||
|
break;
|
||||||
|
case TWOBYNINE:
|
||||||
|
this.items = new GUIItem[18];
|
||||||
|
break;
|
||||||
|
case THREEBYNINE:
|
||||||
|
this.items = new GUIItem[27];
|
||||||
|
break;
|
||||||
|
case FOURBYNINE:
|
||||||
|
this.items = new GUIItem[36];
|
||||||
|
break;
|
||||||
|
case FIVEBYNINE:
|
||||||
|
this.items = new GUIItem[45];
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
case SIXBYNINE:
|
||||||
|
this.items = new GUIItem[54];
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HOPPER:
|
||||||
|
this.items = new GUIItem[InventoryType.HOPPER.getDefaultSize()];
|
||||||
|
break;
|
||||||
|
case BEACON:
|
||||||
|
this.items = new GUIItem[InventoryType.BEACON.getDefaultSize()];
|
||||||
|
break;
|
||||||
|
case DISPENSER:
|
||||||
|
this.items = new GUIItem[InventoryType.DISPENSER.getDefaultSize()];
|
||||||
|
break;
|
||||||
|
case DROPPER:
|
||||||
|
this.items = new GUIItem[InventoryType.DROPPER.getDefaultSize()];
|
||||||
|
break;
|
||||||
|
case FURNACE:
|
||||||
|
this.items = new GUIItem[InventoryType.FURNACE.getDefaultSize()];
|
||||||
|
break;
|
||||||
|
case WORKBENCH:
|
||||||
|
this.items = new GUIItem[InventoryType.WORKBENCH.getDefaultSize()];
|
||||||
|
break;
|
||||||
|
case CRAFTING:
|
||||||
|
this.items = new GUIItem[InventoryType.CRAFTING.getDefaultSize()];
|
||||||
|
break;
|
||||||
|
case ENCHANTING:
|
||||||
|
this.items = new GUIItem[InventoryType.ENCHANTING.getDefaultSize()];
|
||||||
|
break;
|
||||||
|
case BREWING:
|
||||||
|
this.items = new GUIItem[InventoryType.BREWING.getDefaultSize()];
|
||||||
|
break;
|
||||||
|
case PLAYER:
|
||||||
|
this.items = new GUIItem[InventoryType.PLAYER.getDefaultSize()];
|
||||||
|
break;
|
||||||
|
case MERCHANT:
|
||||||
|
this.items = new GUIItem[InventoryType.MERCHANT.getDefaultSize()];
|
||||||
|
break;
|
||||||
|
case ENDER_CHEST:
|
||||||
|
this.items = new GUIItem[InventoryType.ENDER_CHEST.getDefaultSize()];
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CREATIVE:
|
||||||
|
this.items = new GUIItem[InventoryType.CREATIVE.getDefaultSize()];
|
||||||
|
break;
|
||||||
|
case CANCEL:
|
||||||
|
this.items = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void setItem(int index, GUIItem item) {
|
||||||
|
if (item == null) {
|
||||||
|
this.items[index] = new GUIItem(new ItemStack(0));
|
||||||
|
} else {
|
||||||
|
this.items[index] = item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量添加GUI Item
|
||||||
|
*
|
||||||
|
* @param item
|
||||||
|
* @param index
|
||||||
|
*/
|
||||||
|
public void setItem(GUIItem item, int... index) {
|
||||||
|
for (int i : index) {
|
||||||
|
setItem(i, item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public GUIItem getItem(int index) {
|
||||||
|
return this.items[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateView(){
|
||||||
|
if(this.inv != null){
|
||||||
|
List<HumanEntity> viewers = this.inv.getViewers();
|
||||||
|
for (int index = 0; index < this.items.length; index++) {
|
||||||
|
if (items[index] == null) {
|
||||||
|
inv.setItem(index, new ItemStack(Material.AIR));
|
||||||
|
} else {
|
||||||
|
inv.setItem(index, items[index].display);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(HumanEntity p : viewers){
|
||||||
|
((Player)p).updateInventory();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCancelledIfClickOnTarget(boolean b){
|
||||||
|
this.setCancelledIfClickOnTarget = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCancelledIfClickOnSelf(boolean b){
|
||||||
|
this.setCancelledIfClickOnSelf = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCancelledIfClickOnOuter(boolean b){
|
||||||
|
this.setCancelledIfClickOnOuter = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addFlag(String flag,Object obj){
|
||||||
|
if(this.flags == null) this.flags = new HashMap<>();
|
||||||
|
this.flags.put(flag,obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getFlag(String flag){
|
||||||
|
if(this.flags == null) return null;
|
||||||
|
else
|
||||||
|
return this.flags.get(flag);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFlag(String flag, Object obj){
|
||||||
|
if(this.flags == null) this.flags = new HashMap<>();
|
||||||
|
this.flags.replace(flag,obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeFlag(String flag){
|
||||||
|
if(this.flags == null) this.flags = new HashMap<>();
|
||||||
|
this.flags.remove(flag);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void rawClickListener(InventoryClickEvent event){}
|
||||||
|
|
||||||
|
public void openGUI(User user) {
|
||||||
|
Inventory inv;
|
||||||
|
if (this.type == GUIType.CANCEL) {
|
||||||
|
throw new NullPointerException("被取消或不存在的GUI");
|
||||||
|
}
|
||||||
|
switch (type) {
|
||||||
|
default:
|
||||||
|
case ONEBYNINE:
|
||||||
|
case TWOBYNINE:
|
||||||
|
case THREEBYNINE:
|
||||||
|
case FOURBYNINE:
|
||||||
|
case FIVEBYNINE:
|
||||||
|
case SIXBYNINE:
|
||||||
|
inv = Bukkit.createInventory(null, this.items.length, this.name);
|
||||||
|
break;
|
||||||
|
case HOPPER:
|
||||||
|
inv = Bukkit.createInventory(null, InventoryType.HOPPER, name);
|
||||||
|
break;
|
||||||
|
case BEACON:
|
||||||
|
inv = Bukkit.createInventory(null, InventoryType.BEACON, name);
|
||||||
|
break;
|
||||||
|
case DISPENSER:
|
||||||
|
inv = Bukkit.createInventory(null, InventoryType.DISPENSER, name);
|
||||||
|
break;
|
||||||
|
case DROPPER:
|
||||||
|
inv = Bukkit.createInventory(null, InventoryType.DROPPER, name);
|
||||||
|
break;
|
||||||
|
case FURNACE:
|
||||||
|
inv = Bukkit.createInventory(null, InventoryType.FURNACE, name);
|
||||||
|
break;
|
||||||
|
case WORKBENCH:
|
||||||
|
inv = Bukkit.createInventory(null, InventoryType.WORKBENCH, name);
|
||||||
|
break;
|
||||||
|
case CRAFTING:
|
||||||
|
inv = Bukkit.createInventory(null, InventoryType.CRAFTING, name);
|
||||||
|
break;
|
||||||
|
case ENCHANTING:
|
||||||
|
inv = Bukkit.createInventory(null, InventoryType.ENCHANTING, name);
|
||||||
|
break;
|
||||||
|
case BREWING:
|
||||||
|
inv = Bukkit.createInventory(null, InventoryType.BREWING, name);
|
||||||
|
break;
|
||||||
|
case PLAYER:
|
||||||
|
inv = Bukkit.createInventory(null, InventoryType.PLAYER, name);
|
||||||
|
break;
|
||||||
|
case CREATIVE:
|
||||||
|
inv = Bukkit.createInventory(null, InventoryType.CREATIVE, name);
|
||||||
|
break;
|
||||||
|
case MERCHANT:
|
||||||
|
inv = Bukkit.createInventory(null, InventoryType.MERCHANT, name);
|
||||||
|
break;
|
||||||
|
case ENDER_CHEST:
|
||||||
|
inv = Bukkit.createInventory(null, InventoryType.ENDER_CHEST, name);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int index = 0; index < this.items.length; index++) {
|
||||||
|
if (items[index] == null) {
|
||||||
|
inv.setItem(index, new ItemStack(Material.AIR));
|
||||||
|
} else {
|
||||||
|
inv.setItem(index, items[index].display);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
user.openedGUI = this;
|
||||||
|
this.inv = inv;
|
||||||
|
// user.getPlayer().closeInventory();
|
||||||
|
user.getPlayer().openInventory(inv);
|
||||||
|
|
||||||
|
if(listener == null)
|
||||||
|
Bukkit.getPluginManager().registerEvents(listener = new Listener() {
|
||||||
|
@EventHandler
|
||||||
|
public void onInventoryClickEvent(InventoryClickEvent event) {
|
||||||
|
rawClickListener(event);
|
||||||
|
if (!(event.getWhoClicked() instanceof Player)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Player p = (Player) event.getWhoClicked();
|
||||||
|
User user = UserManager.getUser(p);
|
||||||
|
if (event.getSlot() != -999){
|
||||||
|
try {
|
||||||
|
if (user.openedGUI == GUI.this && event.getClickedInventory() != null && event.getClickedInventory().equals(GUI.this.inv) && GUI.this.items[event.getSlot()] != null)
|
||||||
|
GUI.this.items[event.getSlot()].realRawClickAction(event);
|
||||||
|
}catch (ArrayIndexOutOfBoundsException e){
|
||||||
|
e.printStackTrace();
|
||||||
|
System.err.print("err cause by GUI("+GUI.this.toString()+"), name="+ name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
if(setCancelledIfClickOnOuter)event.setCancelled(true);
|
||||||
|
}
|
||||||
|
if (user.openedGUI != null && /*user.openedGUI.inv.equals(event.getClickedInventory())*/ user.openedGUI == GUI.this && event.getClickedInventory() != null) {
|
||||||
|
if(event.getClickedInventory().equals(GUI.this.inv)) {
|
||||||
|
if(setCancelledIfClickOnTarget)event.setCancelled(true);
|
||||||
|
|
||||||
|
if (event.getSlot() != -999 && GUI.this.items[event.getSlot()] != null) {
|
||||||
|
if (GUI.this.items[event.getSlot()].isActionActive()) {
|
||||||
|
GUI.this.items[event.getSlot()].onClick(event.getClick());
|
||||||
|
GUI.this.items[event.getSlot()].ClickAction(event.getClick(), user);
|
||||||
|
GUI.this.items[event.getSlot()].rawClickAction(event);
|
||||||
|
if (!GUI.this.items[event.getSlot()].actions.isEmpty()) {
|
||||||
|
for (GUIItem.GUIClickAction action : GUI.this.items[event.getSlot()].actions) {
|
||||||
|
action.run(event.getClick(), user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!GUI.this.items[event.getSlot()].actionsIngoreActive.isEmpty()) {
|
||||||
|
for (GUIItem.GUIClickAction action : GUI.this.items[event.getSlot()].actionsIngoreActive) {
|
||||||
|
action.run(event.getClick(), user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}else if(event.getClickedInventory().equals(p.getInventory())){
|
||||||
|
if(setCancelledIfClickOnSelf)event.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onDrag(InventoryDragEvent e){
|
||||||
|
if (e.getWhoClicked() instanceof Player) {
|
||||||
|
Player p = (Player) e.getWhoClicked();
|
||||||
|
if(e.getInventory().equals(inv) || e.getInventory().equals(p.getInventory())){
|
||||||
|
GUI.this.onDrag(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onInventoryCloseEvent(InventoryCloseEvent event) {
|
||||||
|
if (event.getPlayer() instanceof Player && event.getInventory().equals(inv)) {
|
||||||
|
Player p = (Player) event.getPlayer();
|
||||||
|
User u = UserManager.getUser(p);
|
||||||
|
if (event.getInventory().equals(inv)) {
|
||||||
|
HandlerList.unregisterAll(this);
|
||||||
|
listener = null;
|
||||||
|
onClose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, Main.getInstance());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onDrag(InventoryDragEvent e){
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onClose(){
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
package org.cn2b2t.core.modules.gui;
|
||||||
|
|
||||||
|
import org.cn2b2t.core.modules.users.User;
|
||||||
|
import org.bukkit.event.inventory.ClickType;
|
||||||
|
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class GUIItem {
|
||||||
|
|
||||||
|
ItemStack display;
|
||||||
|
boolean actionActive = true;
|
||||||
|
|
||||||
|
public Set<GUIClickAction> actions = new HashSet<>();
|
||||||
|
public Set<GUIClickAction> actionsIngoreActive = new HashSet<>();
|
||||||
|
|
||||||
|
public GUIItem(ItemStack display) {
|
||||||
|
this.display = display;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final ItemStack getDisplay() {
|
||||||
|
return this.display;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void setDisplay(ItemStack display) {
|
||||||
|
this.display = display;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final boolean isActionActive(){
|
||||||
|
return this.actionActive;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void setActionActive(boolean b){
|
||||||
|
actionActive = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
public void ClickAction(ClickType type, User u) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onClick(ClickType type){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addClickAction(GUIClickAction action){
|
||||||
|
actions.add(action);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addActionIgnoreActive(GUIClickAction action){
|
||||||
|
actionsIngoreActive.add(action);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void customAction() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void rawClickAction(InventoryClickEvent event) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void realRawClickAction(InventoryClickEvent event) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void customAction(Object obj) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void customAction(User user) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract static class GUIClickAction{
|
||||||
|
public abstract void run(ClickType type, User u);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
package org.cn2b2t.core.modules.gui;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author LSeng
|
||||||
|
*/
|
||||||
|
public enum GUIType {
|
||||||
|
|
||||||
|
ONEBYNINE,
|
||||||
|
TWOBYNINE,
|
||||||
|
THREEBYNINE,
|
||||||
|
FOURBYNINE,
|
||||||
|
FIVEBYNINE,
|
||||||
|
SIXBYNINE,
|
||||||
|
DISPENSER,
|
||||||
|
DROPPER,
|
||||||
|
FURNACE,
|
||||||
|
WORKBENCH,
|
||||||
|
CRAFTING,
|
||||||
|
ENCHANTING,
|
||||||
|
BREWING,
|
||||||
|
PLAYER,
|
||||||
|
CREATIVE,
|
||||||
|
MERCHANT,
|
||||||
|
ENDER_CHEST,
|
||||||
|
BEACON,
|
||||||
|
HOPPER,
|
||||||
|
UNKNOWN,
|
||||||
|
CANCEL;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
package org.cn2b2t.core.modules.gui;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public abstract class PagedGUI extends GUI{
|
||||||
|
|
||||||
|
List<GUIItem> container = new ArrayList();
|
||||||
|
public int page = 1;
|
||||||
|
|
||||||
|
public PagedGUI(GUIType type, String name) {
|
||||||
|
super(type, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int add(GUIItem i){
|
||||||
|
container.add(i);
|
||||||
|
return container.size()-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void remove(GUIItem i){
|
||||||
|
container.remove(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void remove(int i){
|
||||||
|
container.remove(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<GUIItem> getContainer() {
|
||||||
|
return new ArrayList(container);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void lastPage(){
|
||||||
|
if(hasLastPage())
|
||||||
|
page--;
|
||||||
|
else
|
||||||
|
throw new IndexOutOfBoundsException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void nextPage(){
|
||||||
|
if(hasNextPage())
|
||||||
|
page++;
|
||||||
|
else
|
||||||
|
throw new IndexOutOfBoundsException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract boolean hasLastPage();
|
||||||
|
|
||||||
|
public abstract boolean hasNextPage();
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,119 @@
|
|||||||
|
package org.cn2b2t.core.modules.gui;
|
||||||
|
|
||||||
|
|
||||||
|
import org.cn2b2t.core.modules.users.User;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class RollingPagedGUI extends PagedGUI {
|
||||||
|
|
||||||
|
private int[] range;
|
||||||
|
|
||||||
|
int a;
|
||||||
|
int b;
|
||||||
|
|
||||||
|
int lineA;
|
||||||
|
int columnA;
|
||||||
|
int lineB;
|
||||||
|
int columnB;
|
||||||
|
|
||||||
|
private RollingPagedGUI(GUIType type, String Name) {
|
||||||
|
super(type, Name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public RollingPagedGUI(GUIType type, String Name, int a, int b) {
|
||||||
|
super(type, Name);
|
||||||
|
this.a = a;
|
||||||
|
this.b = b;
|
||||||
|
toRange(a, b);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
int[] matrix = new int[]{
|
||||||
|
0, 1, 2, 3, 4, 5, 6, 7, 8,
|
||||||
|
9, 10, 11, 12, 13, 14, 15, 16, 17,
|
||||||
|
18, 19, 20, 21, 22, 23, 24, 25, 26,
|
||||||
|
27, 28, 29, 30, 31, 32, 33, 34, 35,
|
||||||
|
36, 37, 38, 39, 40, 41, 42, 43, 44,
|
||||||
|
45, 46, 47, 48, 49, 50, 51, 52, 53
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
private void toRange(int a, int b) {
|
||||||
|
if (a > b) {
|
||||||
|
a = a ^ b;
|
||||||
|
b = a ^ b;
|
||||||
|
a = a ^ b;
|
||||||
|
}
|
||||||
|
|
||||||
|
lineA = getLine(a);
|
||||||
|
columnA = getColumn(a);
|
||||||
|
lineB = getLine(b);
|
||||||
|
columnB = getColumn(b);
|
||||||
|
|
||||||
|
if (lineB > this.items.length / 9)
|
||||||
|
throw new IndexOutOfBoundsException("页面内容范围超过了GUI的大小");
|
||||||
|
|
||||||
|
int[] range = new int[(lineB - lineA + 1) * (columnB - columnA + 1)];
|
||||||
|
|
||||||
|
for (int i = 0, l = 0; i < this.items.length; i++) {
|
||||||
|
int li = getLine(i);
|
||||||
|
int ci = getColumn(i);
|
||||||
|
if (li >= lineA && li <= lineB && ci >= columnA && ci <= columnB) {
|
||||||
|
range[l] = i;
|
||||||
|
l++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.range = range;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getLine(int i) {
|
||||||
|
return i / 9 + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getColumn(int i) {
|
||||||
|
return i % 9 + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasLastPage() {
|
||||||
|
return page > 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasNextPage() {
|
||||||
|
return page < this.container.size() / range.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void openGUI(User user) {
|
||||||
|
if (container.isEmpty()) {
|
||||||
|
super.openGUI(user);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
List<GUIItem> list = new ArrayList<>();
|
||||||
|
int lineLength = lineB - lineA + 1;
|
||||||
|
int start = (page - 1) * lineLength;
|
||||||
|
for (int i = start; i < start + range.length; i++) {
|
||||||
|
if (i < container.size()) {
|
||||||
|
list.add(container.get(i));
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int i = 0;
|
||||||
|
for (int index : range) {
|
||||||
|
if (i < list.size()) {
|
||||||
|
setItem(index, list.get(i));
|
||||||
|
i++;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
super.openGUI(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
package org.cn2b2t.core.modules.users;
|
||||||
|
|
||||||
|
import org.cn2b2t.core.events.UserHandlerLoadedEvent;
|
||||||
|
import org.cn2b2t.core.managers.utils.UserManager;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
|
||||||
|
public abstract class AbstractUserHandler {
|
||||||
|
|
||||||
|
protected User user;
|
||||||
|
|
||||||
|
protected AbstractUserHandler() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public final User getUser() {
|
||||||
|
return this.user;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void init() {
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onDisable() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void callLoadedEvent(JavaPlugin main) {
|
||||||
|
new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
Bukkit.getPluginManager().callEvent(new UserHandlerLoadedEvent(AbstractUserHandler.this));
|
||||||
|
}
|
||||||
|
}.runTask(main);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,221 @@
|
|||||||
|
package org.cn2b2t.core.modules.users;
|
||||||
|
|
||||||
|
import org.cn2b2t.core.Main;
|
||||||
|
import org.cn2b2t.core.events.UserLoadedEvent;
|
||||||
|
import org.cn2b2t.core.managers.utils.UserManager;
|
||||||
|
import org.cn2b2t.core.managers.utils.scoreboard.CeramicScoreboard;
|
||||||
|
import org.cn2b2t.core.managers.utils.scoreboard.ScoreBoardRender;
|
||||||
|
import org.cn2b2t.core.modules.gui.GUI;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
import org.spigotmc.AsyncCatcher;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
public class User {
|
||||||
|
|
||||||
|
private final Player player;
|
||||||
|
|
||||||
|
private Map<String, Object> handler = new HashMap<>();
|
||||||
|
|
||||||
|
public GUI openedGUI;
|
||||||
|
|
||||||
|
ScoreBoardRender sbRender;
|
||||||
|
List<CeramicScoreboard> scoreboards = new ArrayList<>();
|
||||||
|
|
||||||
|
|
||||||
|
public boolean fullLoaded;
|
||||||
|
|
||||||
|
public User(Player player) {
|
||||||
|
this.player = player;
|
||||||
|
|
||||||
|
new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
|
||||||
|
UserManager.getHandlers().forEach((key, value) -> registerHandler(key, value));
|
||||||
|
|
||||||
|
UserManager.getHandlerClasses().forEach((key, value) -> {
|
||||||
|
try {
|
||||||
|
registerHandler(value);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
Logger.getLogger(User.class.getName()).log(Level.SEVERE, null, ex);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
fullLoaded = true;
|
||||||
|
new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
sbRender = new ScoreBoardRender(player);
|
||||||
|
}
|
||||||
|
}.runTaskLater(Main.getInstance(), 1L);
|
||||||
|
Bukkit.getPluginManager().callEvent(new UserLoadedEvent(User.this));
|
||||||
|
}
|
||||||
|
}.runTask(Main.getInstance());
|
||||||
|
|
||||||
|
|
||||||
|
cancel();
|
||||||
|
}
|
||||||
|
}.runTaskAsynchronously(Main.getInstance());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public List<CeramicScoreboard> getScoreboards() {
|
||||||
|
return this.scoreboards;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Player getPlayer() {
|
||||||
|
return player;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unregister() {
|
||||||
|
//此操作疑似会重复运行onDisable();
|
||||||
|
// for (Map.Entry<String, Object> e : UserManager.handlers.entrySet()) {
|
||||||
|
// if(AbstractUserHandler.class.isAssignableFrom(e.getValue().getClass()))
|
||||||
|
// ((AbstractUserHandler) (e.getValue())).onDisable();
|
||||||
|
// }
|
||||||
|
this.openedGUI = null;
|
||||||
|
this.handler.clear();
|
||||||
|
this.handler = null;
|
||||||
|
this.scoreboards.clear();
|
||||||
|
this.scoreboards = null;
|
||||||
|
this.sbRender = null;
|
||||||
|
UserManager.unregisterUser(this.getPlayer());
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T extends AbstractUserHandler> T getHandler(Class<T> c) {
|
||||||
|
if (isUnregistered()) {
|
||||||
|
AsyncCatcher.catchOp("handler get when user unloaded");
|
||||||
|
}
|
||||||
|
int position = c.getName().lastIndexOf('.');
|
||||||
|
String name = c.getName().substring(position + 1);
|
||||||
|
if (containsHandler(name)) {
|
||||||
|
return (T) handler.get(name);
|
||||||
|
} else {
|
||||||
|
throw new NullPointerException("Handler " + name + " in User " + getPlayer().getName() + " wasn't found.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getHandler(String s) {
|
||||||
|
if (isUnregistered()) {
|
||||||
|
AsyncCatcher.catchOp("handler get when user unloaded");
|
||||||
|
}
|
||||||
|
if (containsHandler(s)) {
|
||||||
|
return handler.get(s);
|
||||||
|
} else {
|
||||||
|
throw new NullPointerException("Handler " + s + " in User " + getPlayer().getName() + " wasn't found.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T> T getHandler(String s, Class T) {
|
||||||
|
if (isUnregistered()) {
|
||||||
|
AsyncCatcher.catchOp("handler get when user unloaded");
|
||||||
|
}
|
||||||
|
if (containsHandler(s)) {
|
||||||
|
return (T) handler.get(s);
|
||||||
|
} else {
|
||||||
|
throw new NullPointerException("Handler " + s + " in User " + getPlayer().getName() + " wasn't found.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean containsHandler(String s) {
|
||||||
|
return handler.containsKey(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean containsHandler(Class<? extends AbstractUserHandler> c) {
|
||||||
|
int position = c.getName().lastIndexOf('.');
|
||||||
|
return handler.containsKey(c.getName().substring(position + 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void registerHandler(Class<? extends AbstractUserHandler> c) {
|
||||||
|
if (isUnregistered()) {
|
||||||
|
throw new IllegalStateException("register Handler when user unloaded");
|
||||||
|
}
|
||||||
|
if (containsHandler(c)) {
|
||||||
|
throw new RuntimeException("Handler " + c.getName() + " in User " + getPlayer().getName() + " is existed.");
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
AbstractUserHandler h = c.newInstance();
|
||||||
|
h.user = this;
|
||||||
|
h.init();
|
||||||
|
int position = c.getName().lastIndexOf('.');
|
||||||
|
this.handler.put(c.getName().substring(position + 1), h);
|
||||||
|
} catch (InstantiationException | IllegalAccessException ex) {
|
||||||
|
Logger.getLogger(User.class.getName()).log(Level.SEVERE, null, ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void registerHandler(String name, Object o) {
|
||||||
|
if (isUnregistered()) {
|
||||||
|
throw new IllegalStateException("register Handler when user unloaded");
|
||||||
|
}
|
||||||
|
if (containsHandler(name)) {
|
||||||
|
throw new RuntimeException("Handler " + name + " in User " + getPlayer().getName() + " is existed.");
|
||||||
|
} else {
|
||||||
|
this.handler.put(name, o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeHandler(String name) {
|
||||||
|
if (!containsHandler(name)) {
|
||||||
|
throw new RuntimeException("Handler " + name + " in User " + getPlayer().getName() + " wasn't existed.");
|
||||||
|
} else {
|
||||||
|
Object h = this.handler.get(name);
|
||||||
|
if (h instanceof AbstractUserHandler) {
|
||||||
|
AbstractUserHandler absh = (AbstractUserHandler) h;
|
||||||
|
absh.onDisable();
|
||||||
|
}
|
||||||
|
this.handler.remove(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeHandler(Class<? extends AbstractUserHandler> c) {
|
||||||
|
if (!containsHandler(c)) {
|
||||||
|
throw new RuntimeException("Handler " + c.getName() + " in User " + getPlayer().getName() + " wasn't existed.");
|
||||||
|
} else {
|
||||||
|
int position = c.getName().lastIndexOf('.');
|
||||||
|
String name = c.getName().substring(position + 1);
|
||||||
|
Object h = this.handler.get(name);
|
||||||
|
if (h instanceof AbstractUserHandler) {
|
||||||
|
AbstractUserHandler absh = (AbstractUserHandler) h;
|
||||||
|
absh.onDisable();
|
||||||
|
}
|
||||||
|
this.handler.remove(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ScoreBoardRender getSbRender() {
|
||||||
|
return sbRender;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addScoreboard(CeramicScoreboard sb) {
|
||||||
|
this.scoreboards.add(sb);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void replaceHandler(String name, Object o) {
|
||||||
|
if (!containsHandler(name)) {
|
||||||
|
throw new RuntimeException("Handler " + name + " in User " + getPlayer().getName() + " was existed.");
|
||||||
|
} else {
|
||||||
|
this.handler.replace(name, o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isUnregistered() {
|
||||||
|
return !UserManager.getRegisteredUsers().contains(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,425 @@
|
|||||||
|
package org.cn2b2t.core.utils;
|
||||||
|
|
||||||
|
import net.md_5.bungee.api.ChatColor;
|
||||||
|
import net.md_5.bungee.api.chat.BaseComponent;
|
||||||
|
import net.md_5.bungee.api.chat.ClickEvent;
|
||||||
|
import net.md_5.bungee.api.chat.HoverEvent;
|
||||||
|
import net.md_5.bungee.api.chat.TextComponent;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
|
||||||
|
import java.util.Deque;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
public class BBCodeChatParser {
|
||||||
|
|
||||||
|
private static final Pattern pattern;
|
||||||
|
private static final Pattern strip_bbcode_pattern;
|
||||||
|
// private final Logger logger;
|
||||||
|
|
||||||
|
// public BBCodeChatParser(final Logger logger) {
|
||||||
|
// this.logger = logger;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// public BBCodeChatParser() {
|
||||||
|
// this(Logger.getLogger(BBCodeChatParser.class.getName()));
|
||||||
|
// }
|
||||||
|
|
||||||
|
static {
|
||||||
|
pattern = Pattern.compile("(?is)(?=\\n)|(?:[&§](?<color>[0-9A-FK-OR]))|(?:\\[(?<tag>/?(?:b|i|u|s|nocolor|nobbcode)|(?:url|command|hover|suggest|color)=(?<value>(?:(?:[^]\\[]*)\\[(?:[^]\\[]*)\\])*(?:[^]\\[]*))|/(?:url|command|hover|suggest|color))\\])|(?:\\[(?<implicitTag>url|command|suggest)\\](?=(?<implicitValue>.*?)\\[/\\k<implicitTag>\\]))");
|
||||||
|
strip_bbcode_pattern = Pattern.compile("(?is)(?:\\[(?<tag>/?(?:b|i|u|s|nocolor|nobbcode)|(?:url|command|hover|suggest|color)=(?<value>(?:(?:[^]\\[]*)\\[(?:[^]\\[]*)\\])*(?:[^]\\[]*))|/(?:url|command|hover|suggest|color))\\])|(?:\\[(?<implicitTag>url|command|suggest)\\](?=(?<implicitValue>.*?)\\[/\\k<implicitTag>\\]))");
|
||||||
|
}
|
||||||
|
|
||||||
|
// public static BaseComponent[] parseChatColor(BaseComponent[] bcs){
|
||||||
|
// List<BaseComponent> list = new LinkedList();
|
||||||
|
//
|
||||||
|
// ChatColor lastColor = ChatColor.GRAY;
|
||||||
|
// boolean lastBold = false;
|
||||||
|
// boolean lastItalic = false;
|
||||||
|
// boolean lastObfuscated = false;
|
||||||
|
// boolean lastUnderlined = false;
|
||||||
|
// boolean lastStrikethrough = false;
|
||||||
|
// for(BaseComponent bc : bcs){
|
||||||
|
// if(bc instanceof TextComponent){
|
||||||
|
// TextComponent tc = (TextComponent)bc;
|
||||||
|
// String raw = tc.getText();
|
||||||
|
// System.out.print("raw: "+raw);
|
||||||
|
// if(raw.contains("§")){
|
||||||
|
// TextComponent tce = new TextComponent();
|
||||||
|
// while(raw.contains("§")){
|
||||||
|
// if(!raw.startsWith("§")){
|
||||||
|
// tce.setText(raw.substring(0,raw.indexOf('§')));
|
||||||
|
// raw = raw.substring(raw.indexOf('§'));
|
||||||
|
// }
|
||||||
|
// if(raw.length()-1>raw.indexOf('§')){
|
||||||
|
// char c = Character.toLowerCase(raw.charAt(raw.indexOf('§')+1));
|
||||||
|
// if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f')) {
|
||||||
|
// if (!tce.getText().isEmpty()) {
|
||||||
|
// tce.setColor(lastColor);
|
||||||
|
// tce.setBold(lastBold);
|
||||||
|
// tce.setItalic(lastItalic);
|
||||||
|
// tce.setObfuscated(lastObfuscated);
|
||||||
|
// tce.setUnderlined(lastUnderlined);
|
||||||
|
// tce.setStrikethrough(lastStrikethrough);
|
||||||
|
// if(bc.getHoverEvent()!=null){
|
||||||
|
// tce.setHoverEvent(bc.getHoverEvent());
|
||||||
|
// }
|
||||||
|
// if(bc.getClickEvent()!=null){
|
||||||
|
// tce.setClickEvent(bc.getClickEvent());
|
||||||
|
// }
|
||||||
|
// list.add(tce.duplicate());
|
||||||
|
// tce = new TextComponent();
|
||||||
|
// System.out.print("动作: 输出1");
|
||||||
|
// }
|
||||||
|
// lastColor = ChatColor.getByChar(c);
|
||||||
|
// lastBold = lastItalic = lastObfuscated = lastUnderlined = lastStrikethrough = false;
|
||||||
|
// raw = raw.substring(2, raw.length()-1);
|
||||||
|
// System.out.print("动作: 染色");
|
||||||
|
// }else if(c == 'm'){
|
||||||
|
// lastStrikethrough = true;
|
||||||
|
// raw = raw.substring(2, raw.length()-1);
|
||||||
|
// System.out.print("动作: 划掉");
|
||||||
|
// }else if(c == 'n'){
|
||||||
|
// lastUnderlined = true;
|
||||||
|
// raw = raw.substring(2, raw.length()-1);
|
||||||
|
// System.out.print("动作: 下划线");
|
||||||
|
// }else if(c == 'o'){
|
||||||
|
// lastItalic = true;
|
||||||
|
// raw = raw.substring(2, raw.length()-1);
|
||||||
|
// System.out.print("动作: 斜体");
|
||||||
|
// }else if(c == 'l'){
|
||||||
|
// lastBold = true;
|
||||||
|
// raw = raw.substring(2, raw.length()-1);
|
||||||
|
// System.out.print("动作: 加粗");
|
||||||
|
// }else if(c == 'k'){
|
||||||
|
// lastObfuscated = true;
|
||||||
|
// raw = raw.substring(2, raw.length()-1);
|
||||||
|
// System.out.print("动作: 混乱");
|
||||||
|
// }else if(c == 'r'){
|
||||||
|
// lastColor = ChatColor.RESET;
|
||||||
|
// System.out.print("动作: 重设");
|
||||||
|
// }
|
||||||
|
// }else{
|
||||||
|
// raw = raw.substring(0, raw.length()-1);
|
||||||
|
// }
|
||||||
|
// if(!tce.getText().isEmpty()){
|
||||||
|
// tce.setColor(lastColor);
|
||||||
|
// tce.setBold(lastBold);
|
||||||
|
// tce.setItalic(lastItalic);
|
||||||
|
// tce.setObfuscated(lastObfuscated);
|
||||||
|
// tce.setUnderlined(lastUnderlined);
|
||||||
|
// tce.setStrikethrough(lastStrikethrough);
|
||||||
|
// if(bc.getHoverEvent()!=null){
|
||||||
|
// tce.setHoverEvent(bc.getHoverEvent());
|
||||||
|
// }
|
||||||
|
// if(bc.getClickEvent()!=null){
|
||||||
|
// tce.setClickEvent(bc.getClickEvent());
|
||||||
|
// }
|
||||||
|
// list.add((BaseComponent)tce.duplicate());
|
||||||
|
// tce = new TextComponent();
|
||||||
|
// System.out.print("动作: 输出2");
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// if(!raw.isEmpty()){
|
||||||
|
// tce.setText(raw);
|
||||||
|
// tce.setColor(lastColor);
|
||||||
|
// tce.setBold(lastBold);
|
||||||
|
// tce.setItalic(lastItalic);
|
||||||
|
// tce.setObfuscated(lastObfuscated);
|
||||||
|
// tce.setUnderlined(lastUnderlined);
|
||||||
|
// tce.setStrikethrough(lastStrikethrough);
|
||||||
|
// if(bc.getHoverEvent()!=null){
|
||||||
|
// tce.setHoverEvent(bc.getHoverEvent());
|
||||||
|
// }
|
||||||
|
// if(bc.getClickEvent()!=null){
|
||||||
|
// tce.setClickEvent(bc.getClickEvent());
|
||||||
|
// }
|
||||||
|
// list.add((BaseComponent)tce.duplicate());
|
||||||
|
// System.out.print("动作: 输出3");
|
||||||
|
// }
|
||||||
|
// }else{
|
||||||
|
// bc.setColor(lastColor);
|
||||||
|
// bc.setBold(lastBold);
|
||||||
|
// bc.setItalic(lastItalic);
|
||||||
|
// bc.setObfuscated(lastObfuscated);
|
||||||
|
// bc.setUnderlined(lastUnderlined);
|
||||||
|
// bc.setStrikethrough(lastStrikethrough);
|
||||||
|
// list.add(bc);
|
||||||
|
// System.out.print("动作: 输出4");
|
||||||
|
// }
|
||||||
|
// }else{
|
||||||
|
// bc.setColor(lastColor);
|
||||||
|
// bc.setBold(lastBold);
|
||||||
|
// bc.setItalic(lastItalic);
|
||||||
|
// bc.setObfuscated(lastObfuscated);
|
||||||
|
// bc.setUnderlined(lastUnderlined);
|
||||||
|
// bc.setStrikethrough(lastStrikethrough);
|
||||||
|
// list.add(bc);
|
||||||
|
// System.out.print("动作: 输出5");
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// return list.toArray(new BaseComponent[list.size()]);
|
||||||
|
// }
|
||||||
|
|
||||||
|
public static BaseComponent[] parse(final String text) {
|
||||||
|
final Matcher matcher = BBCodeChatParser.pattern.matcher(text);
|
||||||
|
TextComponent current = new TextComponent();
|
||||||
|
final List<BaseComponent> components = new LinkedList<>();
|
||||||
|
int forceBold = 0;
|
||||||
|
int forceItalic = 0;
|
||||||
|
int forceUnderlined = 0;
|
||||||
|
int forceStrikethrough = 0;
|
||||||
|
int nocolorLevel = 0;
|
||||||
|
int nobbcodeLevel = 0;
|
||||||
|
final Deque<ChatColor> colorDeque = new LinkedList<>();
|
||||||
|
final Deque<ClickEvent> clickEventDeque = new LinkedList<>();
|
||||||
|
final Deque<HoverEvent> hoverEventDeque = new LinkedList<>();
|
||||||
|
while (matcher.find()) {
|
||||||
|
boolean parsed = false;
|
||||||
|
final StringBuffer stringBuffer = new StringBuffer();
|
||||||
|
matcher.appendReplacement(stringBuffer, "");
|
||||||
|
final TextComponent component = new TextComponent(current);
|
||||||
|
current.setText(stringBuffer.toString());
|
||||||
|
components.add(current);
|
||||||
|
current = component;
|
||||||
|
final String group_color = matcher.group("color");
|
||||||
|
final String group_tag = matcher.group("tag");
|
||||||
|
String group_value = matcher.group("value");
|
||||||
|
final String group_implicitTag = matcher.group("implicitTag");
|
||||||
|
final String group_implicitValue = matcher.group("implicitValue");
|
||||||
|
if (group_color != null && nocolorLevel <= 0) {
|
||||||
|
ChatColor color = ChatColor.getByChar(group_color.charAt(0));
|
||||||
|
if (color != null) {
|
||||||
|
Label_0458:
|
||||||
|
{
|
||||||
|
switch (color) {
|
||||||
|
case MAGIC: {
|
||||||
|
current.setObfuscated(true);
|
||||||
|
break Label_0458;
|
||||||
|
}
|
||||||
|
case BOLD: {
|
||||||
|
current.setBold(true);
|
||||||
|
break Label_0458;
|
||||||
|
}
|
||||||
|
case STRIKETHROUGH: {
|
||||||
|
current.setStrikethrough(true);
|
||||||
|
break Label_0458;
|
||||||
|
}
|
||||||
|
case UNDERLINE: {
|
||||||
|
current.setUnderlined(true);
|
||||||
|
break Label_0458;
|
||||||
|
}
|
||||||
|
case ITALIC: {
|
||||||
|
current.setItalic(true);
|
||||||
|
break Label_0458;
|
||||||
|
}
|
||||||
|
case RESET: {
|
||||||
|
color = ChatColor.WHITE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
current = new TextComponent();
|
||||||
|
current.setColor(color);
|
||||||
|
current.setBold(forceBold > 0);
|
||||||
|
current.setItalic(forceItalic > 0);
|
||||||
|
current.setUnderlined(forceUnderlined > 0);
|
||||||
|
current.setStrikethrough(forceStrikethrough > 0);
|
||||||
|
if (!colorDeque.isEmpty()) {
|
||||||
|
current.setColor(colorDeque.peek());
|
||||||
|
}
|
||||||
|
if (!clickEventDeque.isEmpty()) {
|
||||||
|
current.setClickEvent(clickEventDeque.peek());
|
||||||
|
}
|
||||||
|
if (!hoverEventDeque.isEmpty()) {
|
||||||
|
current.setHoverEvent(hoverEventDeque.peek());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
parsed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (group_tag != null && nobbcodeLevel <= 0) {
|
||||||
|
if (group_tag.matches("(?is)^b$")) {
|
||||||
|
current.setBold(++forceBold > 0);
|
||||||
|
parsed = true;
|
||||||
|
} else if (group_tag.matches("(?is)^/b$")) {
|
||||||
|
current.setBold(--forceBold > 0);
|
||||||
|
parsed = true;
|
||||||
|
}
|
||||||
|
if (group_tag.matches("(?is)^i$")) {
|
||||||
|
current.setItalic(++forceItalic > 0);
|
||||||
|
parsed = true;
|
||||||
|
} else if (group_tag.matches("(?is)^/i$")) {
|
||||||
|
current.setItalic(--forceItalic > 0);
|
||||||
|
parsed = true;
|
||||||
|
}
|
||||||
|
if (group_tag.matches("(?is)^u$")) {
|
||||||
|
current.setUnderlined(++forceUnderlined > 0);
|
||||||
|
parsed = true;
|
||||||
|
} else if (group_tag.matches("(?is)^/u$")) {
|
||||||
|
current.setUnderlined(--forceUnderlined > 0);
|
||||||
|
parsed = true;
|
||||||
|
}
|
||||||
|
if (group_tag.matches("(?is)^s$")) {
|
||||||
|
current.setStrikethrough(++forceStrikethrough > 0);
|
||||||
|
parsed = true;
|
||||||
|
} else if (group_tag.matches("(?is)^/s$")) {
|
||||||
|
current.setStrikethrough(--forceStrikethrough > 0);
|
||||||
|
parsed = true;
|
||||||
|
}
|
||||||
|
if (group_tag.matches("(?is)^color=.*$")) {
|
||||||
|
ChatColor color = null;
|
||||||
|
for (final ChatColor color2 : ChatColor.values()) {
|
||||||
|
if (color2.getName().equalsIgnoreCase(group_value)) {
|
||||||
|
color = color2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
colorDeque.push(current.getColor());
|
||||||
|
if (color != null && color != ChatColor.BOLD && color != ChatColor.ITALIC && color != ChatColor.MAGIC && color != ChatColor.RESET && color != ChatColor.STRIKETHROUGH && color != ChatColor.UNDERLINE) {
|
||||||
|
colorDeque.push(color);
|
||||||
|
current.setColor(color);
|
||||||
|
} else {
|
||||||
|
Bukkit.getLogger().log(Level.WARNING, "Invalid color tag: [{0}] UNKNOWN COLOR ''{1}''", new Object[]{group_tag, group_value});
|
||||||
|
colorDeque.push(ChatColor.WHITE);
|
||||||
|
current.setColor(ChatColor.WHITE);
|
||||||
|
}
|
||||||
|
parsed = true;
|
||||||
|
} else if (group_tag.matches("(?is)^/color$")) {
|
||||||
|
if (!colorDeque.isEmpty()) {
|
||||||
|
colorDeque.pop();
|
||||||
|
current.setColor(colorDeque.pop());
|
||||||
|
}
|
||||||
|
parsed = true;
|
||||||
|
}
|
||||||
|
if (group_tag.matches("(?is)^url=.*$")) {
|
||||||
|
String url = group_value;
|
||||||
|
url = url.replaceAll("(?is)\\[/?nobbcode\\]", "");
|
||||||
|
if (!url.startsWith("http")) {
|
||||||
|
url = "http://" + url;
|
||||||
|
}
|
||||||
|
final ClickEvent clickEvent = new ClickEvent(ClickEvent.Action.OPEN_URL, url);
|
||||||
|
clickEventDeque.push(clickEvent);
|
||||||
|
current.setClickEvent(clickEvent);
|
||||||
|
parsed = true;
|
||||||
|
}
|
||||||
|
if (group_tag.matches("(?is)^/(?:url|command|suggest)$")) {
|
||||||
|
if (!clickEventDeque.isEmpty()) {
|
||||||
|
clickEventDeque.pop();
|
||||||
|
}
|
||||||
|
if (clickEventDeque.isEmpty()) {
|
||||||
|
current.setClickEvent(null);
|
||||||
|
} else {
|
||||||
|
current.setClickEvent(clickEventDeque.peek());
|
||||||
|
}
|
||||||
|
parsed = true;
|
||||||
|
}
|
||||||
|
if (group_tag.matches("(?is)^command=.*")) {
|
||||||
|
group_value = group_value.replaceAll("(?is)\\[/?nobbcode\\]", "");
|
||||||
|
final ClickEvent clickEvent2 = new ClickEvent(ClickEvent.Action.RUN_COMMAND, group_value);
|
||||||
|
clickEventDeque.push(clickEvent2);
|
||||||
|
current.setClickEvent(clickEvent2);
|
||||||
|
parsed = true;
|
||||||
|
}
|
||||||
|
if (group_tag.matches("(?is)^suggest=.*")) {
|
||||||
|
group_value = group_value.replaceAll("(?is)\\[/?nobbcode\\]", "");
|
||||||
|
final ClickEvent clickEvent2 = new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, group_value);
|
||||||
|
clickEventDeque.push(clickEvent2);
|
||||||
|
current.setClickEvent(clickEvent2);
|
||||||
|
parsed = true;
|
||||||
|
}
|
||||||
|
if (group_tag.matches("(?is)^hover=.*$")) {
|
||||||
|
BaseComponent[] components2 = parse(group_value);
|
||||||
|
if (!hoverEventDeque.isEmpty()) {
|
||||||
|
final BaseComponent[] components3 = hoverEventDeque.getLast().getValue();
|
||||||
|
final BaseComponent[] components4 = new BaseComponent[components2.length + components3.length + 1];
|
||||||
|
int i = 0;
|
||||||
|
for (final BaseComponent baseComponent : components3) {
|
||||||
|
components4[i++] = baseComponent;
|
||||||
|
}
|
||||||
|
components4[i++] = new TextComponent("\n");
|
||||||
|
for (final BaseComponent baseComponent : components2) {
|
||||||
|
components4[i++] = baseComponent;
|
||||||
|
}
|
||||||
|
components2 = components4;
|
||||||
|
}
|
||||||
|
final HoverEvent hoverEvent = new HoverEvent(HoverEvent.Action.SHOW_TEXT, components2);
|
||||||
|
hoverEventDeque.push(hoverEvent);
|
||||||
|
current.setHoverEvent(hoverEvent);
|
||||||
|
parsed = true;
|
||||||
|
} else if (group_tag.matches("(?is)^/hover$")) {
|
||||||
|
if (!hoverEventDeque.isEmpty()) {
|
||||||
|
hoverEventDeque.pop();
|
||||||
|
}
|
||||||
|
if (hoverEventDeque.isEmpty()) {
|
||||||
|
current.setHoverEvent(null);
|
||||||
|
} else {
|
||||||
|
current.setHoverEvent(hoverEventDeque.peek());
|
||||||
|
}
|
||||||
|
parsed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (group_implicitTag != null && nobbcodeLevel <= 0) {
|
||||||
|
if (group_implicitTag.matches("(?is)^url$")) {
|
||||||
|
String url = group_implicitValue;
|
||||||
|
if (!url.startsWith("http")) {
|
||||||
|
url = "http://" + url;
|
||||||
|
}
|
||||||
|
final ClickEvent clickEvent = new ClickEvent(ClickEvent.Action.OPEN_URL, url);
|
||||||
|
clickEventDeque.push(clickEvent);
|
||||||
|
current.setClickEvent(clickEvent);
|
||||||
|
parsed = true;
|
||||||
|
}
|
||||||
|
if (group_implicitTag.matches("(?is)^command$")) {
|
||||||
|
final ClickEvent clickEvent2 = new ClickEvent(ClickEvent.Action.RUN_COMMAND, group_implicitValue);
|
||||||
|
clickEventDeque.push(clickEvent2);
|
||||||
|
current.setClickEvent(clickEvent2);
|
||||||
|
parsed = true;
|
||||||
|
}
|
||||||
|
if (group_implicitTag.matches("(?is)^suggest$")) {
|
||||||
|
final ClickEvent clickEvent2 = new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, group_implicitValue);
|
||||||
|
clickEventDeque.push(clickEvent2);
|
||||||
|
current.setClickEvent(clickEvent2);
|
||||||
|
parsed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (group_tag != null) {
|
||||||
|
if (group_tag.matches("(?is)^nocolor$")) {
|
||||||
|
++nocolorLevel;
|
||||||
|
parsed = true;
|
||||||
|
}
|
||||||
|
if (group_tag.matches("(?is)^/nocolor$")) {
|
||||||
|
--nocolorLevel;
|
||||||
|
parsed = true;
|
||||||
|
}
|
||||||
|
if (group_tag.matches("(?is)^nobbcode$")) {
|
||||||
|
++nobbcodeLevel;
|
||||||
|
parsed = true;
|
||||||
|
}
|
||||||
|
if (group_tag.matches("(?is)^/nobbcode$")) {
|
||||||
|
--nobbcodeLevel;
|
||||||
|
parsed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!parsed) {
|
||||||
|
final TextComponent component2 = new TextComponent(current);
|
||||||
|
current.setText(matcher.group(0));
|
||||||
|
components.add(current);
|
||||||
|
current = component2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final StringBuffer stringBuffer2 = new StringBuffer();
|
||||||
|
matcher.appendTail(stringBuffer2);
|
||||||
|
current.setText(stringBuffer2.toString());
|
||||||
|
components.add(current);
|
||||||
|
return components.toArray(new BaseComponent[components.size()]);
|
||||||
|
// return parseChatColor(components.toArray(new BaseComponent[components.size()]));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String stripBBCode(final String string) {
|
||||||
|
return strip_bbcode_pattern.matcher(string).replaceAll("");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package org.cn2b2t.core.utils;
|
||||||
|
|
||||||
|
public class ColorParser {
|
||||||
|
|
||||||
|
public static String parse(final String text) {
|
||||||
|
return text.replaceAll("&", "§").replace("§§", "&");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,144 @@
|
|||||||
|
package org.cn2b2t.core.utils;
|
||||||
|
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.enchantments.Enchantment;
|
||||||
|
import org.bukkit.inventory.ItemFlag;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
|
import org.bukkit.inventory.meta.SkullMeta;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class ItemStackFactory {
|
||||||
|
|
||||||
|
ItemStack item;
|
||||||
|
|
||||||
|
private ItemStackFactory() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemStackFactory(ItemStack is) {
|
||||||
|
this.item = is.clone();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemStackFactory(int type) {
|
||||||
|
this(Material.getMaterial(type), 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemStackFactory(Material type) {
|
||||||
|
this(type, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemStackFactory(Material type, int amount) {
|
||||||
|
this(type, amount, (short) 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemStackFactory(int type, int amount) {
|
||||||
|
this(Material.getMaterial(type), amount, (short) 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemStackFactory(Material type, int amount, short data) {
|
||||||
|
this.item = new ItemStack(type, amount, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemStackFactory(int type, int amount, short data) {
|
||||||
|
this.item = new ItemStack(type, amount, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemStackFactory(int type, int amount, int data) {
|
||||||
|
this(type, amount, (short) data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemStackFactory(Material type, int amount, int data) {
|
||||||
|
this(type, amount, (short) data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemStack toItemStack() {
|
||||||
|
return this.item;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemStackFactory setType(Material type) {
|
||||||
|
this.item.setType(type);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemStackFactory setDurability(int i) {
|
||||||
|
this.item.setDurability((short) i);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemStackFactory setAmount(int a) {
|
||||||
|
this.item.setAmount(a);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemStackFactory setDisplayName(String name) {
|
||||||
|
ItemMeta im = this.item.getItemMeta();
|
||||||
|
im.setDisplayName(name.replace("&", "§").replace("§§", "&&"));
|
||||||
|
this.item.setItemMeta(im);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemStackFactory setLore(List<String> lores) {
|
||||||
|
ItemMeta im = this.item.getItemMeta();
|
||||||
|
List<String> lores_ = new ArrayList();
|
||||||
|
lores.stream().forEach((lore) -> {
|
||||||
|
lores_.add(lore.replace("&", "§").replace("§§", "&&"));
|
||||||
|
});
|
||||||
|
im.setLore(lores_);
|
||||||
|
this.item.setItemMeta(im);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemStackFactory addLore(String name) {
|
||||||
|
ItemMeta im = this.item.getItemMeta();
|
||||||
|
List<String> lores;
|
||||||
|
if (im.hasLore()) {
|
||||||
|
lores = im.getLore();
|
||||||
|
} else {
|
||||||
|
lores = new ArrayList<>();
|
||||||
|
}
|
||||||
|
lores.add(name.replace("&", "§").replace("§§", "&&"));
|
||||||
|
im.setLore(lores);
|
||||||
|
this.item.setItemMeta(im);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemStackFactory addEnchant(Enchantment ench, int level, boolean ignoreLevelRestriction) {
|
||||||
|
ItemMeta im = this.item.getItemMeta();
|
||||||
|
im.addEnchant(ench, level, ignoreLevelRestriction);
|
||||||
|
this.item.setItemMeta(im);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemStackFactory removeEnchant(Enchantment ench) {
|
||||||
|
ItemMeta im = this.item.getItemMeta();
|
||||||
|
im.removeEnchant(ench);
|
||||||
|
this.item.setItemMeta(im);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemStackFactory addFlag(ItemFlag flag) {
|
||||||
|
ItemMeta im = this.item.getItemMeta();
|
||||||
|
im.addItemFlags(flag);
|
||||||
|
this.item.setItemMeta(im);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemStackFactory removeFlag(ItemFlag flag) {
|
||||||
|
ItemMeta im = this.item.getItemMeta();
|
||||||
|
im.removeItemFlags(flag);
|
||||||
|
this.item.setItemMeta(im);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemStackFactory setSkullOwner(String name) {
|
||||||
|
if (this.item.getType() == Material.SKULL_ITEM || this.item.getType() == Material.SKULL) {
|
||||||
|
SkullMeta im = (SkullMeta) this.item.getItemMeta();
|
||||||
|
im.setOwner(name);
|
||||||
|
this.item.setItemMeta(im);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
package org.cn2b2t.core.utils;
|
||||||
|
|
||||||
|
public class TimeFormater {
|
||||||
|
|
||||||
|
public static String timeLeft(long t) {
|
||||||
|
long left = t - System.currentTimeMillis();
|
||||||
|
if (left < 0) {
|
||||||
|
return "已过期";
|
||||||
|
} else if (left < 3600000) {
|
||||||
|
return "小于1时";
|
||||||
|
}
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
if (left > 31536000000L) {
|
||||||
|
sb.append(left / 31536000000L).append("年");
|
||||||
|
left %= 31536000000L;
|
||||||
|
}
|
||||||
|
if (left > 2592000000L) {
|
||||||
|
sb.append(left / 2592000000L).append("月");
|
||||||
|
left %= 2592000000L;
|
||||||
|
}
|
||||||
|
if (left > 86400000L) {
|
||||||
|
sb.append(left / 86400000L).append("天");
|
||||||
|
left %= 86400000L;
|
||||||
|
}
|
||||||
|
if (left > 3600000) {
|
||||||
|
sb.append(left / 3600000).append("时");
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getTime(long t) {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
t /= 1000;
|
||||||
|
if (t > 3600) {
|
||||||
|
sb.append(t / 3600).append("h");
|
||||||
|
}
|
||||||
|
if (t > 60) {
|
||||||
|
sb.append(t % 3600 / 60).append("min");
|
||||||
|
}
|
||||||
|
sb.append(t % 60).append("s");
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
Database:
|
||||||
|
host: 127.0.0.1
|
||||||
|
port: 3306
|
||||||
|
data: moci
|
||||||
|
user: moci
|
||||||
|
password: moci
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user