Problem z wczytaniem wiadomości z configu

Pytania i problemy
java, bukkit
szymhal
szymhal
luxDev
luxDev Pionier

Masz stworzony config? jest w nim zawartość? w eclipse/pliki

szymhal
szymhal

tak, config jest stworzony.

luxDev
luxDev Pionier

Spróbuj zrobić tak:

p.sendMessage(Main.getInst().getConfig().getString("zalogujUsage").replace("&", " §");
luxDev
luxDev Pionier

Btw polecam zrobić jakiś Config który będziesz ładować na starcie czy coś, ładowanie live to zły pomysł na dłuższą metę.

szymhal
szymhal

luxDev:

p.sendMessage(Main.getInst().getConfig().getString("zalogujUsage").replace("&", " §");

W klasie Main mam taki kod:

@Override public void onEnable() {

  //REJESTROWANIE EVENTÓW
  PluginManager pm = Bukkit.getServer().getPluginManager();
  pm.registerEvents(new OnJoinListener(), this);
  pm.registerEvents(new OnPlayerClicksListener(), this);
  pm.registerEvents(new SomeListeners(), this);
  pm.registerEvents(new PlayerCommandPreprocessListener(), this);
  
  //REJESTROWANIE KOMEND
  getCommand("wersja").setExecutor(new WersjaCommand());
  getCommand("zaloguj").setExecutor(new ZalogujCommand());
  getCommand("zarejestruj").setExecutor(new ZarejestrujCommand());
  getCommand("wyloguj").setExecutor(new WylogujCommand());
  getCommand("zmienhaslo").setExecutor(new ZmienhasloCommand());
  getCommand("zalogowano").setExecutor(new ZalogowanoCommand());
  
  //TWORZENIE PLIKU KONFIGURACYJNEGO
  this.saveDefaultConfig();
  
  Bukkit.getConsoleSender().sendMessage("[§6" + this.getName() + "§f] §aPlugin zostal poprawnie wlaczony.");

}

Nie wiem za bardzo o co Ci chodzi, możesz dokładniej wytłumaczyć?

@EDIT: To co dałeś - nie działa. Ten sam błąd.

luxDev
luxDev Pionier

W ten sposób https://hastebin.com/quteraxinu.swift BTW Masz zły import do ChatColor :P (md_5) zmień go na org.bukkit.ChatColor zmieniłeś już ups :D

luxDev
luxDev Pionier

To oznacza że ten String w configu nie istnieje :o Pokaż config

szymhal
szymhal

Uzycie komendy /zaloguj.

> zalogujUsage: "&c&lUzycie: &r/zaloguj "
> # Uzycie komendy /zarejestruj.
> zarejestrujUsage: "&c&lUzycie: &r/zarejestruj  "

> # Uzycie komendy /wyloguj.
> wylogujUsage: "&c&lUzycie: &r/wyloguj"

> # Uzycie komendy /zmienhaslo.
> zmienhasloUsage: "&c&lUzycie: &r/zmienhaslo  "
luxDev
luxDev Pionier

Tosz próbujesz to pobrać: String zalogujUsage = Main.getInst().getConfig().getString("loginUsage"); A w configu masz zalogujUsage XD

szymhal
szymhal

Nawet jak poprawiłem tą literówke, błąd jest nadal ten sam.

luxDev
luxDev Pionier

zrób debug, czy coś, spróbuj wysłać bez niczego w konsoli tą wiadomość czyli np. w Main na końcu System.out.println(getConfig().getString("zalogujUsage"));

Jak będzie null to znaczy że to co jest w configu się nie zgadza z tym co próbujesz wyciągnąć, btw te ">" w tym kodzie co mi wkleiłeś to tak jest czy to program do otwierania plików dodaje?

Marcoral
Marcoral Pionier

Przy okazji luxDev dobrze poradził Ci, aby nie wczytywać za każdym razem tego configu. Przy ładowaniu serwera zapisz sobie te "loginUsage" do jakiejś zmiennej i pobieraj wartość z niej, a nie z configa.

Kiedy już to zrobisz, procesor serwera Ci ładnie podziękuje. Tutaj to błahostka, ale gdybyś co chwila chciał dostać się do jakichś podstawowych danych (bo w configu masz np. jaka ma być szansa na drop czegoś) dopiero zobaczyłbyś o czym mowa 😃

Mimo wszystko to rozwiązanie ma jedną wadę - musisz dodatkowo napisać komendę do reloadu configa (aby zaktualizować zmienne)

DBanaszewski
DBanaszewski α-tester v3

#Offtop Jak załadować konfigurację podczas ładowania pluginu? Oto przykład:

File configFile = new File(getDataFolder(), "config.yml");
@SuppressWarnings("unused")
private YamlConfiguration config;
	
@Override
public void onLoad(){
  if(!configFile.exists()){ //sprawdza, czy konfiguracja istnieje
    saveResource("config.yml", true); //zapisanie konfiguracji
    config = YamlConfiguration.loadConfiguration(configFile); //załadowanie
  } else {
    config = YamlConfiguration.loadConfiguration(configFile); //załadowanie
  }
}

Używanie (podaję przykład):

String loginUsage = config.getString("loginUsage");
Marcoral
Marcoral Pionier

OnTopic:

Błąd u Ciebie jest spowodowany NullPointerException. W onEnable zapomniałeś zapisać instancji pluginu do zmiennej.

luxDev
luxDev Pionier

a może ma w public void onLoad(){ ? :D

Marcoral
Marcoral Pionier

Ale to totalnie bez sensu xD

luxDev
luxDev Pionier

no w sumie onLoad wykonuje się przed onEnable, ja tam bym wstawił instance = this; w onLoad :D

Marcoral
Marcoral Pionier

Chodziło mi o to, że to w zasadzie jedyna możliwość popełnienia błędu - gdyby instancja była zarejestrowana to nawet jeżeli w configu byłby błąd, to zmienna zalogujUsage co prawda byłaby równa null, ale nie wywaliłaby błędu.

W skrócie do autora tematu: Jestem prawie pewien, że nie zarejestrowałeś instancji pluginu. Jeżeli nie wiesz o czym mówię, prześledź Twoją metodę getInst() w głównej klasie.

szymhal
szymhal

Zaraz jeszcze raz prześledzę kod, zapiszę podczas ładowania pluginu i napiszę wam mój wynik.

anon10657637
anon10657637

@Marcoral @luxDev a najlepiej, jak czlowiek, przekazywac instancje przez konstruktor do klas, ktore tego potrzebuja. Robienie statycznego singletona raz, ze jest unsafe, bo zawsze jakis zartownis moze to refleksja edytowac i po pluginie, dwa, jest to malo wydajne, trzy, dajecie wtedy kazdemu pluginowi do niego dostep.

RabbitTheDEV
RabbitTheDEV

Ładuj Stringi podczas załadowania pluginu a nie ciągłe pobieranie..

String example; FileConfiguration cfg; @Override
public void onLoad() { cfg = this.getConfig();
examle = cfg.getString("example"); }

(Nie musisz używać cfg, ale przy większej ilości zmiennych jest to zalecane :))

Nie używaj System.out, a co gorsza getConsoleSender.. Używaj przyjaznego dla wszystkich loggera - this.getLogger().info("Plugin has been enabled!");

DoreK
DoreK α-tester v3

Drugi raz Ci to pokazuję: image|276x57

RabbitTheDEV
RabbitTheDEV

Ah no tak, ale nie zaszkodzi napisać.

IceMelt
IceMelt

Tyle, że już kod też zniknął na hastebinie ;d

system
system

Ten temat został automatycznie zamknięty 32 dni po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe.