You are not logged in.

  • Login

[Bukkit-Plugin] Custom skulls erstellen

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

Dear visitor, welcome to Nitrado.net Prepaid Gameserver Community-Support - Archiv. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

ciaxx

User / Kunde

  • "ciaxx" is male
  • "ciaxx" started this thread

Posts: 346

Occupation: Schüler

  • Send private message

1

Tuesday, January 19th 2016, 4:05am

Custom skulls erstellen

Hallo,
es ist mit CommandBlöcken ja möglich "veränderte" Köpfe mit custom textures zu spawnen. Meine Frage ist jetzt ob es möglich ist so etwas auch via plugin zu machen. Ich hatte da bereits eine Idee:

Java source code

1
2
3
4
Block b = p.getLocation().getBlock();
b.setType(Material.SKULL);
Skull skull = (Skull) b;
skull.setOwner("Id:a75e3f60-2242-4429-8ece-bcde7753b064,Properties:{textures:[{Value:eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjM0ODdkNDU3ZjkwNjJkNzg3YTNlNmNlMWM0NjY0YmY3NDAyZWM2N2RkMTExMjU2ZjE5YjM4Y2U0ZjY3MCJ9fX0=}]}");


Der lange Code war im CommandBlock hinter SkullOwner: aber ich bekomme schon eine EventException das der Block nicht zu einem skull gecastet werden kann obwohl sogar einer an der position erstellt wird ... Ist es denn überhaupt möglich das so zu machen?

Vielen Dank

//EDIT: Okay das casten funktioniert nun hatte das .getState(); vergessen. Die skulls erscheinen auch aber ohne textur und keine Fehlermeldung

//EDIT2: Nach stundemlangen googeln (irgendwie hab ich die passenden begriffe nicht gefunden) bin ich hier drauf gestoßen: https://www.spigotmc.org/...
Ich habe den Codeschnipsel aus der letzten antwort an die aktuelle version angepasst (Base64.getEncoder() gibts nicht mehr) und es in eine funktion verfrachtet. Ich bin mir nicht sicher ob das so richtig ist aber es funktioniert auch nicht also ...

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
ItemStack item = new ItemStack(Material.SKULL_ITEM);
ItemMeta im = item.getItemMeta();
im.setDisplayName("Bread");
String linkBread = "textures.minecraft.net/texture/f3487d457f9062d787a3e6ce1c4664bf7402ec67dd111256f19b38ce4f670";
plugin.setCustomSkull_Item(im, linkBread);//Hier rufe ich die funktion auf
item.setItemMeta(im);
p.setItemInHand(item);

//Das ist die funktion:
	public void setCustomSkull_Item(ItemMeta im, String link){
		GameProfile profile = new GameProfile(UUID.randomUUID(), null);
        	byte[] encodedData = Base64.encodeBase64URLSafe(String.format("{textures:{SKIN:{url:"%s"}}}", link).getBytes());
        	profile.getProperties().put("textures", new Property("textures", new String(encodedData)));
        	Field profileField = null;
        	try {
            		profileField = im.getClass().getDeclaredField("profile");
            		profileField.setAccessible(true);
            		profileField.set(im, profile);
       		} catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException e1) {
           		 e1.printStackTrace();
       		}
	}

This post has been edited 1 times, last edit by "ciaxx" (Jan 19th 2016, 11:55am)


Shapci

User / Kunde

Posts: 36

  • Send private message

2

Tuesday, January 19th 2016, 11:45am

Bei Setowner soll man einen Namen angeben zB skull.setOwner("Notch");

ciaxx

User / Kunde

  • "ciaxx" is male
  • "ciaxx" started this thread

Posts: 346

Occupation: Schüler

  • Send private message

3

Tuesday, January 19th 2016, 11:56am

Leider habe ich ja keinen Namen sonder nur die Textur. Ich habe gerade noch ein EDIT2 dazugeschrieben wo ich es anders versucht habe.

//EDIT Oooooooooookay das setzen habe ich dank dem hier (Ich hoffe es ist erlaubt das ich die links so reinpacke) hinbekommen. Ich bin jetzt immerwieder durch den Code gegangen aber ich komme nicht drauf wie ich die Textur auslesen kann. Also man greift ja auf ein GameProfil zu und setzt dann die Textur. Jetzt müsste es doch auch anders rum gehen das, wenn man im OnPlayerInteract auf einen Skull klickt, diesen dann dazu castet und die textur abfragen kann. Also das man am ende überprüfen kann auf was für einen skull geklickt wurde.

