Forum jest aktualnie zamknięte.

Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Tworzenie własnych czarów cz.2 - Czary wieloinstancjowe (MUI)
#1
Siema

Witajcie w drugiej części poradnika o robieniu czarów. W pierwszej części poznaliśmy sposoby, pewne kawałki, które umiejętnie poskładane mogą stworzyć całkiem fajny czar. Ale tamta wiedza dotyczy tylko czarów jednoinstancjowych (Single User Instanceability) czyli takich, gdzie tylko jedna instancja czaru może działać na raz (nie możemy użyć tego czaru przez 2 jednostki bo nie będzie działać poprawnie). A przecież aby czar był sukcesem, nie może się bugować w żadnym wypadku. Dowiedzmy się zatem jak robić czary wieloinstancjowe (Multiple User Instanceability).

Poznać i zrozumieć MUI.
Na pewno pamiętacie czar leczący z poprzedniego poradnika. Ten, który co sekundę leczył jednostkę o jakąś wartość przez 3 sekundy.
[Obrazek: mDOpEux.png]
[Obrazek: 7FCI2D4.png]

Powinien zadziałać prawda?

[Obrazek: ITeBMNq.png]
Niebieski - Numer instancji
Zielony - Uleczone punkty zdrowia
Czerwony - Pozostały czas do zakończenia czaru

Co się więc stanie jeżeli w tym momencie, kiedy naszej elfce pozostały 2 sekundy do zakończenia czaru, jakiś inny elf rzuci ten sam czar?

[Obrazek: 3Z00hfu.png]
W takim wypadku elfka z instancją pierwszą nie będzie otrzymywać swojego HP. A czemu? Bo zmienna TargetUnit została nadpisana przez inną jednostkę. I nie tylko ona. Wyzwalacz pierwszy nadpisał wszystkie zmienne jakie się tam pojawiły. A są one bezpośrednio powiązane z drugim wyzwalaczem gdzie korzystamy z owych zmiennych. Czar więc będzie działać ale tylko dla jednostki która rzuciła później zaklęcie.
To bardzo dobrze pokazuje dlaczego chcemy posiadać czary wieloinstancjowe. Aby takie problemy nie pojawiały się podczas gry jeżeli zechcemy aby nasz czar posiadała więcej niż jedna jednostka.

Jakie zmienne więc zostały nadpisane? 
TargetUnit - Tutaj jednostka zmieniła się na inną, a poprzednia została zapomniana,
CzasTrwaniaCzaru - Pozostały czas do zakończenia czaru, nasz licznik. Każda instancja powinna mieć swój unikalny licznik, bo przecież czary trwające tyle samo, uruchomione w innym momencie zakończą się również w innym momencie.

Czym się nie przejmujemy?
UleczenieNaSekundę - to również jest nadpisywane, ale to jest wartość naszego uleczenia, dla każdej jednostki taka sama, została nadpisana na tą samą wartość, więc tak jakby nic jej się nie stało.
CastingUnit - w tym szczególnym przypadku nie przejmujemy się tym, bo w tej umiejętności nie korzystamy z tej zmiennej (co innego w innych czarach gdzie dostęp do jednostki rzucającej zaklęcie jest niezbędny)

Aby uchronić to co nie może zostać nadpisane, musimy rozszerzyć te zmienne o tablice. Zawsze powinniśmy zapisywać w zmiennej z tablicą to z czego będziemy korzystać w naszym drugim wyzwalaczu. Tak to powinno teraz wyglądać:

[Obrazek: eXQCk9b.png]
W takim wypadku pierwsza instancja czaru osiągnie indeks 1, druga osiągnie indeks 2 i tak dalej. Nasza elfka zostanie zapisana w zmiennej TargetUnit[1], a elf w TargetUnit[2] czyli tak jakby w innej zmiennej. Podobnie z CzasTrwaniaCzaru. Jak uruchamiamy drugi wyzwalacz to sprawdzamy czy MaxIndeks równa się 1. Jeżeli będzie większy od 1 to znaczy że czar już jest uruchomiony i nie potrzeba jeszcze raz włączać drugiego wyzwalacza.

[Obrazek: 2VeOuYp.png]

Mamy więc 3 instancje, postarajmy się zrobić pętle przez wszystkie trzy, aby uzyskać dostęp do każdej jednostki i każdą uleczyć:

[Obrazek: 8mgWu8T.png]

Pętla wykonuje się tutaj 3 razy, od 1 do 3. Za każdym razem uzyskujemy dostęp do innej instancji i innych zmiennych. Możemy wykonać więc te same operacje dla wszystkich instancji.
No dobra, ale ta pętla jest dość specyficzna, wykonuje się tylko dla trzech instancji. A co jak instancji będzie więcej? Musimy jakoś zwiększyć tą trójkę o 1 za każdym razem jak jakaś jednostka ponownie rzuci czar.
Ale popatrzmy jeszcze raz na pierwszy wyzwalacz:

