Imperium

Behemoth`s Lair

Specjaliści od skryptów

Permalink

Witam, poszukuję jakichś specjalistów od skryptów, którzy mogli by poświęcić dla mnie trochę czasu i pomóc mi napisać właściwe skrypty(te które potrzebuję). Jeżeli znajdzie się chociaż jedna chętna osoba, to zacznę pisać pytania pod tym postem. Tak by inne osoby też mogły się tutaj czegoś nauczyć.
Każdy kto zna jakiś działający skrypt, może go tutaj wpisać.
To ja może zacznę, żeby was troszkę rozruszać :)
(Zielony kolor to opis, podpowiedź, którego nie wpisuje się do skryptu.)

Odpalenie scenki od razu po starcie mapy
StartDialogScene( "/ścieżka do scenki" );
Przykład
StartDialogScene( "/DialogScenes/Presentation/Row/Scena1.1/DIALOGPWL/SC1/SC1.1/DialogScene.xdb#xpointer(/DialogScene)" );

Po wejściu w dany region przez bohatera(w tym przypadku Izabelę) odpali się dana scenka.
function MeetingIzabela( heroname ) Zawsze na początku przy funkcji piszemy Meeting + nazwa bohatera(nie skryptowa, tylko taka jak się naprawdę nazywa). W tym przypadku to Izabela, więc MeetingIzabela.
if heroname == "Isabell" then Tutaj wpisujemy nazwę skryptową bohatera.
Trigger( REGION_ENTER_WITHOUT_STOP_TRIGGER, "meeting", nil ); Tutaj wpisujemy nazwę regionu, w którym ma się odpalić nasza scenka po wejściu bohatera.
StartDialogScene( "/DialogScenes/Presentation/Row/Scena1.1/DIALOGPWL/SC1/SC1.1/DialogScene.xdb#xpointer(/DialogScene)" ) tutaj znany nam już skrypt, czyli samo włączenia scenki
RemoveObject("meeting"); tutaj trzeba wpisać znowu nazwę regionu, który zostanie usunięty po jednym wejściu do niego i odegraniu scenki
end;
end;
Trigger( REGION_ENTER_WITHOUT_STOP_TRIGGER, "meeting", "MeetingIzabela" ); Tutaj trigger odpowiadający za to, że scenka zostanie odpalona TYLKO po wejściu w region bez konieczności zostania w nim. Można oczywiście użyć innego triggera, te już znajdziecie w plikach gry, folder ,,Editor Documentation''. "meeting" - tutaj wpisujemy znowu nazwę regionu. "MeetingIzabela" - tutaj wpisujemy nazwę funkcji.
Zaznaczam, że przy pisaniu skryptu trzeba zachować odpowiednie odstępy(tutaj cały skrypt):
function MeetingIzabela( heroname )
if heroname == "Isabell" then
Trigger( REGION_ENTER_WITHOUT_STOP_TRIGGER, "meeting", nil );
StartDialogScene( "/DialogScenes/Presentation/Row/Scena1.1/DIALOGPWL/SC1/SC1.1/DialogScene.xdb#xpointer(/DialogScene)" )
RemoveObject("meeting");
end;
end;
Trigger( REGION_ENTER_WITHOUT_STOP_TRIGGER, "meeting", "MeetingIzabela" );

Możemy jeszcze dodać np. opcję pojawienia się nowego celu pobocznego lub głównego po wyjściu w ten region i odegraniu scenki.
Wtedy skrypt będzie wyglądał mniej więcej tak(mój autorski używany w mapie, więc niektóre wartości różnią się od poprzednika):
function MeetingJakub( heroname )
if heroname == "Nicolai" then
Trigger( REGION_ENTER_WITHOUT_STOP_TRIGGER,"Zombie1",nil );
SetObjectiveState( "Plugastwa", OBJECTIVE_ACTIVE, PLAYER_2, );
sleep(4);
StartDialogScene( "/Maps/NECR/DialogScene.xdb#xpointer(/DialogScene)" );
RemoveObject("Zombie1");
end;
end;
Trigger( REGION_ENTER_WITHOUT_STOP_TRIGGER, "Zombie1", "MeetingJakub" );

SetObjectiveState( "Plugastwa", OBJECTIVE_ACTIVE, PLAYER_2, PLAYER_3 ); "Plugastwa" - nazwa naszego zadania(skryptowa)
sleep(4) - to jest swego rodzaju pauza, tutaj wymagana, aby wszystko poprawnie zadziałało. Tą wartość w nawiasie można zmienić na inną wartość, ponieważ jest to czas.
OBJECTIVE_ACTIVE - Dzięki temu uaktywnia się cel
PLAYER_2 - gracz, który otrzyma zadanie
Oczywiście trzeba do tego dodać samą odpowiednią konfigurację zadania w edytorze. Ale z tym już powinniście sobie poradzić :)

Liczba modyfikacji: 13, Ostatnio modyfikowany: 22.10.2018, Ostatnio modyfikował: Specters

Permalink

Hej! Fajnie, że wrzuciłeś taki wątek!
Niestety w JB ciężko będzie Ci znaleźć partnera do wymiany doświadczeń. Pod tym względem nasze forum kuleje, a po tego typu informacje zwykle zgłaszałem się do heroescommunity. Jak pamiętam(a długo tu jestem), na naszym forum ten temat nigdy nie był poruszany. A szkoda, bo edytor H5 ma olbrzymie możliwości, nierzadko daleko wykraczające poza możliwości swoich poprzedników.

Sam dysponuje raczej znikomym doświadczeniem w tej materii - co najwyżej gmeranie w istniejących skryptach, tudzież ich kopiowanie z istniejących map. Ale możliwe, że Haven coś by skrobnął. Dość mocno siedział w modach, więc bardzo możliwe, że i w tej dziedzinie coś umie.

Byłoby super, gdyby ten wątek stał się bazą podstawowej wiedzy o skryptach. A sam byłbym bardzo skory do nauczenia się czegoś nowego, a zaczynając od podstaw, parafrazując klasyka: nie mając nic można zbudować fabrykę!
Ze swojej strony mam w pamięci sporo mapek, w których były wykorzystywane skrypty i podrzucać je jako źródła, więc mógłbym pomóc pod tym względem :)


Liczba modyfikacji: 1, Ostatnio modyfikowany: 29.09.2018, Ostatnio modyfikował: Dagon

Permalink

To ja może wytłumaczę, jak ten skrypt działa technicznie, bo w porównaniu do dawnych czasów mam już jakieś doświadczenie z programowaniem, i faktycznie jeszcze trochę pamiętam:

Trigger( REGION_ENTER_WITHOUT_STOP_TRIGGER, "meeting", "MeetingIzabela" ); /wyzwalacz, który uruchamia zadeklarowaną wcześniej w skrypcie funkcję (w tym przypadku o nazwie MeetingIzabela), przekazując jej jako argument imię skryptowe bohatera, który wchodzi do regionu o nazwie meeting, za każdym razem kiedy jakiś bohater wchodzi do tego regionu.

Wyzwalacz powoduje jednorazowe odpalenie jakiejś funkcji zadeklarowanej wcześniej w skrypcie, a uruchamia się każdorazowo po spełnieniu warunku określonego przez jego typ. Ogólna budowa to:

Trigger( TYP_WYZWALACZA, arg1, arg2, ... )

Istniejące typy wyzwalaczy, jak i przyjmowane przez nie argumenty (w tym nazwa wyzwalanej przez nie funkcji) możemy znaleźć w dokumentacji. I wydaje mi się, że z określonymi zdarzeniami zawsze można powiązać tylko jeden wyzwalacz, to znaczy np. zawsze aktywny jest tylko jeden wyzwalacz wejścia-bez-zatrzymania dla danego regionu, i wszelkie pojawienia się takiego wyzwalacza w innych miejscach wykonanego skryptu nadpisują ten stary.

I sama deklaracja funkcji:

function MeetingIzabela(heroname)
/ środek funkcji
end;

Nazwa może być dowolna (ale lepiej trzymać się liter, bez żadnych śmiesznych znaków), nie musi być koniecznie MeetingIzabela, może być nawet JaskiniaBehemota - ważne, żeby była ona jasna dla piszącego skrypt. W tej funkcji heroname jest argumentem przekazywanym przez wyzwalacz; powinniśmy być chyba w stanie nazwać go jakkolwiek, niekoniecznie heroname - znowu, ważne, żebyśmy wewnątrz funkcji umieli się do niego odwołać.

Instrukcja warunkowa:

if heroname == "Isabell" then
/ to, co się wykona, jeśli warunek będzie spełniony
end;

między if i then wpisujemy warunek, pod którym wykonają się instrukcje między then i end; W tym przypadku jest to sprawdzenie, czy heroname, a więc imię bohatera przekazane do funkcji (w tym przypadku przez wyzwalacz), jest imieniem skryptowym Izabeli - a więc czy tym bohaterem była Izabela. Jeśli nie, wszystko wewnątrz jest pomijane, kończymy wywołanie funkcji. A jeśli tak, wykonujemy następujące rzeczy:

Trigger( REGION_ENTER_WITHOUT_STOP_TRIGGER, "meeting", nil ); / od tego momentu wyzwalacz wejścia bez konieczności zatrzymania powiązany z regionem skryptowym meeting nie będzie wyzwalał już żadnej funkcji

StartDialogScene("/DialogScenes/Presentation/Row/Scena1.1/DIALOGPWL/SC1/SC1.1/DialogScene.xdb#xpointer(/DialogScene)"); / wyświetlona zostaje scenka dialogowa

RemoveObject("meeting"); / chyba usunięty zostaje region skryptowy meeting; w pewnym sensie wydaje mi się to zbędne po powyższej nullifikacji wyzwalacza, no ale ok, niech będzie xD

(Nawet nie można normalnie komentów do kodu wstawiać, bo wikitagi xD).

Pamiętam, że kiedyś uczyłem się skryptów z poradnika z HC, jednak nie mam go już nigdzie, a i sam poradnik będzie lepiej zrozumiany przez kogoś, kto wie, z czym się je programowanie imperatywne.

Jeszcze co do ścieżki do scenki - wydaje mi się, że powinna działać też wersja względna, tj. jeśli pliki scenki są w podfolderze folderu z mapą, to można linkować właśnie w ten prostszy (krótszy) sposób. Ale głowy nie dam.

Liczba modyfikacji: 4, Ostatnio modyfikowany: 30.09.2018, Ostatnio modyfikował: Hayven

Permalink

Dagon

Ze swojej strony mam w pamięci sporo mapek, w których były wykorzystywane skrypty i podrzucać je jako źródła, więc mógłbym pomóc pod tym względem :)

Podałbyś jakieś konkretne mapki? Może znalazłbym coś ciekawego.

Permalink

Można też zrobić to w taki sposób, żeby po wejściu danym bohaterem w dany region pojawiła się scenka dialogowa i zadanie poboczne:
function MeetingJakub( heroname )
if heroname == "Nicolai" then
Trigger( REGION_ENTER_WITHOUT_STOP_TRIGGER,"Zombie1",nil );
StartDialogScene( "/DialogScenes/Presentation/Row/Scena1.1/DIALOGPWL/SC1/SC1.1/DialogScene.xdb#xpointer(/DialogScene)" );
sleep(2);
GetObjectiveState( "Zombie", PLAYER_2 );
SetObjectiveState( "Zombie", OBJECTIVE_ACTIVE, PLAYER_2 );
SetObjectiveVisible( "Zombie", true, PLAYER_2 );
RemoveObject("Zombie1");
end;
end;
Trigger( REGION_ENTER_WITHOUT_STOP_TRIGGER, "Zombie1", "MeetingJakub" );

"Zombie" - nazwa naszego zadania.