This post has been edited 1 times, last edit by "ciaxx" (Jan 19th 2016, 2:08pm)


KleinerGrinch

User / Kunde

  • "KleinerGrinch" is male

Posts: 157

Occupation: Azubi

  • Send private message

4

Tuesday, January 19th 2016, 2:13pm

Korregiert mich, wenn es sich wieder geändert hat:
In Tests habe ich gesehen, das bis Version 1.8.3 die Custom Skin köpfe dargestellt werden, danach bleibt es ein steve skin.

(Base64.getEncoder() gibts nicht mehr)

java.util.Base64 -> ist bestandteil von Java oO
In meiner Freizeit biete ich kostenlosen Support und Programmierungen an.
Homepage - Forum - Minecraft: server.letsmine.eu - Teamspeak: ts.letsmine.eu

ciaxx

User / Kunde

  • "ciaxx" is male
  • "ciaxx" started this thread

Posts: 346

Occupation: Schüler

  • Send private message

5

Tuesday, January 19th 2016, 2:17pm

Korregiert mich, wenn es sich wieder geändert hat:
In Tests habe ich gesehen, das bis Version 1.8.3 die Custom Skin köpfe dargestellt werden, danach bleibt es ein steve skin.

(Base64.getEncoder() gibts nicht mehr)

java.util.Base64 -> ist bestandteil von Java oO


Also ich bin mit Version 1.8.9 auf meinem Server und es wird alles angezeit

Base64.getEncoder().enocde wird mir als Fehler angezeit das es nicht mehr existirt somit habe ich es zu Base64.encode(...) umgeschrieben und es funktioniert

KleinerGrinch

User / Kunde

  • "KleinerGrinch" is male

Posts: 157

Occupation: Azubi

  • Send private message

6

Tuesday, January 19th 2016, 2:44pm

textures.minecraft.net/texture/f3487d457f9062d787a3e6ce1c4664bf7402ec67dd111256f19b38ce4f670

Ist für mich kein Custom Skin ;) wenn man dort einen externen skin angibt, ist es nur bis version 1.8.3 möglich^^
In meiner Freizeit biete ich kostenlosen Support und Programmierungen an.
Homepage - Forum - Minecraft: server.letsmine.eu - Teamspeak: ts.letsmine.eu

ciaxx

User / Kunde

  • "ciaxx" is male
  • "ciaxx" started this thread

Posts: 346

Occupation: Schüler

  • Send private message

7

Tuesday, January 19th 2016, 2:52pm

http://heads.freshcoal.com/maincollection.php - Das zählt für mich als Custom skins, sie wurden einmal als Minecraft skins hochgeladen und dann wieder geändert. Da Mojang aber auch alter Skins speichert kann man so auf diese zugreifen.

ciaxx

User / Kunde

  • "ciaxx" is male
  • "ciaxx" started this thread

Posts: 346

Occupation: Schüler

  • Send private message

8

Wednesday, January 20th 2016, 7:53pm

Kennt sich denn jemand gut genug aus mit den properties des GameProfiles um bei einem skull die aktuelle textur auszugeben? Oder gibt es da eine andere möglichkeit? (Ich möchte im InteractEvent abfragen auf was für einen Skull er klickt also zB ein Burger, Speaker, etc)

ciaxx

User / Kunde

  • "ciaxx" is male
  • "ciaxx" started this thread

Posts: 346

Occupation: Schüler

  • Send private message

9

Friday, January 22nd 2016, 3:13pm

Weiss irgendjemand ob es eine Methode gibt die Köpfe im onPlayerInteractEvent abzufragen ohne für jeden skull den man platziert die Location zu speichern? Brauch dringend hilfe ...

itsTimon

User / Kunde

  • "itsTimon" is male

Posts: 195

Location: Hannover

Occupation: Schüler

  • Send private message

10

Friday, January 22nd 2016, 4:02pm

Hier gibt es nen Tutorial aus dem Postcrafter-Forum ;)
http://postcrafter.de/viewtopic.php?f=15&t=2773

Zitat

Der Computer wurde zur Lösung von Problemen erfunden, die es früher nicht gab.

- Bill Gates

ciaxx

User / Kunde

  • "ciaxx" is male
  • "ciaxx" started this thread

Posts: 346

Occupation: Schüler

  • Send private message

11

Friday, January 22nd 2016, 5:48pm