[Obrazek: eXQCk9b.png]

Ilość pętli w drugim wyzwalaczu powinna odpowiadać ilości instancji, a w tym pierwszym wyzwalaczu zwiększamy MaxIndeks za każdym razem jak pojawia się nowa instancja. O to chodzi. Naszą trójkę w pętli zamieniamy na MaxIndex:

[Obrazek: IwccEXl.png]

Więc pętla zamiast wykonywać się od 1 do 3 będzie się wykonywała od 1 do MaxIndexsu czyli od 1 do liczby aktywnych instancji.
Przeanalizujmy to nieco dokładniej:
LoopIndex to zmienna typu C, wykorzystujemy ją zamiast Integer A. Osiąga on wartość od 1 do MaxIndeks, dzięki temu uzyskujemy dostęp do każdej instancji.
Zastanawiacie się pewnie czemu zostawiłem akcje po sprawdzeniu warunku puste. Co zrobić jak instancja się zakończy? Musimy zmniejszyć indeksy i liczbę instancji o tą, która już się zakończyła, w przeciwnym wypadku instancja będzie dalej działać a MaxIndeks będzie stale rósł (maksymalnie może osiągnąć wartość 8191)
Jak więc to zrobić?
Podmieniamy ostatnią instancję z tą, która już się zakończyła.

[Obrazek: V88Dmvm.png]

Tyrande zakończyła swój czar, więc Illidan zajmuje miejsce jej instancji. Więc chcemy, aby Illidan uzyskał indeks 1 zamiast obecnego 3. Potem obniżamy MaxIndeks i LoopIndex o 1 dzięki temu maleje ilość instancji o 1 (czyli o tą która już się zakończyła) i cofamy pętlę o 1 dzięki temu akcje mogą się wykonać dla Illidana, który to pojawił się na nowej instancji. Powinno to wyglądać tak:

[Obrazek: Mcwk4Ar.png]
Na koniec sprawdzam jeszcze czy MaxIndeks równa się 0, jeżeli tak, to znaczy że nie ma już żadnych instancji i możemy wyłączyć wyzwalacz w którym wykonuje się pętla.
I gotowe. Czar będzie działać idealnie.

Tutaj oba wyzwalacze razem żeby były dobrze widoczne:

[Obrazek: eXQCk9b.png]
[Obrazek: Mcwk4Ar.png]

Wielkie dzięki PurgeandFire z Hiveworkshop. Wzorowałem się na jego poradniku.
Dzięki połączeniu wiedzy z tego i poprzedniego poradnika będziecie tworzyć niesamowite czary.
Liczę że poradnik się Wam spodoba i będzie pomocny
Pozdrawiam :)
Odpowiedz
#2
Jesli chodzi o tablice, to mam na nie swoj wlasny sposob. Jesli czar standardowo nie ma swojego czasu dzialania, to uzywam zmiennej integer A i B. W indeksie A zapisuje jednostke a index B jest dodawany oddzielnie po wait az minie buff
Odpowiedz
#3
Waity są bardzo niepewne i uważam że nie warto im ufać. Integer Zmiennej typu C jest szybszy niż integer A/B. No i używasz dwóch pętli, a tutaj korzystam z jednej.
Odpowiedz
#4
Sa pewne i nie wymagaja petli
Odpowiedz
#5
Pokażesz swoje sposoby z użyciem akcji wait?
Odpowiedz
#6
czemu nie zrobic poprostu hashtable zamiast tych wszystkich zmiennych?
Odpowiedz
#7
Zmienne są szybsze, wygodniejsze i bardziej czytelne. Wyobraź sobie że masz czar w którym musisz zapisać 15 różnych rzeczy dla jednej instancji. Wczytywanie tego po kolei jest strasznie długie i monotonne. No i musisz pamiętać pod jaką cyfrą co zapisałeś. Pamiętaj też że jest to poradnik dla zielonych, zmienne są chyba łatwiejsze do zrozumienia niż hashtable. Ogólnie jest milion sposobów żeby osiągnąć MUI. Od podstaw do czegoś bardziej zaawansowanego. Hashtable wykorzystuje podobną zasadę jaką tutaj opisałem.
Odpowiedz
#8
od tego są komentarze, żeby nie trzeba było pamiętać
faktycznie zmienne wydają się łatwiejsze ale jak się załapie hashtable to są jakieś wygodniejsze i bardzo intuicyjne
Odpowiedz
  


Skocz do:


Użytkownicy przeglądający ten wątek:
1 gości