Register for your free account! | Forgot your password?

Go Back   elitepvpers > Other Online Games > Minecraft
You last visited: Today at 10:47

  • Please register to post and access all features, it's quick, easy and FREE!

 

PlayerRenderEvent?!

Closed Thread
 
Old   #1
 
elite*gold: 0
Join Date: Feb 2014
Posts: 48
Received Thanks: 0
Question PlayerRenderEvent?!

Hey Leute!

Ich suche gerade für mein neues Plugin ein Event, welches dann gefeuert wird, wenn ein Spieler sozusagen gerendert wird, bzw. wenn er sich in einem Radius befindet in welchem man ihn sieht...

Dieses soll aber nicht permanent gefeuert werdem wenn er sich in entsprechendem Radius bewegt, sondern nur wenn er das erste mal erscheint...

Wenn ihr Fragen habt fragt bitte, ich weis gerade nicht wie ich mein Problem besser beschreiben kann :/

Vielen Dank
LuisKillergurke



LuisKillergurke is offline  
Old   #2
Moderator

 
elite*gold: 558
Join Date: Feb 2010
Posts: 6,359
Received Thanks: 1,386
Soweit ich weiß gibt es kein Event, das deinen Wunsch erfüllt. Da wirst du dir wohl selber etwas zusammen basteln müssen.

Falls du uns erzählst was genau du damit vor hast, also wozu du diese Event brauchst, dann könnten wir mit etwas Glück noch einen anderen Lösungsweg für dich haben.


ComputerBaer is offline  
Old   #3
 
elite*gold: 0
Join Date: Feb 2014
Posts: 48
Received Thanks: 0
Es geht um ein Nickname-Plugin.
Ich sende jedem Spieler ein Packet NamedEntitySpawnPacket mit einem EntityHuman, und editiere das Feld "b" mit Reflections indem ich ein neues GameProfile mit entsprechendem Namen einfüge.

Dieses Packet "hält" aber nur bis der Spieler dem das Packet gesendet wurde aus der Sichtweite des umbenannten Spielers geht und wieder zurückkehrt.

Dann hat der umbenannte Spieler wieder sein Normales Nametag.

Falls es hilft, hier der Code:
Code:
public void ChangeName(final Player p, final String name, Player Send)
{
if(QuitMessage != null)
			{
				Bukkit.broadcastMessage(this.QuitMessage.replace("%p", p.getDisplayName()));
			}
			p.sendMessage("§7[§9Nick§7] §aDu bist nun kurz unsichtbar und wirst dannach in " + name + " umgenannt!");
			showPlayer(p);
			for(UUID id : players)
			{
				Bukkit.getPlayer(id).hidePlayer(p);
			}
			Bukkit.getScheduler().runTaskLaterAsynchronously(this, new Runnable()
			{
				
				@Override
				public void run()
				{
					p.setDisplayName(name + "§r");
					p.setPlayerListName(name);
					
					EntityHuman eh = ((CraftPlayer)p).getHandle();
					PacketPlayOutEntityDestroy d = new PacketPlayOutEntityDestroy(new int[]{p.getEntityId()});
					PacketPlayOutNamedEntitySpawn r = new PacketPlayOutNamedEntitySpawn(eh);
					try
					{
						if(JoinMessage != null)
						{
							Bukkit.broadcastMessage(JoinMessage.replace("%p", p.getDisplayName()));
						}
						java.lang.reflect.Field profileField = p20.getClass().getDeclaredField("b");
						profileField.setAccessible(true);
						GameProfile gp = new GameProfile(UUID.randomUUID(), name);
						profileField.set(r, gp);
						
						for(World w : Bukkit.getWorlds())
						{
							for(Player toSend : w.getPlayers())
							{
								if(toSend != p)
								{
									((CraftPlayer)toSend).getHandle().playerConnection.sendPacket(d);
									((CraftPlayer)toSend).getHandle().playerConnection.sendPacket(r);
								}
							}
						}
						
						p.sendMessage("§7[§9Nick§7] §aDu wurdest erfolgreich umbenannt und bist wieder sichtbar!");
					}
					catch (Exception ex)
					{
						Bukkit.broadcastMessage("§cError");
						ex.printStackTrace();
					}
					
				}
			}, 60L);
}
LuisKillergurke is offline  
Old   #4
Moderator

 
elite*gold: 558
Join Date: Feb 2010
Posts: 6,359
Received Thanks: 1,386
Kann falsch sein, ich denke aber es stimmt.

