Skocz do zawartości
  • 0

Doubluje się :v


Queito
 Udostępnij

Pytanie

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

  • 1

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.

Odnośnik do komentarza
Udostępnij na innych stronach

  • 0
				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 przez yooniks
Odnośnik do komentarza
Udostępnij na innych stronach

  • 0

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 :D

Edytowane przez Queito
Odnośnik do komentarza
Udostępnij na innych stronach

  • 0
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 :D

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 przez yooniks
Odnośnik do komentarza
Udostępnij na innych stronach

Nieaktywny
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
 Udostępnij

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...