Köpfe individuell gestalten

Wenn ihr bei eurem Plugin nicht weiter kommt, könnt ihr hier euer Problem beschreiben und um Hilfe bitten.

Re: Köpfe individuell gestalten

Beitragvon Jofkos » Di 30. Sep 2014, 20:11

Sehr interessant das ganze xD
Hab' hier mal schnell 'ne Methode für Bukkit gemacht, um den Skin zu ändern: (getestet unter neustem Spigot-Patch und Minecraft 1.8)
Code: Alles auswählen
  1.    public void setSkin(Block skull, String skinUrl) {
  2.       TileEntitySkull tile = (TileEntitySkull) ((CraftWorld) skull.getWorld()).getHandle().getTileEntity(skull.getX(), skull.getY(), skull.getZ());
  3.       NBTTagCompound texture = new NBTTagCompound();
  4.       texture.setString("Value", Base64Coder.encodeString("{textures:{SKIN:{url:\"" + skinUrl + "\"}}}"));
  5.       NBTTagList textures = new NBTTagList();
  6.       textures.add(texture);
  7.       NBTTagCompound properties = new NBTTagCompound();
  8.       properties.set("textures", textures);
  9.       NBTTagCompound owner = new NBTTagCompound();
  10.       owner.setString("Id", UUID.randomUUID().toString());
  11.       owner.set("Properties", properties);
  12.       NBTTagCompound compound = new NBTTagCompound();
  13.       tile.b(compound);
  14.       compound.set("Owner", owner);
  15.       tile.a(compound);
  16.       tile.update();
  17.       skull.getWorld().refreshChunk(skull.getChunk().getX(), skull.getChunk().getZ());
  18.    }
Falls erwünscht kann ich auch noch erklären was hier so passiert ;D
Jofkos

...........

..Bild
Benutzeravatar
Jofkos
 
Beiträge: 1537
Registriert: So 16. Jun 2013, 22:45

Re: Köpfe individuell gestalten

Beitragvon ilouHD » Di 30. Sep 2014, 20:14

Wow - Das ist gut...

Könntest du denn mal erklären, wie man es verwendet, und was da passiert?
Bild
Benutzeravatar
ilouHD
 
Beiträge: 1733
Registriert: Do 9. Jan 2014, 14:49

Re: Köpfe individuell gestalten

Beitragvon Jofkos » Di 30. Sep 2014, 20:16

ilouHD hat geschrieben:Wow - Das ist gut...

Könntest du denn mal erklären, wie man es verwendet, und was da passiert?
Verwendung:
Code: Alles auswählen
  1. setSkin(Block derKopf, String UrlZumBild)
Erklärung:
Ich habe mir einfach mal angeschaut, wie der Type im Video es gelöst hat. Ich hab' den Kopf gesetzt und dann hab' ich in der jeweiligen Chunk-Datei nachgeschaut, wie das ganze im NBT-Format aussieht:
Bild
Dann habe ich einfach das in Java nachgebildet und der TileEntity dann den TagCompound übergeben:
Code: Alles auswählen
  1. public void setSkin(Block skull, String skinUrl) {
  2.     TileEntitySkull tile = (TileEntitySkull) ((CraftWorld) skull.getWorld()).getHandle().getTileEntity(skull.getX(), skull.getY(), skull.getZ()); // Nms TileEntity holen
  3.     NBTTagCompound texture = new NBTTagCompound(); // neues NBTTagCompound
  4.     texture.setString("Value", Base64Coder.encodeString("{textures:{SKIN:{url:\"" + skinUrl + "\"}}}")); // in den ersten Compound der NBTTagListe wird die TexturenUrl in Base64 kodiert eingetragen
  5.     NBTTagList textures = new NBTTagList(); // neue NBTTagListe
  6.     textures.add(texture); // der Wert wird zur Liste hinzugefügt
  7.     NBTTagCompound properties = new NBTTagCompound();
  8.     properties.set("textures", textures); // die Liste wird zu den Properties hinzugefügt
  9.     NBTTagCompound owner = new NBTTagCompound();
  10.     owner.setString("Id", UUID.randomUUID().toString()); // id wird zu random uuid gesetzt
  11.     owner.set("Properties", properties); // Properties werden zu Owner hinzugefügt
  12.     NBTTagCompound compound = new NBTTagCompound();
  13.     tile.b(compound); // Daten von tileEntity werden in den Compound geladen
  14.     compound.set("Owner", owner); // Owner wird mit eigenem Wert überschrieben/beschrieben
  15.     tile.a(compound); // werte werden an die Tileentity übergeben
  16.     tile.update(); // tileentity wird geupdatet (skin aber irgendwie nicht)
  17.     skull.getWorld().refreshChunk(skull.getChunk().getX(), skull.getChunk().getZ()); // chunk wird Refresht, damit der neue Skin angezeigt wird.
  18. }
