Download as pdf or txt
Download as pdf or txt
You are on page 1of 9

Lekcja 23

Witaj ponownie!
Skończyliśmy tworzenie bloku generującego wieżę, czas na dodanie do niego nowych
funkcjonalności. Oprócz tego na dzisiejszej lekcji dodamy do naszego moda ranged item,
czyli przedmiot miotający!
Zaczynajmy!

Pamiętaj, że instrukcja dotyczy MCreatora w wersji 2021.2. Jeżeli masz nowszą


wersję, skorzystaj z instrukcji poniżej, aby uporać się z różnicami pomiędzy wersjami
lub też zainstalować właściwą wersję programu.
Aktualizacja MCreatora - co robić?

Uruchom projekt z naszą modyfikacją i utwórz przedmiot miotający korzystając z zielonego


plusa w lewej górnej części ekranu.

Pierwszym krokiem jest nazwanie przedmiotu. Żeby zachować spójność z zeszłymi lekcjami,
proponujemy nazwę Wand, czyli różdżka po angielsku.
Czas by omówić interfejs tworzenia przedmiotu miotanego!
Na samej górze, masz dostęp do wyboru tekstury naszego przedmiotu. Mieliśmy już okazję
omawiać tą opcję podczas lekcji 17 (strona 4.).
Linijka Item model pozwala na wybranie innego niż standardowego modelu, który określa
wygląd przedmiotu. W ramach naszych zajęć pozostawimy tą opcję niezmienioną na
wartości Normal.
In-game name określa nazwę wyświetlaną przy wyborze przedmiotu w ekwipunku gry.
Domyślne jest ona ustawiona na nazwę, którą wpisaliśmy przy tworzeniu przedmiotu i
możemy nią dowolnie manipulować.
Special information about the ranged item umożliwia określenie podpowiedzi, które
wyświetlą się po najechaniu kursorem na przedmiot podczas gry.
Creative inventory tab pozwala na zmianę zakładki ekwipunku, w której pojawi się
przedmiot.
Item animation daje możliwość wyboru animacji, która będzie się odtwarzała podczas
użycia przedmiotu podczas rozgrywki.
Max stack size ustawia maksymalną liczbę przedmiotu w stacku.
Damage vs mob/animal - ta opcja umożliwia określenie, czy przedmiot będzie zadawał
obrażenia, gdy użyjesz go lewym przyciskiem myszy.
Item for ammo pozwala na wybór amunicji, którą będzie wykorzystywał przedmiot.
Pozostawienie opcji pustej, sprawi, że przedmiot nie będzie potrzebował amunicji.
Shoot constantly when active przełącza możliwość ciągłego strzału przy przytrzymaniu
prawego przycisku myszy. Domyślnie ta opcja jest wyłączona.
Item usage count określa liczbę użyć przedmiotu wykonanych przed jego zniszczeniem.
Ranged action sound określa dźwięk, który będzie wydany podczas użycia przedmiotu.
Enable glowing effect - zaznaczenie tej opcji sprawi, że tworzony item będzie miał efekt
poświaty.

Przejdźmy teraz do zakładki bullet u dołu okna MCreatora.

W tym oknie będziesz ustawiać opcje pocisku, który pojawi się po użyciu różdżki.
Bullet power - opcja określająca z jaką siłą zostanie wystrzelony pocisk. Ustawienie tutaj
wartości 1 sprawi, że pocisk z różdżki będzie leciał na taką samą odległość jak strzała z
łuku.
Bullet damage - określa obrażenia zadawane przez pocisk z różdżki.
Bullet knockback - odrzut przeciwnika, spowodowany trafieniem pociskiem.
Has bullet particles - zaznaczenie tej opcji doda efektu cząsteczkowe do wystrzelonego
pocisku.
Does bullet ignite fire? - opcja określa czy pocisk będzie podpalał blok, który zostanie
trafiony pociskiem.
Item representing texture of a bullet - określa teksturę, jaką będzie miał lecący pocisk.
Bullet model - ustawienie bardzo podobne do Item model z poprzedniego ekranu. Tutaj
również można wybrać inny niż standardowy model pocisku. Tak jak w przypadku Item
model, tą opcję pozostaw niezmienioną.
Model texture pozwala na wybór tekstury pocisku, jeżeli wybrano opcję inną niż Default w
linijce z Bullet model.

Pamiętaj, że przedstawionymi opcjami warto się pobawić, sprawdzić różne kombinacje, tak,
żeby przedmiot był dla Ciebie jak najbardziej atrakcyjny! Każda z opcji ma również ikonę
znaku zapytania , po kliknięciu której masz dostęp do opisu i przykładowych ustawień.

Teraz musimy sprawić, aby nasza różdżka pojawi się w ogóle w grze. Naszym stołem
warsztatowym będzie stworzona ostatnio przez nas wieża, ale żeby była w stanie pełnić tę
funkcję, będziemy musieli nieco ją zmodyfikować. Po pierwsze dodajmy na szczyt wieży coś
nietypowego, co normalnie nie znajdzie się na takiej wysokości, np. skałę macierzystą czyli
BEDROCK.
Do ustawiania bloku skały macierzystej posłuży nam linijka:
world.setBlockState(new BlockPos(X, Y, Z), Blocks.BEDROCK.getDefaultState(), 3);

Zastanówmy się wspólnie gdzie ta linijka powinna się znaleźć. Najodpowiedniejszym


miejscem wydaje się koniec metody makeTower() - w ten sposób dodasz blok do gotowej
już wieży.

Po drugie należy się zastanowić na jakich współrzędnych właściwie BEDROCK powinien


się pojawić, aby był na środku najwyższego poziomu wieży. Pamiętaj, że nasz blok, który
wieżę stworzył, znajdował się dokładnie na środku najniższego jej poziomu. Zatem blockX i
blockZ z pewnością są dobrymi współrzędnymi, przynajmniej jeśli chodzi o dwie osie. Co
zatem z wysokością? Trzeba się tu posłużyć tą samą zmienną, która odpowiadała nam za
wysokość wieży przez cały czas budowy, czyli Y. Metoda makeTower() po edycji powinna
zatem wyglądać mniej więcej tak, jak na obrazku poniżej.
Udało Ci się przygotować miejsce, w którym będziemy przekuwać magiczną rudę na
różdżkę, brakuje jeszcze tylko sposobu na jej przerobienie. Będzie nam potrzebna do tego
krótka procedura dla rudy, którą powinniśmy mieć stworzoną, dla zdarzenia When block
added. Dodamy do niej krótki kod, który umieścimy na samym końcu głównej metody
executeProcedure(), tuż za kodem napisanym przez nas. Ale zanim go dodamy…

Pora zapoznać się z nowym elementem kodu! Dodaliśmy do naszej wieży BEDROCK, ale
nie może nam wystarczyć, aby ruda znalazła się na bloku skały macierzystej, by zamieniać
się w różdżkę. Musimy jednocześnie spełnić dwa warunki. Jednym z nich jest właśnie blok
skały macierzystej pod rudą, ale drugi, po to nam właśnie była wieża, będzie odpowiednia
wysokość. Połączymy zatem dwa warunki przy pomocy symbolu &&. Na początku, ta
konstrukcja może się wydawać trochę nietypowa, ale jest to nic innego niż, dobrze znany z
konstruktora kodów operator logicznego i.

W Javie powyższy kod będzie wyglądał następująco:

W naszym przypadku połączymy ze sobą warunek sprawdzający BEDROCK pod blokiem


rudy i sprawdzimy, czy ruda znajduje się na odpowiedniej wysokości. Warunek sprawdzenie
bloku skały macierzystej pod blokiem naszej rudy to:

world.getBlockState(new BlockPos(x, y - 1, z)).getBlock() == Blocks.BEDROCK


Drugi warunek natomiast będzie sprawdzał, czy jesteśmy na odpowiedniej wysokości, czyli
należy sprawdzić, czy zmienna y ma odpowiednio dużą wartość, możemy to zrobić
korzystając ze znaku większe lub większe lub równe. W moim przypadku sprawdzać
będę, czy y jest większy lub równy 120. Pamiętaj, aby dopasować tę wartość do
wysokości swojej wieży.

Finalnie korzystając z && nasza instrukcja warunkowa powinna przyjąć poniższą postać jak
poniżej, dopisując ją do istniejących.

Czas naszą wieżę przerobić na stół warsztatowy, czyli musimy utworzyć pierwszą recepturę
ale, w kodzie. Ustalmy, że receptura na naszą różdżkę to 3 bloki naszej rudy ułożone po
skosie. Żeby nie sprawdzać czy stoimy w dobrą stronę będziemy musieli ustalić dwie
receptury, robiące to samo. Blok środkowy według napisanego przed chwilą warunku już
jest, pora na bloki na krańcach linii. Żeby ułatwić spojrzenie na to zadanie poniżej obrazek z
małym wyjaśnieniem.

