Skocz do zawartości
  • 0

EntityDamageByEntityEvent i obrażenia z łuku ?


Pytanie

Witam.

Potrzebuję zablokować obrażenia zadawane z łuku.

Mam taki kod:

Spoiler

public class DamageEvent implements Listener{
	
    @EventHandler
	public void playerDamage(EntityDamageByEntityEvent e) {
		Player p = (Player) e.getEntity();
		String pn = p.getName();
		String tag1 = (String) Main.mysql.getRecord("players", "tag", "`pl` = '" + pn + "'");
		if (e.getDamager() instanceof Player) {
			Player d = (Player) e.getDamager();
			String dn = d.getName();
			String tag2 = (String) Main.mysql.getRecord("players", "tag", "`pl` = '" + dn + "'");
		if (tag1.equalsIgnoreCase(tag2)) {
			e.setCancelled(true);
			d.sendMessage(ChatColor.RED + "Czlonkowie klanu nie moga ze soba walczyc!");
		}
		else {
			
		}
	 }
		else {
			
		}
	}
}

 

Jak widać kod pobiera wartości z bazy danych i jeśli są identyczne ma blokować zadawanie obrażeń. Problem w tym że jeśli obrażenia zadane są łukiem bądź potką to obiekt Damager nie jest graczem tylko Entity.  I zastanawiam się jak w takiej sytuacji to rozwiązać.

Odnośnik do komentarza
https://skript.pl/temat/22389-entitydamagebyentityevent-i-obra%C5%BCenia-z-%C5%82uku/
Udostępnij na innych stronach

16 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 1

po co ci te puste else.

A tak to strzała czy potka to też Entity, więc attacker w typ wypadku to np Strzała, lub bardziej abstrakcyjnie - Projectile - czyli dowolne taki obiekt-pocisk - w tym potka, o ile trafi gracza. I z takiego Projectile może pobrać kto go wystrzelił, za pomocą metody getShooter, tylko pamiętaj że to zwraca dopiero obiekt ProjectileSource, bo to nie musi być gracz, to moze być np dispenser, czy szkielet, więc musisz sprawdzić czy to jest instanceof Player

Z potkami są osobne eventy, jak chyba PotionSplashEvent i takie tam inne, i wtedy też musisz pobrać potkę, kto ją rzucił, kto oberwać, zobaczyć jakie są efekty - bo mogą byc przecież pozytywne. I zdecydować jak to blokować, bo nie musisz anulować eventu, możesz tylko usunąć efekty negatywne dla tej samej drużyny, tak samo pozytywne dla przeciwnej jeśli chcesz.

Odnośnik do komentarza
https://skript.pl/temat/22389-entitydamagebyentityevent-i-obra%C5%BCenia-z-%C5%82uku/#findComment-152452
Udostępnij na innych stronach

  • 0
	@EventHandler(priority=EventPriority.HIGHEST)
	public void onDamage(EntityDamageByEntityEvent e) {
		if(e.isCancelled()) {
			return;
		}
		boolean initPVP = false;
		Entity victimEntity = e.getEntity();
		Entity attackerEntity = e.getDamager();
		if(attackerEntity != null && victimEntity != null) {
			if(attackerEntity instanceof TNTPrimed) return;
			if(attackerEntity instanceof Projectile) {
				if(!(victimEntity instanceof Player)) return;
				attackerEntity = (Entity) ((Projectile) attackerEntity).getShooter();
			}
			if(attackerEntity instanceof Player) {
				if(!(victimEntity instanceof Player)) return;
				initPVP = true;
			}
		}
		if(initPVP == true) {
			if(!(victimEntity instanceof Player) || !(attackerEntity instanceof Player)) return;
			if(attackerEntity.equals(victimEntity)) return;
			
			Player victim = (Player) victimEntity;
			Player attacker = (Player) attackerEntity;
		}
		
	}

 

