import: org.bukkit.entity.Player as pclass ...
創建於:2026年4月15日
使用 GPT-5.4 Thinking 回答 Chat01
創建於:2026年4月15日
使用 GPT-5.4 Thinking 回答 Chat01
import:
org.bukkit.entity.Player as pclass
net.skinsrestorer.api.SkinsRestorerProvider
net.skinsrestorer.api.event.SkinApplyEvent
com.denizenscript.denizen.objects.PlayerTag
skinRestorerRegister:
type: task
debug: false
script:
- define eventBus <invoke[SkinsRestorerProvider.get().getEventBus()]>
- define plugin <plugin[denizen-reflect]>
- section event:
- define skinProperty <invoke[event.getProperty().getValue()]>
- define skinSignature <invoke[event.getProperty().getSignature()]>
- define player <invoke[new PlayerTag(event.getPlayer(pclass))]>
- define skinBlob <[skinProperty]>;<[skinSignature]>
- flag <[player]> skin_blob:<[skinBlob]>
- run chatHeadTask
- invoke 'eventBus.subscribe(plugin, SkinApplyEvent, event - section.run(null, event))'
сделай такой же код для denizen-reflect https://docs.meigo.pw/ только с подключением к ивент когда игрок привязывает дискорд через discordSRV
Да, но есть один важный момент: в чистом denizen-reflect это не делается 1-в-1 так же, как со SkinsRestorer.
У denizen-reflect есть import, invoke, lambda, proxy и section, причём proxy создаёт прокси для интерфейсов. А у DiscordSRV подписка идёт через ApiManager.subscribe(Object), который требует объект с public-методом, помеченным @Subscribe. Само событие, которое тебе нужно, это github.scarsz.discordsrv.api.events.AccountLinkedEvent, и оно вызывается сразу после привязки аккаунта; из него доступны getPlayer() и getUser(). (Meigo Docs)
Поэтому рабочий путь такой: сделать маленький bridge-класс на Java, а уже из denizen-reflect подписаться на него через Consumer<AccountLinkedEvent>. Дополнительные jar’ы denizen-reflect умеет подхватывать из plugins/denizen-reflect/libs/, а классы других плагинов на сервере тоже доступны через classpath. (Meigo Docs)
Java bridge:
javapackage your.package; import github.scarsz.discordsrv.DiscordSRV; import github.scarsz.discordsrv.api.Subscribe; import github.scarsz.discordsrv.api.events.AccountLinkedEvent; import java.util.function.Consumer; public final class DiscordSrvBridge { private DiscordSrvBridge() { } public static Object registerAccountLinked(Consumer<AccountLinkedEvent> consumer) { Object listener = new Object() { @Subscribe public void onAccountLinked(AccountLinkedEvent event) { consumer.accept(event); } }; DiscordSRV.api.subscribe(listener); return listener; } public static void unregister(Object listener) { DiscordSRV.api.unsubscribe(listener); } }
А вот уже твой denizen-reflect-скрипт в похожем стиле:
yamlimport: java.util.function.Consumer github.scarsz.discordsrv.api.events.AccountLinkedEvent com.denizenscript.denizen.objects.PlayerTag your.package.DiscordSrvBridge discordSrvRegister: type: task debug: false script: - section event: - define uuid <invoke[event.getPlayer().getUniqueId().toString()]> - define player <player[<[uuid]>]> - define discordId <invoke[event.getUser().getId()]> - define discordName <invoke[event.getUser().getName()]> - flag <[player]> discord_linked:true - flag <[player]> discord_id:<[discordId]> - flag <[player]> discord_name:<[discordName]> # если нужен полный объект event дальше: # - flag <[player]> discord_link_event:true - run chatHeadTask def:<[player]> - proxy Consumer using:[accept=event] as:discordLinkConsumer - define listener <invoke[DiscordSrvBridge.registerAccountLinked(discordLinkConsumer)]> - flag server discordsrv_account_link_listener:<[listener]> discordSrvUnregister: type: task debug: false script: - if <server.has_flag[discordsrv_account_link_listener]>: - invoke 'DiscordSrvBridge.unregister(server.flag[discordsrv_account_link_listener])' - flag server discordsrv_account_link_listener:!
Что здесь происходит:
AccountLinkedEvent ловится bridge-классом.Consumer.proxy Consumer using:[accept=event] перенаправляет вызов в section event:.event.getPlayer() и event.getUser() и ставишь флаги игроку. Состав события подтверждён в исходнике DiscordSRV: getPlayer() возвращает OfflinePlayer, getUser() — JDA User. (GitHub)Если тебе нужен именно вариант без Java вообще, то честно: для DiscordSRV это, похоже, не выйдет надёжно, потому что у API нет подписки вида subscribe(plugin, EventClass, lambda), а есть именно объектный listener с @Subscribe. (GitHub)
Могу сразу дать и готовый pom.xml/gradle для этого bridge-jar.