Jofkos

...........

..Bild
Benutzeravatar
Jofkos
 
Beiträge: 1537
Registriert: So 16. Jun 2013, 22:45

Re: Köpfe individuell gestalten

Beitragvon naturboy » Mi 1. Okt 2014, 17:03

Heißt das jetzt das man sozu sagen einem Spieler einen anderen skin auf dem server verpassen kann on minecraft Account und namens änderung?
Wenn ja könntest du @jofkos den code hier für alz anleitung bereit stellen?
Benutzeravatar
naturboy
 
Beiträge: 279
Registriert: Mi 17. Jul 2013, 17:45

Re: Köpfe individuell gestalten

Beitragvon IK_Raptor » Mi 1. Okt 2014, 17:12

Der Code von Jofkos ändert nicht den Skin des Spielers direkt, sondern gibt nur an, dass für einen Skull eine alternative Texture inform einer URL benutzt werden soll.
Was du machen willst sollte aber auch möglich sein: https://forums.bukkit.org/threads/class ... ut.273251/
Benutzeravatar
IK_Raptor
 
Beiträge: 609
Registriert: Mo 12. Aug 2013, 15:37

Re: Köpfe individuell gestalten

Beitragvon Jofkos » Mi 1. Okt 2014, 17:57

Ich hab' den Code zur Kopfänderung noch mal neugeschrieben/verbessert.
Ich empfehle die Verwendung der neuen Version:
Code: Alles auswählen
  1. public void setSkinv2(Block skull, String skinUrl) {
  2.    TileEntitySkull tile = (TileEntitySkull) ((CraftWorld) skull.getWorld()).getHandle().getTileEntity(skull.getX(), skull.getY(), skull.getZ()); // TileEntity an der angegebenen Stelle getten
  3.    
  4.    GameProfile profile = new GameProfile(UUID.randomUUID(), null); // neues Gameprofile, Random UUID, kein Name
  5.    profile.getProperties().put("textures", new Property("textures", Base64Coder.encodeString("{textures:{SKIN:{url:\"" + skinUrl + "\"}}}"))); // Texture Propertie setzen, wie gehabt in Base64 kodiert
  6.    tile.setGameProfile(profile); // Dem kopf das Gameprofile mit der angegebenen Texture setzen
  7.    
  8.    skull.getWorld().refreshChunk(skull.getChunk().getX(), skull.getChunk().getZ()); // Chunk refreshen damit die Textur auch beim Client geupdatet wird
  9. }
Jofkos

...........

..Bild
Benutzeravatar
Jofkos
 
Beiträge: 1537
Registriert: So 16. Jun 2013, 22:45

Re: Köpfe individuell gestalten

Beitragvon IK_Raptor » Mi 1. Okt 2014, 18:00

Die NMS Variablen zu verändern ist effizienter als den NBT Tag zu ändern, oder warum hast du eine neue Version geschrieben?
Benutzeravatar
IK_Raptor
 
