Eigene Villager-Trades erstellen

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

Eigene Villager-Trades erstellen

Beitragvon Summerfeeling » So 23. Mär 2014, 17:37

Hey!
Heute möchte ich euch zeigen wie ihr eigene Villager-Trades erstellen könnt.
Um dieses Tutorial verfolgen zu können, braucht ihr die CraftBukkit in eurem Buildpath!

Zuerst brauchen wir die Version der CraftBukkit. Diese kriegen wir so raus:
Code: Alles auswählen
  1.    private static String PATH;
  2.    private static String VERSION;
  3.    public VillagerTrades() {
  4.       VillagerTrades.PATH = Bukkit.getServer().getClass().getPackage().getName();
  5.       VillagerTrades.VERSION = PATH.substring(PATH.lastIndexOf(".")+1, PATH.length());
  6.    }

Diese Version, brauchen wir später.

Nun brauchen wir eine(n) WorldServer, diese(n) kriegen wir indem wir unsere normale Welt zu einer CraftWorld casten, und dort den Handle getten.
Code: Alles auswählen
  1.       WorldServer world = ((CraftWorld) Bukkit.getWorld("world")).getHandle();


Nun brauchen wir einen EntityVillager. Diesem werden später die Trades "übergeben".
Um dem EntityVillager nun die Trades zu übergeben, müssen wir diese erstmal speichern und erstellen.
Dazu benötigen wir eine MerchantRecipeList.
Code: Alles auswählen
  1.       EntityVillager villager = new EntityVillager(world);
  2.       MerchantRecipeList recipeList = new MerchantRecipeList();


Nun brauchen wir ein MerchantRecipe. Dieses wird dann unser Trade. In diesem MerchantRecipe brauchen wir min. 2 und max. 3 NMS-ItemStacks. Diese NMS-ItemStacks können wir ganz einfach von unseren normalen Bukkit-ItemStacks herkriegen, indem wir die Class CraftItemStack benutzen.
Code: Alles auswählen
  1.       MerchantRecipe recipe1 = new MerchantRecipe(CraftItemStack.asNMSCopy(new ItemStack(Material.GOLD_INGOT, 1)), CraftItemStack.asNMSCopy(new ItemStack(Material.GOLDEN_APPLE, 1)));

Um nun die Maximale-Uses des Trades hoch/runter zu schrauben, benutzen wir ganz einfach die Methode .a(int);.
Code: Alles auswählen
  1.       recipe1.a(999999999);

Ihr dürft da nicht Integer.MAX_VALUE machen, weil sonst die Max-Uses direkt auf 0 gesetzt wird. Wieso auch immer.. :D

Nun müssen wir dieses Rezept, der MerchantRecipeList hinzufügen. Dieses geht nicht, wie bei normalen Listen über .add(); sonder bei der MerchantRecipeList mit .a(MerchantRecipe);
Code: Alles auswählen
  1.       recipeList.a(recipe1);

Dies wäre schonmal geschafft.

Nun müssen wir unserem Villager die MerchantRecipeList übergeben. Dieses machen wir über Reflections. Wir überschreiben hierbei das Field bu von einem EntityVillager.
Code: Alles auswählen
  1.       try {
  2.          Field field = Class.forName("net.minecraft.server." + VERSION + ".EntityVillager").getDeclaredField("bu");
  3.          field.setAccessible(true);
  4.          field.set(villager, recipeList);
  5.       } catch (NoSuchFieldException e) {
  6.          e.printStackTrace();
  7.       } catch (SecurityException e) {
  8.          e.printStackTrace();
  9.       } catch (ClassNotFoundException e) {
  10.          e.printStackTrace();
  11.       } catch (IllegalArgumentException e) {
  12.          e.printStackTrace();
  13.       } catch (IllegalAccessException e) {
  14.          e.printStackTrace();
  15.       }


Nun müssen wir unsere(m) WorldServer nur noch den Villager als Entity adden, und an die beliebige Stelle teleportieren.
Code: Alles auswählen
  1.       world.addEntity(villager, SpawnReason.CUSTOM);
  2.       villager.teleportTo(new Location(world.getWorld(), 0, 0, 0), true);


