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

BlackJIeB

Developer
Раньше кодил на 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;

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

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

fromgate

Administrator
Тут несколько вариантов.
Самый простой.
Создаешь коллекцию 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());
	}

	@Override
	public Object value() {
		return true;
	}

	@Override
	public void invalidate() {
	}
}
 

JustMaks19

Developer (Level 2)
Тут несколько вариантов.
Самый простой.
Создаешь коллекцию 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());
	}

	@Override
	public Object value() {
		return true;
	}

	@Override
	public void invalidate() {
	}
}
в таких ситуациях я использую HashMap..
 

BlackJIeB

Developer
Тут несколько вариантов.
Самый простой.
Создаешь коллекцию 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());
	}

	@Override
	public Object value() {
		return true;
	}

	@Override
	public void invalidate() {
	}
}
Первый метод помог, спасибо :)
 

fromgate

Administrator
в таких ситуациях я использую HashMap..
Ну тут речь шла о хранении значений true/false. Поэтому Set удобнее: есть имя игрока в списке — значит true. Нет имени - значит false.

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

BlackJIeB

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

А вот если нужно сохранить что-то другое (например координаты, текст и вообще всё что угодно), то тогда - HashMap.
я изучил hashMap - ее использование есть в конфиге) Тоже удобная штука.
 
Top