Revert "Release 6.0.5"

pull/56/head
wisdommen 2 years ago committed by GitHub
parent 2d65f54213
commit c472ca57ca
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -6,7 +6,7 @@
<groupId>com.ultikits.plugins</groupId>
<artifactId>BasicFunctions</artifactId>
<version>1.0.4</version>
<version>1.0.0</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
@ -18,7 +18,7 @@
<dependency>
<groupId>com.ultikits</groupId>
<artifactId>UltiTools-API</artifactId>
<version>6.0.5</version>
<version>6.0.3</version>
<scope>provided</scope>
</dependency>
<dependency>
@ -45,25 +45,9 @@
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.nametagedit</groupId>
<artifactId>nametagedit</artifactId>
<version>4.4.16</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.github.BlueMap-Minecraft</groupId>
<artifactId>BlueMapAPI</artifactId>
<version>v2.6.2</version>
<scope>provided</scope>
</dependency>
</dependencies>
<repositories>
<repository>
<id>upstream</id>
<url>https://ci.nametagedit.com/plugin/repository/everything/</url>
</repository>
<repository>
<id>spigotmc-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
@ -92,9 +76,9 @@
<configuration>
<name>BasicFunctions</name>
<identifyString>UltiTools-Basic-Functions</identifyString>
<shortDescription>开服必装所有的杂七杂八的小功能哦包括不限于TPA飞行模式更改白名单随机传送。</shortDescription>
<shortDescription>All basic functions of the UltiTools</shortDescription>
<accessKeyFile>access_key.txt</accessKeyFile>
<pluginFolder>F:\SpigotServers\Paper\1.20.4\plugins\UltiTools\plugins</pluginFolder>
<pluginFolder>F:\SpigotServers\Servers\1.20.4\plugins\UltiTools\plugins</pluginFolder>
</configuration>
</plugin>
</plugins>

