Queito 104 Opublikowano 6 maja 2018 Udostępnij Opublikowano 6 maja 2018 public class Listeners implements Listener{ @EventHandler public void PlayerRightClick(PlayerInteractEntityEvent e){ if(!(e.getRightClicked() instanceof Villager)){ return; } else { if(e.getRightClicked().getCustomName().equalsIgnoreCase("Wojownik")){ clickedEntity(e.getPlayer(), "Wojownik", e.getRightClicked().getLocation()); e.setCancelled(true); } else if (e.getRightClicked().getCustomName().equalsIgnoreCase("Mag")){ clickedEntity(e.getPlayer(), "Mag", e.getRightClicked().getLocation()); e.setCancelled(true); } else if (e.getRightClicked().getCustomName().equalsIgnoreCase("Lowca")){ clickedEntity(e.getPlayer(), "Lowca", e.getRightClicked().getLocation()); e.setCancelled(true); } } return; } private void clickedEntity(Player player, String string, Location loc){ File f = new File("plugins/VarRPG/Players/" + player.getPlayer().getName() + ".yml"); YamlConfiguration yamlFile = YamlConfiguration.loadConfiguration(f); if(yamlFile.getInt("Postac.Poziom") >= 5){ if(yamlFile.getString("Postac.Klasa") == null|| yamlFile.getString("Postac.Klasa") == "Proces tworzenia"||yamlFile.getString("Postac.Klasa") == "Chuj"){ yamlFile.set("Postac.Klasa", "Proces tworzenia"); File q = new File("plugins/VarRPG/Dialogi.yml"); YamlConfiguration fFile = YamlConfiguration.loadConfiguration(q); for(String msg : fFile.getStringList("Rozmowa_" + string)) { if(player.getLocation().distance(loc) <= 5){ player.sendMessage(msg); } else { player.sendMessage("Musisz podejsc blizej!"); return; } } } } } } Robiąc plugin na klasy, mam problem. Próbując 2h szukać rozwiązania, nie udało się. Problem jest taki, że po kliknięciu na villagera, podwaja się wiadomość (msg). Tak po drodze, jakieś wskazówki na lepszy kod :P? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
1 GotoFinal 195 Opublikowano 7 maja 2018 Udostępnij Opublikowano 7 maja 2018 Pewnie event wywołuje się więcej niż raz, np ze względu na to jak minecraft obsługuje obie ręce Zarejestruj się lub zaloguj, aby zobaczyć ukrytą treść! Musisz sprawdzić czy użył głównej ręki. A tak to nie ładuj plików w takich eventach przy każdym kliknięciu... wszystkie takie dane powinieneś załadować na starcie pluginów do odpowiedniej struktury obiektów - inaczej każde kliknięcie będzie zatrzymywać serwer na czas odczytu pliku. Queito i LloydPL 1 1 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
0 yooniks 347 Opublikowano 7 maja 2018 Udostępnij Opublikowano 7 maja 2018 (edytowane) for(String msg : fFile.getStringList("Rozmowa_" + string)) { moze zawiera 2 wiadomosci, a nie jedna? I to wszystko laduj raz, w tasku, przy wejsciu gracza. A po wyjsciu gracza aktualizuj plik i usuwaj dane tego 'gracza' @edit i jak robisz return to juz nie musisz robic else: if(!(e.getRightClicked() instanceof Villager)){ return; } else { if(e.getRightClicked().getCustomName().equalsIgnoreCase("Wojownik")){ clickedEntity(e.getPlayer(), "Wojownik", e.getRightClicked().getLocation()); e.setCancelled(true); } do tego taki plik moze nie istniec: File f = new File("plugins/VarRPG/Players/" + player.getPlayer().getName() + ".yml"); a ty nic z tym nie robisz ;/ do tego z playera pobierasz playera do tego stringi nie porownujemy poprzez == tylko equals if(yamlFile.getString("Postac.Klasa") == null|| yamlFile.getString("Postac.Klasa") == "Proces tworzenia"||yamlFile.getString("Postac.Klasa") == "Chuj"){ Edytowane 7 maja 2018 przez yooniks Queito 1 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
0 Queito 104 Opublikowano 7 maja 2018 Autor Udostępnij Opublikowano 7 maja 2018 (edytowane) Moglibyście mi napisać przykładowego Maina & Listerna, jak ma to wyglądać przy sprawdzaniu np. poziomu z yml gracza? tak samo z zapisaniem z ustawien bo nie rozumiem tego, w sensie żeby było optymalnie @edit ogolnie ten blad z podwojnym wykonywaniem sie eventu, ogarnalem Edytowane 7 maja 2018 przez Queito Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
0 yooniks 347 Opublikowano 7 maja 2018 Udostępnij Opublikowano 7 maja 2018 (edytowane) 1 godzinę temu, Queito napisał: Moglibyście mi napisać przykładowego Maina & Listerna, jak ma to wyglądać przy sprawdzaniu np. poziomu z yml gracza? tak samo z zapisaniem z ustawien bo nie rozumiem tego, w sensie żeby było optymalnie @edit ogolnie ten blad z podwojnym wykonywaniem sie eventu, ogarnalem przyklad (slaby w flat jestem, jak cos zle to niech ktos mnie poprawi): package xyz.yooniks.simple; import lombok.Getter; import org.bukkit.plugin.java.JavaPlugin; import xyz.yooniks.simple.listener.PlayerJoinQuit; import xyz.yooniks.simple.user.UserManager; public final class SimplePlugin extends JavaPlugin { @Getter private final UserManager userManager; public SimplePlugin() { this.userManager = new UserManager(this); } @Override public void onEnable() { this.getServer().getPluginManager().registerEvents( new PlayerJoinQuit(this), this); } @Override public void onDisable() { } } package xyz.yooniks.simple.user; import lombok.AllArgsConstructor; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import xyz.yooniks.simple.SimplePlugin; import java.util.HashMap; import java.util.Map; import java.util.UUID; @AllArgsConstructor public class UserManager { private final SimplePlugin plugin; private final Map<UUID, User> users = new HashMap<>(); public User getUser(Player player) { User user = this.users.get(player.getUniqueId()); if (user == null) { this.users.put(player.getUniqueId(), user = new User(this.plugin, player)); } return user; } public void remove(PlayerQuitEvent event) { final Player player = event.getPlayer(); final User user = this.getUser(player); user.quit(); this.users.remove(player.getUniqueId()); } } package xyz.yooniks.simple.user; import lombok.Getter; import lombok.Setter; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import xyz.yooniks.simple.SimplePlugin; import java.io.File; import java.io.IOException; import java.util.UUID; public class FlatUser { private FileConfiguration yaml; private final File file; private final SimplePlugin plugin; @Getter @Setter private int level; public FlatUser(SimplePlugin plugin, UUID uuid) { this.plugin = plugin; this.file = new File(plugin.getDataFolder() + "/users", uuid.toString() + ".yml"); this.plugin.getServer().getScheduler().runTaskAsynchronously(this.plugin, () -> { try { if (!file.exists()) file.createNewFile(); this.yaml = YamlConfiguration.loadConfiguration(file); this.yaml.options().copyDefaults(true); this.yaml.addDefault("level", 1); this.reload(false, true); } catch (IOException ex) { //do something } }); } private void loadValues() { this.level = this.yaml.getInt("level", 1); } public void quit() { this.yaml.options().copyDefaults(true); this.yaml.set("level", this.level); this.reload(true, false); } private void reload(boolean async, boolean load) { if (async) { this.plugin.getServer().getScheduler().runTaskAsynchronously(this.plugin, () -> reload(load)); return; } reload(load); } private void reload(boolean load) { try { this.yaml.save(this.file); if (load) this.loadValues(); } catch (IOException ex) { //do something } } } package xyz.yooniks.simple.user; import lombok.Getter; import org.bukkit.entity.Player; import xyz.yooniks.simple.SimplePlugin; import java.util.UUID; public class User extends FlatUser { @Getter private final UUID uuid; public User(SimplePlugin plugin, Player player) { super(plugin, player.getUniqueId()); this.uuid = player.getUniqueId(); } } package xyz.yooniks.simple.listener; import lombok.AllArgsConstructor; import org.bukkit.ChatColor; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import xyz.yooniks.simple.SimplePlugin; import xyz.yooniks.simple.user.User; @AllArgsConstructor public class PlayerJoinQuit implements Listener { private final SimplePlugin plugin; @EventHandler public void onJoin(PlayerJoinEvent event) { final Player player = event.getPlayer(); final User user = this.plugin.getUserManager().getUser(player); this.plugin.getServer().getScheduler().runTaskLaterAsynchronously(this.plugin, () -> { if (player.isOnline()) { player.sendMessage(ChatColor.GREEN + "Twoj level: " + user.getLevel()); } }, 20L * 3); } @EventHandler public void onQuit(PlayerQuitEvent event) { plugin.getUserManager().remove(event); } } @edit wrzuc jeszcze to w onenable: if (!this.getDataFolder().exists()) { this.getDataFolder().mkdir(); } final File usersDir = new File(this.getDataFolder(), "users"); if (!usersDir.exists()) usersDir.mkdir(); Edytowane 7 maja 2018 przez yooniks Queito i KrejzolekPRO 1 1 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
0 Queito 104 Opublikowano 8 maja 2018 Autor Udostępnij Opublikowano 8 maja 2018 Close Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
0 bvcz 439 Opublikowano 8 maja 2018 Udostępnij Opublikowano 8 maja 2018 Problem został rozwiązany. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Pytanie
Queito 104
public class Listeners implements Listener{ @EventHandler public void PlayerRightClick(PlayerInteractEntityEvent e){ if(!(e.getRightClicked() instanceof Villager)){ return; } else { if(e.getRightClicked().getCustomName().equalsIgnoreCase("Wojownik")){ clickedEntity(e.getPlayer(), "Wojownik", e.getRightClicked().getLocation()); e.setCancelled(true); } else if (e.getRightClicked().getCustomName().equalsIgnoreCase("Mag")){ clickedEntity(e.getPlayer(), "Mag", e.getRightClicked().getLocation()); e.setCancelled(true); } else if (e.getRightClicked().getCustomName().equalsIgnoreCase("Lowca")){ clickedEntity(e.getPlayer(), "Lowca", e.getRightClicked().getLocation()); e.setCancelled(true); } } return; } private void clickedEntity(Player player, String string, Location loc){ File f = new File("plugins/VarRPG/Players/" + player.getPlayer().getName() + ".yml"); YamlConfiguration yamlFile = YamlConfiguration.loadConfiguration(f); if(yamlFile.getInt("Postac.Poziom") >= 5){ if(yamlFile.getString("Postac.Klasa") == null|| yamlFile.getString("Postac.Klasa") == "Proces tworzenia"||yamlFile.getString("Postac.Klasa") == "Chuj"){ yamlFile.set("Postac.Klasa", "Proces tworzenia"); File q = new File("plugins/VarRPG/Dialogi.yml"); YamlConfiguration fFile = YamlConfiguration.loadConfiguration(q); for(String msg : fFile.getStringList("Rozmowa_" + string)) { if(player.getLocation().distance(loc) <= 5){ player.sendMessage(msg); } else { player.sendMessage("Musisz podejsc blizej!"); return; } } } } } }
Robiąc plugin na klasy, mam problem. Próbując 2h szukać rozwiązania, nie udało się. Problem jest taki, że po kliknięciu na villagera, podwaja się wiadomość (msg). Tak po drodze, jakieś wskazówki na lepszy kod :P?
Odnośnik do komentarza
Udostępnij na innych stronach
6 odpowiedzi na to pytanie
Rekomendowane odpowiedzi