Skocz do zawartości
  • 0

PlayerDeathEvent


Pytanie

Czesc napotkałem mały problem z takim o to kodem:

 

	public void onPlayerDeath(PlayerDeathEvent e){
		Player v = (Player) e.getEntity();
		Player p = (Player) v.getKiller();
		World getworld = p.getWorld();
		World world2 = Bukkit.getServer().getWorld("standard");
		if(getworld == world2){
			if(bitwa.get(v) == p){
				tag.remove(v);
				bitwa.remove(v);
				tag.remove(p);
				bitwa.remove(p);
				Bukkit.broadcastMessage(ChatColor.GOLD + "Gracz " + v.getName() + " zostal pokonany przez " + p.getName());
				showAllPlayers(v);
				showAllPlayers(p);
			}
		}
	}

Dokładnie to nie działa po prostu wysylanie wiadomosci na czacie i ogolnie nie dziala wszystko z tych kolumn czyli tag.remove(v); itd..

Odnośnik do komentarza
https://skript.pl/temat/25570-playerdeathevent/
Udostępnij na innych stronach

5 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0

nie porównuj obiektów za pomocą == tylko użyj .equals()

 

A ten listener ma odpowiednią adnotację @EventHandler ? Oraz jest zarejestrowany?
Dodatkowo pamiętaj że v.getKiller może zwrócić nulla.

Odnośnik do komentarza
https://skript.pl/temat/25570-playerdeathevent/#findComment-168990
Udostępnij na innych stronach

  • 0

Teraz mam inny problem. Zrobilem tak jak powiedzial @GotoFinal wszystko dziala poprawnie lecz gdy chce znowu z tym samym graczem walczyc to wysyla zaproszenie ale juz nie odlicza i nie mozna sie bic. Moge wyslac caly kod.

 

package me.jms.standard;

import java.util.HashMap;

import net.md_5.bungee.api.ChatColor;

import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.PlayerDeathEvent;

public class Standard implements Listener{
	
	private int i = 5;
	private int TaskID;

	private HashMap<Player, Player> tag = new HashMap<Player, Player>();
	private HashMap<Player, Player> bitwa = new HashMap<Player, Player>();
	
	@SuppressWarnings("deprecation")
	@EventHandler
	public void onEntityDamage(EntityDamageByEntityEvent e){
		if(e.getEntity() instanceof Player && e.getDamager() instanceof Player){
			Player hit = (Player) e.getEntity();
			Player damager = (Player) e.getDamager();
			World getworld = damager.getWorld();
			World world2 = Bukkit.getServer().getWorld("standard");
			if(getworld == world2){
				if(tag.get(hit) != damager){
					tag.put(hit, damager);
					damager.sendMessage(ChatColor.GOLD + "Wyslales " + hit.getName() + " zaproszenie do walki");
					hit.sendMessage(ChatColor.GOLD + "Gracz " + damager.getName() + " wyslal ci zaproszenie do walki");
				}
				if(bitwa.get(hit) != null && tag.get(hit) != null){
					e.setCancelled(false);
				}else {
					e.setCancelled(true);
				}
				if(tag.get(hit) == damager){
					if(tag.get(damager) == hit){
						TaskID = Bukkit.getScheduler().scheduleAsyncRepeatingTask(Main.getInst(), new Runnable(){
							public void run(){
								if(!(i <= -1)){
									if(i == 0){
										hideAllPlayers(damager);
										hideAllPlayers(hit);
										hit.showPlayer(damager);
										damager.showPlayer(hit);
										Bukkit.getScheduler().cancelTask(TaskID);
										hit.sendMessage(ChatColor.GOLD + "Walka sie rozpoczela!");
										damager.sendMessage(ChatColor.GOLD + "Walka sie rozpoczela!");
										bitwa.put(hit, damager);
										bitwa.put(damager, hit);
										i--;
									} else{
										hit.sendMessage(ChatColor.GOLD + "Walka z " + ChatColor.BOLD + damager.getName() + ChatColor.GOLD + " rozpocznie sie za: " + ChatColor.GREEN + i);
										damager.sendMessage(ChatColor.GOLD + "Walka z " + ChatColor.BOLD + hit.getName() + ChatColor.GOLD + " rozpocznie sie za: " + ChatColor.GREEN + i);
										i--;
									}
								}
							}
						}, 0, 20);
					}
				}
			}
		}
	}
	@EventHandler
	public void onPlayerDeath(PlayerDeathEvent e){
		Player v = (Player) e.getEntity();
		Player p = (Player) v.getKiller();
		World getworld = p.getWorld();
		World world2 = Bukkit.getServer().getWorld("standard");
		if(getworld == world2){
			if(bitwa.get(v).equals(p)){
				tag.remove(v);
				tag.remove(p);
				bitwa.remove(v);
				bitwa.remove(p);
				Bukkit.broadcastMessage(ChatColor.GOLD + "Gracz " + v.getName() + " zostal pokonany przez " + p.getName());
				showAllPlayers(v);
				showAllPlayers(p);
			}
		}
	}
	public void hideAllPlayers(Player player){
		for (Player p : Bukkit.getOnlinePlayers())
			player.hidePlayer(p);
	}
	public void showAllPlayers(Player player){
		for (Player p : Bukkit.getOnlinePlayers())
			player.showPlayer(p);
	}
}

 

 