Sieh dir mal die ProtocolLib an, da solltest du ein Event zur Verfügung haben, das auf das Senden eines bestimmten Packets reagiert und dir die Möglichkeit bietet dieses zu bearbeiten.


ComputerBaer is offline  
Old   #5
 
elite*gold: 0
Join Date: Feb 2014
Posts: 48
Received Thanks: 0
Ok erstmal danke für die Hilfe
ProtocolLib hab ich nicht vor zu verwenden, aber dann arbeite ich halt mit MoveListener und ArrayLists.

Da alles geklärt ist kann der Thread geclosed werden ^^

Vielen Dank
LuisKillergurke
LuisKillergurke is offline  
Old   #6
Moderator

 
elite*gold: 558
Join Date: Feb 2010
Posts: 6,359
Received Thanks: 1,386
Da fällt mir grade noch etwas viel einfacheres ein: Wie wäre es mit dem DisplayName den du beim Player-Objekt ändern kannst?
ComputerBaer is offline  
Old   #7
 
elite*gold: 0
Join Date: Feb 2014
Posts: 48
Received Thanks: 0
Der DisplayName ändert bei meiner bisherigen Anwendungsweise (p.setDisplayName("name"); ) nur den Name im Chat...
Mein Ziel ist es aber den Name über dem Spieler zu ändern ^^
Vielleicht bin ich aber auch nur zu unfähig die Funktion zu verwenden, aber da ich extrem viel Recherchiert habe was das Thema nametag ändern angeht, hoffe ich nicht das dies der Fall ist xD
LuisKillergurke is offline  
Old   #8
 
elite*gold: 132
Join Date: Apr 2010
Posts: 2,862
Received Thanks: 2,005
Benutze einfach ProtocolLib und modifiziere damit ausgehende Player Spawn Pakete.

P.S. Ich kann dir jetzt schon sagen, dass deine Lösung in der 1.8 nicht funktionieren wird
Howaner is offline  
Old   #9
Moderator

 
elite*gold: 558
Join Date: Feb 2010
Posts: 6,359
Received Thanks: 1,386
Quote:
Originally Posted by LuisKillergurke View Post
Der DisplayName ändert bei meiner bisherigen Anwendungsweise (p.setDisplayName("name"); ) nur den Name im Chat...
Gut, das wusste ich nicht, da ich die Funktion noch nie verwendet habe und auch noch nie den Namen überm Kopf ändern wollte. Ich habe einfach nur geraten und wie es aussieht diesmal falsch.


Falls du jetzt noch mit Howaner über 1.8 diskutieren willst, dann kannst du das tun, deshalb lasse ich das Thema erstmal offen. Falls ich es schließen soll, verwende bitte den -Button.

Edit:
Howaner wird schon einen guten Grund haben soetwas zu sagen und die Wahrscheinlichkeit das es stimmt ist auch sehr hoch. Schließlich schreibt er an einer Serversoftware und bekommt dadurch Ändrungen am Protokoll sehr genau mit.
ComputerBaer is offline  
Old   #10
 
elite*gold: 0
Join Date: Feb 2014
Posts: 48
Received Thanks: 0
@ComputerBaer
Ok, vielen Dank

@Howaner
Ich möchte wirklich möglichst um ProtocolLib herumkommen, da ich es hasse mit API's zu arbeiten...
Ich finde das so wie wenn man sich nen Code aus dem Internet kopiert und ihn nicht im geringsten versteht...
Mir ist einfach wichtig zu wissen was ich tue, weil irgendwelche auch noch so guten API's können mir zwar die Arbeit erleichtern, lernen kann ich dabei aber wenig...
Auserdem möchte ich das Plugin auf einem Servernetzwerk einsetzen, und dort nicht auf jedem Server ProtocolLib installieren.

Vlt. schaue ich mir mal die ProtocolLib-source an und schnipsel mir dann was zusammen xD

Jetzt gibt es aber das Problem mit der 1.8...
Da der Server höchstwahrscheinlich sowieso erst in der 1.8 erscheint ist das ein ziemlich großes Problem...
Wird das ganze überhaupt noch gehen oder wird das wahrscheinlich komplett gefixed? Weil in der 1.8 kann man die Namen ja auch so ändern... bzw. irgendwann nach der 1.8 xD

Wenn ja, wird das ganze komplett geändert das man das komplett anders programmieren muss (z.B Keine entsprechenden Packets mehr vorhanden, das man das aus mehreren zusammenflicken muss), oder ist es eine kleine Änderung (wie z.B. das die GameProfile-Klasse neue Argumente braucht)?

Oh je viel zu tun xD

Ich freue mich wenn du mir helfen kannst, und hoffe das mein Text hier nicht unfreundlich wirkt, falls er das tut soll er das natürlich nicht :/

Vielen Dank aufjeden Fall schonmal für den Hinweis :P
MFG LuisKillergurke

PS: Mir fällt gerade ein: Neulich auf einem Server (Spigot 1.7 + 1.8) nahm ich einen Unsichtbarkeitstrank mit einem 1.7 Client, das Nametag wurde jedoch von allen 1.8 Clients gesehen... kann es sein das das die gleiche Ursache hat? xD
LuisKillergurke is offline  
Old   #11
Moderator

 
elite*gold: 558
Join Date: Feb 2010
Posts: 6,359
Received Thanks: 1,386
Quote:
Originally Posted by LuisKillergurke View Post
Ich möchte wirklich möglichst um ProtocolLib herumkommen, da ich es hasse mit API's zu arbeiten...
Ich finde das so wie wenn man sich nen Code aus dem Internet kopiert und ihn nicht im geringsten versteht...
Mir ist einfach wichtig zu wissen was ich tue, weil irgendwelche auch noch so guten API's können mir zwar die Arbeit erleichtern, lernen kann ich dabei aber wenig...
Bukkit ist auch eine API, weißt du da was du tust? Vielleicht solltest du MCP benutzen und Minecraft direkt bearbeiten, dann musst du wirklich alles verstehen was du tust.

Quote:
Originally Posted by LuisKillergurke View Post
Vlt. schaue ich mir mal die ProtocolLib-source an und schnipsel mir dann was zusammen xD
Auch das wäre eine Möglichkeit, aber ich würde es als unnötige Arbeit bezeichnen. Manchmal ist es ganz gut einfach das zu nehmen, was schon vorhanden ist - vorrausgesetzt natürlich es entspricht den Anforderungen, aber das ist hier ja der Fall.

Wenn du die ProtocolLib benutzt musst du dich nicht darum kümmern, dass die Events mit Version x funktionieren und die Pakete von Version x unterstützt werden. Du must lediglich darauf achten, dass du auch das richtige Paket für Version x bearbeitest.

Quote:
Originally Posted by LuisKillergurke View Post
Da der Server höchstwahrscheinlich sowieso erst in der 1.8 erscheint ist das ein ziemlich großes Problem...
Wird das ganze überhaupt noch gehen oder wird das wahrscheinlich komplett gefixed? Weil in der 1.8 kann man die Namen ja auch so ändern... bzw. irgendwann nach der 1.8 xD

Wenn ja, wird das ganze komplett geändert das man das komplett anders programmieren muss (z.B Keine entsprechenden Packets mehr vorhanden, das man das aus mehreren zusammenflicken muss), oder ist es eine kleine Änderung (wie z.B. das die GameProfile-Klasse neue Argumente braucht)?
Was soll gefixt werden? Das ein Plugin den Anzeigenamen verändern kann würde ich nicht als Bug ansehen. Aber gut, das muss wohl jeder für sich entscheiden.

Howaner hat vorhin einen kurzen Satz zu dem Thema zu mir gesagt. Der Name scheint mit 1.8 wohl mit der Tab-Liste zusammen zu hängen. Du müsstest also ein anderes Paket bearbeiten. Die genaue Beschreibung überlasse ich da aber mal lieber Howaner.

