Требуется помощь в реализации.

Discussion in 'Разработка плагинов' started by BlackJIeB, 9/1/16.

  1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.
Dismiss Notice
We welcome you on our site. This site is devoted to the Nukkit project and all that is connected with him. Here you can communicate, download plugins, also many other things get acquainted! Register the account right now :3
  1. BlackJIeB

    BlackJIeB Developer

    Messages:
    16
    Likes Received:
    3
    Minecraft:
    BlackJIeB
    Раньше кодил на php, встала такая проблема, у меня есть такая конструкция:


    public class main extends PluginBase implements Listener {
    public boolean auths = false;


    Далее я использую this.auths = false; для того, чтобы определять, авторизовался игрок, или нет.
    Но проблема в том, что this.auths действует на всех, а не на определенного игрока.

    Если в php я мог сделать так:



    class auth extends PluginBase implements Listener {
    public $authSession;


    И потом присваивал для отдельного игрока так: $this->authSession[$username] = true;

    Таким образом вызывая ссылку с массивом, в котором установлен ник определенного игрока.

    Тут я такое реализовать не могу. Кто поможет?
     
    Varfalomey likes this.
  2. fromgate

    fromgate Administrator

    Messages:
    668
    Likes Received:
    187
    Тут несколько вариантов.
    Самый простой.
    Создаешь коллекцию Set:
    Code:
    
    Set<String> players = new HashSet<String>();
    
    
    Когда нужно (по каким-то причинам - допустим игрок авторизовался) добавить туда игрока, то делаешь так:

    Code:
    players.add(playerName); // playerName - переменная типа String.
    
    //Если у тебя объект типа Player, то тогда так:
    
    players.add(plyaer.getName());
    
    Когда надо проверить если ли игрок в этой коллекции, то делаем так:

    Code:
    public boolean isPlayerInSet(String playerName){
    return players.contains(playerName);
    }
    
    Ну а когда надо удалить игрока из этого списка:

    Code:
    public void removePlayerFromSet(String playerName){
    if (players.contains(playerName)) players.remove(playerName);
    }
    
    Другой способ интереснее, но может показаться сложнее - запись мета-данных в сам объект пользователя.

    Я его использовал в плагине Welcome:

    Вот пример с гитхаба:

    Code:
    public static boolean isPlayerLoggedIn(Player player){
    return player.hasMetadata("welcome-in-game");
    }
    public static void setPlayerLoggedIn (Player player){
    player.setMetadata("welcome-in-game", new LoginMeta());
    }
    
    Но тут есть определенные сложности. К примеру, в bukkit'е уже существовали стандартные типы Meta-классов. Мне же пришлось тут сочинять свой собственный. С другой стороный - это предоставляет большую свободу действий.

    Code:
    package ru.nukkit.welcome.util;
    
    import cn.nukkit.metadata.MetadataValue;
    import ru.nukkit.welcome.Welcome;
    
    public class LoginMeta extends MetadataValue {
    public LoginMeta() {
    super(Welcome.getPlugin());
    }
    
    [pre][code]@Override
    public Object value() {
        return true;
    }
    
    @Override
    public void invalidate() {
    }
    [/pre]
    }
    [/code]
     
  3. JustMaks19

    JustMaks19 Developer (Level 2)

    Messages:
    18
    Likes Received:
    2
    Minecraft:
    JustMaks19
    в таких ситуациях я использую HashMap..
     
  4. BlackJIeB

    BlackJIeB Developer

    Messages:
    16
    Likes Received:
    3
    Minecraft:
    BlackJIeB
    Первый метод помог, спасибо :)
     
  5. fromgate

    fromgate Administrator

    Messages:
    668
    Likes Received:
    187
    Ну тут речь шла о хранении значений true/false. Поэтому Set удобнее: есть имя игрока в списке — значит true. Нет имени - значит false.

    А вот если нужно сохранить что-то другое (например координаты, текст и вообще всё что угодно), то тогда - HashMap.
     
  6. xpyctum

    xpyctum Pioneer

    Messages:
    16
    Likes Received:
    1
    Minecraft:
    xpyctum
    А я LinkedHashMap
     
  7. BlackJIeB

    BlackJIeB Developer

    Messages:
    16
    Likes Received:
    3
    Minecraft:
    BlackJIeB
    я изучил hashMap - ее использование есть в конфиге) Тоже удобная штука.
     

Share This Page