Make a note of the stumbling block at the beginning of creating the Bukkit plugin.
When you enter a specific word in the chat field of Minecraft, a trigger will be triggered to set the in-game time. Here, as an example, if you enter "morning", create a plug-in that changes to time 0 (morning).
main.java
//Package statement and import statement omitted
public class main extends JavaPlugin{
@Override
public void onEnable() {
getServer().getPluginManager().registerEvents(new eventListener(this), this);
}
}
eventListener.java
//Package statement and import statement omitted
public class eventListener implements Listener {
private final main m;
public eventListener(main m_){m=m_;}
@EventHandler
public void onPlayerChat(AsyncPlayerChatEvent event){
if(event.getMessage().equals("Morning")){
event.getPlayer().getWorld().setTime(0L);
event.getPlayer().sendMessage("The word "morning" has been detected.");
m.getLogger().info(event.getPlayer().getName()+"Said the word "morning"");
}
}
}
Chats sent by players can be caught with ʻAsyncPlayerChatEventand can be operated freely on the plugin side. Also, [written here](https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/World.html), World is ʻevent.getPlayer (). getWorld () in the event handler. You can get it with).
The trouble is that this will compile.
The compilation was successful, and no error occurred when I actually installed it. However, when I actually type "morning", I get two errors on the server side.
[00:00:00 ERROR]: Could not pass event AsyncPlayerChatEvent to hogehoge_plugin v1.0.0
org.bukkit.event.EventException: null
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:312) ~[craftbukkit-1.15.2.jar:git-Bukkit-8160e29]
at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:70) ~[craftbukkit-1.15.2.jar:git-Bukkit-8160e29]
~ Abbreviation ~
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:461) [craftbukkit-1.15.2.jar:git-Bukkit-8160e29]
at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884) [craftbukkit-1.15.2.jar:git-Bukkit-8160e29]
at java.lang.Thread.run(Thread.java:830) [?:?]
Caused by: java.lang.IllegalStateException: TimeSkipEvent cannot be triggered asynchronously from another thread.
at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:510) ~[craftbukkit-1.15.2.jar:git-Bukkit-8160e29]
at org.bukkit.craftbukkit.v1_15_R1.CraftWorld.setFullTime(CraftWorld.java:803) ~[craftbukkit-1.15.2.jar:git-Bukkit-8160e29]
~ Abbreviation ~
As described in this document, ʻAsyncPlayerChatEvent is basically executed asynchronously. However, ʻevent.getPlayer (). GetWorld (). SetTime (0L); must be executed synchronously.
There are several solutions, but the simplest implementation of anonymous classes avoids the error.
main.java
//You can leave it as it is
eventListener.java
//Package statement and import statement omitted
public class eventListener implements Listener {
private final main m;
public eventListener(main m_){m=m_;}
@EventHandler
public void onPlayerChat(AsyncPlayerChatEvent event){
if(event.getMessage().equals("Morning")){
m.getServer().getScheduler().runTask(m, new Runnable() {
@Override
public void run() {event.getPlayer().getWorld().setTime(0L);}
});
event.getPlayer().sendMessage("The word "morning" has been detected.");
m.getLogger().info(event.getPlayer().getName()+"Said the word "morning"");
}
}
}
I am using the scheduler of ʻorg.bukkit.scheduler to call synchronous processing from the asynchronous ʻAsyncPlayerChatEvent. runTask executes the registered class on the next tick (server tick). If you want to wait a bit, use runTaskLater instead.
that's all.