Am Ende sollte euer Code in etwa so aussehen:
Code: Alles auswählen
  1.    private static String PATH;
  2.    private static String VERSION;
  3.    
  4.    public VillagerTrades() {
  5.       VillagerTrades.PATH = Bukkit.getServer().getClass().getPackage().getName();
  6.       VillagerTrades.VERSION = PATH.substring(PATH.lastIndexOf(".")+1, PATH.length());
  7.       
  8.       WorldServer world = ((CraftWorld) Bukkit.getWorld("world")).getHandle();
  9.       EntityVillager villager = new EntityVillager(world);
  10.       MerchantRecipeList recipeList = new MerchantRecipeList();
  11.       MerchantRecipe recipe1 = new MerchantRecipe(CraftItemStack.asNMSCopy(new ItemStack(Material.GOLD_INGOT, 1)), CraftItemStack.asNMSCopy(new ItemStack(Material.GOLDEN_APPLE, 1)));
  12.       recipe1.a(999999999);
  13.       recipeList.a(recipe1);
  14.       
  15.       try {
  16.          Field field = Class.forName("net.minecraft.server." + VERSION + ".EntityVillager").getDeclaredField("bu");
  17.          field.setAccessible(true);
  18.          field.set(villager, recipeList);
  19.       } catch (NoSuchFieldException e) {
  20.          e.printStackTrace();
  21.       } catch (SecurityException e) {
  22.          e.printStackTrace();
  23.       } catch (ClassNotFoundException e) {
  24.          e.printStackTrace();
  25.       } catch (IllegalArgumentException e) {
  26.          e.printStackTrace();
  27.       } catch (IllegalAccessException e) {
  28.          e.printStackTrace();
  29.       }
  30.       villager.teleportTo(new Location(world.getWorld(), 0, 0, 0), true);
  31.       world.addEntity(villager, SpawnReason.CUSTOM);
  32.    }


Nun habt ihr euren eigenen Villager, mit euren spezifischen Trades!

Ich hoffe dieses Tutorial hat euch geholen.

Ein GROßES Dankeschön geht an @IK_Raptor, @tahu98 und @PostCrafter die mir geholfen haben, diesen Code so zu basteln.

-== EDITS ==-
1. Fehler in der Zeile wo der WorldServer gegettet wird. Danke an @Jofkos
2. Villager Teleport und addEntity()-Methode getauscht. Danke an @Sep2703 und @IK_Raptor
Zuletzt geändert von Summerfeeling am So 5. Okt 2014, 18:32, insgesamt 4-mal geändert.
Grüße
Summerfeeling | Timo
Benutzeravatar
Summerfeeling
 
Beiträge: 1300
Registriert: Sa 15. Jun 2013, 18:43
Wohnort: Viersen

Re: Eigene Villager-Trades erstellen

Beitragvon IK_Raptor » So 23. Mär 2014, 17:45

Cool das du es hier nochmal rein gestellt hast. Wird sicherlich irgendwem noch helfen. :D
Benutzeravatar
IK_Raptor
 
Beiträge: 609
Registriert: Mo 12. Aug 2013, 15:37

Re: Eigene Villager-Trades erstellen

Beitragvon Sep2703 » So 23. Mär 2014, 20:24

Wow!

Ich habe sehr viel recheriert und nie eine Lösung gefunden.
Jetzt ist alles richtig toll erklärt und leuchtet mir ein!

Zudem habe ich einen Ansatz von Reflection gesehen, was mir auch sehr geholfen hat!

Ein großes Dankeschön an dich, Summerfeeling!

MfG 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 Villager-Trades erstellen

Beitragvon Howha » So 23. Mär 2014, 21:58

Schließe mich mal an. :)

Ich will und werde das auf jeden Fall noch gebrauchen. Danke für die Anleitung, @Summerfeeling
Benutzeravatar
Howha
 
Beiträge: 303
Registriert: So 16. Jun 2013, 08:36

Re: Eigene Villager-Trades erstellen

Beitragvon PostCrafter » Mo 24. Mär 2014, 07:52

Ich habe mir die Anleitung noch nicht im Detail angeschaut, aber generell sieht sie ganz gut aus, danke für den tollen Beitrag. ;)
Was genau habe ich eigentlich geholfen?
TeamSpeak-Server zur freien Nutzung: postcrafter.de
Benutzeravatar
PostCrafter
Administrator
 
