You are not logged in.

  • Login
Bitte besucht unser neues Forum unter https://forum.nitrado.net | Please visit our new Forum at https://forum.nitrado.net

Merkurius98

User / Kunde

  • "Merkurius98" started this thread

Posts: 20

  • Send private message

1

Friday, April 21st 2017, 5:08pm

[NPC] Fake Player Code funktioniert nicht in der 1.11

Hey, ich versuche aktuell mich an einem Plugin, welches Fakeplayer benötigt.
Ziel ist es mit packages einen NPC zu erstellen und diesem mit eingespeicherten Value und Signaturewerten ihm einen Skin zu geben (z.B. von Notch).
Das Plugin soll in der Minecraft Version 1.11.2 laufen und ich benutze aktuell eine Spigot dafür.
Das Problem ist, dass bei folgenden Source Code nichts passiert (bis auf die Nachricht beim Befehl ...)
Hoffe um Hilfe.


Hier die Klasse um das Package für den NPC zu erstellen und jedem Spieler zu schicken:

Java source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class NPC extends Reflections {
	
static int entityID;
Location location;
GameProfile gameprofile;


public NPC(String name,Location location){
entityID = (int)Math.ceil(Math.random() * 1000) + 2000;
gameprofile = new GameProfile(UUID.randomUUID(), name);
this.location = location;
}

public void spawn(){
PacketPlayOutNamedEntitySpawn packet = new PacketPlayOutNamedEntitySpawn();

setValue(packet, "a", entityID);
setValue(packet, "b", gameprofile.getId());
setValue(packet, "c", location.getX());
setValue(packet, "d", location.getY());
setValue(packet, "e", location.getZ());
setValue(packet, "f", (byte) location.getYaw());
setValue(packet, "g", (byte) location.getYaw());

DataWatcher w = new DataWatcher(null);
w.register(new DataWatcherObject<>(6, DataWatcherRegistry.c), (float) 20);
w.register(new DataWatcherObject<>(10, DataWatcherRegistry.a), (byte) 127);
setValue(packet, "h", w);
sendPacket(packet);
}

public void destroy(){
PacketPlayOutEntityDestroy packet = new PacketPlayOutEntityDestroy(new int[] {entityID});
sendPacket(packet);
}


}


und hier der Code um den NPC per Befehl zu spawnen:



Java source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
if (cmd.getName().equalsIgnoreCase("npc")){
if(args.length == 3){
if(sender instanceof Player){

if(p.isOp()){
if(args[0].equalsIgnoreCase("spawn")){

File filenpc = new File ("plugins/RPGsystem","npc.yml");
final FileConfiguration cfgnpc = YamlConfiguration.loadConfiguration(filenpc); 

GameProfile snap = new GameProfile(UUID.randomUUID(), "yolo");

try{
snap = GameProfileBuilder.fetch(UUIDFetcher.getUUID(args[2]));
}catch(IOException e){
p.sendMessage("§cDer Skin konnte nicht gefunden werden!");
e.printStackTrace();
}

String signature = "t";
String value ="t";

Iterator< Property > iterator = snap.getProperties().get( "textures" ).iterator();
if( iterator.hasNext() ) {
Property prop = iterator.next();
signature = prop.getSignature();
value = prop.getValue();
}

NPC npc = new NPC (args[1],p.getLocation());
npc.spawn(); 

cfgnpc.set(args[1] + ".id", NPC.entityID);
cfgnpc.set(args[1] + ".x", p.getLocation().getX());
cfgnpc.set(args[1] + ".y", p.getLocation().getY());
cfgnpc.set(args[1] + ".z", p.getLocation().getZ());
cfgnpc.set(args[1] + ".yaw", p.getLocation().getYaw());
cfgnpc.set(args[1] + ".pitch", p.getLocation().getPitch());
cfgnpc.set(args[1] + ".value", signature);
cfgnpc.set(args[1] + ".signature", value);

try {
cfgnpc.save(filenpc);
} catch (IOException e) {
e.printStackTrace();
}

p.sendMessage("§aDu hast erfolgreich §e" + args[1]+ " §agespawnt!");

}else if(args[0].equalsIgnoreCase("delete")){

}
}
}
}
}


Danke schon mal im Voraus :)

This post has been edited 4 times, last edit by "Merkurius98" (Apr 21st 2017, 5:18pm)


lehu

User / Kunde

Posts: 110

  • Send private message

2

Friday, April 21st 2017, 6:40pm

Ich glaube die Datenfelder des packet haben sich geändert

MrAngel08

User / Kunde

  • "MrAngel08" is male

Posts: 339

Location: Deutschland

Occupation: Schüler

Thanks: 1

  • Send private message

3

Friday, April 21st 2017, 7:27pm

Also bei mir crasht bei dem Code in der 1.11 immer Minecraft...egal xD
Füg mal den NPC in die Tablist ein. Vllt funkts dann :)

Edit: Ich weiß nicht, ob das beabsichtigt ist, aber du hast bei dem Setzen der Felder zweimal location.getYaw()

This post has been edited 1 times, last edit by "MrAngel08" (Apr 21st 2017, 7:33pm)


Merkurius98

User / Kunde

  • "Merkurius98" started this thread

Posts: 20

  • Send private message

4

Saturday, April 22nd 2017, 2:47pm

Also bei mir crasht bei dem Code in der 1.11 immer Minecraft...egal xD
Füg mal den NPC in die Tablist ein. Vllt funkts dann :)

Edit: Ich weiß nicht, ob das beabsichtigt ist, aber du hast bei dem Setzen der Felder zweimal location.getYaw()
Ich habe jetzt ein paar Dinge versucht.
Das mit dem getYaw war bestimmt ein kopierfehler weil ich zwischendurch noch andere Codes ausprobiert habe, aber danke für den Hinweis ^^
Wenn ich den NPC einfach spawne, ohne ihn der Tablist hinzu zu fügen, dann passiert gar nichts. Nur die Daten werden in die Config eingetragen, was selbstverständlich ist.
Wenn ich ihn jetzt aber der Tablist hinzu füge, dann wird er mir kurz gespawnt, ich aber werde direkt gekickt mit folgendem Fehler


[Server thread/INFO]: Merkurius98 lost connection: Internal Exception: java.io.IOException: Eine vorhandene Verbindung wurde vom Remotehost geschlossen

Ps: Habe jetzt auch mal den Teilcode, mit welchem ich die Value und signature-Werte bekomme auskommentiert ...

BlackSarius

User / Kunde

  • "BlackSarius" is male

Posts: 745

Location: Baden-Württemberg

Occupation: Abiturient

  • Send private message

5

Saturday, April 22nd 2017, 5:32pm

Decompiled:

Java source code

1
2
this.f = ((byte)(int)(paramEntityHuman.yaw * 256.0F / 360.0F));
this.g = ((byte)(int)(paramEntityHuman.pitch * 256.0F / 360.0F));


Du musst Yaw und Pitch erst umrechnen:

Java source code

1
2
setValue(packet, "f", ((byte)(int)(location.getYaw() * 256.0F / 360.0F)));
setValue(packet, "g", ((byte)(int)(location.getPitch() * 256.0F / 360.0F)));

Merkurius98

User / Kunde

  • "Merkurius98" started this thread

Posts: 20

  • Send private message

6

Saturday, April 22nd 2017, 8:38pm

Decompiled:

Java source code

1
2
this.f = ((byte)(int)(paramEntityHuman.yaw * 256.0F / 360.0F));
this.g = ((byte)(int)(paramEntityHuman.pitch * 256.0F / 360.0F));


Du musst Yaw und Pitch erst umrechnen:

Java source code

1
2
setValue(packet, "f", ((byte)(int)(location.getYaw() * 256.0F / 360.0F)));
setValue(packet, "g", ((byte)(int)(location.getPitch() * 256.0F / 360.0F)));
Hab ich gemacht, macht leider trotzdem kein Unterschied, Minecraft schmiert trotzdem ab mit der gleichen Fehlermeldung

BlackSarius

User / Kunde

  • "BlackSarius" is male

Posts: 745

Location: Baden-Württemberg

Occupation: Abiturient

  • Send private message

7

Sunday, April 23rd 2017, 12:06am

[Server thread/INFO]: Merkurius98 lost connection: Internal Exception: java.io.IOException: Eine vorhandene Verbindung wurde vom Remotehost geschlossen

Bekommt der Spieler denn eine Fehlernachricht (im Disconnect Screen)? Wenn ja welche?

Merkurius98

User / Kunde

  • "Merkurius98" started this thread

Posts: 20

  • Send private message

8

Sunday, April 23rd 2017, 12:36am

