我知道这听起来非常简单和愚蠢,但老实说对Java来说是新的,并且很难弄清楚。
我有一个Reacts类,用于检查反应,还有onGameStart方法,用于启动我制作(或将制作)的“游戏”
@Override
public void onMessageReactionAdd(MessageReactionAddEvent e) {
Game start = new Game();
TextChannel pOneChannel = e.getGuild().getTextChannelsByName("player-1",true).get(0);
TextChannel pTwoChannel = e.getGuild().getTextChannelsByName("player-2",true).get(0);
if(e.getTextChannel().getIdLong() == channelID) {
pOneChannel.sendMessage(playerOne()).queue();
pTwoChannel.sendMessage(playerTwo()).queue();
}
if(e.getTextChannel() == pOneChannel) {
if(e.getTextChannel() != pTwoChannel)
printMessage("Waiting for players...", e);
else
start.onGameStart();
}
else if(e.getTextChannel() == pTwoChannel) {
if(e.getTextChannel() != pOneChannel)
printMessage("Waiting for players...", e);
else
start.onGameStart();
}
}
之前,我有Game类需要MessageReceivedEvent。但这当然意味着我需要将其作为上述类中的参数。当将其添加到上述类中时,我不能再覆盖并且它不起作用。 因此,然后让我的Game类具有一个方法,该方法与MessageReceivedEvent一起运行,该方法刚刚传入空值。但是,当然这行不通,我需要真正的价值。有人知道如何做到这一点吗?
我还有另一个错误是,我想在播放器1和播放器两个通道中检查表情响应。当两者都存在响应时,开始游戏。我试图在上面写,但是每次都运行Waiting....。感谢您的任何帮助,谢谢。
答案 0 :(得分:1)
您不能使用一种方法处理多个事件类型。就这么简单。事件结构在每个单独的事件上调用通用方法(EventListener#onEvent(GenericEvent e)
)。其中包括一切,例如接收消息或新的反应。
但是,我认为您的监听器扩展了ListenerAdapter
类。此类实现一些逻辑,该逻辑将所有事件拆分为单独的方法。这些方法是您要重写的方法。这些仅提供给单一事件(尽管有一些事件的超类型)。如果您希望在两种不同的事件类型上发生某些事情,则基本上有两种选择:
GenericEvent
自己解析所有内容(我不建议这样做,但是可以)@Override
public void onMessageReceivedEvent(MessageReceivedEvent event) {
utilMethod(/*add Args here*/);
}
@Override
public void onMessageReceivedEvent(MessageReceivedEvent event) {
utilMethod(/*add Args here*/);
}
private void utilMethod(/*add Args here*/) {
// do stuff
}
但是,仍然分别为每个事件调用这些方法。假设您和朋友在同一时间(理论上)同时发送两条消息。 JDA仍然会两次触发该方法,并分别为每个消息提供信息。如果您想进行检查(因为我假设您想做类似的事情),则必须保存游戏状态并根据收到的消息进行更新。
例如您可以有一个像这样的职业球员:
public class Player {
long id; // Represents the Discord ID
boolean ready = false; // Update this on a message
// ... some other stuff
}
,然后在收到事件时更新Player#ready
字段,然后检查所有玩家是否准备就绪。
希望这可以帮助您更好地了解JDA的事件架构:D