-
Ilość zawartości
1854 -
Rejestracja
-
Ostatnia wizyta
-
Wygrane w rankingu
44
Treść opublikowana przez kerpson
-
Na początek porada: Zamiast: if (e.getCurrentItem().getItemMeta() != null) { if (e.getCurrentItem().getItemMeta().getDisplayName() != null) { Możesz dać if (e.getCurrentItem().hasItemMeta() && e.getCurrentItem().getItemMeta().getDisplayName() != null) { Do rzeczy, tak jak wspomniałeś, najlepiej zrobić osobny itemstack czyli (bazując na itemstacku z getCurrentItem()) ItemStack remove = new ItemStack(is.getType(), 1, is.getDurability()); wtedy nie musisz się bawić w itemmeta Wtedy tylko sprawdzasz czy gracz w ekwipunku posiada ten itemstack, który stworzyłeś (w moim przypadku remove) i go potem usuwać A teraz wyjaśnienie co było źle ? Usuwałeś itemmeta klikniętemu przedmiotowi i ustawiałeś jego displayname na null, a w warunku wyżej miałeś if (e.getCurrentItem().getItemMeta().getDisplayName() != null) { Myślę, że pomogłem i tym razem #Edit Robisz masakryczny błąd Inventory inv = Bukkit.createInventory(null, 27, Utils.fixColor(Main.getInst().getConfig().getString("shopSellName"))); int i = 0; for (final String a : Main.getInst().getConfig().getConfigurationSection("Items.Sell").getKeys(false)) { final String path = "Items.Sell." + a; final ItemStack item = new ItemStack(Material.getMaterial(Main.getInst().getConfig().getString(path + ".material"))); item.setAmount(Main.getInst().getConfig().getInt(path + ".amount")); ItemMeta met = item.getItemMeta(); met.setDisplayName(Utils.fixColor(Main.getInst().getConfig().getString(path + ".name"))); List<String> lore = Main.getInst().getConfig().getStringList(path + ".lore") .stream() .map(s -> ChatColor.translateAlternateColorCodes('&', s).replace("<<", "«").replace(">>", "»")) .collect(Collectors.toList()); met.setLore(lore); item.setItemMeta(met); int price = Main.getInst().getConfig().getInt(path+".price"); Map<Enchantment, Integer> map = new HashMap<>(); for (String s : Main.getInst().getConfig().getStringList(path + ".enchantments")) { Enchantment ench = Enchantment.getByName(s.split(":")[0].toUpperCase()); if (ench == null) continue; int level = Integer.parseInt(s.split(":")[1]); map.put(ench, level); } item.addUnsafeEnchantments(map); inv.setItem(i, item); ItemManager.setItem(item, i); i++; } p.openInventory(inv); za każdym razem tworzysz nowe inventory (każdy gracz ma i tak to samo) ale to mniejszy problem Za każdym razem dodajesz do ItemManagera te same wartości z configu, lepiej zrobić jakąś klasę Config, zrobić jakiegoś voida np. loadConfig() tam ładować itemy do mapki, w głównej klasie zrobić (w onEnable()) Config.loadConfig(); Wtedy tylko dodajesz do ekwipunku itemy, a nie tworzysz je na nowo za każdym razem No i co do ekwipunku, możesz zrobić jakąś klasę z ekwipunkiem (tam robisz ekwipunek gotowy, dodajesz do niego itemki z ItemManager), w klasie glównej załadować i stworzyć to inventory a np. w listenerze tylko otwierać te gotowe inventory. Jest to opcja, która optymalizuje kod, a zarazem kod staje się czytelniejszy i łatwiej się w nim połapać
-
ehh po co ci onEnable ??? zrób prywatny konstruktor private Config() {} metode public static void loadConfig() (potem w klasie głównej przy metodzie onEnable załadujesz config tak: Config.loadConfig()) i w niej rób wszystko jak robisz saveDefaultConfig nie musisz dawać this.getConfig().options().copyDefaults(true); no i po co masz Boolean jako obiekt ? wystarczy zwykły boolean z małej litery Dodatkowo zauważ jak to jest u karolka KarolekDrop.getPlugin().saveDefaultConfig(); Odwołał się do głównej klasy W swojej klasie głównej możesz to zrobić np. tak public static Klasa getInstance() { return getPlugin(Klasa.class); } A w klasie Config coś takiego. FirstPlugin.getInstance().saveDefaultConfig(); Bierzesz się za rzeczy trudniejsze a nie masz totalnie pojęcia o podstawach, za szybko idziesz do przodu.
-
klasa Config powinna być klasą gdzie będą zapisywane wszystkie zmienne z configu (jakieś Stringi z wiadomościami itd), mogą być one odczytywane statycznie ale nie tylko. Pamiętaj, że java opiera się na programowaniu obiektowym. Masz tu przykład od karolka https://github.com/KarolekFM/karolekDrop/blob/master/src/main/java/net/karolek/drop/Config.java
-
Czemu masz 2 klasy z rozszerzeniem JavaPlugin ? Taki rozszerzenie ma mieć tylko jedna klasa , czyli główna
-
powinno być on connect, on join to akcja po dołączeniu już na serwer Zadam dziwne pytanie, czy ty wgl ten skrypt wgrałeś?
-
nie korzystam ze skrytów ale patrząc na tej kawałem kodu to ma to mały sens według mnie albo jest dziwnie napisany Jeżeli źle znosisz krytykę, która ma pomóc w rozwoju skryptu to ciężko musisz mieć w życiu. Użytkownicy dali ci rady, dzięki którym możesz poprawić skrypt i go udoskonalać. Tak jak powiedział tymek:
-
najlepiej mieć osobną klasę, w której będą zapisywane wszystkie rzeczy z configu a w innych klasach się tylko do niej odwoływać:)
-
tobie potrzebne będzie to co w evencie ale musisz zrobić gdzieś sobie tą mapkę
-
Skrypt na pieniądze za bycie na serwerze
kerpson odpowiedział(a) na dex00x0x0 pytanie w Pytania i problemy
nie możesz w skrypcie mieszać spacji z tabami. Użyj albo 3 tabów albo 12 spacji, skrypt mówi ci, żebyś w tych linijkach użył 12 spacji -
wyjaśnij dokładniej jak możesz
-
"expected 12 spaces but found 3 tabs" nie mówi ci to coś ? Jeżeli nie odsyłam cię do wujka tłumacza google
-
Chyba najprościej będzie zrobić jakąś mapkę Map<ItemStack, Integer> map = new HashMap<>(); klucz (itemstack) to będzie przedmiot do kupienia (Key w mapce zawsze jest po to, żeby za jego pomocą określić przypisaną mu wartość, przykład: Map<Integer, String> map = new HashMap<>(); /w jakiejś metodzie czy coś. map.put(1, "liczba jeden"); /również w jakiejś metodzie. final String text = map.get(1); System.out.println(text); /*wyświetli w konsoli "liczba jeden"*/ ale println to tylko przykład wartość (Integer) to będzie cena tego przedmiotu Do tej mapki przy pętli możesz dodać przedmiot oraz jego cenę W evencie od klikania: @EventHanler public void onClick(InventoryClickEvent e) { /* sprawdzasz co tam chcesz, nazwe inventory itd.*/ ItemStack is = e.getCurrentItem(); /jest to kliknięty przemiot if (!map.containsKey(is)) { /w tym przypadku taki przedmiot nie istnieje w mapce, czyli powinieneś wykonać return, żeby nie wywaliło błędu return; } int price = map.get(is); /tu jest cena przedmiotu
-
Nazwę klasy zaczynamy od dużej litery (tak na boku powiem)
-
No to ja się przyczepie do tego, że podczas czyszczenia chatu czyści również konsolę. on chat: if {chatvip} is false: if player has permission "chat.vip": stop WTF
-
jak wroce to ci pomoge na pv, bo to bedzie bardziej skomplikowane
-
Wprowadzenie regulacji prawnych związanych z większą ilością spoilerów niż jeden
kerpson odpowiedział(a) na skript.pl temat w System wniosków
jakiś typo robi sb beke a wy łykacie XD -
no to w configu możesz np zrobić coś takiego: Items: Sell: 1: #co tam chcesz enchantments: - 'durability:3' - 'damage_all:5' No i w tej pętli coś takiego Map<Enchantment, Integer> map = new HashMap<>(); for (String s : cfg.getStringList(path + ".enchantments")) { Enchantment ench = Enchantment.getByName(s.split(":")[0].toUpperCase()); if (ench == null) continue; int level = Integer.parseInt(s.split(":")[1]); map.put(ench, level); } is.addEnchantments(map);
-
is.addEnchantment(Enchantment.ENCHANT, poziom);
-
A to dobrze ;D
-
Nie (chyba, że źle zrozumiałem), zgaduję, że przedmioty znajdują się w pliku config.yml, czyli podstawowy config. Możesz uzyskać cfg tak: FileConfiguration cfg = plugin.getConfig(); plugin możesz uzyskać poprzez odniesienie do instancji klasy głównej lub z pomocą czegoś takiego: Main plugin; public Klasa(Main plugin) { this.plugin = plugin } public void load() { FileConfiguration cfg = plugin.getConfig(); } Main to jest nazwa twojej klasy. a instancję klasy np. w taki sposób (w klasie glównej) public static Klasa getInstance() { return getPlugin(Klasa.class); }
-
for (final String s : cfg.getConfigurationSection("Items.Sell").getKeys(false)) { final String path = "Items.Sell." + s; final ItemStack item = new ItemStack(Material.matchMaterial(cfg.getString(path + ".material")), 1); } Powinno działać, nie testowane Skrót cfg to konfiguracja pliku, którą można uzyskać poprzez FileConfiguration lub YamlConfiguration, poniżej linki przydatne https://bukkit.gamepedia.com/Configuration_API_Reference https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/configuration/file/YamlConfiguration.html https://hub.spigotmc.org/javadocs/spigot/org/bukkit/configuration/file/FileConfiguration.html
-
TzPRewards - skrypt na nagrody za czas spędzony na serwerze w Gui
kerpson odpowiedział(a) na THEzombiePL temat w Skrypty
Największym minusem jest pobieranie żywcem z użyciem komendy wszystkich wartości z configu Jest to ogromny minus -
Bez dobrych ustawień mało ci ten paper da
-
no to poczytaj o tym/znajdź jakiś poradnik + pozmieniaj formatowanie w kodzie na utf-8 jak się da
-
Czy masz kodowanie UTF-8 ?
