1
mirror of https://github.com/CarmJos/ScriptItems synced 2026-06-04 11:08:17 +08:00

feat: 升级到 1.21,并提供folia支持

This commit is contained in:
2025-12-14 01:22:19 +08:00
parent c346c576ce
commit 29da2c8a80
15 changed files with 99 additions and 96 deletions
+1 -1
View File
@@ -14,7 +14,7 @@
脚本物品插件,给予玩家可执行对应操作的物品,基于EasyPlugin实现。
本插件由 [ArtStyle(艺式)](https://artstyle.wiki/)、[猫窝](https://maowo.moe) 提供开发资助。
本插件由 [ArtStyle(艺式)](https://artstyle.wiki/)、[猫窝](https://maowo.moe)、[奥林匹亚](www.mcolympia.site) 提供开发资助。
## 插件功能与优势
+4 -4
View File
@@ -18,7 +18,7 @@
<groupId>cc.carm.plugin</groupId>
<artifactId>scriptitems</artifactId>
<version>1.1.1</version>
<version>1.1.2</version>
<name>ScriptItems</name>
<description>物品操作绑定插件,给予玩家可执行对应操作的物品,基于EasyPlugin实现。</description>
@@ -101,8 +101,8 @@
<dependency>
<groupId>cc.carm.lib</groupId>
<artifactId>easyplugin-listener</artifactId>
<version>${deps.easyplugin.version}</version>
<artifactId>easylistener</artifactId>
<version>2.0.1</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
@@ -134,7 +134,7 @@
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.19-R0.1-20220725.090125-47</version>
<version>1.21.10-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
@@ -1,6 +1,6 @@
package cc.carm.plugin.scriptitems;
import cc.carm.lib.configuration.core.source.ConfigurationProvider;
import cc.carm.lib.configuration.source.ConfigurationHolder;
import cc.carm.lib.easyplugin.EasyPlugin;
import cc.carm.lib.easyplugin.updatechecker.GHUpdateChecker;
import cc.carm.lib.mineconfiguration.bukkit.MineConfiguration;
@@ -21,8 +21,8 @@ public class Main extends EasyPlugin {
instance = this;
}
protected ConfigurationProvider<?> configProvider;
protected ConfigurationProvider<?> messageProvider;
protected ConfigurationHolder<?> configProvider;
protected ConfigurationHolder<?> messageProvider;
protected ItemsManager itemsManager;
@@ -42,7 +42,7 @@ public class Main extends EasyPlugin {
this.itemsManager.initialize();
info("注册指令...");
registerCommand("ScriptItems", new MainCommand(this));
registerCommand("ScriptItems".toLowerCase(), new MainCommand(this));
info("注册监听器...");
registerListener(new ItemListener());
@@ -92,11 +92,11 @@ public class Main extends EasyPlugin {
getInstance().debug(messages);
}
public ConfigurationProvider<?> getConfigProvider() {
public ConfigurationHolder<?> getConfigProvider() {
return configProvider;
}
public ConfigurationProvider<?> getMessageProvider() {
public ConfigurationHolder<?> getMessageProvider() {
return messageProvider;
}
}
@@ -21,13 +21,13 @@ public class MainCommand extends CommandHandler {
@Override
public Void noArgs(CommandSender sender) {
PluginMessages.USAGE.send(sender);
PluginMessages.USAGE.sendTo(sender);
return null;
}
@Override
public Void noPermission(CommandSender sender) {
PluginMessages.NO_PERMISSION.send(sender);
PluginMessages.NO_PERMISSION.sendTo(sender);
return null;
}
@@ -37,7 +37,7 @@ public class MainCommand extends CommandHandler {
}
public Void onlyPlay(CommandSender sender) {
PluginMessages.ONLY_PLAYER.send(sender);
PluginMessages.ONLY_PLAYER.sendTo(sender);
return null;
}
}
@@ -28,20 +28,20 @@ public class ApplyCommand extends SubCommand<MainCommand> {
ScriptConfiguration settings = ScriptItemsAPI.getItemsManager().getItemSettings(args[0]);
if (settings == null) {
PluginMessages.NOT_EXISTS.send(sender, args[1]);
PluginMessages.NOT_EXISTS.sendTo(sender, args[1]);
return null;
}
Player player = (Player) sender;
ItemStack item = player.getInventory().getItemInMainHand();
if (item.getType() == Material.AIR) {
PluginMessages.USE_ITEM.send(sender);
PluginMessages.USE_ITEM.sendTo(sender);
return null;
}
ItemStack after = settings.applyItem(item.clone());
player.getInventory().setItemInMainHand(after);
PluginMessages.APPLIED.send(sender, item.getType().name(), settings.getName());
PluginMessages.APPLIED.sendTo(sender, item.getType().name(), settings.getName());
return null;
}
@@ -30,7 +30,7 @@ public class GetCommand extends SubCommand<MainCommand> {
ScriptConfiguration settings = ScriptItemsAPI.getItemsManager().getItemSettings(args[0]);
if (settings == null) {
PluginMessages.NOT_EXISTS.send(sender, args[0]);
PluginMessages.NOT_EXISTS.sendTo(sender, args[0]);
return null;
}
@@ -44,22 +44,22 @@ public class GetCommand extends SubCommand<MainCommand> {
}
if (amount < 1) {
PluginMessages.WRONG_AMOUNT.send(sender);
PluginMessages.WRONG_AMOUNT.sendTo(sender);
return null;
}
ItemStack item = settings.generateItem(amount);
if (item == null) {
PluginMessages.WRONG_ITEM.send(sender);
PluginMessages.WRONG_ITEM.sendTo(sender);
return null;
}
HashMap<Integer, ItemStack> remain = player.getInventory().addItem(item);
if (remain.isEmpty()) {
PluginMessages.GIVEN_ALL.send(sender, player.getName(), amount, settings.getName());
PluginMessages.GIVEN_ALL.sendTo(sender, player.getName(), amount, settings.getName());
} else {
int remainAmount = remain.values().stream().mapToInt(ItemStack::getAmount).sum();
PluginMessages.GIVEN_SOME.send(sender, player.getName(), amount - remainAmount, settings.getName(), remainAmount);
PluginMessages.GIVEN_SOME.sendTo(sender, player.getName(), amount - remainAmount, settings.getName(), remainAmount);
}
return null;
@@ -29,13 +29,13 @@ public class GiveCommand extends SubCommand<MainCommand> {
Player player = Bukkit.getPlayer(args[0]);
if (player == null) {
PluginMessages.NOT_ONLINE.send(sender, args[0]);
PluginMessages.NOT_ONLINE.sendTo(sender, args[0]);
return null;
}
ScriptConfiguration settings = ScriptItemsAPI.getItemsManager().getItemSettings(args[1]);
if (settings == null) {
PluginMessages.NOT_EXISTS.send(sender, args[1]);
PluginMessages.NOT_EXISTS.sendTo(sender, args[1]);
return null;
}
@@ -49,22 +49,22 @@ public class GiveCommand extends SubCommand<MainCommand> {
}
if (amount < 1) {
PluginMessages.WRONG_AMOUNT.send(sender);
PluginMessages.WRONG_AMOUNT.sendTo(sender);
return null;
}
ItemStack item = settings.generateItem(amount);
if (item == null) {
PluginMessages.WRONG_ITEM.send(sender);
PluginMessages.WRONG_ITEM.sendTo(sender);
return null;
}
HashMap<Integer, ItemStack> remain = player.getInventory().addItem(item);
if (remain.isEmpty()) {
PluginMessages.GIVEN_ALL.send(sender, player.getName(), amount, settings.getName());
PluginMessages.GIVEN_ALL.sendTo(sender, player.getName(), amount, settings.getName());
} else {
int remainAmount = remain.values().stream().mapToInt(ItemStack::getAmount).sum();
PluginMessages.GIVEN_SOME.send(sender, player.getName(), amount - remainAmount, settings.getName(), remainAmount);
PluginMessages.GIVEN_SOME.sendTo(sender, player.getName(), amount - remainAmount, settings.getName(), remainAmount);
}
return null;
@@ -1,40 +1,41 @@
package cc.carm.plugin.scriptitems.conf;
import cc.carm.lib.configuration.core.ConfigurationRoot;
import cc.carm.lib.configuration.core.annotation.HeaderComment;
import cc.carm.lib.configuration.core.value.ConfigValue;
import cc.carm.lib.configuration.core.value.type.ConfiguredValue;
import cc.carm.lib.configuration.Configuration;
import cc.carm.lib.configuration.annotation.ConfigPath;
import cc.carm.lib.configuration.annotation.HeaderComments;
import cc.carm.lib.configuration.value.standard.ConfiguredValue;
public class PluginConfig extends ConfigurationRoot {
@ConfigPath(root = true)
public interface PluginConfig extends Configuration {
public static final ConfigValue<Boolean> DEBUG = ConfiguredValue.of(Boolean.class, false);
ConfiguredValue<Boolean> DEBUG = ConfiguredValue.of(Boolean.class, false);
@HeaderComment({
@HeaderComments({
"统计数据设定",
"该选项用于帮助开发者统计插件版本与使用情况,且绝不会影响性能与使用体验。",
"当然,您也可以选择在这里关闭,或在plugins/bStats下的配置文件中关闭。"
})
public static final ConfigValue<Boolean> METRICS = ConfiguredValue.of(Boolean.class, true);
ConfiguredValue<Boolean> METRICS = ConfiguredValue.of(Boolean.class, true);
@HeaderComment({
@HeaderComments({
"检查更新设定",
"该选项用于插件判断是否要检查更新,若您不希望插件检查更新并提示您,可以选择关闭。",
"检查更新为异步操作,绝不会影响性能与使用体验。"
})
public static final ConfigValue<Boolean> CHECK_UPDATE = ConfiguredValue.of(Boolean.class, true);
ConfiguredValue<Boolean> CHECK_UPDATE = ConfiguredValue.of(Boolean.class, true);
@HeaderComment({
@HeaderComments({
"物品使用冷却,避免短时间重复使用物品,也避免网络延迟而导致物品被错误使用而对玩家造成的损失。",
"强烈建议开启,且建议设置为 2000毫秒 以上。(1s = 1000ms)"
})
public static class COOLDOWN extends ConfigurationRoot {
interface COOLDOWN extends Configuration {
@HeaderComment("是否启用冷却功能")
public static final ConfigValue<Boolean> ENABLE = ConfiguredValue.of(Boolean.class, true);
@HeaderComments("是否启用冷却功能")
ConfiguredValue<Boolean> ENABLE = ConfiguredValue.of(Boolean.class, true);
@HeaderComment("冷却的时长,单位为毫秒 1秒 = 1000毫秒 = 20ticks")
public static final ConfigValue<Long> DURATION = ConfiguredValue.of(Long.class, 3000L);
@HeaderComments("冷却的时长,单位为毫秒 1秒 = 1000毫秒 = 20ticks")
ConfiguredValue<Long> DURATION = ConfiguredValue.of(Long.class, 3000L);
}
@@ -1,12 +1,14 @@
package cc.carm.plugin.scriptitems.conf;
import cc.carm.lib.configuration.core.ConfigurationRoot;
import cc.carm.lib.mineconfiguration.bukkit.value.ConfiguredMessageList;
import cc.carm.lib.configuration.Configuration;
import cc.carm.lib.configuration.annotation.ConfigPath;
import cc.carm.lib.mineconfiguration.bukkit.value.ConfiguredMessage;
public class PluginMessages extends ConfigurationRoot {
@ConfigPath(root = true)
public interface PluginMessages extends Configuration {
public static final ConfiguredMessageList<String> USAGE = ConfiguredMessageList.asStrings().defaults(
ConfiguredMessage<String> USAGE = ConfiguredMessage.asString().defaults(
"&2&l脚本物品 &f指令帮助",
"&8#&f give &a<玩家名> &a<脚本ID> &2[数量]",
"&8-&7 给予指定玩家指定数量的物品。",
@@ -18,63 +20,63 @@ public class PluginMessages extends ConfigurationRoot {
"&8-&7 重载配置文件。"
).build();
public static final ConfiguredMessageList<String> NO_PERMISSION = ConfiguredMessageList.asStrings()
ConfiguredMessage<String> NO_PERMISSION = ConfiguredMessage.asString()
.defaults("&c&l抱歉!&f但您没有权限使用该命令。")
.build();
public final static ConfiguredMessageList<String> COOLDOWN = ConfiguredMessageList.asStrings()
ConfiguredMessage<String> COOLDOWN = ConfiguredMessage.asString()
.defaults("&f您需要等待 &a%(time)秒 &f才可再次使用该物品。")
.params("time").build();
public final static ConfiguredMessageList<String> ONLY_PLAYER = ConfiguredMessageList.asStrings()
ConfiguredMessage<String> ONLY_PLAYER = ConfiguredMessage.asString()
.defaults("&c抱歉,只有作为玩家时才能使用该指令。").build();
public final static ConfiguredMessageList<String> USE_ITEM = ConfiguredMessageList.asStrings()
ConfiguredMessage<String> USE_ITEM = ConfiguredMessage.asString()
.defaults("&f请手持任意物品后再使用该指令。").build();
public final static ConfiguredMessageList<String> NOT_ONLINE = ConfiguredMessageList.asStrings()
ConfiguredMessage<String> NOT_ONLINE = ConfiguredMessage.asString()
.defaults("&f玩家 &a%(player) &f并不在线。")
.params("player").build();
public final static ConfiguredMessageList<String> NOT_EXISTS = ConfiguredMessageList.asStrings()
ConfiguredMessage<String> NOT_EXISTS = ConfiguredMessage.asString()
.defaults("&f脚本配置 &a%(id) &f并不存在。")
.params("id").build();
public final static ConfiguredMessageList<String> WRONG_AMOUNT = ConfiguredMessageList.asStrings()
ConfiguredMessage<String> WRONG_AMOUNT = ConfiguredMessage.asString()
.defaults("&f请输入正确的数量!")
.build();
public final static ConfiguredMessageList<String> WRONG_ITEM = ConfiguredMessageList.asStrings()
ConfiguredMessage<String> WRONG_ITEM = ConfiguredMessage.asString()
.defaults("&f该脚本并未成功配置具体物品,请使用 &a/ScriptItems apply &f来绑定到指定物品上,或在配置文件中正确配置物品。")
.build();
public final static ConfiguredMessageList<String> GIVEN_ALL = ConfiguredMessageList.asStrings()
ConfiguredMessage<String> GIVEN_ALL = ConfiguredMessage.asString()
.defaults("&f您成功给予 &2%(player) &f了 &a%(amount) &f个 &a%(name) &f。")
.params("player", "amount", "name").build();
public final static ConfiguredMessageList<String> GIVEN_SOME = ConfiguredMessageList.asStrings()
ConfiguredMessage<String> GIVEN_SOME = ConfiguredMessage.asString()
.defaults(
"&f您成功给予 &2%(player) &f了 &a%(amount) &f个 &a%(name) &f。",
"&f但由于目标玩家背包已满,仍有 &a%(remain) &f个 &a%(name) &f未成功放入背包。"
).params("player", "amount", "name", "remain").build();
public final static ConfiguredMessageList<String> APPLIED = ConfiguredMessageList.asStrings()
ConfiguredMessage<String> APPLIED = ConfiguredMessage.asString()
.defaults("&f成功为手上的 &2%(type) &f绑定了脚本 &a%(name) &f。")
.params("type", "name").build();
public static class RESTRICTIONS extends ConfigurationRoot {
interface RESTRICTIONS extends Configuration {
public final static ConfiguredMessageList<String> INVALID = ConfiguredMessageList.asStrings()
ConfiguredMessage<String> INVALID = ConfiguredMessage.asString()
.defaults("&c&l抱歉!&f由于配置的时间限制错误,该物品目前暂不可用。")
.build();
public final static ConfiguredMessageList<String> NOT_STARTED = ConfiguredMessageList.asStrings()
ConfiguredMessage<String> NOT_STARTED = ConfiguredMessage.asString()
.defaults("&f该物品目前还到可使用的时间,请在 &a%(time) &f后使用~")
.params("time")
.build();
public final static ConfiguredMessageList<String> EXPIRED = ConfiguredMessageList.asStrings()
ConfiguredMessage<String> EXPIRED = ConfiguredMessage.asString()
.defaults("&c&l抱歉!&f由于该物品已过最后使用期限,故无法继续使用。")
.params("time")
.build();
@@ -1,33 +1,32 @@
package cc.carm.plugin.scriptitems.database;
import cc.carm.lib.configuration.core.ConfigurationRoot;
import cc.carm.lib.configuration.core.annotation.ConfigPath;
import cc.carm.lib.configuration.core.annotation.HeaderComment;
import cc.carm.lib.configuration.core.value.ConfigValue;
import cc.carm.lib.configuration.core.value.type.ConfiguredValue;
import cc.carm.lib.configuration.Configuration;
import cc.carm.lib.configuration.annotation.ConfigPath;
import cc.carm.lib.configuration.annotation.HeaderComments;
import cc.carm.lib.configuration.value.standard.ConfiguredValue;
@HeaderComment("选择 database (如mysql) 存储方式时的数据库配置")
@HeaderComments("选择 database (如mysql) 存储方式时的数据库配置")
@ConfigPath("storage.database")
public class DatabaseConfig extends ConfigurationRoot {
public class DatabaseConfig implements Configuration {
@ConfigPath("driver")
protected static final ConfigValue<String> DRIVER_NAME = ConfiguredValue.of(
protected static final ConfiguredValue<String> DRIVER_NAME = ConfiguredValue.of(
String.class, "com.mysql.jdbc.Driver"
);
protected static final ConfigValue<String> HOST = ConfiguredValue.of(String.class, "127.0.0.1");
protected static final ConfigValue<Integer> PORT = ConfiguredValue.of(Integer.class, 3306);
protected static final ConfigValue<String> DATABASE = ConfiguredValue.of(String.class, "minecraft");
protected static final ConfigValue<String> USERNAME = ConfiguredValue.of(String.class, "root");
protected static final ConfigValue<String> PASSWORD = ConfiguredValue.of(String.class, "password");
protected static final ConfigValue<String> EXTRA = ConfiguredValue.of(String.class, "?useSSL=false");
protected static final ConfiguredValue<String> HOST = ConfiguredValue.of(String.class, "127.0.0.1");
protected static final ConfiguredValue<Integer> PORT = ConfiguredValue.of(Integer.class, 3306);
protected static final ConfiguredValue<String> DATABASE = ConfiguredValue.of(String.class, "minecraft");
protected static final ConfiguredValue<String> USERNAME = ConfiguredValue.of(String.class, "root");
protected static final ConfiguredValue<String> PASSWORD = ConfiguredValue.of(String.class, "password");
protected static final ConfiguredValue<String> EXTRA = ConfiguredValue.of(String.class, "?useSSL=false");
@HeaderComment("插件相关表的名称")
public static final class TABLES extends ConfigurationRoot {
@HeaderComments("插件相关表的名称")
public static final class TABLES implements Configuration {
public static final ConfigValue<String> TAKEN = ConfiguredValue.of(String.class, "log_item_take");
public static final ConfigValue<String> GIVEN = ConfiguredValue.of(String.class, "log_item_give");
public static final ConfiguredValue<String> TAKEN = ConfiguredValue.of(String.class, "log_item_take");
public static final ConfiguredValue<String> GIVEN = ConfiguredValue.of(String.class, "log_item_give");
}
@@ -1,6 +1,6 @@
package cc.carm.plugin.scriptitems.database;
import cc.carm.lib.configuration.core.value.ConfigValue;
import cc.carm.lib.configuration.value.standard.ConfiguredValue;
import cc.carm.lib.easysql.api.SQLManager;
import cc.carm.lib.easysql.api.SQLTable;
import cc.carm.lib.easysql.api.builder.TableCreateBuilder;
@@ -66,10 +66,10 @@ public enum DatabaseTables implements SQLTable {
});
private final Consumer<TableCreateBuilder> builder;
private final ConfigValue<String> name;
private final ConfiguredValue<String> name;
private @Nullable SQLManager manager;
DatabaseTables(ConfigValue<String> name,
DatabaseTables(ConfiguredValue<String> name,
Consumer<TableCreateBuilder> builder) {
this.name = name;
this.builder = builder;
@@ -1,7 +1,7 @@
package cc.carm.plugin.scriptitems.item;
import cc.carm.lib.easysql.api.util.TimeDateUtils;
import cc.carm.lib.mineconfiguration.bukkit.value.ConfiguredMessageList;
import cc.carm.lib.mineconfiguration.bukkit.value.ConfiguredMessage;
import cc.carm.plugin.scriptitems.conf.PluginMessages;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
@@ -63,25 +63,25 @@ public class ScriptRestrictions {
(res) -> new Object[]{TimeDateUtils.getTimeString(res.getEndTime())}
);
private final Supplier<@Nullable ConfiguredMessageList<?>> message;
private final Supplier<@Nullable ConfiguredMessage<?>> message;
private final Function<@NotNull ScriptRestrictions, Object[]> params;
CheckResult(@NotNull Supplier<@Nullable ConfiguredMessageList<?>> message,
CheckResult(@NotNull Supplier<@Nullable ConfiguredMessage<?>> message,
@NotNull Function<@NotNull ScriptRestrictions, @Nullable Object[]> params) {
this.message = message;
this.params = params;
}
public Supplier<ConfiguredMessageList<?>> getMessage() {
public Supplier<ConfiguredMessage<?>> getMessage() {
return message;
}
public void send(Player player, ScriptRestrictions restrictions) {
Object[] params = this.params.apply(restrictions);
if (params == null) {
getMessage().get().send(player);
getMessage().get().sendTo(player);
} else {
getMessage().get().send(player, params);
getMessage().get().sendTo(player, params);
}
}
@@ -45,7 +45,7 @@ public class ItemListener implements Listener {
Player player = event.getPlayer();
if (cooldown.isCoolingDown(player)) {
PluginMessages.COOLDOWN.send(player, cooldown.getCooldownSeconds(player));
PluginMessages.COOLDOWN.sendTo(player, cooldown.getCooldownSeconds(player));
return;
}
cooldown.updateTime(player);
@@ -1,6 +1,6 @@
package cc.carm.plugin.scriptitems.listener;
import cc.carm.lib.easyplugin.listener.EasyListener;
import cc.carm.lib.easylistener.EasyListener;
import cc.carm.plugin.scriptitems.ScriptItemsAPI;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Item;
@@ -36,7 +36,7 @@ public class ProtectListener extends EasyListener {
// 阻止物品被烧掉
handleEvent(EntityDamageEvent.class)
.filter(e -> e.getEntity().getType() == EntityType.DROPPED_ITEM)
.filter(e -> e.getEntity() instanceof Item)
.filter(e -> isScriptItem(((Item) e.getEntity()).getItemStack()))
.cancel();
+3 -2
View File
@@ -12,11 +12,12 @@ softdepend:
- PlaceholderAPI
api-version: 1.13
folia-supported: true
commands:
"ScriptItems":
"scriptitems":
aliases:
- sitems
usage: "/ScriptItems help"
usage: "/scriptitems help"
description: "ScriptItems 的主指令。"
permission: "ScriptItems.admin"