Beiträge: 609
Registriert: Mo 12. Aug 2013, 15:37

Re: Köpfe individuell gestalten

Beitragvon Jofkos » Mi 1. Okt 2014, 18:35

IK_Raptor hat geschrieben:Die NMS Variablen zu verändern ist effizienter als den NBT Tag zu ändern, oder warum hast du eine neue Version geschrieben?
Die NBT-Tags waren recht unnötig.
Hatte es einfach auf die schnelle geschrieben, und fand es im nachhinein recht unübersichtlich, weswegen ich es neu geschrieben habe.
Effizierter ist es zudem wahrscheinlich auch noch, da nicht unnötige NBTTag instanzen erstellt werden, sonder direkt dass gemacht wird, was diese auch machen würden.
Jofkos

...........

..Bild
Benutzeravatar
Jofkos
 
Beiträge: 1537
Registriert: So 16. Jun 2013, 22:45

Re: Köpfe individuell gestalten

Beitragvon ilouHD » Di 11. Nov 2014, 14:58

Hey @Jofkos,

ich rauche nochmal deine Hilfe. Mir war gar nicht die neue Version aufgefallen, also die setSkullv2-Methode. Seitdem ich diese nun in mein Plugin eingebaut habe, werden nicht mehr die Skins, die ich haben möchte angezeigt. Der Skin, der Angezeigt werden soll, ist der hier:
http://clashcraft.cwsurf.de/images/Test/Test_1.png

Aber da kommt dann raus:
http://clashcraft.cwsurf.de/images/Test ... .53.44.png
http://clashcraft.cwsurf.de/images/Test ... .54.09.png


Habe ich etwas falsch gemacht??
Achja, hier der aktuelle Code:
Code: Alles auswählen
  1.    public void setHead(Block skull, String skinUrl) {
  2.       TileEntitySkull tile = (TileEntitySkull) ((CraftWorld) skull.getWorld()).getHandle().getTileEntity(skull.getX(), skull.getY(), skull.getZ());
  3.    
  4.       GameProfile profile = new GameProfile(UUID.randomUUID(), null);
  5.       profile.getProperties().put("textures", new Property("textures", Base64Coder.encodeString("{textures:{SKIN:{url:\"" + skinUrl + "\"}}}")));
  6.       tile.setGameProfile(profile);
  7.    
  8.       skull.getWorld().refreshChunk(skull.getChunk().getX(), skull.getChunk().getZ());
  9.    }
  10.    
  11.    //Im Command, versteht sich, ne:
  12.        else if(command.getName().equalsIgnoreCase("test2")) {
  13.          Player p = (Player) sender;
  14.          if(p.getLocation().getBlock().getState().getType() != Material.SKULL) {
  15.             p.getLocation().getBlock().setType(Material.SKULL);
  16.          }
  17.          setHead(p.getLocation().getBlock(), "http://clashcraft.cwsurf.de/images/Test/Test_1.png");
  18.          
  19.          
  20.          
  21.          AttributeModifier attributeMod = //unwichtig
  22.       }


Hoffe, du kannst mir helfen.

Mit freundlichen Grüßen,
ilouHD

//EDIT: Bei dem 2. Bild ist nur dieser komische Rote Punkt (Unterseite des Skulls) zu sehen, daher wundere ich mich, wo der her kommt.
Bild
Benutzeravatar
ilouHD
 
Beiträge: 1733
Registriert: Do 9. Jan 2014, 14:49

Re: Köpfe individuell gestalten

Beitragvon Jofkos » Di 11. Nov 2014, 20:44

Das bild sollte 64x32 Pixel sein, liegt wahrscheinlich daran xD
Jofkos

...........

..Bild
Benutzeravatar
Jofkos
 
Beiträge: 1537
Registriert: So 16. Jun 2013, 22:45

VorherigeNächste

Zurück zu Hilfe und Support

Wer ist online?

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