├── src ├── main │ ├── resources │ │ ├── banlist.yml │ │ ├── chestData.yml │ │ ├── lobby.yml │ │ ├── whitelist.yml │ │ ├── sideBarData.yml │ │ ├── zh_motd.yml │ │ ├── zh_chestlock.yml │ │ ├── en_motd.yml │ │ ├── zh_command-alias.yml │ │ ├── en_chestlock.yml │ │ ├── zh_bag.yml │ │ ├── playerlist.yml │ │ ├── zh_tab-bar.yml │ │ ├── zh_trade.yml │ │ ├── en_command-alias.yml │ │ ├── zh_home.yml │ │ ├── zh_chat.yml │ │ ├── en_bag.yml │ │ ├── en_tab-bar.yml │ │ ├── plugin.yml │ │ ├── en_trade.yml │ │ ├── en_chat.yml │ │ ├── en_home.yml │ │ ├── zh_worlds.yml │ │ ├── zh_joinwelcome.yml │ │ ├── en_worlds.yml │ │ ├── zh_recipe.yml │ │ ├── zh_login.yml │ │ ├── en_recipe.yml │ │ ├── en_joinwelcome.yml │ │ ├── zh_sidebar.yml │ │ ├── zh_cleaner.yml │ │ ├── zh_death.yml │ │ ├── en_login.yml │ │ ├── en_sidebar.yml │ │ ├── en_death.yml │ │ ├── zh_announcement.yml │ │ ├── zh_customgui.yml │ │ ├── en_cleaner.yml │ │ ├── en_customgui.yml │ │ ├── en_announcement.yml │ │ ├── zh_kits.yml │ │ └── en_kits.yml │ └── java │ │ └── com │ │ └── ultikits │ │ └── ultitools │ │ ├── enums │ │ ├── EmailResponse.java │ │ ├── PermissionsEnum.java │ │ ├── LoginRegisterEnum.java │ │ ├── CleanTypeEnum.java │ │ └── ConfigsEnum.java │ │ ├── utils │ │ ├── VersionUtils.java │ │ ├── LanguageUtils.java │ │ ├── SilentOpenUtils.java │ │ ├── CustomGuiUtils.java │ │ ├── WorldUtils.java │ │ ├── HomeUtils.java │ │ ├── DeathPunishUtils.java │ │ ├── TimeUtils.java │ │ ├── FunctionUtils.java │ │ └── YamlFileUtils.java │ │ ├── config │ │ ├── RecipeConfig.java │ │ ├── KitsConfig.java │ │ ├── BagConfig.java │ │ ├── MOTDConfig.java │ │ ├── ChatConfig.java │ │ ├── CustomerGUIConfig.java │ │ ├── MultiworldsConfig.java │ │ ├── MainConfig.java │ │ ├── TradeConfig.java │ │ ├── HomeConfig.java │ │ ├── TabBarConfig.java │ │ ├── LoginConfig.java │ │ ├── CleanerConfig.java │ │ ├── DeathPunishConfig.java │ │ ├── ChestLockConfig.java │ │ ├── GlobuleGroupsConfig.java │ │ ├── JoinWelcomeConfig.java │ │ ├── ChestDataConfig.java │ │ ├── WhiteListConfig.java │ │ ├── UserPermissionConfig.java │ │ ├── SideBarDataConfig.java │ │ ├── SideBarConfig.java │ │ ├── GroupPermissionConfig.java │ │ ├── ConfigController.java │ │ ├── AbstractConfig.java │ │ └── AbstractConfigReviewable.java │ │ ├── listener │ │ ├── HideListener.java │ │ ├── ItemClickListener.java │ │ ├── MOTDListener.java │ │ ├── BanlistViewListener.java │ │ ├── BackListener.java │ │ ├── InventoryBackupViewListener.java │ │ ├── HomeListPageListener.java │ │ ├── WarpListener.java │ │ ├── TeleportListener.java │ │ ├── PermissionAddOnJoinListener.java │ │ ├── DeathListener.java │ │ ├── PermissionListener.java │ │ ├── TpaAcceptListener.java │ │ ├── WorldsListListener.java │ │ ├── RightClickListener.java │ │ ├── CommandListener.java │ │ ├── ArmorSeeListener.java │ │ ├── FriendsViewListener.java │ │ ├── FriendsApplyViewListener.java │ │ ├── WhitelistListener.java │ │ ├── CustomGUIProtectListener.java │ │ ├── BanListener.java │ │ ├── CustomGUIListener.java │ │ └── MultiWorldListener.java │ │ ├── checker │ │ ├── DependencyChecker.java │ │ └── PlayerlistChecker.java │ │ ├── commands │ │ ├── HomeListCommands.java │ │ ├── BackCommands.java │ │ ├── HealCommands.java │ │ ├── UnlockCommands.java │ │ ├── TpbackCommands.java │ │ ├── FlyCommands.java │ │ ├── RemoteBagConsoleCommands.java │ │ ├── SpeedCommands.java │ │ ├── LockCommands.java │ │ ├── HideCommands.java │ │ ├── SpawnCommands.java │ │ ├── SbCommands.java │ │ ├── KitsCommands.java │ │ ├── SetHomeCommands.java │ │ ├── DeleteHomeCommands.java │ │ ├── RecallCommands.java │ │ ├── PasswordCommands.java │ │ └── RandomTpCommands.java │ │ ├── tasks │ │ ├── AtTask.java │ │ ├── AtCDTask.java │ │ ├── ProCheckerTask.java │ │ ├── TradeTask.java │ │ ├── NamePrefixSuffixTask.java │ │ ├── UnloadChunksTask.java │ │ ├── BanTimeCheckerTask.java │ │ └── TpTimerTask.java │ │ ├── views │ │ ├── ApplyView.java │ │ ├── ArmorView.java │ │ ├── InventoryBackupView.java │ │ ├── BanlistView.java │ │ └── WarpsView.java │ │ ├── register │ │ ├── PapiRegister.java │ │ └── CommandRegister.java │ │ ├── beans │ │ ├── DoubleChestLocation.java │ │ └── ArmorsBean.java │ │ └── apis │ │ └── EmailAPI.java └── test │ └── java │ └── com │ └── ultikits │ └── ultitools │ └── checker │ └── NewProCheckerTest.java ├── doc ├── package-list ├── script.js ├── allclasses-noframe.html ├── allclasses-frame.html ├── com │ └── minecraft │ │ └── ultikits │ │ └── inventoryapi │ │ └── package-frame.html └── index.html ├── .gitattributes ├── lib ├── UltiLevel-2.1.1.jar └── UltiCoreAPI-1.2.5.jar ├── .github ├── pull_request_template,md ├── ISSUE_TEMPLATE │ ├── config.yml │ ├── feature_request.yml │ └── bug_report.yml └── workflows │ ├── BugReply.yml │ ├── SuggestionReply.yml │ ├── maven.yml │ ├── IssueReply.yml │ └── codeql-analysis.yml ├── README.md └── .gitignore /src/main/resources/banlist.yml: -------------------------------------------------------------------------------- 1 | banlist: 2 | -------------------------------------------------------------------------------- /src/main/resources/chestData.yml: -------------------------------------------------------------------------------- 1 | locked: [] -------------------------------------------------------------------------------- /src/main/resources/lobby.yml: -------------------------------------------------------------------------------- 1 | serverLobby: 2 | -------------------------------------------------------------------------------- /src/main/resources/whitelist.yml: -------------------------------------------------------------------------------- 1 | whitelist: [] -------------------------------------------------------------------------------- /doc/package-list: -------------------------------------------------------------------------------- 1 | com.minecraft.ultikits.inventoryapi 2 | -------------------------------------------------------------------------------- /src/main/resources/sideBarData.yml: -------------------------------------------------------------------------------- 1 | player_closed_sb: [] -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /lib/UltiLevel-2.1.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisdommen/UltiTools/master/lib/UltiLevel-2.1.1.jar -------------------------------------------------------------------------------- /lib/UltiCoreAPI-1.2.5.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wisdommen/UltiTools/master/lib/UltiCoreAPI-1.2.5.jar -------------------------------------------------------------------------------- /src/main/resources/zh_motd.yml: -------------------------------------------------------------------------------- 1 | # 配置文件版本,请勿修改 2 | config_version: 1.0 3 | 4 | # MOTD文本 5 | motd: "&6欢迎来到服务器!\n&e祝大家游玩愉快!" -------------------------------------------------------------------------------- /.github/pull_request_template,md: -------------------------------------------------------------------------------- 1 | [MM:DD] 更新 版本 [Next Version] 2 | 3 | 该PR关联 Issue: #[Issue Number 若无填无] 4 | 5 | 1. xxx 6 | 2. xxx 7 | -------------------------------------------------------------------------------- /src/main/resources/zh_chestlock.yml: -------------------------------------------------------------------------------- 1 | # 配置文件版本,请勿修改 2 | config_version: 1.0 3 | 4 | # op是否可以打开上锁的箱子 5 | op_unlock: true 6 | 7 | # op是否可以破坏上锁的箱子 8 | op_break_locked: true -------------------------------------------------------------------------------- /src/main/resources/en_motd.yml: -------------------------------------------------------------------------------- 1 | # config version, please do not change 2 | config_version: 1.0 3 | 4 | # MOTD text 5 | motd: "&6Welcome to the server!\n&eHave a good time!" -------------------------------------------------------------------------------- /src/main/resources/zh_command-alias.yml: -------------------------------------------------------------------------------- 1 | #####格式##### 2 | #原命令: 3 | # - 缩写 4 | # - 另一种缩写(可选) 5 | # - 同上 6 | ######示例##### 7 | #lobby: 8 | # - l 9 | # - lb 10 | #请确保你设置的命令别称与其它命令无冲突 -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/enums/EmailResponse.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.enums; 2 | 3 | public enum EmailResponse { 4 | PLAYER_NOTFOUND, 5 | SEND_FAILED, 6 | SEND_SUCCESS 7 | } 8 | -------------------------------------------------------------------------------- /src/main/resources/en_chestlock.yml: -------------------------------------------------------------------------------- 1 | # config version, please do not change 2 | config_version: 1.0 3 | 4 | # if OP can open the locked chest 5 | op_unlock: true 6 | 7 | # if OP can break locked chest 8 | op_break_locked: true -------------------------------------------------------------------------------- /src/main/resources/zh_bag.yml: -------------------------------------------------------------------------------- 1 | # 配置版本号,请勿更改 2 | config_version: 1.0 3 | # 创建一个远程背包需要的价格 4 | price_of_create_a_remote_chest: 10000 5 | # 是否开启每购买一个背包增加价格 6 | enable_price_increase: true 7 | # 每次增加价格的比率(百分比) 8 | price_increase_rate: 0.1 -------------------------------------------------------------------------------- /src/main/resources/playerlist.yml: -------------------------------------------------------------------------------- 1 | # 使用本插件此功能前服务器已有的玩家,可以选择将其UUID和ID按格式手动添加至下方。 2 | # You can choose to manually add the UUIDs & IDs of players who already joined the server before using this plug-in to the bottom in format . 3 | 4 | playerlist: 5 | exampleUUID: exampleID -------------------------------------------------------------------------------- /src/main/resources/zh_tab-bar.yml: -------------------------------------------------------------------------------- 1 | # 配置文件版本,请勿修改 2 | config_version: 1.0 3 | 4 | # 以下配置支持PAPI变量,需要在config.yml中打开使用PAPI变量(enable_papi: true) 5 | 6 | #自定义Tab栏顶部信息 7 | tab_bar_header: "&6欢迎 %player_name% 来到服务器" 8 | 9 | #自定义Tab栏顶部信息 10 | tab_bar_footer: "&9祝大家游玩愉快" -------------------------------------------------------------------------------- /src/main/resources/zh_trade.yml: -------------------------------------------------------------------------------- 1 | # 配置文件版本,请勿修改 2 | config_version: 1.0 3 | 4 | #是否启用Shift+右键玩家发送交易请求 5 | enable_shift_click_apply: true 6 | #是否允许跨世界交易 7 | allow_cross_world_trade: true 8 | 9 | #是否启用货币交易 10 | enable_money_trade: true 11 | #是否启用经验交易 12 | enable_exp_trade: true 13 | -------------------------------------------------------------------------------- /src/main/resources/en_command-alias.yml: -------------------------------------------------------------------------------- 1 | #####format##### 2 | #oringal command: 3 | # - alia 4 | # - another alia(optional) 5 | # - the same as above 6 | #####example##### 7 | #lobby: 8 | # - l 9 | # - lb 10 | #please ensure that the alias you set have no conflicts with other commands -------------------------------------------------------------------------------- /src/main/resources/zh_home.yml: -------------------------------------------------------------------------------- 1 | # 配置文件版本,请勿修改 2 | config_version: 1.0 3 | 4 | # 普通玩家可以设置的最大家数量 5 | home_normal: 3 6 | 7 | # 中级玩家可以设置的最大家数量,权限:ultikits.tools.level1 8 | home_pro: 5 9 | 10 | # 高级玩家可以设置的最大家数量,权限:ultikits.tools.level2 11 | home_ultimate: 10 12 | 13 | # 家传送前摇 14 | home_tpwait: 3 -------------------------------------------------------------------------------- /src/main/resources/zh_chat.yml: -------------------------------------------------------------------------------- 1 | # 配置版本号,请勿更改 2 | config_version: 1.2 3 | # 聊天前缀 4 | chat_prefix: '§e[§a%ultitools_world_alis%§e][§c%ul_job%§dLv.%ul_level%§e][§b%player_name%§e]' 5 | # 自动回复,格式:[触发词]: [回复] 6 | auto-reply: 7 | test: "You did it! This is a great test!" 8 | more_test: "No more test plz!" 9 | # @冷却(秒) 10 | at_cd: 0 -------------------------------------------------------------------------------- /src/main/resources/en_bag.yml: -------------------------------------------------------------------------------- 1 | # config version, please do not change 2 | config_version: 1.0 3 | # the price of creating a remote chest 4 | price_of_create_a_remote_chest: 10000 5 | # if enable increase the price of a remote chest after each purchasing 6 | enable_price_increase: true 7 | # the rate of increasing the price 8 | price_increase_rate: 0.1 -------------------------------------------------------------------------------- /src/main/resources/en_tab-bar.yml: -------------------------------------------------------------------------------- 1 | # config version, please do not change 2 | config_version: 1.0 3 | 4 | #You need to enable the PAPI in the config.yml to take any effect below 5 | 6 | #Customize tab bar header text 7 | tab_bar_header: "&6 Welcome %player_name%" 8 | 9 | #Customize tab bar footer text 10 | tab_bar_footer: "&9Have a good time" -------------------------------------------------------------------------------- /src/main/resources/plugin.yml: -------------------------------------------------------------------------------- 1 | name: UltiTools 2 | version: ${project.version} 3 | main: com.ultikits.ultitools.ultitools.UltiTools 4 | api-version: 1.13 5 | depend: [ PlaceholderAPI, Vault, UltiCore ] 6 | authors: [ wisdomme, qianmo ] 7 | website: ultikits.com 8 | 9 | commands: 10 | ultitools: 11 | description: UltiTools Commands 12 | usage: /ultitools help -------------------------------------------------------------------------------- /src/main/resources/en_trade.yml: -------------------------------------------------------------------------------- 1 | # config version, please do not change 2 | config_version: 1.0 3 | 4 | #Enable Shift + right click player to send trade request 5 | enable_shift_click_apply: true 6 | #Allow cross world trade 7 | allow_cross_world_trade: true 8 | 9 | #Enabe money trade 10 | enable_money_trade: true 11 | #Enable exp trade 12 | enable_exp_trade: true 13 | -------------------------------------------------------------------------------- /src/main/resources/en_chat.yml: -------------------------------------------------------------------------------- 1 | # config version, please do not change 2 | config_version: 1.2 3 | # chat prefix 4 | chat_prefix: '§e[§a%ultitools_world_alis%§e][§c%ul_job%§dLv.%ul_level%§e][§b%player_name%§e]' 5 | # auto-reply, format: [Trigger word]: [Reply] 6 | auto-reply: 7 | test: "You did it! This is a great test!" 8 | more_test: "No more test plz!" 9 | # @ CD(s) 10 | at_cd: 0 -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/utils/VersionUtils.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.utils; 2 | 3 | import com.ultikits.ultitools.ultitools.UltiTools; 4 | 5 | public class VersionUtils { 6 | 7 | public static boolean isLegacyMCVersion(){ 8 | String version = UltiTools.getInstance().getServer().getVersion(); 9 | return Integer.parseInt(version.split("MC: ")[1].replaceAll("[.)]", "")) < 1130; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/resources/en_home.yml: -------------------------------------------------------------------------------- 1 | # config version, please do not change 2 | config_version: 1.0 3 | 4 | # the amount that a normal player can set 5 | home_normal: 3 6 | 7 | # the amount that a Pro player can set. Permission: ultikits.tools.level1 8 | home_pro: 5 9 | 10 | # the amount that a Ultimate player can set. Permission: ultikits.tools.level2 11 | home_ultimate: 10 12 | 13 | # time (seconds) that needs to be wait before teleporting 14 | home_tpwait: 3 -------------------------------------------------------------------------------- /src/main/resources/zh_worlds.yml: -------------------------------------------------------------------------------- 1 | worlds: [] 2 | blocked_worlds: [] 3 | protected_worlds: [] 4 | nopvp_worlds: [] 5 | nospawn_worlds: [] 6 | world: 7 | # 世界文件夹的名字 8 | World: 9 | # 世界别名 10 | alias: World 11 | # 世界列表中的材质 12 | type: GRASS_BLOCK 13 | # 世界列表中显示的描述 14 | describe: None 15 | Nether: 16 | alias: Nether 17 | type: GRASS_BLOCK 18 | describe: None 19 | End: 20 | alias: End 21 | type: GRASS_BLOCK 22 | describe: None -------------------------------------------------------------------------------- /src/main/resources/zh_joinwelcome.yml: -------------------------------------------------------------------------------- 1 | # 配置文件版本,请勿修改 2 | config_version: 1.0 3 | 4 | # x秒后发送入服欢迎 5 | sendMessageDelay: 4 6 | 7 | # 入服欢迎语 8 | welcome_message: 9 | - §b欢迎加入服务器,§e%player_name%§b! 10 | - §b请友善对待他人,游戏愉快! 11 | 12 | # op入服提示语 13 | op_join: §c[管理员] §e%player_name% §c已上线 14 | 15 | # op下线提示语 16 | op_quit: §c[管理员] §e%player_name% §c已下线 17 | 18 | # 玩家入服提示语 19 | player_join: §c[玩家] §e%player_name% §c已上线 20 | 21 | # 玩家下线提示语 22 | player_quit: §c[玩家] §e%player_name% §c已下线 -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/enums/PermissionsEnum.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.enums; 2 | 3 | public enum PermissionsEnum { 4 | 5 | ADMIN("ultikits.tools.admin"), 6 | LEVEL1("ultikits.tools.level1"), 7 | LEVEL2("ultikits.tools.level2"); 8 | 9 | String permission; 10 | 11 | PermissionsEnum(String permission){ 12 | this.permission = permission; 13 | } 14 | 15 | public String getPermission(){ 16 | return permission; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/utils/LanguageUtils.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.utils; 2 | 3 | import org.bukkit.configuration.file.YamlConfiguration; 4 | 5 | public class LanguageUtils { 6 | private YamlConfiguration configuration; 7 | 8 | public LanguageUtils(YamlConfiguration configuration) { 9 | this.configuration = configuration; 10 | } 11 | 12 | public String getString(String path){ 13 | return configuration.getString(path)+""; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/config/RecipeConfig.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.config; 2 | 3 | import com.ultikits.ultitools.enums.ConfigsEnum; 4 | 5 | public class RecipeConfig extends AbstractConfig { 6 | private static final RecipeConfig config = new RecipeConfig("recipe", ConfigsEnum.RECIPE.toString()); 7 | 8 | public RecipeConfig() { 9 | config.init(); 10 | } 11 | 12 | private RecipeConfig (String name, String path) { 13 | super(name, path); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/config/KitsConfig.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.config; 2 | 3 | import com.ultikits.ultitools.enums.ConfigsEnum; 4 | 5 | public class KitsConfig extends AbstractConfig{ 6 | 7 | private static final KitsConfig kitsConfig = new KitsConfig("kits", ConfigsEnum.KIT.toString()); 8 | 9 | public KitsConfig() { 10 | kitsConfig.init(); 11 | } 12 | 13 | private KitsConfig(String name, String filePath) { 14 | super(name, filePath); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/listener/HideListener.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.listener; 2 | 3 | import com.ultikits.ultitools.commands.HideCommands; 4 | import org.bukkit.event.EventHandler; 5 | import org.bukkit.event.Listener; 6 | import org.bukkit.event.player.PlayerQuitEvent; 7 | 8 | public class HideListener implements Listener { 9 | @EventHandler 10 | public void onPlayerQuit(PlayerQuitEvent event) { 11 | HideCommands.hidePlayers.remove(event.getPlayer().getName()); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/config/BagConfig.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.config; 2 | 3 | import com.ultikits.ultitools.enums.ConfigsEnum; 4 | 5 | public class BagConfig extends AbstractConfigReviewable { 6 | private static final BagConfig config = new BagConfig("bag", ConfigsEnum.BAG.toString()); 7 | 8 | public BagConfig() { 9 | config.init(); 10 | } 11 | 12 | private BagConfig(String name, String filePath) { 13 | super(name, filePath); 14 | version = 1.0; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/utils/SilentOpenUtils.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.utils; 2 | 3 | import org.bukkit.entity.Player; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | public class SilentOpenUtils { 9 | private static List players = new ArrayList<>(); 10 | 11 | public static List getPlayers() { 12 | return players; 13 | } 14 | 15 | public static void setPlayers(List players) { 16 | SilentOpenUtils.players = players; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/config/MOTDConfig.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.config; 2 | 3 | import com.ultikits.ultitools.enums.ConfigsEnum; 4 | 5 | public class MOTDConfig extends AbstractConfigReviewable { 6 | private static final MOTDConfig config = new MOTDConfig("motd", ConfigsEnum.MOTD.toString()); 7 | 8 | public MOTDConfig() { 9 | config.init(); 10 | } 11 | 12 | private MOTDConfig(String name, String filePath) { 13 | super(name, filePath); 14 | version = 1.0; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/resources/en_worlds.yml: -------------------------------------------------------------------------------- 1 | worlds: [] 2 | blocked_worlds: [] 3 | protected_worlds: [] 4 | nopvp_worlds: [] 5 | nospawn_worlds: [] 6 | world: 7 | # Name of world folder 8 | World: 9 | # Alias name for display 10 | alias: World 11 | # Item shows in world list 12 | type: GRASS_BLOCK 13 | # World description shows in world list 14 | describe: None 15 | Nether: 16 | alias: Nether 17 | type: GRASS_BLOCK 18 | describe: None 19 | End: 20 | alias: End 21 | type: GRASS_BLOCK 22 | describe: None -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/config/ChatConfig.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.config; 2 | 3 | import com.ultikits.ultitools.enums.ConfigsEnum; 4 | 5 | public class ChatConfig extends AbstractConfigReviewable{ 6 | 7 | private static final ChatConfig config = new ChatConfig("chat", ConfigsEnum.CHAT.toString()); 8 | 9 | public ChatConfig() { 10 | config.init(); 11 | } 12 | 13 | private ChatConfig(String name, String filePath) { 14 | super(name, filePath); 15 | version = 1.2; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/config/CustomerGUIConfig.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.config; 2 | 3 | import com.ultikits.ultitools.enums.ConfigsEnum; 4 | 5 | public class CustomerGUIConfig extends AbstractConfig{ 6 | private static final CustomerGUIConfig gui = new CustomerGUIConfig("customgui", ConfigsEnum.CUSTOMERGUI.toString()); 7 | 8 | public CustomerGUIConfig(){ 9 | gui.init(); 10 | } 11 | 12 | private CustomerGUIConfig(String name, String filePath){ 13 | super(name, filePath); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/config/MultiworldsConfig.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.config; 2 | 3 | import com.ultikits.ultitools.enums.ConfigsEnum; 4 | 5 | public class MultiworldsConfig extends AbstractConfig{ 6 | 7 | private static final MultiworldsConfig config = new MultiworldsConfig("worlds", ConfigsEnum.WORLDS.toString()); 8 | 9 | public MultiworldsConfig(){ 10 | config.init(); 11 | } 12 | 13 | private MultiworldsConfig(String name, String path){ 14 | super(name, path); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/config/MainConfig.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.config; 2 | 3 | import com.ultikits.ultitools.enums.ConfigsEnum; 4 | 5 | public class MainConfig extends AbstractConfigReviewable{ 6 | 7 | private static final MainConfig config = new MainConfig("config", ConfigsEnum.MAIN.toString()); 8 | 9 | public MainConfig() { 10 | config.init(); 11 | } 12 | 13 | private MainConfig(String name, String filePath) { 14 | super(name, filePath); 15 | version = 3.34; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/config/TradeConfig.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.config; 2 | 3 | import com.ultikits.ultitools.enums.ConfigsEnum; 4 | 5 | public class TradeConfig extends AbstractConfigReviewable { 6 | private static final TradeConfig config = new TradeConfig("trade", ConfigsEnum.TRADE.toString()); 7 | 8 | public TradeConfig() { 9 | config.init(); 10 | } 11 | 12 | private TradeConfig(String name, String filePath) { 13 | super(name, filePath); 14 | version = 1.0; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/config/HomeConfig.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.config; 2 | 3 | import com.ultikits.ultitools.enums.ConfigsEnum; 4 | 5 | 6 | public class HomeConfig extends AbstractConfigReviewable{ 7 | 8 | private static final HomeConfig homeConfig = new HomeConfig("home", ConfigsEnum.HOME.toString()); 9 | 10 | public HomeConfig() { 11 | homeConfig.init(); 12 | } 13 | 14 | private HomeConfig(String name, String filePath) { 15 | super(name, filePath); 16 | version = 1.0; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/config/TabBarConfig.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.config; 2 | 3 | import com.ultikits.ultitools.enums.ConfigsEnum; 4 | 5 | public class TabBarConfig extends AbstractConfigReviewable { 6 | private static final TabBarConfig config = new TabBarConfig("tab-bar", ConfigsEnum.TAB_BAR.toString()); 7 | 8 | public TabBarConfig() { 9 | config.init(); 10 | } 11 | 12 | private TabBarConfig(String name, String filePath) { 13 | super(name, filePath); 14 | version = 1.0; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/resources/zh_recipe.yml: -------------------------------------------------------------------------------- 1 | #自定义合成配方 2 | #每一个配方都按照如下格式编写 3 | #recipe_example: 4 | # output: 5 | # item: "EGG" 6 | # amount: 1 7 | # keys: 8 | # - "x" 9 | # - "y" 10 | # shape: 11 | # - "xxx" 12 | # - "xyx" 13 | # - "y y" 14 | # ingredient: 15 | # x: "APPLE" 16 | # y: "DARK_OAK_WOOD" 17 | 18 | recipe_name: 19 | output: 20 | item: "EGG" 21 | amount: 1 22 | keys: 23 | - "x" 24 | - "y" 25 | shape: 26 | - "xxx" 27 | - "xyx" 28 | - "y y" 29 | ingredient: 30 | x: "APPLE" 31 | y: "DARK_OAK_WOOD" -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/config/LoginConfig.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.config; 2 | 3 | import com.ultikits.ultitools.enums.ConfigsEnum; 4 | 5 | public class LoginConfig extends AbstractConfigReviewable{ 6 | 7 | private static final LoginConfig loginConfig = new LoginConfig("login", ConfigsEnum.LOGIN.toString()); 8 | 9 | public LoginConfig() { 10 | loginConfig.init(); 11 | } 12 | 13 | private LoginConfig(String name, String filePath) { 14 | super(name, filePath); 15 | version = 1.3; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/resources/zh_login.yml: -------------------------------------------------------------------------------- 1 | # 配置文件版本,请勿修改 2 | configVersion: 1.3 3 | 4 | "注释1请勿修改": "是否启用同一ip账号数量限制" 5 | enablePlayerLimitForOneIP: true 6 | 7 | "注释2请勿修改": "同一个ip可以注册的账号数量" 8 | playerLimitForOneIP: 1 9 | 10 | "注释3请勿修改": "是否开启玩家定点登录" 11 | enableFixPointLogin: false 12 | 13 | "注释4请勿修改": "是否开启绑定邮箱后执行奖励指令" 14 | enable_emailregister_reward: false 15 | 16 | "注释5请勿修改": "绑定邮箱后的奖励指令,可多行" 17 | emailregister_reward_commands: 18 | - givemoney %player% 500 19 | 20 | "注释6请勿修改": "定点登录坐标" 21 | loginPoint: 22 | world: World 23 | x: 100 24 | y: 70 25 | z: 60 26 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: UltiTools 6 仓库 4 | url: https://github.com/UltiKits/UltiTools-Reborn 5 | about: 欢迎关注,有建议也可以提交到这里 6 | - name: 自主排错 Troubleshoot 7 | url: https://doc.ultitools.ultikits.com/guide/troubleshoot.html 8 | about: 根据我们提供的自主排错步骤,也许能够解决一些您的问题 9 | - name: 官方文档 Wiki 10 | url: https://doc.ultitools.ultikits.com 11 | about: 学会主动看文档是很重要的 12 | - name: 在官方 QQ 群寻求帮助 Ask For Help 13 | url: https://jq.qq.com/?_wv=1027&k=s7FBdzGh 14 | about: 在寻求帮助之前还请一定一定要把文档阅读清楚了 15 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/checker/DependencyChecker.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.checker; 2 | 3 | import org.bukkit.Bukkit; 4 | 5 | public class DependencyChecker { 6 | 7 | private DependencyChecker() { 8 | } 9 | 10 | public static boolean isUltiCoreUpToDate() { 11 | int UltiCoreVersionRequired = 125; 12 | int UltiCoreVersionCurrent = Integer.parseInt(Bukkit.getPluginManager().getPlugin("UltiCore").getDescription().getVersion().replaceAll("\\.", "")); 13 | return UltiCoreVersionCurrent >= UltiCoreVersionRequired; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/config/CleanerConfig.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.config; 2 | 3 | import com.ultikits.ultitools.enums.ConfigsEnum; 4 | 5 | public class CleanerConfig extends AbstractConfigReviewable { 6 | 7 | private static final CleanerConfig cleanerConfig = new CleanerConfig("cleaner", ConfigsEnum.CLEANER.toString()); 8 | 9 | public CleanerConfig(){ 10 | cleanerConfig.init(); 11 | } 12 | 13 | private CleanerConfig(String name, String filePath) { 14 | super(name, filePath); 15 | version = 1.2; 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/config/DeathPunishConfig.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.config; 2 | 3 | import com.ultikits.ultitools.enums.ConfigsEnum; 4 | 5 | public class DeathPunishConfig extends AbstractConfigReviewable{ 6 | 7 | private static final DeathPunishConfig config = new DeathPunishConfig("death", ConfigsEnum.DEATH.toString()); 8 | 9 | public DeathPunishConfig() { 10 | config.init(); 11 | } 12 | 13 | private DeathPunishConfig(String name, String filePath) { 14 | super(name, filePath); 15 | version = 1.0; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/config/ChestLockConfig.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.config; 2 | 3 | import com.ultikits.ultitools.enums.ConfigsEnum; 4 | 5 | 6 | public class ChestLockConfig extends AbstractConfigReviewable{ 7 | 8 | private static final ChestLockConfig chestLockConfig = new ChestLockConfig("chestlock", ConfigsEnum.CHEST_LOCK.toString()); 9 | 10 | public ChestLockConfig(){ 11 | chestLockConfig.init(); 12 | } 13 | 14 | private ChestLockConfig(String name, String filePath) { 15 | super(name, filePath); 16 | version = 1.0; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/resources/en_recipe.yml: -------------------------------------------------------------------------------- 1 | #Custom crafting recipes 2 | #Each recipe is written in the following format 3 | #recipe_example: 4 | # output: 5 | # item: "EGG" 6 | # amount: 1 7 | # keys: 8 | # - "x" 9 | # - "y" 10 | # shape: 11 | # - "xxx" 12 | # - "xyx" 13 | # - "y y" 14 | # ingredient: 15 | # x: "APPLE" 16 | # y: "DARK_OAK_WOOD" 17 | 18 | recipe_name: 19 | output: 20 | item: "EGG" 21 | amount: 1 22 | keys: 23 | - "x" 24 | - "y" 25 | shape: 26 | - "xxx" 27 | - "xyx" 28 | - "y y" 29 | ingredient: 30 | x: "APPLE" 31 | y: "DARK_OAK_WOOD" -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/config/GlobuleGroupsConfig.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.config; 2 | 3 | import com.ultikits.ultitools.enums.ConfigsEnum; 4 | 5 | 6 | public class GlobuleGroupsConfig extends AbstractConfig{ 7 | 8 | private static final GlobuleGroupsConfig globuleGroupsConfig = new GlobuleGroupsConfig("globuleGroupsConfig", ConfigsEnum.PERMISSION_INHERITED.toString()); 9 | 10 | public GlobuleGroupsConfig() { 11 | globuleGroupsConfig.init(); 12 | } 13 | 14 | private GlobuleGroupsConfig(String name, String filePath) { 15 | super(name, filePath); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/config/JoinWelcomeConfig.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.config; 2 | 3 | import com.ultikits.ultitools.enums.ConfigsEnum; 4 | 5 | public class JoinWelcomeConfig extends AbstractConfigReviewable{ 6 | 7 | private static final JoinWelcomeConfig joinWelcomeConfig = new JoinWelcomeConfig("joinwelcome", ConfigsEnum.JOIN_WELCOME.toString()); 8 | 9 | public JoinWelcomeConfig() { 10 | joinWelcomeConfig.init(); 11 | } 12 | 13 | private JoinWelcomeConfig(String name, String filePath) { 14 | super(name, filePath); 15 | version = 1.0; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/listener/ItemClickListener.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.listener; 2 | 3 | import com.ultikits.ultitools.commands.InventoryBackupCommands; 4 | import org.bukkit.event.EventHandler; 5 | import org.bukkit.event.Listener; 6 | import org.bukkit.event.inventory.InventoryClickEvent; 7 | 8 | 9 | /** 10 | * @author Shpries 11 | */ 12 | public class ItemClickListener implements Listener { 13 | @EventHandler 14 | public void onItemClick(InventoryClickEvent e) { 15 | if(InventoryBackupCommands.isWorking) { 16 | e.setCancelled(true); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.yml: -------------------------------------------------------------------------------- 1 | name: ⭐ 意见与建议 2 | description: UltiTools 5 现已不接受任何的新功能请求,请前往 UltiTools 6 仓库,点击右侧按钮来查看详情 3 | labels: enhancement 新功能请求 4 | body: 5 | - type: markdown 6 | attributes: 7 | value: | 8 | 非常感谢你能够来为这个插件提出意见,目前所有的开发工作都已经转到了UltiTools 6.0,**所以暂时5.0版本除了修复bug以外暂时不会更新新的内容**。 9 | 请前往 UltiTools-Reborn 仓库来提交: https://github.com/UltiKits/UltiTools-Reborn/issues 10 | 打开的所有新功能请求相关的 Issue 都将会被锁定。 11 | - type: checkboxes 12 | id: force 13 | attributes: 14 | label: 我不管 15 | options: 16 | - label: 我就是要打开一个这样的Issue,即使会被自动锁定 17 | required: true 18 | -------------------------------------------------------------------------------- /.github/workflows/BugReply.yml: -------------------------------------------------------------------------------- 1 | name: Create Comment 2 | 3 | on: 4 | issues: 5 | types: [labeled] 6 | 7 | jobs: 8 | create-comment: 9 | runs-on: ubuntu-latest 10 | if: github.event.label.name == 'bug 插件功能问题' 11 | steps: 12 | - name: Create comment 13 | uses: actions-cool/issues-helper@v2 14 | with: 15 | actions: 'create-comment' 16 | token: ${{ secrets.GITHUB_TOKEN }} 17 | issue-number: ${{ github.event.issue.number }} 18 | body: | 19 | Hello ${{ github.event.issue.user.login }}. 您提出的问题已被受理 20 | 在一般情况下,这些问题将会在下个版本被修复,请持续关注版本更新。 21 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/listener/MOTDListener.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.listener; 2 | 3 | import com.ultikits.ultitools.config.ConfigController; 4 | import org.bukkit.event.EventHandler; 5 | import org.bukkit.event.Listener; 6 | import org.bukkit.event.server.ServerListPingEvent; 7 | 8 | public class MOTDListener implements Listener { 9 | @EventHandler 10 | public static void onServerListPing(ServerListPingEvent event) { 11 | String motd = ConfigController.getConfig("motd").getString("motd"); 12 | if (motd == null) return; 13 | event.setMotd(motd.replace("&","§")); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/test/java/com/ultikits/ultitools/checker/NewProCheckerTest.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.checker; 2 | 3 | import org.junit.Test; 4 | 5 | import java.io.IOException; 6 | 7 | import static org.junit.Assert.*; 8 | 9 | public class NewProCheckerTest { 10 | 11 | @Test 12 | public void getToken() { 13 | // String token = NewProChecker.getToken("test", "112233"); 14 | // System.out.println(token); 15 | // String refreshToken = token.split("\"refresh_token\":\"")[1].split("\"")[0]; 16 | // System.out.println(refreshToken); 17 | // System.out.println(NewProChecker.refreshToken(refreshToken)); 18 | } 19 | } -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/enums/LoginRegisterEnum.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.enums; 2 | 3 | import com.ultikits.ultitools.ultitools.UltiTools; 4 | 5 | public enum LoginRegisterEnum { 6 | LOGIN(UltiTools.languageUtils.getString("login_login_page_title")), 7 | REGISTER(UltiTools.languageUtils.getString("login_register_page_tile")), 8 | VALIDATION(UltiTools.languageUtils.getString("login_validation_page_title")); 9 | 10 | private final String type; 11 | 12 | LoginRegisterEnum(String type) { 13 | this.type = type; 14 | } 15 | 16 | @Override 17 | public String toString() { 18 | return type; 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/main/resources/en_joinwelcome.yml: -------------------------------------------------------------------------------- 1 | # config version, please do not change 2 | config_version: 1.0 3 | 4 | # send welcome message after x seconds 5 | sendMessageDelay: 4 6 | 7 | # welcome message 8 | welcome_message: 9 | - §bWelcome to Server,§e%player_name%§b! 10 | - §bPlease be nice to others and have fun! 11 | 12 | # op join message 13 | op_join: §c[Administrator] §e%player_name% §cis now online 14 | 15 | # op leave message 16 | op_quit: §c[Administrator] §e%player_name% §cis now offline 17 | 18 | # player join message 19 | player_join: §c[Player] §e%player_name% §cis now online 20 | 21 | # player leave message 22 | player_quit: §c[Player] §e%player_name% §cis now offline -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/listener/BanlistViewListener.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.listener; 2 | 3 | import com.ultikits.beans.CancelResult; 4 | import com.ultikits.inventoryapi.InventoryManager; 5 | import com.ultikits.inventoryapi.PagesListener; 6 | import org.bukkit.entity.Player; 7 | import org.bukkit.event.inventory.InventoryClickEvent; 8 | import org.bukkit.inventory.ItemStack; 9 | 10 | public class BanlistViewListener extends PagesListener { 11 | @Override 12 | public CancelResult onItemClick(InventoryClickEvent inventoryClickEvent, Player player, InventoryManager inventoryManager, ItemStack itemStack) { 13 | return CancelResult.NONE; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/config/ChestDataConfig.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.config; 2 | 3 | import com.ultikits.ultitools.enums.ConfigsEnum; 4 | import com.ultikits.ultitools.ultitools.UltiTools; 5 | 6 | public class ChestDataConfig extends AbstractConfig{ 7 | 8 | private static final ChestDataConfig chest = new ChestDataConfig("chestData", UltiTools.getInstance().getDataFolder().toString(), ConfigsEnum.CHEST.toString(), "chestData.yml"); 9 | 10 | public ChestDataConfig() { 11 | chest.init(); 12 | } 13 | 14 | private ChestDataConfig(String name, String folder, String filePath, String resourcePath) { 15 | super(name,folder, filePath, resourcePath); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/config/WhiteListConfig.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.config; 2 | 3 | import com.ultikits.ultitools.enums.ConfigsEnum; 4 | import com.ultikits.ultitools.ultitools.UltiTools; 5 | 6 | 7 | public class WhiteListConfig extends AbstractConfig{ 8 | 9 | private static final WhiteListConfig config = new WhiteListConfig("whitelist", UltiTools.getInstance().getDataFolder().toString(), ConfigsEnum.WHITELIST.toString(), "whitelist.yml"); 10 | 11 | public WhiteListConfig() { 12 | config.init(); 13 | } 14 | 15 | private WhiteListConfig(String name, String folder, String filePath,String resourcePath) { 16 | super(name, folder, filePath, resourcePath); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/commands/HomeListCommands.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.commands; 2 | 3 | import com.ultikits.abstracts.AbstractPlayerCommandExecutor; 4 | import com.ultikits.ultitools.views.HomeListView; 5 | import org.bukkit.command.Command; 6 | import org.bukkit.entity.Player; 7 | import org.bukkit.inventory.Inventory; 8 | import org.jetbrains.annotations.NotNull; 9 | 10 | public class HomeListCommands extends AbstractPlayerCommandExecutor { 11 | 12 | @Override 13 | protected boolean onPlayerCommand(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) { 14 | Inventory homes = HomeListView.setUp(player); 15 | player.openInventory(homes); 16 | return true; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/resources/zh_sidebar.yml: -------------------------------------------------------------------------------- 1 | # 配置文件版本,请勿修改 2 | config_version: 1.0 3 | 4 | # 侧边栏标题 5 | scoreBoardTitle: 欢迎加入服务器 6 | 7 | # 以下配置填写PAPI变量,需要在config.yml中打开使用PAPI变量(enable_papi: true) 8 | # 玩家名变量 9 | name: '%player_name%' 10 | 11 | # 在线人数变量 12 | online_player: '' 13 | 14 | # 技能冷却变量 15 | CDq: '' 16 | CDw: '' 17 | CDe: '' 18 | CDr: '' 19 | 20 | # 现金数变量 21 | money: '' 22 | 23 | # 存款数变量 24 | deposit: '' 25 | 26 | # 等级变量 27 | level: '' 28 | 29 | # 目前经验值变量 30 | exp: '' 31 | 32 | # 升级到下一级所需经验值 33 | max_exp: '' 34 | 35 | # 法力值变量 36 | mp: '' 37 | 38 | # 最大法力值变量 39 | max_mp: '' 40 | 41 | # 当前生命值变量 42 | hp: '' 43 | 44 | # 最大生命值变量 45 | max_hp: '' 46 | 47 | # 职业变量 48 | occupation: '' 49 | 50 | # 自定义内容 51 | customerline: 52 | - 这是自定义的内容 53 | - 可以在配置文件里改 54 | - 支持PAPI变量 -------------------------------------------------------------------------------- /src/main/resources/zh_cleaner.yml: -------------------------------------------------------------------------------- 1 | # 配置文件版本,请勿修改 2 | config_version: 1.2 3 | 4 | # 清道夫名称 5 | cleaner_name: 扫地娘 6 | 7 | # 开关定时清理(智能清理开启时不生效) 8 | clean_entity_task_enable: false 9 | 10 | # 开关卸载闲置区块 11 | unload_chunk_task_enable: false 12 | 13 | # 开关智能清理 14 | enable_smart_clean: true 15 | 16 | # 定时清理间隔 17 | clean_period: 3000 18 | 19 | #需要清理的种类(all代表全部,items代表掉落物,mobs代表生物) 20 | clean_type: 21 | - all 22 | 23 | # 需要清理的世界(all代表全部) 24 | clean_worlds: 25 | - all 26 | 27 | #智能清理,掉落物上限 28 | item_max: 2000 29 | 30 | #智能清理,生物上限 31 | mob_max: 1000 32 | 33 | #智能清理,实体上限 34 | total_entity_max: 2500 35 | 36 | # 一个区域被视为闲置区域的最大距离 37 | max_chunk_distance: 320 38 | 39 | # 智能清理,区块上限 40 | max_unused_chunks: 100 41 | 42 | # 每分钟最大卸载区块量 43 | unload_chunks_per_minute: 10 44 | 45 | # 生物白名单,不会被清理 46 | clean_whitelist: [] -------------------------------------------------------------------------------- /src/main/resources/zh_death.yml: -------------------------------------------------------------------------------- 1 | # 配置文件版本,请勿修改 2 | config_version: 1.0 3 | 4 | # 是否开启物品掉落 5 | enable_item_drop: false 6 | 7 | # 是否开启金币掉落 8 | enable_money_drop: true 9 | 10 | # 是否开启死亡执行后台命令 11 | enable_punish_commands: true 12 | 13 | # 死亡后掉落的金币数 14 | money_dropped_ondeath: 100 15 | 16 | # 死亡后随机掉落的物品数 17 | item_dropped_ondeath: 3 18 | 19 | # 死亡后后台执行的指令({PLAYER}指代玩家占位符) 20 | punish_command: [] 21 | 22 | # 死亡掉落物品白名单 23 | item_drop_whitelist: 24 | - AIR 25 | 26 | # 开启死亡随机物品掉落的世界 27 | worlds_enabled_item_drop: 28 | - world 29 | - world_nether 30 | - world_the_end 31 | 32 | # 开启死亡后金币掉落的世界 33 | worlds_enabled_money_drop: 34 | - world 35 | - world_nether 36 | - world_the_end 37 | 38 | # 开启死亡后执行后台指令的世界 39 | worlds_enabled_punish_commands: 40 | - world 41 | - world_nether 42 | - world_the_end -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/config/UserPermissionConfig.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.config; 2 | 3 | import com.ultikits.ultitools.enums.ConfigsEnum; 4 | import org.bukkit.configuration.file.YamlConfiguration; 5 | 6 | 7 | public class UserPermissionConfig extends AbstractConfig{ 8 | // 9 | // private static final UserPermissionConfig usersConfig = new UserPermissionConfig("usersPermission", ConfigsEnum.PERMISSION_USER.toString()); 10 | // 11 | // public UserPermissionConfig() { 12 | // usersConfig.init(); 13 | // } 14 | // 15 | // private UserPermissionConfig(String name, String filePath) { 16 | // super(name, filePath); 17 | // } 18 | // 19 | // @Override 20 | // void doInit(YamlConfiguration config) { 21 | // config.set("users", null); 22 | // } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/resources/en_login.yml: -------------------------------------------------------------------------------- 1 | # config version, please do not change 2 | configVersion: 1.3 3 | 4 | "comment 1": "whether to enable account limit of the same IP address or not" 5 | enablePlayerLimitForOneIP: true 6 | 7 | "comment 2": "number of account that can register for one IP address" 8 | playerLimitForOneIP: 1 9 | 10 | "comment 3": "whether to enable fixed point login for player" 11 | enableFixPointLogin: false 12 | 13 | "comment 4": "whether to perform reward commands after someone finishes binding email" 14 | enable_emailregister_reward: false 15 | 16 | "comment 5": "commands to reward players who finishes binding email" 17 | emailregister_reward_commands: 18 | - givemoney %player% 500 19 | 20 | "comment 6": "fixed point login position" 21 | loginPoint: 22 | world: World 23 | x: 100 24 | y: 70 25 | z: 60 26 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/tasks/AtTask.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.tasks; 2 | 3 | import com.ultikits.ultitools.ultitools.UltiTools; 4 | import org.bukkit.ChatColor; 5 | import org.bukkit.entity.Player; 6 | import org.bukkit.scheduler.BukkitRunnable; 7 | 8 | public class AtTask extends BukkitRunnable { 9 | 10 | private final Player player; 11 | private final String message; 12 | double timer = 1.00; 13 | 14 | public AtTask (Player To, String Message) { 15 | player = To; 16 | message = Message; 17 | } 18 | 19 | @Override 20 | public void run() { 21 | if (timer > 0.01) { 22 | UltiTools.versionAdaptor.sendActionBar(player, ChatColor.BOLD + message); 23 | timer = timer - 0.01; 24 | } else { 25 | this.cancel(); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /doc/script.js: -------------------------------------------------------------------------------- 1 | function show(type) 2 | { 3 | count = 0; 4 | for (var key in methods) { 5 | var row = document.getElementById(key); 6 | if ((methods[key] & type) != 0) { 7 | row.style.display = ''; 8 | row.className = (count++ % 2) ? rowColor : altColor; 9 | } 10 | else 11 | row.style.display = 'none'; 12 | } 13 | updateTabs(type); 14 | } 15 | 16 | function updateTabs(type) 17 | { 18 | for (var value in tabs) { 19 | var sNode = document.getElementById(tabs[value][0]); 20 | var spanNode = sNode.firstChild; 21 | if (value == type) { 22 | sNode.className = activeTableTab; 23 | spanNode.innerHTML = tabs[value][1]; 24 | } 25 | else { 26 | sNode.className = tableTab; 27 | spanNode.innerHTML = "" + tabs[value][1] + ""; 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/tasks/AtCDTask.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.tasks; 2 | 3 | import com.ultikits.ultitools.listener.ChatListener; 4 | import org.bukkit.scheduler.BukkitRunnable; 5 | 6 | import java.util.Date; 7 | 8 | public class AtCDTask extends BukkitRunnable { 9 | private final int cd; 10 | private final String playerName; 11 | 12 | public AtCDTask (int cd, String playerName) { 13 | ChatListener.atCD.add(playerName); 14 | this.cd = cd; 15 | this.playerName = playerName; 16 | } 17 | 18 | @Override 19 | public void run() { 20 | Date d = new Date(System.currentTimeMillis() + cd * 1000L); 21 | while(new Date().before(d)){ 22 | try { 23 | Thread.sleep(1000); 24 | } catch (InterruptedException e) { 25 | e.printStackTrace(); 26 | } 27 | } 28 | ChatListener.atCD.remove(playerName); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/listener/BackListener.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.listener; 2 | 3 | import org.bukkit.Location; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.EventHandler; 6 | import org.bukkit.event.Listener; 7 | import org.bukkit.event.entity.PlayerDeathEvent; 8 | 9 | import java.util.HashMap; 10 | import java.util.Map; 11 | import java.util.UUID; 12 | 13 | public class BackListener implements Listener { 14 | 15 | private static final Map playerDeathLocation = new HashMap<>(); 16 | 17 | @EventHandler 18 | public void onPlayerDeath(PlayerDeathEvent event){ 19 | Player player = event.getEntity(); 20 | Location deathLocation = player.getLocation(); 21 | playerDeathLocation.put(player.getUniqueId(), deathLocation); 22 | } 23 | 24 | public static Location getPlayerLastDeathLocation(UUID player){ 25 | return playerDeathLocation.get(player); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /.github/workflows/SuggestionReply.yml: -------------------------------------------------------------------------------- 1 | name: Create Comment 2 | 3 | on: 4 | issues: 5 | types: [labeled] 6 | 7 | jobs: 8 | create-comment: 9 | runs-on: ubuntu-latest 10 | if: github.event.label.name == 'enhancement 新功能请求' || github.event.label.name == 'suggestion 建议与想法' 11 | steps: 12 | - name: Create comment 13 | uses: actions-cool/issues-helper@v2 14 | with: 15 | actions: 'create-comment' 16 | token: ${{ secrets.GITHUB_TOKEN }} 17 | issue-number: ${{ github.event.issue.number }} 18 | body: | 19 | Hello @${{ github.event.issue.user.login }}. 感谢你的建议! 20 | 但很抱歉您提出的建议将不会在这里被采纳。 21 | 目前所有的开发工作都已经转到了UltiTools 6.0,所以暂时5.0版本除了修复bug以外暂时不会更新新的内容。 22 | 请关注一下 UltiTools 6.0:https://github.com/UltiKits/UltiTools-Reborn 23 | - name: lock issue 24 | uses: OSDKDev/lock-issues@v1.1 25 | with: 26 | repo-token: "${{ secrets.GITHUB_TOKEN }}" 27 | -------------------------------------------------------------------------------- /src/main/resources/en_sidebar.yml: -------------------------------------------------------------------------------- 1 | # config version, please do not change 2 | config_version: 1.0 3 | 4 | # SideBar Title 5 | scoreBoardTitle: Welcome 6 | 7 | # You need to enable the PAPI in the config.yml to take any effect below 8 | # player name papi 9 | name: '%player_name%' 10 | 11 | # online players papi 12 | online_player: '' 13 | 14 | # skill cooldown papi (require extra plugin support) 15 | CDq: '' 16 | CDw: '' 17 | CDe: '' 18 | CDr: '' 19 | 20 | # money papi 21 | money: '' 22 | 23 | # deposit papi 24 | deposit: '' 25 | 26 | # level papi 27 | level: '' 28 | 29 | # exp papi 30 | exp: '' 31 | 32 | # max exp papi 33 | max_exp: '' 34 | 35 | # magic point papi 36 | mp: '' 37 | 38 | # max magic point papi 39 | max_mp: '' 40 | 41 | # health point papi 42 | hp: '' 43 | 44 | # max health point papi 45 | max_hp: '' 46 | 47 | # job papi 48 | occupation: '' 49 | 50 | # Custom content line 51 | customerline: 52 | - Here is the custom content 53 | - You can change it in config -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/listener/InventoryBackupViewListener.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.listener; 2 | 3 | import com.ultikits.beans.CancelResult; 4 | import com.ultikits.inventoryapi.InventoryManager; 5 | import com.ultikits.inventoryapi.PagesListener; 6 | import com.ultikits.ultitools.ultitools.UltiTools; 7 | import org.bukkit.entity.Player; 8 | import org.bukkit.event.inventory.InventoryClickEvent; 9 | import org.bukkit.inventory.ItemStack; 10 | 11 | /** 12 | * @author Shpries 13 | */ 14 | public class InventoryBackupViewListener extends PagesListener { 15 | @Override 16 | public CancelResult onItemClick(InventoryClickEvent inventoryClickEvent, Player player, InventoryManager inventoryManager, ItemStack itemStack) { 17 | if(inventoryClickEvent.getView().getTitle().contains(UltiTools.languageUtils.getString("inv_backup_view_title"))) { 18 | return CancelResult.TRUE; 19 | } 20 | return CancelResult.NONE; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/utils/CustomGuiUtils.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.utils; 2 | 3 | import com.ultikits.ultitools.enums.ConfigsEnum; 4 | import org.bukkit.configuration.file.YamlConfiguration; 5 | 6 | import java.io.File; 7 | import java.util.HashMap; 8 | import java.util.Map; 9 | 10 | public class CustomGuiUtils { 11 | 12 | private static Map customGuiCommands = new HashMap<>(); 13 | 14 | static { 15 | File file = new File(ConfigsEnum.CUSTOMERGUI.toString()); 16 | YamlConfiguration config = YamlConfiguration.loadConfiguration(file); 17 | for (String key : config.getConfigurationSection("guis").getKeys(false)) { 18 | String cmd = config.getString("guis." + key + ".command"); 19 | customGuiCommands.put(cmd, key); 20 | } 21 | } 22 | 23 | private CustomGuiUtils() { 24 | } 25 | 26 | public static String getSignature(String command) { 27 | return customGuiCommands.get(command); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/tasks/ProCheckerTask.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.tasks; 2 | 3 | import com.ultikits.ultitools.ultitools.UltiTools; 4 | import org.bukkit.ChatColor; 5 | import org.bukkit.scheduler.BukkitRunnable; 6 | 7 | public class ProCheckerTask extends BukkitRunnable { 8 | @Override 9 | public void run() { 10 | if (UltiTools.getInstance().getConfig().getBoolean("enable_pro")) { 11 | try { 12 | String res = UltiTools.getInstance().getProChecker().validatePro(); 13 | if (!res.equals("Pro Version Activated!")) { 14 | UltiTools.getInstance().getServer().getConsoleSender().sendMessage(ChatColor.GOLD + "[UltiTools] " + res); 15 | } 16 | } catch (Exception ignored) { 17 | try { 18 | UltiTools.getInstance().getProChecker().validatePro(); 19 | }catch (Exception ignored1){ 20 | } 21 | } 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/resources/en_death.yml: -------------------------------------------------------------------------------- 1 | # config version, please do not change 2 | config_version: 1.0 3 | 4 | # if enable item drop after death 5 | enable_item_drop: false 6 | 7 | # if enable money drop after death 8 | enable_money_drop: true 9 | 10 | # if enable command execute after death 11 | enable_punish_commands: true 12 | 13 | # Money dropped after death 14 | money_dropped_ondeath: 100 15 | 16 | # Item dropped after death 17 | item_dropped_ondeath: 3 18 | 19 | # Console commands executed after death ({PLAYER} means the player name) 20 | punish_command: [] 21 | 22 | # the whitelist of items dropping 23 | item_drop_whitelist: 24 | - AIR 25 | 26 | # worlds enabled item drop 27 | worlds_enabled_item_drop: 28 | - world 29 | - world_nether 30 | - world_the_end 31 | 32 | # worlds enabled money drop 33 | worlds_enabled_money_drop: 34 | - world 35 | - world_nether 36 | - world_the_end 37 | 38 | # worlds enabled punish commands 39 | worlds_enabled_punish_commands: 40 | - world 41 | - world_nether 42 | - world_the_end -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/commands/BackCommands.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.commands; 2 | 3 | import com.ultikits.abstracts.AbstractPlayerCommandExecutor; 4 | import com.ultikits.ultitools.listener.BackListener; 5 | import com.ultikits.ultitools.ultitools.UltiTools; 6 | import com.ultikits.utils.MessagesUtils; 7 | import org.bukkit.Location; 8 | import org.bukkit.command.Command; 9 | import org.bukkit.entity.Player; 10 | import org.jetbrains.annotations.NotNull; 11 | 12 | public class BackCommands extends AbstractPlayerCommandExecutor { 13 | @Override 14 | protected boolean onPlayerCommand(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) { 15 | Location location = BackListener.getPlayerLastDeathLocation(player.getUniqueId()); 16 | if (location != null){ 17 | player.teleport(location); 18 | }else { 19 | player.sendMessage(MessagesUtils.warning(UltiTools.languageUtils.getString("back_havent_dead"))); 20 | } 21 | return true; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /.github/workflows/maven.yml: -------------------------------------------------------------------------------- 1 | name: CI Build 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | paths-ignore: 8 | - 'doc/**' 9 | - '**.md' 10 | - '.github/**' 11 | - '.**' 12 | pull_request: 13 | paths-ignore: 14 | - 'doc/**' 15 | - '**.md' 16 | - '.github/**' 17 | - '.**' 18 | workflow_dispatch: 19 | 20 | jobs: 21 | build: 22 | name: Build 23 | runs-on: ubuntu-latest 24 | if: ${{ !startsWith(github.event.head_commit.message, '[skip ci]') }} 25 | 26 | steps: 27 | - uses: actions/checkout@v3 28 | - name: Set up JDK 17 29 | uses: actions/setup-java@v3 30 | with: 31 | java-version: '17' 32 | distribution: 'zulu' 33 | cache: maven 34 | 35 | - name: Build with Maven 36 | run: mvn -B package --file pom.xml 37 | 38 | - name: Upload built jar 39 | if: ${{ !github.event.pull_request }} 40 | uses: actions/upload-artifact@v3 41 | with: 42 | name: UltiTools 43 | path: target/UltiTools-**.jar 44 | -------------------------------------------------------------------------------- /src/main/resources/zh_announcement.yml: -------------------------------------------------------------------------------- 1 | announcement: 2 | #聊天栏公告 3 | message: 4 | #设置为true则启用这种类型的公告 5 | enable: true 6 | #公告发送周期,单位是秒 7 | period: 1200 8 | #message通知,支持§颜色代码 9 | broadcast: 10 | - "§6欢迎来到服务器" 11 | - "请友善对待他人" 12 | 13 | #bossbar血条公告 14 | bossbar: 15 | #设置为true则启用这种类型的公告 16 | enable: true 17 | #提示:“period”需要大于“stay” 18 | #bossbar通知切换的时间,单位是秒 19 | period: 1800 20 | #每个bossbar停留的时间 21 | stay: 5 22 | #bossbar通知,支持§颜色代码 23 | broadcast: 24 | - "§6欢迎来到服务器" 25 | - "请友善对待他人" 26 | 27 | #title message标题公告 28 | title: 29 | #设置为true则启用这种类型的公告 30 | enable: false 31 | #公告发送周期 32 | #提示:20tick = 1秒 33 | #peroid应当大于fade-in,stay,fade-out的总和 34 | #period的单位是秒 35 | period: 48000 36 | #公告淡入时间 37 | #单位是 tick 38 | fade-in: 10 39 | #公告显示时间 40 | #单位是 tick 41 | stay: 40 42 | #公告淡出时间 43 | #单位是 tick 44 | fade-out: 10 45 | #title通知,支持§颜色代码 46 | #格式:"标题": "副标题" 47 | broadcast: 48 | "§b遵守规定,友好相处": "相遇是缘分" 49 | "欢迎来到本服务器": "玩得开心" -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/commands/HealCommands.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.commands; 2 | 3 | import com.ultikits.abstracts.AbstractPlayerCommandExecutor; 4 | import com.ultikits.ultitools.ultitools.UltiTools; 5 | import org.bukkit.ChatColor; 6 | import org.bukkit.command.Command; 7 | import org.bukkit.entity.Player; 8 | import org.jetbrains.annotations.NotNull; 9 | 10 | import static com.ultikits.utils.MessagesUtils.warning; 11 | 12 | public class HealCommands extends AbstractPlayerCommandExecutor { 13 | @Override 14 | protected boolean onPlayerCommand(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) { 15 | if (player.hasPermission("ultikits.tools.command.heal")) { 16 | player.setHealth(player.getMaxHealth()); 17 | player.setFoodLevel(20); 18 | player.sendMessage(ChatColor.YELLOW + UltiTools.languageUtils.getString("heal_player")); 19 | return true; 20 | } 21 | player.sendMessage(warning(UltiTools.languageUtils.getString("no_permission"))); 22 | return true; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/commands/UnlockCommands.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.commands; 2 | 3 | import com.ultikits.abstracts.AbstractPlayerCommandExecutor; 4 | import com.ultikits.ultitools.ultitools.UltiTools; 5 | import com.ultikits.ultitools.utils.ChestLockUtils; 6 | import org.bukkit.ChatColor; 7 | import org.bukkit.command.Command; 8 | import org.bukkit.entity.Player; 9 | import org.jetbrains.annotations.NotNull; 10 | 11 | /** 12 | * @author wisdomme,qianmo 13 | * 14 | * Code refactoring by qianmo 15 | */ 16 | 17 | public class UnlockCommands extends AbstractPlayerCommandExecutor { 18 | @Override 19 | protected boolean onPlayerCommand(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) { 20 | if ("unlock".equalsIgnoreCase(command.getName())) { 21 | ChestLockUtils.cleanMode(player); 22 | ChestLockUtils.getInUnlockMode().add(player.getName()); 23 | player.sendMessage(ChatColor.GREEN + UltiTools.languageUtils.getString("unlock_click_to_unlock")); 24 | return true; 25 | } 26 | return false; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/listener/HomeListPageListener.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.listener; 2 | 3 | import com.ultikits.beans.CancelResult; 4 | import com.ultikits.inventoryapi.InventoryManager; 5 | import com.ultikits.inventoryapi.PagesListener; 6 | import com.ultikits.ultitools.ultitools.UltiTools; 7 | import org.bukkit.ChatColor; 8 | import org.bukkit.entity.Player; 9 | import org.bukkit.event.inventory.InventoryClickEvent; 10 | import org.bukkit.inventory.ItemStack; 11 | 12 | public class HomeListPageListener extends PagesListener { 13 | @Override 14 | public CancelResult onItemClick(InventoryClickEvent event, Player player, InventoryManager inventoryManager, ItemStack clickedItem) { 15 | if (inventoryManager.getTitle().contains(player.getName()+ UltiTools.languageUtils.getString("home_'s_home_list"))) { 16 | String homeName = ChatColor.stripColor(clickedItem.getItemMeta().getDisplayName()); 17 | player.performCommand("home " + homeName); 18 | player.closeInventory(); 19 | return CancelResult.TRUE; 20 | } 21 | return CancelResult.NONE; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/listener/WarpListener.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.listener; 2 | 3 | import com.ultikits.beans.CancelResult; 4 | import com.ultikits.inventoryapi.InventoryManager; 5 | import com.ultikits.inventoryapi.PagesListener; 6 | import com.ultikits.ultitools.ultitools.UltiTools; 7 | import org.bukkit.ChatColor; 8 | import org.bukkit.entity.Player; 9 | import org.bukkit.event.inventory.InventoryClickEvent; 10 | import org.bukkit.inventory.ItemStack; 11 | 12 | public class WarpListener extends PagesListener { 13 | @Override 14 | public CancelResult onItemClick(InventoryClickEvent inventoryClickEvent, Player player, InventoryManager inventoryManager, ItemStack itemStack) { 15 | if (!inventoryManager.getTitle().contains(UltiTools.languageUtils.getString("warp"))){ 16 | return CancelResult.NONE; 17 | } 18 | String name = ChatColor.stripColor(itemStack.getItemMeta().getDisplayName()).replace(UltiTools.languageUtils.getString("sidebar_name"), "").trim(); 19 | player.performCommand("warp " + name); 20 | player.closeInventory(); 21 | return CancelResult.TRUE; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/resources/zh_customgui.yml: -------------------------------------------------------------------------------- 1 | # GUI主体设置 2 | guis: 3 | # 配置一个界面 4 | main: 5 | # 界面大小 6 | size: 54 7 | # 界面标题 8 | title: 主菜单 9 | # 打开界面的命令(省略开头的ultitools,且只支持一个单词) 10 | command: gui 11 | # 打开此界面需要的权限(null为无需权限) 12 | premission: null 13 | # 右击含有该lore的物品即可打开该GUI页面 (null为菜单不进行物品绑定) 14 | bind-lore: "§右击打开菜单" 15 | 16 | # 所有的main的按钮请都放在main下 17 | main: 18 | # 示例按钮 19 | spawn: 20 | # 物品材质 21 | item: LOG 22 | # 物品位置(0-53取决于你的界面大小) 23 | position: 0 24 | # 显示名称 25 | name: 点击回到出生点 26 | # 物品的lore 27 | lore: 28 | - 在这里回到出生点 29 | # 玩家执行的命令 30 | player-commands: 31 | - spawn 32 | # 控制台执行的命令 33 | console-commands: [] 34 | # 执行这个功能需要的金币数量 35 | price: 0 36 | # 点击后保持GUI不关闭 37 | keep-open: true 38 | suicide: 39 | # 物品材质 40 | item: PAPER 41 | # 物品位置 42 | position: 53 43 | # 显示名称 44 | name: 点击自杀 45 | # 物品的lore 46 | lore: 47 | - 自杀 48 | # 玩家执行的命令 49 | player-commands: [] 50 | # 控制台执行的命令 51 | console-commands: 52 | - say {PLAYER} 自杀了! 53 | - kill {PLAYER} 54 | # 执行这个功能需要的金币数量 55 | price: 0 56 | # 点击后保持GUI不关闭 57 | keep-open: true 58 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/config/SideBarDataConfig.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.config; 2 | 3 | import com.ultikits.ultitools.enums.ConfigsEnum; 4 | import com.ultikits.ultitools.ultitools.UltiTools; 5 | import org.bukkit.configuration.file.YamlConfiguration; 6 | 7 | public class SideBarDataConfig extends AbstractConfig { 8 | 9 | private static final SideBarDataConfig sideBarDataConfig = new SideBarDataConfig("sideBarData", UltiTools.getInstance().getDataFolder() + "/sidebar", ConfigsEnum.SIDEBAR_DATA.toString(), "sideBarData.yml"); 10 | 11 | public SideBarDataConfig() { 12 | sideBarDataConfig.init(); 13 | } 14 | 15 | private SideBarDataConfig(String name, String folder, String filePath, String resourcePath) { 16 | super(name, folder, filePath, resourcePath); 17 | } 18 | 19 | @Override 20 | public void init() { 21 | if (!file.exists()) { 22 | UltiTools.yaml.saveYamlFile(String.valueOf(folder), "data.yml", resourcePath); 23 | } 24 | config = YamlConfiguration.loadConfiguration(file); 25 | if (!ConfigController.getConfigMap().containsKey(name)){ 26 | ConfigController.registerConfig(name, this); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/listener/TeleportListener.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.listener; 2 | 3 | 4 | import com.ultikits.ultitools.ultitools.UltiTools; 5 | import org.bukkit.Location; 6 | import org.bukkit.entity.Player; 7 | import org.bukkit.event.EventHandler; 8 | import org.bukkit.event.Listener; 9 | import org.bukkit.event.player.PlayerTeleportEvent; 10 | import org.bukkit.scheduler.BukkitRunnable; 11 | 12 | import java.util.HashMap; 13 | 14 | public class TeleportListener implements Listener { 15 | 16 | private static final HashMap playerTeleportLocation = new HashMap<>(); 17 | 18 | @EventHandler 19 | public void playerTeleport(PlayerTeleportEvent event) { 20 | new BukkitRunnable() { 21 | @Override 22 | public void run() { 23 | Player player = event.getPlayer(); 24 | Location teleportLocation = event.getFrom(); 25 | playerTeleportLocation.put(player,teleportLocation); 26 | } 27 | }.runTaskLaterAsynchronously(UltiTools.getInstance(),0); 28 | } 29 | 30 | public static Location getPlayerFinalTeleportLocation(Player player) { 31 | return playerTeleportLocation.get(player); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/config/SideBarConfig.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.config; 2 | 3 | import com.ultikits.ultitools.enums.ConfigsEnum; 4 | import com.ultikits.ultitools.ultitools.UltiTools; 5 | import org.bukkit.configuration.file.YamlConfiguration; 6 | 7 | public class SideBarConfig extends AbstractConfigReviewable{ 8 | 9 | private static final SideBarConfig sideBarConfig = new SideBarConfig("sidebar",UltiTools.getInstance().getDataFolder()+"/sidebar", ConfigsEnum.SIDEBAR.toString(), UltiTools.language+"_sidebar.yml"); 10 | 11 | public SideBarConfig() { 12 | sideBarConfig.init(); 13 | } 14 | 15 | private SideBarConfig(String name,String folder, String filePath, String resourcePath) { 16 | super(name, folder, filePath, resourcePath); 17 | version = 1.0; 18 | } 19 | 20 | @Override 21 | public void init() { 22 | if (file.exists()) { 23 | review(); 24 | } else { 25 | UltiTools.yaml.saveYamlFile(String.valueOf(folder), "config.yml", resourcePath); 26 | } 27 | config = YamlConfiguration.loadConfiguration(file); 28 | if (!ConfigController.getConfigMap().containsKey(name)){ 29 | ConfigController.registerConfig(name, this); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/config/GroupPermissionConfig.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.config; 2 | 3 | import com.ultikits.ultitools.enums.ConfigsEnum; 4 | import com.ultikits.ultitools.ultitools.UltiTools; 5 | import org.bukkit.configuration.file.YamlConfiguration; 6 | 7 | import java.util.ArrayList; 8 | 9 | public class GroupPermissionConfig extends AbstractConfig { 10 | 11 | // private static final GroupPermissionConfig groupPermissionConfig = new GroupPermissionConfig("groupPermissionConfig", ConfigsEnum.PERMISSION_GROUP.toString()); 12 | // 13 | // public GroupPermissionConfig() { 14 | // groupPermissionConfig.init(); 15 | // } 16 | // 17 | // private GroupPermissionConfig(String name, String filePath) { 18 | // super(name, filePath); 19 | // } 20 | // 21 | // @Override 22 | // void doInit(YamlConfiguration config) { 23 | // String defaultPath = "groups.default"; 24 | // config.set(defaultPath + ".name", UltiTools.languageUtils.getString("default")); 25 | // config.set(defaultPath + ".type", "PAPER"); 26 | // config.set(defaultPath + ".isDefault", true); 27 | // config.set(defaultPath + ".permissions", new ArrayList<>()); 28 | // config.set(defaultPath + ".inherited", new ArrayList<>()); 29 | // } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/listener/PermissionAddOnJoinListener.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.listener; 2 | 3 | import com.ultikits.ultitools.ultitools.UltiTools; 4 | import com.ultikits.ultitools.utils.GroupManagerUtils; 5 | import org.bukkit.entity.Player; 6 | import org.bukkit.event.EventHandler; 7 | import org.bukkit.event.Listener; 8 | import org.bukkit.event.player.PlayerJoinEvent; 9 | import org.bukkit.scheduler.BukkitRunnable; 10 | 11 | public class PermissionAddOnJoinListener implements Listener { 12 | 13 | @EventHandler 14 | public void onPlayerJoin(PlayerJoinEvent event){ 15 | new BukkitRunnable(){ 16 | 17 | @Override 18 | public void run() { 19 | Player player = event.getPlayer(); 20 | if (GroupManagerUtils.getGroup(player.getUniqueId())==null){ 21 | GroupManagerUtils.initPlayerData(player.getUniqueId()); 22 | } 23 | for (String permission : GroupManagerUtils.getAllPermissions(player.getUniqueId())){ 24 | GroupManagerUtils.addPlayerPermission(player, permission); 25 | } 26 | GroupManagerUtils.updateLastName(player); 27 | } 28 | }.runTaskAsynchronously(UltiTools.getInstance()); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/views/ApplyView.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.views; 2 | 3 | import com.ultikits.enums.Colors; 4 | import com.ultikits.inventoryapi.InventoryManager; 5 | import com.ultikits.inventoryapi.ViewManager; 6 | import com.ultikits.manager.ItemStackManager; 7 | import com.ultikits.ultitools.ultitools.UltiTools; 8 | import org.bukkit.inventory.Inventory; 9 | 10 | public class ApplyView { 11 | 12 | private ApplyView() { 13 | } 14 | 15 | public static Inventory setUp(String title){ 16 | InventoryManager inventoryManager = new InventoryManager(null, 27, title, true); 17 | inventoryManager.create(); 18 | ItemStackManager agreeItem = new ItemStackManager(UltiTools.versionAdaptor.getColoredPlaneGlass(Colors.GREEN), UltiTools.languageUtils.getString("button_yes")); 19 | ItemStackManager rejectItem = new ItemStackManager(UltiTools.versionAdaptor.getColoredPlaneGlass(Colors.RED), UltiTools.languageUtils.getString("button_no")); 20 | inventoryManager.setItem(11, agreeItem.getItem()); 21 | inventoryManager.setItem(15, rejectItem.getItem()); 22 | inventoryManager.setBackgroundColor(Colors.BLACK); 23 | ViewManager.registerView(inventoryManager); 24 | return inventoryManager.getInventory(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/listener/DeathListener.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.listener; 2 | 3 | import com.ultikits.ultitools.tasks.DeathPunishmentTask; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.EventHandler; 6 | import org.bukkit.event.Listener; 7 | import org.bukkit.event.entity.EntityDamageEvent; 8 | import org.bukkit.event.entity.PlayerDeathEvent; 9 | 10 | import java.util.ArrayList; 11 | import java.util.List; 12 | 13 | /** 14 | * @author qianmo, wisdomme 15 | */ 16 | public class DeathListener implements Listener { 17 | private static final List list = new ArrayList<>(); 18 | 19 | @EventHandler 20 | public void onPlayerDeath(PlayerDeathEvent event){ 21 | Player player = event.getEntity(); 22 | if (list.contains(player)){ 23 | list.remove(player); 24 | DeathPunishmentTask.addPlayerToQueue(player); 25 | } 26 | } 27 | 28 | @EventHandler 29 | public void onEntityDamage(EntityDamageEvent event) { 30 | if (!(event.getEntity() instanceof Player)) { 31 | return; 32 | } 33 | Player player = (Player) event.getEntity(); 34 | 35 | if (player.getHealth() > event.getFinalDamage()) { 36 | return; 37 | } 38 | list.add(player); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/listener/PermissionListener.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.listener; 2 | 3 | import com.ultikits.beans.CancelResult; 4 | import com.ultikits.inventoryapi.InventoryManager; 5 | import com.ultikits.inventoryapi.PagesListener; 6 | import com.ultikits.ultitools.ultitools.UltiTools; 7 | import org.bukkit.entity.Player; 8 | import org.bukkit.event.inventory.InventoryClickEvent; 9 | import org.bukkit.inventory.ItemStack; 10 | 11 | public class PermissionListener extends PagesListener { 12 | 13 | @Override 14 | public CancelResult onItemClick(InventoryClickEvent event, Player player, InventoryManager inventoryManager, ItemStack clickedItem) { 15 | // String playerName = ChatColor.stripColor(clickedItem.getItemMeta().getDisplayName()); 16 | // Player playerToGive = Bukkit.getPlayerExact(playerName); 17 | // if (ViewManager.getViewByName("请分配权限组")==null){ 18 | // GiveGroupPermissionView.setUp(); 19 | // } 20 | // ViewManager.openInventoryForPlayer(player, inventoryManager, ViewManager.getViewByName("请分配权限组")); 21 | if (!inventoryManager.getTitle().contains(UltiTools.languageUtils.getString("permission_check_page_title"))){ 22 | return CancelResult.NONE; 23 | } 24 | return CancelResult.TRUE; 25 | } 26 | 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/main/resources/en_cleaner.yml: -------------------------------------------------------------------------------- 1 | # config version, please do not change 2 | config_version: 1.2 3 | 4 | # the name of the cleaner 5 | cleaner_name: cleaner 6 | 7 | # if enable the cleaning task (When enable smart cleaning, this will have no be enable) 8 | clean_entity_task_enable: false 9 | 10 | # if enable unload chunks that is idle 11 | unload_chunk_task_enable: false 12 | 13 | # if enable smart cleaning 14 | enable_smart_clean: true 15 | 16 | # the time between cleaning 17 | clean_period: 3000 18 | 19 | # type of entity that needs to be cleaned (all-All types, items-Dropped items, mobs-living entities) 20 | clean_type: 21 | - all 22 | 23 | # the world needs to be cleaned (all-All worlds) 24 | clean_worlds: 25 | - all 26 | 27 | # the maximum dropped item which will cause a cleaning 28 | item_max: 2000 29 | 30 | # the maximum mobs which will cause a cleaning 31 | mob_max: 1000 32 | 33 | # the maximum entities which will cause a cleaning 34 | total_entity_max: 2500 35 | 36 | # the maximum distance between a player and a chunk which will make the system mark the chunk as idle 37 | max_chunk_distance: 320 38 | 39 | # the maximum chunks which will cause a cleaning 40 | max_unused_chunks: 100 41 | 42 | # the maximum chunks that will be cleaned per minute 43 | unload_chunks_per_minute: 10 44 | 45 | # the white list of entity which will not be cleaned 46 | clean_whitelist: [] -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/enums/CleanTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.enums; 2 | 3 | 4 | import com.ultikits.ultitools.ultitools.UltiTools; 5 | 6 | public enum CleanTypeEnum { 7 | MOBS(UltiTools.languageUtils.getString("mobs"), "mobs"), 8 | ITEMS(UltiTools.languageUtils.getString("dropped_item"), "items"), 9 | ENTITIES(UltiTools.languageUtils.getString("entity"), "all"), 10 | CHECK(UltiTools.languageUtils.getString("entity"), "check"); 11 | 12 | String name; 13 | String alis; 14 | 15 | CleanTypeEnum(String name, String alis) { 16 | this.name = name; 17 | this.alis = alis; 18 | } 19 | 20 | public String toString() { 21 | return this.name; 22 | } 23 | 24 | public String getAlis() { 25 | return this.alis; 26 | } 27 | 28 | public static String getNameByAlis(String alis) { 29 | for (CleanTypeEnum type : CleanTypeEnum.values()) { 30 | if (type.getAlis().equals(alis)) { 31 | return type.getAlis(); 32 | } 33 | } 34 | return null; 35 | } 36 | 37 | public static CleanTypeEnum getTypeByAlis(String alis) { 38 | for (CleanTypeEnum type : CleanTypeEnum.values()) { 39 | if (type.getAlis().equals(alis)) { 40 | return type; 41 | } 42 | } 43 | return null; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/listener/TpaAcceptListener.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.listener; 2 | 3 | import com.ultikits.ultitools.tasks.TpTimerTask; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.EventHandler; 6 | import org.bukkit.event.Listener; 7 | import org.bukkit.event.block.Action; 8 | import org.bukkit.event.player.PlayerInteractEvent; 9 | 10 | public class TpaAcceptListener implements Listener { 11 | 12 | @EventHandler 13 | public void onPlayerPressKey(PlayerInteractEvent event) { 14 | Player player = event.getPlayer(); 15 | if (player.isSneaking()) { 16 | if (TpTimerTask.tpTemp.get(player) != null) { 17 | tpOperation(event, player, "tpa"); 18 | } else if (TpTimerTask.tphereTemp.get(player) != null) { 19 | tpOperation(event, player, "tpahere"); 20 | } 21 | } 22 | } 23 | 24 | private void tpOperation(PlayerInteractEvent event, Player player, String command) { 25 | event.setCancelled(true); 26 | if (event.getAction() == Action.LEFT_CLICK_AIR || event.getAction() == Action.LEFT_CLICK_BLOCK) { 27 | player.performCommand(command + " accept"); 28 | } else if (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK) { 29 | player.performCommand(command + " reject"); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/commands/TpbackCommands.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.commands; 2 | 3 | import com.ultikits.abstracts.AbstractPlayerCommandExecutor; 4 | import com.ultikits.ultitools.listener.TeleportListener; 5 | import com.ultikits.ultitools.ultitools.UltiTools; 6 | import com.ultikits.utils.MessagesUtils; 7 | import org.bukkit.Location; 8 | import org.bukkit.World; 9 | import org.bukkit.command.Command; 10 | import org.bukkit.entity.Player; 11 | import org.jetbrains.annotations.NotNull; 12 | 13 | public class TpbackCommands extends AbstractPlayerCommandExecutor { 14 | @Override 15 | protected boolean onPlayerCommand(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) { 16 | World world = player.getWorld(); 17 | Location location = TeleportListener.getPlayerFinalTeleportLocation(player); 18 | Location newLocation = new Location(location.getWorld(), location.getX(),location.getY()+2,location.getZ()); 19 | if (!(location == null)) { 20 | newLocation.getWorld().getChunkAt(location).load(); 21 | player.teleport(location); 22 | player.sendMessage(MessagesUtils.info(UltiTools.languageUtils.getString("tpback_success"))); 23 | } else { 24 | player.sendMessage(MessagesUtils.warning(UltiTools.languageUtils.getString("tpback_location_not_found"))); 25 | } 26 | return false; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/config/ConfigController.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.config; 2 | 3 | import org.bukkit.configuration.file.YamlConfiguration; 4 | 5 | import java.util.HashMap; 6 | import java.util.Map; 7 | 8 | public class ConfigController { 9 | 10 | private static final Map configMap = new HashMap<>(); 11 | 12 | private ConfigController() { 13 | } 14 | 15 | public static void registerConfig(String name, AbstractConfig config) { 16 | configMap.put(name, config); 17 | } 18 | 19 | public static Map getConfigMap() { 20 | return configMap; 21 | } 22 | 23 | public static YamlConfiguration getConfig(String name) { 24 | return configMap.get(name).getConfig(); 25 | } 26 | 27 | public static void saveConfig(String configName) { 28 | AbstractConfig config = configMap.get(configName); 29 | config.save(); 30 | reloadConfig(config); 31 | } 32 | 33 | public static void reloadConfig(AbstractConfig config) { 34 | config.reload(); 35 | } 36 | 37 | public static void saveConfigs() { 38 | for (AbstractConfig configs : configMap.values()) { 39 | configs.save(); 40 | } 41 | } 42 | 43 | public static void reloadAll(){ 44 | for (AbstractConfig config : configMap.values()){ 45 | reloadConfig(config); 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.yml: -------------------------------------------------------------------------------- 1 | name: 🐛 BUG 反馈 2 | description: 请在这里反馈BUG 3 | labels: bug 插件功能问题 4 | body: 5 | - type: markdown 6 | attributes: 7 | value: | 8 | 非常感谢你来反馈该插件的BUG!但是在此之前请先确认你遇到的问题确实是一个BUG,按照[自主排错](https://ultikits.com/troubleshoot.html)的步骤也许能够解决你遇到的问题 9 | 目前仅接受5.2.1或更高版本的问题反馈,旧版本请先升级后尝试复现问题,仍存在问题再打开 Issue 10 | - type: textarea 11 | id: the-problem 12 | attributes: 13 | label: 你遇到的问题 14 | description: 15 | 详细描述一下你遇到的问题以及如何复现 16 | validations: 17 | required: true 18 | - type: dropdown 19 | id: version 20 | attributes: 21 | label: 插件版本 22 | description: 你现在正在使用的插件版本 23 | options: 24 | - 6.0.0 25 | - 5.2.1 26 | - 旧版本已不受支持 27 | - 这边建议先更新一下插件版本再看看有没有问题 28 | validations: 29 | required: true 30 | - type: input 31 | id: dep-version 32 | attributes: 33 | label: 各个依赖版本(可选,建议填写) 34 | description: 35 | '例如:PAPI:xxx Core:xxx Vault:xxx' 36 | - type: textarea 37 | id: logs 38 | attributes: 39 | label: 服务器日志(如无报错可不填) 40 | description: 41 | 在这里贴上**完整的**异常日志 42 | placeholder: 43 | 可以不用完整的日志,但一定要有重要的内容,如果你不确定哪些是有用的,你可以选择上传完整的内容 44 | - type: textarea 45 | id: screenshots 46 | attributes: 47 | label: 截图 48 | description: 如果需要,可以附上截图 49 | - type: textarea 50 | id: additional-context 51 | attributes: 52 | label: 额外信息 53 | description: 54 | 有什么想说的吗? 55 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/register/PapiRegister.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.register; 2 | 3 | import com.ultikits.ultitools.ultitools.UltiTools; 4 | import com.ultikits.ultitools.utils.EmailUtils; 5 | import com.ultikits.ultitools.utils.WorldUtils; 6 | import me.clip.placeholderapi.expansion.PlaceholderExpansion; 7 | import org.bukkit.entity.Player; 8 | 9 | public class PapiRegister extends PlaceholderExpansion { 10 | @Override 11 | public String getIdentifier() { 12 | return "ultitools"; 13 | } 14 | 15 | @Override 16 | public String getAuthor() { 17 | return "wisdomme"; 18 | } 19 | 20 | @Override 21 | public String getVersion() { 22 | return UltiTools.getInstance().getDescription().getVersion(); 23 | } 24 | 25 | @Override 26 | public boolean canRegister() { 27 | return true; 28 | } 29 | 30 | @Override 31 | public boolean persist() { 32 | return true; 33 | } 34 | 35 | @Override 36 | public String onPlaceholderRequest(Player player, String params) { 37 | if (player == null) { 38 | return ""; 39 | } 40 | switch (params){ 41 | case "new_email_num": 42 | return String.valueOf(EmailUtils.getUnReadEmailNum(player)); 43 | case "world_alis": 44 | return WorldUtils.getWorldAlisName(player.getUniqueId()); 45 | default: 46 | return null; 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/commands/FlyCommands.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.commands; 2 | 3 | import com.ultikits.ultitools.ultitools.UltiTools; 4 | import org.bukkit.ChatColor; 5 | import org.bukkit.command.Command; 6 | import org.bukkit.command.CommandExecutor; 7 | import org.bukkit.command.CommandSender; 8 | import org.bukkit.entity.Player; 9 | import org.jetbrains.annotations.NotNull; 10 | 11 | public class FlyCommands implements CommandExecutor { 12 | @Override 13 | public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { 14 | if(!((Player) sender).getAllowFlight()){ 15 | if(sender.hasPermission("ultikits.tools.command.fly")) { 16 | ((Player)sender).setAllowFlight(true); 17 | sender.sendMessage(ChatColor.YELLOW + UltiTools.languageUtils.getString("fly_enabled")); 18 | } else { 19 | sender.sendMessage(ChatColor.RED + UltiTools.languageUtils.getString("no_permission")); 20 | } 21 | } else { 22 | if(sender.hasPermission("ultikits.tools.command.fly")) { 23 | ((Player)sender).setAllowFlight(false); 24 | sender.sendMessage(ChatColor.YELLOW + UltiTools.languageUtils.getString("fly_disabled")); 25 | } else { 26 | sender.sendMessage(ChatColor.RED + UltiTools.languageUtils.getString("no_permission")); 27 | } 28 | } 29 | 30 | return false; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/tasks/TradeTask.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.tasks; 2 | 3 | import com.ultikits.ultitools.ultitools.UltiTools; 4 | import com.ultikits.ultitools.utils.TradeUtils; 5 | import org.bukkit.Bukkit; 6 | import org.bukkit.boss.BarColor; 7 | import org.bukkit.boss.BarFlag; 8 | import org.bukkit.boss.BarStyle; 9 | import org.bukkit.boss.BossBar; 10 | import org.bukkit.entity.Player; 11 | import org.bukkit.scheduler.BukkitRunnable; 12 | 13 | public class TradeTask extends BukkitRunnable { 14 | 15 | private final BossBar bossBar; 16 | private final Player to; 17 | 18 | public TradeTask (Player From, Player To) { 19 | to = To; 20 | bossBar = Bukkit.createBossBar( 21 | String.format(UltiTools.languageUtils.getString("trade_request"), From.getName()), 22 | BarColor.PURPLE, 23 | BarStyle.SOLID, 24 | BarFlag.CREATE_FOG 25 | ); 26 | bossBar.setProgress(1.00); 27 | bossBar.addPlayer(To); 28 | } 29 | 30 | @Override 31 | public void run() { 32 | if (bossBar.getProgress() > 0.01 && TradeUtils.isPlayerInRequestMode(to)) { 33 | bossBar.setProgress(bossBar.getProgress() - 0.01); 34 | } else if (TradeUtils.isPlayerInTradeMode(to)){ 35 | bossBar.removeAll(); 36 | this.cancel(); 37 | } else { 38 | if (TradeUtils.isPlayerInRequestMode(to)) TradeUtils.rejectTrade(to); 39 | bossBar.removeAll(); 40 | this.cancel(); 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/beans/DoubleChestLocation.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.beans; 2 | 3 | import org.bukkit.Location; 4 | import org.bukkit.block.Block; 5 | import org.bukkit.block.Chest; 6 | import org.bukkit.block.DoubleChest; 7 | import org.bukkit.inventory.Inventory; 8 | import org.bukkit.inventory.InventoryHolder; 9 | 10 | public class DoubleChestLocation { 11 | private Location rightSideLocation; 12 | private Location leftSideLocation; 13 | 14 | public DoubleChestLocation(Block chest) { 15 | Chest state = (Chest) chest.getState(); 16 | Inventory inventory = state.getInventory(); 17 | DoubleChest doubleChest = (DoubleChest) inventory.getHolder(); 18 | assert doubleChest != null; 19 | InventoryHolder rightSide = doubleChest.getRightSide(); 20 | InventoryHolder leftSide = doubleChest.getLeftSide(); 21 | if (rightSide == null || leftSide == null) { 22 | return; 23 | } 24 | Location doubleChestLocation = doubleChest.getLocation(); 25 | rightSideLocation = new Location(doubleChestLocation.getWorld(), doubleChestLocation.getX(), doubleChestLocation.getY(), doubleChestLocation.getZ() - 0.5); 26 | leftSideLocation = new Location(doubleChestLocation.getWorld(), doubleChestLocation.getX(), doubleChestLocation.getY(), doubleChestLocation.getZ() + 0.5); 27 | } 28 | 29 | public Location getRightSideLocation() { 30 | return rightSideLocation; 31 | } 32 | 33 | public Location getLeftSideLocation() { 34 | return leftSideLocation; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/listener/WorldsListListener.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.listener; 2 | 3 | import com.ultikits.beans.CancelResult; 4 | import com.ultikits.inventoryapi.InventoryManager; 5 | import com.ultikits.inventoryapi.PagesListener; 6 | import com.ultikits.ultitools.config.ConfigController; 7 | import com.ultikits.ultitools.ultitools.UltiTools; 8 | import org.bukkit.ChatColor; 9 | import org.bukkit.configuration.file.YamlConfiguration; 10 | import org.bukkit.entity.Player; 11 | import org.bukkit.event.inventory.InventoryClickEvent; 12 | import org.bukkit.inventory.ItemStack; 13 | 14 | public class WorldsListListener extends PagesListener { 15 | @Override 16 | public CancelResult onItemClick(InventoryClickEvent event, Player player, InventoryManager inventoryManager, ItemStack clickedItem) { 17 | if (!inventoryManager.getTitle().contains(UltiTools.languageUtils.getString("world_page_title"))) { 18 | return CancelResult.NONE; 19 | } 20 | String aliasName = ChatColor.stripColor(clickedItem.getItemMeta().getDisplayName()); 21 | YamlConfiguration config = ConfigController.getConfig("worlds"); 22 | for (String each : config.getConfigurationSection("world").getKeys(false)){ 23 | if (aliasName.equals(config.getString("world."+each+".alias"))){ 24 | player.performCommand("mw " + each); 25 | player.closeInventory(); 26 | return CancelResult.TRUE; 27 | } 28 | } 29 | player.performCommand("mw " + aliasName); 30 | player.closeInventory(); 31 | return CancelResult.TRUE; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /doc/allclasses-noframe.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 所有类 8 | 9 | 10 | 11 | 12 | 13 |

