Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Помогите Потоки

Тема в разделе "Разработка плагинов для новичков", создана пользователем AlexMor, 7 мар 2017.

  1. Автор темы
    AlexMor

    AlexMor Активный участник Пользователь

    Баллы:
    66
    Здравствуйте, как можно создавать новый поток (в потоке: цикл повторяющийся каждую минуту, и проверку, если игрок онлайн то вызывать другой метод) для каждого зашедшего игрока, причем по 1 потоку на игрока.

    Цель: каждую минуту забирать у игрока определенное кол-во денег если он онлайн.
     
  2. Хостинг MineCraft
    <
  3. Автор темы
    AlexMor

    AlexMor Активный участник Пользователь

    Баллы:
    66
    Как то вроде через HashMap можно... Но как
     
  4. Qmaks

    Qmaks Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    Qmaks
    Код:
    private HashMap<Player, Thread> players = new HashMap<Player, Thread>();
    
    @EventHandler
    public void onJoin(PlayerJoinEvent e) {
       Thread t = new Thread() {
          public void run() {
             while(true) {
                minusMoney(e.getPlayer());
                Thread.sleep(5000);
             }
          }
       };
       players.put(e.getPlayer(), t);
       t.start();
    }
    
    @EventHandler
    public void onLeave(PlayerLeaveEvent e) {
       players.get(e.getPlayer()).stop();
       players.remove(e.getPlayer());
    }
    
    Как-то так, писал с планша, поэтому могут быть ошибки где-то.
     
  5. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Сяпки. поржал. :D
     
  6. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Зато работает. Правда, при выходе каждые 5 секунд будет (возможно) в лог какать, но это ничего страшного.
     
  7. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    76
    Для таких вещей потоки не нужны. Достаточно использовать шедулер. Это такая штука, которая в одном единственном потоке выполняет все задачи - либо единоразово, либо каждый раз повторяет с определенной задержкой. Тебе нужно добавить как раз такую задачу. Подробнее о шедулерах можно почитать в других темах или в интернете.
    Сяпки, поржал [х2]
    На каждого игрока по потоку... Жирно очень. От десяти заполненных серверов умрёт любой хост.
     
  8. Qmaks

    Qmaks Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    Qmaks
    Он попросил - я сделал. В чем проблема?
    Все, что ты написал - я и так знаю, но это его требования.[DOUBLEPOST=1488957137,1488956622][/DOUBLEPOST]
    Шулдерами, кстати, я не пользовался. Может стоит апи как-то почитать...
     
  9. OsipXD

    OsipXD Старожил Пользователь

    Баллы:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    А зачем д
    И заодно API ProtocolLib'а :)
     
  10. Qmaks

    Qmaks Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    Qmaks
    Ты меня осуждаешь за это или что?
    Мне хватало знаний базового языка без лишнего апи, будет надо что-то новое - выучу.
     
  11. OsipXD

    OsipXD Старожил Пользователь

    Баллы:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    Я не осуждаю) Каждый в праве пользоваться чем угодно, вопрос лишь в том, что лучше. Вдруг при сравнении работы твоих утилит с ProtocolLib выяснится, что они работают гораздо быстрее
     
  12. AtomicInteger

    AtomicInteger Активный участник Пользователь

    Баллы:
    46
    Если уж и создавать на каждого игрока по потоку, то хотя бы с пулом.
     
  13. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Да ничего там не случится, ты же там не степень вычисляешь.
     
  14. AtomicInteger

    AtomicInteger Активный участник Пользователь

    Баллы:
    46
    Это конечно, так.Но если есть возможность оптимизировать, то почему бы ею не воспользоваться?[DOUBLEPOST=1488970693,1488969343][/DOUBLEPOST]TS, такой вариант устроит?
    Код:
    scheduler.scheduleSyncRepeatingTask(plugin, () -> {
        for (Player player : plugin.getServer().getOnlinePlayers())
            player.decrementMoney(params);
    }, 0L, 1200L);
     
  15. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Ага збс оптимизировал :D. getOnlinePlayers(). Сяпки - поржал. Так держать!
     
  16. AtomicInteger

    AtomicInteger Активный участник Пользователь

    Баллы:
    46
    Да не оптимизировал я там ничего.Я не думаю, что автор пишет для вайма, если захочет уже сам напишет хранилище для игроков, я лишь общий код привёл.
     
  17. Автор темы
    AlexMor

    AlexMor Активный участник Пользователь

    Баллы:
    66
  18. molor

    molor Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    molore
    Сегодня задавался вопросом о скорости работы этого метода, но его код так и не смог найти. Вероятно, Вы знаете, как он работает. Подскажите, насколько он быстр и где его использовать не рекомендуется?
     
  19. Exception_Prototype

    Exception_Prototype Активный участник Пользователь

    Баллы:
    46
    Потому что данный метод проходится по всем игрокам, которые когда то были на сервер и проверят isOnline();
    По этому причине рекомендуется делать свой собственный метод getOnlinePlayer(name); с помощь эвентов Входа и Выхода игроков заносить\удалять игроков в HashSet<Player>.
     
  20. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    76
    Чего...
    Код:
    private final List<CraftPlayer> playerView;
    
    public CraftServer(MinecraftServer console, PlayerList playerList) {
       ...
       this.playerView = Collections.unmodifiableList(Lists.transform(playerList.players, new Function() {
           public CraftPlayer apply(EntityPlayer player) {
               return player.getBukkitEntity();
           }
       }));
       ...
    }
    
    Код:
    public final List<EntityPlayer> players = new CopyOnWriteArrayList();
    
    public void onPlayerJoin(EntityPlayer entityplayer, String joinMessage) {
        this.players.add(entityplayer);
        ...
    }
    
    public String disconnect(EntityPlayer entityplayer) {
        ...
        this.players.remove(entityplayer);
        ...
    }
    
     
    Последнее редактирование: 9 мар 2017
  21. ShadowCode

    ShadowCode Активный участник Пользователь

    Баллы:
    61
    Разве с Bukkit можно взаимодействовать не с основного потока?
     

Поделиться этой страницей