Odnośnik do komentarza
https://skript.pl/temat/22389-entitydamagebyentityevent-i-obra%C5%BCenia-z-%C5%82uku/#findComment-152467
Udostępnij na innych stronach

  • 0
8 minut temu, Inder00 napisał:

	@EventHandler(priority=EventPriority.HIGHEST)
	public void onDamage(EntityDamageByEntityEvent e) {
		if(e.isCancelled()) {
			return;
		}
		boolean initPVP = false;
		Entity victimEntity = e.getEntity();
		Entity attackerEntity = e.getDamager();
		if(attackerEntity != null && victimEntity != null) {
			if(attackerEntity instanceof TNTPrimed) return;
			if(attackerEntity instanceof Projectile) {
				if(!(victimEntity instanceof Player)) return;
				attackerEntity = (Entity) ((Projectile) attackerEntity).getShooter();
			}
			if(attackerEntity instanceof Player) {
				if(!(victimEntity instanceof Player)) return;
				initPVP = true;
			}
		}
		if(initPVP == true) {
			if(!(victimEntity instanceof Player) || !(attackerEntity instanceof Player)) return;
			if(attackerEntity.equals(victimEntity)) return;
			
			Player victim = (Player) victimEntity;
			Player attacker = (Player) attackerEntity;
		}
		
	}

 

nie wklejaj gotowego kodu i do tego z błędami... bo to nie ma sensu, nie dośc że się niczego nie nauczy, to jeszcze będzie miał z.. popsuty i niedziałający kod.

attackerEntity = (Entity) ((Projectile) attackerEntity).getShooter();

Skąd wiesz że to Entity...?

Odnośnik do komentarza
https://skript.pl/temat/22389-entitydamagebyentityevent-i-obra%C5%BCenia-z-%C5%82uku/#findComment-152469
Udostępnij na innych stronach

  • 0
9 minut temu, GotoFinal napisał:

nie wklejaj gotowego kodu i do tego z błędami... bo to nie ma sensu, nie dośc że się niczego nie nauczy, to jeszcze będzie miał z.. popsuty i niedziałający kod.


attackerEntity = (Entity) ((Projectile) attackerEntity).getShooter();

Skąd wiesz że to Entity...?

Ponieważ, strzelać ktoś musi lol ? 

Odnośnik do komentarza
https://skript.pl/temat/22389-entitydamagebyentityevent-i-obra%C5%BCenia-z-%C5%82uku/#findComment-152474
Udostępnij na innych stronach

  • 0
Godzinę temu, Inder00 napisał:

	@EventHandler(priority=EventPriority.HIGHEST)
	public void onDamage(EntityDamageByEntityEvent e) {
		if(e.isCancelled()) {
			return;
		}
		boolean initPVP = false;
		Entity victimEntity = e.getEntity();
		Entity attackerEntity = e.getDamager();
		if(attackerEntity != null && victimEntity != null) {
			if(attackerEntity instanceof TNTPrimed) return;
			if(attackerEntity instanceof Projectile) {
				if(!(victimEntity instanceof Player)) return;
				attackerEntity = (Entity) ((Projectile) attackerEntity).getShooter();
			}
			if(attackerEntity instanceof Player) {
				if(!(victimEntity instanceof Player)) return;
				initPVP = true;
			}
		}
		if(initPVP == true) {
			if(!(victimEntity instanceof Player) || !(attackerEntity instanceof Player)) return;
			if(attackerEntity.equals(victimEntity)) return;
			
			Player victim = (Player) victimEntity;
			Player attacker = (Player) attackerEntity;
		}
		
	}

 

Sam już napisałem :P Ale dzięki za chęci.

@Edit

Poradziłem sobie z łukiem, ale nie wiem jak poradzić sobie z potkiem. Tj. sprawdzić jakiego typu on jest.

@Edit Again xD

Już nie ważnie nie ogarnąłem że to ma być oddzielny event :D

 

Edytowane przez Arczi98
Odnośnik do komentarza
https://skript.pl/temat/22389-entitydamagebyentityevent-i-obra%C5%BCenia-z-%C5%82uku/#findComment-152477
Udostępnij na innych stronach

  • 0
