Cum pot obține și seta valoarea metadatelor pentru un element de bloc în Minecraft? (Programare, Java, Minecraft, Minecraft Forge)

Steve Shipway a intrebat.

Scriu un modul Minecraft folosind Minecraft Forge.

Pot să recuperez un obiect Block din lume, folosind

Block b = world.getBlock(x,y,z);

totuși, acum că am blocul, cum aflu metadatele? Dacă blocul este un bloc StoneSteps, atunci vreau să știu orientarea acestuia, care este păstrată în metadate.

În mod similar, cum pot seta această valoare? Pot crea un bloc nou destul de simplu:

Block b = Blocks.stone_stairs;

dar, din nou, cum pot seta acest bloc la o anumită orientare? Știu că se poate face acest lucru atunci când se creează un ItemStack, dar în acest caz, vreau un obiect Block care să poată fi transmis către world.setBlock().

Se pare că nu găsesc nicio modalitate de a obține și seta această valoare.

Comentarii

  • În beneficiul viitorilor spectatori: acesta este un caz în care Forge 1.7 și Forge 1.8 diferă în mod semnificativ. În versiunea 1.7 aveți world.getBlock(int.int,int) și world.getBlockMetadata(int,int,int). Cu toate acestea, în versiunea 1.8 aveți doar world.getBlockState(BlockPos). O „stare” este un nou obiect MC1.8 care combină tipul de bloc, valoarea datelor și chiar aspecte ale entității tile corespunzătoare. Apoi se extrage DV din starea respectivă; pentru a seta, se creează o nouă stare de blocuri din tipul de bloc și metadatele, apoi se utilizează cu setBlockState(). –  > Por Steve Shipway.
2 răspunsuri
Electricitate universală

Puteți folosi world.getBlockState(BlockPos); pentru Minecraft 1.8 sau getBlockMetadata(int x, int y, int z); pentru Minecraft 1.7.10.

bcsb1001

Puteți roti blocul prin:

yourBlock.rotateBlock(World someWorld, int x, int y, int z, ForgeDirection axis);

Din documentație:

Rotiți blocul. Pentru blocurile vanilla, aceasta se rotește în jurul axei transmise (în general, ar trebui să fie „fața” care a fost lovită). Notă: pentru blocurile mod, acest lucru este la latitudinea blocului și a celui care face mod-ul să decidă. Nu este obligatoriu să fie o rotație în jurul feței, ci poate fi o rotație pentru a orienta la acea față, sau o vizită de rotații posibile. Totuși, metoda ar trebui să returneze true dacă rotația a avut succes.

Comentarii

  • Aceasta pare a fi cea mai mare parte din ceea ce am nevoie. Presupun că rotește blocul în lume, mai degrabă decât metadatele din yourBlock obiect? De asemenea, deși specifică axa în jurul căreia să se rotească, nu pare să precizeze cât de departe să se rotească… De asemenea, acest lucru nu ajută, de exemplu, la obținerea și setarea culorii unui bloc de lână, ci doar la orientare…  > Por Steve Shipway.
  • @SteveShipway Rotația unui bloc nu este setată de Metadata, care este volatilă și este eliminată la fiecare reîncărcare, ci de valorile pagubelor, ceea ce reprezintă exact această problemă. Folosiți ceea ce vă spune acest răspuns și nu mai presupuneți. –  > Por Unihedron.
  • Se pare că este posibil să folosesc o terminologie greșită. Valoarea pe care încerc să o obțin/stabilesc este Valoarea daunelor pe 4 biți, sau poate Valoarea datelor. Cu toate acestea, se pare că funcția world.getBlockMetadata(x,y,z) o returnează, deci poate că se numește și Metadate. Documentația nu este clară… această funcție returnează orientarea blocului și culoarea lânii, ceea ce este ceea ce căutam, deși funcția rotateBlock este, de asemenea, foarte utilă pentru a afla. –  > Por Steve Shipway.