Beiträge: 1443
Registriert: Do 6. Jun 2013, 19:16
Wohnort: Ebersberg

Re: Eigene Villager-Trades erstellen

Beitragvon Summerfeeling » Mo 24. Mär 2014, 18:12

Sep2703 hat geschrieben:Zudem habe ich einen Ansatz von Reflection gesehen, was mir auch sehr geholfen hat!
Ein großes Dankeschön an dich, Summerfeeling!


Howha hat geschrieben:Schließe mich mal an. :)
Ich will und werde das auf jeden Fall noch gebrauchen. Danke für die Anleitung, @Summerfeeling


PostCrafter hat geschrieben:Ich habe mir die Anleitung noch nicht im Detail angeschaut, aber generell sieht sie ganz gut aus, danke für den tollen Beitrag. ;)

Bitteschön, ich helfe gerne. :)

PostCrafter hat geschrieben:Was genau habe ich eigentlich geholfen?

Eigentlich ist nur das "Versions-Getten" von dir, aus dem AutoCommand "geklaut". ^^
Grüße
Summerfeeling | Timo
Benutzeravatar
Summerfeeling
 
Beiträge: 1300
Registriert: Sa 15. Jun 2013, 18:43
Wohnort: Viersen

Re: Eigene Villager-Trades erstellen

Beitragvon Smite » Mo 24. Mär 2014, 19:43

Hey @Summerfeeling,
bei mir kommen andauernd Fehlermeldungen?
Ich habe jz nur die CraftBukkit im Buildpath braucht man da was zusätzlich?

mfG
P.S. Kann mal jmd ne kurze Anleitung zu Refelections oder sonstwas geben, wäre nett :)
3 Dinge die unendlich sind: Das Universum, die Menschliche Dummheit und die WinRAR Testversion. ~Smite
Benutzeravatar
Smite
 
Beiträge: 170
Registriert: Sa 28. Dez 2013, 14:46
Wohnort: Düsseldorf

Re: Eigene Villager-Trades erstellen

Beitragvon Summerfeeling » Mo 24. Mär 2014, 19:55

McSmite hat geschrieben:Hey @Summerfeeling,
bei mir kommen andauernd Fehlermeldungen?
Ich habe jz nur die CraftBukkit im Buildpath braucht man da was zusätzlich?

mfG
P.S. Kann mal jmd ne kurze Anleitung zu Refelections oder sonstwas geben, wäre nett :)

Hey,
kommen die Fehler in Eclipse, oder treten die aufm Server aus?
Wäre gut, wenn du auch die Fehler posten könntest. :)

Reflections sind eingentlich dafür da, private Felder von fremden Klassen zu überschreiben.
Um dies zu machen, brachst du die Klasse, in dem sich das Feld befindet. In diesem Beispiel jetzt die EntityVillager Klasse. Dann brauchst du den Feldnamen, in unserem Fal "bu", nun musst du das Field accesible setzen, und dann das Feld überschreiben.
Grüße
Summerfeeling | Timo
Benutzeravatar
Summerfeeling
 
Beiträge: 1300
Registriert: Sa 15. Jun 2013, 18:43
Wohnort: Viersen

Re: Eigene Villager-Trades erstellen

Beitragvon Smite » Di 25. Mär 2014, 19:09

In eclipse.
Dort gibt es keine Imports.
3 Dinge die unendlich sind: Das Universum, die Menschliche Dummheit und die WinRAR Testversion. ~Smite
Benutzeravatar
Smite
 
Beiträge: 170
Registriert: Sa 28. Dez 2013, 14:46
Wohnort: Düsseldorf

Re: Eigene Villager-Trades erstellen

Beitragvon Summerfeeling » Di 25. Mär 2014, 19:33

McSmite hat geschrieben:In eclipse.
Dort gibt es keine Imports.

Dann hast du auch nicht CraftBukkit im Buildpath. Sicher das es nicht Bukkit ist? Auf dl.bukkit.org einfach auf Beta Build klicken.
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: Bing [Bot] und 1 Gast