Niebieska i czerwona linia pokazują receptury. A więc powinniśmy sprawdzić czy bloki rudy,
poza środkiem, na bloku skały macierzystej, znajdują się także na miejscach 1 i 2 lub 3 i 4.
Wyjdzie z nam tego całkiem spory warunek, więc spróbujmy go zrobić tak, aby był jak
najbardziej przejrzysty. Możemy to tego wykorzystać metodę, którą przygotowano specjalnie
do sprawdzania, czy w danym miejscu jest ruda, musisz jedynie w miejscu <NazwaRudy>
wstawić swoją nazwę.
public static boolean isOre(double x, double y, double z) {

if (world.getBlockState(new BlockPos(x, y, z)).getBlock() == <NazwaRudy>Block.block) {

return true;

return false;

Zwróć uwagę na typ tej metody - to boolean. Znasz ten typ bardzo dobrze, mimo że nie
korzystaliśmy z niego bezpośrednio pod jego nazwą. Oznacza on bowiem prawdę/fałsz.
Każdy warunek, który napisaliśmy, mógł być właśnie prawdą lub fałszem, czyli odpowiednio
true lub false. Korzystając z tego typu jednoznacznie możemy określić, czy coś jest
prawdziwe czy też nie. Tak więc na pytanie zadane metodą isOre (czy jest ruda?)
odpowiemy true jeżeli ruda znajduje się w podanym miejscu i false, jeżeli tej rudy nie ma.

Mając tę metodę możemy stworzyć naszą instrukcję warunkową if. Korzystając ze


współrzędnych na obrazku możemy łatwo połączyć warunki tak, aby stworzyć warunek
pytający czy 1 i 2 lub 3 i 4. Podzielmy to podczas tłumaczenia na kawałki, żeby się nie
zgubić i zacznijmy od warunku pytającego czy 1 i 2.

(isOre(x - 1, y, z + 1) && isOre(x + 1, y, z - 1))

Spójrz, jedyne co trzeba było zrobić to wpisać odpowiednie współrzędne do wywołania


metod. Nawet nie musimy sprawdzać czy te metody == true, bo jest to domyślna,
oczekiwana wartość. Warunek pytający czy 3 i 4 wyglądać będzie prawie identycznie,
różnica to jedynie współrzędne.

(isOre(x + 1, y, z + 1) && isOre(x - 1, y, z - 1))

Łączymy oba te warunki znakiem lub (||) i otrzymujemy:

((isOre(x - 1, y, z + 1) && isOre(x + 1, y, z - 1)) || (isOre(x + 1, y, z + 1) && isOre(x - 1, y, z - 1)))

Mając gotowy warunek wstawiamy go do instrukcji warunkowej.

Dodamy na szybko, podobnie jak w przypadku tworzenia podłogi wieży pętle czyszczące
nasz obszar z bloków, żeby nie nadużywać przedmiotów i nie tworzyć nieskończonej ich
ilości.

Teraz pora nieco poszperać w materiałach, bowiem potrzebujemy dwóch kodów:

● Na usuwanie bloku (ustawianie w jego miejscu powietrza), aby skasować rudę


umieszczoną na skale macierzystej na wieży;
● Na przywoływanie przedmiotów.

Umieszczanie bloków znajdziemy nawet w procedurze od wieży, którą udało Ci się ostatnio
stworzyć. Musimy tylko blok podmienić na powietrze, czyli AIR.

world.setBlockState(new BlockPos(x, y, z), Blocks.AIR.getDefaultState(), 3);

W pętli zamieniamy wszystkie bloki w obszarze od x - 1 do x + 1 i od z - 1 do z + 1 na


powietrze.

Przywoływanie to trochę trudniejsza do znalezienia kwestia, ponieważ musielibyśmy cofnąć


się aż do lekcji 4.

Kod wygląda w sposób następujący:

ItemEntity entityToSpawn = new ItemEntity((World) world, x, y, z, new ItemStack(<Nazwa>));

entityToSpawn.setPickupDelay((int) 10);

world.addEntity(entityToSpawn);

Te trzy linijki potrzebne są do przywołania przedmiotu. Pozostaje nam jeszcze uzupełnić


jego nazwę (w miejscu oznaczonym <Nazwa>). Jeżeli Twoja różdżka nazywa się w
WORKSPACE Wand, wtedy nazwa przedmiotu w kodzie to WandItem.block, jeżeli np.
nazywa się Rozdzka to wtedy nazwa w kodzie to RozdzkaItem.block. Uzupełnij nazwę
mając na uwadze to, jaką nazwę ma Twój przedmiot!
Dodajemy linijki już po pętlach i otrzymujemy poniższy rezultat.

Pamiętamy o zapisaniu kodu CTRL + S!

Mamy przygotowaną różdżkę oraz możemy ją stworzyć w naszym świecie. Możesz również
pobawić się jej ustawieniami!

Jako zadanie dodatkowe spróbuj dodać do nowej procedury warunek mówiący o tym, że
jeżeli postawimy naszą rudę na skale macierzystej i na złej wysokości to otrzymamy
węgiel - czy to w formie przedmiotu, czy to bloku węgla. Możesz także spróbować dodać
własną recepturę na inny, nowy przedmiot. W zadaniu tym może pomóc Ci plik z małym
podsumowaniem, który znajdziesz poniżej.

Podsumowanie lekcji 23.

Do zobaczenia na kolejnych zajęciach!

You might also like