41 minut temu, Inder00 napisał:

Ponieważ, strzelać ktoś musi lol ? 

ale to może być wszystko co implementuje ten interfejs, np blok - dispenser, a to nie jest entity... do tego plugin może np strzelać strzałami z cegoś własnego - też może od tego wykonać ten event, więc takie castowanie jest zwyczajnie błędne i będzie crashować.

Odnośnik do komentarza
https://skript.pl/temat/22389-entitydamagebyentityevent-i-obra%C5%BCenia-z-%C5%82uku/#findComment-152483
Udostępnij na innych stronach

  • 0

No dobra teraz mam taki problem:

Spoiler

public class PotionEvent implements Listener {

	@EventHandler
	public void potionSplash(PotionSplashEvent e ) {
		if (e.getEntity() instanceof Player ) {
			if(e.getPotion().getShooter() instanceof Player) {
				PotionEffect ef = (PotionEffect) e.getPotion().getEffects();
				String pn = e.getEntity().getName();
				String adn = ((HumanEntity) e.getPotion().getShooter()).getName();
				Player ad = (Player) e.getPotion().getShooter();
				if (!(Main.mysql.getRecord("players", "tag", "`pl` = '" + adn + "'") == null)) {
				String tag1 = (String) Main.mysql.getRecord("players", "tag", "`pl` = '" + pn + "'");
				String tag2 = (String) Main.mysql.getRecord("players", "tag", "`pl` = '" + adn + "'");
				if (tag1.equalsIgnoreCase(tag2)) {
					if(ef.getType() == PotionEffectType.POISON) {
						e.setCancelled(true);
						ad.sendMessage(ChatColor.RED + "Nie mozesz atakowac czlonkow swojego klanu!");
					}
					else if (ef.getType() == PotionEffectType.HARM) {
						e.setCancelled(true);
						ad.sendMessage(ChatColor.RED + "Nie mozesz atakowac czlonkow swojego klanu!");
					}
				}
		   }
		}
	}
  }	

 

Gracz nadal otrzymuje obrażenia od potków.

Odnośnik do komentarza
https://skript.pl/temat/22389-entitydamagebyentityevent-i-obra%C5%BCenia-z-%C5%82uku/#findComment-152486
Udostępnij na innych stronach

  • 0
17 minut temu, Arczi98 napisał:

No dobra teraz mam taki problem:

  Ukryj zawartość


public class PotionEvent implements Listener {

	@EventHandler
	public void potionSplash(PotionSplashEvent e ) {
		if (e.getEntity() instanceof Player ) {
			if(e.getPotion().getShooter() instanceof Player) {
				PotionEffect ef = (PotionEffect) e.getPotion().getEffects();
				String pn = e.getEntity().getName();
				String adn = ((HumanEntity) e.getPotion().getShooter()).getName();
				Player ad = (Player) e.getPotion().getShooter();
				if (!(Main.mysql.getRecord("players", "tag", "`pl` = '" + adn + "'") == null)) {
				String tag1 = (String) Main.mysql.getRecord("players", "tag", "`pl` = '" + pn + "'");
				String tag2 = (String) Main.mysql.getRecord("players", "tag", "`pl` = '" + adn + "'");
				if (tag1.equalsIgnoreCase(tag2)) {
					if(ef.getType() == PotionEffectType.POISON) {
						e.setCancelled(true);
						ad.sendMessage(ChatColor.RED + "Nie mozesz atakowac czlonkow swojego klanu!");
					}
					else if (ef.getType() == PotionEffectType.HARM) {
						e.setCancelled(true);
						ad.sendMessage(ChatColor.RED + "Nie mozesz atakowac czlonkow swojego klanu!");
					}
				}
		   }
		}
	}
  }	

 

Gracz nadal otrzymuje obrażenia od potków.

nie nazywaj zmiennych takimi skrótowcami, od tego masz IDE by mało pisać i ci te nazwy podpowiadało, a tylko utrudnia czytanie jak nagle widzisz uzycie jakis pn pg ec dt er itd.

A tak... nie używaj bazy danych w eventach, przecież na czas połączenie zatrzymasz cały serwer! a co dopiero jak robisz kilka zapytań zamiast jednego...
A co do samego błędu... wina peirwszego ifa, .getEntity w potion splash event też zwraca potka. 
Potki mogą uderzyć w wielu graczy lub moby, więc jest specjalna metoda co zwraca ich listę:
https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/event/entity/PotionSplashEvent.html#getAffectedEntities--

zauważ że jest też metoda https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/event/entity/PotionSplashEvent.html#setIntensity-org.bukkit.entity.LivingEntity-double- więc możesz dla każdego wybranego entity ustawić jak mocni oberwał.

Edytowane przez GotoFinal
Odnośnik do komentarza
https://skript.pl/temat/22389-entitydamagebyentityevent-i-obra%C5%BCenia-z-%C5%82uku/#findComment-152489
Udostępnij na innych stronach

