import: org.bukkit.entity.Player as pclass ...

Creato il: 15 aprile 2026

Risposto usando GPT-5.4 Thinking da Chat01

Domanda

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

Pensiero

undefined

Pensiero

undefined

Pensiero

undefined

Pensiero

undefined

Pensiero

undefined

Pensiero

Considering proxy functionality and arguments

I need to figure out if imports support nested classes—though that doesn’t seem to be an issue here. I’m considering using a proxy Consumer, likely from java.util.function.Consumer, and passing the handler to DiscordSrvBridge.registerAccountLinked(consumer). It seems the section names may correspond to method variables, with one param mapping to [1].

Clarifying section definitions and naming conventions

I think the section command syntax section (<definitions>) (as:<name>) works by defining names for arguments within the section. For example, in section sender:, the first argument is named sender. If I use section event:, the first argument would be named event and others would be numbered.

Thought for 3m 8s

Risposta

Да, но есть один важный момент: в чистом 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:

java
package 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-скрипт в похожем стиле:

yaml
import: 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-классом.
  • 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.

Condividi questa Q&A