所有类

14 |
15 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/commands/RemoteBagConsoleCommands.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.commands; 2 | 3 | import com.ultikits.abstracts.AbstractConsoleCommandExecutor; 4 | import com.ultikits.ultitools.enums.ConfigsEnum; 5 | import com.ultikits.ultitools.ultitools.UltiTools; 6 | import org.bukkit.command.Command; 7 | import org.bukkit.command.CommandSender; 8 | import org.bukkit.configuration.file.YamlConfiguration; 9 | import org.jetbrains.annotations.NotNull; 10 | 11 | import java.io.File; 12 | import java.io.IOException; 13 | 14 | import static com.ultikits.utils.MessagesUtils.info; 15 | 16 | 17 | public class RemoteBagConsoleCommands extends AbstractConsoleCommandExecutor { 18 | 19 | @Override 20 | protected boolean onConsoleCommand(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String[] strings) { 21 | if (strings.length == 1) { 22 | File file = new File(ConfigsEnum.PLAYER_CHEST.toString(), strings[0] + ".yml"); 23 | YamlConfiguration config = YamlConfiguration.loadConfiguration(file); 24 | int i = 1; 25 | while (true) { 26 | if (config.get(String.valueOf(i)) == null) { 27 | config.set(String.valueOf(i), ""); 28 | break; 29 | } 30 | i++; 31 | } 32 | try { 33 | config.save(file); 34 | } catch (IOException e) { 35 | e.printStackTrace(); 36 | } 37 | commandSender.sendMessage(info(String.format(UltiTools.languageUtils.getString("bag_create_new_bag_for_someone_successfully"), strings[0]))); 38 | } 39 | return false; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/listener/RightClickListener.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.listener; 2 | 3 | import com.ultikits.ultitools.enums.ConfigsEnum; 4 | import org.bukkit.Bukkit; 5 | import org.bukkit.configuration.ConfigurationSection; 6 | import org.bukkit.configuration.file.YamlConfiguration; 7 | import org.bukkit.event.EventHandler; 8 | import org.bukkit.event.Listener; 9 | import org.bukkit.event.block.Action; 10 | import org.bukkit.event.player.PlayerInteractEvent; 11 | 12 | import java.io.File; 13 | import java.util.Objects; 14 | import java.util.Set; 15 | 16 | 17 | public class RightClickListener implements Listener { 18 | File guiFile = new File(ConfigsEnum.CUSTOMERGUI.toString()); 19 | YamlConfiguration guiConfig = YamlConfiguration.loadConfiguration(guiFile); 20 | ConfigurationSection guis = guiConfig.getConfigurationSection("guis"); 21 | Set guiList = guis.getKeys(false); 22 | 23 | @EventHandler 24 | public void onRightClick(PlayerInteractEvent e) { 25 | for(String guiName : guiList) { 26 | String lore = guiConfig.getString("guis." + guiName + ".bind-lore"); 27 | if(lore == null || !(e.getAction() == Action.RIGHT_CLICK_AIR || e.getAction() == Action.RIGHT_CLICK_BLOCK)) { 28 | return; 29 | } 30 | try { 31 | if (e.getItem().getItemMeta().getLore().contains(lore)) { 32 | Objects.requireNonNull(Bukkit.getPlayer(e.getPlayer().getName())).performCommand("ultitools " + guiConfig.getString("guis." + guiName + ".command")); 33 | } 34 | } catch (NullPointerException exception) { 35 | return; 36 | } 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/main/resources/en_customgui.yml: -------------------------------------------------------------------------------- 1 | # GUI Main Body 2 | guis: 3 | # setup a page 4 | main: 5 | # gui size 6 | size: 54 7 | # gui title 8 | title: Main page 9 | # command argument to open this gui (don't include ultitools, and only one word) 10 | command: gui 11 | # the permission to open this gui (set to null is no permission needed) 12 | premission: null 13 | # right click the item with the lore below will open this gui page (set to null if you dont need it) 14 | bind-lore: "§Right click to open main menu" 15 | 16 | # all buttons those belong to its page please write under the page name 17 | main: 18 | # sample button 19 | up: 20 | # item type 21 | item: LOG 22 | # item position(0-53 depends on your page size) 23 | position: 0 24 | # display name 25 | name: click to back to spawn 26 | # item lore 27 | lore: 28 | - go back to spawn point 29 | # player commands 30 | player-commands: 31 | - spawn 32 | # console commands 33 | console-commands: [] 34 | # money need to execute this function 35 | price: 0 36 | # keep the gui open after click 37 | keep-open: true 38 | # sample button 39 | info: 40 | # item type 41 | item: PAPER 42 | # item position(0-53 depends on your page size) 43 | position: 53 44 | # display name 45 | name: click to suicide 46 | # item lore 47 | lore: 48 | - suicide if you want 49 | # player commands 50 | player-commands: [] 51 | # console commands 52 | console-commands: 53 | - say {PLAYER} suicided! 54 | - kill {PLAYER} 55 | # money need to execute this function 56 | price: 0 57 | # keep the gui open after click 58 | keep-open: true 59 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/listener/CommandListener.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.listener; 2 | 3 | import com.ultikits.ultitools.enums.ConfigsEnum; 4 | import org.bukkit.Bukkit; 5 | import org.bukkit.configuration.file.YamlConfiguration; 6 | import org.bukkit.event.EventHandler; 7 | import org.bukkit.event.Listener; 8 | import org.bukkit.event.player.PlayerCommandPreprocessEvent; 9 | import java.io.File; 10 | import java.util.ArrayList; 11 | import java.util.List; 12 | import java.util.Set; 13 | 14 | public class CommandListener implements Listener { 15 | File commandaliasFile = new File(ConfigsEnum.COMMANDALIAS.toString()); 16 | YamlConfiguration commandaliasConfig = YamlConfiguration.loadConfiguration(commandaliasFile); 17 | Set commands = commandaliasConfig.getKeys(false); 18 | 19 | @EventHandler 20 | public void onCommandSend(PlayerCommandPreprocessEvent e) { 21 | for(String command : commands) { 22 | List alias = commandaliasConfig.getStringList(command); 23 | for(String alia : alias) { 24 | if(e.getMessage().equals("/" + alia)) { 25 | Bukkit.getServer().getPlayer(e.getPlayer().getName()).performCommand(command); 26 | e.setCancelled(true); 27 | return; 28 | } 29 | } 30 | } 31 | } 32 | 33 | public List getCommandAliasList() { 34 | List commandAliasList = new ArrayList<>(); 35 | for(String command:commands) { 36 | List alias = commandaliasConfig.getStringList(command); 37 | for(String alia : alias) { 38 | commandAliasList.add(alia); 39 | } 40 | } 41 | return commandAliasList; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/utils/WorldUtils.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.utils; 2 | 3 | import com.ultikits.ultitools.config.ConfigController; 4 | import com.ultikits.ultitools.enums.ConfigsEnum; 5 | import org.bukkit.Bukkit; 6 | import org.bukkit.World; 7 | import org.bukkit.configuration.file.YamlConfiguration; 8 | import org.bukkit.entity.Player; 9 | 10 | import java.io.IOException; 11 | import java.util.UUID; 12 | 13 | public class WorldUtils { 14 | public static String getWorldAlisName(UUID uuid){ 15 | Player player = Bukkit.getPlayer(uuid); 16 | if (player == null){ 17 | return null; 18 | } 19 | World world = player.getWorld(); 20 | if (world.getName().equalsIgnoreCase("world_nether")) { 21 | return getWorldAlisName("Nether"); 22 | } else if (world.getName().equalsIgnoreCase("world_the_end")) { 23 | return getWorldAlisName("End"); 24 | } else if (world.getName().equalsIgnoreCase("world")) { 25 | return getWorldAlisName("World"); 26 | } else { 27 | return getWorldAlisName(world.getName()); 28 | } 29 | } 30 | 31 | public static String getWorldAlisName(String worldName){ 32 | YamlConfiguration config = ConfigController.getConfig("worlds"); 33 | String aliasName = config.getString("world." + worldName + ".alias"); 34 | if (aliasName == null){ 35 | config.set("world." + worldName + ".alias", worldName); 36 | try { 37 | config.save(ConfigsEnum.WORLDS.toString()); 38 | } catch (IOException ignored) { 39 | } 40 | } 41 | aliasName = (aliasName == null ? worldName : aliasName.replaceAll("&", "§")); 42 | return aliasName; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/resources/en_announcement.yml: -------------------------------------------------------------------------------- 1 | announcement: 2 | #announcement in chat bar 3 | message: 4 | #set it to true to enable this kind of announcement 5 | enable: true 6 | #message announcement switchover time,measured in SECONDS 7 | peroid: 1200 8 | #message announcement,you can ues § to set their colors 9 | broadcast: 10 | - "§6Welcome to the server" 11 | - "Please be kind to others" 12 | 13 | #announcement through bossbar 14 | bossbar: 15 | #set it to true to enable this kind of announcement 16 | enable: true 17 | #"period" should be greater than "stay" 18 | #bossbar announcement switchover time,measured in SECONDS 19 | period: 1800 20 | #Time for each bossbar announcement to stay,measured in SECONDS 21 | stay: 5 22 | #bossbar announcement,you can ues § to set their colors 23 | broadcast: 24 | - "§6Welcome to the server" 25 | - "Please be kind to others" 26 | 27 | #announcement through title message 28 | title: 29 | #set it to true to enable this kind of announcement 30 | enable: false 31 | #title announcement switchover time 32 | #tips:20 ticks equals to 1 second 33 | #period should be greater than the summary of fade-in,stay and fade-out 34 | #period is measured in SECONDS 35 | peroid: 48000 36 | #time for the title to fade in 37 | #measured in TICKS 38 | fade-in: 10 39 | #time for the title to stay 40 | #measured in TICKS 41 | stay: 40 42 | #time for the title to stay 43 | #measured in TICKS 44 | fade-out: 10 45 | #title announcement,you can ues § to set their colors 46 | #format: "Title": "Subtitle" 47 | broadcast: 48 | "§bPlease obey the server rules": "Happy to meet you!" 49 | "Welcome to this server": "Have a good time!" -------------------------------------------------------------------------------- /doc/allclasses-frame.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 所有类 8 | 9 | 10 | 11 | 12 | 13 |

所有类

14 |
15 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/listener/ArmorSeeListener.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.listener; 2 | 3 | import com.ultikits.beans.CancelResult; 4 | import com.ultikits.inventoryapi.InventoryManager; 5 | import com.ultikits.inventoryapi.PagesListener; 6 | import com.ultikits.ultitools.ultitools.UltiTools; 7 | import org.bukkit.Bukkit; 8 | import org.bukkit.entity.Player; 9 | import org.bukkit.event.inventory.InventoryClickEvent; 10 | import org.bukkit.inventory.ItemStack; 11 | 12 | public class ArmorSeeListener extends PagesListener { 13 | @Override 14 | public CancelResult onItemClick(InventoryClickEvent inventoryClickEvent, Player player, InventoryManager inventoryManager, ItemStack itemStack) { 15 | if (!inventoryManager.getTitle().contains(UltiTools.languageUtils.getString("armor_title"))) return CancelResult.NONE; 16 | Player p = Bukkit.getPlayer(inventoryManager.getTitle().split("-")[1]); 17 | try { 18 | p.getInventory().setItemInOffHand(inventoryManager.getInventory().getItem(8)); 19 | p.getInventory().setHelmet(inventoryManager.getInventory().getItem(0)); 20 | p.getInventory().setChestplate(inventoryManager.getInventory().getItem(2)); 21 | p.getInventory().setLeggings(inventoryManager.getInventory().getItem(4)); 22 | p.getInventory().setBoots(inventoryManager.getInventory().getItem(6)); 23 | } catch (Exception ignored) { 24 | p.getInventory().setHelmet(inventoryManager.getInventory().getItem(1)); 25 | p.getInventory().setChestplate(inventoryManager.getInventory().getItem(3)); 26 | p.getInventory().setLeggings(inventoryManager.getInventory().getItem(5)); 27 | p.getInventory().setBoots(inventoryManager.getInventory().getItem(7)); 28 | } 29 | return CancelResult.NONE; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/commands/SpeedCommands.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.commands; 2 | 3 | import com.ultikits.abstracts.AbstractTabExecutor; 4 | import com.ultikits.ultitools.ultitools.UltiTools; 5 | import org.bukkit.ChatColor; 6 | import org.bukkit.command.Command; 7 | import org.bukkit.entity.Player; 8 | import org.jetbrains.annotations.NotNull; 9 | import org.jetbrains.annotations.Nullable; 10 | 11 | import java.util.Arrays; 12 | import java.util.List; 13 | 14 | import static com.ultikits.utils.MessagesUtils.warning; 15 | 16 | public class SpeedCommands extends AbstractTabExecutor { 17 | List speeds = Arrays.asList("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"); 18 | 19 | @Override 20 | protected boolean onPlayerCommand(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) { 21 | if (player.hasPermission("ultikits.tools.command.speed")) { 22 | if (!speeds.contains(strings[0])) { 23 | return false; 24 | } 25 | player.setWalkSpeed(Float.parseFloat(strings[0]) / 10); 26 | player.setFlySpeed(Float.parseFloat(strings[0]) / 10); 27 | player.sendMessage(ChatColor.YELLOW + String.format(UltiTools.languageUtils.getString("speed_set"), strings[0])); 28 | return true; 29 | } 30 | player.sendMessage(warning(UltiTools.languageUtils.getString("no_permission"))); 31 | return true; 32 | } 33 | 34 | @Nullable 35 | @Override 36 | protected List onPlayerTabComplete(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) { 37 | if (!player.hasPermission("ultikits.tools.commands.speed")) { 38 | return null; 39 | } 40 | if (strings.length == 1) { 41 | return speeds; 42 | } 43 | return null; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/tasks/NamePrefixSuffixTask.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.tasks; 2 | 3 | import com.ultikits.ultitools.ultitools.UltiTools; 4 | import com.ultikits.utils.TitlesUtils; 5 | import me.clip.placeholderapi.PlaceholderAPI; 6 | import org.bukkit.Bukkit; 7 | import org.bukkit.entity.Player; 8 | import org.bukkit.scheduler.BukkitRunnable; 9 | 10 | import java.util.Objects; 11 | 12 | public class NamePrefixSuffixTask extends BukkitRunnable { 13 | 14 | @Override 15 | public void run() { 16 | for (Player player : Bukkit.getOnlinePlayers()) { 17 | String prefix; 18 | String suffix; 19 | if (UltiTools.isPAPILoaded && UltiTools.getInstance().getConfig().getBoolean("enable_PAPI")) { 20 | try { 21 | prefix = Objects.requireNonNull(PlaceholderAPI.setPlaceholders(player, UltiTools.getInstance().getConfig().getString("name_prefix"))); 22 | suffix = Objects.requireNonNull(PlaceholderAPI.setPlaceholders(player, UltiTools.getInstance().getConfig().getString("name_suffix"))); 23 | } catch (Exception e) { 24 | prefix = ""; 25 | suffix = ""; 26 | } 27 | } else { 28 | prefix = ""; 29 | suffix = ""; 30 | } 31 | String version = UltiTools.getInstance().getServer().getVersion(); 32 | if (Integer.parseInt(version.split("MC: ")[1].replaceAll("[.)]", "")) < 1130) { 33 | if (prefix.length() > 16){ 34 | prefix = prefix.substring(0, 16); 35 | } 36 | if (suffix.length() > 16) { 37 | suffix = suffix.substring(0, 16); 38 | } 39 | } 40 | TitlesUtils.setPrefixSuffix(player, prefix, suffix); 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/commands/LockCommands.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.commands; 2 | 3 | import com.ultikits.abstracts.AbstractPlayerCommandExecutor; 4 | import com.ultikits.ultitools.ultitools.UltiTools; 5 | import com.ultikits.ultitools.utils.ChestLockUtils; 6 | import org.bukkit.ChatColor; 7 | import org.bukkit.command.Command; 8 | import org.bukkit.entity.Player; 9 | import org.jetbrains.annotations.NotNull; 10 | 11 | /** 12 | * @author wisdomme,qianmo 13 | * 14 | * Code refactoring by qianmo 15 | */ 16 | 17 | public class LockCommands extends AbstractPlayerCommandExecutor { 18 | @Override 19 | protected boolean onPlayerCommand(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) { 20 | if ("lock".equalsIgnoreCase(command.getName())) { 21 | if (strings.length == 0) { 22 | ChestLockUtils.cleanMode(player); 23 | ChestLockUtils.getInLockMode().add(player.getName()); 24 | player.sendMessage(ChatColor.GREEN + UltiTools.languageUtils.getString("lock_click_to_lock")); 25 | return true; 26 | } 27 | if ("add".equalsIgnoreCase(strings[0])) { 28 | ChestLockUtils.cleanMode(player); 29 | ChestLockUtils.getInAddMode().put(player.getName(), strings [1]); 30 | player.sendMessage(ChatColor.GREEN + UltiTools.languageUtils.getString("chest_click_add_owner")); 31 | return true; 32 | } 33 | if("remove".equalsIgnoreCase(strings[0])) { 34 | ChestLockUtils.cleanMode(player); 35 | ChestLockUtils.getInRemoveMode().put(player.getName(), strings[1]); 36 | player.sendMessage(ChatColor.GREEN + UltiTools.languageUtils.getString("chest_click_remove_owner")); 37 | return true; 38 | } 39 | } 40 | return false; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/utils/HomeUtils.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.utils; 2 | 3 | import com.ultikits.ultitools.enums.ConfigsEnum; 4 | import com.ultikits.ultitools.ultitools.UltiTools; 5 | import com.ultikits.utils.MessagesUtils; 6 | import org.bukkit.ChatColor; 7 | import org.bukkit.Location; 8 | import org.bukkit.configuration.file.YamlConfiguration; 9 | import org.bukkit.entity.Player; 10 | 11 | import java.io.File; 12 | import java.io.IOException; 13 | import java.util.List; 14 | 15 | public class HomeUtils { 16 | 17 | public static void setHome(Player player, String homeName) { 18 | setHome(player, homeName, null); 19 | } 20 | 21 | public static void setHome(Player player, String homeName, Location homeLocation) { 22 | if (Utils.getHomeList(player).contains(homeName) && homeLocation == null) { 23 | player.sendMessage(MessagesUtils.warning(UltiTools.languageUtils.getString("sethome_home_already_have"))); 24 | return; 25 | } 26 | File file = new File(ConfigsEnum.PLAYER.toString(), player.getName() + ".yml"); 27 | YamlConfiguration config = YamlConfiguration.loadConfiguration(file); 28 | 29 | List stringList = config.getStringList(player.getName() + ".homelist"); 30 | config.set(player.getName() + "." + homeName, homeLocation == null ? player.getLocation() : homeLocation); 31 | if (homeName.equals("Def")) { 32 | homeName = UltiTools.languageUtils.getString("default"); 33 | } 34 | if (!stringList.contains(homeName)) stringList.add(homeName); 35 | config.set(player.getName() + ".homelist", stringList); 36 | try { 37 | config.save(file); 38 | } catch (IOException e) { 39 | e.printStackTrace(); 40 | } 41 | player.sendMessage(ChatColor.YELLOW + UltiTools.languageUtils.getString("sethome_successfully")); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /doc/com/minecraft/ultikits/inventoryapi/package-frame.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | com.minecraft.ultikits.inventoryapi 8 | 9 | 10 | 11 | 12 | 13 |

com.minecraft.ultikits.inventoryapi

14 |
15 |

接口

16 | 19 |

20 | 26 |

枚举

27 | 31 |
32 | 33 | 34 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/listener/FriendsViewListener.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.listener; 2 | 3 | import com.ultikits.beans.CancelResult; 4 | import com.ultikits.inventoryapi.InventoryManager; 5 | import com.ultikits.inventoryapi.PagesListener; 6 | import com.ultikits.ultitools.ultitools.UltiTools; 7 | import net.md_5.bungee.api.chat.ClickEvent; 8 | import net.md_5.bungee.api.chat.TextComponent; 9 | import org.bukkit.Bukkit; 10 | import org.bukkit.ChatColor; 11 | import org.bukkit.entity.Player; 12 | import org.bukkit.event.inventory.ClickType; 13 | import org.bukkit.event.inventory.InventoryClickEvent; 14 | import org.bukkit.inventory.ItemStack; 15 | 16 | public class FriendsViewListener extends PagesListener { 17 | @Override 18 | public CancelResult onItemClick(InventoryClickEvent inventoryClickEvent, Player player, InventoryManager inventoryManager, ItemStack itemStack) { 19 | if (!inventoryClickEvent.getView().getTitle().contains(UltiTools.languageUtils.getString("friend_list") + " - " + player.getName())) { 20 | return CancelResult.NONE; 21 | } 22 | String friend = ChatColor.stripColor(itemStack.getItemMeta().getDisplayName()); 23 | Player clickedFriend = Bukkit.getPlayer(friend); 24 | if (clickedFriend == null) { 25 | return CancelResult.TRUE; 26 | } 27 | if (inventoryClickEvent.getClick() == ClickType.LEFT) { 28 | player.performCommand("tpa " + friend); 29 | } else if (inventoryClickEvent.getClick() == ClickType.RIGHT) { 30 | player.closeInventory(); 31 | TextComponent text = new TextComponent(ChatColor.YELLOW + String.format(UltiTools.languageUtils.getString("friend_click_tell"), ChatColor.RED + friend + ChatColor.YELLOW)); 32 | text.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/tell " + friend + " ")); 33 | player.spigot().sendMessage(text); 34 | } 35 | return CancelResult.TRUE; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/views/ArmorView.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.views; 2 | 3 | import com.ultikits.enums.Colors; 4 | import com.ultikits.inventoryapi.InventoryManager; 5 | import com.ultikits.inventoryapi.ViewManager; 6 | import com.ultikits.ultitools.ultitools.UltiTools; 7 | import org.bukkit.entity.Player; 8 | import org.bukkit.inventory.Inventory; 9 | import org.bukkit.scheduler.BukkitRunnable; 10 | 11 | public class ArmorView { 12 | private ArmorView() { 13 | } 14 | 15 | public static Inventory setUp(Player player) { 16 | String title = UltiTools.languageUtils.getString("armor_title") + "-" + player.getName(); 17 | InventoryManager inventoryManager = new InventoryManager(null, 9, title, true); 18 | inventoryManager.setBackgroundColor(Colors.GRAY); 19 | inventoryManager.create(); 20 | ViewManager.registerView(inventoryManager); 21 | new BukkitRunnable() { 22 | @Override 23 | public void run() { 24 | try { 25 | inventoryManager.setItem(0, player.getInventory().getHelmet()); 26 | inventoryManager.setItem(2, player.getInventory().getChestplate()); 27 | inventoryManager.setItem(4, player.getInventory().getLeggings()); 28 | inventoryManager.setItem(6, player.getInventory().getBoots()); 29 | inventoryManager.setItem(8, player.getInventory().getItemInOffHand()); 30 | } catch(Exception ignored) { 31 | inventoryManager.setItem(1, player.getInventory().getHelmet()); 32 | inventoryManager.setItem(3, player.getInventory().getChestplate()); 33 | inventoryManager.setItem(5, player.getInventory().getLeggings()); 34 | inventoryManager.setItem(7, player.getInventory().getBoots()); 35 | } 36 | } 37 | }.runTaskAsynchronously(UltiTools.getInstance()); 38 | return inventoryManager.getInventory(); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/config/AbstractConfig.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.config; 2 | 3 | import com.ultikits.ultitools.ultitools.UltiTools; 4 | import org.bukkit.configuration.file.YamlConfiguration; 5 | 6 | import java.io.File; 7 | import java.io.IOException; 8 | 9 | public abstract class AbstractConfig { 10 | String name; 11 | String filePath; 12 | String resourcePath; 13 | File file; 14 | String folder; 15 | YamlConfiguration config; 16 | 17 | AbstractConfig() { 18 | } 19 | 20 | public AbstractConfig(String name, String filePath) { 21 | this.name = name; 22 | this.folder = String.valueOf(UltiTools.getInstance().getDataFolder()); 23 | this.filePath = filePath; 24 | this.resourcePath = UltiTools.language + "_" + name + ".yml"; 25 | this.file = new File(filePath); 26 | config = YamlConfiguration.loadConfiguration(file); 27 | } 28 | 29 | public AbstractConfig(String name, String folder, String filePath, String resourcePath) { 30 | this.name = name; 31 | this.folder = folder; 32 | this.filePath = filePath; 33 | this.resourcePath = resourcePath; 34 | this.file = new File(filePath); 35 | config = YamlConfiguration.loadConfiguration(file); 36 | } 37 | 38 | public void init() { 39 | if (!file.exists()) { 40 | UltiTools.yaml.saveYamlFile(folder, name + ".yml", resourcePath); 41 | } 42 | config = YamlConfiguration.loadConfiguration(file); 43 | if (!ConfigController.getConfigMap().containsKey(name)){ 44 | ConfigController.registerConfig(name, this); 45 | } 46 | } 47 | 48 | public void reload() { 49 | config = YamlConfiguration.loadConfiguration(file); 50 | } 51 | 52 | public void save() { 53 | try { 54 | config.save(file); 55 | } catch (IOException e) { 56 | e.printStackTrace(); 57 | } 58 | reload(); 59 | } 60 | 61 | public YamlConfiguration getConfig() { 62 | return config; 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/tasks/UnloadChunksTask.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.tasks; 2 | 3 | import com.ultikits.ultitools.enums.ConfigsEnum; 4 | import com.ultikits.ultitools.ultitools.UltiTools; 5 | import org.bukkit.Chunk; 6 | import org.bukkit.configuration.file.YamlConfiguration; 7 | import org.bukkit.scheduler.BukkitRunnable; 8 | 9 | import java.io.File; 10 | import java.util.List; 11 | import java.util.Random; 12 | 13 | public class UnloadChunksTask extends BukkitRunnable { 14 | final static File file = new File(ConfigsEnum.CLEANER.toString()); 15 | final static YamlConfiguration config = YamlConfiguration.loadConfiguration(file); 16 | 17 | final static int maxChunks = config.getInt("max_unused_chunks"); 18 | final static int chunksUnloadRate = config.getInt("unload_chunks_per_minute"); 19 | final static boolean enableUnloadChunkTask = config.getBoolean("unload_chunk_task_enable"); 20 | 21 | @Override 22 | public void run() { 23 | if (!UltiTools.getInstance().getConfig().getBoolean("enable_pro") || UltiTools.getInstance().getProChecker() == null){ 24 | return; 25 | } 26 | if (!UltiTools.getInstance().getProChecker().getProStatus()) { 27 | return; 28 | } 29 | if (enableUnloadChunkTask) { 30 | List chunks = CleanerTask.getUnusedChunks(); 31 | if (chunks.size() > maxChunks) { 32 | if (chunksUnloadRate > 0) { 33 | for (int i = 0; i < chunksUnloadRate + 1; i++) { 34 | Random random = new Random(); 35 | int randomCh = random.nextInt(chunks.size()); 36 | Chunk chunk = chunks.get(randomCh); 37 | chunk.unload(); 38 | chunks.remove(randomCh); 39 | } 40 | } else if (chunksUnloadRate == -1) { 41 | for (Chunk each : chunks) { 42 | each.unload(true); 43 | } 44 | } 45 | } 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/register/CommandRegister.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.register; 2 | 3 | import org.bukkit.Bukkit; 4 | import org.bukkit.command.CommandExecutor; 5 | import org.bukkit.command.CommandMap; 6 | import org.bukkit.command.PluginCommand; 7 | import org.bukkit.plugin.Plugin; 8 | import org.bukkit.plugin.SimplePluginManager; 9 | 10 | import java.lang.reflect.Constructor; 11 | import java.lang.reflect.Field; 12 | import java.util.Arrays; 13 | 14 | public class CommandRegister { 15 | 16 | private CommandRegister(){} 17 | 18 | public static void registerCommand(Plugin plugin, CommandExecutor commandExecutor, String permission, String description, String... aliases) { 19 | PluginCommand command = getCommand(aliases[0], plugin); 20 | 21 | command.setAliases(Arrays.asList(aliases)); 22 | // command.setPermission(permission); 23 | command.setDescription(description); 24 | getCommandMap().register(plugin.getDescription().getName(), command); 25 | command.setExecutor(commandExecutor); 26 | } 27 | 28 | private static PluginCommand getCommand(String name, Plugin plugin) { 29 | PluginCommand command = null; 30 | 31 | try { 32 | Constructor c = PluginCommand.class.getDeclaredConstructor(String.class, Plugin.class); 33 | c.setAccessible(true); 34 | 35 | command = c.newInstance(name, plugin); 36 | } catch (Exception e) { 37 | e.printStackTrace(); 38 | } 39 | 40 | return command; 41 | } 42 | 43 | private static CommandMap getCommandMap() { 44 | CommandMap commandMap = null; 45 | 46 | try { 47 | if (Bukkit.getPluginManager() instanceof SimplePluginManager) { 48 | Field f = SimplePluginManager.class.getDeclaredField("commandMap"); 49 | f.setAccessible(true); 50 | 51 | commandMap = (CommandMap) f.get(Bukkit.getPluginManager()); 52 | } 53 | } catch (Exception e) { 54 | e.printStackTrace(); 55 | } 56 | 57 | return commandMap; 58 | } 59 | 60 | } 61 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### 此仓库已经停止维护,请查看6.0版本的项目,谢谢! 2 | 3 | ### [6.0项目传送门](https://github.com/UltiKits/UltiTools-Reborn) 4 | 5 | # UltiTools介绍 6 | ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/wisdommen/UltiTools/Plugin%20Test) 7 | ![GitHub](https://img.shields.io/github/license/wisdommen/UltiTools) 8 | ![GitHub release (latest by date)](https://img.shields.io/github/v/release/wisdommen/UltiTools) 9 | ![GitHub Repo stars](https://img.shields.io/github/stars/wisdommen/UltiTools) 10 | ![Minecraft Version](https://img.shields.io/badge/Minecraft-1.8--1.18-blue) 11 | ![Spigot Rating](https://img.shields.io/spiget/rating/85214?label=SpigotMC) 12 | ![bStats Players](https://img.shields.io/bstats/players/8652) 13 | ![bStats Servers](https://img.shields.io/bstats/servers/8652) 14 | ![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/wisdommen/ultitools?label=Code%20Quality) 15 | 16 | ## 给各位服主的介绍 17 | 18 | UltiTools是一个高层的基础插件,包含了很多GUI和高级的玩法,而非仅仅所谓的“基础”。 19 | 20 | 插件本身的详细介绍,请看mcbbs的帖子。 21 | 22 | [\[综合\]UltiTools —— 远程背包\|GUI登陆\|GUI邮箱\|礼包\|头显\|侧边栏~\[1.13.x-1.16.x\]](https://www.mcbbs.net/thread-1062730-1-1.html) 23 | 24 | 用户使用文档 25 | 26 | [UltiTools 文档](https://doc.ultitools.ultikits.com/) 27 | 28 | ## 给开发者的介绍 29 | 30 | 全新6.0包含了更加齐全的,更加方便的API。 31 | 32 | 6.0包含新的GUI框架,数据存储框架(Mysql,Json等),各种封装帮助你高效优雅的编写Spigot插件! 33 | 34 | [6.0项目传送门](https://github.com/UltiKits/UltiTools-Reborn) 35 | 36 | [UltiTools API 文档](https://doc.dev.ultikits.com/) 37 | 38 | ## 主要贡献者 39 | | 贡献者 | 描述 | 40 | |---------------|-----------------------------------------| 41 | | [@wisdommen](https://github.com/wisdommen) | 创始人,UltiKits套件作者 | 42 | | [@qianmo2233](https://github.com/qianmo2233) | UltiTools&UltiCore开发者,UltiKits开发文档主要维护者 | 43 | | [@Shpries](https://github.com/Shpries) | UltiTools开发者,UltiTools使用文档主要维护者 | 44 | | [@DevilJueChen](https://github.com/DevilJueChen) | UltiKits问题&漏洞&建议反馈 | 45 | | 拾柒 | 美工 | 46 | ## 发现问题?想提建议? 47 | [点击这里提交开启一个Issue!](https://github.com/wisdommen/UltiTools/issues/new/choose) 48 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/tasks/BanTimeCheckerTask.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.tasks; 2 | 3 | import com.ultikits.ultitools.enums.ConfigsEnum; 4 | import com.ultikits.ultitools.ultitools.UltiTools; 5 | import com.ultikits.ultitools.utils.TimeUtils; 6 | import org.bukkit.configuration.ConfigurationSection; 7 | import org.bukkit.configuration.file.YamlConfiguration; 8 | import org.bukkit.scheduler.BukkitRunnable; 9 | import java.io.File; 10 | import java.io.IOException; 11 | import java.util.ArrayList; 12 | import java.util.List; 13 | import java.util.Objects; 14 | 15 | 16 | public class BanTimeCheckerTask { 17 | public void startBanTimeCheckerTask() { 18 | new BukkitRunnable() { 19 | @Override 20 | public void run() { 21 | YamlConfiguration banListConfig = YamlConfiguration.loadConfiguration(new File(ConfigsEnum.BANLIST.toString())); 22 | ConfigurationSection banListOfPlayerSection = banListConfig.getConfigurationSection("banlist.banned-players"); 23 | if(banListOfPlayerSection == null) { 24 | return; 25 | } 26 | List uuids = new ArrayList(); 27 | uuids.addAll(banListOfPlayerSection.getKeys(false)); 28 | for(String uuid : uuids) { 29 | if(Objects.equals(banListConfig.getString("banlist.banned-players." + uuid + ".to"), "FOREVER")) { 30 | continue; 31 | } 32 | if(new TimeUtils().isTimeAfter(new TimeUtils().getTimeWithDate(),banListConfig.getString("banlist.banned-players." + uuid + ".to"))) { 33 | banListConfig.set("banlist.banned-players." + uuid,null); 34 | try { 35 | banListConfig.save(new File(ConfigsEnum.BANLIST.toString())); 36 | } catch (IOException e) { 37 | e.printStackTrace(); 38 | } 39 | } 40 | } 41 | } 42 | }.runTaskTimerAsynchronously(UltiTools.getInstance(),0,20 * 60L); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/utils/DeathPunishUtils.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.utils; 2 | 3 | import com.ultikits.ultitools.ultitools.UltiTools; 4 | import com.ultikits.utils.EconomyUtils; 5 | import org.bukkit.entity.Player; 6 | import org.bukkit.inventory.Inventory; 7 | import org.bukkit.inventory.ItemStack; 8 | 9 | import java.util.ArrayList; 10 | import java.util.Collections; 11 | import java.util.List; 12 | 13 | /** 14 | * @author qianmo, wisdomme 15 | */ 16 | public class DeathPunishUtils { 17 | public static void takeMoney(Player player, int money) { 18 | if (EconomyUtils.checkMoney(player) >= money) { 19 | EconomyUtils.withdraw(player, Math.min(EconomyUtils.checkMoney(player), money)); 20 | }else { 21 | EconomyUtils.withdraw(player, EconomyUtils.checkMoney(player)); 22 | } 23 | } 24 | 25 | public static void Exec(List cmd, String playerName) { 26 | for (String s : cmd) { 27 | UltiTools.getInstance().getServer().dispatchCommand( 28 | UltiTools.getInstance().getServer().getConsoleSender(), s.replace("{PLAYER}", playerName) 29 | ); 30 | } 31 | } 32 | 33 | public static void takeItem(Player player, int drop, List whitelist) { 34 | Inventory inventory = player.getInventory(); 35 | List inventorySlot = new ArrayList<>(); 36 | for (int i = 0; i < 45; i++) { 37 | ItemStack item = inventory.getItem(i); 38 | if (item!=null && !whitelist.contains(item.getType().toString())) inventorySlot.add(i); 39 | } 40 | Collections.shuffle(inventorySlot); 41 | List ints = new ArrayList<>(); 42 | for (int i = 0; i < drop; i++) { 43 | if (i >= inventorySlot.size()) break; 44 | ints.add(inventorySlot.get(i)); 45 | } 46 | for (Integer slot : ints){ 47 | ItemStack itemStack = inventory.getItem(slot); 48 | if (itemStack == null) continue; 49 | itemStack.setAmount(itemStack.getAmount()-1); 50 | inventory.setItem(slot, itemStack); 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/commands/HideCommands.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.commands; 2 | 3 | import com.ultikits.abstracts.AbstractPlayerCommandExecutor; 4 | import com.ultikits.ultitools.ultitools.UltiTools; 5 | import org.bukkit.Bukkit; 6 | import org.bukkit.command.Command; 7 | import org.bukkit.entity.Player; 8 | import org.bukkit.scheduler.BukkitRunnable; 9 | import org.jetbrains.annotations.NotNull; 10 | 11 | import java.util.ArrayList; 12 | import java.util.List; 13 | 14 | import static com.ultikits.utils.MessagesUtils.info; 15 | import static com.ultikits.utils.MessagesUtils.warning; 16 | 17 | public class HideCommands extends AbstractPlayerCommandExecutor { 18 | public static final List hidePlayers = new ArrayList<>(); 19 | 20 | @Override 21 | protected boolean onPlayerCommand(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) { 22 | if (!player.isOp() && !player.hasPermission("ultikits.tools.command.hide")) { 23 | player.sendMessage(warning(UltiTools.languageUtils.getString("no_permission"))); 24 | return true; 25 | } 26 | if (strings.length != 0) return false; 27 | if (hidePlayers.contains(player.getName())) { 28 | hidePlayers.remove(player.getName()); 29 | new BukkitRunnable() { 30 | @Override 31 | public void run() { 32 | for (Player p : Bukkit.getOnlinePlayers()) p.showPlayer(UltiTools.getInstance(), player); 33 | } 34 | }.runTask(UltiTools.getInstance()); 35 | player.sendMessage(info(UltiTools.languageUtils.getString("hide_unhided"))); 36 | } else { 37 | hidePlayers.add(player.getName()); 38 | new BukkitRunnable() { 39 | @Override 40 | public void run() { 41 | for (Player p : Bukkit.getOnlinePlayers()) p.hidePlayer(UltiTools.getInstance(), player); 42 | } 43 | }.runTask(UltiTools.getInstance()); 44 | } 45 | player.sendMessage(info(UltiTools.languageUtils.getString("hide_hided"))); 46 | return true; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # User-specific stuff 2 | .idea/ 3 | 4 | *.iml 5 | *.ipr 6 | *.iws 7 | 8 | # IntelliJ 9 | out/ 10 | 11 | # Compiled class file 12 | *.class 13 | 14 | # Log file 15 | *.log 16 | 17 | # BlueJ files 18 | *.ctxt 19 | 20 | # Package Files # 21 | *.war 22 | *.nar 23 | *.ear 24 | *.zip 25 | *.tar.gz 26 | *.rar 27 | 28 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 29 | hs_err_pid* 30 | 31 | *~ 32 | 33 | # temporary files which can be created if a process still has a handle open of a deleted file 34 | .fuse_hidden* 35 | 36 | # KDE directory preferences 37 | .directory 38 | 39 | # Linux trash folder which might appear on any partition or disk 40 | .Trash-* 41 | 42 | # .nfs files are created when an open file is removed but is still being accessed 43 | .nfs* 44 | 45 | # General 46 | .DS_Store 47 | .AppleDouble 48 | .LSOverride 49 | 50 | # Icon must end with two \r 51 | Icon 52 | 53 | # Thumbnails 54 | ._* 55 | 56 | # Files that might appear in the root of a volume 57 | .DocumentRevisions-V100 58 | .fseventsd 59 | .Spotlight-V100 60 | .TemporaryItems 61 | .Trashes 62 | .VolumeIcon.icns 63 | .com.apple.timemachine.donotpresent 64 | 65 | # Directories potentially created on remote AFP share 66 | .AppleDB 67 | .AppleDesktop 68 | Network Trash Folder 69 | Temporary Items 70 | .apdisk 71 | 72 | # Windows thumbnail cache files 73 | Thumbs.db 74 | Thumbs.db:encryptable 75 | ehthumbs.db 76 | ehthumbs_vista.db 77 | 78 | # Dump file 79 | *.stackdump 80 | 81 | # Folder config file 82 | [Dd]esktop.ini 83 | 84 | # Recycle Bin used on file shares 85 | $RECYCLE.BIN/ 86 | 87 | # Windows Installer files 88 | *.cab 89 | *.msi 90 | *.msix 91 | *.msm 92 | *.msp 93 | 94 | # Windows shortcuts 95 | *.lnk 96 | 97 | target/ 98 | 99 | pom.xml.tag 100 | pom.xml.releaseBackup 101 | pom.xml.versionsBackup 102 | pom.xml.next 103 | 104 | release.properties 105 | dependency-reduced-pom.xml 106 | buildNumber.properties 107 | .mvn/timing.properties 108 | .mvn/wrapper/maven-wrapper.jar 109 | .flattened-pom.xml 110 | 111 | # Common working directory 112 | run/ 113 | /pom_dev.xml 114 | -------------------------------------------------------------------------------- /.github/workflows/IssueReply.yml: -------------------------------------------------------------------------------- 1 | name: Issue Reply 2 | 3 | on: 4 | issues: 5 | types: [opened] 6 | 7 | jobs: 8 | reply-helper: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - name: reply 12 | uses: actions-cool/issues-helper@v2.0.0 13 | with: 14 | actions: 'create-comment' 15 | token: ${{ secrets.GITHUB_TOKEN }} 16 | issue-number: ${{ github.event.issue.number }} 17 | assignees: 'qianmo2233,wisdommen' 18 | random-to: 1 19 | body: | 20 | Hello @${{ github.event.issue.user.login }}. 我们发现您开启了一个Issue,开发组将会尽快对您进行答复 21 | 如果您发现该Issue被添加了标签,那么说明开发组已经受理 22 | 如果您有任何解决方案,欢迎提交Pull Request 23 | **注意:目前所有的开发工作都已经转到了UltiTools 6.0,所以暂时5.0版本除了修复bug以外暂时不会更新新的内容。新功能请求相关 Issue 将会被锁定!** 24 | **UltiTools-Reborn: https://github.com/UltiKits/UltiTools-Reborn** 25 | - name: check sug 26 | if: github.event.label.name == 'enhancement 新功能请求' || github.event.label.name == 'suggestion 建议与想法' 27 | uses: actions-cool/issues-helper@v2 28 | with: 29 | actions: 'create-comment' 30 | token: ${{ secrets.GITHUB_TOKEN }} 31 | issue-number: ${{ github.event.issue.number }} 32 | body: | 33 | Hello @${{ github.event.issue.user.login }}. 感谢你的建议! 34 | 但很抱歉您提出的建议将不会在这里被采纳。 35 | 目前所有的开发工作都已经转到了UltiTools 6.0,所以暂时5.0版本除了修复bug以外暂时不会更新新的内容。 36 | 请关注一下 UltiTools 6.0:https://github.com/UltiKits/UltiTools-Reborn 37 | - name: lock issue 38 | uses: OSDKDev/lock-issues@v1.1 39 | if: github.event.label.name == 'enhancement 新功能请求' || github.event.label.name == 'suggestion 建议与想法' 40 | with: 41 | repo-token: "${{ secrets.GITHUB_TOKEN }}" 42 | - name: check bug 43 | if: github.event.label.name == 'bug 插件功能问题' 44 | uses: actions-cool/issues-helper@v2 45 | with: 46 | actions: 'create-comment' 47 | token: ${{ secrets.GITHUB_TOKEN }} 48 | issue-number: ${{ github.event.issue.number }} 49 | body: | 50 | Hello ${{ github.event.issue.user.login }}. 您提出的问题已被受理 51 | 在一般情况下,这些问题将会在下个版本被修复,请持续关注版本更新。 52 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/views/InventoryBackupView.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.views; 2 | 3 | import com.ultikits.inventoryapi.InventoryManager; 4 | import com.ultikits.inventoryapi.ViewManager; 5 | import com.ultikits.ultitools.enums.ConfigsEnum; 6 | import com.ultikits.ultitools.ultitools.UltiTools; 7 | import org.bukkit.ChatColor; 8 | import org.bukkit.Material; 9 | import org.bukkit.configuration.file.YamlConfiguration; 10 | import org.bukkit.entity.Player; 11 | import org.bukkit.inventory.Inventory; 12 | import org.bukkit.inventory.ItemStack; 13 | import org.bukkit.inventory.meta.ItemMeta; 14 | import java.io.File; 15 | import java.util.ArrayList; 16 | import java.util.List; 17 | 18 | 19 | /** 20 | * @author Shpries 21 | */ 22 | public class InventoryBackupView { 23 | public static Inventory setUp(Player lookedPlayer) { 24 | File playerInventoryDataFile = new File(ConfigsEnum.InventoryBackupData + "/" + lookedPlayer.getName() + ".yml"); 25 | YamlConfiguration playerInventoryDataConfig = YamlConfiguration.loadConfiguration(playerInventoryDataFile); 26 | InventoryManager inventoryManager = new InventoryManager(null, 54, UltiTools.languageUtils.getString("inv_backup_view_title") + "-" + lookedPlayer.getName() , true); 27 | inventoryManager.create(); 28 | for(int num = 0; num < 36; num++) { 29 | inventoryManager.setItem(num,playerInventoryDataConfig.getItemStack("InventoryData." + num)); 30 | } 31 | for(int num = 36;num < 45;num++) { 32 | inventoryManager.setItem(num,new ItemStack(Material.LIGHT_BLUE_STAINED_GLASS_PANE)); 33 | } 34 | ItemStack is = new ItemStack(Material.REDSTONE); 35 | ItemMeta im = is.getItemMeta(); 36 | im.setDisplayName(ChatColor.YELLOW + UltiTools.languageUtils.getString("inv_backup_backup_time")); 37 | List lore = new ArrayList(); 38 | lore.add(ChatColor.RESET + playerInventoryDataConfig.getString("InventoryInfo.LatestBackupTime")); 39 | im.setLore(lore); 40 | is.setItemMeta(im); 41 | inventoryManager.setItem(45,is); 42 | ViewManager.registerView(inventoryManager); 43 | return inventoryManager.getInventory(); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/apis/EmailAPI.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.apis; 2 | 3 | import com.ultikits.beans.EmailContentBean; 4 | import com.ultikits.ultitools.enums.EmailResponse; 5 | import org.bukkit.OfflinePlayer; 6 | import org.bukkit.entity.Player; 7 | import org.bukkit.inventory.ItemStack; 8 | import org.jetbrains.annotations.NotNull; 9 | import org.jetbrains.annotations.Nullable; 10 | 11 | import java.util.List; 12 | import java.util.Map; 13 | 14 | public interface EmailAPI { 15 | 16 | /** 17 | * 获取一个邮件对象 18 | * 19 | * @param uuid 邮件ID 20 | * @return 一个邮件对象,如果未找到则返回null 21 | */ 22 | @Nullable 23 | EmailContentBean getEmail(String uuid); 24 | 25 | /** 26 | * 获取此玩家的所有Email 27 | * 28 | * @return 此玩家所有的Email,键为Email ID,值为EmailContentBean 29 | */ 30 | @NotNull 31 | Map getEmails(); 32 | 33 | /** 34 | * 发送一封邮件 35 | * 36 | * @param receiver 收件人 37 | * @param message 发送的文本信息 38 | * @param itemStack 发送的附件 39 | * @param commands 发送的邮件在点击时执行的命令 40 | * @return EmailResponse 邮件发送后的返回状态 41 | */ 42 | @NotNull 43 | EmailResponse sendTo(@NotNull OfflinePlayer receiver, @Nullable String message, @Nullable ItemStack itemStack, @Nullable List commands); 44 | 45 | /** 46 | * 删除一封邮件 47 | * 48 | * @param uuid 邮件的ID 49 | */ 50 | void deleteEmail(String uuid); 51 | 52 | /** 53 | * @return 删除所有历史邮件 54 | */ 55 | Boolean deleteHistoryEmails(); 56 | 57 | /** 58 | * 将一封邮件持久化保存,发送邮件时自动调用 59 | * 60 | * @param uuid 邮件ID 61 | * @param sender 发送人 62 | * @param message 文本内容 63 | * @param command 命令内容 64 | * @param itemStack 附件内容 65 | * @return 是否保存成功 66 | */ 67 | Boolean saveEmail(String uuid, String sender, String message, @Nullable List command, @Nullable ItemStack itemStack); 68 | 69 | /** 70 | * 给此玩家发送一个通知邮件,不会包含发送人姓名 71 | * 72 | * @param message 发送的消息内容 73 | * @param itemStack 发送的附件内容 74 | * @param commands 发送的命令内容 75 | */ 76 | void sendNotification(@NotNull String message, @Nullable ItemStack itemStack, @Nullable List commands); 77 | } 78 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/commands/SpawnCommands.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.commands; 2 | 3 | import com.ultikits.abstracts.AbstractPlayerCommandExecutor; 4 | import com.ultikits.ultitools.ultitools.UltiTools; 5 | import org.bukkit.ChatColor; 6 | import org.bukkit.Location; 7 | import org.bukkit.World; 8 | import org.bukkit.command.Command; 9 | import org.bukkit.entity.Player; 10 | import org.jetbrains.annotations.NotNull; 11 | 12 | import static com.ultikits.utils.MessagesUtils.info; 13 | 14 | public class SpawnCommands extends AbstractPlayerCommandExecutor { 15 | @Override 16 | protected boolean onPlayerCommand(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) { 17 | switch (command.getName()){ 18 | case "spawn": 19 | if (strings.length == 0){ 20 | if (player.getLocation().getWorld() == null){ 21 | player.sendMessage(ChatColor.RED + UltiTools.languageUtils.getString("world_no_world_found")); 22 | return false; 23 | } 24 | if (player.getLocation().getWorld().getSpawnLocation().equals(new Location(player.getLocation().getWorld(), 0, 0, 0, 0, 0))) { 25 | player.sendMessage(ChatColor.RED + UltiTools.languageUtils.getString("spawn_no_spawn_world")); 26 | return false; 27 | } 28 | player.teleport(player.getLocation().getWorld().getSpawnLocation()); 29 | return true; 30 | } 31 | case "setspawn": 32 | if (strings.length == 0 && player.hasPermission("ultikits.tools.admin")){ 33 | Location location = player.getLocation(); 34 | World world = location.getWorld(); 35 | if (world == null){ 36 | return false; 37 | } 38 | world.setSpawnLocation(location); 39 | player.sendMessage(info(UltiTools.languageUtils.getString("spawn_new_spawn_set"))); 40 | return true; 41 | } 42 | default: 43 | return false; 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/listener/FriendsApplyViewListener.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.listener; 2 | 3 | import com.ultikits.beans.CancelResult; 4 | import com.ultikits.enums.Colors; 5 | import com.ultikits.inventoryapi.InventoryManager; 6 | import com.ultikits.inventoryapi.PagesListener; 7 | import com.ultikits.ultitools.enums.ConfigsEnum; 8 | import com.ultikits.ultitools.ultitools.UltiTools; 9 | import org.bukkit.ChatColor; 10 | import org.bukkit.configuration.file.YamlConfiguration; 11 | import org.bukkit.entity.Player; 12 | import org.bukkit.event.inventory.InventoryClickEvent; 13 | import org.bukkit.inventory.ItemStack; 14 | 15 | import java.io.File; 16 | import java.util.List; 17 | 18 | public class FriendsApplyViewListener extends PagesListener { 19 | 20 | /* 21 | 处理玩家申请好友的GUI界面点击事件 22 | */ 23 | @Override 24 | public CancelResult onItemClick(InventoryClickEvent inventoryClickEvent, Player player, InventoryManager inventoryManager, ItemStack itemStack) { 25 | if (!inventoryClickEvent.getView().getTitle().contains(UltiTools.languageUtils.getString("friend_apply"))) { 26 | return CancelResult.NONE; 27 | } 28 | File file = new File(ConfigsEnum.PLAYER.toString(), player.getName() + ".yml"); 29 | YamlConfiguration config = YamlConfiguration.loadConfiguration(file); 30 | List friendsApply = config.getStringList("friends_apply"); 31 | String applier = inventoryClickEvent.getView().getTitle().replace(UltiTools.languageUtils.getString("friend_apply"), ""); 32 | if (friendsApply.contains(applier)) { 33 | if (itemStack.getType() == UltiTools.versionAdaptor.getColoredPlaneGlass(Colors.GREEN).getType()) { 34 | player.performCommand("friends accept " + applier); 35 | } else if (itemStack.getType() == UltiTools.versionAdaptor.getColoredPlaneGlass(Colors.RED).getType()) { 36 | player.performCommand("friends reject " + applier); 37 | } 38 | } else { 39 | player.sendMessage(ChatColor.RED + String.format(UltiTools.languageUtils.getString("friend_not_applied"), ChatColor.YELLOW + applier + ChatColor.RED)); 40 | } 41 | player.closeInventory(); 42 | return CancelResult.TRUE; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/tasks/TpTimerTask.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.tasks; 2 | 3 | 4 | import com.ultikits.ultitools.ultitools.UltiTools; 5 | import com.ultikits.utils.MessagesUtils; 6 | import org.bukkit.entity.Player; 7 | import org.bukkit.scheduler.BukkitRunnable; 8 | 9 | import java.util.HashMap; 10 | import java.util.Map; 11 | 12 | public class TpTimerTask { 13 | public static Map tpTemp = new HashMap<>(); 14 | public static Map tpTimer = new HashMap<>(); 15 | public static Map tphereTemp = new HashMap<>(); 16 | public static Map tphereTimer = new HashMap<>(); 17 | 18 | static { 19 | new tpTimer().runTaskTimerAsynchronously(UltiTools.getInstance(), 0, 20L); 20 | new tphereTimer().runTaskTimerAsynchronously(UltiTools.getInstance(), 0, 20L); 21 | } 22 | } 23 | 24 | class tpTimer extends BukkitRunnable { 25 | 26 | @Override 27 | public void run() { 28 | for (Player player : TpTimerTask.tpTemp.keySet()) { 29 | int time = TpTimerTask.tpTimer.get(player); 30 | if (time > 0) { 31 | time -= 1; 32 | } else { 33 | if (TpTimerTask.tpTemp.get(player) != null) { 34 | TpTimerTask.tpTemp.get(player).sendMessage(MessagesUtils.warning(UltiTools.languageUtils.getString("tpa_request_timeout"))); 35 | TpTimerTask.tpTemp.put(player, null); 36 | } 37 | } 38 | TpTimerTask.tpTimer.put(player, time); 39 | } 40 | } 41 | } 42 | 43 | class tphereTimer extends BukkitRunnable { 44 | 45 | @Override 46 | public void run() { 47 | for (Player player : TpTimerTask.tphereTemp.keySet()) { 48 | int time = TpTimerTask.tphereTimer.get(player); 49 | if (time > 0) { 50 | time -= 1; 51 | } else { 52 | if (TpTimerTask.tphereTemp.get(player) != null) { 53 | TpTimerTask.tphereTemp.get(player).sendMessage(MessagesUtils.warning(UltiTools.languageUtils.getString("tpa_request_timeout"))); 54 | TpTimerTask.tphereTemp.put(player, null); 55 | } 56 | } 57 | TpTimerTask.tphereTimer.put(player, time); 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/listener/WhitelistListener.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.listener; 2 | 3 | import com.ultikits.ultitools.enums.ConfigsEnum; 4 | import com.ultikits.ultitools.ultitools.UltiTools; 5 | import com.ultikits.ultitools.utils.DatabasePlayerTools; 6 | import org.bukkit.ChatColor; 7 | import org.bukkit.configuration.file.YamlConfiguration; 8 | import org.bukkit.entity.Player; 9 | import org.bukkit.event.EventHandler; 10 | import org.bukkit.event.Listener; 11 | import org.bukkit.event.player.PlayerLoginEvent; 12 | 13 | import java.io.File; 14 | import java.util.HashMap; 15 | import java.util.List; 16 | import java.util.Map; 17 | 18 | public class WhitelistListener implements Listener { 19 | 20 | @EventHandler 21 | public void onPlayerLogin(PlayerLoginEvent event) { 22 | YamlConfiguration config = YamlConfiguration.loadConfiguration(new File(ConfigsEnum.WHITELIST.toString())); 23 | Player player = event.getPlayer(); 24 | List whitelist = config.getStringList("whitelist"); 25 | 26 | if (!UltiTools.isDatabaseEnabled) { 27 | if (!whitelist.contains(player.getName())) { 28 | event.disallow(PlayerLoginEvent.Result.KICK_OTHER, ChatColor.AQUA + UltiTools.languageUtils.getString("whitelist_not_on")); 29 | } 30 | } else { 31 | if (DatabasePlayerTools.isPlayerExist(player.getName(), "userinfo")) { 32 | if (DatabasePlayerTools.isPlayerExist(player.getName(), "userinfo") && DatabasePlayerTools.getPlayerData(player.getName(), "userinfo", "whitelisted").equals("false")) { 33 | event.disallow(PlayerLoginEvent.Result.KICK_OTHER, ChatColor.AQUA + UltiTools.languageUtils.getString("whitelist_not_on")); 34 | } 35 | }else { 36 | Map playerData = new HashMap<>(); 37 | playerData.put("username", player.getName()); 38 | playerData.put("password", ""); 39 | playerData.put("whitelisted", "false"); 40 | playerData.put("banned", "false"); 41 | DatabasePlayerTools.insertPlayerData(playerData, "userinfo"); 42 | event.disallow(PlayerLoginEvent.Result.KICK_OTHER, ChatColor.AQUA + UltiTools.languageUtils.getString("whitelist_not_on")); 43 | } 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/listener/CustomGUIProtectListener.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.listener; 2 | 3 | import com.ultikits.ultitools.config.ConfigController; 4 | import com.ultikits.ultitools.ultitools.UltiTools; 5 | import org.bukkit.configuration.file.YamlConfiguration; 6 | import org.bukkit.event.EventHandler; 7 | import org.bukkit.event.Listener; 8 | import org.bukkit.event.inventory.InventoryClickEvent; 9 | import org.bukkit.event.inventory.InventoryCloseEvent; 10 | import org.bukkit.event.inventory.InventoryOpenEvent; 11 | import org.bukkit.scheduler.BukkitRunnable; 12 | import java.util.ArrayList; 13 | import java.util.List; 14 | import java.util.Set; 15 | 16 | 17 | /** 18 | * @author Shpries 19 | */ 20 | public class CustomGUIProtectListener implements Listener { 21 | private boolean isGUIOpen = false; 22 | private final List titleList = new ArrayList(); 23 | YamlConfiguration config = ConfigController.getConfig("customgui"); 24 | private final Set GUINames = config.getConfigurationSection("guis").getKeys(false); 25 | 26 | 27 | public CustomGUIProtectListener() { 28 | new BukkitRunnable() { 29 | @Override 30 | public void run() { 31 | for(String GUIName : GUINames) { 32 | titleList.add(config.getString("guis." + GUIName + ".title")); 33 | } 34 | } 35 | }.runTaskAsynchronously(UltiTools.getInstance()); 36 | } 37 | 38 | @EventHandler 39 | public void onInventoryOpen(InventoryOpenEvent e) { 40 | for(String title : titleList) { 41 | if(e.getView().getTitle().contains(title)) { 42 | isGUIOpen = true; 43 | break; 44 | } 45 | } 46 | } 47 | 48 | @EventHandler 49 | public void onInventoryClose(InventoryCloseEvent e) { 50 | for(String title : titleList) { 51 | if(e.getView().getTitle().contains(title)) { 52 | isGUIOpen = false; 53 | break; 54 | } 55 | } 56 | } 57 | 58 | @EventHandler 59 | public void onInventoryClick(InventoryClickEvent e) { 60 | for(String title : titleList) { 61 | if (e.getView().getTitle().contains(title)) { 62 | if(isGUIOpen) { 63 | e.setCancelled(true); 64 | } 65 | } 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/views/BanlistView.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.views; 2 | 3 | import com.ultikits.inventoryapi.InventoryManager; 4 | import com.ultikits.inventoryapi.ViewManager; 5 | import com.ultikits.inventoryapi.ViewType; 6 | import com.ultikits.ultitools.enums.ConfigsEnum; 7 | import com.ultikits.ultitools.ultitools.UltiTools; 8 | import org.bukkit.ChatColor; 9 | import org.bukkit.Material; 10 | import org.bukkit.configuration.ConfigurationSection; 11 | import org.bukkit.configuration.file.YamlConfiguration; 12 | import org.bukkit.entity.Player; 13 | import org.bukkit.inventory.Inventory; 14 | import org.bukkit.inventory.ItemStack; 15 | import org.bukkit.inventory.meta.ItemMeta; 16 | import java.io.File; 17 | import java.util.ArrayList; 18 | import java.util.List; 19 | import java.util.Objects; 20 | 21 | 22 | /** 23 | * @author Shpries 24 | */ 25 | public class BanlistView { 26 | public static Inventory setup() { 27 | InventoryManager inventoryManager = new InventoryManager(null,54, UltiTools.languageUtils.getString("ban_list"),true); 28 | inventoryManager.presetPage(ViewType.PREVIOUS_QUIT_NEXT); 29 | inventoryManager.create(); 30 | YamlConfiguration banListConfig = YamlConfiguration.loadConfiguration(new File(ConfigsEnum.BANLIST.toString())); 31 | ConfigurationSection banListSection = banListConfig.getConfigurationSection("banlist.banned-players"); 32 | 33 | for(String uuid : banListSection.getKeys(false)) { 34 | ItemStack is = new ItemStack(Material.PLAYER_HEAD); 35 | ItemMeta im = is.getItemMeta(); 36 | im.setDisplayName(banListConfig.getString("banlist.banned-players." + uuid + ".id")); 37 | List lore = new ArrayList<>(); 38 | String to = Objects.equals(banListConfig.getString("banlist.banned-players." + uuid + ".to"), "FOREVER") ? 39 | UltiTools.languageUtils.getString("ban_forever") : banListConfig.getString("banlist.banned-players." + uuid + ".to"); 40 | lore.add(ChatColor.WHITE + UltiTools.languageUtils.getString("ban_from") + banListConfig.getString("banlist.banned-players." + uuid + ".from")); 41 | lore.add(ChatColor.WHITE + UltiTools.languageUtils.getString("ban_to") + to); 42 | im.setLore(lore); 43 | is.setItemMeta(im); 44 | inventoryManager.addItem(is); 45 | } 46 | ViewManager.registerView(inventoryManager); 47 | return inventoryManager.getInventory(); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/listener/BanListener.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.listener; 2 | 3 | import com.ultikits.ultitools.enums.ConfigsEnum; 4 | import com.ultikits.ultitools.ultitools.UltiTools; 5 | import com.ultikits.utils.MessagesUtils; 6 | import org.bukkit.Bukkit; 7 | import org.bukkit.configuration.ConfigurationSection; 8 | import org.bukkit.configuration.file.YamlConfiguration; 9 | import org.bukkit.entity.Player; 10 | import org.bukkit.event.EventHandler; 11 | import org.bukkit.event.Listener; 12 | import org.bukkit.event.player.PlayerLoginEvent; 13 | import java.io.File; 14 | import java.net.InetAddress; 15 | import java.nio.charset.StandardCharsets; 16 | 17 | 18 | /** 19 | * @author Shpries 20 | */ 21 | public class BanListener implements Listener { 22 | @EventHandler 23 | public void onPlayerLogin(PlayerLoginEvent e){ 24 | YamlConfiguration banListConfig = YamlConfiguration.loadConfiguration(new File(ConfigsEnum.BANLIST.toString())); 25 | ConfigurationSection banListSectionOfPlayer = banListConfig.getConfigurationSection("banlist.banned-players"); 26 | ConfigurationSection banListSectionOfIP = banListConfig.getConfigurationSection("banlist.banned-ips"); 27 | InetAddress ipAddress = e.getAddress(); 28 | String ip = ipAddress.getHostAddress().replaceAll("\\.", "_"); 29 | 30 | if(banListSectionOfIP != null && banListSectionOfIP.getKeys(false).contains(ip)) { 31 | e.disallow(PlayerLoginEvent.Result.KICK_OTHER, MessagesUtils.warning(UltiTools.languageUtils.getString("ban_your_ip_is_banned")) + "\n" 32 | + banListConfig.getString("banlist.banned-ips." + ip)); 33 | } 34 | if (banListSectionOfPlayer != null && banListSectionOfPlayer.getKeys(false).contains(getUUID(e.getPlayer()))) { 35 | e.disallow(PlayerLoginEvent.Result.KICK_OTHER, MessagesUtils.warning(UltiTools.languageUtils.getString("ban_your_account_is_banned")) + "\n" 36 | + banListConfig.getString("banlist.banned-players." + getUUID(e.getPlayer()) + ".reason")); 37 | } 38 | } 39 | private String getUUID(Player p) { 40 | if(Bukkit.getServer().getOnlineMode()) { 41 | return p.getUniqueId().toString(); 42 | } else { 43 | return java.util.UUID.nameUUIDFromBytes(String.format("OfflinePlayer:%s", p.getName()).getBytes(StandardCharsets.UTF_8)).toString(); 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/commands/SbCommands.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.commands; 2 | 3 | import com.ultikits.abstracts.AbstractTabExecutor; 4 | import com.ultikits.ultitools.enums.ConfigsEnum; 5 | import org.bukkit.command.Command; 6 | import org.bukkit.configuration.file.YamlConfiguration; 7 | import org.bukkit.entity.Player; 8 | import org.jetbrains.annotations.NotNull; 9 | import org.jetbrains.annotations.Nullable; 10 | 11 | import java.io.File; 12 | import java.io.IOException; 13 | import java.util.ArrayList; 14 | import java.util.List; 15 | 16 | public class SbCommands extends AbstractTabExecutor { 17 | 18 | private final static File sbFile = new File(ConfigsEnum.SIDEBAR_DATA.toString()); 19 | private final static YamlConfiguration sbConfig = YamlConfiguration.loadConfiguration(sbFile); 20 | 21 | @Override 22 | protected boolean onPlayerCommand(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) { 23 | List players = sbConfig.getStringList("player_closed_sb"); 24 | if ("sb".equalsIgnoreCase(command.getName()) && strings.length == 1){ 25 | switch (strings[0]){ 26 | case "open": 27 | players.remove(player.getName()); 28 | sbConfig.set("player_closed_sb", players); 29 | try { 30 | sbConfig.save(sbFile); 31 | } catch (IOException e) { 32 | e.printStackTrace(); 33 | } 34 | return true; 35 | case "close": 36 | if (!players.contains(player.getName())){ 37 | players.add(player.getName()); 38 | } 39 | sbConfig.set("player_closed_sb", players); 40 | try { 41 | sbConfig.save(sbFile); 42 | } catch (IOException e) { 43 | e.printStackTrace(); 44 | } 45 | return true; 46 | default: 47 | return false; 48 | } 49 | } 50 | return false; 51 | } 52 | 53 | @Override 54 | protected @Nullable List onPlayerTabComplete(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) { 55 | if (strings.length == 1){ 56 | List tabCommands = new ArrayList<>(); 57 | tabCommands.add("open"); 58 | tabCommands.add("close"); 59 | return tabCommands; 60 | } 61 | return null; 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /.github/workflows/codeql-analysis.yml: -------------------------------------------------------------------------------- 1 | # For most projects, this workflow file will not need changing; you simply need 2 | # to commit it to your repository. 3 | # 4 | # You may wish to alter this file to override the set of languages analyzed, 5 | # or to provide custom queries or build logic. 6 | # 7 | # ******** NOTE ******** 8 | # We have attempted to detect the languages in your repository. Please check 9 | # the `language` matrix defined below to confirm you have the correct set of 10 | # supported CodeQL languages. 11 | # 12 | name: "CodeQL" 13 | 14 | on: 15 | push: 16 | branches: [ master ] 17 | pull_request: 18 | # The branches below must be a subset of the branches above 19 | branches: [ master ] 20 | schedule: 21 | - cron: '24 2 * * 0' 22 | 23 | jobs: 24 | analyze: 25 | name: Analyze 26 | runs-on: ubuntu-latest 27 | permissions: 28 | actions: read 29 | contents: read 30 | security-events: write 31 | 32 | strategy: 33 | fail-fast: false 34 | matrix: 35 | language: [ 'java' ] 36 | # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] 37 | # Learn more about CodeQL language support at https://git.io/codeql-language-support 38 | 39 | steps: 40 | - name: Checkout repository 41 | uses: actions/checkout@v2 42 | 43 | # Initializes the CodeQL tools for scanning. 44 | - name: Initialize CodeQL 45 | uses: github/codeql-action/init@v1 46 | with: 47 | languages: ${{ matrix.language }} 48 | # If you wish to specify custom queries, you can do so here or in a config file. 49 | # By default, queries listed here will override any specified in a config file. 50 | # Prefix the list here with "+" to use these queries and those in the config file. 51 | # queries: ./path/to/local/query, your-org/your-repo/queries@main 52 | 53 | # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). 54 | # If this step fails, then you should remove it and run the build manually (see below) 55 | - name: Autobuild 56 | uses: github/codeql-action/autobuild@v1 57 | 58 | # ℹ️ Command-line programs to run using the OS shell. 59 | # 📚 https://git.io/JvXDl 60 | 61 | # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines 62 | # and modify them (or add more) to build your code if your project 63 | # uses a compiled language 64 | 65 | #- run: | 66 | # make bootstrap 67 | # make release 68 | 69 | - name: Perform CodeQL Analysis 70 | uses: github/codeql-action/analyze@v1 71 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/utils/TimeUtils.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.utils; 2 | 3 | import java.text.ParseException; 4 | import java.text.SimpleDateFormat; 5 | import java.util.*; 6 | 7 | 8 | /** 9 | * @author Shpries 10 | */ 11 | public class TimeUtils { 12 | private final SimpleDateFormat dateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm"); 13 | 14 | /** 15 | *获取时间戳 16 | * 17 | * @return 当前时间戳 18 | */ 19 | public long getTimeStamp() { 20 | Calendar calendar = Calendar.getInstance(Locale.getDefault()); 21 | String dateString = dateFormat1.format(calendar.getTime()); 22 | long timeStamp = 0; 23 | try { 24 | timeStamp = dateFormat1.parse(dateString).getTime(); 25 | } catch (ParseException e) { 26 | e.printStackTrace(); 27 | } 28 | return timeStamp; 29 | } 30 | 31 | /** 32 | * 以格式"yyyy-MM-dd HH:mm"获取时间 33 | * 34 | * @return "yyyy-MM-dd HH:mm"格式的时间 35 | */ 36 | public String getTimeWithDate() { 37 | Calendar calendar = Calendar.getInstance(Locale.getDefault()); 38 | String dateString = dateFormat1.format(calendar.getTime()); 39 | return dateString; 40 | } 41 | 42 | /** 43 | * 同时获取当前日期时间和设定天数后的日期时间 44 | * 45 | * @param days 需要在当前日期后加的天数 46 | * @return 一个含有两个元素的数组,分别是"yyyy-MM-dd HH:mm"格式的当前日期和days日后的同格式日期 47 | */ 48 | public String[] getTimeAndAdd(int days) { 49 | Calendar calendar = Calendar.getInstance(Locale.getDefault()); 50 | String[] time = new String[2]; 51 | String dateString = dateFormat1.format(calendar.getTime()); 52 | calendar.add(Calendar.DATE,days); 53 | String dateStringAfterAdd = dateFormat1.format(calendar.getTime()); 54 | time[0] = dateString; 55 | time[1] = dateStringAfterAdd; 56 | return time; 57 | } 58 | 59 | /** 60 | * 判断time1是否在time2之后 61 | * 62 | * @param time1 第一个时间,必须是"yyyy-MM-dd HH:mm"格式 63 | * @param time2 第二个时间,必须是"yyyy-MM-dd HH:mm"格式 64 | * @return 如果time1是否在time2之后,则返回true,反之false 65 | */ 66 | public boolean isTimeAfter(String time1,String time2) { 67 | Date date1 = null,date2 = null; 68 | try { 69 | date1 = dateFormat1.parse(time1); 70 | } catch (ParseException e) { 71 | e.printStackTrace(); 72 | } 73 | try { 74 | date2 = dateFormat1.parse(time2); 75 | } catch (ParseException e) { 76 | e.printStackTrace(); 77 | } 78 | if(date1.after(date2)) { 79 | return true; 80 | } 81 | return false; 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/checker/PlayerlistChecker.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.checker; 2 | 3 | import com.ultikits.ultitools.enums.ConfigsEnum; 4 | import com.ultikits.ultitools.ultitools.UltiTools; 5 | import com.ultikits.ultitools.utils.YamlFileUtils; 6 | import org.bukkit.Bukkit; 7 | import org.bukkit.configuration.file.YamlConfiguration; 8 | 9 | import java.io.File; 10 | import java.io.IOException; 11 | import java.nio.charset.StandardCharsets; 12 | import java.util.List; 13 | 14 | public class PlayerlistChecker { 15 | File playerlistFile = new File(ConfigsEnum.PLAYERLIST.toString()); 16 | YamlConfiguration playerlistConfig = YamlConfiguration.loadConfiguration(playerlistFile); 17 | 18 | public void playerlistNewChecker() { 19 | if (!playerlistFile.exists() || !playerlistConfig.getStringList("playerlist").isEmpty()) { 20 | if (Bukkit.getServer().getOnlineMode()) { 21 | onlineModeChanger(); 22 | } else { 23 | offlineModeChanger(); 24 | } 25 | } 26 | } 27 | 28 | private void offlineModeChanger() { 29 | List playerlistInChecker = playerlistConfig.getStringList("playerlist"); 30 | delAndCreate(); 31 | for (String playerNameInChecker : playerlistInChecker) { 32 | String UUID = java.util.UUID.nameUUIDFromBytes(String.format("OfflinePlayer:%s", playerNameInChecker).getBytes(StandardCharsets.UTF_8)).toString(); 33 | addPlayerlist(UUID,playerNameInChecker); 34 | } 35 | } 36 | 37 | private void onlineModeChanger () { 38 | List playerlistInChecker = playerlistConfig.getStringList("playerlist"); 39 | delAndCreate(); 40 | for (String playerNameInChecker : playerlistInChecker) { 41 | String UUID = Bukkit.getPlayer(playerNameInChecker).getUniqueId().toString(); 42 | addPlayerlist(UUID, playerNameInChecker); 43 | } 44 | } 45 | 46 | private void delAndCreate () { 47 | playerlistFile.delete(); 48 | new YamlFileUtils().saveYamlFile(UltiTools.getInstance().getDataFolder().getPath() + File.separator + "playerData" + File.separator + "playerlist", "playerlist.yml", "playerlist.yml"); 49 | } 50 | 51 | private void addPlayerlist (String UUID, String playerName) { 52 | playerlistConfig.set("playerlist." + UUID, playerName); 53 | saveConfig(); 54 | } 55 | 56 | private void saveConfig () { 57 | try { 58 | playerlistConfig.save(playerlistFile); 59 | } catch (IOException e) { 60 | e.printStackTrace(); 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/main/resources/zh_kits.yml: -------------------------------------------------------------------------------- 1 | xinshou: 2 | item: LOG 3 | reBuyable: false 4 | name: 新手礼包 5 | level: 1 6 | job: 全部 7 | description: 虽然是木头的,但是却很实用 8 | price: 0 9 | contain: 10 | - rO0ABXNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFwdAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmplY3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAN0AAI9PXQAAXZ0AAR0eXBldXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0ZW1TdGFja3NyABFqYXZhLmxhbmcuSW50ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAoadAAMV09PREVOX1NXT1JE 11 | - rO0ABXNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFwdAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmplY3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAN0AAI9PXQAAXZ0AAR0eXBldXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0ZW1TdGFja3NyABFqYXZhLmxhbmcuSW50ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAoadAAKV09PREVOX0hPRQ== 12 | - rO0ABXNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFwdAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmplY3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAN0AAI9PXQAAXZ0AAR0eXBldXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0ZW1TdGFja3NyABFqYXZhLmxhbmcuSW50ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAoadAAOV09PREVOX1BJQ0tBWEU= 13 | - rO0ABXNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFwdAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmplY3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAN0AAI9PXQAAXZ0AAR0eXBldXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0ZW1TdGFja3NyABFqYXZhLmxhbmcuSW50ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAoadAAKV09PREVOX0FYRQ== 14 | - rO0ABXNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFwdAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmplY3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAN0AAI9PXQAAXZ0AAR0eXBldXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0ZW1TdGFja3NyABFqYXZhLmxhbmcuSW50ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAoadAANV09PREVOX1NIT1ZFTA== 15 | playerCommands: [] 16 | consoleCommands: 17 | - say {PLAYER} 领取了新手礼包 18 | - givemoney {PLAYER} 100 -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/commands/KitsCommands.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.commands; 2 | 3 | import com.ultikits.abstracts.AbstractTabExecutor; 4 | import com.ultikits.ultitools.config.ConfigController; 5 | import com.ultikits.ultitools.enums.ConfigsEnum; 6 | import com.ultikits.ultitools.ultitools.UltiTools; 7 | import com.ultikits.ultitools.views.CreateKitsView; 8 | import com.ultikits.ultitools.views.KitsView; 9 | import com.ultikits.utils.MessagesUtils; 10 | import org.bukkit.command.Command; 11 | import org.bukkit.configuration.file.YamlConfiguration; 12 | import org.bukkit.entity.Player; 13 | import org.bukkit.inventory.Inventory; 14 | import org.jetbrains.annotations.NotNull; 15 | import org.jetbrains.annotations.Nullable; 16 | 17 | import java.io.File; 18 | import java.util.ArrayList; 19 | import java.util.List; 20 | 21 | public class KitsCommands extends AbstractTabExecutor { 22 | 23 | @Override 24 | protected boolean onPlayerCommand(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) { 25 | switch (strings.length){ 26 | case 0: 27 | Inventory inventory = KitsView.setUp(player); 28 | player.openInventory(inventory); 29 | return true; 30 | case 2: 31 | if (!strings[0].equals("edit")){ 32 | return false; 33 | } 34 | if (player.hasPermission("ultikits.tools.admin")){ 35 | if (ConfigController.getConfig("kits").getConfigurationSection(strings[1]) == null){ 36 | player.sendMessage(MessagesUtils.warning(String.format(UltiTools.languageUtils.getString("kits_no_such_kit"), strings[1]))); 37 | return true; 38 | } 39 | Inventory inventory1 = CreateKitsView.setUp(strings[1]); 40 | player.openInventory(inventory1); 41 | return true; 42 | } 43 | default: 44 | return false; 45 | } 46 | } 47 | 48 | @Nullable 49 | @Override 50 | protected List onPlayerTabComplete(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) { 51 | if (!player.isOp()){ 52 | return null; 53 | } 54 | if (strings.length == 1) { 55 | List tabCommands = new ArrayList<>(); 56 | tabCommands.add("edit"); 57 | return tabCommands; 58 | } else if (strings.length == 2) { 59 | File file = new File(ConfigsEnum.KIT.toString()); 60 | YamlConfiguration config = YamlConfiguration.loadConfiguration(file); 61 | return new ArrayList<>(config.getKeys(false)); 62 | } 63 | return null; 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/views/WarpsView.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.views; 2 | 3 | import com.ultikits.inventoryapi.InventoryManager; 4 | import com.ultikits.inventoryapi.ViewManager; 5 | import com.ultikits.inventoryapi.ViewType; 6 | import com.ultikits.manager.ItemStackManager; 7 | import com.ultikits.ultitools.enums.ConfigsEnum; 8 | import com.ultikits.ultitools.listener.WarpListener; 9 | import com.ultikits.ultitools.ultitools.UltiTools; 10 | import com.ultikits.ultitools.utils.Utils; 11 | import org.bukkit.ChatColor; 12 | import org.bukkit.Material; 13 | import org.bukkit.configuration.file.YamlConfiguration; 14 | import org.bukkit.inventory.Inventory; 15 | import org.bukkit.inventory.ItemStack; 16 | import org.bukkit.scheduler.BukkitRunnable; 17 | 18 | import java.io.File; 19 | import java.util.ArrayList; 20 | import java.util.List; 21 | 22 | public class WarpsView { 23 | 24 | private WarpsView() { 25 | } 26 | 27 | public static Inventory setUp() { 28 | InventoryManager inventoryManager = new InventoryManager(null, 54, UltiTools.languageUtils.getString("warp_page_title"), true); 29 | inventoryManager.presetPage(ViewType.PREVIOUS_QUIT_NEXT); 30 | inventoryManager.create(); 31 | ViewManager.registerView(inventoryManager); 32 | new BukkitRunnable() { 33 | @Override 34 | public void run() { 35 | for (ItemStack itemStack : setUpItems()) { 36 | inventoryManager.addItem(itemStack); 37 | } 38 | } 39 | }.runTaskAsynchronously(UltiTools.getInstance()); 40 | return inventoryManager.getInventory(); 41 | } 42 | 43 | private static List setUpItems() { 44 | List itemStackList = new ArrayList<>(); 45 | List files = Utils.getFiles(ConfigsEnum.WARPS.toString()); 46 | if (files == null) { 47 | return itemStackList; 48 | } 49 | for (File file : files) { 50 | ArrayList lore = new ArrayList<>(); 51 | YamlConfiguration config = YamlConfiguration.loadConfiguration(file); 52 | String world = config.getString("world"); 53 | int x = (int) config.getDouble("x"); 54 | int y = (int) config.getDouble("y"); 55 | int z = (int) config.getDouble("z"); 56 | String name = config.getString("name"); 57 | lore.add(ChatColor.GRAY + String.format("%s x: %d y: %d z: %d", world, x, y, z)); 58 | ItemStackManager itemStackManager = new ItemStackManager(new ItemStack(Material.PAPER), lore, ChatColor.AQUA + UltiTools.languageUtils.getString("sidebar_name") + " " + name); 59 | itemStackList.add(itemStackManager.getItem()); 60 | } 61 | return itemStackList; 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/utils/FunctionUtils.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.utils; 2 | 3 | import com.ultikits.ultitools.ultitools.UltiTools; 4 | import org.bukkit.configuration.file.YamlConfiguration; 5 | 6 | import java.io.File; 7 | import java.io.IOException; 8 | import java.util.*; 9 | 10 | public class FunctionUtils { 11 | 12 | private static Map commandMap = new LinkedHashMap<>(); 13 | 14 | static { 15 | commandMap.put("email", "enable_email"); 16 | commandMap.put("login", "enable_login"); 17 | commandMap.put("home", "enable_home"); 18 | commandMap.put("whitelist", "enable_white_list"); 19 | commandMap.put("sidebar", "enable_scoreboard"); 20 | commandMap.put("chestlock", "enable_lock"); 21 | commandMap.put("remote-bag", "enable_remote_chest"); 22 | commandMap.put("multiworlds", "enable_multiworlds"); 23 | commandMap.put("kits", "enable_kits"); 24 | commandMap.put("cleaner", "enable_cleaner"); 25 | commandMap.put("permission", "enable_permission"); 26 | commandMap.put("join-welcome", "enable_onjoin"); 27 | commandMap.put("armor-monitor", "enable_armor_check"); 28 | commandMap.put("chat-prefix", "enable_chat"); 29 | commandMap.put("name-prefix", "enable_name_prefix"); 30 | commandMap.put("death-punishment", "enable_death_punishment"); 31 | commandMap.put("tpa", "enable_tpa"); 32 | commandMap.put("warp", "enable_wrap"); 33 | commandMap.put("papi", "enable_PAPI"); 34 | commandMap.put("social-system", "enable_social_system"); 35 | commandMap.put("random-tp", "enable_random_tp"); 36 | commandMap.put("auto-version-check", "enable_version_check"); 37 | commandMap.put("auto-update", "enable_auto_update"); 38 | } 39 | 40 | private FunctionUtils() { 41 | } 42 | 43 | public static void functionSwitch(String function, boolean isEnable){ 44 | if (UltiTools.getInstance().getConfig().get(commandMap.get(function))==null){ 45 | System.out.println(function+" not found"); 46 | return; 47 | } 48 | File file = new File(UltiTools.getInstance().getDataFolder(),"config.yml"); 49 | YamlConfiguration config = YamlConfiguration.loadConfiguration(file); 50 | config.set(commandMap.get(function), isEnable); 51 | try { 52 | config.save(file); 53 | System.out.println("saved"); 54 | } catch (IOException e) { 55 | e.printStackTrace(); 56 | } 57 | } 58 | 59 | public static List getAllFunctions(){ 60 | return new ArrayList<>(commandMap.keySet()); 61 | } 62 | 63 | public static String getFunctionCode(String name){ 64 | return commandMap.get(name); 65 | } 66 | 67 | } 68 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/utils/YamlFileUtils.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.utils; 2 | 3 | import org.jetbrains.annotations.NotNull; 4 | 5 | import java.io.*; 6 | import java.net.URL; 7 | import java.net.URLConnection; 8 | 9 | public class YamlFileUtils { 10 | 11 | private InputStream getResource(@NotNull String filename) { 12 | try { 13 | URL url = this.getClass().getClassLoader().getResource(filename); 14 | 15 | if (url == null) { 16 | return null; 17 | } 18 | 19 | URLConnection connection = url.openConnection(); 20 | connection.setUseCaches(false); 21 | return connection.getInputStream(); 22 | } catch (IOException ex) { 23 | return null; 24 | } 25 | } 26 | 27 | public void saveYamlFile(String filePath, String fileName, String resourcePath) { 28 | File folder = new File(filePath); 29 | if (!folder.exists()) { 30 | folder.mkdirs(); 31 | } 32 | saveResource(filePath, resourcePath, fileName, false); 33 | } 34 | 35 | public void saveYamlFile(String filePath, String fileName, String resourcePath, boolean replace) { 36 | File folder = new File(filePath); 37 | if (!folder.exists()) { 38 | folder.mkdirs(); 39 | } 40 | saveResource(filePath, resourcePath, fileName, replace); 41 | } 42 | 43 | public void saveResource(String filePath, @NotNull String resourcePath, String outFileName, boolean replace) { 44 | if (resourcePath.equals("")) { 45 | throw new IllegalArgumentException("ResourcePath cannot be null or empty"); 46 | } 47 | 48 | resourcePath = resourcePath.replace('\\', '/'); 49 | InputStream in = getResource(resourcePath); 50 | if (in == null) { 51 | throw new IllegalArgumentException("The embedded resource '" + resourcePath + "' cannot be found in " + resourcePath); 52 | } 53 | 54 | File outFile = new File(filePath, outFileName); 55 | 56 | try { 57 | if (!outFile.exists() || replace) { 58 | OutputStream out = new FileOutputStream(outFile); 59 | byte[] buf = new byte[1024]; 60 | int len; 61 | while ((len = in.read(buf)) > 0) { 62 | out.write(buf, 0, len); 63 | } 64 | out.close(); 65 | in.close(); 66 | } else { 67 | System.out.println("Could not save " + outFile.getName() + " to " + outFile + " because " + outFile.getName() + " already exists."); 68 | } 69 | } catch (IOException ex) { 70 | System.out.println("Could not save " + outFile.getName() + " to " + outFile); 71 | } 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/main/resources/en_kits.yml: -------------------------------------------------------------------------------- 1 | xinshou: 2 | item: LOG 3 | reBuyable: false 4 | name: Starters 5 | level: 1 6 | job: All 7 | description: Very useful even they are Wooden 8 | price: 0 9 | contain: 10 | - rO0ABXNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFwdAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmplY3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAN0AAI9PXQAAXZ0AAR0eXBldXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0ZW1TdGFja3NyABFqYXZhLmxhbmcuSW50ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAoadAAMV09PREVOX1NXT1JE 11 | - rO0ABXNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFwdAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmplY3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAN0AAI9PXQAAXZ0AAR0eXBldXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0ZW1TdGFja3NyABFqYXZhLmxhbmcuSW50ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAoadAAKV09PREVOX0hPRQ== 12 | - rO0ABXNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFwdAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmplY3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAN0AAI9PXQAAXZ0AAR0eXBldXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0ZW1TdGFja3NyABFqYXZhLmxhbmcuSW50ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAoadAAOV09PREVOX1BJQ0tBWEU= 13 | - rO0ABXNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFwdAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmplY3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAN0AAI9PXQAAXZ0AAR0eXBldXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0ZW1TdGFja3NyABFqYXZhLmxhbmcuSW50ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAoadAAKV09PREVOX0FYRQ== 14 | - rO0ABXNyABpvcmcuYnVra2l0LnV0aWwuaW8uV3JhcHBlcvJQR+zxEm8FAgABTAADbWFwdAAPTGphdmEvdXRpbC9NYXA7eHBzcgA1Y29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXAkU2VyaWFsaXplZEZvcm0AAAAAAAAAAAIAAlsABGtleXN0ABNbTGphdmEvbGFuZy9PYmplY3Q7WwAGdmFsdWVzcQB+AAR4cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAN0AAI9PXQAAXZ0AAR0eXBldXEAfgAGAAAAA3QAHm9yZy5idWtraXQuaW52ZW50b3J5Lkl0ZW1TdGFja3NyABFqYXZhLmxhbmcuSW50ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAoadAANV09PREVOX1NIT1ZFTA== 15 | playerCommands: [] 16 | consoleCommands: 17 | - say {PLAYER} claims the starter kits! 18 | - givemoney {PLAYER} 100 -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/commands/SetHomeCommands.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.commands; 2 | 3 | import com.ultikits.abstracts.AbstractPlayerCommandExecutor; 4 | import com.ultikits.ultitools.enums.ConfigsEnum; 5 | import com.ultikits.ultitools.ultitools.UltiTools; 6 | import com.ultikits.ultitools.utils.Utils; 7 | import org.bukkit.ChatColor; 8 | import org.bukkit.command.Command; 9 | import org.bukkit.configuration.file.YamlConfiguration; 10 | import org.bukkit.entity.Player; 11 | import org.bukkit.scheduler.BukkitRunnable; 12 | import org.jetbrains.annotations.NotNull; 13 | 14 | import java.io.File; 15 | 16 | import static com.ultikits.ultitools.utils.HomeUtils.setHome; 17 | 18 | public class SetHomeCommands extends AbstractPlayerCommandExecutor { 19 | 20 | private final static File homeFile = new File(ConfigsEnum.HOME.toString()); 21 | private final static YamlConfiguration homeConfig = YamlConfiguration.loadConfiguration(homeFile); 22 | 23 | @Override 24 | protected boolean onPlayerCommand(@NotNull Command command, @NotNull String[] args, @NotNull Player player) { 25 | if (!isPlayerCanSetHome(player)) { 26 | player.sendMessage(ChatColor.RED + UltiTools.languageUtils.getString("sethome_reached_limit")); 27 | return true; 28 | } 29 | if (args.length == 0) { 30 | new BukkitRunnable() { 31 | @Override 32 | public void run() { 33 | setHome(player, "Def"); 34 | } 35 | }.runTaskAsynchronously(UltiTools.getInstance()); 36 | return true; 37 | } else if (args.length == 1) { 38 | new BukkitRunnable() { 39 | @Override 40 | public void run() { 41 | setHome(player, args[0]); 42 | } 43 | }.runTaskAsynchronously(UltiTools.getInstance()); 44 | return true; 45 | } else { 46 | player.sendMessage(ChatColor.RED + UltiTools.languageUtils.getString("sethome_usage")); 47 | return false; 48 | } 49 | } 50 | 51 | private static boolean isPlayerCanSetHome(Player player) { 52 | if (player.hasPermission("ultikits.tools.admin")) return true; 53 | if (player.hasPermission("ultikits.tools.level1")) { 54 | if (homeConfig.getInt("home_pro") == 0) return true; 55 | return Utils.getHomeList(player).size() < homeConfig.getInt("home_pro"); 56 | } else if (player.hasPermission("ultikits.tools.level2")) { 57 | if (homeConfig.getInt("home_ultimate") == 0) return true; 58 | return Utils.getHomeList(player).size() < homeConfig.getInt("home_ultimate"); 59 | } else { 60 | if (homeConfig.getInt("home_normal") == 0) return true; 61 | return Utils.getHomeList(player).size() < homeConfig.getInt("home_normal"); 62 | } 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/commands/DeleteHomeCommands.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.commands; 2 | 3 | import com.ultikits.abstracts.AbstractTabExecutor; 4 | import com.ultikits.ultitools.enums.ConfigsEnum; 5 | import com.ultikits.ultitools.ultitools.UltiTools; 6 | import com.ultikits.ultitools.utils.Utils; 7 | import org.bukkit.ChatColor; 8 | import org.bukkit.command.Command; 9 | import org.bukkit.configuration.file.YamlConfiguration; 10 | import org.bukkit.entity.Player; 11 | import org.jetbrains.annotations.NotNull; 12 | import org.jetbrains.annotations.Nullable; 13 | 14 | import java.io.File; 15 | import java.io.IOException; 16 | import java.util.List; 17 | 18 | public class DeleteHomeCommands extends AbstractTabExecutor { 19 | 20 | @Override 21 | protected boolean onPlayerCommand(@NotNull Command command, @NotNull String[] args, @NotNull Player player) { 22 | File file = new File(ConfigsEnum.PLAYER.toString(), player.getName() + ".yml"); 23 | 24 | if (file.exists()) { 25 | String homeName; 26 | if (args.length == 0) { 27 | homeName = UltiTools.languageUtils.getString("default"); 28 | return deleteHome(homeName, player, file); 29 | } else if (args.length == 1) { 30 | homeName = args[0]; 31 | return deleteHome(homeName, player, file); 32 | } else { 33 | return false; 34 | } 35 | 36 | } else { 37 | player.sendMessage(ChatColor.RED + UltiTools.languageUtils.getString("home_have_no_home")); 38 | } 39 | return true; 40 | } 41 | 42 | @Override 43 | protected @Nullable 44 | List onPlayerTabComplete(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) { 45 | return Utils.getHomeList(player); 46 | } 47 | 48 | private boolean deleteHome(String homeName, Player player, File file) { 49 | YamlConfiguration config = YamlConfiguration.loadConfiguration(file); 50 | List homeList = Utils.getHomeList(player); 51 | if (!homeList.contains(homeName)) { 52 | player.sendMessage(ChatColor.RED + UltiTools.languageUtils.getString("home_dont_have")); 53 | return true; 54 | } 55 | homeList.remove(homeName); 56 | String homeNameNew = homeName; 57 | if (homeName.equals(UltiTools.languageUtils.getString("default"))) { 58 | homeNameNew = "Def"; 59 | } 60 | config.set(player.getName() + "." + homeNameNew, null); 61 | config.set(player.getName() + ".homelist", homeList); 62 | try { 63 | config.save(file); 64 | } catch (IOException e) { 65 | e.printStackTrace(); 66 | } 67 | player.sendMessage(ChatColor.RED + String.format(UltiTools.languageUtils.getString("delhome_successfully"), homeName)); 68 | return false; 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/commands/RecallCommands.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.commands; 2 | 3 | import com.ultikits.abstracts.AbstractPlayerCommandExecutor; 4 | import com.ultikits.beans.CheckResponse; 5 | import com.ultikits.ultitools.ultitools.UltiTools; 6 | import com.ultikits.utils.MessagesUtils; 7 | import com.ultikits.utils.SendEmailUtils; 8 | import org.bukkit.command.Command; 9 | import org.bukkit.configuration.file.YamlConfiguration; 10 | import org.bukkit.entity.Player; 11 | import org.jetbrains.annotations.NotNull; 12 | import java.io.File; 13 | import java.util.Objects; 14 | 15 | import static com.ultikits.utils.MessagesUtils.info; 16 | import static com.ultikits.utils.MessagesUtils.warning; 17 | 18 | public class RecallCommands extends AbstractPlayerCommandExecutor { 19 | @Override 20 | protected boolean onPlayerCommand(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) { 21 | if (!UltiTools.getInstance().getConfig().getBoolean("enable_pro") || !UltiTools.getInstance().getProChecker().getProStatus()) { 22 | player.sendMessage(UltiTools.languageUtils.getString("warning_pro_function")); 23 | return true; 24 | } 25 | if(!player.isOp()) { 26 | player.sendMessage(MessagesUtils.warning(UltiTools.languageUtils.getString("no_permission"))); 27 | return false; 28 | } 29 | File loginData = new File(UltiTools.getInstance().getDataFolder() + File.separator + "loginData"); 30 | int sum=0; 31 | int suc = 0; 32 | for(File f : Objects.requireNonNull(loginData.listFiles())) { 33 | YamlConfiguration playerConfig = YamlConfiguration.loadConfiguration(f); 34 | if(playerConfig.getString("register_email") != null) { 35 | sum++; 36 | String email = playerConfig.getString("register_email"); 37 | player.sendMessage(String.format(UltiTools.languageUtils.getString("recall_sending_emails"),sum)); 38 | CheckResponse response = SendEmailUtils.sendEmail(email, UltiTools.languageUtils.getString("recall_email_title"), UltiTools.languageUtils.getString("recall_email_content")); 39 | if (response.code.equals("200")) { 40 | suc++; 41 | player.sendMessage(info(String.format(UltiTools.languageUtils.getString("recall_email_send_success"),sum,email))); 42 | } else { 43 | player.sendMessage(warning(String.format(UltiTools.languageUtils.getString("recall_email_send_fail"),sum,email))); 44 | } 45 | } 46 | } 47 | if(sum==0) { 48 | player.sendMessage(UltiTools.languageUtils.getString("recall_no_player_email")); 49 | return true; 50 | } 51 | player.sendMessage(String.format(UltiTools.languageUtils.getString("recall_conclusion"),sum,sum-suc)); 52 | return true; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /doc/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 生成的文档 (无标题) 8 | 61 | 62 | 63 | 64 | 65 | 66 | <noscript> 67 | <div>您的浏览器已禁用 JavaScript。</div> 68 | </noscript> 69 | <h2>框架预警</h2> 70 | <p>请使用框架功能查看此文档。如果看到此消息, 则表明您使用的是不支持框架的 Web 客户机。链接到<a href="com/minecraft/ultikits/inventoryapi/package-summary.html">非框架版本</a>。</p> 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/config/AbstractConfigReviewable.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.config; 2 | 3 | import com.ultikits.ultitools.ultitools.UltiTools; 4 | import org.bukkit.configuration.file.YamlConfiguration; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | import java.io.*; 8 | import java.net.URL; 9 | import java.net.URLConnection; 10 | import java.nio.charset.StandardCharsets; 11 | 12 | public abstract class AbstractConfigReviewable extends AbstractConfig { 13 | Double version; 14 | 15 | AbstractConfigReviewable() { 16 | super(); 17 | } 18 | 19 | public AbstractConfigReviewable(String name, String filePath) { 20 | super(name, filePath); 21 | } 22 | 23 | public AbstractConfigReviewable(String name, String folder, String filePath, String resourcePath) { 24 | super(name, folder, filePath, resourcePath); 25 | } 26 | 27 | @Override 28 | public void init() { 29 | if (file.exists()) { 30 | review(); 31 | } else { 32 | UltiTools.yaml.saveYamlFile(String.valueOf(folder), name + ".yml", resourcePath); 33 | } 34 | config = YamlConfiguration.loadConfiguration(file); 35 | if (!ConfigController.getConfigMap().containsKey(name)){ 36 | ConfigController.registerConfig(name, this); 37 | } 38 | } 39 | 40 | public void review() { 41 | config = YamlConfiguration.loadConfiguration(file); 42 | if (config.getDouble("config_version") < version) { 43 | resourcePath = resourcePath.replace('\\', '/'); 44 | InputStream in = getResource(resourcePath); 45 | if (in == null) { 46 | throw new IllegalArgumentException("The embedded resource '" + resourcePath + "' cannot be found in " + resourcePath); 47 | } 48 | Reader defConfigStream = new InputStreamReader(in, StandardCharsets.UTF_8); 49 | YamlConfiguration resourceConfig = YamlConfiguration.loadConfiguration(defConfigStream); 50 | for (String each : resourceConfig.getKeys(true)) { 51 | if (!config.contains(each)) { 52 | config.set(each, resourceConfig.get(each)); 53 | } 54 | } 55 | config.set("config_version", version); 56 | try { 57 | config.save(file); 58 | } catch (IOException e) { 59 | e.printStackTrace(); 60 | } 61 | reload(); 62 | } 63 | } 64 | 65 | private InputStream getResource(@NotNull String filename) { 66 | try { 67 | URL url = this.getClass().getClassLoader().getResource(filename); 68 | if (url == null) { 69 | return null; 70 | } 71 | URLConnection connection = url.openConnection(); 72 | connection.setUseCaches(false); 73 | return connection.getInputStream(); 74 | } catch (IOException ex) { 75 | return null; 76 | } 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/beans/ArmorsBean.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.beans; 2 | 3 | import com.ultikits.ultitools.ultitools.UltiTools; 4 | import org.bukkit.Material; 5 | import org.bukkit.entity.Player; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | /** 9 | * @author wisdomme 10 | */ 11 | public class ArmorsBean { 12 | private ItemStack hat; 13 | private ItemStack chest; 14 | private ItemStack leg; 15 | private ItemStack boots; 16 | private ItemStack mainHand; 17 | private ItemStack secondaryHand; 18 | 19 | public ArmorsBean(Player player) { 20 | if (player.getInventory().getHelmet() != null) { 21 | hat = player.getInventory().getHelmet(); 22 | } 23 | if (player.getInventory().getChestplate() != null) { 24 | chest = player.getInventory().getChestplate(); 25 | } 26 | if (player.getInventory().getLeggings() != null) { 27 | leg = player.getInventory().getLeggings(); 28 | } 29 | if (player.getInventory().getBoots() != null) { 30 | boots = player.getInventory().getBoots(); 31 | } 32 | if (UltiTools.versionAdaptor.getItemInHand(player, true).getType() != Material.AIR) { 33 | mainHand = UltiTools.versionAdaptor.getItemInHand(player, true); 34 | } 35 | if (UltiTools.versionAdaptor.getItemInHand(player, false) != null && UltiTools.versionAdaptor.getItemInHand(player, false).getType() != Material.AIR) { 36 | secondaryHand = UltiTools.versionAdaptor.getItemInHand(player, false); 37 | } 38 | } 39 | 40 | public int getHatDurability() { 41 | try { 42 | return UltiTools.versionAdaptor.getItemDurability(this.hat); 43 | } catch (NullPointerException e) { 44 | return -1; 45 | } 46 | } 47 | 48 | public int getChestDurability() { 49 | try { 50 | return UltiTools.versionAdaptor.getItemDurability(this.chest); 51 | } catch (NullPointerException e) { 52 | return -1; 53 | } 54 | } 55 | 56 | public int getLegDurability() { 57 | try { 58 | return UltiTools.versionAdaptor.getItemDurability(this.leg); 59 | } catch (NullPointerException e) { 60 | return -1; 61 | } 62 | } 63 | 64 | public int getBootsDurability() { 65 | try { 66 | return UltiTools.versionAdaptor.getItemDurability(this.boots); 67 | } catch (NullPointerException e) { 68 | return -1; 69 | } 70 | } 71 | 72 | public int getMainHandDurability() { 73 | try { 74 | return UltiTools.versionAdaptor.getItemDurability(this.mainHand); 75 | } catch (NullPointerException e) { 76 | return -1; 77 | } 78 | } 79 | 80 | public int getOffHandDurability() { 81 | try { 82 | return UltiTools.versionAdaptor.getItemDurability(this.secondaryHand); 83 | } catch (NullPointerException e) { 84 | return -1; 85 | } 86 | } 87 | 88 | } 89 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/listener/CustomGUIListener.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.listener; 2 | 3 | import com.ultikits.beans.CancelResult; 4 | import com.ultikits.inventoryapi.InventoryManager; 5 | import com.ultikits.inventoryapi.PagesListener; 6 | import com.ultikits.ultitools.config.ConfigController; 7 | import com.ultikits.ultitools.ultitools.UltiTools; 8 | import com.ultikits.utils.EconomyUtils; 9 | import org.bukkit.ChatColor; 10 | import org.bukkit.configuration.file.YamlConfiguration; 11 | import org.bukkit.entity.Player; 12 | import org.bukkit.event.inventory.InventoryClickEvent; 13 | import org.bukkit.inventory.ItemStack; 14 | 15 | public class CustomGUIListener extends PagesListener { 16 | private final String signature; 17 | 18 | public CustomGUIListener(String signature) { 19 | this.signature = signature; 20 | } 21 | 22 | @Override 23 | public CancelResult onItemClick(InventoryClickEvent event, Player player, InventoryManager inventoryManager, ItemStack clickedItem) { 24 | String title = ConfigController.getConfig("customgui").getString("guis." + signature + ".title") + " - " + player.getName(); 25 | if (!inventoryManager.getTitle().equals(title)) { 26 | return CancelResult.NONE; 27 | } 28 | if (clickedItem != null) { 29 | int position = event.getSlot(); 30 | YamlConfiguration config = ConfigController.getConfig("customgui"); 31 | for (String key : config.getConfigurationSection(signature).getKeys(false)) { 32 | if (position == config.getInt(signature + "." + key + ".position")) { 33 | if (EconomyUtils.checkMoney(player) < config.getInt(signature + "." + key + ".price")) { 34 | player.sendMessage(ChatColor.RED + UltiTools.languageUtils.getString("custom_gui_not_enough_money")); 35 | return CancelResult.TRUE; 36 | } 37 | for (String playerCommand : config.getStringList(signature + "." + key + ".player-commands")) { 38 | player.performCommand(playerCommand); 39 | } 40 | for (String consoleCommand : config.getStringList(signature + "." + key + ".console-commands")) { 41 | UltiTools.getInstance().getServer().dispatchCommand(UltiTools.getInstance().getServer().getConsoleSender(), consoleCommand.replace("{PLAYER}", player.getName())); 42 | } 43 | EconomyUtils.withdraw(player, config.getInt(signature + "." + key + ".price")); 44 | if (config.get(signature + "." + key + ".keep-open") != null && 45 | !config.getBoolean(signature + "." + key + ".keep-open")) { 46 | player.closeInventory(); 47 | } 48 | return CancelResult.TRUE; 49 | } 50 | } 51 | } 52 | return CancelResult.TRUE; 53 | } 54 | 55 | public String getSignature() { 56 | return signature; 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/enums/ConfigsEnum.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.enums; 2 | 3 | import com.ultikits.ultitools.ultitools.UltiTools; 4 | 5 | public enum ConfigsEnum { 6 | PLAYER_EMAIL(UltiTools.getInstance().getDataFolder() + "/emailData"), 7 | PLAYER_CHEST(UltiTools.getInstance().getDataFolder() + "/chestData"), 8 | CHEST(UltiTools.getInstance().getDataFolder() + "/chestData.yml"), 9 | PLAYER_LOGIN(UltiTools.getInstance().getDataFolder() + "/loginData"), 10 | LOGIN(UltiTools.getInstance().getDataFolder() + "/login.yml"), 11 | WHITELIST(UltiTools.getInstance().getDataFolder() + "/whitelist.yml"), 12 | KIT(UltiTools.getInstance().getDataFolder() + "/kits.yml"), 13 | DATA_KIT(UltiTools.getInstance().getDataFolder() + "/kitData/kit.yml"), 14 | PLAYER(UltiTools.getInstance().getDataFolder() + "/playerData"), 15 | CLEANER(UltiTools.getInstance().getDataFolder() + "/cleaner.yml"), 16 | PERMISSION_GROUP(UltiTools.getInstance().getDataFolder()+"/permission/groups.yml"), 17 | PERMISSION_USER(UltiTools.getInstance().getDataFolder()+"/permission/users.yml"), 18 | PERMISSION_INHERITED(UltiTools.getInstance().getDataFolder()+"/permission/globalgroups.yml"), 19 | WORLDS(UltiTools.getInstance().getDataFolder() + "/worlds.yml"), 20 | SIDEBAR(UltiTools.getInstance().getDataFolder() + "/sidebar/config.yml"), 21 | SIDEBAR_DATA(UltiTools.getInstance().getDataFolder() + "/sidebar/data.yml"), 22 | CHEST_LOCK(UltiTools.getInstance().getDataFolder() + "/chestlock.yml"), 23 | HOME(UltiTools.getInstance().getDataFolder() + "/home.yml"), 24 | JOIN_WELCOME(UltiTools.getInstance().getDataFolder() + "/joinwelcome.yml"), 25 | MAIN(UltiTools.getInstance().getDataFolder() + "/config.yml"), 26 | DEATH(UltiTools.getInstance().getDataFolder()+"/death.yml"), 27 | WARPS(UltiTools.getInstance().getDataFolder()+"/warps"), 28 | BAG(UltiTools.getInstance().getDataFolder()+"/bag.yml"), 29 | CHAT(UltiTools.getInstance().getDataFolder()+"/chat.yml"), 30 | CUSTOMERGUI(UltiTools.getInstance().getDataFolder()+"/customgui.yml"), 31 | PLAYERLIST(UltiTools.getInstance().getDataFolder() + "/playerData/playerlist/playerlist.yml"), 32 | LOBBY(UltiTools.getInstance().getDataFolder() + "/lobby.yml"), 33 | TRADE(UltiTools.getInstance().getDataFolder() + "/trade.yml"), 34 | ANNOUNCEMENT(UltiTools.getInstance().getDataFolder() + "/announcement.yml"), 35 | MOTD(UltiTools.getInstance().getDataFolder() + "/motd.yml"), 36 | COMMANDALIAS(UltiTools.getInstance().getDataFolder() + "/command-alias.yml"), 37 | InventoryBackupData(UltiTools.getInstance().getDataFolder() + "/InventoryBackupData"), 38 | BANLIST(UltiTools.getInstance().getDataFolder() + "/banlist.yml"), 39 | TAB_BAR(UltiTools.getInstance().getDataFolder() + "/tab-bar.yml"), 40 | RECIPE(UltiTools.getInstance().getDataFolder() + "/recipe.yml"); 41 | 42 | private final String path; 43 | 44 | ConfigsEnum(String path) { 45 | this.path = path; 46 | } 47 | 48 | @Override 49 | public String toString() { 50 | return path; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/listener/MultiWorldListener.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.listener; 2 | 3 | import com.ultikits.ultitools.commands.MultiWorldsCommands; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.EventHandler; 6 | import org.bukkit.event.Listener; 7 | import org.bukkit.event.block.BlockBreakEvent; 8 | import org.bukkit.event.block.BlockPlaceEvent; 9 | import org.bukkit.event.block.MoistureChangeEvent; 10 | import org.bukkit.event.entity.CreatureSpawnEvent; 11 | import org.bukkit.event.entity.EntityChangeBlockEvent; 12 | import org.bukkit.event.entity.EntityDamageByEntityEvent; 13 | import org.bukkit.event.entity.EntityExplodeEvent; 14 | import org.bukkit.event.player.PlayerInteractEvent; 15 | 16 | import java.util.Objects; 17 | 18 | public class MultiWorldListener implements Listener { 19 | 20 | @EventHandler 21 | public void onPlayerPlaceBlock(BlockPlaceEvent event) { 22 | if (event.getPlayer().isOp() || !MultiWorldsCommands.protectedWorlds.contains(event.getBlock().getWorld().getName())) return; 23 | event.setCancelled(true); 24 | } 25 | 26 | @EventHandler 27 | public void onPlayerBreakBlock(BlockBreakEvent event) { 28 | if (event.getPlayer().isOp() || !MultiWorldsCommands.protectedWorlds.contains(event.getBlock().getWorld().getName())) return; 29 | event.setCancelled(true); 30 | } 31 | 32 | @EventHandler 33 | public void onPlayerInteractBlock(PlayerInteractEvent event) { 34 | if (event.getClickedBlock() == null) return; 35 | if (event.getPlayer().isOp() || !MultiWorldsCommands.protectedWorlds.contains(event.getClickedBlock().getWorld().getName())) return; 36 | event.setCancelled(true); 37 | } 38 | 39 | @EventHandler 40 | public void onEntityChangeBlock(EntityChangeBlockEvent event) { 41 | if (!MultiWorldsCommands.protectedWorlds.contains(event.getBlock().getWorld().getName())) return; 42 | event.setCancelled(true); 43 | } 44 | 45 | @EventHandler 46 | public void onEntityExplode(EntityExplodeEvent event) { 47 | if (!MultiWorldsCommands.protectedWorlds.contains(event.getEntity().getWorld().getName())) return; 48 | event.setCancelled(true); 49 | } 50 | 51 | @EventHandler 52 | public void onMoistureChange(MoistureChangeEvent event) { 53 | if (!MultiWorldsCommands.protectedWorlds.contains(event.getBlock().getWorld().getName())) return; 54 | event.setCancelled(true); 55 | } 56 | 57 | @EventHandler 58 | public void onPlayerDamage(EntityDamageByEntityEvent event) { 59 | if (!(event.getDamager() instanceof Player)) return; 60 | if (Objects.requireNonNull(((Player) event.getDamager()).getPlayer()).isOp() || !MultiWorldsCommands.noPvpWorlds.contains(event.getDamager().getWorld().getName())) return; 61 | event.setCancelled(true); 62 | } 63 | 64 | @EventHandler 65 | public void onEntitySpawn(CreatureSpawnEvent event) { 66 | if (!MultiWorldsCommands.noSpawnWorlds.contains(event.getEntity().getWorld().getName())) return; 67 | event.setCancelled(true); 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/commands/PasswordCommands.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.commands; 2 | 3 | import com.ultikits.ultitools.ultitools.UltiTools; 4 | import com.ultikits.ultitools.utils.DatabasePlayerTools; 5 | import org.bukkit.Bukkit; 6 | import org.bukkit.OfflinePlayer; 7 | import org.bukkit.command.Command; 8 | import org.bukkit.command.CommandSender; 9 | import org.bukkit.command.TabExecutor; 10 | import org.bukkit.entity.Player; 11 | import org.jetbrains.annotations.NotNull; 12 | import org.jetbrains.annotations.Nullable; 13 | 14 | import java.util.ArrayList; 15 | import java.util.List; 16 | import java.util.Random; 17 | 18 | import static com.ultikits.utils.MessagesUtils.info; 19 | import static com.ultikits.utils.MessagesUtils.warning; 20 | 21 | /** 22 | * @author qianmo 23 | */ 24 | 25 | public class PasswordCommands implements TabExecutor { 26 | 27 | @Override 28 | public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, @NotNull String[] strings) { 29 | if (commandSender.isOp()) { 30 | if (strings.length == 2) { 31 | switch (strings[0]) { 32 | case "reset" : 33 | if(DatabasePlayerTools.isPlayerAccountExist(strings[1])) { 34 | Random random = new Random(); 35 | StringBuilder pwd= new StringBuilder(); 36 | for (int i=0;i<6;i++) 37 | { 38 | pwd.append(random.nextInt(10)); 39 | } 40 | DatabasePlayerTools.setPlayerPassword(strings[1], String.valueOf(pwd)); 41 | commandSender.sendMessage(info(String.format(UltiTools.languageUtils.getString("pwd_reset_success"), strings[1]))); 42 | commandSender.sendMessage(info(String.valueOf(pwd))); 43 | }else { 44 | commandSender.sendMessage(warning(UltiTools.languageUtils.getString("pwd_player_not_found"))); 45 | } 46 | break; 47 | default: 48 | return false; 49 | } 50 | } 51 | } else { 52 | commandSender.sendMessage(warning(UltiTools.languageUtils.getString("no_permission"))); 53 | } 54 | return true; 55 | } 56 | 57 | @Nullable 58 | @Override 59 | public List onTabComplete(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, @NotNull String[] strings) { 60 | if (commandSender instanceof Player) { 61 | List tabCommands = new ArrayList<>(); 62 | switch (strings.length) { 63 | case 1: 64 | tabCommands.add("reset"); 65 | return tabCommands; 66 | case 2: 67 | for (OfflinePlayer player: Bukkit.getOfflinePlayers()) { 68 | tabCommands.add(player.getName()); 69 | } 70 | return tabCommands; 71 | } 72 | } 73 | return null; 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /src/main/java/com/ultikits/ultitools/commands/RandomTpCommands.java: -------------------------------------------------------------------------------- 1 | package com.ultikits.ultitools.commands; 2 | 3 | import com.ultikits.abstracts.AbstractPlayerCommandExecutor; 4 | import com.ultikits.ultitools.ultitools.UltiTools; 5 | import com.ultikits.utils.MessagesUtils; 6 | import org.bukkit.*; 7 | import org.bukkit.block.Block; 8 | import org.bukkit.block.BlockFace; 9 | import org.bukkit.command.Command; 10 | import org.bukkit.entity.Player; 11 | import org.bukkit.scheduler.BukkitRunnable; 12 | import org.jetbrains.annotations.NotNull; 13 | 14 | import java.util.*; 15 | 16 | public class RandomTpCommands extends AbstractPlayerCommandExecutor { 17 | 18 | @Override 19 | protected boolean onPlayerCommand(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) { 20 | 21 | if(!player.isOp() && !player.hasPermission("ultikits.tools.command.wild")) { 22 | player.sendMessage(MessagesUtils.warning(UltiTools.languageUtils.getString("no_permission"))); 23 | return false; 24 | } 25 | World.Environment environment = player.getWorld().getEnvironment(); 26 | if (environment == World.Environment.NETHER || environment == World.Environment.THE_END) { 27 | player.sendMessage(MessagesUtils.warning(UltiTools.languageUtils.getString("random_tp_banned"))); 28 | } else { 29 | new BukkitRunnable() { 30 | @Override 31 | public void run() { 32 | World world = player.getWorld(); 33 | while (true) { 34 | player.sendMessage(ChatColor.YELLOW + UltiTools.languageUtils.getString("random_tp_searching")); 35 | int randomX = new Random().nextInt(1600) - 800; 36 | int randomZ = new Random().nextInt(1600) - 800; 37 | Block block = world.getHighestBlockAt(randomX, randomZ); //得到随机点最高不可通过方块 38 | Location location = new Location(world, block.getLocation().getX(), block.getLocation().getY() + 1, block.getLocation().getZ()); //方块上方,即传送点 39 | Location location2 = new Location(world, block.getLocation().getX(), block.getLocation().getY() + 2, block.getLocation().getZ()); 40 | Block blockY1 = world.getBlockAt(location); //方块上方,为传送点 41 | Block blockY2 = world.getBlockAt(location2); //方块上方第二个,为了检测Y1(传送点) 42 | if (blockY2.getRelative(BlockFace.DOWN).getType() == Material.WATER || 43 | blockY2.getRelative(BlockFace.DOWN).getType() == Material.LAVA || 44 | blockY2.getRelative(BlockFace.DOWN).getType() == Material.WATER) { 45 | continue; 46 | } 47 | world.getChunkAt(location).load(); 48 | player.teleport(location); 49 | player.sendMessage(ChatColor.YELLOW + UltiTools.languageUtils.getString("random_tp_success")); 50 | return; 51 | } 52 | } 53 | }.runTask(UltiTools.getInstance()); 54 | } 55 | 56 | return true; 57 | } 58 | } 59 | 60 | --------------------------------------------------------------------------------