如题,举个例子,比如我想在玩家重命名物品时给出一个按钮,玩家点击以后会在聊天栏提示,“请在n秒内按‘t’在聊天栏内输入xxx以命名”
橙色字体可以不管,重点是划线的句子里的东西怎么实现,如果可以的话求具体代码,万分感谢
橙色字体可以不管,重点是划线的句子里的东西怎么实现,如果可以的话求具体代码,万分感谢

Timer,...
点击后
存一个HashMap
用一个Bukkit计时器
每秒循环 也就是20tick 每次循环 遍历HashMap 减1
当-1 = 0的时候 将这个内容 从 HashMap中删除
因为遍历 用来到搜索的是玩家变量
直接发送消息"时间已到"
关于输入
玩家聊天事件
将此玩家 在HashMap里搜索
如果为null
则 不管
不是null 的话
就 发送消息 "输入成功!”
输入的内容 = e.getMessage();
取消事件
具体代码 懒得打了
存一个HashMap
用一个Bukkit计时器
每秒循环 也就是20tick 每次循环 遍历HashMap 减1
当-1 = 0的时候 将这个内容 从 HashMap中删除
因为遍历 用来到搜索的是玩家变量
直接发送消息"时间已到"
关于输入
玩家聊天事件
将此玩家 在HashMap里搜索
如果为null
则 不管
不是null 的话
就 发送消息 "输入成功!”
输入的内容 = e.getMessage();
取消事件
具体代码 懒得打了
Conversation
July.七月 发表于 2018-6-27 18:16
点击后
存一个HashMap
用一个Bukkit计时器
貌似看懂了一点,能不能给下计时器的代码= =
那有没有什么自定义事件的教程,我想通过自定义事件去触发它
玩家点击那个按钮后,你把玩家名作为key,当前时间作为value存进map
当监控到玩家聊天或输入输入xxx 来命名时
使用key读取value(上次的时间)
如果当前时间减去上次的时间在一定范围内,则输入有效。反之无效。
当监控到玩家聊天或输入输入xxx 来命名时
使用key读取value(上次的时间)
如果当前时间减去上次的时间在一定范围内,则输入有效。反之无效。
计时器 了解一下 或者存属时间读取进行比较
int timer=20;//1秒
HashSet<String> inTime=new HashSet<>();
public void timer(Player p) {
inTime.add(p.getName());
p.sendMessage("§m请在"+timer/20+"秒内按‘T’在聊天栏内输入xxx以命名");
Bukkit.getScheduler().runTaskLaterAsynchronously(this, new Runnable() {
@Override
public void run() {
inTime.remove(p.getName());
}
}, timer);
}
@EventHandler(priority = EventPriority.HIGHEST)
public void Event(AsyncPlayerChatEvent event) {
String name;
if (inTime.contains(name=event.getPlayer().getName())) {
inTime.remove(name);
String message=event.getMessage();
//这个message即为在指定时间内玩家输入的信息
}
}
//直接把这些代码放入到你的事件类中
//我想你因该知道怎么注册事件监听器和批量导入包吧?
HashSet<String> inTime=new HashSet<>();
public void timer(Player p) {
inTime.add(p.getName());
p.sendMessage("§m请在"+timer/20+"秒内按‘T’在聊天栏内输入xxx以命名");
Bukkit.getScheduler().runTaskLaterAsynchronously(this, new Runnable() {
@Override
public void run() {
inTime.remove(p.getName());
}
}, timer);
}
@EventHandler(priority = EventPriority.HIGHEST)
public void Event(AsyncPlayerChatEvent event) {
String name;
if (inTime.contains(name=event.getPlayer().getName())) {
inTime.remove(name);
String message=event.getMessage();
//这个message即为在指定时间内玩家输入的信息
}
}
//直接把这些代码放入到你的事件类中
//我想你因该知道怎么注册事件监听器和批量导入包吧?
没必要用计时器,只需要在开始计时的时候保存时间段到Map,玩家发送聊天时再对比一下当前时间就行了。