Помогите Создание клана с помощью чата

  • Автор темы Автор темы Schapico
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

Schapico

Участник
Пользователь
Баллы
31
Имя в Minecraft
FreeSmile
Как примерно можно реализовать,2019-06-04_00.29.30.png 2019-06-04_00.29.36.png создание клана сообщением в чат?
 
Шедулер с циклом, который показывает игроку тайтл.
Два ивента - на левый клик а на слово в чат, оба отменяют шедулер, второе еще подтягивает метод создания клана

Если все это обернуть нормально, получится примерно так
Код:
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitTask;

public class TitleInput {

    private static Map<Player, TitleInput> titles = new HashMap<>();
 
    public static TitleInput getTitleInput(Player player) {
        return titles.get(player);
    }
 
    public static TitleInput createTitleInput(JavaPlugin plugin, Player player, String firstLine, String secondLine) {
        TitleInput result = getTitleInput(player);
        if ((result==null)||(result.getTask().isCancelled())) {
            result = new TitleInput(plugin, firstLine, secondLine, player);
        }else {
            result.setFirstLine(firstLine);
            result.setSecondLine(secondLine);
        }
        return result;
    }
 
    protected String firstLine,secondLine;
    protected Player owner;
    protected BukkitTask task;
 
    protected TitleInput(JavaPlugin plugin, String firstLine, String secondLine, Player player) {
        Validate.notNull(plugin, "Plugin can not be null");
        Validate.notNull(player, "Player can not be null");
        Validate.notNull(firstLine, "Text can not be null");
        Validate.notNull(secondLine, "Text can not be null");
        setFirstLine(firstLine);
        setSecondLine(secondLine);
        this.owner = player;
        titles.put(player, this);
        this.task = Bukkit.getScheduler().runTaskTimer(plugin, () -> {
            if ((getOwner()==null)||(!getOwner().isOnline())) {
                getTask().cancel();
                return;
            }
            getOwner().sendTitle(getFirstLine(), getSecondLine(), 0, 20, 10);
         
        }, 0L, 20L);
    }
 
    public Player getOwner() {
        return owner;
    }
 
    public String getFirstLine() {
        return firstLine;
    }
 
    public void setFirstLine(String firstLine) {
        this.firstLine = ChatColor.translateAlternateColorCodes('&', firstLine);
    }
 
    public String getSecondLine() {
        return secondLine;
    }
 
    public void setSecondLine(String secondLine) {
        this.secondLine = ChatColor.translateAlternateColorCodes('&', secondLine);
    }
 
    public BukkitTask getTask() {
        return task;
    }
}
Не забудь зарегистрировать листенер в onEnable()
Код:
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerInteractEvent;

public class TitleEventListener implements Listener{

    @EventHandler
    public void onInteract(PlayerInteractEvent e) {
        if (e.getAction()!=Action.LEFT_CLICK_AIR&&e.getAction()!=Action.LEFT_CLICK_BLOCK) {
            return;
        }
        TitleInput title = TitleInput.getTitleInput(e.getPlayer());
        if (title==null) return;
        if (title.getTask().isCancelled()) return;
        title.getTask().cancel();
        e.setCancelled(true);
    }
  
    @EventHandler
    public void onChat(AsyncPlayerChatEvent e) {
        TitleInput title = TitleInput.getTitleInput(e.getPlayer());
        if (title==null) return;
        if (title.getTask().isCancelled()) return;
        title.getTask().cancel();
        e.setCancelled(true);
        String input = e.getMessage();
        //TODO что-то делаем с инпутом
    }

}
Дальше в нужном месте (при вводе команды)
Код:
TitleInput.createTitleInput(Твой плагин, player, "&eВведите имя", "&8ЛКМ для &cотмены");
 
Последнее редактирование:
Шедулер с циклом, который показывает игроку тайтл.
Два ивента - на левый клик а на слово в чат, оба отменяют шедулер, второе еще подтягивает метод создания клана

Если все это обернуть нормально, получится примерно так
Код:
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitTask;

public class TitleInput {

    private static Map<Player, TitleInput> titles = new HashMap<>();
 
    public static TitleInput getTitleInput(Player player) {
        return titles.get(player);
    }
 
    public static TitleInput createTitleInput(JavaPlugin plugin, Player player, String firstLine, String secondLine) {
        TitleInput result = getTitleInput(player);
        if ((result==null)||(result.getTask().isCancelled())) {
            result = new TitleInput(plugin, firstLine, secondLine, player);
        }else {
            result.setFirstLine(firstLine);
            result.setSecondLine(secondLine);
        }
        return result;
    }
 
    protected String firstLine,secondLine;
    protected Player owner;
    protected BukkitTask task;
 