Odnośnik do komentarza
https://skript.pl/temat/25570-playerdeathevent/#findComment-168996
Udostępnij na innych stronach

  • 0

Po co ci TaskID skoro tego nigdzie nie uzywasz, metody show i hide allPlayers niepotrzebnie są publiczne

	@EventHandler
	public void onEntityDamage(EntityDamageByEntityEvent e){
		if(e.getEntity() instanceof Player && e.getDamager() instanceof Player){
			Player hit = (Player) e.getEntity();
			Player damager = (Player) e.getDamager();
			World getworld = damager.getWorld();
			World world2 = Bukkit.getServer().getWorld("standard");

world2 moze zwrocic nulla, 

	@EventHandler
	public void onPlayerDeath(PlayerDeathEvent e){
		Player v = (Player) e.getEntity();
		Player p = (Player) v.getKiller();
		World getworld = p.getWorld();
		World world2 = Bukkit.getServer().getWorld("standard");
		if(getworld == world2){

i e.getEntity().getKiller() moze tez zwrocic nulla, (world2 tak samo),

		final World playerWorld = p.getWorld();
		if(playerWorld.getName().equalsIgnoreCase("standard")) { //cos takiego bedzie lepsze

 

I te mapki zmien z hashmap na concurrenthashmap 

 

no a co do twojego 'niedzialajacego odliczania' to problemem moze byc 

	private int i = 5;

bo to jest dla kazdego taska, a w dodatku nie zmieniasz pozniej tej wartosci znow na 5 tylko siedzi na 0, nie rob od razu takich trudniejszych rzeczy bo bedziesz mial jedynie bugi na serwerze, zaczynaj od czegos prostszego

 

@edit: jednak uzywasz taskID, nie patrzylem na caly kod :>, i co do concurrenthashmap to tez nie moze byc bo nie moze zawierac null klucza, a ty chcesz jednak zrobic cos innego niz myslalem 

Edytowane przez yooniks
Odnośnik do komentarza
https://skript.pl/temat/25570-playerdeathevent/#findComment-169072
Udostępnij na innych stronach

  • 0

jak robisz takie mapki po graczach to musisz też usuwać te dane w PlayerQuitEvent inaczej będziesz miał wycieki pomięci. (musisz usunąć wszystkie pary gdzie gracz który wyszedł jest albo kluczem, albo wartością) a zamiast 

bitwa.get(hit) != null

można użyć bitwa.containsKey(hit)

 

Dodatkowo raczej powinieneś nazywać wszystko po angielsku, żeby nie mieszać języków w kodzie bo to nie ma sensu i brzydko wygląda. no i nie nazywać zmiennych z dużej litery jak "TaskID"

A tak to nie wiem jak ma działać ten twój kod, więc trudno mi powiedzieć dlaczego nie działa... opisz coś więcej co robisz i jak ma to działać, bo kod piszesz na tyle brzydki że trudno coś zrozumieć.

@yooniks

Używa tego id taska...

 

I nie powinien nic zmieniać na concurrenthashmap, tylko tamten task nie powinien być async @JanekMaSkrypta_ zamiast scheduleAsyncRepeatingTask powinno być po prostu runTaskTimer

Odnośnik do komentarza
https://skript.pl/temat/25570-playerdeathevent/#findComment-169073
Udostępnij na innych stronach

Nieaktywny
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
  • Ostatnio przeglądający   0 użytkowników

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