Bekommt der Spieler denn eine Fehlernachricht (im Disconnect Screen)? Wenn ja welche?
nein leider nicht. Minecraft schließt sich einfach ohne Meldung und die einzige Nachricht die ich bekomme, ist die vom Server.

iSEVEN

User / Kunde

  • "iSEVEN" is male

Posts: 1,431

  • Send private message

9

Sunday, April 23rd 2017, 8:15am

Dann hast du die Nachricht trz im launcher


Gesendet von iPhone mit Tapatalk

RincewindCoding

User / Kunde

  • "RincewindCoding" is male

Posts: 10

  • Send private message

10

Tuesday, April 25th 2017, 10:14pm

Für einen vollen StackTrace in der Konsole kannst du den DebugMode (in der server.properties und spigot.yml) auf 'true' setzen, was ich immer empfehlen würde, wenn du mit NMS arbeitest. Des Weiteren würde ich das ganze erstmal ohne Skin versuchen.
~ RincewindCoding

This post has been edited 1 times, last edit by "RincewindCoding" (Apr 26th 2017, 7:04pm)


Merkurius98

User / Kunde

  • "Merkurius98" started this thread

Posts: 20

  • Send private message

11

Wednesday, April 26th 2017, 5:32pm

Danke für die nützlichen Tipps ^^
Hab Debug mal angemacht und folgendes bekommen:


[17:28:44] [Netty Server IO #2/DEBUG]: java.io.IOException: Eine vorhandene Verbindung wurde vom Remotehost geschlossen
[17:28:44] [Netty Server IO #2/WARN]: java.io.IOException: Eine vorhandene Verbindung wurde vom Remotehost geschlossen
[17:28:44] [Netty Server IO #2/WARN]: at sun.nio.ch.SocketDispatcher.read0(Native Method)
[17:28:44] [Netty Server IO #2/WARN]: at sun.nio.ch.SocketDispatcher.read(Unknown Source)
[17:28:44] [Netty Server IO #2/WARN]: at sun.nio.ch.IOUtil.readIntoNativeBuffer(Unknown Source)
[17:28:44] [Netty Server IO #2/WARN]: at sun.nio.ch.IOUtil.read(Unknown Source)
[17:28:44] [Netty Server IO #2/WARN]: at sun.nio.ch.SocketChannelImpl.read(Unknown Source)
[17:28:44] [Netty Server IO #2/WARN]: at io.netty.buffer.UnpooledUnsafeDirectByteBuf.setBytes(UnpooledUnsafeDirectByteBuf.java:446) <-- Ist das, das Problem?
[17:28:44] [Netty Server IO #2/WARN]: at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:881)
[17:28:44] [Netty Server IO #2/WARN]: at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:225)
[17:28:44] [Netty Server IO #2/WARN]: at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:119)
[17:28:44] [Netty Server IO #2/WARN]: at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511)
[17:28:44] [Netty Server IO #2/WARN]: at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468)
[17:28:44] [Netty Server IO #2/WARN]: at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382)
[17:28:44] [Netty Server IO #2/WARN]: at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354)
[17:28:44] [Netty Server IO #2/WARN]: at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:116)
[17:28:44] [Netty Server IO #2/WARN]: at java.lang.Thread.run(Unknown Source)
[17:28:44] [Server thread/INFO]: Merkurius98 lost connection: Internal Exception: java.io.IOException: Eine vorhandene Verbindung wurde vom Remotehost geschlossen

RincewindCoding

User / Kunde

  • "RincewindCoding" is male

Posts: 10

  • Send private message

12

Wednesday, April 26th 2017, 7:07pm

Danke für die nützlichen Tipps ^^
Hab Debug mal angemacht und folgendes bekommen:

[17:28:44] [Netty Server IO #2/DEBUG]: java.io.IOException: Eine vorhandene Verbindung wurde vom Remotehost geschlossen
[17:28:44] [Netty Server IO #2/WARN]: java.io.IOException: Eine vorhandene Verbindung wurde vom Remotehost geschlossen
[17:28:44] [Netty Server IO #2/WARN]: at sun.nio.ch.SocketDispatcher.read0(Native Method)
[17:28:44] [Netty Server IO #2/WARN]: at sun.nio.ch.SocketDispatcher.read(Unknown Source)
[17:28:44] [Netty Server IO #2/WARN]: at sun.nio.ch.IOUtil.readIntoNativeBuffer(Unknown Source)
[17:28:44] [Netty Server IO #2/WARN]: at sun.nio.ch.IOUtil.read(Unknown Source)
[17:28:44] [Netty Server IO #2/WARN]: at sun.nio.ch.SocketChannelImpl.read(Unknown Source)
[17:28:44] [Netty Server IO #2/WARN]: at io.netty.buffer.UnpooledUnsafeDirectByteBuf.setBytes(UnpooledUnsafeDirectByteBuf.java:446) <-- Ist das, das Problem?
[17:28:44] [Netty Server IO #2/WARN]: at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:881)
[17:28:44] [Netty Server IO #2/WARN]: at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:225)
[17:28:44] [Netty Server IO #2/WARN]: at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:119)
[17:28:44] [Netty Server IO #2/WARN]: at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511)
[17:28:44] [Netty Server IO #2/WARN]: at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468)
[17:28:44] [Netty Server IO #2/WARN]: at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382)
[17:28:44] [Netty Server IO #2/WARN]: at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354)
[17:28:44] [Netty Server IO #2/WARN]: at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:116)
[17:28:44] [Netty Server IO #2/WARN]: at java.lang.Thread.run(Unknown Source)
[17:28:44] [Server thread/INFO]: Merkurius98 lost connection: Internal Exception: java.io.IOException: Eine vorhandene Verbindung wurde vom Remotehost geschlossen


Ok, das ist jetzt ganz verrückt, weil die Minecraft Klassen in dem Stacktrace gar nicht vorkommen! :D
Ich schreibe selber mal schnell was, und schicke das dann hier rein.
~ RincewindCoding

MrAngel08

User / Kunde

  • "MrAngel08" is male

Posts: 339

Location: Deutschland

Occupation: Schüler

Thanks: 1

  • Send private message

13

Wednesday, April 26th 2017, 7:24pm

Quoted from "RincewindCoding"


Ok, das ist jetzt ganz verrückt, weil die Minecraft Klassen in dem Stacktrace gar nicht vorkommen! :D
Ich schreibe selber mal schnell was, und schicke das dann hier rein.
~ RincewindCoding

Wenns dir hilft: im Crashlog von Minecraft kommt eine ClassCastException (while ticking Entity | Float cannot be cast to byte)
Man kann es umgehen, indem man einen "richtigen" EntityPlayer erstellt und dann diesen im Konstruktor von der PacketPlayOutNamedEntitySpawn-Klasse packt.
Hier ein Beispiel (Code von @ChillUpX - Thanks to him ^^)
Da fehlt nur folgende Zeile:

Java source code

1
npc.playerConnection = new PlayerConnection(nmsServer, new NetworkManager(EnumProtocolDirection.SERVERBOUND), npc);


MfG MrAngel08

RincewindCoding

User / Kunde

  • "RincewindCoding" is male

Posts: 10

  • Send private message

14

Wednesday, April 26th 2017, 7:56pm

Quoted from "RincewindCoding"


Ok, das ist jetzt ganz verrückt, weil die Minecraft Klassen in dem Stacktrace gar nicht vorkommen! :D
Ich schreibe selber mal schnell was, und schicke das dann hier rein.
~ RincewindCoding

Wenns dir hilft: im Crashlog von Minecraft kommt eine ClassCastException (while ticking Entity | Float cannot be cast to byte)
Man kann es umgehen, indem man einen "richtigen" EntityPlayer erstellt und dann diesen im Konstruktor von der PacketPlayOutNamedEntitySpawn-Klasse packt.
Hier ein Beispiel (Code von @ChillUpX - Thanks to him ^^)
Da fehlt nur folgende Zeile:

Java source code

1
npc.playerConnection = new PlayerConnection(nmsServer, new NetworkManager(EnumProtocolDirection.SERVERBOUND), npc);


MfG MrAngel08

Wäre jetzt auch mein nächster Ansatz gewesen. Wenn du an deiner oben dargestellten Methode hängen solltest: Versuch das ganze mal ohne die Einträge in den Datawatcher. Was genau wolltest du mit den Einträgen eigentlich erreichen?
~ RincewindCoding

This post has been edited 1 times, last edit by "RincewindCoding" (Apr 26th 2017, 9:31pm)


Merkurius98

User / Kunde

  • "Merkurius98" started this thread

Posts: 20

  • Send private message

15

Saturday, April 29th 2017, 4:26pm

Danke für den Code, er funktioniert :thumbsup:
Jetzt habe ich aber das Problem mit den Skins. Ich möchte den NPC´s mit der Value und der signature den Skin setzen.
Die richtige Value und die signature bekomme ich auch und kann sie auch in eine Datei abspeichern. Wenn ich diese aber dem Gameprofile zuordne passiert nichts, es wird immer noch der Standartskin genommen.
Hier der Code:

Java source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
if(args[0].equalsIgnoreCase("spawn")){
 
 File filenpc = new File ("plugins/RPGsystem","npc.yml");
 final FileConfiguration cfgnpc = YamlConfiguration.loadConfiguration(filenpc); 

 GameProfile snap = new GameProfile(UUID.randomUUID(), "yolo");

 try{
 snap = GameProfileBuilder.fetch(UUIDFetcher.getUUID(args[2]));
 }catch(IOException e){
 p.sendMessage("§cDer Skin konnte nicht gefunden werden!");
 e.printStackTrace();
 }

 String signature = "t";
 String value ="t";
 
 Iterator< Property > iterator = snap.getProperties().get( "textures" ).iterator();
 if( iterator.hasNext() ) {
 Property prop = iterator.next();
 signature = prop.getSignature();
 value = prop.getValue();
 }
 
 NPC.gameprofile = new GameProfile (UUID.randomUUID(), args[1]);
 NPC.gameprofile.getProperties().put("textures", new Property("textures", value, signature));
 NPC.spawn(p.getLocation()); 
 
 
 cfgnpc.set(args[1] + ".world", p.getWorld().getName());
 cfgnpc.set(args[1] + ".id", NPC.entityID);
 cfgnpc.set(args[1] + ".x", p.getLocation().getX());
 cfgnpc.set(args[1] + ".y", p.getLocation().getY());
 cfgnpc.set(args[1] + ".z", p.getLocation().getZ());
 cfgnpc.set(args[1] + ".yaw", p.getLocation().getYaw());
 cfgnpc.set(args[1] + ".pitch", p.getLocation().getPitch());
 cfgnpc.set(args[1] + ".value", signature);
 cfgnpc.set(args[1] + ".signature", value);

 try {
 cfgnpc.save(filenpc);
 } catch (IOException e) {
 e.printStackTrace();
 }

 p.sendMessage("§aDu hast erfolgreich §e" + args[1]+ " §agespawnt!");

 }

Merkurius98

User / Kunde

  • "Merkurius98" started this thread

Posts: 20

  • Send private message

16

Tuesday, May 2nd 2017, 12:54am

Hey, ich habe es geschafft den NPC mit dem richtigen Skin per NMS zu spawnen.
Jetzt aber fehlt mir noch die Möglichkeit mit ihnen zu interagieren.
Mit Events wie dem PlayerInteractEntityEvent hats nicht geklappt und sonst weiß ich nur wie es mit Packets funktioniert.
Kann mir da jemand helfen?

MrAngel08

User / Kunde

  • "MrAngel08" is male

Posts: 339

Location: Deutschland

Occupation: Schüler

Thanks: 1

  • Send private message

17

Tuesday, May 2nd 2017, 12:25pm

Du fängst einfach die Packets ab und schaust, ob das Packet eine Instanz von PacketPlayInUseEntity ist. Wenn ja, dann wurde mit einem Entity interagiert.

Merkurius98

User / Kunde

  • "Merkurius98" started this thread

Posts: 20

  • Send private message

18

Tuesday, May 2nd 2017, 3:34pm

Du fängst einfach die Packets ab und schaust, ob das Packet eine Instanz von PacketPlayInUseEntity ist. Wenn ja, dann wurde mit einem Entity interagiert.
Hab mal dran rumgebastelt.
Das ist ja nichts mit Packets, da durch deine Methode der FakePlayer als Entity in die Welt gesetzt wird.
Es funktioniert doch mit Events, aber ich schaffe es noch nicht dem NPC die Headrotation zu setzen, kann aber schon abfragen ob ich in seiner Nähe mich bewege oder ihn anklicke oder ob er dmg bekommt.
Die Frage jetzt ist, wie schaffe ich es, dass er sich bewegt. Kopf, Körper etc ...

Bitte besucht unser neues Forum unter https://forum.nitrado.net| Please visit our new Forum at https://forum.nitrado.net