    protected TitleInput(JavaPlugin plugin, String firstLine, String secondLine, Player player) {
        Validate.notNull(plugin, "Plugin can not be null");
        Validate.notNull(player, "Player can not be null");
        Validate.notNull(firstLine, "Text can not be null");
        Validate.notNull(secondLine, "Text can not be null");
        setFirstLine(firstLine);
        setSecondLine(secondLine);
        this.owner = player;
        titles.put(player, this);
        this.task = Bukkit.getScheduler().runTaskTimer(plugin, () -> {
            if ((getOwner()==null)||(!getOwner().isOnline())) {
                getTask().cancel();
                return;
            }
            getOwner().sendTitle(getFirstLine(), getSecondLine(), 0, 20, 10);
        
        }, 0L, 20L);
    }
 
    public Player getOwner() {
        return owner;
    }
 
    public String getFirstLine() {
        return firstLine;
    }
 
    public void setFirstLine(String firstLine) {
        this.firstLine = ChatColor.translateAlternateColorCodes('&', firstLine);
    }
 
    public String getSecondLine() {
        return secondLine;
    }
 
    public void setSecondLine(String secondLine) {
        this.secondLine = ChatColor.translateAlternateColorCodes('&', secondLine);
    }
 
    public BukkitTask getTask() {
        return task;
    }
}
Не забудь зарегистрировать листенер в onEnable()
Код:
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerInteractEvent;

public class TitleEventListener implements Listener{

    @EventHandler
    public void onInteract(PlayerInteractEvent e) {
        if (e.getAction()!=Action.LEFT_CLICK_AIR&&e.getAction()!=Action.LEFT_CLICK_BLOCK) {
            return;
        }
        TitleInput title = TitleInput.getTitleInput(e.getPlayer());
        if (title==null) return;
        if (title.getTask().isCancelled()) return;
        title.getTask().cancel();
        e.setCancelled(true);
    }
 
    @EventHandler
    public void onChat(AsyncPlayerChatEvent e) {
        TitleInput title = TitleInput.getTitleInput(e.getPlayer());
        if (title==null) return;
        if (title.getTask().isCancelled()) return;
        title.getTask().cancel();
        e.setCancelled(true);
        String input = e.getMessage();
        //TODO что-то делаем с инпутом
    }

}
Дальше в нужном месте (при вводе команды)
Код:
TitleInput.createTitleInput(Твой плагин, player, "&eВведите имя", "&8ЛКМ для &cотмены");
Глупости какие, зачем отправлять постоянно тайтл, если можно время указать оч большое, а когда нужно убрать тайтл?
 
Глупости какие, зачем отправлять постоянно тайтл, если можно время указать оч большое, а когда нужно убрать тайтл?
затем что надо разные строки слать челу судя по скринам, а выше как и попросили "примерная реализцая", листы уже сам впихнет
 
затем что надо разные строки слать челу судя по скринам, а выше как и попросили "примерная реализцая", листы уже сам впихнет
Дак в чем проблема, если отправить новый тайтл с такой же длительностью, старый он удалит.
 
затем что надо разные строки слать челу судя по скринам, а выше как и попросили "примерная реализцая", листы уже сам впихнет
Ну так нужно будет поменять тайтл, отправит новый с таким же длительным временем, зачем тут Observer, который обновляет каждую секунду?
 
Дак в чем проблема, если отправить новый тайтл с такой же длительностью, старый он удалит.
строки туда сюда меняются.
чел кинул скрины с Ultraperms и хочет систему такую же как там, там каждую секунду меняется строка.
 
Чат ивент прослушивай и все. Но это убого, лучше комнд ексекутор таки юзать.
 
затем что надо разные строки слать челу судя по скринам, а выше как и попросили "примерная реализцая", листы уже сам впихнет
я нашел ошибку но незнаю как ее исправить, LiteClans cannot be resolved to a variable
 
Извини за глупый вопрос но как и где вы учитесь Java языку? Сколько пытаюсь найти источники все безуспешно
ROFL, у человека, который не знает java, спрашиваешь, как выучить java.
 
ну как я его типо знаю, но скажем так на уровне картошки с луком.
Ну почитай руководство для начинающих, погугли непонятные моменты, изучай шаблоны проектирования и как их правильно применять, побольше практики естественно, за год можно +- за****о выучить.
 
Ну почитай руководство для начинающих, погугли непонятные моменты, изучай шаблоны проектирования и как их правильно применять, побольше практики естественно, за год можно +- за****о выучить.
Кароче параша странная, сделал все как надо но ничего не работает

