-
Ilość zawartości
987 -
Rejestracja
-
Ostatnia wizyta
-
Wygrane w rankingu
13
Odpowiedzi społeczności
-
yooniks odpowiedź w Problem z wczytaniem pluginu został oznaczony jako odpowiedź
plugin wymaga innego pluginu, BCommons
-
yooniks odpowiedź w Problem | Pisanie pluginów został oznaczony jako odpowiedź
Ja ci troche lepiej wytłumaczę niż wyżej:
jeżeli zmienna jest final to musi zostać zdefiniowana, a w konstruktorze jest możliwość że nie będą zdefiniowane, muszą mieć jakąś wartość zdefiniowana w konstruktorze
Wrzucaj tu problemy a ja chętnie pomogę, coraz mniej osób się tu udziela więc fajnie byłoby poodpowiadać.
-
yooniks odpowiedź w Sprawdzanie czy w pobliżu nie ma regionu został oznaczony jako odpowiedź
List regions = x; Region base = y; Location baseCenter = matchRegionCenter(base); for (Region region : regions) { //znajdź środek regionu Location center = matchRegionCenter(region); if (baseCenter.distance(center) + region.size() < 10) { //Region region jest blisko regionu base } } no mniej więcej, tylko przyklad, musisz sam to dobrze zlozyc
@edit
zamiast location baseCenter (jako lokacja regionu) zmień po prostu na player#getLocation bo nie doczytalem
-
yooniks odpowiedź w Lista w configu został oznaczony jako odpowiedź
Masz na czerwono messages - bo tam są dwie różne zmienne (tak samo nazwane), to byl tylko przyklad kodu.
Config masz na czerwono bo wgl nie stworzyles takiej zmiennej, to mialobyc odwolanie do FileConfiguration z glownej klasy tak jak napisales, myslalem ze ogarniesz. Chyba jeszcze troche musisz podstaw sie pouczyc lub poogladaj jakies gotowe pluginy publiczne z dobrym kodem.
public class TestCommand implements CommandExecutor { private final FileConfiguration config; public TestCommand(FileConfiguration config) { this.config = config; } @Override public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { if (!(sender instanceof Player)) { sender.sendMessage("this command is executable only by player"); return true; } Player p = (Player) sender; //napisalem ze to ustawia w configu "messages" na jakies wiadomosci, nw po co to tu dales /*final List<String> messages = Arrays.asList("first message", "second message"); config.set("messages", messages);*/ final List<String> messages = config.getStringList("messages"); final String message = String.join("\n", messages); p.sendMessage(message); } } a w glownej klasie zrob po prostu cos w stylu
public class TestPlugin extends JavaPlugin { @Override public void onEnable() { this.saveDefaultConfig(); final TestCommand testCommand = new TestCommand(this.getConfig()); this.getCommand("test").setExecutor(testCommand); } } config.yml ma wygladac tak:
messages: - "first message" - "second message" a plugin.yml:
#jakies inne typu main, author, version itp commands: test: aliases: [testcommand, testalias] description: "Test command"
-
yooniks odpowiedź w NPC został oznaczony jako odpowiedź
Entity#getCustomName lub jakos po npc mozesz pobrac, nw jakiej biblioteki uzywasz. u mnie wgl kiedys jak sie bawilem npc to takiego eventu nie wykrywalo i musialem jakos inaczej to robic, byl od tego specjalny event, ale skoro mowisz ze ci dziala to powinno byc git.
-
yooniks odpowiedź w Gui z 4 slotami został oznaczony jako odpowiedź
Dokładnie tak jak @up.
Aby zrobić takie gui zamiast zwyczajnego wystarczy w parametrach od Bukkit.createInventory dodać InventoryType.HOPPER
https://hub.spigotmc.org/javadocs/spigot/org/bukkit/event/inventory/InventoryType.html
-
yooniks odpowiedź w Tp po wejsciu na serwer został oznaczony jako odpowiedź
No bez przesady, naucz sie pierw podstaw i dopiero bierz sie za pluginy.. To tak jakbys nie nauczyl sie robienia malej rzeczy np. w samochodzie, a juz bys chcial go skladac od zera lub naprawiac..
Metoda onEnable ma byc w srodku klasy Main a nie poza nią.. (spójrz na ułożenie klamer) Tak samo z listenerem.. zamykasz klase i metoda jest poza klasą.
Naucz sie czegoś prostego, naucz sie poprawnie pisać chociaż podstawy i dopiero bierz sie za pluginy..
Tak, ale może to zrobić też w pluginie, i po co komuś zabierać te chęci? A może go pluginy tak zainteresują, że za kilka lat bedzie już bardzo doświadczony i nie tylko w pisaniu pluginów - bo pisząc pluginy też sie rozwija, z czasem nauczy sie pisac czysty kod, z czasem zrobi sie to dla niego troche nudne, nauczy sie czegos nowego i tak bedzie sie rozwijal? W skrypcie nie napisze pozniej jakiegos duzego projektu :d Jak chce sie uczyc to niech sie uczy, ale póki co niech zacznie pierw od podstaw. Do tego kodu wróci po tygodniu i sam zobaczy jakie głupie błędy zrobił
I tak wracając do głownego tematu, masz tu troche poprawione, powinno chyba dzialac
-
yooniks odpowiedź w Postawienie minecarta z hopperem został oznaczony jako odpowiedź
no jak nie działa block place to playerinteractevent i sprawdzass tylko ppm na block
-
yooniks odpowiedź w Dodanie Attribute został oznaczony jako odpowiedź
rzeczywiscie, pomylilem sie, tak jak mowilem, bez dokumentacji slabo, teraz na komputerze jestem to ci nawet przyklad daje:
final ItemStack item = null; final ItemMeta meta = item.getItemMeta(); final AttributeModifier attributeModifier = new AttributeModifier(UUID.randomUUID(), "coolAttribute", 1.4, Operation.ADD_NUMBER, EquipmentSlot.HAND); meta.addAttributeModifier(Attribute.GENERIC_ATTACK_DAMAGE, attributeModifier); item.setItemMeta(meta); Kazdy atrybut musi miec inne uuid (nie moze sie powtarzac, inaczej po prostu nie zostanie nadany) Atrybut dziala tylko w glownej rece (w tym przykladzie)
Odsylam do dokumentacji po wiecej: https://hub.spigotmc.org/javadocs/spigot/org/bukkit/attribute/AttributeModifier.html
https://hub.spigotmc.org/javadocs/spigot/org/bukkit/inventory/meta/ItemMeta.html#addAttributeModifier-org.bukkit.attribute.Attribute-org.bukkit.attribute.AttributeModifier-
@edit (itemstack dalem na null, tlyko dlatego ze to jest przyklad a potrzebowalem to zrobic w intelce, no a nie chcialo mi sie po prostu obiektu tworzyc, i tak nie musze tego testowac wiec dalem sobie nulla, zeby po prostu lapalo mi to jako itemstack)
-
yooniks odpowiedź w Customowe DMG mobów został oznaczony jako odpowiedź
Mozesz dodac atrybut generic.AttackDamage z powiekszonym damagem, lub po prostu tak jak napisales wykrywac uderzenia od moba, jego nazwe i wtedy powiekszac damage. e.setDamage(e.getDamage() + x);
-
yooniks odpowiedź w Problem z odczytywaniem hash mapy został oznaczony jako odpowiedź
po co ten set.clear() ?
a tak to:
public void saveLvL() { for(String level : lvl.keySet()) { int value = lvl.get(level); plugin.getConfig().set("lvl." + level, value); } plugin.saveConfig(); } mozesz zamienic na
public void saveLvl() { lvl.forEach((uuid, level) -> config.set("lvl." + uuid, level)); plugin.saveConfig(); } chociaz w sumie nw czym jest credit i ogolnie ten kod wyglada jakos brzydko=(
juz nawet nie wspomne o tym ze takie zapisywanie do yaml jest bez sensu, tymabrdziej ze czym plik bedzie wiekszy tym dluzej bedzie sie go ladowalo itd. sam sie o tym kiedys przekonalem jak takie coinsy itd trzymalem w jednym pliku, plik byl ogromny i ladowal sie wiecej niz 10 minut, a poand 100 graczy czekało na wejscie na serwer
przeciez teraz jest tyle fajnych baz danych=(
-
yooniks odpowiedź w Zapisywanie arraylist do mysql został oznaczony jako odpowiedź
https://github.com/SocketByte/Wrapp/blob/master/src/test/java/pl/socketbyte/wrapp/tool/Serializer.java
-
yooniks odpowiedź w jak podmienić znaki z '&' na '§' w stringList został oznaczony jako odpowiedź
Eh, no tak jest, jak piszesz pluginy, a nie ogarniasz javy
Przecież jako parametry, przyjmujesz string w metodzie to nic dziwnego, że jest na czerwono jak chcesz dać listę?
Zrób sobie kolejna metodę, która przyjmuję listę jako parametr i zwraca też listę.
public static List<String> colored(List<String> list) { return list .stream() .map(string -> ChatColor.translateAlternateColorCodes('&', string)) .collect(Collectors.toList()); //mam troche przerwe z java i mc wiec moze cos pokrecilem, ale wydaje mi sie ze dobrze }
-
yooniks odpowiedź w kolejny problem z hash mapa został oznaczony jako odpowiedź
eh.. tak jest jak piszesz pluginy pod mc, a jedyne co widziales to kod z dekompilatora
public class PlayersHolder { private final Set<UUID> players = new HashSet<>(); private boolean contains(UUID uuid) { return this.players.contains(uuid); } private void add(UUID uuid) { this.players.add(uuid); } private void remove(UUID uuid) { this.players.remove(uuid); } } (zmien private na public bo robilem na szybko)
private final PlayersHolder playersHolder = new PlayersHolder(); @EventHandler public void onJoin(PlayerJoinEvent event) { this.playersHolder.add(event.getPlayer().getUniqueId()); } @EventHandler public void onQuit(PlayerQuitEvent event) { this.playersHolder.remove(event.getPlayer().getUniqueId()); } //dodaj sobie jakis listener i wtedy: if (this.playersHolder.contains(player.getUniqueId()) { player.sendMessage("contains!"); }
-
yooniks odpowiedź w Problem z PlayerInteractEvent został oznaczony jako odpowiedź
po pierwsze to nie dawaj gotowcow bo tak to nikt sie niczego nie nauczy, a po drugie masz tak samo zle kod.
Zacznijmy od tego, że item zdefiniowany w zmiennej 's' może być nullem, np. jak gracz kliknie ppm 'niczym' - lub będzie to powietrze - a powietrze nie zawiera itemmety (z tego co wiem) Każdy item zawiera itemmete oprócz powietrza, sprawdzaj czy item w zmiennej jest nullem, jak tak to returnuj event (lub chyba w 1.12+ jest cos takiego jak event.hasItem()), sprawdzaj czy item zawiera itemmeta, jezeli nie to returnuj (s.hasItemMeta()), no i oczywiscie tez sprawdzaj czy ma nazwe, (s.getItemMeta().hasDisplayName()), do tego jak gracz kliknie w powietrze to nic sie nie dzieje i uzna to za jakiś błąd, sprawdzaj dodatkowo akcje RIGHT_CLICK_AIR..
kolejne: tworzysz itemy podczas eventu, bez zadnych warunkow itd. przed tworzeniem, zaloze sie ze wystarczy z kilkunastu botów poklikać troche ppm i pewnie troszke lagi będą =/, zdefiniuj to sobie najlepiej w jakims polu w tej klasie
kolejne:
if (s.getItemMeta().getDisplayName().equals("§dVoucher §8(§fVIP§8)")) nie uzywaj paragrafów, do tego po co takie porównywanie, wystarczy użyjesz metody ItemStack#isSimilar
do tego nie wiem po co to castujesz:
Bukkit.dispatchCommand((CommandSender)Bukkit.getConsoleSender(), "pex user " + p.getName() + " group set VIP"); to juz i tak jest commandsender, no i ja oczywiscie zamiast tych ifów to bym zrobił jakiś interfejs voucherhandler, i tam mial po prostu jakąś metodę a w klasie voucherviphandler itd bym po prostu implementowal tą metodę i wrzucil to co jest w ifach, no ale to juz jak kto woli
no i na koniec:
public void Voucher(PlayerInteractEvent e) { brak adnotacji EventHandler nad metodą, do tego metody nazywamy z małej litery, już nie mówiąc o tym, że ta nazwa nie ma sensu
(w sumie to event sie wykonuje wiec adnotacja pewnie jest, ale jej nie pokazałeś)
-
yooniks odpowiedź w Własne zmienne dla gracza w pluginie Holographic Displays został oznaczony jako odpowiedź
to użyj sobie hologramapi, tam mozesz wyswietlac dany tekst dla tylko jednego gracza lub jest cos tam w stylu replace, i mozesz sobie tam walnac tam zmienna itd
bo api holographicdisplays to takie plytkie
-
yooniks odpowiedź w Jak zapisywać/odczytywać dane przez mysql? został oznaczony jako odpowiedź
to juz jak wolisz, ale takie cos mozesz ladowac przy wejsciu gracza, a usuwac po jego wyjsciu - zeby tak bardzo nie obciazac serwera jak bedzie stal kilka dni bez restartu - bo wyobraz sobie ze przez kilka godzin wbije ok. tysiąc graczy, a i tak pozniej bedzie gralo tylko 100, wiec niepotrzebnie w pamieci trzymac te 900.
A co do kodu to gotowca raczej nie dostaniesz, a jak tak bardzo chcesz to mozesz sobie zawsze zapozyczyc z innych projektow opensource np: https://github.com/whippytools/whippy-tools
-
yooniks odpowiedź w Lista argumentów w komendzie został oznaczony jako odpowiedź
sprobuj
name: 'SimplePlugin' version: ${project.version} main: 'xyz.yooniks.simple.SimplePlugin' authors: ['yooniks'] description: 'Prosty plugin' website: 'www.youtube.com/c/Enchanted3' commands: service: aliases: ['services', 'uslugi'] services: name: "vip" message-on-buy: "&6{PLAYER} &7has just bought vip!" package xyz.yooniks.simple; import lombok.Getter; import org.bukkit.plugin.java.JavaPlugin; import xyz.yooniks.simple.command.ServiceCommand; import xyz.yooniks.simple.service.Service; import xyz.yooniks.simple.service.ServiceManager; import java.util.List; import java.util.stream.Collectors; public final class SimplePlugin extends JavaPlugin { @Getter private ServiceManager serviceManager; @Override public void onEnable() { this.saveDefaultConfig(); final List<Service> services = this.getConfig().getConfigurationSection("services").getKeys(false) .stream() .map(id -> new Service( this.getConfig().getString("services." + id + ".name"), this.getConfig().getString("services." + id + ".message-on-buy"))) .collect(Collectors.toList()); this.serviceManager = new ServiceManager(services); this.getCommand("service").setExecutor(new ServiceCommand(this)); } @Override public void onDisable() { this.serviceManager = null; } } package xyz.yooniks.simple.service; import lombok.Getter; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @Getter public class ServiceManager { private final Map<String, Service> services = new LinkedHashMap<>(); public ServiceManager(List<Service> services) { services.forEach( service -> this.services.put(service.getName(), service)); } } package xyz.yooniks.simple.service; import lombok.AllArgsConstructor; import lombok.Getter; @AllArgsConstructor @Getter public class Service { private final String name, messageOnBuy; } package xyz.yooniks.simple.command; import lombok.AllArgsConstructor; import org.apache.commons.lang.StringUtils; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import xyz.yooniks.simple.SimplePlugin; import xyz.yooniks.simple.service.Service; @AllArgsConstructor public class ServiceCommand implements CommandExecutor { private final SimplePlugin plugin; @Override public boolean onCommand( CommandSender cs, Command command, String label, String[] args) { if (!cs.hasPermission("is.command")) { cs.sendMessage(ChatColor.RED + "No permission!"); return true; } if (args.length < 2) { cs.sendMessage(ChatColor.RED + "Correctly usage: /service [player_nickname] [service]"); cs.sendMessage(ChatColor.GREEN + "List of services:"); this.plugin.getServiceManager().getServices().values() .stream() .map(service -> ChatColor.YELLOW + service.getName()) .forEach(cs::sendMessage); return true; } final String playerName = args[0]; final String serviceById = args[1]; final Service service = this.plugin.getServiceManager().getServices().get(serviceById); if (service == null) { cs.sendMessage(ChatColor.RED + "This service does not exists! List of services: /service"); return true; } this.plugin.getServer().broadcastMessage(ChatColor.translateAlternateColorCodes('&', StringUtils.replace(service.getMessageOnBuy(), "{PLAYER}", playerName))); //add commands -.- return false; } }
-
yooniks odpowiedź w Problem przy pluginie i pytanie został oznaczony jako odpowiedź
@HotAngel2K17 wystarczy zmienic #getStringList na #getString
bo w koncu nazwa to lista czy pojedyncza linia
I pytanie numer 2. Jak zrobic inventory w np. klasie main i zrobic tak zeby mozna bylo go uzywac w klasie np. DrugaKlasa public class SimpleMethod { private final Examples plugin; public SimpleMethod(Examples plugin) { this.plugin = plugin; } private void openInventory(Player player) { player.openInventory(plugin.getMyInventory()); } } import org.bukkit.inventory.Inventory; import org.bukkit.plugin.java.JavaPlugin; public final class Examples extends JavaPlugin { private Inventory myInventory; public Inventory getMyInventory() { return myInventory; } @Override public void onEnable() { this.myInventory = getServer().createInventory(null,9,"hejo"); new SimpleMethod(this); } @Override public void onDisable() { } }
-
yooniks odpowiedź w (Util) sprawdzanie czy gracz może otrzymać przedmiot. został oznaczony jako odpowiedź
private boolean canGet(Inventory inventory) { if (inventory.firstEmpty() == -1) { return false; } return true; } chyba chodzilo ci o sprawdzanie czy inventory jest pelne?
-
yooniks odpowiedź w Config został oznaczony jako odpowiedź
http://hostuje.net/file.php?id=44c724b982211218af7ce7cd00d4b7c3
https://www.virustotal.com/#/file/998df8c0560bde9b2143e20375dde619892416856c6117c474ffa9b8bb4cf2ab/detection
Kiedyś napisałem na zlecenie taki premiumcase, ma wszystko to co ty chcesz, gosciu pod siebie podpisal potem plugin Zdekompiluj sobie jd-gui lub luytenem i mozesz popatrzec mniej wiecej jak to wyglada
-
yooniks odpowiedź w Równe lub większe... został oznaczony jako odpowiedź
set {_var} to {zmienna::%player%} parsed as integer
if {_var} is bigger or equal to 1000:
-
yooniks odpowiedź w rozna ilosc został oznaczony jako odpowiedź
final int amount = rand.nextInt(3); popraw na
final int amount = rand.nextInt(3) + 1; bo inaczej bedzie odliczac od zera
-
yooniks odpowiedź w perelki tepanie po śmierci został oznaczony jako odpowiedź
Spróbuje zrobić na to blokade w pluginie, jak bede mial czas
@edit
https://github.com/yooniks/PearlFixer
zrobiłem na szybko, mam nadzieje ze bedzie dzialac, nigdy nie używałem ender perły w pluginach wiec może nie do końca działać, w razie problemów pisz.
Zrobiłem mapkę zamiast listy, bo na początku miałem zamiar zrobić to inaczej, może kiedyś to zmienie jak bede miał czas, i powód, bo raczej nie ma to wiekszego znaczenia.
(@editv2 poprawiono troszeczke kod, mapki pozmieniano na finalne, i troche zmieniono w obiekcie user, ale troszke zepsulem projekt w intellij, zbugowal mi sie z gitem i tego na razie nie zaktualizuje)
-
yooniks odpowiedź w Ciągłe crashe serwera został oznaczony jako odpowiedź
https://www.spigotmc.org/resources/worldedit-command-crash-fix.35962/
