Eigene NPCs erstellen

Hier könnt ihr anderen Leuten helfen, indem ihr Anleitungen oder praktische Codesegmente zur Verfügung stellt.

Eigene NPCs erstellen

Beitragvon Summerfeeling » Fr 10. Okt 2014, 10:21

Hey!
Heute möchte ich euch zeigen, wie ihr eure eigenen NPCs erstellen könnt. Um diesem Tutorial folgen zu können, benötigst du Spigot oder CraftBukkit in deinem Buildpath, da wir hier mit Packets arbeiten!

Zuerst erstellen wir uns eine Instanz der PacketPlayOutNamedEntitySpawn Class.
Code: Alles auswählen
  1. PacketPlayOutNamedEntitySpawn create = new PacketPlayOutNamedEntitySpawn();

In dieser Instanz müssen wir nun 9 private Felder überschreiben. Dies machen wir mit Reflections. Ich empfehle dafür eine kleine Methode, da dieser Teil sonst sehr lang wird.

Meine Methode sieht so aus:
Code: Alles auswählen
  1.    private static void setField(Object instanz, Class<?> clazz, String field, Object value) throws Exception {
  2.       Field f = clazz.getDeclaredField(field);
  3.       f.setAccessible(true);
  4.       f.set(instanz, value);
  5.    }


Aber nun zum überschreiben der Felder, die einzelnen Felder erkläre ich euch gleich ;)
Code: Alles auswählen
  1.       setField(create, create.getClass(), "a", entityid);
  2.       setField(create, create.getClass(), "b", new GameProfile(UUID.randomUUID(), name));
  3.       setField(create, create.getClass(), "c", toFixedPoint(location.getX()));
  4.       setField(create, create.getClass(), "d", toFixedPoint(location.getY()));
  5.       setField(create, create.getClass(), "e", toFixedPoint(location.getZ()));
  6.       setField(create, create.getClass(), "f", toPackedByte(location.getYaw()));
  7.       setField(create, create.getClass(), "g", toPackedByte(location.getPitch()));
  8.       setField(create, create.getClass(), "h", inhand == null ? 0 : inhand.getTypeId());
  9.       setField(create, create.getClass(), "i", watcher);


Den DataWatcher für das Feld "i" erstellen wir so:
Code: Alles auswählen
  1.       DataWatcher watcher = new DataWatcher(null);
  2.       watcher.a(6, (float) 20);

Über die Methode DataWatcher.a(6, (float) 20); setzem wir dem DataWatcher die Leben unseres NPCs.

Und die Methoden welche in den Feldern c-g vorkommen, sind von @Jofkos und sehen so aus:
Code: Alles auswählen
  1.    private static int toFixedPoint(double d) {
  2.       return (int)d * 32;
  3.    }
  4.    
  5.    private static byte toPackedByte(float f) {
  6.       return (byte) ((int) (f * 256.0F / 360.0F));
  7.    }


Nun zu den Erklärungen:
Das Feld "a" ist das Feld für die EntityID.
Das Feld "b" überschreiben wir mit einem GameProfile, welches eine UUID sowie den Namen unseres NPCs erhält.
Das Feld "c" überschreiben wir mit der x-Koordinate des NPCs.
Das Feld "d" überschreiben wir mit der y-Koordinate des NPCs.
Das Feld "e" überschreiben wir mit der z-Koorindate des NPCs.
Die Felder "f" und "g" geben die Blickrichtung sowie die Blickhöhe an,
und das Feld "h" gibt an, welches Item der NPC in der Hand halten soll.

Euer Code sollte bis jetzt etwa so aussehen:
Code: Alles auswählen
  1.       PacketPlayOutNamedEntitySpawn create = new PacketPlayOutNamedEntitySpawn();
  2.       setField(create, create.getClass(), "a", 13743); //Beliebige ID wählbar.
  3.       setField(create, create.getClass(), "b", new GameProfile(UUID.randomUUID(), "Cooler NPC")); //Name ebenso frei wählbar.
  4.       setField(create, create.getClass(), "c", toFixedPoint(location.getX()));
  5.       setField(create, create.getClass(), "d", toFixedPoint(location.getY()));
  6.       setField(create, create.getClass(), "e", toFixedPoint(location.getZ()));
  7.       setField(create, create.getClass(), "f", toPackedByte(location.getYaw()));
  8.       setField(create, create.getClass(), "g", toPackedByte(location.getPitch()));
  9.       setField(create, create.getClass(), "h", inhand == null ? 0 : inhand.getTypeId());
  10.       DataWatcher watcher = new DataWatcher(null);
  11.       watcher.a(6, (float) 20);
  12.       setField(create, create.getClass(), "i", watcher);