org.bukkit.command.CommandException: Unhandled exception executing command 'cl' in plugin LiteClans v0.1
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:46) ~[spigot-1.14.jar:git-Spigot-da42974-8f47214]
at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141) ~[spigot-1.14.jar:git-Spigot-da42974-8f47214]
at org.bukkit.craftbukkit.v1_12_R1.CraftServer.dispatchCommand(CraftServer.java:651) ~[spigot-1.14.jar:git-Spigot-da42974-8f47214]
at net.minecraft.server.v1_12_R1.PlayerConnection.handleCommand(PlayerConnection.java:1386) [spigot-1.14.jar:git-Spigot-da42974-8f47214]
at net.minecraft.server.v1_12_R1.PlayerConnection.a(PlayerConnection.java:1221) [spigot-1.14.jar:git-Spigot-da42974-8f47214]
at net.minecraft.server.v1_12_R1.PacketPlayInChat.a(PacketPlayInChat.java:45) [spigot-1.14.jar:git-Spigot-da42974-8f47214]
at net.minecraft.server.v1_12_R1.PacketPlayInChat.a(PacketPlayInChat.java:1) [spigot-1.14.jar:git-Spigot-da42974-8f47214]
at net.minecraft.server.v1_12_R1.PlayerConnectionUtils$1.run(SourceFile:13) [spigot-1.14.jar:git-Spigot-da42974-8f47214]
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_211]
at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_211]
at net.minecraft.server.v1_12_R1.SystemUtils.a(SourceFile:46) [spigot-1.14.jar:git-Spigot-da42974-8f47214]
at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:748) [spigot-1.14.jar:git-Spigot-da42974-8f47214]
at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:406) [spigot-1.14.jar:git-Spigot-da42974-8f47214]
at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679) [spigot-1.14.jar:git-Spigot-da42974-8f47214]
at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577) [spigot-1.14.jar:git-Spigot-da42974-8f47214]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_211]
Caused by: java.lang.IllegalArgumentException: Plugin can not be null
at org.apache.commons.lang.Validate.notNull(Validate.java:192) ~[spigot-1.14.jar:git-Spigot-da42974-8f47214]
at ru.PleasurE.LiteClans.utils.TitleInput.<init>(TitleInput.java:37) ~[?:?]
at ru.PleasurE.LiteClans.utils.TitleInput.createTitleInput(TitleInput.java:24) ~[?:?]
at ru.PleasurE.LiteClans.events.CmdClan.onCommand(CmdClan.java:16) ~[?:?]
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) ~[spigot-1.14.jar:git-Spigot-da42974-8f47214]
... 15 more

(Версия 1.12.1 не 1.14)
 
Кароче параша странная, сделал все как надо но ничего не работает

org.bukkit.command.CommandException: Unhandled exception executing command 'cl' in plugin LiteClans v0.1
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:46) ~[spigot-1.14.jar:git-Spigot-da42974-8f47214]
at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141) ~[spigot-1.14.jar:git-Spigot-da42974-8f47214]
at org.bukkit.craftbukkit.v1_12_R1.CraftServer.dispatchCommand(CraftServer.java:651) ~[spigot-1.14.jar:git-Spigot-da42974-8f47214]
at net.minecraft.server.v1_12_R1.PlayerConnection.handleCommand(PlayerConnection.java:1386) [spigot-1.14.jar:git-Spigot-da42974-8f47214]
at net.minecraft.server.v1_12_R1.PlayerConnection.a(PlayerConnection.java:1221) [spigot-1.14.jar:git-Spigot-da42974-8f47214]
at net.minecraft.server.v1_12_R1.PacketPlayInChat.a(PacketPlayInChat.java:45) [spigot-1.14.jar:git-Spigot-da42974-8f47214]
at net.minecraft.server.v1_12_R1.PacketPlayInChat.a(PacketPlayInChat.java:1) [spigot-1.14.jar:git-Spigot-da42974-8f47214]
at net.minecraft.server.v1_12_R1.PlayerConnectionUtils$1.run(SourceFile:13) [spigot-1.14.jar:git-Spigot-da42974-8f47214]
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_211]
at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_211]
at net.minecraft.server.v1_12_R1.SystemUtils.a(SourceFile:46) [spigot-1.14.jar:git-Spigot-da42974-8f47214]
at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:748) [spigot-1.14.jar:git-Spigot-da42974-8f47214]
at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:406) [spigot-1.14.jar:git-Spigot-da42974-8f47214]
at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679) [spigot-1.14.jar:git-Spigot-da42974-8f47214]
at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577) [spigot-1.14.jar:git-Spigot-da42974-8f47214]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_211]
Caused by: java.lang.IllegalArgumentException: Plugin can not be null
at org.apache.commons.lang.Validate.notNull(Validate.java:192) ~[spigot-1.14.jar:git-Spigot-da42974-8f47214]
at ru.PleasurE.LiteClans.utils.TitleInput.<init>(TitleInput.java:37) ~[?:?]
at ru.PleasurE.LiteClans.utils.TitleInput.createTitleInput(TitleInput.java:24) ~[?:?]
at ru.PleasurE.LiteClans.events.CmdClan.onCommand(CmdClan.java:16) ~[?:?]
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) ~[spigot-1.14.jar:git-Spigot-da42974-8f47214]
... 15 more

(Версия 1.12.1 не 1.14)
ну ты глупыш, plugin null, там даже нулл чеки есть, а ты даже это не мож обработать, куда в баккит полез.
 
Это то я исправил, я случайно удалил там название оповещения
Зач ты его говнокод скопировал лол, просто сетай тайтл какой когда надо и лови AsyncPlayerChatEvent, все.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх