IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

5. diel - Minecraft Modding - Teleport 1. časť

Dnes a nabudúce si ukážeme, ako vytvoriť dosť jednoduchý teleport. Ukážeme si tu prácu s NBT a metadátami. Teleport sa bude skladať z dvoch teleportBloků a teleportačného ovládače, pomocou ktorého vyvoříme medzi dvoma blokmi spojenie. Hráč potom príde na tele-blok, klikne naň pravým tlačidlom a jednoducho bude teleportovaných na druhý blok. (To isté z 2. bloku na 1. blok).

Nutné objekty

Metadátami

Metadáta (integer) môžeme nastaviť každému bloku. Je uchovávaný vo Worldu a nie v triede Block. Metadáta je najjednoduchšie spôsob uchovávania nejakého stavu, napr: farby vĺn, typy dreva, páčka, redstone Torche apod. Výhodou je rýchlosť a tiež malý objem dát. Predstavte si, že by ste museli napísať 16 tried pre každú farbu vlny: BlockWoolWhite, BlockWoolOrange ... Nevýhodou je presne to isté a to malý objem dát. Ak chceme napríklad uložiť stav truhly kde je 16 políčok pre itemy, itemov je v MC veľa a ešte ich môže byť od 1 do 64 v každom políčku. Asi vás napadne že používať metadáta je tu zhola nemožné - pre každý možný stav truhly potrebujeme iné meta. Pre nastavovanie metadát sú vo Worldu metódy getBlockMetadata (int x, int y, int z) a setBlockMetada­taWithNotify (int x, int y, int z, int meta).

NBT

NBT je formát vytvorený Notch, pre ukladanie MC svetov. Je to uzlové založený formát, používaný napr: v player.dat alebo level.dat. NBT Tag Compound (= zloženina tagov) je schopný uchovať v sebe ďalšie NBT a tým pádom má neobmedzenú veľkosť. NBT je výborný, ak potrebujeme uchovať viac dát, než sú metadáta. Používa sa napr v: Chest, (všetky bloky s inventory), Sign a Book, kde je používaný na uloženie itemov, stavu, textu v knižke. Veľkosť objektov s NBT sa ale dramaticky zvyšuje, takže neepoužívejte NBT pre objekty, ktoré sa prírodne vyskytujú vo veľkých množstvách. Určite sa najprv zamyslite, či by sa nemohlo použiť radšej metadáta. Tento formát, ako už bolo povedané, slúži na ukladanie všetkých dát nejakého objektu (Block, Item). Je vytvorený preto, aby nebolo nutné ukladať celý objekt, ale iba jeho dáta: keď unloadneme World, zavolá sa metóda writeToNBT (NBTTagCompound), ktorá nám dá NBTtag a my do neho uložíme nejakej naše tagy z našich premenných. Objekt je sneženie, ale dáta sa uložila. Pri načítaní sveta sa zase zavolá metóda readFromNBT (NBTTagCompound), ktorá nám dá NBTtag, aby sme si z neho do nášho novovytvoreného objektu načítali všetky dáta, ktoré sme mali v našom sneženie objektu.

WorldSavedData

Je trieda, určená na uchovávanie tagov pre daný svet. To znamená, že aj pri Reload sveta tam tie informácie budú. Inštancie tejto triedy musia mať svoj vlastný kľúč (String), podľa ktorého sú potom načítané. Ku každému Worldu nemôžu patriť 2 WorldSavedData s rovnakým kľúčom. Pre ukladanie a načítanie tagov používame metódy writeToNBT (NBTTagCompound tag) a readFromNBT (NBTTagCompound tag). Pri write ukladáme do tagu String názov a za neho danú inštančný premenou, pri Read ukladáme do premennej hodnotu, ktorú sme prečítali z tagu za pomoci názvu.

Teória

Najprv by som radšej vysvetlil celú štruktúru a logiku nášho teleport-modu. Bude existovať istý item = ovládač, ktorý bude "spájať" jednotlivé teleport-blocky. Teleport-blocky potom budú čítať spojenie vytvorené ovládačom a pomocou tohto spojenia portnou hráča na 2. block. Tak toľko k úvode, ale teraz ako na to? Poďme sa zamyslieť ako bude spojenie vyzerať a ako ho budeme ukladať.

Spojenia

Spojenie budú tri vlastosti:

  1. Súradnice prvého blocku (int [])
  2. Súradnice druhého blocku (int [])
  3. Unikátne ID spojenia (integer)

Ukladať ho budeme jednoducho pomocou NBT. Otázka však je, akému objektu bude NBT patriť. Toto NBT musí byť vždy prístupné ako bločkom, ktoré budú portovať, tak item = ovládači, ktorý bude spojenie vytvárať. Z tohto dôvodu tento objekt musí byť niekde inde. Ponúka sa tu možnosť hráča, do ktorého by sme to uložili, avšak pri pomyslení na multiplayer to asi nebude tá správna voľba. Jediné logické riešenie je World alebo skôr WorldSavedData. Vďaka tomu bude mod fungovať aj na MP a nebude závislý na hráčoch, blokoch či item.

Ovládač

Keď s ním klikneme prvýkrát na block, si bude musieť uložiť súradnice toho objektu. Až keď s ním klikneme na 2. block, bude musieť vytvoriť spojenie z uložených súradníc predošlého blocku a nových súradníc blocku, na ktorý práve klikáme. K tomuto budeme zase potrebovať NBT. Keď klikneme na prvú block, súradnice blocku sa uloží do Item (teda do NBT), a pri kliknutí na druhý block sa obe súradnice uloží.

BlockPort

Zostáva už len Tele-Block, ktorý sa bude starať o vlastné portovanie. Pri kliknutí na block najprv prečíta z nášho World_NBT súradnice a na tých hráčov portne. Bystrejší z vás iste napadlo, ako block zistí, ktoré spojenie uložené vo World_NBT je to správne, pretože vo World_NBT je veľa spojenie a ako nájsť to pravé? K tomu už vám možno napovedala definície spojenia a jeho 3. atribút: Unikátny ID spojenia. Povedali sme si predsa, že toto ID bude integer a ako už som hovoril metadáta je taky integer, takže je to jasné: použijeme metadáta. :-)

Kodi

MyWorldData

public class MyWorldData extends WorldSavedData {

    private static final String key = "MujUnikatniKlic";
    private static final String nbtName="muj_nbt_tag";

    public NBTTagCompound tag;

    public MyWorldData(String key){
        super(key);
        tag=new NBTTagCompound();
    }


    public static MyWorldData forWorld(World world) {
        // vrátí instanci MyWorldData náležící k danému worldu, popřípadě vratí novou instanci, pokud ve worldu zatím instance není
        MapStorage storage = world.perWorldStorage;
        MyWorldData result = (MyWorldData)storage.loadData(MyWorldData.class, key);
        if (result == null) {
            result = new MyWorldData(key);
            storage.setData(key, result);
        }
        return result;
    }

    @Override
    public void readFromNBT(NBTTagCompound nbt) {
        tag=nbt.getCompoundTag(nbtName);//přečte tag z nbt a uloží ho do instance
    }
    @Override
    public void writeToNBT(NBTTagCompound nbt) {
        nbt.setTag(nbtName, tag);//přečte tag z instance a zapíše ho do nbt
    }

Tu sme si vytvorili potomka triedy WorldSavedData a pridali sme mu atribút NBTTagCompound, ktorý správne ukladáme a zapisujeme pomocou metód write a read. Používame pritom kľúč k získaniu práve tohto NBT, ktorý bol deklarovaný vo finálnej premenné nbtName. Ďalej tu stojí za zmienku statická metóda forWorld (), ktorá vráti inštanciu MyWorldData uloženú vo svete.

Ovládač

public class ItemPortRemote extends Item {
    public static final String PORADI="Poradi";
    public static final String TELEMANAGE="Teleport Management";
    public static final String L1="l1";
    public static final String L2="l2";


    public ItemPortRemote(){
        this.maxStackSize=1;
        this.setUnlocalizedName("port_remote");
        this.setTextureName("port_remote");
    }
}

V ovládači si okrem základných vecí deklarujeme pár finálnych premenných, ktoré budeme používať pre prístup do nášho MyWorldData.tag. Ďalej budeme potrebovať túto metódu, ktorá bude ukladať všetky premenné, ktoré bude musieť ovládač mať, do NBT patriacemu itemStacku.

public void writeToNBT(int x, int y,int z, boolean MamData, ItemStack itemstack){
    itemstack.stackTagCompound.setInteger("x", x);
    itemstack.stackTagCompound.setInteger("y", y);
    itemstack.stackTagCompound.setInteger("z", z);
    itemstack.stackTagCompound.setBoolean("MamData", MamData);
}

V ďalšom diele nás čaká objektovej usporiadanie tagov našich spojenia, zabezpečenie portovanie naším Blockom a celkové dorobenie. :-) Ak máte nejakú pripomienku alebo potrebujete pomoc, určite napíšte.


 

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 595x (1.59 kB)

 

Predchádzajúci článok
Minecraft Modding - Soľná palička a crafting
Všetky články v sekcii
Minecraft Modding
Preskočiť článok
(neodporúčame)
Minecraft Modding - Teleport 2. časť
Článok pre vás napísal Matěj Černý
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje programování v Javě, C++, zajímá se o OpenGL.
Aktivity