Wir sollten übrigends jedem NPC eine eigene EntityID geben (zum Beispiel über die Random Klasse), damit wir jeden NPC gezielt löschen können.

Nun müssen wir den Spielern nur noch das Paket schicken, und der NPC erscheint an der in den Feldern c-g angegeben Position.
Das senden funktioniert so:
Code: Alles auswählen
  1.       for(Player online : Bukkit.getOnlinePlayers()) {
  2.          ((CraftPlayer) online).getHandle().playerConnection.sendPacket(create);
  3.       }


Euer Code sollte am Ende etwa so aussehen:
Code: Alles auswählen
  1.       PacketPlayOutNamedEntitySpawn create = new PacketPlayOutNamedEntitySpawn();
  2.       setField(create, create.getClass(), "a", 13743); //Beliebige ID wählbar.
  3.       setField(create, create.getClass(), "b", new GameProfile(UUID.randomUUID(), "Cooler NPC")); //Name ebenso frei wählbar.
  4.       setField(create, create.getClass(), "c", toFixedPoint(location.getX()));
  5.       setField(create, create.getClass(), "d", toFixedPoint(location.getY()));
  6.       setField(create, create.getClass(), "e", toFixedPoint(location.getZ()));
  7.       setField(create, create.getClass(), "f", toPackedByte(location.getYaw()));
  8.       setField(create, create.getClass(), "g", toPackedByte(location.getPitch()));
  9.       setField(create, create.getClass(), "h", inhand == null ? 0 : inhand.getTypeId());
  10.       DataWatcher watcher = new DataWatcher(null);
  11.       watcher.a(6, (float) 20);
  12.       setField(create, create.getClass(), "i", watcher);
  13.       
  14.       for(Player online : Bukkit.getOnlinePlayers()) {
  15.          ((CraftPlayer) online).getHandle().playerConnection.sendPacket(create);
  16.       }


Nun habt ihr euren NPC erstellt, habt aber keine Lust mehr auf ihn, und wollt ihr löschen. Dies geht ganz einfach über das PacketPlayOutEntityDestroy Packet.

Dieses erstellen wir so:
Code: Alles auswählen
  1.       PacketPlayOutEntityDestroy destroy = new PacketPlayOutEntityDestroy(new int[]{13743}); //13743 hier durch die EntityID des gespawnten NPCs ersetzen.

Dieses muss nun nur noch allen Spielern wie beim erstellen gesendet werden, und der NPC ist weg!
Code: Alles auswählen
  1.       for(Player online : Bukkit.getOnlinePlayers()) {
  2.          ((CraftPlayer) online).getHandle().playerConnection.sendPacket(destroy);
  3.       }


Dieser Code sollte nun etwa so aussehen:
Code: Alles auswählen
  1.       PacketPlayOutEntityDestroy destroy = new PacketPlayOutEntityDestroy(new int[]{13743});
  2.       for(Player online : Bukkit.getOnlinePlayers()) {
  3.          PlayerConnection connection = ((CraftPlayer) online).getHandle().playerConnection;
  4.          connection.sendPacket(destroy);
  5.       }


Ich hoffe dieses Tutorial hat euch geholfen!
Grüße
Summerfeeling | Timo
Benutzeravatar
Summerfeeling
 
Beiträge: 1300
Registriert: Sa 15. Jun 2013, 18:43
Wohnort: Viersen

Re: Eigene NPCs erstellen

Beitragvon Sep2703 » Fr 10. Okt 2014, 14:17

Hey, Vielen Dank für das Tutorial!