@ -3,22 +3,25 @@ package com.ultikits.plugins;
import com.ultikits.plugins.commands.*;
import com.ultikits.plugins.config.BasicConfig;
import com.ultikits.plugins.config.JoinWelcomeConfig;
import com.ultikits.plugins.config.PlayerNameTagConfig;
import com.ultikits.plugins.config.WarpConfig;
import com.ultikits.plugins.listeners.*;
import com.ultikits.plugins.services.WarpService;
import com.ultikits.plugins.tasks.NamePrefixSuffixTask;
import com.ultikits.ultitools.UltiTools;
import com.ultikits.plugins.listeners.BackListener;
import com.ultikits.plugins.listeners.BanListener;
import com.ultikits.plugins.listeners.JoinWelcomeListener;
import com.ultikits.plugins.listeners.WhitelistListener;
import com.ultikits.ultitools.abstracts.AbstractConfigEntity;
import com.ultikits.ultitools.abstracts.UltiToolsPlugin;
import com.ultikits.ultitools.annotations.UltiToolsModule;
import de.bluecolored.bluemap.api.BlueMapAPI;
//import com.ultikits.ultitools.annotations.ContextEntry;
//import com.ultikits.ultitools.annotations.EnableAutoRegister;
import lombok.Getter;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
@UltiToolsModule
//@EnableAutoRegister(
// scanPackage = "com.ultikits.plugins",
// eventListener = false,
// cmdExecutor = false
//)
public class BasicFunctions extends UltiToolsPlugin {
@Getter
private static BasicFunctions instance;
@ -29,85 +32,74 @@ public class BasicFunctions extends UltiToolsPlugin {
}
@Override
public boolean registerSelf() {
public boolean registerSelf() throws IOException {
BasicConfig configEntity = getConfigManager().getConfigEntity(this, BasicConfig.class);
if (configEntity.isEnableHeal()) {
getCommandManager().register(this, HideCommands.class);
getCommandManager().register(new HealCommand(), "ultikits.tools.command.heal", i18n("指令治愈功能"), "heal", "h");
}
if (configEntity.isEnableGmChange()) {
getCommandManager().register(this, GMChangeCommand.class);
getCommandManager().register(new GMChangeCommand(), "ultikits.tools.command.gm", i18n("游戏模式切换功能"), "gm");
}
if (configEntity.isEnableBack()) {
getCommandManager().register(this, BackCommands.class);
getListenerManager().register(this, BackListener.class);
getCommandManager().register(new BackCommands(), "ultikits.tools.command.back", i18n("快捷返回功能"), "back");
getListenerManager().register(this, new BackListener());
}
if (configEntity.isEnableRandomTeleport()) {
getCommandManager().register(this, RandomTpCommands.class);
getCommandManager().register(new RandomTpCommands(), "ultikits.tools.command.wild", i18n("随机传送功能"), "wild");
}
if (configEntity.isEnableFly()) {
getCommandManager().register(this, FlyCommands.class);
getCommandManager().register(new FlyCommands(), "ultikits.tools.command.fly", i18n("飞行功能"), "fly");
}
if (configEntity.isEnableWhitelist()) {
getCommandManager().register(this, WhitelistCommands.class);
getListenerManager().register(this, WhitelistListener.class);
getCommandManager().register(new WhitelistCommands(), "ultikits.tools.whitelist", i18n("白名单功能"), "wl");
getListenerManager().register(this, new WhitelistListener());
}
if (configEntity.isEnableJoinWelcome()) {
getListenerManager().register(this, JoinWelcomeListener.class);
getListenerManager().register(this, new JoinWelcomeListener());
}
if (configEntity.isEnableTpa()) {
getCommandManager().register(this, TpaCommands.class);
getCommandManager().register(this, TpaHereCommands.class);
getCommandManager().register(new TpaCommands(), "ultikits.tools.command.tpa", i18n("传送请求功能"), "tpa");
getCommandManager().register(new TpaHereCommands(), "ultikits.tools.command.tphere", i18n("请求传送到此功能"), "tphere");
}
if (configEntity.isEnableSpeed()) {
getCommandManager().register(this, SpeedCommands.class);
getCommandManager().register(new SpeedCommands(), "ultikits.tools.command.speed", i18n("速度设置功能"), "speed");
}
if (configEntity.isEnableBan()) {
getCommandManager().register(this, BanCommands.class);
getListenerManager().register(this, BanListener.class);
}
if (configEntity.isEnableWarp()) {
getCommandManager().register(this, WarpCommands.class);
WarpConfig warpConfig = getConfigManager().getConfigEntity(this, WarpConfig.class);
if (warpConfig.isEnableBlueMap()) {
BlueMapAPI.onEnable(api -> {
WarpService warpService = getContext().getBean(WarpService.class);
warpService.initBlueMap();
});
}
}
if (configEntity.isEnableSpawn()) {
getCommandManager().register(this, SpawnCommands.class);
getCommandManager().register(this, SetSpawnCommands.class);
}
if (configEntity.isEnableLoreEditor()) {
getCommandManager().register(this, LoreCommands.class);
}
if (configEntity.isEnableHide()) {
getCommandManager().register(this, HideCommands.class);
getListenerManager().register(this, HideListener.class);
}
if (configEntity.isEnableTitle()) {
getListenerManager().register(this, PlayerNameTagListener.class);
int updateInterval = getConfig(PlayerNameTagConfig.class).getUpdateInterval();
new NamePrefixSuffixTask().runTaskTimer(UltiTools.getInstance(), 0, updateInterval);
}
if (configEntity.isEnableDeathPunishment()) {
getListenerManager().register(this, DeathListener.class);
getCommandManager().register(new BanCommands(), "ultikits.tools.command.uban", i18n("封禁功能"), "uban");
getListenerManager().register(this, new BanListener());
}
return true;
}
@Override
public void unregisterSelf() {
getCommandManager().unregister("heal");
getCommandManager().unregister("gm");
getCommandManager().unregister("back");
getCommandManager().unregister("wild");
getCommandManager().unregister("fly");
getCommandManager().unregister("wl");
getCommandManager().unregister("tpa");
getCommandManager().unregister("tphere");
getCommandManager().unregister("speed");
getListenerManager().unregisterAll(this);
}
@Override
public void reloadSelf() {
getConfigManager().reloadConfigs(this);
}
@Override
public List<String> supported() {
return Arrays.asList("zh", "en");
return super.supported();
}
@Override
public List<AbstractConfigEntity> getAllConfigs() {
return Arrays.asList(
new BasicConfig("config/config.yml"),
new JoinWelcomeConfig("config/join.yml"),
new PlayerNameTagConfig("config/title.yml")
new JoinWelcomeConfig("config/join.yml")
);
}
}

@ -2,33 +2,28 @@ package com.ultikits.plugins.commands;
import com.ultikits.plugins.BasicFunctions;
import com.ultikits.plugins.listeners.BackListener;
import com.ultikits.ultitools.abstracts.AbstractCommendExecutor;
import com.ultikits.ultitools.annotations.command.CmdExecutor;
import com.ultikits.ultitools.annotations.command.CmdMapping;
import com.ultikits.ultitools.annotations.command.CmdSender;
import com.ultikits.ultitools.annotations.command.CmdTarget;
import com.ultikits.ultitools.abstracts.AbstractPlayerCommandExecutor;
import org.bukkit.Location;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static com.ultikits.ultitools.utils.MessageUtils.warning;
@CmdTarget(CmdTarget.CmdTargetType.PLAYER)
@CmdExecutor(alias = {"back"}, manualRegister = true, permission = "ultikits.tools.command.back", description = "返回死亡地点")
public class BackCommands extends AbstractCommendExecutor {
@CmdMapping(format = "")
public void back(@CmdSender Player player) {
public class BackCommands extends AbstractPlayerCommandExecutor {
@Override
protected boolean onPlayerCommand(Command command, String[] strings, Player player) {
Location location = BackListener.getPlayerLastDeathLocation(player.getUniqueId());
if (location != null) {
player.teleport(location);
} else {
player.sendMessage(warning(BasicFunctions.getInstance().i18n("无法找到死亡地点!这可能是因为插件重载或者你还没死过哩。")));
}
return true;
}
@Override
protected void handleHelp(CommandSender sender) {
protected void sendHelpMessage(CommandSender sender) {
sender.sendMessage(BasicFunctions.getInstance().i18n("/back 返回死亡地点"));
}
}

@ -11,10 +11,11 @@ import org.springframework.beans.factory.annotation.Autowired;
@CmdTarget(CmdTarget.CmdTargetType.BOTH)
@CmdExecutor(permission = "ultikits.ban.command.all", description = "封禁功能", alias = {"uban"}, manualRegister = true)
@CmdExecutor(permission = "ultikits.ban.command.all", description = "Ban功能", alias = {"uban"})
public class BanCommands extends AbstractCommendExecutor {
@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
@Autowired
private BanPlayerService banPlayerService;
private BanPlayerService banPlayerService = new BanPlayerService();
@CmdMapping(format = "ban <player> <reason>")
public void banPlayer(@CmdSender CommandSender sender, @CmdParam("player") String player, @CmdParam("reason") String reason) {
@ -35,7 +36,6 @@ public class BanCommands extends AbstractCommendExecutor {
@Override
protected void handleHelp(CommandSender sender) {
sender.sendMessage(BasicFunctions.getInstance().i18n("§c/uban ban <player> <reason> §7封禁玩家"));
sender.sendMessage(BasicFunctions.getInstance().i18n("§c/uban unban <player> §7解封玩家"));
}
}

@ -1,30 +1,31 @@
package com.ultikits.plugins.commands;
import com.ultikits.plugins.BasicFunctions;
import com.ultikits.ultitools.abstracts.AbstractCommendExecutor;
import com.ultikits.ultitools.annotations.command.CmdExecutor;
import com.ultikits.ultitools.annotations.command.CmdMapping;
import com.ultikits.ultitools.annotations.command.CmdSender;
import com.ultikits.ultitools.annotations.command.CmdTarget;
import com.ultikits.ultitools.abstracts.AbstractPlayerCommandExecutor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static com.ultikits.ultitools.utils.MessageUtils.info;
import static com.ultikits.ultitools.utils.MessageUtils.warning;
@CmdTarget(CmdTarget.CmdTargetType.PLAYER)
@CmdExecutor(alias = {"fly"}, manualRegister = true, permission = "ultikits.tools.command.fly", description = "飞行功能")
public class FlyCommands extends AbstractCommendExecutor {
public class FlyCommands extends AbstractPlayerCommandExecutor {
@CmdMapping(format = "")
public void fly(@CmdSender Player player) {
@Override
protected boolean onPlayerCommand(Command command, String[] strings, Player player) {
if (!player.hasPermission("ultikits.tools.command.fly")) {
player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!")));
return true;
}
player.setAllowFlight(!player.getAllowFlight());
player.sendMessage(info(player.getAllowFlight() ?
BasicFunctions.getInstance().i18n("已打开飞行") :
BasicFunctions.getInstance().i18n("已关闭飞行")));
return true;
}
@Override
protected void handleHelp(CommandSender sender) {
protected void sendHelpMessage(CommandSender sender) {
sender.sendMessage(info(BasicFunctions.getInstance().i18n("用法:/fly")));
}
}

@ -1,46 +1,78 @@
package com.ultikits.plugins.commands;
import com.ultikits.plugins.BasicFunctions;
import com.ultikits.ultitools.abstracts.AbstractCommendExecutor;
import com.ultikits.ultitools.annotations.command.CmdExecutor;
import com.ultikits.ultitools.annotations.command.CmdMapping;
import com.ultikits.ultitools.annotations.command.CmdSender;
import com.ultikits.ultitools.annotations.command.CmdTarget;
import com.ultikits.ultitools.abstracts.AbstractTabExecutor;
import org.bukkit.ChatColor;
import org.bukkit.GameMode;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@CmdTarget(CmdTarget.CmdTargetType.PLAYER)
@CmdExecutor(alias = {"gm"}, manualRegister = true, permission = "ultikits.tools.command.gm", description = "游戏模式切换功能")
public class GMChangeCommand extends AbstractCommendExecutor {
import java.util.Arrays;
import java.util.List;
@CmdMapping(format = "0", permission = "ultikits.tools.command.gm.0")
public void changeGameMode0(@CmdSender Player player, String mode) {
player.setGameMode(GameMode.SURVIVAL);
player.sendMessage(ChatColor.YELLOW + String.format(BasicFunctions.getInstance().i18n("你的游戏模式已设置为%s"), BasicFunctions.getInstance().i18n("生存模式")));
}
@CmdMapping(format = "1", permission = "ultikits.tools.command.gm.1")
public void changeGameMode1(@CmdSender Player player, String mode) {
player.setGameMode(GameMode.CREATIVE);
player.sendMessage(ChatColor.YELLOW + String.format(BasicFunctions.getInstance().i18n("你的游戏模式已设置为%s"), BasicFunctions.getInstance().i18n("创造模式")));
}
import static com.ultikits.ultitools.utils.MessageUtils.warning;
@CmdMapping(format = "2", permission = "ultikits.tools.command.gm.2")
public void changeGameMode2(@CmdSender Player player, String mode) {
player.setGameMode(GameMode.ADVENTURE);
player.sendMessage(ChatColor.YELLOW + String.format(BasicFunctions.getInstance().i18n("你的游戏模式已设置为%s"), BasicFunctions.getInstance().i18n("冒险模式")));
public class GMChangeCommand extends AbstractTabExecutor {
@Override
protected boolean onPlayerCommand(Command command, String[] strings, Player player) {
if (player.hasPermission("ultikits.tools.command.gm.all")
|| player.hasPermission("ultikits.tools.command.gm.0")
|| player.hasPermission("ultikits.tools.command.gm.1")
|| player.hasPermission("ultikits.tools.command.gm.2")
|| player.hasPermission("ultikits.tools.command.gm.3")) {
switch (strings[0]) {
case "0":
if (player.hasPermission("ultikits.tools.command.gm.all")
|| player.hasPermission("ultikits.tools.command.gm.0")) {
player.setGameMode(GameMode.SURVIVAL);
player.sendMessage(ChatColor.YELLOW + String.format(BasicFunctions.getInstance().i18n("你的游戏模式已设置为%s"), BasicFunctions.getInstance().i18n("生存模式")));
return true;
}
player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!")));
return true;
case "1":
if (player.hasPermission("ultikits.tools.command.gm.all")
|| player.hasPermission("ultikits.tools.command.gm.1")) {
player.setGameMode(GameMode.CREATIVE);
player.sendMessage(ChatColor.YELLOW + String.format(BasicFunctions.getInstance().i18n("你的游戏模式已设置为%s"), BasicFunctions.getInstance().i18n("创造模式")));
return true;
}
player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!")));
return true;
case "2":
if (player.hasPermission("ultikits.tools.command.gm.all")
|| player.hasPermission("ultikits.tools.command.gm.2")) {
player.setGameMode(GameMode.ADVENTURE);
player.sendMessage(ChatColor.YELLOW + String.format(BasicFunctions.getInstance().i18n("你的游戏模式已设置为%s"), BasicFunctions.getInstance().i18n("冒险模式")));
return true;
}
player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!")));
return true;
case "3":
if (player.hasPermission("ultikits.tools.command.gm.all")
|| player.hasPermission("ultikits.tools.command.gm.3")) {
player.setGameMode(GameMode.SPECTATOR);
player.sendMessage(ChatColor.YELLOW + String.format(BasicFunctions.getInstance().i18n("你的游戏模式已设置为%s"), BasicFunctions.getInstance().i18n("旁观模式")));
return true;
}
player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!")));
return true;
default:
return false;
}
}
player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!")));
return true;
}
@CmdMapping(format = "3", permission = "ultikits.tools.command.gm.3")
public void changeGameMode3(@CmdSender Player player, String mode) {
player.setGameMode(GameMode.SPECTATOR);
player.sendMessage(ChatColor.YELLOW + String.format(BasicFunctions.getInstance().i18n("你的游戏模式已设置为%s"), BasicFunctions.getInstance().i18n("旁观模式")));
@Override
protected List<String> onPlayerTabComplete(Command command, String[] strings, Player player) {
return Arrays.asList("0", "1", "2", "3");
}
@Override
protected void handleHelp(CommandSender sender) {
protected void sendHelpMessage(CommandSender sender) {
sender.sendMessage(ChatColor.YELLOW + "/gm <0/1/2/3>");
}
}

@ -1,28 +1,30 @@
package com.ultikits.plugins.commands;
import com.ultikits.plugins.BasicFunctions;
import com.ultikits.ultitools.abstracts.AbstractCommendExecutor;
import com.ultikits.ultitools.annotations.command.CmdExecutor;
import com.ultikits.ultitools.annotations.command.CmdMapping;
import com.ultikits.ultitools.annotations.command.CmdSender;
import com.ultikits.ultitools.annotations.command.CmdTarget;
import com.ultikits.ultitools.abstracts.AbstractPlayerCommandExecutor;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@CmdTarget(CmdTarget.CmdTargetType.PLAYER)
@CmdExecutor(alias = {"heal", "h"}, manualRegister = true, permission = "ultikits.tools.command.heal", description = "指令治愈功能")
public class HealCommand extends AbstractCommendExecutor {
import static com.ultikits.ultitools.utils.MessageUtils.warning;
@CmdMapping(format = "")
public void heal(@CmdSender Player player) {
player.setHealth(player.getMaxHealth());
player.setFoodLevel(20);
player.sendMessage(ChatColor.YELLOW + BasicFunctions.getInstance().i18n("你已被治愈!"));
public class HealCommand extends AbstractPlayerCommandExecutor {
@Override
protected boolean onPlayerCommand(Command command, String[] strings, Player player) {
if (player.hasPermission("ultikits.tools.command.heal")) {
player.setHealth(player.getMaxHealth());
player.setFoodLevel(20);
player.sendMessage(ChatColor.YELLOW + BasicFunctions.getInstance().i18n("你已被治愈!"));
return true;
}
player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!")));
return true;
}
@Override
protected void handleHelp(CommandSender sender) {
sender.sendMessage(BasicFunctions.getInstance().i18n("§c/heal §7治愈自己"));
protected void sendHelpMessage(CommandSender sender) {
}
}

@ -1,69 +0,0 @@
package com.ultikits.plugins.commands;
import com.ultikits.plugins.BasicFunctions;
import com.ultikits.ultitools.UltiTools;
import com.ultikits.ultitools.abstracts.AbstractCommendExecutor;
import com.ultikits.ultitools.annotations.command.CmdExecutor;
import com.ultikits.ultitools.annotations.command.CmdMapping;
import com.ultikits.ultitools.annotations.command.CmdSender;
import com.ultikits.ultitools.annotations.command.CmdTarget;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import static com.ultikits.ultitools.utils.MessageUtils.info;
@CmdTarget(CmdTarget.CmdTargetType.PLAYER)
@CmdExecutor(alias = {"hide"}, manualRegister = true, permission = "ultikits.tools.command.hide", description = "隐身功能")
public class HideCommands extends AbstractCommendExecutor {
private static final List<UUID> hidePlayers = new ArrayList<>();
public static void removeHidePlayer(UUID uuid) {
hidePlayers.remove(uuid);
}
@CmdMapping(format = "")
public void hide(@CmdSender Player player) {
if (hidePlayers.contains(player.getUniqueId())) {
hidePlayers.remove(player.getUniqueId());
new BukkitRunnable() {
@Override
public void run() {
for (Player p : Bukkit.getOnlinePlayers()) {
if (p.getUniqueId().equals(player.getUniqueId())) {
continue;
}
p.showPlayer(UltiTools.getInstance(), player);
}
}
}.runTaskAsynchronously(UltiTools.getInstance());
player.sendMessage(info(BasicFunctions.getInstance().i18n("你已退出隐身")));
} else {
hidePlayers.add(player.getUniqueId());
new BukkitRunnable() {
@Override
public void run() {
for (Player p : Bukkit.getOnlinePlayers()) {
if (p.getUniqueId().equals(player.getUniqueId())) {
continue;
}
p.hidePlayer(UltiTools.getInstance(), player);
}
}
}.runTaskAsynchronously(UltiTools.getInstance());
player.sendMessage(info(BasicFunctions.getInstance().i18n("你已进入隐身")));
}
}
@Override
protected void handleHelp(CommandSender sender) {
sender.sendMessage(info(BasicFunctions.getInstance().i18n("/hide - 开启/关闭隐身")));
}
}

@ -1,152 +0,0 @@
package com.ultikits.plugins.commands;
import com.ultikits.plugins.BasicFunctions;
import com.ultikits.ultitools.abstracts.AbstractCommendExecutor;
import com.ultikits.ultitools.annotations.command.*;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull;
import java.util.*;
import static com.ultikits.ultitools.utils.MessageUtils.coloredMsg;
@CmdTarget(CmdTarget.CmdTargetType.PLAYER)
@CmdExecutor(alias = {"lore"}, manualRegister = true, permission = "ultikits.tools.command.lore", description = "物品Lore编辑功能")
public class LoreCommands extends AbstractCommendExecutor {
@CmdMapping(format = "add <lore...>")
public void addLore(@CmdSender Player player, @CmdParam("lore...") String[] lore) {
ItemStack itemStack = player.getInventory().getItemInMainHand();
if (itemStack.getType() == Material.AIR) {
player.sendMessage(ChatColor.RED + BasicFunctions.getInstance().i18n("请手持物品来修改Lore"));
return;
}
ItemMeta itemMeta = Objects.requireNonNull(itemStack.getItemMeta());
List<String> loreList = itemMeta.getLore();
if (loreList == null) {
loreList = new ArrayList<>();
}
String loreToAdd = String.join(" ", lore);
loreList.add(coloredMsg(loreToAdd));
itemMeta.setLore(loreList);
itemStack.setItemMeta(itemMeta);
player.getInventory().setItemInMainHand(itemStack);
player.sendMessage(ChatColor.GREEN + BasicFunctions.getInstance().i18n("物品Lore已修改"));
}
@CmdMapping(format = "delete <position>")
public void deleteLore(@CmdSender Player player, @CmdParam("position") int position) {
ItemStack itemStack = player.getInventory().getItemInMainHand();
if (itemStack.getType() == Material.AIR) {
player.sendMessage(ChatColor.RED + BasicFunctions.getInstance().i18n("请手持物品来修改Lore"));
return;
}
ItemMeta itemMeta = Objects.requireNonNull(itemStack.getItemMeta());
List<String> loreList = itemMeta.getLore();
if (loreList == null || loreList.isEmpty()) {
player.sendMessage(ChatColor.RED + BasicFunctions.getInstance().i18n("物品Lore为空"));
return;
}
if (position > loreList.size() || position < 1) {
player.sendMessage(ChatColor.RED + BasicFunctions.getInstance().i18n("Lore行数超出范围"));
return;
}
loreList.remove(position - 1);
itemMeta.setLore(loreList);
itemStack.setItemMeta(itemMeta);
player.getInventory().setItemInMainHand(itemStack);
player.sendMessage(ChatColor.GREEN + BasicFunctions.getInstance().i18n("物品Lore已修改"));
}
@CmdMapping(format = "edit <position> <lore...>")
public void editLore(@CmdSender Player player, @CmdParam("position") int position, @CmdParam("lore...") String[] lore) {
ItemStack itemStack = player.getInventory().getItemInMainHand();
if (itemStack.getType() == Material.AIR) {
player.sendMessage(ChatColor.RED + BasicFunctions.getInstance().i18n("请手持物品来修改Lore"));
return;
}
ItemMeta itemMeta = Objects.requireNonNull(itemStack.getItemMeta());
List<String> loreList = itemMeta.getLore();
if (loreList == null || loreList.isEmpty()) {
player.sendMessage(ChatColor.RED + BasicFunctions.getInstance().i18n("物品Lore为空"));
return;
}
if (position > loreList.size() || position < 1) {
player.sendMessage(ChatColor.RED + BasicFunctions.getInstance().i18n("Lore行数超出范围"));
return;
}
String loreToEdit = String.join(" ", lore);
if (position == 0) {
itemMeta.setDisplayName(coloredMsg(loreToEdit));
} else {
loreList.set(position - 1, coloredMsg(loreToEdit));
itemMeta.setLore(loreList);
}
itemStack.setItemMeta(itemMeta);
player.getInventory().setItemInMainHand(itemStack);
player.sendMessage(ChatColor.GREEN + BasicFunctions.getInstance().i18n("物品Lore已修改"));
}
@Override
protected List<String> suggest(Player player, String[] strings) {
switch (strings.length) {
case 1:
return Arrays.asList(
"add",
"delete",
"edit"
);
case 2:
case 3:
if (strings[0].equals("add")) {
return Collections.singletonList(BasicFunctions.getInstance().i18n("<内容>"));
}
ItemStack itemStack = player.getInventory().getItemInMainHand();
if (itemStack.getType() == Material.AIR) {
player.sendMessage(ChatColor.RED + BasicFunctions.getInstance().i18n("请手持物品来修改Lore"));
return Collections.emptyList();
}
ItemMeta itemMeta = Objects.requireNonNull(itemStack.getItemMeta());
List<String> lore = itemMeta.getLore();
if (lore == null || lore.isEmpty()) {
player.sendMessage(ChatColor.RED + BasicFunctions.getInstance().i18n("物品Lore为空"));
return Collections.emptyList();
}
List<String> list = new ArrayList<>();
for (int i = 1; i <= lore.size(); i++) {
list.add(i + ". " + lore.get(i - 1));
}
if ((strings[0].equals("edit") || strings[0].equals("delete")) && strings.length == 2) {
return list;
} else if (strings[0].equals("edit")) {
int position;
try {
position = Integer.parseInt(strings[1]);
} catch (NumberFormatException e) {
return Collections.singletonList(BasicFunctions.getInstance().i18n("<- 请输入对应的lore行数"));
}
if (position - 1 < lore.size() && position - 1 >= 0) {
return Collections.singletonList(lore.get(position - 1));
}
}
break;
default:
return Collections.emptyList();
}
return Collections.emptyList();
}
@Override
protected void handleHelp(CommandSender sender) {
sender.sendMessage(ChatColor.RED + "lore add <内容>" + ChatColor.GRAY + " - " + BasicFunctions.getInstance().i18n("添加Lore"));
sender.sendMessage(ChatColor.RED + "lore delete <行数>" + ChatColor.GRAY + " - " + BasicFunctions.getInstance().i18n("删除Lore"));
sender.sendMessage(ChatColor.RED + "lore edit <行数> <内容>" + ChatColor.GRAY + " - " + BasicFunctions.getInstance().i18n("编辑Lore"));
}
}

@ -2,16 +2,13 @@ package com.ultikits.plugins.commands;
import com.ultikits.plugins.BasicFunctions;
import com.ultikits.ultitools.UltiTools;
import com.ultikits.ultitools.abstracts.AbstractCommendExecutor;
import com.ultikits.ultitools.annotations.command.CmdExecutor;
import com.ultikits.ultitools.annotations.command.CmdMapping;
import com.ultikits.ultitools.annotations.command.CmdSender;
import com.ultikits.ultitools.annotations.command.CmdTarget;
import com.ultikits.ultitools.abstracts.AbstractPlayerCommandExecutor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
@ -21,12 +18,15 @@ import java.util.Random;
import static com.ultikits.ultitools.utils.MessageUtils.info;
import static com.ultikits.ultitools.utils.MessageUtils.warning;
@CmdTarget(CmdTarget.CmdTargetType.PLAYER)
@CmdExecutor(alias = {"wild"}, manualRegister = true, permission = "ultikits.tools.command.wild", description = "随机传送功能")
public class RandomTpCommands extends AbstractCommendExecutor {
public class RandomTpCommands extends AbstractPlayerCommandExecutor {
@CmdMapping(format = "")
public void wild(@CmdSender Player player) {
@Override
protected boolean onPlayerCommand(Command command, String[] strings, Player player) {
if (!player.isOp() && !player.hasPermission("ultikits.tools.command.wild")) {
player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!")));
return false;
}
World.Environment environment = player.getWorld().getEnvironment();
if (environment == World.Environment.NETHER || environment == World.Environment.THE_END) {
player.sendMessage(warning(BasicFunctions.getInstance().i18n("这个世界禁止使用随机传送!")));
@ -58,10 +58,12 @@ public class RandomTpCommands extends AbstractCommendExecutor {
}
}.runTask(UltiTools.getInstance());
}
return true;
}
@Override
protected void handleHelp(CommandSender sender) {
protected void sendHelpMessage(CommandSender sender) {
sender.sendMessage(info(BasicFunctions.getInstance().i18n("随机传送到一个安全的地方")));
}
}

@ -1,38 +0,0 @@
package com.ultikits.plugins.commands;
import com.ultikits.plugins.BasicFunctions;
import com.ultikits.ultitools.abstracts.AbstractCommendExecutor;
import com.ultikits.ultitools.annotations.command.CmdExecutor;
import com.ultikits.ultitools.annotations.command.CmdMapping;
import com.ultikits.ultitools.annotations.command.CmdSender;
import com.ultikits.ultitools.annotations.command.CmdTarget;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static com.ultikits.ultitools.utils.MessageUtils.error;
import static com.ultikits.ultitools.utils.MessageUtils.info;
@CmdTarget(CmdTarget.CmdTargetType.PLAYER)
@CmdExecutor(alias = {"setspawn"}, manualRegister = true, permission = "ultikits.tools.command.setspawn", description = "重生点功能")
public class SetSpawnCommands extends AbstractCommendExecutor {
@CmdMapping(format = "")
public void setSpawn(@CmdSender Player player) {
Location location = player.getLocation();
World world = location.getWorld();
if (world == null) {
player.sendMessage(error(BasicFunctions.getInstance().i18n("未找到世界!")));
return;
}
world.setSpawnLocation(location);
player.sendMessage(info(BasicFunctions.getInstance().i18n("已重设世界重生点!")));
}
@Override
protected void handleHelp(CommandSender sender) {
sender.sendMessage(ChatColor.RED + "setspawn" + ChatColor.GRAY + " - " + BasicFunctions.getInstance().i18n("设置世界重生点"));
}
}

@ -1,37 +0,0 @@
package com.ultikits.plugins.commands;
import com.ultikits.plugins.BasicFunctions;
import com.ultikits.ultitools.abstracts.AbstractCommendExecutor;
import com.ultikits.ultitools.annotations.command.CmdExecutor;
import com.ultikits.ultitools.annotations.command.CmdMapping;
import com.ultikits.ultitools.annotations.command.CmdSender;
import com.ultikits.ultitools.annotations.command.CmdTarget;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static com.ultikits.ultitools.utils.MessageUtils.error;
@CmdTarget(CmdTarget.CmdTargetType.PLAYER)
@CmdExecutor(alias = {"spawn"}, manualRegister = true, permission = "ultikits.tools.command.spawn", description = "重生点功能")
public class SpawnCommands extends AbstractCommendExecutor {
@CmdMapping(format = "")
public void spawn(@CmdSender Player player) {
if (player.getLocation().getWorld() == null) {
player.sendMessage(error(BasicFunctions.getInstance().i18n("未找到世界!")));
return;
}
if (player.getLocation().getWorld().getSpawnLocation().equals(new Location(player.getLocation().getWorld(), 0, 0, 0, 0, 0))) {
player.sendMessage(error(BasicFunctions.getInstance().i18n("这个世界没有重生点!")));
return;
}
player.teleport(player.getLocation().getWorld().getSpawnLocation());
}
@Override
protected void handleHelp(CommandSender sender) {
sender.sendMessage(ChatColor.RED + "spawn" + ChatColor.GRAY + " - " + BasicFunctions.getInstance().i18n("传送到世界重生点"));
}
}

@ -1,35 +1,53 @@
package com.ultikits.plugins.commands;
import com.ultikits.plugins.BasicFunctions;
import com.ultikits.ultitools.abstracts.AbstractCommendExecutor;
import com.ultikits.ultitools.annotations.command.*;
import com.ultikits.ultitools.abstracts.AbstractTabExecutor;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Arrays;
import java.util.List;
import static com.ultikits.ultitools.utils.MessageUtils.info;
import static com.ultikits.ultitools.utils.MessageUtils.warning;
@CmdTarget(CmdTarget.CmdTargetType.PLAYER)
@CmdExecutor(alias = {"speed"}, manualRegister = true, permission = "ultikits.tools.command.speed", description = "速度设置功能")
public class SpeedCommands extends AbstractCommendExecutor {
public class SpeedCommands extends AbstractTabExecutor {
List<String> speeds = Arrays.asList("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10");
@CmdMapping(format = "<speed>")
public void setSpeeds(@CmdSender Player player, @CmdParam("speed") String speed) {
if (!speeds.contains(speed)) {
return;
@Override
protected boolean onPlayerCommand(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) {
if (player.hasPermission("ultikits.tools.command.speed")) {
if (!speeds.contains(strings[0])) {
return false;
}
player.setWalkSpeed(Float.parseFloat(strings[0]) / 10);
player.setFlySpeed(Float.parseFloat(strings[0]) / 10);
player.sendMessage(ChatColor.YELLOW + String.format(BasicFunctions.getInstance().i18n("行走/飞行速度已设置为%s默认速度为2"), strings[0]));
return true;
}
player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!")));
return true;
}
@Nullable
@Override
protected List<String> onPlayerTabComplete(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) {
if (!player.hasPermission("ultikits.tools.commands.speed")) {
return null;
}
if (strings.length == 1) {
return speeds;
}
player.setWalkSpeed(Float.parseFloat(speed) / 10);
player.setFlySpeed(Float.parseFloat(speed) / 10);
player.sendMessage(ChatColor.YELLOW + String.format(BasicFunctions.getInstance().i18n("行走/飞行速度已设置为%s默认速度为2"), speed));
return null;
}
@Override
protected void handleHelp(CommandSender sender) {
protected void sendHelpMessage(CommandSender sender) {
sender.sendMessage(info(BasicFunctions.getInstance().i18n("/speed <0-10> 设置速度")));
}
}

@ -2,94 +2,106 @@ package com.ultikits.plugins.commands;
import com.ultikits.plugins.BasicFunctions;
import com.ultikits.plugins.tasks.TpTimerTask;
import com.ultikits.ultitools.abstracts.AbstractCommendExecutor;
import com.ultikits.ultitools.annotations.command.*;
import com.ultikits.ultitools.abstracts.AbstractTabExecutor;
import com.ultikits.ultitools.utils.MessageUtils;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.event.ClickEvent;
import net.kyori.adventure.text.format.TextColor;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
import static com.ultikits.ultitools.utils.MessageUtils.info;
import static com.ultikits.ultitools.utils.MessageUtils.warning;
@CmdTarget(CmdTarget.CmdTargetType.PLAYER)
@CmdExecutor(alias = {"tpa"}, manualRegister = true, permission = "ultikits.tools.command.tpa", description = "传送请求功能")
public class TpaCommands extends AbstractCommendExecutor {
@CmdMapping(format = "accept")
public void acceptTpa(@CmdSender Player player) {
Player teleporter = TpTimerTask.tpTemp.get(player);
if (teleporter == null) {
player.sendMessage(warning(BasicFunctions.getInstance().i18n("并没有玩家给你发送传送请求!")));
return;
}
TpTimerTask.tpTemp.put(player, null);
TpTimerTask.tpTimer.put(player, 0);
teleporter.teleport(player.getLocation());
teleporter.sendMessage(info(BasicFunctions.getInstance().i18n("传送成功!")));
}
public class TpaCommands extends AbstractTabExecutor {
@CmdMapping(format = "reject")
public void rejectTpa(@CmdSender Player player) {
Player teleporter = TpTimerTask.tpTemp.get(player);
if (teleporter == null) {
player.sendMessage(warning(BasicFunctions.getInstance().i18n("并没有玩家给你发送传送请求!")));
return;
}
teleporter.sendMessage(warning(BasicFunctions.getInstance().i18n("对方拒绝了你的传送请求 :(")));
player.sendMessage(info(BasicFunctions.getInstance().i18n("已拒绝!")));
TpTimerTask.tpTemp.put(player, null);
TpTimerTask.tpTimer.put(player, 0);
}
@CmdMapping(format = "<player>")
public void tpa(@CmdSender Player player, @CmdParam("player") String targetName) {
Player target = Bukkit.getPlayerExact(targetName);
if (target == null) {
player.sendMessage(warning(BasicFunctions.getInstance().i18n("未找到目标,无法请求传送!")));
return;
@Override
protected boolean onPlayerCommand(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) {
if (!player.isOp() && !player.hasPermission("ultikits.tools.command.tpa")) {
player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!")));
return false;
}
if (TpTimerTask.tpTemp.get(target) != null) {
player.sendMessage(warning(BasicFunctions.getInstance().i18n("对方正在处理另一个传送请求!")));
return;
switch (strings.length) {
case 1:
switch (strings[0]) {
case "accept":
Player teleporter = TpTimerTask.tpTemp.get(player);
if (teleporter == null) {
player.sendMessage(warning(BasicFunctions.getInstance().i18n("并没有玩家给你发送传送请求!")));
return true;
}
TpTimerTask.tpTemp.put(player, null);
TpTimerTask.tpTimer.put(player, 0);
teleporter.teleport(player.getLocation());
teleporter.sendMessage(info(BasicFunctions.getInstance().i18n("传送成功!")));
return true;
case "reject":
Player teleporter2 = TpTimerTask.tpTemp.get(player);
if (teleporter2 == null) {
player.sendMessage(warning(BasicFunctions.getInstance().i18n("并没有玩家给你发送传送请求!")));
return true;
}
teleporter2.sendMessage(warning(BasicFunctions.getInstance().i18n("对方拒绝了你的传送请求 :(")));
player.sendMessage(info(BasicFunctions.getInstance().i18n("已拒绝!")));
TpTimerTask.tpTemp.put(player, null);
TpTimerTask.tpTimer.put(player, 0);
return true;
default:
Player target = Bukkit.getPlayerExact(strings[0]);
if (target == null) {
player.sendMessage(warning(BasicFunctions.getInstance().i18n("未找到目标,无法请求传送!")));
return true;
}
if (TpTimerTask.tpTemp.get(target) != null) {
player.sendMessage(warning(BasicFunctions.getInstance().i18n("对方正在处理另一个传送请求!")));
return true;
}
TpTimerTask.tpTemp.put(target, player);
TpTimerTask.tpTimer.put(target, 20);
player.sendMessage(info(String.format(BasicFunctions.getInstance().i18n("你已向%s发送TP请求"), target.getName())));
target.sendMessage(info(String.format(BasicFunctions.getInstance().i18n("%s请求传送到您的位置"), player.getName())));
TextComponent ask = Component
.text(BasicFunctions.getInstance().i18n("[同意]"))
.color(TextColor.color(0x00FF00))
.hoverEvent(Component.text(BasicFunctions.getInstance().i18n("点击同意传送")))
.clickEvent(ClickEvent.runCommand("/tpa accept"))
.append(Component.text(" "))
.append(
Component
.text(BasicFunctions.getInstance().i18n("[拒绝]"))
.color(TextColor.color(0xFF0000))
.hoverEvent(Component.text(BasicFunctions.getInstance().i18n("点击拒绝传送")))
.clickEvent(ClickEvent.runCommand("/tpa reject"))
);
MessageUtils.sendMessage(target, ask);
return true;
}
default:
return false;
}
TpTimerTask.tpTemp.put(target, player);
TpTimerTask.tpTimer.put(target, 20);
player.sendMessage(info(String.format(BasicFunctions.getInstance().i18n("你已向%s发送TP请求"), target.getName())));
target.sendMessage(info(String.format(BasicFunctions.getInstance().i18n("%s请求传送到您的位置"), player.getName())));
TextComponent ask = Component
.text(BasicFunctions.getInstance().i18n("[同意]"))
.color(TextColor.color(0x00FF00))
.hoverEvent(Component.text(BasicFunctions.getInstance().i18n("点击同意传送")))
.clickEvent(ClickEvent.runCommand("/tpa accept"))
.append(Component.text(" "))
.append(
Component
.text(BasicFunctions.getInstance().i18n("[拒绝]"))
.color(TextColor.color(0xFF0000))
.hoverEvent(Component.text(BasicFunctions.getInstance().i18n("点击拒绝传送")))
.clickEvent(ClickEvent.runCommand("/tpa reject"))
);
MessageUtils.sendMessage(target, ask);
}
@Override
protected List<String> suggest(Player player, String[] strings) {
protected @Nullable
List<String> onPlayerTabComplete(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) {
return TpaHereCommands.getTpTabList(strings);
}
@Override
protected void handleHelp(CommandSender sender) {
protected void sendHelpMessage(CommandSender sender) {
sender.sendMessage(info(BasicFunctions.getInstance().i18n("----传送请求帮助----")));
sender.sendMessage(info(BasicFunctions.getInstance().i18n("/tpa [玩家名] 向玩家发送传送请求")));
sender.sendMessage(info(BasicFunctions.getInstance().i18n("/tpa accept 接受传送请求")));
sender.sendMessage(info(BasicFunctions.getInstance().i18n("/tpa reject 拒绝传送请求")));
}
}

@ -2,14 +2,14 @@ package com.ultikits.plugins.commands;
import com.ultikits.plugins.BasicFunctions;
import com.ultikits.plugins.tasks.TpTimerTask;
import com.ultikits.ultitools.abstracts.AbstractCommendExecutor;
import com.ultikits.ultitools.annotations.command.*;
import com.ultikits.ultitools.abstracts.AbstractTabExecutor;
import com.ultikits.ultitools.utils.MessageUtils;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.event.ClickEvent;
import net.kyori.adventure.text.format.TextColor;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
@ -22,9 +22,7 @@ import static com.ultikits.ultitools.utils.MessageUtils.info;
import static com.ultikits.ultitools.utils.MessageUtils.warning;
@CmdTarget(CmdTarget.CmdTargetType.PLAYER)
@CmdExecutor(alias = {"tphere"}, manualRegister = true, permission = "ultikits.tools.command.tphere", description = "请求传送到此功能")
public class TpaHereCommands extends AbstractCommendExecutor {
public class TpaHereCommands extends AbstractTabExecutor {
@Nullable
public static List<String> getTpTabList(@NotNull String[] strings) {
List<String> tabCommands = new ArrayList<>();
@ -39,70 +37,74 @@ public class TpaHereCommands extends AbstractCommendExecutor {
return null;
}
@CmdMapping(format = "accept")
public void acceptTpa(@CmdSender Player player) {
Player teleporter = TpTimerTask.tphereTemp.get(player);
if (teleporter == null) {
player.sendMessage(warning(BasicFunctions.getInstance().i18n("并没有玩家给你发送传送请求!")));
return;
}
TpTimerTask.tphereTemp.put(player, null);
TpTimerTask.tphereTimer.put(player, 0);
player.teleport(teleporter.getLocation());
teleporter.sendMessage(info(BasicFunctions.getInstance().i18n("传送成功!")));
}
@CmdMapping(format = "reject")
public void rejectTpa(@CmdSender Player player) {
Player teleporter = TpTimerTask.tphereTemp.get(player);
if (teleporter == null) {
player.sendMessage(warning(BasicFunctions.getInstance().i18n("并没有玩家给你发送传送请求!")));
return;
}
teleporter.sendMessage(warning(BasicFunctions.getInstance().i18n("对方拒绝了你的传送请求 :(")));
player.sendMessage(info(BasicFunctions.getInstance().i18n("已拒绝!")));
TpTimerTask.tphereTemp.put(player, null);
TpTimerTask.tphereTimer.put(player, 0);
}
@CmdMapping(format = "<player>")
public void tpa(@CmdSender Player player, @CmdParam("player") String targetName) {
Player target = Bukkit.getPlayerExact(targetName);
if (target == null) {
player.sendMessage(warning(BasicFunctions.getInstance().i18n("未找到目标,无法请求传送!")));
return;
@Override
protected boolean onPlayerCommand(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) {
if (!player.isOp() && !player.hasPermission("ultikits.tools.command.tphere")) {
player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!")));
return false;
}
if (TpTimerTask.tphereTemp.get(target) != null) {
player.sendMessage(warning(BasicFunctions.getInstance().i18n("对方正在处理另一个传送请求!")));
return;
if (strings.length == 1) {
switch (strings[0]) {
case "accept":
Player teleporter = TpTimerTask.tphereTemp.get(player);
if (teleporter == null) {
player.sendMessage(warning(BasicFunctions.getInstance().i18n("并没有玩家给你发送传送请求!")));
return true;
}
TpTimerTask.tphereTemp.put(player, null);
TpTimerTask.tphereTimer.put(player, 0);
player.teleport(teleporter.getLocation());
teleporter.sendMessage(info(BasicFunctions.getInstance().i18n("传送成功!")));
return true;
case "reject":
Player teleporter2 = TpTimerTask.tphereTemp.get(player);
if (teleporter2 == null) {
player.sendMessage(warning(BasicFunctions.getInstance().i18n("并没有玩家给你发送传送请求!")));
return true;
}
teleporter2.sendMessage(warning(BasicFunctions.getInstance().i18n("对方拒绝了你的传送请求 :(")));
player.sendMessage(info(BasicFunctions.getInstance().i18n("已拒绝!")));
TpTimerTask.tphereTemp.put(player, null);
TpTimerTask.tphereTimer.put(player, 0);
return true;
default:
Player target = Bukkit.getPlayerExact(strings[0]);
if (target == null) {
player.sendMessage(warning(BasicFunctions.getInstance().i18n("未找到目标,无法请求传送!")));
return true;
}
TpTimerTask.tphereTemp.put(target, player);
TpTimerTask.tphereTimer.put(target, 20);
player.sendMessage(info(String.format(BasicFunctions.getInstance().i18n("你已向%s发送TP请求"), target.getName())));
target.sendMessage(info(String.format(BasicFunctions.getInstance().i18n("%s请求您传送至他的位置"), player.getName())));
TextComponent ask = Component
.text(BasicFunctions.getInstance().i18n("[同意]"))
.color(TextColor.color(0x00FF00))
.hoverEvent(Component.text(BasicFunctions.getInstance().i18n("点击同意传送")))
.clickEvent(ClickEvent.runCommand("/tphere accept"))
.append(Component.text(" "))
.append(
Component
.text(BasicFunctions.getInstance().i18n("[拒绝]"))
.color(TextColor.color(0xFF0000))
.hoverEvent(Component.text(BasicFunctions.getInstance().i18n("点击拒绝传送")))
.clickEvent(ClickEvent.runCommand("/tphere reject"))
);
MessageUtils.sendMessage(target, ask);
return true;
}
}
TpTimerTask.tphereTemp.put(target, player);
TpTimerTask.tphereTimer.put(target, 20);
player.sendMessage(info(String.format(BasicFunctions.getInstance().i18n("你已向%s发送TP请求"), target.getName())));
target.sendMessage(info(String.format(BasicFunctions.getInstance().i18n("%s请求您传送至他的位置"), player.getName())));
TextComponent ask = Component
.text(BasicFunctions.getInstance().i18n("[同意]"))
.color(TextColor.color(0x00FF00))
.hoverEvent(Component.text(BasicFunctions.getInstance().i18n("点击同意传送")))
.clickEvent(ClickEvent.runCommand("/tphere accept"))
.append(Component.text(" "))
.append(
Component
.text(BasicFunctions.getInstance().i18n("[拒绝]"))
.color(TextColor.color(0xFF0000))
.hoverEvent(Component.text(BasicFunctions.getInstance().i18n("点击拒绝传送")))
.clickEvent(ClickEvent.runCommand("/tphere reject"))
);
MessageUtils.sendMessage(target, ask);
return false;
}
@Nullable
@Override
protected List<String> suggest(Player player, String[] strings) {
protected List<String> onPlayerTabComplete(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) {
return getTpTabList(strings);
}
@Override
protected void handleHelp(CommandSender sender) {
protected void sendHelpMessage(CommandSender sender) {
sender.sendMessage(info(BasicFunctions.getInstance().i18n("----传送至此请求帮助----")));
sender.sendMessage(info(BasicFunctions.getInstance().i18n("/tphere accept 接受传送请求")));
sender.sendMessage(info(BasicFunctions.getInstance().i18n("/tphere reject 拒绝传送请求")));

@ -1,96 +0,0 @@
package com.ultikits.plugins.commands;
import com.ultikits.plugins.BasicFunctions;
import com.ultikits.plugins.data.WarpData;
import com.ultikits.plugins.guis.WarpGui;
import com.ultikits.plugins.services.WarpService;
import com.ultikits.ultitools.abstracts.AbstractCommendExecutor;
import com.ultikits.ultitools.annotations.command.*;
import com.ultikits.ultitools.services.TeleportService;
import org.bukkit.Location;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.ArrayList;
import java.util.List;
@CmdTarget(CmdTarget.CmdTargetType.PLAYER)
@CmdExecutor(alias = {"warp"}, manualRegister = true, permission = "ultikits.tools.command.warp", description = "传送点功能")
public class WarpCommands extends AbstractCommendExecutor {
@Autowired
private WarpService warpService;
@CmdMapping(format = "list")
public void listWarps(@CmdSender Player player) {
WarpGui warpGui = new WarpGui(player);
warpGui.open();
}
@CmdMapping(format = "tp <name>")
public void tpWarp(@CmdSender Player player, @CmdParam("name") String name) {
Location warpLocation = warpService.getWarpLocation(name);
player.sendMessage(String.format(BasicFunctions.getInstance().i18n("§a已传送至传送点 %s"), name));
TeleportService teleportService = BasicFunctions.getInstance().getContext().getBean(TeleportService.class);
teleportService.delayTeleport(player, warpLocation, 3);
}
@CmdMapping(format = "add <name>", requireOp = true)
public void addWarp(@CmdSender Player player, @CmdParam("name") String name) {
warpService.addWarp(name, player.getLocation());
player.sendMessage(String.format(BasicFunctions.getInstance().i18n("§a已添加传送点 %s"), name));
}
@CmdMapping(format = "remove <name>", requireOp = true)
public void removeWarp(@CmdSender Player player, @CmdParam("name") String name) {
warpService.removeWarp(name);
player.sendMessage(String.format(BasicFunctions.getInstance().i18n("§a已删除传送点 %s"), name));
}
@Override
protected List<String> suggest(Player player, String[] strings) {
ArrayList<String> list = new ArrayList<>();
switch (strings.length) {
case 1:
list.add("list");
list.add("tp");
if (player.isOp()) {
list.add("add");
list.add("remove");
}
return list;
case 2:
switch (strings[0]) {
case "remove":
if (player.isOp()) {
List<WarpData> allWarps = warpService.getAllWarps();
for (WarpData warpData : allWarps) {
list.add(warpData.getName());
}
return list;
}
return list;
case "tp":
List<WarpData> allWarps = warpService.getAllWarps();
for (WarpData warpData : allWarps) {
list.add(warpData.getName());
}
return list;
default:
return list;
}
default:
return list;
}
}
@Override
protected void handleHelp(CommandSender sender) {
sender.sendMessage(BasicFunctions.getInstance().i18n("§a/warp list §7- §e查看所有传送点"));
sender.sendMessage(BasicFunctions.getInstance().i18n("§a/warp tp <name> §7- §e传送至传送点"));
if (sender.isOp()) {
sender.sendMessage(BasicFunctions.getInstance().i18n("§a/warp add <name> §7- §e添加传送点"));
sender.sendMessage(BasicFunctions.getInstance().i18n("§a/warp remove <name> §7- §e删除传送点"));
}
}
}

@ -3,29 +3,39 @@ package com.ultikits.plugins.commands;
import com.ultikits.plugins.BasicFunctions;
import com.ultikits.plugins.data.WhiteListData;
import com.ultikits.plugins.services.WhiteListService;
import com.ultikits.ultitools.abstracts.AbstractCommendExecutor;
import com.ultikits.ultitools.annotations.command.CmdExecutor;
import com.ultikits.ultitools.annotations.command.CmdMapping;
import com.ultikits.ultitools.annotations.command.CmdSender;
import com.ultikits.ultitools.annotations.command.CmdTarget;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import org.bukkit.entity.Player;
import org.springframework.beans.factory.annotation.Autowired;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
@CmdTarget(CmdTarget.CmdTargetType.BOTH)
@CmdExecutor(alias = {"wl"}, manualRegister = true, permission = "ultikits.tools.command.whitelist", description = "白名单功能")
public class WhitelistCommands extends AbstractCommendExecutor {
@Autowired
private WhiteListService whiteListService;
import static com.ultikits.ultitools.utils.MessageUtils.warning;
public class WhitelistCommands implements TabExecutor {
private final WhiteListService whiteListService = new WhiteListService();
@Override
protected void handleHelp(CommandSender sender) {
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
if (sender instanceof Player) {
Player player = (Player) sender;
if (player.hasPermission("ultikits.tools.admin") || player.hasPermission("ultikits.tools.whitelist")) {
return whiteListCommands(sender, command, args);
} else {
player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!")));
return true;
}
} else {
return whiteListCommands(sender, command, args);
}
}
private void sendHelpMessage(CommandSender sender) {
sender.sendMessage(ChatColor.YELLOW + BasicFunctions.getInstance().i18n("----白名单系统帮助----"));
sender.sendMessage(ChatColor.AQUA + BasicFunctions.getInstance().i18n("/wl help 白名单帮助"));
sender.sendMessage(ChatColor.AQUA + BasicFunctions.getInstance().i18n("/wl list 白名单列表"));
@ -33,48 +43,56 @@ public class WhitelistCommands extends AbstractCommendExecutor {
sender.sendMessage(ChatColor.AQUA + BasicFunctions.getInstance().i18n("/wl remove [玩家名] 将玩家移出白名单"));
}
@CmdMapping(format = "help", requireOp = true)
public void help(@CmdSender CommandSender sender) {
handleHelp(sender);
}
@CmdMapping(format = "list", requireOp = true)
public void list(@CmdSender CommandSender sender) {
List<WhiteListData> whitelist = whiteListService.getAllWhiteList();
sender.sendMessage(ChatColor.YELLOW + BasicFunctions.getInstance().i18n("白名单列表有:"));
for (WhiteListData each : whitelist) {
sender.sendMessage(String.format("- %s", each.getName()));
private boolean whiteListCommands(CommandSender sender, Command command, String[] args) {
if ("wl".equalsIgnoreCase(command.getName())) {
if (args.length == 1) {
switch (args[0]) {
case "help":
sendHelpMessage(sender);
return true;
case "list":
List<WhiteListData> whitelist = whiteListService.getAllWhiteList();
sender.sendMessage(ChatColor.YELLOW + BasicFunctions.getInstance().i18n("白名单列表有:"));
for (WhiteListData each : whitelist) {
sender.sendMessage(String.format("- %s", each.getName()));
}
return true;
default:
return false;
}
} else if (args.length == 2) {
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(args[1]);
if ("add".equalsIgnoreCase(args[0])) {
whiteListService.addWhiteList(String.valueOf(offlinePlayer.getUniqueId()), args[1]);
sender.sendMessage(ChatColor.RED + String.format(BasicFunctions.getInstance().i18n("已将%s加入白名单"), args[1]));
return true;
} else if ("remove".equalsIgnoreCase(args[0])) {
whiteListService.removeWhiteList(String.valueOf(offlinePlayer.getUniqueId()));
sender.sendMessage(ChatColor.RED + String.format(BasicFunctions.getInstance().i18n("已将%s移出白名单"), args[1]));
return true;
}
}
}
}
@CmdMapping(format = "add <name>", requireOp = true)
public void add(@CmdSender CommandSender sender, String name) {
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(name);
whiteListService.addWhiteList(String.valueOf(offlinePlayer.getUniqueId()), name);
sender.sendMessage(ChatColor.RED + String.format(BasicFunctions.getInstance().i18n("已将%s加入白名单"), name));
}
@CmdMapping(format = "remove <name>", requireOp = true)
public void remove(@CmdSender CommandSender sender, String name) {
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(name);
whiteListService.removeWhiteList(String.valueOf(offlinePlayer.getUniqueId()));
sender.sendMessage(ChatColor.RED + String.format(BasicFunctions.getInstance().i18n("已将%s移出白名单"), name));
return false;
}
@Override
protected List<String> suggest(Player player, String[] strings) {
if (player.isOp() || player.hasPermission("ultikits.tools.whitelist")) {
if (strings.length == 1) {
List<String> tabCommands = new ArrayList<>();
tabCommands.add("help");
tabCommands.add("list");
tabCommands.add("add");
tabCommands.add("remove");
return tabCommands;
} else if (strings.length == 2) {
List<String> tabCommands = new ArrayList<>();
tabCommands.add(BasicFunctions.getInstance().i18n("[玩家名]"));
return tabCommands;
public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) {
if (sender instanceof Player) {
Player player = (Player) sender;
if (player.isOp() || player.hasPermission("ultikits.tools.whitelist")) {
if (args.length == 1) {
List<String> tabCommands = new ArrayList<>();
tabCommands.add("help");
tabCommands.add("list");
tabCommands.add("add");
tabCommands.add("remove");
return tabCommands;
} else if (args.length == 2) {
List<String> tabCommands = new ArrayList<>();
tabCommands.add(BasicFunctions.getInstance().i18n("[玩家名]"));
return tabCommands;
}
}
}
return null;

@ -30,18 +30,6 @@ public class BasicConfig extends AbstractConfigEntity {
private boolean enableSpeed = true;
@ConfigEntry(path = "enableBan", comment = "是否启用封禁")
private boolean enableBan = true;
@ConfigEntry(path = "enableBan", comment = "是否启用传送点")
private boolean enableWarp = true;
@ConfigEntry(path = "enableSpawn", comment = "是否启用重生点设置")
private boolean enableSpawn = true;
@ConfigEntry(path = "enableLoreEditor", comment = "是否启用Lore编辑器")
private boolean enableLoreEditor = true;
@ConfigEntry(path = "enableHide", comment = "是否启用隐身功能")
private boolean enableHide = true;
@ConfigEntry(path = "enableTitle", comment = "是否启用头顶显示功能")
private boolean enableTitle = true;
@ConfigEntry(path = "enableDeathPunishment", comment = "是否启用死亡惩罚功能")
private boolean enableDeathPunishment = true;
public BasicConfig(String configFilePath) {
super(configFilePath);

@ -1,41 +0,0 @@
package com.ultikits.plugins.config;
import com.ultikits.ultitools.abstracts.AbstractConfigEntity;
import com.ultikits.ultitools.annotations.ConfigEntity;
import com.ultikits.ultitools.annotations.ConfigEntry;
import lombok.Getter;
import lombok.Setter;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@Getter
@Setter
@ConfigEntity("config/death.yml")
public class DeathPunishmentConfig extends AbstractConfigEntity {
@ConfigEntry(path = "enable_item_drop", comment = "是否开启物品掉落")
private boolean enableItemDrop = false;
@ConfigEntry(path = "enable_money_drop", comment = "是否开启金币掉落")
private boolean enableMoneyDrop = true;
@ConfigEntry(path = "enable_punish_commands", comment = "是否开启死亡执行后台命令")
private boolean enablePunishCommands = true;
@ConfigEntry(path = "money_dropped_ondeath", comment = "死亡后掉落的金币数")
private int moneyDropOnDeath = 100;
@ConfigEntry(path = "item_dropped_ondeath", comment = "死亡后随机掉落的物品数")
private int itemDropOnDeath = 3;
@ConfigEntry(path = "punish_commands", comment = "死亡后后台执行的指令({PLAYER}指代玩家名占位符)")
private List<String> punishCommands = Collections.emptyList();
@ConfigEntry(path = "worlds_enabled_item_drop", comment = "开启死亡随机物品掉落的世界")
private List<String> worldEnabledItemDrop = Arrays.asList("world", "world_nether", "world_the_end");
@ConfigEntry(path = "worlds_enabled_money_drop", comment = "开启死亡后金币掉落的世界")
private List<String> worldEnabledMoneyDrop = Arrays.asList("world", "world_nether", "world_the_end");
@ConfigEntry(path = "worlds_enabled_punish_commands", comment = "开启死亡后执行后台指令的世界")
private List<String> worldEnabledPunishCommands = Arrays.asList("world", "world_nether", "world_the_end");
@ConfigEntry(path = "item_drop_whitelist", comment = "物品掉落白名单")
private List<String> itemDropWhiteList = Collections.emptyList();
public DeathPunishmentConfig(String configFilePath) {
super(configFilePath);
}
}

@ -1,25 +0,0 @@
package com.ultikits.plugins.config;
import com.ultikits.ultitools.abstracts.AbstractConfigEntity;
import com.ultikits.ultitools.annotations.ConfigEntity;
import com.ultikits.ultitools.annotations.ConfigEntry;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@ConfigEntity("config/title.yml")
public class PlayerNameTagConfig extends AbstractConfigEntity {
@ConfigEntry(path = "prefix", comment = "玩家名字前缀")
private String prefix = "&e[&dLv.%player_level%&e]";
@ConfigEntry(path = "suffix", comment = "玩家名字后缀")
private String suffix = "&e[&a%player_health_rounded%&e/&a%player_max_health_rounded%&e]";
@ConfigEntry(path = "updateInterval", comment = "更新间隔")
private int updateInterval = 20;
@ConfigEntry(path = "enableNameTagEdit", comment = "是否启用NameTagEdit支持")
private boolean enableNameTagEdit = false;
public PlayerNameTagConfig(String configFilePath) {
super(configFilePath);
}
}

@ -1,23 +0,0 @@
package com.ultikits.plugins.config;
import com.ultikits.ultitools.abstracts.AbstractConfigEntity;
import com.ultikits.ultitools.annotations.ConfigEntity;
import com.ultikits.ultitools.annotations.ConfigEntry;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@ConfigEntity("config/warp.yml")
public class WarpConfig extends AbstractConfigEntity {
@ConfigEntry(path = "enable_blue_map", comment = "是否启用BlueMap")
private boolean enableBlueMap = false;
@ConfigEntry(path = "blue_map_warp_max_distance", comment = "传送点在BlueMap中最远显示距离")
private int maxDistance = 1000;
@ConfigEntry(path = "blue_map_marker_set", comment = "传送点在BlueMap中的标记集名称")
private String markerSet = "UltiTools Warps";
public WarpConfig(String configFilePath) {
super(configFilePath);
}
}

@ -1,23 +0,0 @@
package com.ultikits.plugins.data;
import com.ultikits.ultitools.abstracts.AbstractDataEntity;
import com.ultikits.ultitools.annotations.Column;
import com.ultikits.ultitools.annotations.Table;
import com.ultikits.ultitools.entities.common.WorldLocation;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.bukkit.Location;
import java.util.Date;
@Data
@Table("warp_table")
@EqualsAndHashCode(callSuper = true)
public class WarpData extends AbstractDataEntity {
@Column("id")
private Long id = new Date().getTime();
@Column("name")
private String name;
@Column("location")
private WorldLocation location;
}

@ -14,6 +14,4 @@ public class WhiteListData extends AbstractDataEntity {
private String id;
@Column("name")
private String name;
@Column("remark")
private String remark;
}

@ -1,52 +0,0 @@
package com.ultikits.plugins.guis;
import com.ultikits.plugins.BasicFunctions;
import com.ultikits.plugins.data.WarpData;
import com.ultikits.plugins.services.WarpService;
import com.ultikits.ultitools.UltiTools;
import com.ultikits.ultitools.abstracts.guis.PagingPage;
import mc.obliviate.inventory.Icon;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.format.TextColor;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class WarpGui extends PagingPage {
private final WarpService warpService = new WarpService();
public WarpGui(Player player) {
super(
player,
"Warp-list",
Component.text(BasicFunctions.getInstance().i18n("传送点列表"))
.color(TextColor.color(0xFF00A6)),
3
);
}
@Override
public List<Icon> setAllItems() {
List<Icon> icons = new ArrayList<>();
List<WarpData> allWarps = warpService.getAllWarps();
for (WarpData warpData : allWarps) {
Location location = WarpService.toLocation(warpData.getLocation());
Icon icon = new Icon(UltiTools.getInstance().getVersionWrapper().getEndEye());
TextComponent textComponent = Component.text(warpData.getName()).color(TextColor.color(0xFF00A6));
icon.toComp().setName(textComponent);
String world = String.format(ChatColor.YELLOW + BasicFunctions.getInstance().i18n("所在世界 %s"), location.getWorld().getName());
String xyz = String.format(ChatColor.GRAY + "X: %.2f Y: %.2f Z: %.2f", location.getX(), location.getY(), location.getZ());
icon.setLore(world, xyz);
icon.onClick((e) -> {
player.performCommand("warp tp " + warpData.getName());
player.closeInventory();
});
icons.add(icon);
}
return icons;
}
}

@ -1,6 +1,5 @@
package com.ultikits.plugins.listeners;
import com.ultikits.ultitools.annotations.EventListener;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
@ -11,7 +10,6 @@ import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
@EventListener(manualRegister = true)
public class BackListener implements Listener {
private static final Map<UUID, Location> playerDeathLocation = new HashMap<>();

@ -1,16 +1,12 @@
package com.ultikits.plugins.listeners;
import com.ultikits.plugins.services.BanPlayerService;
import com.ultikits.ultitools.annotations.EventListener;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.springframework.beans.factory.annotation.Autowired;
@EventListener(manualRegister = true)
public class BanListener implements Listener {
@Autowired
private BanPlayerService banPlayerService;
private BanPlayerService banPlayerService = new BanPlayerService();
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {

@ -1,45 +0,0 @@
package com.ultikits.plugins.listeners;
import com.ultikits.plugins.tasks.DeathPunishmentTask;
import com.ultikits.ultitools.annotations.EventListener;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.ArrayList;
import java.util.List;
/**
* @author qianmo, wisdomme
*/
@EventListener(manualRegister = true)
public class DeathListener implements Listener {
private static final List<Player> list = new ArrayList<>();
@Autowired
private DeathPunishmentTask deathPunishmentTask;
@EventHandler
public void onPlayerDeath(PlayerDeathEvent event) {
Player player = event.getEntity();
if (list.contains(player)) {
list.remove(player);
deathPunishmentTask.addPlayerToQueue(player);
}
}
@EventHandler
public void onEntityDamage(EntityDamageEvent event) {
if (!(event.getEntity() instanceof Player)) {
return;
}
Player player = (Player) event.getEntity();
if (player.getHealth() > event.getFinalDamage()) {
return;
}
list.add(player);
}
}

@ -1,15 +0,0 @@
package com.ultikits.plugins.listeners;
import com.ultikits.plugins.commands.HideCommands;
import com.ultikits.ultitools.annotations.EventListener;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerQuitEvent;
@EventListener(manualRegister = true)
public class HideListener implements Listener {
@EventHandler
public void onPlayerQuit(PlayerQuitEvent event) {
HideCommands.removeHidePlayer(event.getPlayer().getUniqueId());
}
}

@ -3,7 +3,6 @@ package com.ultikits.plugins.listeners;
import com.ultikits.plugins.BasicFunctions;
import com.ultikits.plugins.config.JoinWelcomeConfig;
import com.ultikits.ultitools.UltiTools;
import com.ultikits.ultitools.annotations.EventListener;
import me.clip.placeholderapi.PlaceholderAPI;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
@ -15,7 +14,6 @@ import org.bukkit.scheduler.BukkitRunnable;
import static com.ultikits.ultitools.utils.MessageUtils.coloredMsg;
@EventListener(manualRegister = true)
public class JoinWelcomeListener implements Listener {
@EventHandler

@ -1,32 +0,0 @@
package com.ultikits.plugins.listeners;
import com.nametagedit.plugin.NametagEdit;
import com.ultikits.plugins.BasicFunctions;
import com.ultikits.plugins.config.PlayerNameTagConfig;
import com.ultikits.plugins.utils.TitlesUtils;
import com.ultikits.ultitools.annotations.EventListener;
import me.clip.placeholderapi.PlaceholderAPI;
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 static com.ultikits.ultitools.utils.MessageUtils.coloredMsg;
@EventListener(manualRegister = true)
public class PlayerNameTagListener implements Listener {
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
Player player = event.getPlayer();
PlayerNameTagConfig nameTagConfig = BasicFunctions.getInstance().getConfig(PlayerNameTagConfig.class);
String prefix = coloredMsg(PlaceholderAPI.setPlaceholders(player, nameTagConfig.getPrefix()));
String suffix = coloredMsg(PlaceholderAPI.setPlaceholders(player, nameTagConfig.getSuffix()));
if (nameTagConfig.isEnableNameTagEdit()) {
NametagEdit.getApi().updatePlayerNametag(player.getName(), prefix, suffix);
} else {
TitlesUtils.setPrefixSuffix(player, prefix, suffix);
}
}
}

@ -2,18 +2,14 @@ package com.ultikits.plugins.listeners;
import com.ultikits.plugins.BasicFunctions;
import com.ultikits.plugins.services.WhiteListService;
import com.ultikits.ultitools.annotations.EventListener;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerLoginEvent;
import org.springframework.beans.factory.annotation.Autowired;
@EventListener(manualRegister = true)
public class WhitelistListener implements Listener {
@Autowired
private WhiteListService whiteListService;
private final WhiteListService whiteListService = new WhiteListService();
@EventHandler
public void onPlayerLogin(PlayerLoginEvent event) {

@ -1,55 +0,0 @@
package com.ultikits.plugins.services;
import com.ultikits.ultitools.UltiTools;
import net.milkbowl.vault.economy.Economy;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* @author qianmo, wisdomme
*/
@Service
public class DeathPunishService {
public void takeMoney(Player player, int money) {
Economy economy = UltiTools.getInstance().getEconomy();
economy.withdrawPlayer(player, Math.min(economy.getBalance(player), money));
}
public void execCommand(List<String> cmd, String playerName) {
for (String s : cmd) {
Bukkit.getServer().dispatchCommand(
Bukkit.getServer().getConsoleSender(), s.replace("{PLAYER}", playerName)
);
}
}
public void takeItem(Player player, int drop, List<String> whitelist) {
Inventory inventory = player.getInventory();
List<Integer> inventorySlot = new ArrayList<>();
for (int i = 0; i < 45; i++) {
ItemStack item = inventory.getItem(i);
if (item != null && !whitelist.contains(item.getType().toString())) {
inventorySlot.add(i);
}
}
Collections.shuffle(inventorySlot);
List<Integer> ints = new ArrayList<>();
for (int i = 0; i < drop; i++) {
if (i >= inventorySlot.size()) break;
ints.add(inventorySlot.get(i));
}
for (Integer slot : ints) {
ItemStack itemStack = inventory.getItem(slot);
if (itemStack == null) continue;
itemStack.setAmount(itemStack.getAmount() - 1);
inventory.setItem(slot, itemStack);
}
}
}

@ -1,117 +0,0 @@
package com.ultikits.plugins.services;
import com.ultikits.plugins.BasicFunctions;
import com.ultikits.plugins.config.WarpConfig;
import com.ultikits.plugins.data.WarpData;
import com.ultikits.ultitools.entities.WhereCondition;
import com.ultikits.ultitools.entities.common.WorldLocation;
import de.bluecolored.bluemap.api.BlueMapAPI;
import de.bluecolored.bluemap.api.BlueMapMap;
import de.bluecolored.bluemap.api.markers.MarkerSet;
import de.bluecolored.bluemap.api.markers.POIMarker;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.springframework.stereotype.Service;
import java.util.List;
import static com.ultikits.ultitools.abstracts.UltiToolsPlugin.getConfigManager;
@Service
public class WarpService {
public static Location toLocation(WorldLocation worldLocation) {
return new Location(Bukkit.getWorld(worldLocation.getWorld()), worldLocation.getX(), worldLocation.getY(), worldLocation.getZ(), worldLocation.getYaw(), worldLocation.getPitch());
}
public void addWarp(String name, Location location) {
WarpData warpData = new WarpData();
warpData.setName(name);
WorldLocation worldLocation = new WorldLocation(location);
warpData.setLocation(worldLocation);
BasicFunctions.getInstance().getDataOperator(WarpData.class).insert(warpData);
addWarpToBlueMap(warpData);
}
public void removeWarp(String name) {
List<WarpData> warpData = BasicFunctions.getInstance().getDataOperator(WarpData.class).getAll(
WhereCondition.builder().column("name").value(name).build()
);
if (warpData.isEmpty()) {
return;
}
BasicFunctions.getInstance().getDataOperator(WarpData.class).del(
WhereCondition.builder().column("name").value(name).build()
);
removeWarpFromBlueMap(warpData.get(0));
}
public Location getWarpLocation(String name) {
List<WarpData> warpData = BasicFunctions.getInstance().getDataOperator(WarpData.class).getAll(
WhereCondition.builder().column("name").value(name).build()
);
if (warpData.isEmpty()) {
return null;
}
return toLocation(warpData.get(0).getLocation());
}
public List<WarpData> getAllWarps() {
return BasicFunctions.getInstance().getDataOperator(WarpData.class).getAll();
}
public void initBlueMap(){
WarpConfig warpConfig = getConfigManager().getConfigEntity(BasicFunctions.getInstance(), WarpConfig.class);
if (!warpConfig.isEnableBlueMap()) {
return;
}
BlueMapAPI.getInstance().ifPresent(api -> {
api.getWorlds().forEach(world -> {
for (BlueMapMap map : world.getMaps()) {
MarkerSet markerSet = MarkerSet.builder()
.label(warpConfig.getMarkerSet())
.build();
map.getMarkerSets().put(warpConfig.getMarkerSet(), markerSet);
}
});
});
for (WarpData warpData : getAllWarps()) {
addWarpToBlueMap(warpData);
}
}
public void addWarpToBlueMap(WarpData warpData) {
WarpConfig warpConfig = getConfigManager().getConfigEntity(BasicFunctions.getInstance(), WarpConfig.class);
if (!warpConfig.isEnableBlueMap()) {
return;
}
WorldLocation location = warpData.getLocation();
POIMarker marker = POIMarker.builder()
.label(warpData.getName())
.position(location.getX(), location.getY(), location.getZ())
.maxDistance(warpConfig.getMaxDistance())
.build();
BlueMapAPI.getInstance().flatMap(api -> api.getWorld(location.getWorld())).ifPresent(world -> {
for (BlueMapMap map : world.getMaps()) {
MarkerSet markerSet = map.getMarkerSets().get(warpConfig.getMarkerSet());
markerSet.getMarkers().put(String.valueOf(warpData.getId()), marker);
map.getMarkerSets().put(warpConfig.getMarkerSet(), markerSet);
}
});
}
public void removeWarpFromBlueMap(WarpData warpData) {
WarpConfig warpConfig = getConfigManager().getConfigEntity(BasicFunctions.getInstance(), WarpConfig.class);
if (!warpConfig.isEnableBlueMap()) {
return;
}
BlueMapAPI.getInstance().flatMap(api -> api.getWorld(warpData.getLocation().getWorld())).ifPresent(world -> {
for (BlueMapMap map : world.getMaps()) {
MarkerSet markerSet = map.getMarkerSets().get(warpConfig.getMarkerSet());
markerSet.remove(String.valueOf(warpData.getId()));
// map.getMarkerSets().put(warpConfig.getMarkerSet(), markerSet);
}
});
}
}

@ -4,11 +4,9 @@ import com.ultikits.plugins.BasicFunctions;
import com.ultikits.plugins.data.WhiteListData;
import com.ultikits.ultitools.entities.WhereCondition;
import com.ultikits.ultitools.interfaces.DataOperator;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class WhiteListService {
public boolean isWhiteList(String uuid) {

@ -1,87 +0,0 @@
package com.ultikits.plugins.tasks;
import com.ultikits.plugins.BasicFunctions;
import com.ultikits.plugins.config.DeathPunishmentConfig;
import com.ultikits.plugins.services.DeathPunishService;
import com.ultikits.ultitools.UltiTools;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import java.util.*;
@Service
public class DeathPunishmentTask {
protected List<UUID> punishQueue = new ArrayList<>();
@Autowired
private DeathPunishService deathPunishService;
public DeathPunishmentTask() {
DeathPunishmentConfig deathPunishmentConfig = UltiTools.getInstance().getConfigManager().getConfigEntity(BasicFunctions.getInstance(), DeathPunishmentConfig.class);
new BukkitRunnable() {
@Override
public void run() {
Iterator<UUID> iterator = punishQueue.iterator();
while (iterator.hasNext()) {
UUID uuid;
try {
uuid = iterator.next();
} catch (ConcurrentModificationException e) {
continue;
}
Player player = Bukkit.getPlayer(uuid);
if (player == null) {
continue;
}
String world = player.getWorld().getName();
List<String> list;
if (deathPunishmentConfig.isEnableItemDrop()) {
list = deathPunishmentConfig.getWorldEnabledItemDrop();
for (String s : list) {
if (s.equals(world)) {
int itemDropOnDeath = deathPunishmentConfig.getItemDropOnDeath();
deathPunishService.takeItem(player, itemDropOnDeath, deathPunishmentConfig.getItemDropWhiteList());
player.sendMessage(ChatColor.RED + String.format(BasicFunctions.getInstance().i18n("[死亡惩罚]你因为死亡随机掉落了%d个物品"), itemDropOnDeath));
}
}
}
if (deathPunishmentConfig.isEnableMoneyDrop()) {
list = deathPunishmentConfig.getWorldEnabledMoneyDrop();
for (String s : list) {
if (s.equals(world)) {
int moneyDropOnDeath = deathPunishmentConfig.getMoneyDropOnDeath();
deathPunishService.takeMoney(player, moneyDropOnDeath);
player.sendMessage(ChatColor.RED + String.format(BasicFunctions.getInstance().i18n("[死亡惩罚]你因为死亡而扣除了%d个金币"), moneyDropOnDeath));
}
}
}
if (deathPunishmentConfig.isEnablePunishCommands()) {
list = deathPunishmentConfig.getWorldEnabledPunishCommands();
for (String s : list) {
if (s.equals(world)) {
UltiTools.getInstance().getServer().getScheduler().callSyncMethod(UltiTools.getInstance(), () -> {
deathPunishService.execCommand(deathPunishmentConfig.getPunishCommands(), player.getName());
return null;
});
}
}
}
punishQueue.remove(uuid);
}
}
}.runTaskTimerAsynchronously(UltiTools.getInstance(), 0, 20);
}
public void addPlayerToQueue(Player player) {
if (punishQueue.contains(player.getUniqueId())) {
return;
}
punishQueue.add(player.getUniqueId());
}
}

@ -1,30 +0,0 @@
package com.ultikits.plugins.tasks;
import com.nametagedit.plugin.NametagEdit;
import com.ultikits.plugins.BasicFunctions;
import com.ultikits.plugins.config.PlayerNameTagConfig;
import com.ultikits.plugins.utils.TitlesUtils;
import me.clip.placeholderapi.PlaceholderAPI;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
import static com.ultikits.ultitools.utils.MessageUtils.coloredMsg;
public class NamePrefixSuffixTask extends BukkitRunnable {
@Override
public void run() {
PlayerNameTagConfig nameTagConfig = BasicFunctions.getInstance().getConfig(PlayerNameTagConfig.class);
for (Player player : Bukkit.getOnlinePlayers()) {
String prefix = coloredMsg(PlaceholderAPI.setPlaceholders(player, nameTagConfig.getPrefix()));
String suffix = coloredMsg(PlaceholderAPI.setPlaceholders(player, nameTagConfig.getSuffix()));
if (nameTagConfig.isEnableNameTagEdit()){
NametagEdit.getApi().updatePlayerNametag(player.getName(), prefix, suffix);
}else {
TitlesUtils.setPrefixSuffix(player, prefix, suffix);
}
}
}
}

@ -1,49 +0,0 @@
package com.ultikits.plugins.utils;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.scoreboard.Scoreboard;
import org.bukkit.scoreboard.Team;
public class TitlesUtils {
public static void setPrefixSuffix(Player player, String prefix, String suffix) {
for (Player online : Bukkit.getOnlinePlayers()) {
if (!online.canSee(player)) {
continue;
}
Scoreboard scoreboard = online.getScoreboard();
if (scoreboard == Bukkit.getScoreboardManager().getMainScoreboard()) {
scoreboard = Bukkit.getScoreboardManager().getNewScoreboard();
}
Team team = scoreboard.getTeam(player.getName());
if (team == null) {
team = scoreboard.registerNewTeam(player.getName());
}
team.setPrefix(prefix);
team.setSuffix(suffix);
team.addEntry(player.getName());
online.setScoreboard(scoreboard);
}
for (Player online : Bukkit.getOnlinePlayers()) {
if (!online.canSee(player)) {
continue;
}
if (online.getUniqueId().equals(player.getUniqueId()))
continue;
Scoreboard scoreboard = player.getScoreboard();
if (scoreboard == Bukkit.getScoreboardManager().getMainScoreboard()) {
scoreboard = Bukkit.getScoreboardManager().getNewScoreboard();
}
Team team = scoreboard.getTeam(online.getName());
if (team == null) {
team = scoreboard.registerNewTeam(online.getName());
}
team.setPrefix(player.getScoreboard().getTeam(online.getName()).getPrefix());
team.setSuffix(player.getScoreboard().getTeam(online.getName()).getSuffix());
team.addEntry(online.getName());
player.setScoreboard(scoreboard);
}
}
}

@ -18,15 +18,3 @@ enableTpa: true
enableSpeed: true
# 是否启用封禁功能
enableBan: true
# 是否启用封禁功能
enableWarp: true
# 是否启用重生点设置
enableSpawn: true
# 是否启用Lore编辑器
enableLoreEditor: true
# 是否启用隐身功能
enableHide: true
# 是否启用玩家头顶显示功能
enableTitle: true
# 是否启用死亡惩罚功能
enableDeathPunishment: true

@ -1,38 +0,0 @@
# 是否开启物品掉落
enable_item_drop: false
# 是否开启金币掉落
enable_money_drop: true
# 是否开启死亡执行后台命令
enable_punish_commands: true
# 死亡后掉落的金币数
money_dropped_ondeath: 100
# 死亡后随机掉落的物品数
item_dropped_ondeath: 3
# 死亡后后台执行的指令({PLAYER}指代玩家名占位符)
punish_commands: []
# 开启死亡随机物品掉落的世界
worlds_enabled_item_drop:
- world
- world_nether
- world_the_end
# 开启死亡后金币掉落的世界
worlds_enabled_money_drop:
- world
- world_nether
- world_the_end
# 开启死亡后执行后台指令的世界
worlds_enabled_punish_commands:
- world
- world_nether
- world_the_end
# 物品掉落白名单
item_drop_whitelist: []

@ -1,8 +0,0 @@
# 玩家名前缀
prefix: "&e[&dLv.%player_level%&e]"
# 玩家名后缀
suffix: "&e[&a%player_health_rounded%&e/&a%player_max_health_rounded%&e]"
# 玩家头顶显示更新间隔单位tick一般20代表1秒
updateInterval: 20
# 是否启用Nametagedit插件支持
enableNameTagEdit: false

@ -1,6 +0,0 @@
# 是否启用BlueMap自行安装BlueMap插件
enable_blue_map: false
# 传送点在BlueMap中最远显示距离
blue_map_warp_max_distance: 1000
# 传送点在BlueMap中的标记集名称
blue_map_marker_set: "UltiTools Warps"

@ -57,38 +57,5 @@
"速度设置功能": "Speed setting function",
"你已被封禁! 原因: %s": "You have been banned! Reason: %s",
"§a封禁成功": "§aBanned successfully!",
"§a解封成功": "§aUnbanned successfully!",
"传送点功能": "Teleport point function",
"§a已添加传送点 %s": "§aTeleport point %s has been added",
"§a已删除传送点 %s": "§aTeleport point %s has been deleted",
"§a/warp list §7- §e查看所有传送点": "§a/warp list §7- §eView all teleport points",
"§a/warp tp <name> §7- §e传送至传送点": "§a/warp tp <name> §7- §eTeleport to teleport point",
"§a/warp add <name> §7- §e添加传送点": "§a/warp add <name> §7- §eAdd teleport point",
"§a/warp remove <name> §7- §e删除传送点": "§a/warp remove <name> §7- §eDelete teleport point",
"所在世界 %s": "World: %s",
"传送点列表": "Teleport point list",
"未找到世界!": "World not found!",
"这个世界没有重生点!": "This world has no respawn point!",
"已重设世界重生点!": "World respawn point has been reset!",
"传送到世界重生点": "Teleport to world respawn point",
"重生点功能": "Spawn point function",
"设置世界重生点": "Set world respawn point",
"请手持物品来修改Lore": "Please hold the item to modify the Lore",
"物品Lore为空": "Item Lore is empty",
"物品Lore已修改": "Item Lore has been modified",
"物品Lore编辑功能": "Item Lore editing function",
"添加Lore": "Add Lore",
"删除Lore": "Delete Lore",
"修改Lore": "Modify Lore",
"<内容>": "<content>",
"<- 请输入对应的lore行数": "<- Please enter the lore line number",
"你已退出隐身": "You are not invisible now",
"你已进入隐身": "You are invisible now",
"隐身功能": "Invisible function",
"/hide - 开启/关闭隐身": "/hide - Turn on/off invisible",
"§c/uban ban <player> <reason> §7封禁玩家": "§c/uban ban <player> <reason> §7Ban player",
"§c/uban unban <player> §7解封玩家": "§c/uban unban <player> §7Unban player",
"§c/heal §7治愈自己": "§c/heal §7Heal yourself",
"[死亡惩罚]你因为死亡随机掉落了%d个物品": "[Death penalty] You randomly dropped %d items due to death!",
"[死亡惩罚]你因为死亡而扣除了%d个金币": "[Death penalty] You deducted %d coins due to death!"
"§a解封成功": "§aUnbanned successfully!"
}

@ -1,5 +1,5 @@
name: BasicFunctions
version: '${project.version}'
main: com.ultikits.plugins.BasicFunctions
api-version: 605
api-version: 600
authors: [ 'wisdomme' ]

@ -21,7 +21,7 @@
<dependency>
<groupId>com.ultikits</groupId>
<artifactId>UltiTools-API</artifactId>
<version>6.0.5</version>
<version>6.0.3</version>
<scope>provided</scope>
</dependency>
<dependency>
@ -78,7 +78,7 @@
<configuration>
<name>UltiEconomy</name>
<identifyString>UltiEconomy</identifyString>
<shortDescription>多账户,利息发放,多人共享账户的经济模块</shortDescription>
<shortDescription>A Economy Plugin</shortDescription>
<accessKeyFile>access_key.txt</accessKeyFile>
<pluginFolder>F:\SpigotServers\Servers\1.19.4\plugins\UltiTools\plugins</pluginFolder>
</configuration>

@ -4,7 +4,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<artifactId>UltiTools-Home</artifactId>
<groupId>com.ultikits.plugins</groupId>
<version>1.0.2</version>
<version>1.0.0</version>
<modelVersion>4.0.0</modelVersion>
<properties>
@ -18,7 +18,7 @@
<dependency>
<groupId>com.ultikits</groupId>
<artifactId>UltiTools-API</artifactId>
<version>6.0.5</version>
<version>6.0.3</version>
<scope>provided</scope>
</dependency>
<dependency>
@ -55,9 +55,9 @@
<configuration>
<name>UltiTools-Home</name>
<identifyString>UltiTools-Home</identifyString>
<shortDescription>可视化GUI家模块</shortDescription>
<shortDescription>A Home Plugin</shortDescription>
<accessKeyFile>access_key.txt</accessKeyFile>
<pluginFolder>F:\SpigotServers\Paper\1.20.4\plugins\UltiTools\plugins</pluginFolder>
<pluginFolder>F:\SpigotServers\Servers\1.20.4\plugins\UltiTools\plugins</pluginFolder>
</configuration>
</plugin>
</plugins>

@ -3,14 +3,20 @@ package com.ultikits.plugins.home;
import com.ultikits.plugins.home.config.HomeConfig;
import com.ultikits.plugins.home.entity.HomeEntity;
import com.ultikits.ultitools.abstracts.UltiToolsPlugin;
import com.ultikits.ultitools.annotations.UltiToolsModule;
import com.ultikits.ultitools.annotations.EnableAutoRegister;
import com.ultikits.ultitools.annotations.I18n;
import com.ultikits.ultitools.interfaces.DataOperator;
import com.ultikits.ultitools.interfaces.DataStore;
import lombok.Getter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.Component;
@UltiToolsModule
@Component
@ComponentScan
@I18n({"zh", "en"})
@EnableAutoRegister
public class PluginMain extends UltiToolsPlugin {
@SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection")
@Autowired

@ -8,6 +8,7 @@ import com.ultikits.ultitools.annotations.command.*;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.ArrayList;
import java.util.Arrays;
@ -16,11 +17,9 @@ import java.util.List;
@CmdTarget(CmdTarget.CmdTargetType.PLAYER)
@CmdExecutor(permission = "ultikits.home.command.all", description = "家功能", alias = {"home"})
public class HomeCommands extends AbstractCommendExecutor {
private final HomeService homeService;
public HomeCommands(HomeService homeService) {
this.homeService = homeService;
}
@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
@Autowired
private HomeService homeService;
@CmdMapping(format = "list")
public void openList(@CmdSender Player player) {

@ -16,7 +16,6 @@ import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
public class HomeListGui extends PagingPage {
@ -38,7 +37,6 @@ public class HomeListGui extends PagingPage {
public List<Icon> setAllItems() {
List<Icon> icons = new ArrayList<>();
List<HomeEntity> homeList = home.getHomeList(player.getUniqueId());
homeList.sort(Comparator.comparing(HomeEntity::getId));
int i = 0;
for (HomeEntity homeEntity : homeList) {
Location location = homeEntity.getHomeLocation();
@ -53,11 +51,7 @@ public class HomeListGui extends PagingPage {
player.closeInventory();
});
icons.add(icon);
if (i == beds.size() - 1) {
i = 0;
} else {
i++;
}
i++;
}
return icons;
}

@ -2,5 +2,5 @@ name: UltiTools-Home
version: '${project.version}'
main: com.ultikits.plugins.home.PluginMain
base-package: com.ultikits.plugins.home
api-version: 605
api-version: 603
authors: [ wisdomme ]

@ -88,7 +88,7 @@
<configuration>
<name>MysqlConnector</name>
<identifyString>MysqlConnector</identifyString>
<shortDescription>连接MySQL数据库的必须前置模块</shortDescription>
<shortDescription>A MysqlConnector Plugin</shortDescription>
<accessKeyFile>access_key.txt</accessKeyFile>
<pluginFolder>F:\SpigotServers\Servers\1.19.4\plugins\UltiTools\plugins</pluginFolder>
</configuration>

@ -6,7 +6,7 @@
<groupId>com.ultikits.plugins</groupId>
<artifactId>Sidebar</artifactId>
<version>1.0.1</version>
<version>1.0.0</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
@ -18,7 +18,7 @@
<dependency>
<groupId>com.ultikits</groupId>
<artifactId>UltiTools-API</artifactId>
<version>6.0.5</version>
<version>6.0.0.202310142230</version>
<scope>provided</scope>
</dependency>
<dependency>
@ -84,9 +84,9 @@
<configuration>
<name>Sidebar</name>
<identifyString>UltiTools-Sidebar</identifyString>
<shortDescription>高性能支持变量的侧边栏显示</shortDescription>
<shortDescription>Server Sidebar Display</shortDescription>
<accessKeyFile>access_key.txt</accessKeyFile>
<pluginFolder>F:\SpigotServers\Paper\1.20.4\plugins\UltiTools\plugins</pluginFolder>
<pluginFolder>F:\SpigotServers\Servers\1.20.4\plugins\UltiTools\plugins</pluginFolder>
</configuration>
</plugin>
</plugins>

@ -1,36 +1,22 @@
package com.ultikits.plugins.sidebar;
import com.ultikits.ultitools.annotations.EventListener;
import fr.mrmicky.fastboard.FastBoard;
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.bukkit.event.player.PlayerKickEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import static com.ultikits.ultitools.utils.MessageUtils.coloredMsg;
@EventListener
public class PlayerJoinListener implements Listener {
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
Player player = event.getPlayer();
FastBoard board = new FastBoard(player);
board.updateTitle(coloredMsg(SidebarPlugin.getInstance().getConfig(SidebarConfig.class).getTitle()));
board.updateTitle(ChatColor.translateAlternateColorCodes('&', SidebarPlugin.getInstance().getConfig(SidebarConfig.class).getTitle()));
SidebarPlugin.getInstance().getBoards().put(player.getUniqueId(), board);
}
@EventHandler
public void onPlayerKick(PlayerKickEvent event) {
Player player = event.getPlayer();
FastBoard board = SidebarPlugin.getInstance().getBoards().remove(player.getUniqueId());
if (board != null) {
board.delete();
}
}
@EventHandler
public void onQuit(PlayerQuitEvent e) {
Player player = e.getPlayer();

@ -1,37 +0,0 @@
package com.ultikits.plugins.sidebar;
import com.ultikits.ultitools.abstracts.AbstractCommendExecutor;
import com.ultikits.ultitools.annotations.command.*;
import fr.mrmicky.fastboard.FastBoard;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static com.ultikits.ultitools.utils.MessageUtils.coloredMsg;
@CmdExecutor(alias = {"sb"})
@CmdTarget(CmdTarget.CmdTargetType.PLAYER)
public class SbCommand extends AbstractCommendExecutor {
@CmdMapping(format = "close")
public void close(@CmdSender Player sender) {
SidebarPlugin.getInstance().getBoards().get(sender.getUniqueId()).delete();
SidebarPlugin.getInstance().getBoards().remove(sender.getUniqueId());
}
@CmdMapping(format = "reload", requireOp = true)
public void reload() {
SidebarPlugin.getInstance().registerSelf();
}
@CmdMapping(format = "open")
public void open(@CmdSender Player player) {
FastBoard board = new FastBoard(player);
board.updateTitle(coloredMsg(SidebarPlugin.getInstance().getConfig(SidebarConfig.class).getTitle()));
SidebarPlugin.getInstance().getBoards().put(player.getUniqueId(), board);
}
@Override
protected void handleHelp(CommandSender sender) {
}
}

@ -1,7 +1,6 @@
package com.ultikits.plugins.sidebar;
import com.ultikits.ultitools.abstracts.AbstractConfigEntity;
import com.ultikits.ultitools.annotations.ConfigEntity;
import com.ultikits.ultitools.annotations.ConfigEntry;
import lombok.Getter;
import lombok.Setter;
@ -11,13 +10,12 @@ import java.util.List;
@Getter
@Setter
@ConfigEntity("config/config.yml")
public class SidebarConfig extends AbstractConfigEntity {
@ConfigEntry(path = "scoreBoardTitle", comment = "侧边栏标题")
@ConfigEntry(path = "scoreBoardTitle", comment = "")
private String title = "欢迎加入服务器";
@ConfigEntry(path = "scoreBoardUpdateInterval", comment = "侧边栏更新间隔单位Tick推荐20每秒更新一次最低1更低会导致性能问题")
@ConfigEntry(path = "scoreBoardUpdateInterval", comment = "")
private int updateInterval = 20;
@ConfigEntry(path = "sidebarContent", comment = "侧边栏内容最多15行")
@ConfigEntry(path = "sidebarContent", comment = "")
private List<String> content = new ArrayList<>();
public SidebarConfig(String configFilePath) {

@ -3,7 +3,6 @@ package com.ultikits.plugins.sidebar;
import com.ultikits.ultitools.UltiTools;
import com.ultikits.ultitools.abstracts.AbstractConfigEntity;
import com.ultikits.ultitools.abstracts.UltiToolsPlugin;
import com.ultikits.ultitools.annotations.UltiToolsModule;
import fr.mrmicky.fastboard.FastBoard;
import lombok.Getter;
import me.clip.placeholderapi.PlaceholderAPI;
@ -13,25 +12,25 @@ import java.util.*;
import static com.ultikits.ultitools.utils.MessageUtils.coloredMsg;
@UltiToolsModule
public class SidebarPlugin extends UltiToolsPlugin {
@Getter
private static SidebarPlugin instance;
@Getter
private final Map<UUID, FastBoard> boards = new HashMap<>();
public SidebarPlugin(){
super();
instance = this;
}
@Override
public boolean registerSelf() {
public boolean registerSelf() throws IOException {
instance = this;
getListenerManager().register(this, new PlayerJoinListener());
int updateInterval = getConfig(SidebarConfig.class).getUpdateInterval();
new UpdateTask().runTaskTimerAsynchronously(UltiTools.getInstance(), 0, Math.max(updateInterval, 1));
return true;
}
@Override
public void unregisterSelf() {
}
@Override
public List<String> supported() {
return Arrays.asList("zh", "en");
@ -43,4 +42,17 @@ public class SidebarPlugin extends UltiToolsPlugin {
new SidebarConfig("config/config.yml")
);
}
protected void updateBoard(FastBoard board) {
List<String> list = new ArrayList<>();
for (String s : getConfig(SidebarConfig.class).getContent()) {
list.add(coloredMsg(PlaceholderAPI.setPlaceholders(board.getPlayer(), s)));
}
board.updateLines(list);
}
@Override
public void reloadSelf() {
UltiToolsPlugin.getConfigManager().register(this, new SidebarConfig("config/config.yml"));
}
}

@ -1,26 +1,16 @@
package com.ultikits.plugins.sidebar;
import fr.mrmicky.fastboard.FastBoard;
import me.clip.placeholderapi.PlaceholderAPI;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.ArrayList;
import java.util.List;
import static com.ultikits.ultitools.utils.MessageUtils.coloredMsg;
public class UpdateTask extends BukkitRunnable {
@Override
public void run() {
for (FastBoard board : SidebarPlugin.getInstance().getBoards().values()) {
if (board.isDeleted() || !board.getPlayer().isOnline()){
if (board.isDeleted()){
continue;
}
List<String> list = new ArrayList<>();
for (String s : SidebarPlugin.getInstance().getConfig(SidebarConfig.class).getContent()) {
list.add(coloredMsg(PlaceholderAPI.setPlaceholders(board.getPlayer(), s)));
}
board.updateLines(list);
SidebarPlugin.getInstance().updateBoard(board);
}
}
}

@ -1,5 +1,5 @@
name: Sidebar
version: '${project.version}'
main: com.ultikits.plugins.sidebar.SidebarPlugin
api-version: 605
authors: [ 'wisdomme' ]
api-version: 600
authors: [ wisdomme ]

@ -4,7 +4,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<artifactId>UltiTools-API</artifactId>
<groupId>com.ultikits</groupId>
<version>6.0.5</version>
<version>6.0.4</version>
<modelVersion>4.0.0</modelVersion>
<name>UltiTools-API</name>
<description>This project is the base of the Ultitools plugin development.</description>
@ -36,8 +36,7 @@
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<gui.version>4.3.0</gui.version>
<hutool.version>5.8.25</hutool.version>
<gui.version>4.1.13</gui.version>
</properties>
<distributionManagement>
@ -132,7 +131,6 @@
<outputDirectory>
${project.build.directory}/UltiTools/lib
</outputDirectory>
<excludeScope>provided</excludeScope>
</configuration>
</execution>
</executions>
@ -205,18 +203,6 @@
<autoReleaseAfterClose>true</autoReleaseAfterClose>
</configuration>
</plugin>
<plugin>
<groupId>com.ultikits</groupId>
<artifactId>ultitools-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<name>UltiTools-API</name>
<identifyString>UltiTools-API</identifyString>
<shortDescription>UltiTools-API</shortDescription>
<accessKeyFile>access_key.txt</accessKeyFile>
<pluginFolder>F:\SpigotServers\Paper\1.20.4\plugins</pluginFolder>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
@ -265,7 +251,7 @@
<dependency>
<groupId>com.github.MilkBowl</groupId>
<artifactId>VaultAPI</artifactId>
<version>1.7.1</version>
<version>1.7</version>
<scope>provided</scope>
</dependency>
<dependency>
@ -275,38 +261,8 @@
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-core</artifactId>
<version>${hutool.version}</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-crypto</artifactId>
<version>${hutool.version}</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-db</artifactId>
<version>${hutool.version}</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-json</artifactId>
<version>${hutool.version}</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-cache</artifactId>
<version>${hutool.version}</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-cron</artifactId>
<version>${hutool.version}</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-http</artifactId>
<version>${hutool.version}</version>
<artifactId>hutool-all</artifactId>
<version>5.8.20</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
@ -323,7 +279,7 @@
<dependency>
<groupId>net.kyori</groupId>
<artifactId>adventure-platform-bukkit</artifactId>
<version>4.3.2</version>
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>com.github.hamza-cskn</groupId>
@ -335,12 +291,6 @@
<artifactId>spring-context</artifactId>
<version>5.3.31</version>
</dependency>
<dependency>
<groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId>
<version>2.11.4</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>

@ -1,5 +1,6 @@
package com.ultikits.ultitools;
import com.ultikits.ultitools.context.ContextConfig;
import com.ultikits.ultitools.commands.PluginInstallCommands;
import com.ultikits.ultitools.commands.UltiToolsCommands;
import com.ultikits.ultitools.context.ContextConfig;
@ -7,28 +8,20 @@ import com.ultikits.ultitools.entities.Language;
import com.ultikits.ultitools.interfaces.DataStore;
import com.ultikits.ultitools.interfaces.Localized;
import com.ultikits.ultitools.interfaces.VersionWrapper;
import com.ultikits.ultitools.listeners.PlayerJoinListener;
import com.ultikits.ultitools.manager.*;
import com.ultikits.ultitools.tasks.DataStoreWaitingTask;
import com.ultikits.ultitools.utils.CommonUtils;
import com.ultikits.ultitools.utils.Metrics;
import lombok.Getter;
import lombok.Setter;
import mc.obliviate.inventory.InventoryAPI;
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import net.milkbowl.vault.economy.Economy;
import org.bukkit.Bukkit;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.RegisteredServiceProvider;
import org.bukkit.plugin.ServicePriority;
import org.bukkit.plugin.java.JavaPlugin;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import java.io.*;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
@ -82,11 +75,7 @@ public final class UltiTools extends JavaPlugin implements Localized {
* @return the version of the UltiTools
*/
public static int getPluginVersion() {
String versionString = getEnv().getString("version");
if (versionString == null) {
throw new RuntimeException("Version not found in env.yml!");
}
return Integer.parseInt(versionString.replace(".", ""));
return 604;
}
/**
@ -174,23 +163,10 @@ public final class UltiTools extends JavaPlugin implements Localized {
String result = new BufferedReader(new InputStreamReader(in)).lines().collect(Collectors.joining(""));
this.language = new Language(result);
// Plugin classloader initialization
pluginClassLoader = getClassLoader();
URL serverJar = CommonUtils.getServerJar();
try {
if (serverJar != null) {
String name = new File(serverJar.toURI()).getName().split("\\.jar")[0];
Bukkit.getLogger().info("[UltiTools-API] Spigot API detected: " + name);
}
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
URLClassLoader classLoader = new URLClassLoader(new URL[]{serverJar}, pluginClassLoader);
// Spring context initialization
pluginClassLoader = getClassLoader();
context = new AnnotationConfigApplicationContext();
context.setClassLoader(classLoader);
context.setClassLoader(pluginClassLoader);
context.register(ContextConfig.class);
context.refresh();
context.registerShutdownHook();
@ -208,11 +184,9 @@ public final class UltiTools extends JavaPlugin implements Localized {
throw new RuntimeException(e);
}
Metrics metrics = new Metrics(this, 8652);
// bukkit plugin registration
getCommandManager().register(context.getBean(UltiToolsCommands.class));
getCommandManager().register(context.getBean(PluginInstallCommands.class));
getCommandManager().register(new UltiToolsCommands());
getCommandManager().register(new PluginInstallCommands());
Bukkit.getServicesManager().register(
PluginManager.class,
@ -220,8 +194,6 @@ public final class UltiTools extends JavaPlugin implements Localized {
this,
ServicePriority.Normal
);
Bukkit.getServer().getPluginManager().registerEvents(new PlayerJoinListener(), this);
}
/**
@ -242,7 +214,6 @@ public final class UltiTools extends JavaPlugin implements Localized {
stopEmbedWebServer();
pluginManager.close();
context.close();
getCommandManager().close();
DataStoreManager.close();
getConfigManager().saveAll();
Bukkit.getServicesManager().unregisterAll(this);
@ -304,20 +275,4 @@ public final class UltiTools extends JavaPlugin implements Localized {
}
return this.adventure;
}
/**
* Get the economy provider
*
* @return the instance of the Economy provider
*/
public Economy getEconomy() {
if (Bukkit.getPluginManager().getPlugin("Vault") == null) {
throw new RuntimeException("Vault not found!");
}
RegisteredServiceProvider<Economy> registration = Bukkit.getServicesManager().getRegistration(Economy.class);
if (registration == null) {
throw new RuntimeException("Economy service not found!");
}
return registration.getProvider();
}
}

@ -4,10 +4,8 @@ import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import com.ultikits.ultitools.UltiTools;
import com.ultikits.ultitools.annotations.command.*;
import lombok.Getter;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
@ -17,12 +15,10 @@ import org.bukkit.scheduler.BukkitRunnable;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.lang.reflect.Array;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.*;
import java.util.function.Function;
public abstract class AbstractCommendExecutor implements TabExecutor {
private final BiMap<String, Method> mappings = HashBiMap.create();
@ -30,11 +26,7 @@ public abstract class AbstractCommendExecutor implements TabExecutor {
private final BiMap<UUID, Method> ServerLock = HashBiMap.create();
private final BiMap<UUID, Method> CmdCoolDown = HashBiMap.create();
@Getter
private final Map<List<Class<?>>, Function<String, ?>> parsers = new HashMap<>();
public AbstractCommendExecutor() {
initParsers();
scanCommandMappings();
}
@ -42,31 +34,6 @@ public abstract class AbstractCommendExecutor implements TabExecutor {
return this;
}
@SuppressWarnings("deprecation")
private void initParsers() {
parsers.put(Arrays.asList(Boolean[].class, Boolean.class, boolean[].class, boolean.class), Boolean::parseBoolean);
parsers.put(Arrays.asList(Double[].class, Double.class, double[].class, double.class), Double::parseDouble);
parsers.put(Arrays.asList(Integer[].class, Integer.class, int[].class, int.class), Integer::parseInt);
parsers.put(Arrays.asList(Float[].class, Float.class, float[].class, float.class), Float::parseFloat);
parsers.put(Arrays.asList(Short[].class, Short.class, short[].class, short.class), Short::parseShort);
parsers.put(Arrays.asList(Short[].class, Short.class, short[].class, short.class), Byte::parseByte);
parsers.put(Arrays.asList(OfflinePlayer[].class, OfflinePlayer.class), Bukkit::getOfflinePlayer);
parsers.put(Arrays.asList(Long[].class, Long.class, long[].class, long.class), Long::parseLong);
parsers.put(Arrays.asList(Material[].class, Material.class), Material::getMaterial);
parsers.put(Arrays.asList(Player[].class, Player.class), Bukkit::getPlayerExact);
parsers.put(Arrays.asList(UUID[].class, UUID.class), UUID::fromString);
parsers.put(Arrays.asList(String[].class, String.class), s -> s);
}
private <T> Function<String, T> getParser(Class<T> type) {
//noinspection unchecked
return (Function<String, T>) parsers.keySet().stream()
.filter(classes -> classes.stream().anyMatch(clazz -> clazz.isAssignableFrom(type)))
.findFirst()
.map(parsers::get)
.orElse(null);
}
private void scanCommandMappings() {
Class<? extends AbstractCommendExecutor> clazz = this.getClass();
Method[] methods = clazz.getDeclaredMethods();
@ -77,71 +44,70 @@ public abstract class AbstractCommendExecutor implements TabExecutor {
}
}
private static Map<String, String[]> getParams(String[] args, String format) {
if (args.length == 0) {
return Collections.emptyMap();
}
private Map<String, String> getParams(String[] args, String format) {
String[] formatArgs = format.split(" ");
Map<String, String[]> params = new HashMap<>();
List<String> paramList = new ArrayList<>();
int index = 0;
for (String arg : args) {
String currentFormatArg = formatArgs[index];
if (currentFormatArg.startsWith("<") && currentFormatArg.endsWith("...>")) {
paramList.add(arg);
} else if (currentFormatArg.startsWith("<") && currentFormatArg.endsWith(">")) {
String paramName = currentFormatArg.substring(1, currentFormatArg.length() - 1);
params.put(paramName, new String[]{arg});
Map<String, String> params = new HashMap<>();
for (int i = 0; i < formatArgs.length; i++) {
if (formatArgs[i].startsWith("<") && formatArgs[i].endsWith(">")) {
params.put(formatArgs[i].substring(1, formatArgs[i].length() - 1), args[i]);
}
if (formatArgs[i].startsWith("[") && formatArgs[i].endsWith("]")) {
params.put(formatArgs[i].substring(1, formatArgs[i].length() - 1), args[i]);
}
index = (index + 1) % formatArgs.length;
}
if (!paramList.isEmpty()) {
params.put(formatArgs[index].substring(1, formatArgs[index].length() - 1), paramList.toArray(new String[0]));
}
return params;
}
private Method matchMethod(String[] args) {
if (args.length == 0) {
return mappings.getOrDefault("", null);
}
for (Map.Entry<String, Method> entry : mappings.entrySet()) {
String format = entry.getKey();
if (format.isEmpty() && args.length == 0) {
return entry.getValue();
}
String[] formatArgs = format.split(" ");
boolean match = true;
for (int i = 0; i < formatArgs.length - 1; i++) {
if (!matchesArgument(formatArgs[i], args[i])) {
match = false;
break;
String lastArg = formatArgs[formatArgs.length - 1];
boolean match;
if (lastArg.startsWith("[") && lastArg.endsWith("]")) {
if (formatArgs.length - args.length == 1) {
continue;
}
match = true;
for (int i = 0; i < formatArgs.length - 1; i++) {
String formatArg = formatArgs[i];
String actualArg = args[i];
if (formatArg.startsWith("<") && formatArg.endsWith(">")) {
continue;
}
if (!formatArg.equalsIgnoreCase(actualArg)) {
match = false;
break;
}
}
} else {
if (formatArgs.length != args.length) {
continue;
}
match = true;
for (int i = 0; i < formatArgs.length; i++) {
String formatArg = formatArgs[i];
String actualArg = args[i];
if (formatArg.startsWith("<") && formatArg.endsWith(">")) {
continue;
}
if (!formatArg.equalsIgnoreCase(actualArg)) {
match = false;
break;
}
}
}
if (match && matchesLastArgument(formatArgs[formatArgs.length - 1], args[formatArgs.length - 1])) {
if (match) {
return entry.getValue();
}
}
return null;
}
private boolean matchesArgument(String formatArg, String actualArg) {
return formatArg.startsWith("<") && formatArg.endsWith(">") || formatArg.equalsIgnoreCase(actualArg);
}
private boolean matchesLastArgument(String formatArg, String actualArg) {
if (formatArg.endsWith("...>")) {
return true;
}
return matchesArgument(formatArg, actualArg);
}
private boolean checkSender(CommandSender sender) {
Class<? extends AbstractCommendExecutor> clazz = this.getClass();
if (!clazz.isAnnotationPresent(CmdTarget.class)) {
@ -177,23 +143,21 @@ public abstract class AbstractCommendExecutor implements TabExecutor {
private boolean checkPermission(CommandSender sender) {
Class<? extends AbstractCommendExecutor> clazz = this.getClass();
if (!clazz.isAnnotationPresent(CmdExecutor.class)) {
return true;
}
CmdExecutor cmdExecutor = clazz.getAnnotation(CmdExecutor.class);
if (cmdExecutor.permission().isEmpty()) {
return true;
}
String permission = cmdExecutor.permission();
if (permission.isEmpty() || sender.hasPermission(permission)) {
if (sender.hasPermission(permission)) {
return true;
}
sender.sendMessage(ChatColor.RED + UltiTools.getInstance().i18n("你没有权限执行这个指令!"));
return false;
}
private boolean checkPermission(CommandSender sender, Method method) {
if (!method.isAnnotationPresent(CmdMapping.class)) {
return true;
@ -274,60 +238,95 @@ public abstract class AbstractCommendExecutor implements TabExecutor {
return false;
}
private Object[] buildParams(String[] strings, Method method, CommandSender commandSender) {
Map<String, String[]> params = getParams(strings, mappings.inverse().get(method));
private Object[] parseParams(String[] strings, Method method, CommandSender commandSender) {
Map<String, String> params = getParams(strings, mappings.inverse().get(method));
Parameter[] parameters = method.getParameters();
if (parameters.length == 0) {
return new Object[0];
}
List<Object> paramList = new ArrayList<>();
List<Object> ParamList = new ArrayList<>();
for (Parameter parameter : parameters) {
Class<?> paramType = parameter.getType();
if (paramType.equals(Player.class) || paramType.equals(CommandSender.class)) {
boolean isCmdSenderAnnotationPresent = parameter.isAnnotationPresent(CmdSender.class);
if (paramType.equals(Player.class) && commandSender instanceof Player) {
paramList.add(isCmdSenderAnnotationPresent ? commandSender : null);
} else if (paramType.equals(CommandSender.class)) {
paramList.add(isCmdSenderAnnotationPresent ? commandSender : null);
}
if (parameter.getType().equals(Player.class)) {
Player player = (Player) commandSender;
ParamList.add(parameter.isAnnotationPresent(CmdSender.class) ? player : null);
continue;
}
if (parameter.getType().equals(CommandSender.class)) {
ParamList.add(parameter.isAnnotationPresent(CmdSender.class) ? commandSender : null);
continue;
}
if (parameter.isAnnotationPresent(CmdParam.class)) {
CmdParam cmdParam = parameter.getAnnotation(CmdParam.class);
String[] value = params.get(cmdParam.value());
String value = params.get(cmdParam.value());
try {
paramList.add(parseType(value, paramType));
} catch (Exception e) {
commandSender.sendMessage(ChatColor.RED + e.getMessage());
//noinspection CallToPrintStackTrace
e.printStackTrace();
if (parameter.getType() == float.class || parameter.getType() == Float.class) {
ParamList.add(Float.parseFloat(value));
continue;
}
if (parameter.getType() == double.class || parameter.getType() == Double.class) {
ParamList.add(Double.parseDouble(value));
continue;
}
if (parameter.getType() == int.class || parameter.getType() == Integer.class) {
ParamList.add(Integer.parseInt(value));
continue;
}
} catch (NumberFormatException e) {
commandSender.sendMessage(
ChatColor.RED + String.format(
UltiTools.getInstance().i18n("参数 '%s' 格式错误:'%s' 不是一个有效的 %s 类型"),
cmdParam.value(), value, parameter.getType().getName()
));
return null;
}
if (parameter.getType() == OfflinePlayer.class) {
ParamList.add(Bukkit.getOfflinePlayer(value));
continue;
}
if (parameter.getType() == Player.class) {
Player player = Bukkit.getPlayerExact(value);
if (player == null) {
commandSender.sendMessage(
ChatColor.RED + String.format(
UltiTools.getInstance().i18n("玩家 \"%s\" 未找到"),
cmdParam.value(), value, parameter.getType().getName()
));
return null;
}
ParamList.add(player);
}
ParamList.add(value);
} else {
paramList.add(null);
ParamList.add(null);
}
if (parameter.isAnnotationPresent(OptionalParam.class)) {
if (parameter.getType() == Map.class) {
String format = method.getAnnotation(CmdMapping.class).format();
String OptionParams = params.get(format.split(" ")[format.split(" ").length - 1]);
ParamList.add(parseOptionalParams(OptionParams));
} else {
ParamList.add(null);
}
}
}
return paramList.toArray();
return ParamList.toArray();
}
private <T> Object parseType(String[] value, Class<T> type) {
Function<String, T> parser = getParser(type);
if (type.isArray()) {
Object array = Array.newInstance(type.getComponentType(), value.length);
for (int i = 0; i < value.length; i++) {
Array.set(array, i, parser.apply(value[i]));
private Map<String, List<String>> parseOptionalParams(String OptionalParam) {
Map<String, List<String>> resultMap = new HashMap<>();
String[] optionGroups = OptionalParam.split(";");
for (String optionGroup : optionGroups) {
String[] parts = optionGroup.split("=");
if (parts.length == 2) {
String optionName = parts[0];
String[] arguments = parts[1].split(",");
resultMap.put(optionName, Arrays.asList(arguments));
}
return array;
} else {
return parser.apply(value[0]);
}
return resultMap;
}
private void setCoolDown(CommandSender commandSender, Method method) {
@ -415,23 +414,20 @@ public abstract class AbstractCommendExecutor implements TabExecutor {
if (checkCD(commandSender)) {
return true;
}
Object[] params = buildParams(strings, method, commandSender);
if (params == null) {
return true;
}
Object[] params = parseParams(strings, method, commandSender);
BukkitRunnable bukkitRunnable = new BukkitRunnable() {
@Override
public void run() {
UsageLimit usageLimit = method.getAnnotation(UsageLimit.class);
if (usageLimit != null) {
if (usageLimit.value().equals(UsageLimit.LimitType.ALL)) {
if (method.isAnnotationPresent(UsageLimit.class)) {
if (method.getAnnotation(UsageLimit.class).value().equals(UsageLimit.LimitType.ALL)) {
ServerLock.put(((Player) commandSender).getUniqueId(), method);
} else if (usageLimit.value().equals(UsageLimit.LimitType.SENDER) && commandSender instanceof Player) {
SenderLock.put(((Player) commandSender).getUniqueId(), method);
}
if (method.getAnnotation(UsageLimit.class).value().equals(UsageLimit.LimitType.SENDER)) {
if (commandSender instanceof Player) {
SenderLock.put(((Player) commandSender).getUniqueId(), method);
}
}
}
try {
setCoolDown(commandSender, method);
method.invoke(getInstance(), params);
@ -439,11 +435,14 @@ public abstract class AbstractCommendExecutor implements TabExecutor {
sendErrorMessage(commandSender, command);
throw new RuntimeException(e);
} finally {
if (usageLimit != null) {
if (usageLimit.value().equals(UsageLimit.LimitType.ALL)) {
if (method.isAnnotationPresent(UsageLimit.class)) {
if (method.getAnnotation(UsageLimit.class).value().equals(UsageLimit.LimitType.ALL)) {
ServerLock.remove(((Player) commandSender).getUniqueId());
} else if (usageLimit.value().equals(UsageLimit.LimitType.SENDER) && commandSender instanceof Player) {
SenderLock.remove(((Player) commandSender).getUniqueId());
}
if (method.getAnnotation(UsageLimit.class).value().equals(UsageLimit.LimitType.SENDER)) {
if (commandSender instanceof Player) {
SenderLock.remove(((Player) commandSender).getUniqueId());
}
}
}
}

@ -1,6 +1,5 @@
package com.ultikits.ultitools.abstracts;
import cn.hutool.core.comparator.VersionComparator;
import cn.hutool.core.io.FileUtil;
import com.ultikits.ultitools.UltiTools;
import com.ultikits.ultitools.annotations.EnableAutoRegister;
@ -16,7 +15,6 @@ import lombok.Setter;
import lombok.SneakyThrows;
import org.bukkit.configuration.file.YamlConfiguration;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.core.annotation.AnnotationUtils;
import java.io.*;
import java.net.JarURLConnection;
@ -56,16 +54,16 @@ public abstract class UltiToolsPlugin implements IPlugin, Localized, Configurabl
private AnnotationConfigApplicationContext context;
@SneakyThrows
public UltiToolsPlugin() {
InputStream inputStream = getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
public UltiToolsPlugin(){
InputStream inputStream = getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
YamlConfiguration pluginConfig = YamlConfiguration.loadConfiguration(reader);
version = pluginConfig.getString("version");
pluginName = pluginConfig.getString("name");
authors = pluginConfig.getStringList("authors");
loadAfter = pluginConfig.getStringList("loadAfter");
minUltiToolsVersion = pluginConfig.getInt("api-version");
mainClass = pluginConfig.getString("main");
version = pluginConfig.getString("version");
pluginName = pluginConfig.getString("name");
authors = pluginConfig.getStringList("authors");
loadAfter = pluginConfig.getStringList("loadAfter");
minUltiToolsVersion = pluginConfig.getInt("api-version");
mainClass = pluginConfig.getString("mainClass");
inputStream.close();
reader.close();
@ -101,7 +99,7 @@ public abstract class UltiToolsPlugin implements IPlugin, Localized, Configurabl
String result = new BufferedReader(new InputStreamReader(in))
.lines().collect(Collectors.joining(""));
language = new Language(result);
} else {
}else {
language = new Language("{}");
}
} else {
@ -111,28 +109,8 @@ public abstract class UltiToolsPlugin implements IPlugin, Localized, Configurabl
initConfig();
}
public static ConfigManager getConfigManager() {
return UltiTools.getInstance().getConfigManager();
}
public static ListenerManager getListenerManager() {
return UltiTools.getInstance().getListenerManager();
}
public static CommandManager getCommandManager() {
return UltiTools.getInstance().getCommandManager();
}
public static PluginManager getPluginManager() {
return UltiTools.getInstance().getPluginManager();
}
public static VersionWrapper getVersionWrapper() {
return UltiTools.getInstance().getVersionWrapper();
}
public final void initConfig() {
EnableAutoRegister annotation = AnnotationUtils.findAnnotation(this.getClass(), EnableAutoRegister.class);
EnableAutoRegister annotation = this.getClass().getAnnotation(EnableAutoRegister.class);
if (annotation != null && annotation.config()) {
for (String packageName : CommonUtils.getPluginPackages(this)) {
UltiTools.getInstance().getConfigManager().registerAll(
@ -148,14 +126,34 @@ public abstract class UltiToolsPlugin implements IPlugin, Localized, Configurabl
}
private InputStream getInputStream() throws IOException {
CodeSource src = this.getClass().getProtectionDomain().getCodeSource();
URL jar = src.getLocation();
String path = jar.getPath().startsWith("/") ? jar.getPath() : jar.getPath().substring(1);
URL url = new URL("jar:file:" + path + "!/plugin.yml");
CodeSource src = this.getClass().getProtectionDomain().getCodeSource();
URL jar = src.getLocation();
String path = jar.getPath().startsWith("/") ? jar.getPath() : jar.getPath().substring(1);
URL url = new URL("jar:file:" + path + "!/plugin.yml");
JarURLConnection jarConnection = (JarURLConnection) url.openConnection();
return jarConnection.getInputStream();
}
public static ConfigManager getConfigManager() {
return UltiTools.getInstance().getConfigManager();
}
public static ListenerManager getListenerManager() {
return UltiTools.getInstance().getListenerManager();
}
public static CommandManager getCommandManager() {
return UltiTools.getInstance().getCommandManager();
}
public static PluginManager getPluginManager() {
return UltiTools.getInstance().getPluginManager();
}
public static VersionWrapper getVersionWrapper() {
return UltiTools.getInstance().getVersionWrapper();
}
protected final String getConfigFolder() {
return UltiTools.getInstance().getDataFolder().getAbsolutePath() + "/pluginConfig/" + this.getPluginName();
}
@ -242,19 +240,4 @@ public abstract class UltiToolsPlugin implements IPlugin, Localized, Configurabl
public final String i18n(String code, String str) {
return this.getLanguage().getLocalizedText(str);
}
public boolean isNewerVersionThan(UltiToolsPlugin plugin) {
return VersionComparator.INSTANCE.compare(this.getVersion(), plugin.getVersion()) > 0;
}
@Override
public void unregisterSelf() {
getCommandManager().unregisterAll(this);
getListenerManager().unregisterAll(this);
}
@Override
public void reloadSelf() {
getConfigManager().reloadConfigs(this);
}
}

@ -5,14 +5,13 @@ import com.ultikits.ultitools.entities.Colors;
import mc.obliviate.inventory.Gui;
import mc.obliviate.inventory.Icon;
import net.kyori.adventure.text.Component;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryOpenEvent;
import org.bukkit.event.inventory.InventoryType;
import org.jetbrains.annotations.NotNull;
import static com.ultikits.ultitools.utils.MessageUtils.coloredMsg;
public abstract class OkCancelPage extends Gui {
public OkCancelPage(@NotNull Player player, @NotNull String id, String title, int rows) {
super(player, id, title, rows);
@ -36,13 +35,13 @@ public abstract class OkCancelPage extends Gui {
lastRowBackground.setName(" ");
this.fillRow(lastRowBackground, getSize() / 9 - 1);
Icon ok = new Icon(UltiTools.getInstance().getVersionWrapper().getColoredPlaneGlass(Colors.GREEN));
ok.setName(coloredMsg(UltiTools.getInstance().i18n("OK")));
ok.setName(ChatColor.translateAlternateColorCodes('&', UltiTools.getInstance().i18n("OK")));
ok.onClick((e) -> {
onOk(e);
player.closeInventory();
});
Icon cancel = new Icon(UltiTools.getInstance().getVersionWrapper().getColoredPlaneGlass(Colors.RED));
cancel.setName(coloredMsg(UltiTools.getInstance().i18n("取消")));
cancel.setName(ChatColor.translateAlternateColorCodes('&', UltiTools.getInstance().i18n("取消")));
cancel.onClick((e) -> {
onCancel(e);
player.closeInventory();

@ -45,17 +45,9 @@ public abstract class PagingPage extends Gui {
@Override
public void onOpen(InventoryOpenEvent event) {
updateItems();
}
public void updateItems() {
paginationManager.getItems().clear();
Icon lastRowBackground = new Icon(UltiTools.getInstance().getVersionWrapper().getColoredPlaneGlass(Colors.GRAY));
lastRowBackground.setName(" ");
this.fillRow(lastRowBackground, getSize() / 9 - 1);
for (Icon icon : setAllItems()) {
paginationManager.addItem(icon);
}
Icon next = new Icon(UltiTools.getInstance().getVersionWrapper().getColoredPlaneGlass(Colors.GREEN));
next.setName(info(UltiTools.getInstance().i18n("下一页")));
if (this.paginationManager.isLastPage()) {
@ -66,7 +58,6 @@ public abstract class PagingPage extends Gui {
return;
}
this.paginationManager.goNextPage();
updateItems();
});
Icon last = new Icon(UltiTools.getInstance().getVersionWrapper().getColoredPlaneGlass(Colors.GREEN));
last.setName(info(UltiTools.getInstance().i18n("上一页")));
@ -78,10 +69,17 @@ public abstract class PagingPage extends Gui {
return;
}
this.paginationManager.goPreviousPage();
updateItems();
});
this.addItem(getLastSlot() - 3, next);
this.addItem(getLastSlot() - 5, last);
updateItems();
}
public void updateItems() {
paginationManager.getItems().clear();
for (Icon icon : setAllItems()) {
paginationManager.addItem(icon);
}
paginationManager.update();
}

@ -1,10 +1,12 @@
package com.ultikits.ultitools.annotations;
import java.lang.annotation.*;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
public @interface EnableAutoRegister {
String scanPackage() default "";
boolean eventListener() default true;

@ -1,13 +1,11 @@
package com.ultikits.ultitools.annotations;
import org.springframework.stereotype.Component;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.*;
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Component
public @interface EventListener {
boolean manualRegister() default false;
}

@ -1,10 +1,12 @@
package com.ultikits.ultitools.annotations;
import java.lang.annotation.*;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
public @interface I18n {
String[] value() default {};
String[] value();
}

@ -1,36 +0,0 @@
package com.ultikits.ultitools.annotations;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.AliasFor;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@EnableAutoRegister
@I18n
@ComponentScan
@Configuration
public @interface UltiToolsModule {
@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
String[] scanBasePackages() default {};
@AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
Class<?>[] scanBasePackageClasses() default {};
@AliasFor(annotation = EnableAutoRegister.class, attribute = "eventListener")
boolean eventListener() default true;
@AliasFor(annotation = EnableAutoRegister.class, attribute = "cmdExecutor")
boolean cmdExecutor() default true;
@AliasFor(annotation = EnableAutoRegister.class, attribute = "config")
boolean config() default true;
@AliasFor(annotation = I18n.class, attribute = "value")
String[] i18n() default {};
}

@ -1,7 +1,5 @@
package com.ultikits.ultitools.annotations.command;
import org.springframework.stereotype.Component;
import java.lang.annotation.*;
/**
@ -13,7 +11,6 @@ import java.lang.annotation.*;
@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Component
public @interface CmdExecutor {
/**
@ -35,9 +32,4 @@ public @interface CmdExecutor {
* @return OP
*/
boolean requireOp() default false;
/**
* @return
*/
boolean manualRegister() default false;
}

@ -121,7 +121,7 @@ public class PluginInstallCommands extends AbstractCommendExecutor {
@CmdMapping(format = "install <plugin> <version>")
public void installPlugin(@CmdSender CommandSender sender, @CmdParam("plugin") String plugin, @CmdParam("version") String version) {
if (PluginInstallUtils.installPlugin(plugin, version)) {
sender.sendMessage(ChatColor.GREEN + UltiTools.getInstance().i18n("安装成功!请重启服务器!请务必删除旧版本模块!"));
sender.sendMessage(ChatColor.GREEN + UltiTools.getInstance().i18n("安装成功!请重启服务器!"));
} else {
sender.sendMessage(ChatColor.RED + UltiTools.getInstance().i18n("安装失败!"));
}
@ -130,7 +130,7 @@ public class PluginInstallCommands extends AbstractCommendExecutor {
@CmdMapping(format = "install <plugin>")
public void installPlugin(@CmdSender CommandSender sender, @CmdParam("plugin") String plugin) {
if (PluginInstallUtils.installLatestPlugin(plugin)) {
sender.sendMessage(ChatColor.GREEN + UltiTools.getInstance().i18n("安装成功!请重启服务器!请务必删除旧版本模块!"));
sender.sendMessage(ChatColor.GREEN + UltiTools.getInstance().i18n("安装成功!请重启服务器!"));
} else {
sender.sendMessage(ChatColor.RED + UltiTools.getInstance().i18n("安装失败!"));
}

@ -3,7 +3,10 @@ package com.ultikits.ultitools.commands;
import com.ultikits.ultitools.UltiTools;
import com.ultikits.ultitools.abstracts.AbstractCommendExecutor;
import com.ultikits.ultitools.abstracts.UltiToolsPlugin;
import com.ultikits.ultitools.annotations.command.*;
import com.ultikits.ultitools.annotations.command.CmdExecutor;
import com.ultikits.ultitools.annotations.command.CmdMapping;
import com.ultikits.ultitools.annotations.command.CmdSender;
import com.ultikits.ultitools.annotations.command.CmdTarget;
import org.bukkit.command.CommandSender;
import java.io.IOException;

@ -2,7 +2,6 @@ package com.ultikits.ultitools.entities.common;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import java.io.Serializable;
@ -35,10 +34,6 @@ public class WorldLocation implements Serializable {
this.pitch = pitch;
}
public Location toLocation() {
return new Location(Bukkit.getWorld(world), x, y, z, yaw, pitch);
}
@Override
public String toString() {
return "{"

@ -24,5 +24,6 @@ public interface IPlugin {
/**
* {@link #registerSelf()}{@link #unregisterSelf()}
*/
void reloadSelf();
default void reloadSelf() {
}
}

@ -1,7 +1,6 @@
package com.ultikits.ultitools.interfaces;
import com.ultikits.ultitools.annotations.I18n;
import org.springframework.core.annotation.AnnotationUtils;
import java.util.ArrayList;
import java.util.Arrays;
@ -20,8 +19,9 @@ public interface Localized {
* @return Supported language codes
*/
default List<String> supported() {
I18n i18n = AnnotationUtils.findAnnotation(this.getClass(), I18n.class);
if (i18n != null) {
Class<? extends Localized> clazz = this.getClass();
if (clazz.isAnnotationPresent(I18n.class)) {
I18n i18n = clazz.getAnnotation(I18n.class);
return Arrays.asList(i18n.value());
} else {
return new ArrayList<>();

@ -1,8 +0,0 @@
package com.ultikits.ultitools.interfaces;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
public interface TempEventHandler<E extends Event> {
boolean handle(E event);
}

@ -1,12 +0,0 @@
package com.ultikits.ultitools.interfaces;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
public interface TempListener extends Listener {
void register();
default void unregister() {
HandlerList.unregisterAll(this);
}
}

@ -1,55 +0,0 @@
package com.ultikits.ultitools.interfaces.impl;
import com.ultikits.ultitools.UltiTools;
import com.ultikits.ultitools.interfaces.TempEventHandler;
import com.ultikits.ultitools.interfaces.TempListener;
import lombok.*;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventPriority;
import org.bukkit.event.player.PlayerEvent;
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Setter
@Getter
public class PlayerTempListener<E extends PlayerEvent> implements TempListener {
private Class<E> eventClass;
private EventPriority priority = EventPriority.NORMAL;
private TempEventHandler<E> eventHandler;
private Player player;
public PlayerTempListener(Class<E> eventClass, TempEventHandler<E> eventHandler) {
this.eventClass = eventClass;
this.eventHandler = eventHandler;
}
public PlayerTempListener(Class<E> eventClass, TempEventHandler<E> eventHandler, Player player) {
this.eventClass = eventClass;
this.eventHandler = eventHandler;
this.player = player;
}
@SuppressWarnings("unchecked")
public void register() {
Bukkit.getServer().getPluginManager().registerEvent(eventClass, this, priority,
(ignored, event) -> {
try {
if (player == null) {
if (eventHandler.handle((E) event)) {
unregister();
}
} else if (((E) event).getPlayer().equals(player)) {
if (eventHandler.handle((E) event)) {
unregister();
}
}
} catch (ClassCastException e) {
throw new RuntimeException(e);
}
},
UltiTools.getInstance()
);
}
}

@ -61,7 +61,7 @@ public class SimpleJsonDataOperator<T extends AbstractDataEntity> implements Dat
@Override
public boolean exist(WhereCondition... whereConditions) {
return !getAll(whereConditions).isEmpty();
return getAll(whereConditions).size() > 0;
}
@Override

@ -1,41 +0,0 @@
package com.ultikits.ultitools.interfaces.impl;
import com.ultikits.ultitools.UltiTools;
import com.ultikits.ultitools.interfaces.TempEventHandler;
import com.ultikits.ultitools.interfaces.TempListener;
import lombok.*;
import org.bukkit.Bukkit;
import org.bukkit.event.Event;
import org.bukkit.event.EventPriority;
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Setter
@Getter
public class SimpleTempListener<E extends Event> implements TempListener {
private Class<E> eventClass;
private EventPriority priority = EventPriority.NORMAL;
private TempEventHandler<E> eventHandler;
public SimpleTempListener(Class<E> eventClass, TempEventHandler<E> eventHandler) {
this.eventClass = eventClass;
this.eventHandler = eventHandler;
}
public void register() {
Bukkit.getServer().getPluginManager().registerEvent(eventClass, this, priority,
(ignored, event) -> {
try {
//noinspection unchecked
if (eventHandler.handle((E) event)){
unregister();
}
} catch (ClassCastException e) {
throw new RuntimeException(e);
}
},
UltiTools.getInstance()
);
}
}

@ -1,54 +0,0 @@
package com.ultikits.ultitools.listeners;
import com.ultikits.ultitools.UltiTools;
import me.clip.placeholderapi.PlaceholderAPI;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.Arrays;
import java.util.List;
public class PlayerJoinListener implements Listener {
private final List<String> placeholderList = Arrays.asList("player", "server", "math", "vault", "localtime");
// make the word first letter uppercase
public static String toUpperCaseFirstOne(String s) {
if (Character.isUpperCase(s.charAt(0)))
return s;
else
return Character.toUpperCase(s.charAt(0)) + s.substring(1);
}
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
try {
boolean reload = false;
long time = 30L;
for (String placeholder : placeholderList) {
if (!PlaceholderAPI.isRegistered(placeholder)) {
reload = true;
new BukkitRunnable() {
@Override
public void run() {
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "papi ecloud download " + toUpperCaseFirstOne(placeholder));
}
}.runTaskLater(UltiTools.getInstance(), time);
time += 30L;
}
}
if (reload) {
new BukkitRunnable() {
@Override
public void run() {
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "papi reload");
}
}.runTaskLater(UltiTools.getInstance(), time + 30L);
}
} catch (Exception ignored) {
}
}
}

@ -6,7 +6,6 @@ import com.ultikits.ultitools.abstracts.UltiToolsPlugin;
import com.ultikits.ultitools.annotations.command.CmdExecutor;
import com.ultikits.ultitools.utils.PackageScanUtils;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandMap;
import org.bukkit.command.PluginCommand;
@ -16,75 +15,32 @@ import org.bukkit.plugin.SimplePluginManager;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.*;
import java.util.Arrays;
import java.util.Objects;
import java.util.Set;
public class CommandManager {
private final Map<UltiToolsPlugin, List<Command>> commandListMap = new HashMap<>();
/**
* @CmdExecutor
*
* @param plugin
* @param clazz
* @param permission
* @param description
* @param aliases
*/
public void register(UltiToolsPlugin plugin, Class<? extends CommandExecutor> clazz, String permission, String description, String... aliases) {
CommandExecutor commandExecutor = UltiTools.getInstance().getContext().getBean(clazz);
register(plugin, commandExecutor, permission, description, aliases);
}
/**
*
*
* @param plugin
* @param commandExecutor
* @param permission
* @param description
* @param aliases
*/
private void register(UltiToolsPlugin plugin, CommandExecutor commandExecutor, String permission, String description, String... aliases) {
register(commandExecutor, permission, plugin.i18n(description), aliases);
public void register(CommandExecutor commandExecutor, String permission, String description, String... aliases) {
PluginCommand command = getCommand(aliases[0], UltiTools.getInstance());
commandListMap.computeIfAbsent(plugin, k -> new ArrayList<>());
List<Command> commands = commandListMap.get(plugin);
if (!commands.contains(command)) {
commands.add(command);
}
}
/**
* @CmdExecutor
*
* @param plugin
* @param clazz
*/
public void register(UltiToolsPlugin plugin, Class<? extends CommandExecutor> clazz) {
CommandExecutor commandExecutor = plugin.getContext().getBean(clazz);
register(plugin, commandExecutor);
command.setAliases(Arrays.asList(aliases));
command.setPermission(permission);
command.setDescription(description);
getCommandMap().register(UltiTools.getInstance().getDescription().getName(), command);
command.setExecutor(commandExecutor);
}
/**
*
*
* @param plugin
* @param commandExecutor
*/
private void register(UltiToolsPlugin plugin, CommandExecutor commandExecutor) {
Class<? extends CommandExecutor> clazz = commandExecutor.getClass();
if (clazz.isAnnotationPresent(CmdExecutor.class)) {
CmdExecutor cmdExecutor = clazz.getAnnotation(CmdExecutor.class);
register(commandExecutor, cmdExecutor.permission(), plugin.i18n(cmdExecutor.description()), cmdExecutor.alias());
return;
} else {
Bukkit.getLogger().warning("CommandExecutor " + clazz.getName() + " is not annotated with @CmdExecutor, please use legacy method to register command.");
}
public void register(UltiToolsPlugin plugin, CommandExecutor commandExecutor) {
plugin.getContext().getAutowireCapableBeanFactory().autowireBean(commandExecutor);
register(commandExecutor);
}
public void unregister(String name) {
PluginCommand command = getCommand(name, UltiTools.getInstance());
command.unregister(getCommandMap());
}
public void registerAll(UltiToolsPlugin plugin, String packageName) {
Set<Class<?>> classes = PackageScanUtils.scanAnnotatedClasses(
CmdExecutor.class,
@ -104,44 +60,6 @@ public class CommandManager {
}
}
public void registerAll(UltiToolsPlugin plugin) {
for (String cmdBean : plugin.getContext().getBeanNamesForType(CommandExecutor.class)) {
CommandExecutor commandExecutor = plugin.getContext().getBean(cmdBean, CommandExecutor.class);
if (commandExecutor.getClass().getAnnotation(CmdExecutor.class).manualRegister()) continue;
register(plugin, commandExecutor);
}
}
public void unregister(String name) {
PluginCommand command = getCommand(name, UltiTools.getInstance());
command.unregister(getCommandMap());
}
public void unregisterAll(UltiToolsPlugin plugin) {
List<Command> commands = commandListMap.get(plugin);
if (commands == null) return;
for (Command command : commands) {
unregister(command.getName());
}
}
public void close() {
for (UltiToolsPlugin plugin : commandListMap.keySet()) {
unregisterAll(plugin);
}
}
@Deprecated
public void register(CommandExecutor commandExecutor, String permission, String description, String... aliases) {
PluginCommand command = getCommand(aliases[0], UltiTools.getInstance());
command.setAliases(Arrays.asList(aliases));
command.setPermission(permission);
command.setDescription(description);
getCommandMap().register(UltiTools.getInstance().getDescription().getName(), command);
command.setExecutor(commandExecutor);
}
@Deprecated
public void register(CommandExecutor commandExecutor) {
Class<? extends CommandExecutor> clazz = commandExecutor.getClass();

@ -23,7 +23,7 @@ public class DataStoreManager {
}
public static void close() {
Bukkit.getLogger().log(Level.INFO, "[UltiTools-API] Unregistering all data operators...");
Bukkit.getLogger().log(Level.INFO, "Unregistering all data operators...");
for (DataStore dataStore : dataMap.values()) {
dataStore.destroyAllOperators();
}

@ -14,12 +14,6 @@ import java.util.*;
public class ListenerManager {
private final Map<UltiToolsPlugin, List<Listener>> listenerListMap = new HashMap<>();
public void register(UltiToolsPlugin plugin, Class<? extends Listener> listenerClass) {
Listener listener = plugin.getContext().getBean(listenerClass);
register(plugin, listener);
}
@Deprecated
public void register(UltiToolsPlugin plugin, Listener listener) {
listenerListMap.computeIfAbsent(plugin, k -> new ArrayList<>());
Bukkit.getServer().getPluginManager().registerEvents(listener, UltiTools.getInstance());
@ -48,14 +42,6 @@ public class ListenerManager {
}
}
public void registerAll(UltiToolsPlugin plugin) {
for (String listenerBean : plugin.getContext().getBeanNamesForType(Listener.class)) {
Listener listener = plugin.getContext().getBean(listenerBean, Listener.class);
if (listener.getClass().getAnnotation(EventListener.class).manualRegister()) continue;
register(plugin, listener);
}
}
public void unregister(Listener listener) {
HandlerList.unregisterAll(listener);
}

@ -9,15 +9,11 @@ import com.ultikits.ultitools.utils.CommonUtils;
import lombok.Getter;
import org.bukkit.Bukkit;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.core.annotation.AnnotationUtils;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.net.URLDecoder;
import java.net.*;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
@ -33,7 +29,7 @@ public class PluginManager {
public void init() throws IOException {
String currentPath = System.getProperty("user.dir");
String path = currentPath + File.separator + "plugins" + File.separator + "UltiTools" + File.separator + "plugins";
String path = currentPath+ File.separator + "plugins" + File.separator + "UltiTools" + File.separator + "plugins";
File pluginFolder = new File(path);
File[] plugins = pluginFolder.listFiles((file) -> file.getName().endsWith(".jar"));
@ -84,7 +80,7 @@ public class PluginManager {
}
boolean result = invokeRegisterSelf(plugin);
if (result) {
registerBukkit(plugin, true);
registerBukkit(plugin);
}
return result;
}
@ -112,7 +108,7 @@ public class PluginManager {
}
boolean result = invokeRegisterSelf(plugin);
if (result) {
registerBukkit(plugin, false);
registerBukkit(plugin);
}
return result;
}
@ -142,7 +138,7 @@ public class PluginManager {
}
boolean result = invokeRegisterSelf(plugin);
if (result) {
registerBukkit(plugin, false);
registerBukkit(plugin);
}
return result;
}
@ -178,10 +174,7 @@ public class PluginManager {
try {
@SuppressWarnings("resource")
URLClassLoader classLoader = new URLClassLoader(
new URL[]{
new URL(URLDecoder.decode(pluginJar.toURI().toASCIIString(), "UTF-8")),
CommonUtils.getServerJar()
},
new URL[]{new URL(URLDecoder.decode(pluginJar.toURI().toASCIIString(), "UTF-8"))},
UltiTools.getInstance().getPluginClassLoader()
);
try (JarFile jarFile = new JarFile(pluginJar)) {
@ -218,21 +211,6 @@ public class PluginManager {
private boolean invokeRegisterSelf(UltiToolsPlugin plugin) {
for (UltiToolsPlugin plugin1 : pluginList) {
if (!plugin1.getMainClass().equals(plugin.getMainClass())) {
continue;
}
if (plugin1.isNewerVersionThan(plugin)) {
Bukkit.getLogger().log(
Level.WARNING,
String.format("[UltiTools-API] %s load failedThere is already a new version", plugin.getPluginName())
);
plugin.getContext().close();
return false;
} else if (plugin.isNewerVersionThan(plugin1)) {
plugin1.unregisterSelf();
}
}
if (plugin.getMinUltiToolsVersion() > UltiTools.getPluginVersion()) {
Bukkit.getLogger().log(
Level.WARNING,
@ -243,6 +221,7 @@ public class PluginManager {
}
try {
boolean registerSelf = plugin.registerSelf();
registerBukkit(plugin);
if (registerSelf) {
pluginList.add(plugin);
Bukkit.getLogger().log(
@ -265,14 +244,10 @@ public class PluginManager {
}
private UltiToolsPlugin initializePlugin(Class<? extends UltiToolsPlugin> pluginClass, Object... constructorArgs) {
URLClassLoader urlClassLoader = new URLClassLoader(
new URL[]{CommonUtils.getServerJar()},
pluginClass.getClassLoader()
);
AnnotationConfigApplicationContext pluginContext = new AnnotationConfigApplicationContext();
pluginContext.setParent(UltiTools.getInstance().getContext());
pluginContext.registerShutdownHook();
pluginContext.setClassLoader(urlClassLoader);
pluginContext.setClassLoader(pluginClass.getClassLoader());
pluginContext.registerBean(pluginClass, constructorArgs);
pluginContext.refresh();
UltiToolsPlugin plugin = pluginContext.getBean(pluginClass);
@ -282,26 +257,18 @@ public class PluginManager {
return plugin;
}
private void registerBukkit(UltiToolsPlugin plugin, boolean flag) {
EnableAutoRegister annotation = AnnotationUtils.findAnnotation(plugin.getClass(), EnableAutoRegister.class);
if (annotation == null) {
private void registerBukkit(UltiToolsPlugin plugin) {
if (!plugin.getClass().isAnnotationPresent(EnableAutoRegister.class)) {
return;
}
EnableAutoRegister annotation = plugin.getClass().getAnnotation(EnableAutoRegister.class);
String[] packages = CommonUtils.getPluginPackages(plugin);
for (String packageName : packages) {
if (annotation.cmdExecutor()) {
if (flag) {
UltiTools.getInstance().getCommandManager().registerAll(plugin);
} else {
UltiTools.getInstance().getCommandManager().registerAll(plugin, packageName);
}
UltiTools.getInstance().getCommandManager().registerAll(plugin, packageName);
}
if (annotation.eventListener()) {
if (flag) {
UltiTools.getInstance().getListenerManager().registerAll(plugin);
} else {
UltiTools.getInstance().getListenerManager().registerAll(plugin, packageName);
}
UltiTools.getInstance().getListenerManager().registerAll(plugin, packageName);
}
}
}

@ -6,16 +6,12 @@ import cn.hutool.json.JSONUtil;
import com.ultikits.ultitools.UltiTools;
import com.ultikits.ultitools.abstracts.UltiToolsPlugin;
import com.ultikits.ultitools.annotations.EnableAutoRegister;
import org.bukkit.Bukkit;
import org.springframework.context.annotation.ComponentScan;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.security.CodeSource;
import java.security.ProtectionDomain;
public class CommonUtils {
@ -58,12 +54,4 @@ public class CommonUtils {
return packages;
}
public static URL getServerJar() {
ProtectionDomain protectionDomain = Bukkit.class.getProtectionDomain();
CodeSource codeSource = protectionDomain.getCodeSource();
if (codeSource == null) {
return null;
}
return codeSource.getLocation();
}
}

@ -1,713 +0,0 @@
package com.ultikits.ultitools.utils;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.JsonPrimitive;
import org.bukkit.Bukkit;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.RegisteredServiceProvider;
import org.bukkit.plugin.ServicePriority;
import javax.net.ssl.HttpsURLConnection;
import java.io.*;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.concurrent.Callable;
import java.util.logging.Level;
import java.util.zip.GZIPOutputStream;
/**
* bStats collects some data for plugin authors.
* <p>
* Check out https://bStats.org/ to learn more about bStats!
*/
@SuppressWarnings({"WeakerAccess", "unused"})
public class Metrics {
// The version of this bStats class
public static final int B_STATS_VERSION = 1;
// The url to which the data is sent
private static final String URL = "https://bStats.org/submitData/bukkit";
// Should failed requests be logged?
private static boolean logFailedRequests;
// Should the sent data be logged?
private static boolean logSentData;
// Should the response text be logged?
private static boolean logResponseStatusText;
// The uuid of the server
private static String serverUUID;
static {
// You can use the property to disable the check in your test environment
if (System.getProperty("bstats.relocatecheck") == null || !System.getProperty("bstats.relocatecheck").equals("false")) {
// Maven's Relocate is clever and changes strings, too. So we have to use this little "trick" ... :D
final String defaultPackage = new String(
new byte[]{'o', 'r', 'g', '.', 'b', 's', 't', 'a', 't', 's', '.', 'b', 'u', 'k', 'k', 'i', 't'});
final String examplePackage = new String(new byte[]{'y', 'o', 'u', 'r', '.', 'p', 'a', 'c', 'k', 'a', 'g', 'e'});
}
}
// The plugin
private final Plugin plugin;
// The plugin id
private final int pluginId;
// A list with all custom charts
private final List<CustomChart> charts = new ArrayList<>();
// Is bStats enabled on this server?
private boolean enabled;
/**
* Class constructor.
*
* @param plugin The plugin which stats should be submitted.
* @param pluginId The id of the plugin.
* It can be found at <a href="https://bstats.org/what-is-my-plugin-id">What is my plugin id?</a>
*/
public Metrics(Plugin plugin, int pluginId) {
if (plugin == null) {
throw new IllegalArgumentException("Plugin cannot be null!");
}
this.plugin = plugin;
this.pluginId = pluginId;
// Get the config file
File bStatsFolder = new File(plugin.getDataFolder().getParentFile(), "bStats");
File configFile = new File(bStatsFolder, "config.yml");
YamlConfiguration config = YamlConfiguration.loadConfiguration(configFile);
// Check if the config file exists
if (!config.isSet("serverUuid")) {
// Add default values
config.addDefault("enabled", true);
// Every server gets it's unique random id.
config.addDefault("serverUuid", UUID.randomUUID().toString());
// Should failed request be logged?
config.addDefault("logFailedRequests", false);
// Should the sent data be logged?
config.addDefault("logSentData", false);
// Should the response text be logged?
config.addDefault("logResponseStatusText", false);
// Inform the server owners about bStats
config.options().header(
"bStats collects some data for plugin authors like how many servers are using their plugins.\n" +
"To honor their work, you should not disable it.\n" +
"This has nearly no effect on the server performance!\n" +
"Check out https://bStats.org/ to learn more :)"
).copyDefaults(true);
try {
config.save(configFile);
} catch (IOException ignored) {
}
}
// Load the data
enabled = config.getBoolean("enabled", true);
serverUUID = config.getString("serverUuid");
logFailedRequests = config.getBoolean("logFailedRequests", false);
logSentData = config.getBoolean("logSentData", false);
logResponseStatusText = config.getBoolean("logResponseStatusText", false);
if (enabled) {
boolean found = false;
// Search for all other bStats Metrics classes to see if we are the first one
for (Class<?> service : Bukkit.getServicesManager().getKnownServices()) {
try {
service.getField("B_STATS_VERSION"); // Our identifier :)
found = true; // We aren't the first
break;
} catch (NoSuchFieldException ignored) {
}
}
// Register our service
Bukkit.getServicesManager().register(Metrics.class, this, plugin, ServicePriority.Normal);
if (!found) {
// We are the first!
startSubmitting();
}
}
}
/**
* Sends the data to the bStats server.
*
* @param plugin Any plugin. It's just used to get a logger instance.
* @param data The data to send.
* @throws Exception If the request failed.
*/
private static void sendData(Plugin plugin, JsonObject data) throws Exception {
if (data == null) {
throw new IllegalArgumentException("Data cannot be null!");
}
if (Bukkit.isPrimaryThread()) {
throw new IllegalAccessException("This method must not be called from the main thread!");
}
if (logSentData) {
plugin.getLogger().info("Sending data to bStats: " + data);
}
HttpsURLConnection connection = (HttpsURLConnection) new URL(URL).openConnection();
// Compress the data to save bandwidth
byte[] compressedData = compress(data.toString());
// Add headers
connection.setRequestMethod("POST");
connection.addRequestProperty("Accept", "application/json");
connection.addRequestProperty("Connection", "close");
connection.addRequestProperty("Content-Encoding", "gzip"); // We gzip our request
connection.addRequestProperty("Content-Length", String.valueOf(compressedData.length));
connection.setRequestProperty("Content-Type", "application/json"); // We send our data in JSON format
connection.setRequestProperty("User-Agent", "MC-Server/" + B_STATS_VERSION);
// Send data
connection.setDoOutput(true);
try (DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream())) {
outputStream.write(compressedData);
}
StringBuilder builder = new StringBuilder();
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
String line;
while ((line = bufferedReader.readLine()) != null) {
builder.append(line);
}
}
if (logResponseStatusText) {
plugin.getLogger().info("Sent data to bStats and received response: " + builder);
}
}
/**
* Gzips the given String.
*
* @param str The string to gzip.
* @return The gzipped String.
* @throws IOException If the compression failed.
*/
private static byte[] compress(final String str) throws IOException {
if (str == null) {
return null;
}
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try (GZIPOutputStream gzip = new GZIPOutputStream(outputStream)) {
gzip.write(str.getBytes(StandardCharsets.UTF_8));
}
return outputStream.toByteArray();
}
/**
* Checks if bStats is enabled.
*
* @return Whether bStats is enabled or not.
*/
public boolean isEnabled() {
return enabled;
}
/**
* Adds a custom chart.
*
* @param chart The chart to add.
*/
public void addCustomChart(CustomChart chart) {
if (chart == null) {
throw new IllegalArgumentException("Chart cannot be null!");
}
charts.add(chart);
}
/**
* Starts the Scheduler which submits our data every 30 minutes.
*/
private void startSubmitting() {
final Timer timer = new Timer(true); // We use a timer cause the Bukkit scheduler is affected by server lags
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
if (!plugin.isEnabled()) { // Plugin was disabled
timer.cancel();
return;
}
// Nevertheless we want our code to run in the Bukkit main thread, so we have to use the Bukkit scheduler
// Don't be afraid! The connection to the bStats server is still async, only the stats collection is sync ;)
Bukkit.getScheduler().runTask(plugin, () -> submitData());
}
}, 1000 * 60 * 5, 1000 * 60 * 30);
// Submit the data every 30 minutes, first time after 5 minutes to give other plugins enough time to start
// WARNING: Changing the frequency has no effect but your plugin WILL be blocked/deleted!
// WARNING: Just don't do it!
}
/**
* Gets the plugin specific data.
* This method is called using Reflection.
*
* @return The plugin specific data.
*/
public JsonObject getPluginData() {
JsonObject data = new JsonObject();
String pluginName = plugin.getDescription().getName();
String pluginVersion = plugin.getDescription().getVersion();
data.addProperty("pluginName", pluginName); // Append the name of the plugin
data.addProperty("id", pluginId); // Append the id of the plugin
data.addProperty("pluginVersion", pluginVersion); // Append the version of the plugin
JsonArray customCharts = new JsonArray();
for (CustomChart customChart : charts) {
// Add the data of the custom charts
JsonObject chart = customChart.getRequestJsonObject();
if (chart == null) { // If the chart is null, we skip it
continue;
}
customCharts.add(chart);
}
data.add("customCharts", customCharts);
return data;
}
/**
* Gets the server specific data.
*
* @return The server specific data.
*/
private JsonObject getServerData() {
// Minecraft specific data
int playerAmount;
try {
// Around MC 1.8 the return type was changed to a collection from an array,
// This fixes java.lang.NoSuchMethodError: org.bukkit.Bukkit.getOnlinePlayers()Ljava/util/Collection;
Method onlinePlayersMethod = Class.forName("org.bukkit.Server").getMethod("getOnlinePlayers");
playerAmount = onlinePlayersMethod.getReturnType().equals(Collection.class)
? ((Collection<?>) onlinePlayersMethod.invoke(Bukkit.getServer())).size()
: ((Player[]) onlinePlayersMethod.invoke(Bukkit.getServer())).length;
} catch (Exception e) {
playerAmount = Bukkit.getOnlinePlayers().size(); // Just use the new method if the Reflection failed
}
int onlineMode = Bukkit.getOnlineMode() ? 1 : 0;
String bukkitVersion = Bukkit.getVersion();
String bukkitName = Bukkit.getName();
// OS/Java specific data
String javaVersion = System.getProperty("java.version");
String osName = System.getProperty("os.name");
String osArch = System.getProperty("os.arch");
String osVersion = System.getProperty("os.version");
int coreCount = Runtime.getRuntime().availableProcessors();
JsonObject data = new JsonObject();
data.addProperty("serverUUID", serverUUID);
data.addProperty("playerAmount", playerAmount);
data.addProperty("onlineMode", onlineMode);
data.addProperty("bukkitVersion", bukkitVersion);
data.addProperty("bukkitName", bukkitName);
data.addProperty("javaVersion", javaVersion);
data.addProperty("osName", osName);
data.addProperty("osArch", osArch);
data.addProperty("osVersion", osVersion);
data.addProperty("coreCount", coreCount);
return data;
}
/**
* Collects the data and sends it afterwards.
*/
private void submitData() {
final JsonObject data = getServerData();
JsonArray pluginData = new JsonArray();
// Search for all other bStats Metrics classes to get their plugin data
for (Class<?> service : Bukkit.getServicesManager().getKnownServices()) {
try {
service.getField("B_STATS_VERSION"); // Our identifier :)
for (RegisteredServiceProvider<?> provider : Bukkit.getServicesManager().getRegistrations(service)) {
try {
Object plugin = provider.getService().getMethod("getPluginData").invoke(provider.getProvider());
if (plugin instanceof JsonObject) {
pluginData.add((JsonObject) plugin);
} else { // old bstats version compatibility
try {
Class<?> jsonObjectJsonSimple = Class.forName("org.json.simple.JSONObject");
if (plugin.getClass().isAssignableFrom(jsonObjectJsonSimple)) {
Method jsonStringGetter = jsonObjectJsonSimple.getDeclaredMethod("toJSONString");
jsonStringGetter.setAccessible(true);
String jsonString = (String) jsonStringGetter.invoke(plugin);
JsonObject object = new JsonParser().parse(jsonString).getAsJsonObject();
pluginData.add(object);
}
} catch (ClassNotFoundException e) {
// minecraft version 1.14+
if (logFailedRequests) {
this.plugin.getLogger().log(Level.SEVERE, "Encountered unexpected exception", e);
}
}
}
} catch (NullPointerException | NoSuchMethodException | IllegalAccessException |
InvocationTargetException ignored) {
}
}
} catch (NoSuchFieldException ignored) {
}
}
data.add("plugins", pluginData);
// Create a new thread for the connection to the bStats server
new Thread(() -> {
try {
// Send the data
sendData(plugin, data);
} catch (Exception e) {
// Something went wrong! :(
if (logFailedRequests) {
plugin.getLogger().log(Level.WARNING, "Could not submit plugin stats of " + plugin.getName(), e);
}
}
}).start();
}
/**
* Represents a custom chart.
*/
public static abstract class CustomChart {
// The id of the chart
final String chartId;
/**
* Class constructor.
*
* @param chartId The id of the chart.
*/
CustomChart(String chartId) {
if (chartId == null || chartId.isEmpty()) {
throw new IllegalArgumentException("ChartId cannot be null or empty!");
}
this.chartId = chartId;
}
private JsonObject getRequestJsonObject() {
JsonObject chart = new JsonObject();
chart.addProperty("chartId", chartId);
try {
JsonObject data = getChartData();
if (data == null) {
// If the data is null we don't send the chart.
return null;
}
chart.add("data", data);
} catch (Throwable t) {
if (logFailedRequests) {
Bukkit.getLogger().log(Level.WARNING, "Failed to get data for custom chart with id " + chartId, t);
}
return null;
}
return chart;
}
protected abstract JsonObject getChartData() throws Exception;
}
/**
* Represents a custom simple pie.
*/
public static class SimplePie extends CustomChart {
private final Callable<String> callable;
/**
* Class constructor.
*
* @param chartId The id of the chart.
* @param callable The callable which is used to request the chart data.
*/
public SimplePie(String chartId, Callable<String> callable) {
super(chartId);
this.callable = callable;
}
@Override
protected JsonObject getChartData() throws Exception {
JsonObject data = new JsonObject();
String value = callable.call();
if (value == null || value.isEmpty()) {
// Null = skip the chart
return null;
}
data.addProperty("value", value);
return data;
}
}
/**
* Represents a custom advanced pie.
*/
public static class AdvancedPie extends CustomChart {
private final Callable<Map<String, Integer>> callable;
/**
* Class constructor.
*
* @param chartId The id of the chart.
* @param callable The callable which is used to request the chart data.
*/
public AdvancedPie(String chartId, Callable<Map<String, Integer>> callable) {
super(chartId);
this.callable = callable;
}
@Override
protected JsonObject getChartData() throws Exception {
JsonObject data = new JsonObject();
JsonObject values = new JsonObject();
Map<String, Integer> map = callable.call();
if (map == null || map.isEmpty()) {
// Null = skip the chart
return null;
}
boolean allSkipped = true;
for (Map.Entry<String, Integer> entry : map.entrySet()) {
if (entry.getValue() == 0) {
continue; // Skip this invalid
}
allSkipped = false;
values.addProperty(entry.getKey(), entry.getValue());
}
if (allSkipped) {
// Null = skip the chart
return null;
}
data.add("values", values);
return data;
}
}
/**
* Represents a custom drilldown pie.
*/
public static class DrilldownPie extends CustomChart {
private final Callable<Map<String, Map<String, Integer>>> callable;
/**
* Class constructor.
*
* @param chartId The id of the chart.
* @param callable The callable which is used to request the chart data.
*/
public DrilldownPie(String chartId, Callable<Map<String, Map<String, Integer>>> callable) {
super(chartId);
this.callable = callable;
}
@Override
public JsonObject getChartData() throws Exception {
JsonObject data = new JsonObject();
JsonObject values = new JsonObject();
Map<String, Map<String, Integer>> map = callable.call();
if (map == null || map.isEmpty()) {
// Null = skip the chart
return null;
}
boolean reallyAllSkipped = true;
for (Map.Entry<String, Map<String, Integer>> entryValues : map.entrySet()) {
JsonObject value = new JsonObject();
boolean allSkipped = true;
for (Map.Entry<String, Integer> valueEntry : map.get(entryValues.getKey()).entrySet()) {
value.addProperty(valueEntry.getKey(), valueEntry.getValue());
allSkipped = false;
}
if (!allSkipped) {
reallyAllSkipped = false;
values.add(entryValues.getKey(), value);
}
}
if (reallyAllSkipped) {
// Null = skip the chart
return null;
}
data.add("values", values);
return data;
}
}
/**
* Represents a custom single line chart.
*/
public static class SingleLineChart extends CustomChart {
private final Callable<Integer> callable;
/**
* Class constructor.
*
* @param chartId The id of the chart.
* @param callable The callable which is used to request the chart data.
*/
public SingleLineChart(String chartId, Callable<Integer> callable) {
super(chartId);
this.callable = callable;
}
@Override
protected JsonObject getChartData() throws Exception {
JsonObject data = new JsonObject();
int value = callable.call();
if (value == 0) {
// Null = skip the chart
return null;
}
data.addProperty("value", value);
return data;
}
}
/**
* Represents a custom multi line chart.
*/
public static class MultiLineChart extends CustomChart {
private final Callable<Map<String, Integer>> callable;
/**
* Class constructor.
*
* @param chartId The id of the chart.
* @param callable The callable which is used to request the chart data.
*/
public MultiLineChart(String chartId, Callable<Map<String, Integer>> callable) {
super(chartId);
this.callable = callable;
}
@Override
protected JsonObject getChartData() throws Exception {
JsonObject data = new JsonObject();
JsonObject values = new JsonObject();
Map<String, Integer> map = callable.call();
if (map == null || map.isEmpty()) {
// Null = skip the chart
return null;
}
boolean allSkipped = true;
for (Map.Entry<String, Integer> entry : map.entrySet()) {
if (entry.getValue() == 0) {
continue; // Skip this invalid
}
allSkipped = false;
values.addProperty(entry.getKey(), entry.getValue());
}
if (allSkipped) {
// Null = skip the chart
return null;
}
data.add("values", values);
return data;
}
}
/**
* Represents a custom simple bar chart.
*/
public static class SimpleBarChart extends CustomChart {
private final Callable<Map<String, Integer>> callable;
/**
* Class constructor.
*
* @param chartId The id of the chart.
* @param callable The callable which is used to request the chart data.
*/
public SimpleBarChart(String chartId, Callable<Map<String, Integer>> callable) {
super(chartId);
this.callable = callable;
}
@Override
protected JsonObject getChartData() throws Exception {
JsonObject data = new JsonObject();
JsonObject values = new JsonObject();
Map<String, Integer> map = callable.call();
if (map == null || map.isEmpty()) {
// Null = skip the chart
return null;
}
for (Map.Entry<String, Integer> entry : map.entrySet()) {
JsonArray categoryValues = new JsonArray();
categoryValues.add(new JsonPrimitive(entry.getValue()));
values.add(entry.getKey(), categoryValues);
}
data.add("values", values);
return data;
}
}
/**
* Represents a custom advanced bar chart.
*/
public static class AdvancedBarChart extends CustomChart {
private final Callable<Map<String, int[]>> callable;
/**
* Class constructor.
*
* @param chartId The id of the chart.
* @param callable The callable which is used to request the chart data.
*/
public AdvancedBarChart(String chartId, Callable<Map<String, int[]>> callable) {
super(chartId);
this.callable = callable;
}
@Override
protected JsonObject getChartData() throws Exception {
JsonObject data = new JsonObject();
JsonObject values = new JsonObject();
Map<String, int[]> map = callable.call();
if (map == null || map.isEmpty()) {
// Null = skip the chart
return null;
}
boolean allSkipped = true;
for (Map.Entry<String, int[]> entry : map.entrySet()) {
if (entry.getValue().length == 0) {
continue; // Skip this invalid
}
allSkipped = false;
JsonArray categoryValues = new JsonArray();
for (int categoryValue : entry.getValue()) {
categoryValues.add(new JsonPrimitive(categoryValue));
}
values.add(entry.getKey(), categoryValues);
}
if (allSkipped) {
// Null = skip the chart
return null;
}
data.add("values", values);
return data;
}
}
}

@ -1,36 +1,38 @@
# This file is used to store environment variables
version: ${project.version}
api-url: "https://api.v2.ultikits.com"
oss-url: "https://ultitools.oss-cn-shanghai.aliyuncs.com"
lib-path: "/lib/"
libraries:
- "advancedslot-4.3.0.jar"
- "adventure-api-4.13.1.jar"
- "adventure-key-4.13.1.jar"
- "adventure-nbt-4.13.1.jar"
- "adventure-platform-api-4.3.2.jar"
- "adventure-platform-bukkit-4.3.2.jar"
- "adventure-platform-facet-4.3.2.jar"
- "adventure-platform-viaversion-4.3.2.jar"
- "adventure-text-serializer-bungeecord-4.3.2.jar"
- "adventure-text-serializer-gson-4.13.1.jar"
- "adventure-text-serializer-gson-legacy-impl-4.13.1.jar"
- "adventure-text-serializer-legacy-4.13.1.jar"
- "annotations-23.0.0.jar"
- "configurablegui-4.3.0.jar"
- "core-4.3.0.jar"
- "advancedslot-4.1.13.jar"
- "adventure-api-4.13.0.jar"
- "adventure-key-4.13.0.jar"
- "adventure-nbt-4.13.0.jar"
- "adventure-platform-api-4.3.0.jar"
- "adventure-platform-bukkit-4.3.0.jar"
- "adventure-platform-facet-4.3.0.jar"
- "adventure-platform-viaversion-4.3.0.jar"
- "adventure-text-serializer-bungeecord-4.3.0.jar"
- "adventure-text-serializer-gson-4.13.0.jar"
- "adventure-text-serializer-gson-legacy-impl-4.13.0.jar"
- "adventure-text-serializer-legacy-4.13.0.jar"
- "annotations-24.0.1.jar"
- "bukkit-1.13.1-R0.1-SNAPSHOT.jar"
- "bungeecord-chat-1.16-R0.4.jar"
- "checker-qual-3.12.0.jar"
- "commons-lang-2.6.jar"
- "configurablegui-4.1.13.jar"
- "core-4.1.13.jar"
- "error_prone_annotations-2.11.0.jar"
- "examination-api-1.3.0.jar"
- "examination-string-1.3.0.jar"
- "failureaccess-1.0.1.jar"
- "fastjson-1.2.83.jar"
- "hutool-cache-5.8.25.jar"
- "hutool-core-5.8.25.jar"
- "hutool-cron-5.8.25.jar"
- "hutool-crypto-5.8.25.jar"
- "hutool-db-5.8.25.jar"
- "hutool-http-5.8.25.jar"
- "hutool-json-5.8.25.jar"
- "hutool-log-5.8.25.jar"
- "hutool-setting-5.8.25.jar"
- "gson-2.10.jar"
- "guava-31.1-jre.jar"
- "hamcrest-core-1.1.jar"
- "hutool-all-5.8.20.jar"
- "j2objc-annotations-1.3.jar"
- "javax.servlet-api-3.1.0.jar"
- "jetty-client-9.4.48.v20220622.jar"
- "jetty-http-9.4.48.v20220622.jar"
@ -42,12 +44,21 @@ libraries:
- "jetty-util-ajax-9.4.48.v20220622.jar"
- "jetty-webapp-9.4.48.v20220622.jar"
- "jetty-xml-9.4.48.v20220622.jar"
- "obliviate-invs-4.3.0.jar"
- "json-simple-1.1.1.jar"
- "jsr305-3.0.2.jar"
- "junit-4.10.jar"
- "listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar"
- "lombok-1.18.24.jar"
- "mysql-connector-j-8.0.33.jar"
- "obliviate-invs-4.1.13.jar"
- "obliviate-utils-2.0.5.jar"
- "pagination-4.3.0.jar"
- "pagination-4.1.13.jar"
- "placeholder-2.0.5.jar"
- "protobuf-java-3.21.9.jar"
- "slf4j-api-1.7.25.jar"
- "snakeyaml-1.33.jar"
- "spark-core-2.9.4.jar"
- "spigot-api-1.19.3-R0.1-SNAPSHOT.jar"
- "spring-aop-5.3.31.jar"
- "spring-beans-5.3.31.jar"
- "spring-context-5.3.31.jar"
@ -55,10 +66,10 @@ libraries:
- "spring-expression-5.3.31.jar"
- "spring-jcl-5.3.31.jar"
- "string-2.0.5.jar"
- "UniversalScheduler-0.1.6.jar"
- "VaultAPI-1.7.jar"
- "version-detection-2.0.5.jar"
- "websocket-api-9.4.48.v20220622.jar"
- "websocket-client-9.4.48.v20220622.jar"
- "websocket-common-9.4.48.v20220622.jar"
- "websocket-server-9.4.48.v20220622.jar"
- "websocket-servlet-9.4.48.v20220622.jar"
- "websocket-servlet-9.4.48.v20220622.jar"

@ -28,7 +28,7 @@
" 简介:": " Intro:",
"======== 第%d页 ========": "======== Page %d ========",
"安装失败!": "Install Failed!",
"安装成功!请重启服务器!请务必删除旧版本模块!": "Installed! Please restart the server! Please be sure to delete the old version module!",
"安装成功!请重启服务器!": "Installed! Please restart the server!",
"========|插件安装帮助|========": "========|Plugin Install Help|========",
"/upm list [页数] - 查看可用插件列表": "/upm list [page] - View available plugin list",
"/upm install [插件] - 安装最新插件": "/upm install [plugin] - Install latest plugin",

@ -4,8 +4,5 @@ main: com.ultikits.ultitools.UltiTools
api-version: 1.13
prefix: UltiTools
authors: [ wisdomme ]
load: POSTWORLD
load: STARTUP
depend: [ Vault, PlaceholderAPI ]
softdepend:
- Vault
- PlaceholderAPI

Loading…
Cancel
Save