Mit der klasse kann man die Köpfe erschaffen aber ich weis leider trotzdem noch nicht wie ich die textur auch wieder auslesen kann. Ich kenne mich mit NMS nicht so aus (benutze die angegebene klasse bereits ;) ) aber wenn man über NMS das GameProfile bekommt (wie beim setten der textur) kann man anstatt den skin zu setzten auch die "texture" property auslesen. Müsste glaube ich als Base64 rauskommen aber das dürfte eig reichen.
Nur wie funktioniert so etwas?

funkiighg

User / Kunde

Posts: 25

  • Send private message

12

Friday, January 22nd 2016, 7:18pm

Kenne mich mit den Command, um andere Spielerköpfe zu spawnen nicht aus, aber könnte man den Command jetzt nicht nicht einfach über das Plugin ausführen?
Meines Wissens ging das iwie mit Bukkit.dispatchCommand("cmd");
oder so und des dann in den cmd oder in das Event packen. Bin grad nur am Handy also verzeiht evtl. Rechtschreibfehler :b

ciaxx

User / Kunde

  • "ciaxx" is male
  • "ciaxx" started this thread

Posts: 346

Occupation: Schüler

  • Send private message

13

Friday, January 22nd 2016, 7:31pm

Ähm das Thema ist inzwischen gelöst aber trotzdem danke, momentan habe ich das Problem bei einem bereits gesetzten Kopf die textur "auszulesen"

itsTimon

User / Kunde

  • "itsTimon" is male

Posts: 195

Location: Hannover

Occupation: Schüler

  • Send private message

14

Friday, January 22nd 2016, 9:18pm

Dann holst du dir das GameProfile und liest einfach über den Key "textures" die Texture aus.

PHP Source code

1
profile.getProperties().get("textures")

Es gibt dir aber ne Collection zurück müsstest du eventuel noch zu nem String casten oder dir den String rausholen :)

Zitat

Der Computer wurde zur Lösung von Problemen erfunden, die es früher nicht gab.

- Bill Gates

ciaxx

User / Kunde

  • "ciaxx" is male
  • "ciaxx" started this thread

Posts: 346

Occupation: Schüler

  • Send private message

15

Friday, January 22nd 2016, 9:33pm

Vielen Dank schonmal für die hilfe :)

Okay ich habe es jetzt so:

Java source code

1
2
3
4
Skull skull = (Skull) e.getClickedBlock().getState();
TileEntitySkull skullTile = (TileEntitySkull) ((CraftWorld)skull.getWorld()).getHandle().getTileEntity(new BlockPosition(skull.getX(), skull.getY(), skull.getZ()));
GameProfile profile = skullTile.getGameProfile();
String texture = (String) profile.getProperties().get("textures");

Allerdings kann man nicht von einer Collection<property> zum String casten. Ich habe leider auch keine Ahnung wie ich das bewerkstellen soll da ich mir nicht ganz sicher bin was property ist. Also sollte ich einfach mal die Collection mit einer for-Schleife durchgehen und mir alles ausgeben?

//EDIT
Ich habe die collection einfach mal durchlaufen lassen und mir ausgeben lassen. Ich bekomme immer "com.mojang.authlib.properties.Property@c12dc5f" raus. Das was hinter dem @ steht variiert immer je nach skull. Leider ist es aber auch bei gleichen Texturen immer etwas anderes sonst könnte ich das ja als "Skull-Identifikation" verwenden ...
Weis einer ob man das irgendwie auswerten kann (beim Base64 decoden kommt nichts raus = kein Base64) oder was das bedeutet?

This post has been edited 1 times, last edit by "ciaxx" (Jan 23rd 2016, 11:55am)


itsTimon

User / Kunde

  • "itsTimon" is male

Posts: 195

Location: Hannover

Occupation: Schüler

  • Send private message

16

Saturday, January 23rd 2016, 1:18pm

Also wenn es so nicht geht dann speichere doch die UUID des GameProfiles und frage sie wenn man auf einen Skull klickt wieder ab.

PHP Source code

1
profile.getId(); // Returnt die UUID

Zitat

Der Computer wurde zur Lösung von Problemen erfunden, die es früher nicht gab.

- Bill Gates

ciaxx

User / Kunde

  • "ciaxx" is male
  • "ciaxx" started this thread

Posts: 346

Occupation: Schüler

  • Send private message

17

Saturday, January 23rd 2016, 1:33pm

Dann müsste ich ja aber wieder jede skull UUID wieder speichern. Ich wollte es eig so machen das man die skulls einfach irgendwo setzen kann und das plugin diese automatisch erkennt ohne das ich hunderte UUIDs speichern muss

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