Ich habe spontan mal eine kleine Klasse geschrieben (ungetestet), die das Konzept etwas vereinfacht (Für Anfänger vielleicht ganz sinnvoll).
Ich hoffe, es stört dich nicht, wenn ich sie hier bereitstelle.
Code: Alles auswählen
  1. package your-package
  2. import java.lang.reflect.Field;
  3. import java.util.Random;
  4. import java.util.UUID;
  5. import net.minecraft.server.v1_7_R4.DataWatcher;
  6. import net.minecraft.server.v1_7_R4.PacketPlayOutEntityDestroy;
  7. import net.minecraft.server.v1_7_R4.PacketPlayOutNamedEntitySpawn;
  8. import net.minecraft.util.com.mojang.authlib.GameProfile;
  9. import org.bukkit.Bukkit;
  10. import org.bukkit.Location;
  11. import org.bukkit.Material;
  12. import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer;
  13. import org.bukkit.entity.Player;
  14. public class NPC {
  15.    
  16.    
  17.    private static Random rnd = new Random();
  18.    
  19.    private PacketPlayOutNamedEntitySpawn packet;
  20.    private Location loc;
  21.    private GameProfile profile;
  22.    private DataWatcher watcher;
  23.    
  24.    private int health = 20;
  25.    private int entityID;
  26.    
  27.    private boolean autoUpdate = false;
  28.    
  29.    
  30.    
  31.    public NPC() {
  32.       packet = new PacketPlayOutNamedEntitySpawn();
  33.       spawnCreature();
  34.    }
  35.    
  36.    public NPC(String name) {
  37.       this.profile = new GameProfile(UUID.randomUUID(), name);
  38.       packet = new PacketPlayOutNamedEntitySpawn();
  39.       spawnCreature();
  40.    }
  41.    
  42.    public NPC(GameProfile profile) {
  43.       this.profile = profile;
  44.       packet = new PacketPlayOutNamedEntitySpawn();
  45.       spawnCreature();
  46.    }
  47.    
  48.    public NPC(boolean autoUpdate) {
  49.       this.autoUpdate = autoUpdate;
  50.       packet = new PacketPlayOutNamedEntitySpawn();
  51.       spawnCreature();
  52.    }
  53.    
  54.    public NPC(String name, boolean autoUpdate) {
  55.       this.autoUpdate = autoUpdate;
  56.       this.profile = new GameProfile(UUID.randomUUID(), name);
  57.       packet = new PacketPlayOutNamedEntitySpawn();
  58.       spawnCreature();
  59.    }
  60.    
  61.    public NPC(GameProfile profile, boolean autoUpdate) {
  62.       this.autoUpdate = autoUpdate;
  63.       this.profile = profile;
  64.       packet = new PacketPlayOutNamedEntitySpawn();
  65.       spawnCreature();
  66.    }
  67.    
  68.    
  69.    private static void setValue(Object instance, String field, Object value) {
  70.       try {
  71.          Field f = instance.getClass().getDeclaredField(field);
  72.          f.setAccessible(true);
  73.          f.set(instance, value);
  74.       } catch (Exception e) {
  75.       }
  76.    }
  77.    
  78.    private int getEntityID() {
  79.       int id = rnd.nextInt(10000) + 5000;
  80.       this.entityID = id;
  81.       return id;
  82.    }
  83.    
  84.    private static int toFixPoint(double d) {
  85.       return (int) d * 32;
  86.    }
  87.    
  88.    private static byte toPacketByte(float f) {
  89.       return (byte) ((int) (f * 256.0F / 360.0F));
  90.    }
  91.    
  92.    private void spawnCreature() {
  93.       if (profile == null) profile = new GameProfile(UUID.randomUUID(), "");
  94.       this.watcher = new DataWatcher(null);
  95.       watcher.a(6, (float) 20);
  96.       setValue(packet, "a", getEntityID());
  97.       setValue(packet, "b", profile);
  98.       setValue(packet, "c", toFixPoint(loc.getX())); // X
  99.       setValue(packet, "d", toFixPoint(loc.getY())); // Y
  100.       setValue(packet, "e", toFixPoint(loc.getZ())); // Z
  101.       setValue(packet, "f", toPacketByte(loc.getYaw())); // Yaw
  102.       setValue(packet, "g", toPacketByte(loc.getPitch())); // Pitch
  103.       setValue(packet, "h", 0); // ItemID in Hand
  104.       setValue(packet, "i", watcher);
  105.    }
  106.    
  107.    public void sendToPlayer(Player p) {
  108.       if (p.getWorld() == loc.getWorld()) {
  109.          ((CraftPlayer)p).getHandle().playerConnection.sendPacket(packet);
  110.       }
  111.    }
  112.    
  113.    public void broadcast() {
  114.       for (Player p : Bukkit.getOnlinePlayers()) sendToPlayer(p);
  115.    }
  116.    
  117.    public void setItemInHand(Material mat) {
  118.       setValue(packet, "h", mat.getId());
  119.       if (autoUpdate) broadcast();
  120.    }
  121.    
  122.    public void setLocation(Location loc) {
  123.       this.loc = loc;
  124.       if (autoUpdate) broadcast();
  125.    }
  126.    
  127.    public Location getLocation() {
  128.       return loc;
  129.    }
  130.    
  131.    public void setDisplayName(String name) {
  132.       UUID uuid = profile.getId();
  133.       this.profile = new GameProfile(uuid, name);
  134.       setValue(packet, "b", profile);
  135.       if (autoUpdate) broadcast();
  136.    }
  137.    
  138.    public void setHealth(int health) {
  139.       this.watcher.add(6, health);
  140.       if (autoUpdate) broadcast();
  141.       this.health = health;
  142.    }
  143.    
  144.    public int getHealth() {
  145.       return health;
  146.    }
  147.    
  148.    public void setAutoUpdate(boolean autoUpdate) {
  149.       this.autoUpdate = autoUpdate;
  150.    }
  151.    
  152.    public boolean isAutoUpdate() {
  153.       return autoUpdate;
  154.    }
  155.    
  156.    public void sendDestroy() {
  157.       PacketPlayOutEntityDestroy destroyPacket = new PacketPlayOutEntityDestroy(new int[] { entityID });
  158.       for (Player p : Bukkit.getOnlinePlayers())
  159.       {
  160.          ((CraftPlayer)p).getHandle().playerConnection.sendPacket(destroyPacket);
  161.       }
  162.    }
  163.    
  164. }

(Ich habe die Klasse jetzt nicht irgendwie besonders sorgfältig programmiert, aber es sollte denk ich trotzdem gut funktionieren)

Verwendung:

Einfach neue Instanz mit Konstruktor eurer Wahl erstellen und die Methode "sendToPlayer" bzw. "broadcast" aufrufen.
Beachtet dabei, dass die "autoUpdate"-Funktion dies immer automatisch macht, wenn ihr z.B. das Item in der Hand ändert.
Ist diese Funktion deaktiviert (Standart), müsst ihr nach jeder Änderung manuell "sendToPlayer" bzw. "broadcast" aufrufen.
Der Rest erklärt sich (hoffentlich) von selbst.

Den Code könnt ihr natürlich frei verwenden.


Sep2703
Du möchtest programmieren lernen oder dein Bukkit-/Spigot-Wissen erweitern?
Hier habe ich für dich kostenlose Tutorials: https://youtube.com/janhektor
Benutzeravatar
Sep2703
 
Beiträge: 677
Registriert: Mi 8. Jan 2014, 15:13
Wohnort: 127.0.0.1

Re: Eigene NPCs erstellen

Beitragvon MrW0lff » Mo 27. Okt 2014, 16:48

Ist es möglich, dass mach so wie hier beschrieben NPCs spawnen kann, welche man wie normale Spieler oder Entitys auch schlagen kann?

LG
Benutzeravatar
MrW0lff
 
Beiträge: 27
Registriert: Sa 3. Mai 2014, 09:01

Re: Eigene NPCs erstellen

Beitragvon IK_Raptor » Mo 27. Okt 2014, 17:10

Möglich ist es sicherlich. Das Problem dabei ist nur, dass die hier erstellten NPCs nicht für den Server existieren. D.h dieser kümmert sich auch nicht darum, dass sie Schaden erhalten. Stattdessen müsstest du diese Aufgabe übernehmen. Das kannst du machen, indem du einkommende Packets überprüfst und DamageAnimationen selbst sendest.
Benutzeravatar
IK_Raptor
 
Beiträge: 609
Registriert: Mo 12. Aug 2013, 15:37

Re: Eigene NPCs erstellen

Beitragvon MrW0lff » Mo 27. Okt 2014, 17:46

Okay. Vielen Dank!
Das ist für mein Vorhaben sogar noch geeigneter.
LG
Benutzeravatar
MrW0lff
 
Beiträge: 27
Registriert: Sa 3. Mai 2014, 09:01

Re: Eigene NPCs erstellen

Beitragvon ImGameboy » Fr 31. Okt 2014, 10:37

Was ist inhand denn für eine Variable? Hab fast alles ausprobiert, funktioniert aber nicht.
Lückenstopfer ^^
Benutzeravatar
ImGameboy
 
Beiträge: 210
Registriert: Mi 17. Sep 2014, 15:25

Re: Eigene NPCs erstellen

Beitragvon Summerfeeling » Fr 31. Okt 2014, 15:02

gameboy1503 hat geschrieben:Was ist inhand denn für eine Variable? Hab fast alles ausprobiert, funktioniert aber nicht.

Ganz vergessen das reinzuschreiben.. :s
Das ist ein ItemStack.
Grüße
Summerfeeling | Timo
Benutzeravatar
Summerfeeling
 
Beiträge: 1300
Registriert: Sa 15. Jun 2013, 18:43
Wohnort: Viersen

Re: Eigene NPCs erstellen

Beitragvon Admiral_Zott » Mo 15. Dez 2014, 18:17

Habe mal noch eine Frage und eine Fehlermeldung dazu @Summerfeeling
Ich bekomme immer bei dem Field b eine Fehlermeldung ausgespuckt. Hat vielleicht jemand eine Ahnung, woran das liegen könnte?
Ich programmiere mittlerweile mit der Spigot 1.8
Fehlermeldung:
Code: Alles auswählen
  1. [18:11:34 WARN]: java.lang.IllegalArgumentException: Can not set java.util.UUID
  2. field net.minecraft.server.v1_8_R1.PacketPlayOutNamedEntitySpawn.b to com.mojang
  3. .authlib.GameProfile
  4. [18:11:34 WARN]:        at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalAr
  5. gumentException(Unknown Source)
  6. [18:11:34 WARN]:        at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalAr
  7. gumentException(Unknown Source)
  8. [18:11:34 WARN]:        at sun.reflect.UnsafeObjectFieldAccessorImpl.set(Unknown
  9. Source)
  10. [18:11:34 WARN]:        at java.lang.reflect.Field.set(Unknown Source)
  11. [18:11:34 WARN]:        at FakePlayer.FakePlayer.setField(FakePlayer.java:49)
  12. [18:11:34 WARN]:        at FakePlayer.FakePlayer.spawnNPC(FakePlayer.java:21)
  13. [18:11:34 WARN]:        at de.BukkitFabo.TestPlugin.SpawnCommand.onCommand(Spawn
  14. Command.java:35)
  15. [18:11:34 WARN]:        at org.bukkit.command.PluginCommand.execute(PluginComman
  16. d.java:44)
  17. [18:11:34 WARN]:        at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCo
  18. mmandMap.java:181)
  19. [18:11:34 WARN]:        at org.bukkit.craftbukkit.v1_8_R1.CraftServer.dispatchCo
  20. mmand(CraftServer.java:643)
  21. [18:11:34 WARN]:        at net.minecraft.server.v1_8_R1.PlayerConnection.handleC
  22. ommand(PlayerConnection.java:1105)
  23. [18:11:34 WARN]:        at net.minecraft.server.v1_8_R1.PlayerConnection.a(Playe
  24. rConnection.java:940)
  25. [18:11:34 WARN]:        at net.minecraft.server.v1_8_R1.PacketPlayInChat.a(Packe
  26. tPlayInChat.java:26)
  27. [18:11:34 WARN]:        at net.minecraft.server.v1_8_R1.PacketPlayInChat.a(Packe
  28. tPlayInChat.java:53)
  29. [18:11:34 WARN]:        at net.minecraft.server.v1_8_R1.PacketHandleTask.run(Sou
  30. rceFile:13)
  31. [18:11:34 WARN]:        at java.util.concurrent.Executors$RunnableAdapter.call(U
  32. nknown Source)
  33. [18:11:34 WARN]:        at java.util.concurrent.FutureTask.run(Unknown Source)
  34. [18:11:34 WARN]:        at net.minecraft.server.v1_8_R1.MinecraftServer.z(Minecr
  35. aftServer.java:684)
  36. [18:11:34 WARN]:        at net.minecraft.server.v1_8_R1.DedicatedServer.z(Dedica
  37. tedServer.java:316)
  38. [18:11:34 WARN]:        at net.minecraft.server.v1_8_R1.MinecraftServer.y(Minecr
  39. aftServer.java:625)
  40. [18:11:34 WARN]:        at net.minecraft.server.v1_8_R1.MinecraftServer.run(Mine
  41. craftServer.java:528)
  42. [18:11:34 WARN]:        at java.lang.Thread.run(Unknown Source)