Quote:
Originally Posted by LuisKillergurke View Post
PS: Mir fällt gerade ein: Neulich auf einem Server (Spigot 1.7 + 1.8) nahm ich einen Unsichtbarkeitstrank mit einem 1.7 Client, das Nametag wurde jedoch von allen 1.8 Clients gesehen... kann es sein das das die gleiche Ursache hat? xD
Das könnte damit zusammen hängen, wenn Spigot nicht alle 1.8 Änderungen beachtet hat. Dann könnte es sein, dass den 1.8 Clients nicht mitgeteilt wird, das du unsichtbar bist. Kann aber genau so gut ein Bug in Minecraft selbst sein, ich habe es nicht näher untersucht. Vielleicht weiß Howaner hier auch mehr.
ComputerBaer is offline  
Thanks
1 User
Old   #12
 
elite*gold: 132
Join Date: Apr 2010
Posts: 2,862
Received Thanks: 2,005
Quote:
Originally Posted by LuisKillergurke View Post
@ComputerBaer
Ok, vielen Dank

@Howaner
Ich möchte wirklich möglichst um ProtocolLib herumkommen, da ich es hasse mit API's zu arbeiten...
Ich finde das so wie wenn man sich nen Code aus dem Internet kopiert und ihn nicht im geringsten versteht...
Mir ist einfach wichtig zu wissen was ich tue, weil irgendwelche auch noch so guten API's können mir zwar die Arbeit erleichtern, lernen kann ich dabei aber wenig...
Auserdem möchte ich das Plugin auf einem Servernetzwerk einsetzen, und dort nicht auf jedem Server ProtocolLib installieren.

Vlt. schaue ich mir mal die ProtocolLib-source an und schnipsel mir dann was zusammen xD
Du verwendest in einem einzelnen Plugin doch schon viele API's.
Die Bukkit API, die Java API, evtl. die Apache API, ...
Da ist es doch nicht schlimm, wenn man ProtocolLib verwendet.
Auch die großen Server wie Hive, GommeHD, Hypixel oder Mineplex verwenden ProtocolLib. Du kannst es auch ohne machen, da wird es aber sehr sehr schwierig werden.

Quote:
Originally Posted by LuisKillergurke View Post
PS: Mir fällt gerade ein: Neulich auf einem Server (Spigot 1.7 + 1.8) nahm ich einen Unsichtbarkeitstrank mit einem 1.7 Client, das Nametag wurde jedoch von allen 1.8 Clients gesehen... kann es sein das das die gleiche Ursache hat? xD
Meinst du mit Nametag den Namen über dem Spieler? Ich weiß nicht genau, wie der Unsichtbarkeitseffekt in Minecraft funktioniert. Der Effekt alleine genügt jedenfalls nicht. Könnte auch sein, dass es ein Minecraft Bug ist.

Bevor das Player Entity geschickt wird, wird das Player Info Paket geschickt. In diesem ist die UUID, der Name, die Properties (Skin, Cape, usw...) und der Custom Name (Tablisten Name) vorhanden.
->

Erst nach dem Player Info / List Paket wird das Player Spawn Paket geschickt.
In diesem ist die UUID, die Metadata und die Position des Spielers vorhanden (kein Name). Der Client überprüft dann, ob zu dieser UUID eine Player Info existiert. Wenn ja, zeigt er den Spieler mit dem übergebenem Namen im Player Info Paket an, wenn nicht, wird der Spieler unsichtbar sein.
->

D.h. Du musst mit ProtocolLib das Player Info Paket abfangen und verändern. Den Spieler kannst du durch die übergebene UUID herausbekommen.
Howaner is offline  
Thanks
1 User
Old   #13
 
elite*gold: 0
Join Date: Feb 2014
Posts: 48
Received Thanks: 0
Das Bukkit eine API ist habe ich irgendwie nicht ganz bedacht als ich diesen Post geschrieben habe...
Aber ihr habt mich nun aufjedenfall von ProtocolLib überzeugt, ich werde es nun damit machen

Vielen, vielen Dank für eure Hilfe!
Thread kann geclosed werden, ich drücke auch nochmal den Button.
Mit freundlichen Grüßen,
LuisKillergurke
LuisKillergurke is offline  
Old   #14
Moderator

 
elite*gold: 558
Join Date: Feb 2010
Posts: 6,359
Received Thanks: 1,386
Dann mache ich hier mal zu.


ComputerBaer is offline  
Closed Thread

Tags
bukkit, renderevent



« Previous Thread | Next Thread »



All times are GMT +1. The time now is 10:47.


Powered by vBulletin®
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Abuse
Copyright ©2018 elitepvpers All Rights Reserved.