尝试使用 GeyserMC API 时,Java lambda 出现错误。 Minecraft Bukkit

huangapple go评论101阅读模式
英文:

Java lambda error when trying to use GeyserMC API. Minecraft Bukkit

问题

I'm getting an error when trying to detect the click of a form button using GeyserMC's API. This is what it says:
在尝试使用GeyserMC的API检测表单按钮点击时,我遇到了一个错误。错误信息如下:
Inconvertible types; cannot cast '' to 'org.geysermc.cumulus.response.SimpleFormResponse'
不可转换的类型;无法将''转换为'org.geysermc.cumulus.response.SimpleFormResponse'

This is what i did/tried which is giving that error:
这是我尝试过的操作/方法,导致了这个错误:

  1. package org.centoricraft.centoriui23;
  2. import org.bukkit.Bukkit;
  3. import org.bukkit.entity.Player;
  4. import org.bukkit.event.EventHandler;
  5. import org.bukkit.event.Listener;
  6. import org.bukkit.event.player.PlayerJoinEvent;
  7. import org.bukkit.plugin.java.JavaPlugin;
  8. import org.geysermc.cumulus.SimpleForm;
  9. import org.geysermc.floodgate.api.FloodgateApi;
  10. import org.geysermc.floodgate.api.player.FloodgatePlayer;
  11. import org.geysermc.cumulus.response.CustomFormResponse;
  12. import org.geysermc.cumulus.response.SimpleFormResponse;
  13. public class CentoriUI23 extends JavaPlugin implements Listener {
  14. private FloodgateApi floodgateApi;
  15. @Override
  16. public void onEnable() {
  17. if (getServer().getPluginManager().getPlugin("Floodgate") != null) {
  18. floodgateApi = FloodgateApi.getInstance();
  19. getServer().getPluginManager().registerEvents(this, this);
  20. } else {
  21. getLogger().warning("Floodgate plugin not found! Disabling plugin...");
  22. getServer().getPluginManager().disablePlugin(this);
  23. }
  24. }
  25. @EventHandler
  26. public void onPlayerJoin(PlayerJoinEvent event) {
  27. Player player = event.getPlayer();
  28. if (floodgateApi.isFloodgatePlayer(player.getUniqueId())) {
  29. Bukkit.getScheduler().runTaskLater(this, () -> {
  30. FloodgatePlayer floodgatePlayer = floodgateApi.getPlayer(player.getUniqueId());
  31. if (floodgatePlayer != null) {
  32. SimpleForm form = SimpleForm.builder()
  33. .title("Centori UI")
  34. .button("Play")
  35. .button("Discord")
  36. .build();
  37. form.setResponseHandler((formPlayer, responseData) -> {
  38. if (responseData instanceof SimpleFormResponse) {
  39. SimpleFormResponse response = (SimpleFormResponse) responseData;
  40. int buttonId = response.getClickedButtonId();
  41. if (buttonId == 0) {
  42. // Handle "Play" button click
  43. } else if (buttonId == 1) {
  44. // Handle "Discord" button click
  45. }
  46. } else if (responseData instanceof CustomFormResponse) {
  47. CustomFormResponse response = (CustomFormResponse) responseData;
  48. // Handle custom form response
  49. }
  50. });
  51. floodgatePlayer.sendForm(form);
  52. }
  53. }, 20L); // Delay for 1 second (20 ticks)
  54. }
  55. }
  56. }
  1. <details>
  2. <summary>英文:</summary>
  3. Im getting an error when trying to detect the click of a form button using GeyserMC&#39;s API. This is what it says:
  4. Inconvertible types; cannot cast &#39;&lt;lambda parameter&gt;&#39; to &#39;org.geysermc.cumulus.response.SimpleFormResponse&#39;
  5. This is what i did/tried which is giving that error:

package org.centoricraft.centoriui23;

import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.java.JavaPlugin;
import org.geysermc.cumulus.SimpleForm;
import org.geysermc.floodgate.api.FloodgateApi;
import org.geysermc.floodgate.api.player.FloodgatePlayer;
import org.geysermc.cumulus.response.CustomFormResponse;
import org.geysermc.cumulus.response.SimpleFormResponse;

public class CentoriUI23 extends JavaPlugin implements Listener {

  1. private FloodgateApi floodgateApi;
  2. @Override
  3. public void onEnable() {
  4. if (getServer().getPluginManager().getPlugin(&quot;Floodgate&quot;) != null) {
  5. floodgateApi = FloodgateApi.getInstance();
  6. getServer().getPluginManager().registerEvents(this, this);
  7. } else {
  8. getLogger().warning(&quot;Floodgate plugin not found! Disabling plugin...&quot;);
  9. getServer().getPluginManager().disablePlugin(this);
  10. }
  11. }
  12. @EventHandler
  13. public void onPlayerJoin(PlayerJoinEvent event) {
  14. Player player = event.getPlayer();
  15. if (floodgateApi.isFloodgatePlayer(player.getUniqueId())) {
  16. Bukkit.getScheduler().runTaskLater(this, () -&gt; {
  17. FloodgatePlayer floodgatePlayer = floodgateApi.getPlayer(player.getUniqueId());
  18. if (floodgatePlayer != null) {
  19. SimpleForm form = SimpleForm.builder()
  20. .title(&quot;Centori UI&quot;)
  21. .button(&quot;Play&quot;)
  22. .button(&quot;Discord&quot;)
  23. .build();
  24. form.setResponseHandler((formPlayer, responseData) -&gt; {
  25. if (responseData instanceof SimpleFormResponse) {
  26. SimpleFormResponse response = (SimpleFormResponse) responseData;
  27. int buttonId = response.getClickedButtonId();
  28. if (buttonId == 0) {
  29. // Handle &quot;Play&quot; button click
  30. } else if (buttonId == 1) {
  31. // Handle &quot;Discord&quot; button click
  32. }
  33. } else if (responseData instanceof CustomFormResponse) {
  34. CustomFormResponse response = (CustomFormResponse) responseData;
  35. // Handle custom form response
  36. }
  37. });
  38. floodgatePlayer.sendForm(form);
  39. }
  40. }, 20L); // Delay for 1 second (20 ticks)
  41. }
  42. }

}

  1. </details>
  2. # 答案1
  3. **得分**: 0
  4. 我认为这一行`SimpleFormResponse response = (SimpleFormResponse) responseData;`可能是导致问题的原因。
  5. 在查看文档后,您设置`ResponseHandler`的方式已被弃用:https://github.com/GeyserMC/Cumulus/wiki/Updating-from-1.0-to-1.1-(and-2.0)#response-handling-changes
  6. 弃用的方式可能仍然被实现,但您使用的Lambda函数只返回一个字符串(可能是`responseData`),而不是两个(`formPlayer, responseData`):https://github.com/GeyserMC/Cumulus/blob/master/src/main/java/org/geysermc/cumulus/Form.java
  7. <details>
  8. <summary>英文:</summary>
  9. I don&#39;t know which Version you are using, so I am guessing the newest.
  10. I think the line `SimpleFormResponse response = (SimpleFormResponse) responseData;` is causing the problem.
  11. After looking into the documentation, the way you are setting the `ResponseHandler` is deprecated: https://github.com/GeyserMC/Cumulus/wiki/Updating-from-1.0-to-1.1-(and-2.0)#response-handling-changes
  12. The deprecated way may still be implemented, but the lambda function you are using is only returning one String (probably `responseData`) and not two (`formPlayer, responseData`): https://github.com/GeyserMC/Cumulus/blob/master/src/main/java/org/geysermc/cumulus/Form.java
  13. </details>

huangapple
  • 本文由 发表于 2023年5月7日 22:23:52
  • 转载请务必保留本文链接:https://go.coder-hub.com/76194511.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定