Code:
Code: Alles auswählen
  1.    @SuppressWarnings("deprecation")
  2.    public static Packet spawnNPC(PacketPlayOutNamedEntitySpawn create, int entityid, String name, Location loc, ItemStack inhand, DataWatcher watcher) {
  3.       try {
  4.          setField(create, create.getClass(), "a", entityid);
  5.          setField(create, create.getClass(), "b", new GameProfile(UUID.randomUUID(), name));
  6.          setField(create, create.getClass(), "c", toFixedPoint(loc.getBlockX()));
  7.          setField(create, create.getClass(), "d", toFixedPoint(loc.getBlockY()));
  8.          setField(create, create.getClass(), "e", toFixedPoint(loc.getBlockZ()));
  9.          setField(create, create.getClass(), "f", toPackedByte(loc.getYaw()));
  10.          setField(create, create.getClass(), "g", toPackedByte(loc.getPitch()));
  11.          setField(create, create.getClass(), "h", inhand == null ? 0 : inhand.getTypeId());
  12.          setField(create, create.getClass(), "i", watcher);
  13.          
  14.          return create;
  15.       } catch (Exception e) {
  16.          e.printStackTrace();
  17.       }
  18.       return null;
  19.    }
  20.    
  21.    private static int toFixedPoint(double d) {
  22.       return (int)d * 32;
  23.    }
  24.       
  25.    private static byte toPackedByte(float f) {
  26.       return (byte) ((int) (f * 256.0F / 360.0F));
  27.    }
  28.    
  29.    private static void setField(Object instanz, Class<?> clazz, String field, Object value) throws Exception {
  30.    
  31.       Field f = clazz.getDeclaredField(field);
  32.       f.setAccessible(true);
  33.       f.set(instanz, value);
  34.       
  35.    }


Und noch die Class, wo ich die Methode spawnNPC aufrufe:
Code: Alles auswählen
  1.             DataWatcher watcher = new DataWatcher(null);
  2.             watcher.a(6, (float) 20);
  3.             Packet packet = FakePlayer.spawnNPC(new PacketPlayOutNamedEntitySpawn(), new Random().nextInt(5000), ChatColor.translateAlternateColorCodes('&', name), loc, null, watcher);
  4.             for(Player all : Bukkit.getOnlinePlayers()) {
  5.                ((CraftPlayer) all).getHandle().playerConnection.sendPacket(packet);
  6.             }
Benutzeravatar
Admiral_Zott
 
Beiträge: 220
Registriert: Do 10. Apr 2014, 11:56
Wohnort: Zu Hause

Re: Eigene NPCs erstellen

Beitragvon Flyingspirit » Mo 15. Dez 2014, 19:54

Soweit ich weiß bzw. was ich hier gelesen habe hat sich das Field 'b' in der 1.8 verändert, musst du die Spigot 1.8 mal dekompilieren und schauen was es nun macht und dann halt deinen Code updaten.
Flyingspirit
 

Re: Eigene NPCs erstellen

Beitragvon Summerfeeling » Mo 15. Dez 2014, 22:02

Admiral_Zott hat geschrieben:java.lang.IllegalArgumentException: Can not set java.util.UUID
field net.minecraft.server.v1_8_R1.PacketPlayOutNamedEntitySpawn.b to com.mojang
.authlib.GameProfile

Wie @BlackArmokSheep schon sagte, hat sich das Field b in dem Packet verändert.
Man übergibt nun kein GameProfile mehr, sondern eine UUID.
Ob es nun eine zufällige UUID sein kann, oder ob es eine besondere sein muss, weiß ich jetzt leider nicht.
Ich versuche mich mal zu erkundigen ;)

Und Spigot da zu decompilieren bringt auch nicht viel, da Packets NMS sind ;)
Grüße
Summerfeeling | Timo
Benutzeravatar
Summerfeeling
 
Beiträge: 1300
Registriert: Sa 15. Jun 2013, 18:43
Wohnort: Viersen

Nächste

Zurück zu Anleitungen

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste