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

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

Discussion in 'Разработка плагинов для новичков' started by AlexMor, Mar 7, 2017.

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

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

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

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

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

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

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

    Trophy Points:
    173
    Имя в Minecraft:
    Qmaks
    Code:
    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 Администратор

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

    Dereku Старожил

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Trophy Points:
    66
  18. molor

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

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

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

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

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

    Trophy Points:
    76
    Чего...
    Code:
    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();
           }
       }));
       ...
    }
    
    Code:
    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);
        ...
    }
    
     
    Last edited: Mar 9, 2017
  21. ShadowCode

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

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

Share This Page