  • 0
21 minut temu, GotoFinal napisał:

nie nazywaj zmiennych takimi skrótowcami, od tego masz IDE by mało pisać i ci te nazwy podpowiadało, a tylko utrudnia czytanie jak nagle widzisz uzycie jakis pn pg ec dt er itd.

A tak... nie używaj bazy danych w eventach, przecież na czas połączenie zatrzymasz cały serwer! a co dopiero jak robisz kilka zapytań zamiast jednego...
A co do samego błędu... wina peirwszego ifa, .getEntity w potion splash event też zwraca potka. 
Potki mogą uderzyć w wielu graczy lub moby, więc jest specjalna metoda co zwraca ich listę:
https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/event/entity/PotionSplashEvent.html#getAffectedEntities--

zauważ że jest też metoda https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/event/entity/PotionSplashEvent.html#setIntensity-org.bukkit.entity.LivingEntity-double- więc możesz dla każdego wybranego entity ustawić jak mocni oberwał.

Muszę używać bazy danych bo inaczej nie mam sposobu aby sprawdzić czy obie osoby są z tego samego klanu :)

A co do pierwszego ifa to zauważyłem to samo w czasie debugowania :D

No dobra w takim razie nie dam rady zablokować potków. No trudno :D

Co do tych skrótów to mi jest tak wygodnie. Łatwiej mi napisać np pn niz playername :/

Edytowane przez Arczi98
Odnośnik do komentarza
https://skript.pl/temat/22389-entitydamagebyentityevent-i-obra%C5%BCenia-z-%C5%82uku/#findComment-152490
Udostępnij na innych stronach

  • 0
16 minut temu, Arczi98 napisał:

Muszę używać bazy danych bo inaczej nie mam sposobu aby sprawdzić czy obie osoby są z tego samego klanu :)

A co do pierwszego ifa to zauważyłem to samo w czasie debugowania :D

No dobra w takim razie nie dam rady zablokować potków. No trudno :D

Co do tych skrótów to mi jest tak wygodnie. Łatwiej mi napisać np pn niz playername :/

nie, nie musisz (a wręcz nie możesz bo każdy taki event będzie ci zatrzymywał serwer na kilka ms, więc 10-20 graczy i będziesz miał 0tps), przecież możesz te dane trzymać w pamięci.... 

I czemu nie dasz rady zablokować potków wtedy? toż to się da, tylko trzeba każde te entity z listy sprawdzić i blokować dla wybranych tamtą metodą co podałem.

Ale kod jest wtedy nieczytelny z takimi skrótami, pobierz sobie porządne ide :D polecam naukę Intellij jmy1x8o.png

Samo podpowiada takie nazwy :D i ogólnie pisząc tę linijkę musiłem tylko kliknąć p.N <enter> .v <enter> wybrać  (wtedy podpowiada .var i robi z tego zmienną w kodzie, więc całego początku "String playerName" nie muszę pisać) nazwę strzałką i enter, mniej wciśnięć niż w takim eclipse, a kod lepiej opisany

