Guten Tag
In diesem Post stelle ich eine Klasse vor, die FakePlayer ohne ProtocolLib erstellt.
Das war eines meiner Lieblingsthemen, die ich bisher in Spigot bzw. Bukkit behandelt habe und hoffe, dass ihr auch damit
Spass haben werdet.
Ich zeige euch die Basics und erkläre alles, was man zuerst braucht.
Das Basis Objekt, das wir erstellen müssen, ist das Paket selbst. Die PacketPlayOutPlayerInfo Klasse hat mehrere "Constructors". Der Constructor, den wir brauchen, ist der folgende.
Man kann sehen, dass das Paket mit einer "Aktion" erstellt wird. Diese Aktion sagt dem Client, was sie tun soll;wird das Paket Spieler erstellen, sie entfernen, ihren Ping aktualisieren, Gamemode oder den Anzeigenamen ändern, usw. Als nächstes gibt es eine "players" Variable. Das bedeutetet, dass man einen Spieler, mehrere Spieler mit einem Komma getrennt oder mit einer ArrayList, die Spieler enthält, hinzufügen kann. Das sind die Spieler, deren Informationen aktualisiert oder gesetzt werden.
Was übrig bleibt ist der EntityPlayer, den wir erstellen müssen, da der Constructor des Paket public ist und die Aktion des Enums auch.
EntityPlayer hat nur einen Constructor.
Das Spieler Objekt wird mit ein Paar Einstellungen über den Spieler selbst erstellt. Es benötigt den Server, eine Welt, das Profil vom Spieler und den "InteractManager". Das einzige was für uns wichtig ist, ist das Profil. Das ist die Einstellung, in der man UUID, Skin Daten und Ähnliches hinzufügen kann.
Die Parameter server, world und manager können einfach abgerufen werden, sodass das einzige, was wir erstellen müssen, das GameProfile ist.
Das ist der Constructor, den wir benutzen werden.
Das GameProfile Objekt wird mit einer UUID und einem Namen erstellt. Man kann eine zufällige UUID benutzen und den Namen so setzen, wie man ihn will. Aber wenn "name" mit einem echten Spieler, der existiert, zutrifft, werden die Scoreboard Attribute zu dem Spieler hinzugefügt.
Alles was man nun machen muss, ist dass man alles, was wir bisher gemacht haben, zusammenfügt.
Als erstes müssen wir das GameProfile erstellen.
Als nächstes wird das EntityPlayer Objekt erstellt.
Jetzt muss man nur noch das Paket erstellen:
Und ganz zum Schluss, wird das Paket an alle Spieler geschickt:
Um EntityPlayer Objekte einfacher zu machen, habe ich eine FakePlayer Klasse erstellt.
FakePlayer: http://pastebin.com/T5Atyjsd
Um diese Klasse zu benutzen, muss man nur das folgende machen:
Das erstellt einen "Ben", den wir auch oben erstellt haben, nur ein bisschen einfacher. 
Man kann aber auch mehr mit dieser Klasse erstellen. Man kann den Namen des Spielers, UUID, Gamemode und den Ping setzen.
Der folgende Code erstellt einen "Ben" mit dem Gamemode Spectator und den Ping 147:
Das wars, ich hoffe ihr habt bzw. werdet wie ich Spass damit haben und wenn es noch etwas gibt, lasst es mich wissen. Ich mochte es sehr, das zu lernen und wollte diese Erfahrung mit euch teilen. 
Freundliche Grüsse
trikeyyy
In diesem Post stelle ich eine Klasse vor, die FakePlayer ohne ProtocolLib erstellt.
Das war eines meiner Lieblingsthemen, die ich bisher in Spigot bzw. Bukkit behandelt habe und hoffe, dass ihr auch damit
Spass haben werdet.
Ich zeige euch die Basics und erkläre alles, was man zuerst braucht.
Das Basis Objekt, das wir erstellen müssen, ist das Paket selbst. Die PacketPlayOutPlayerInfo Klasse hat mehrere "Constructors". Der Constructor, den wir brauchen, ist der folgende.
Code:
PacketPlayOutPlayerInfo(EnumPlayerInfoAction action, EntityPlayer... players)
Man kann sehen, dass das Paket mit einer "Aktion" erstellt wird. Diese Aktion sagt dem Client, was sie tun soll;wird das Paket Spieler erstellen, sie entfernen, ihren Ping aktualisieren, Gamemode oder den Anzeigenamen ändern, usw. Als nächstes gibt es eine "players" Variable. Das bedeutetet, dass man einen Spieler, mehrere Spieler mit einem Komma getrennt oder mit einer ArrayList, die Spieler enthält, hinzufügen kann. Das sind die Spieler, deren Informationen aktualisiert oder gesetzt werden.
Was übrig bleibt ist der EntityPlayer, den wir erstellen müssen, da der Constructor des Paket public ist und die Aktion des Enums auch.
EntityPlayer hat nur einen Constructor.
Code:
EntityPlayer(MinecraftServer server, WorldServer world, GameProfile profile, PlayerInteractManager manager)
Die Parameter server, world und manager können einfach abgerufen werden, sodass das einzige, was wir erstellen müssen, das GameProfile ist.
Das ist der Constructor, den wir benutzen werden.
Code:
GameProfile(UUID id, String name)
Alles was man nun machen muss, ist dass man alles, was wir bisher gemacht haben, zusammenfügt.
Als erstes müssen wir das GameProfile erstellen.
Code:
GameProfile profile = new GameProfile(UUID.randomUUID(), "Ben");
// Erstellt ein neues GameProfile mit einer zufälligen UUID und dem Namen "Ben".
Code:
MinecraftServer server = MinecraftServer.getServer();
// Übergibt das Minecraft Server Objekt, was als Parameter benötigt wird
WorldServer world = server.getWorldServer(0);
// Übergibt den WorldServer für die Oberwelt (0). Wird auch benötigt.
PlayerInteractManager manager = new PlayerInteractManager(world);
// Erstellt einen neuen PlayerInteractManager für die Oberwelt. Wird auch benötigt.
EntityPlayer player = new EntityPlayer(server, world, profile, manager);
// Schlussendlich wird das EntityPlayer Objekt mit all den vorherigen Teilen erstellt.
Code:
PacketPlayOutPlayerInfo packet = new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.ADD_PLAYER, player);
// Erstell ein Paket, das den "player" zu der Tablist hinzufügen wird.
Code:
for(Player online : Bukkit.getOnlinePlayers()) {
((CraftPlayer) online).getHandle().playerConnection.sendPacket(packet);
}
// Für jeden Spieler, der online ist, wird zu einem CraftPlayer "gecastet", holt deren Handle, daraus ihre PlayerConnection und sendet das Paket, das wir erstellt haben.
FakePlayer: http://pastebin.com/T5Atyjsd
Um diese Klasse zu benutzen, muss man nur das folgende machen:
Code:
EntityPlayer player = new FakePlayer("Ben").create();
Man kann aber auch mehr mit dieser Klasse erstellen. Man kann den Namen des Spielers, UUID, Gamemode und den Ping setzen.
Der folgende Code erstellt einen "Ben" mit dem Gamemode Spectator und den Ping 147:
Code:
EntityPlayer player = new FakePlayer("Ben").withGameMode(EnumGamemode.SPECTATOR).withPing(147).create();
Freundliche Grüsse
trikeyyy