Edytowane przez GotoFinal
Odnośnik do komentarza
https://skript.pl/temat/22389-entitydamagebyentityevent-i-obra%C5%BCenia-z-%C5%82uku/#findComment-152493
Udostępnij na innych stronach

  • 0
1 minutę temu, GotoFinal napisał:

nie, nie musisz (a wręcz nie możesz bo każdy taki event będzie ci zatrzymywał serwer na kilka ms, więc 10-20 graczy i będziesz miał 0tps), przecież możesz te dane trzymać w pamięci.... 

I czemu nie dasz rady zablokować potków wtedy? toż to się da, tylko trzeba każde te entity z listy sprawdzić i blokować dla wybranych tamtą metodą co podałem.

Ale kod jest wtedy nieczytelny z takimi skrótami, pobierz sobie porządne ide :D polecam naukę Intellij jmy1x8o.png

Samo podpowiada takie nazwy :D i ogólnie pisząc tę linijkę musiłem tylko kliknąć p.N <enter> .v <enter> wybrać nazwę strzałką i enter

Nie chce mi się z tym bawić :D Niech mają a co mi tam xD

Jak będę trzymał w pamięci to i tak co restart serwera będę je musiał pobrać :P

Odnośnik do komentarza
https://skript.pl/temat/22389-entitydamagebyentityevent-i-obra%C5%BCenia-z-%C5%82uku/#findComment-152494
Udostępnij na innych stronach

  • 0
1 minutę temu, Arczi98 napisał:

Nie chce mi się z tym bawić :D Niech mają a co mi tam xD

Jak będę trzymał w pamięci to i tak co restart serwera będę je musiał pobrać :P

no ale wtedy je pobierasz tylko raz i to podczas ładowania serwera, więc nikogo jeszcze wtedy nie ma, no i możesz wtedy pobrać wszystkie na raz jednym zapytaniem.

Odnośnik do komentarza
https://skript.pl/temat/22389-entitydamagebyentityevent-i-obra%C5%BCenia-z-%C5%82uku/#findComment-152495
Udostępnij na innych stronach

  • 0
Teraz, GotoFinal napisał:

no ale wtedy je pobierasz tylko raz i to podczas ładowania serwera, więc nikogo jeszcze wtedy nie ma, no i możesz wtedy pobrać wszystkie na raz jednym zapytaniem.

W sumie dobre rozwiązanie ale ja nie ogarniam w ogóle jak to zrobić. Tj mam na myśli hashmapy xD

Odnośnik do komentarza
https://skript.pl/temat/22389-entitydamagebyentityevent-i-obra%C5%BCenia-z-%C5%82uku/#findComment-152496
Udostępnij na innych stronach

  • 0
Teraz, Arczi98 napisał:

W sumie dobre rozwiązanie ale ja nie ogarniam w ogóle jak to zrobić. Tj mam na myśli hashmapy xD

to nie twórz takiego pluginu z bazą danych, bo nawet nie chcesz się tego nauczyć tylko zostawasz jak jest pomimo ze to nie będzie działać.

Odnośnik do komentarza
https://skript.pl/temat/22389-entitydamagebyentityevent-i-obra%C5%BCenia-z-%C5%82uku/#findComment-152497
Udostępnij na innych stronach

  • 0
Teraz, GotoFinal napisał:

to nie twórz takiego pluginu z bazą danych, bo nawet nie chcesz się tego nauczyć tylko zostawasz jak jest pomimo ze to nie będzie działać.

A czy ja powiedziałem że tak zostawię ? :D

A poza tym to działa tak jak miało. Blokadę potków chciałem dac dodatkowo :D

Edytowane przez Arczi98
Odnośnik do komentarza
https://skript.pl/temat/22389-entitydamagebyentityevent-i-obra%C5%BCenia-z-%C5%82uku/#findComment-152498
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ę...