[Neverwinter Nights] Skryptorium

Nie wiem czy ktoś tu zagląda, ale jeśli tak, to chyba zna się wystarczająco żeby mi pomóc...
Otóż nie mam pojęcia, w jaki sposób zrobić coś takiego, że postać najpierw zleca questa. Tylko że później jak podchodzę do niej, to robi to wciąż, prawda? Więc problem polega na tym, jak zrobić tak, żeby po przyjęciu questa następowała inna rozmowa.
Odpowiedz
co do pytania wyżej, proszę mi to wytłumaczyć dość jasno, w miarę możliwości, bo pewnie chodzi o to, co Lionel napisał parę komentarzy wyżej- tzw. skrypt startowy umieszczanym w Edytuj/Właś.Modułu/Zdarzenia/OnClientEnter


object oPC = GetFirstPC();

SetLocalInt(oPC, "NAZWA_STAŁEJ_NP_hermes", 0);


w zakładce Tekst Pojawia się Gdy (ten skrypt oznacza, że gra sprawdza czy nazwana zmienna (np. hermes) jest równa 0, jeśli to prawda, tekst się pojawi)


...Ale nie rozumiem tego : /
Odpowiedz
Której części nie rozumiesz?
W tzw. skrypcie startowym umieszczasz wartość zmiennej, której nadajesz unikalną nazwę coś ci mówiącą, np. gregor, bo odnosi się do postaci o takim imieniu. I właśnie w tym skrypcie zazwyczaj podaje się jej wartość 0.
Natomiast w Tekst Pojawia się Gdy wymuszamy na grze, by sprawdziła, czy rzeczywiście zmienna gregor jest równa 0. Jeżeli tak, to dana kwestia się pojawi, jeśli nie, to gra przejdzie do kolejnego rozgałęzienia dialogu. Czyli taki skrypt powinien wyglądać tak:

SPOILER

if(!(GetLocalInt(oPC, "gregor") == 0))
return FALSE;

return TRUE;


Następnie w zakładce Podjęte Działania tej samej linii dialogowej ustawiamy skrypt, który zmieni wartość zmiennej gregor na różną od 0, np. 1, by więcej ta linia dialogowa się nie pojawiła, bo w zakładce Tekst Pojawia się Gdy znajduje się komenda sprawdzenia, czy zmienna gregor = 0, a nie 1. Więc wygląda to tak:

SPOILER

object oPC = GetPCSpeaker();

SetLocalInt(oPC, "gregor", 1);


Najlepiej naukę skryptów rozpocząć od przejrzenia oskryptowania oficjalnej kampanii. Należy pliki z nwm przekopiować do modules i zmienić im rozszerzenie na .mod, dzięki temu w Aurorze będziemy mogli wczytać moduły oficjalnej kampanii. A już tam sobie sprawdzicie jak co działa, może to pomoże.
Odpowiedz
Hej lionel mam do ciebie sprawę chodzi mi o te skrypty, czy możesz napisać jak samemu stworzyć skrypty no wiesz taki poradnik.
Odpowiedz
Potrzebuję skryptu dzięki któremu postać będzie rzucać po kolei zaklęcia np. postać rzuca ognistą kule na drugą postać, a następnie promień lodu i tak cały czas te zaklęcia się powtarzają.


tomasz95
Odpowiedz
1.Mam jeszcze prośbę o skrypt dzięki któremu będę mógł wkładać przedmioty do np. lustra, drzwi itd.
2.I jeszcze żeby po włożeniu przedmiotu coś się stało np. otworzą się drzwi, jakiś niezniszczalny wróg zostanie zniszczony, dezaktywowany w przypadku golemów, proszę o szybką odpowiedź.



tomasz95
Odpowiedz
Lionel możesz powiedzieć mi jak przypisać rodzaj zmiennej?
Bo do tego skryptu z rzucaniem zaklęć trzeba przypisać rodzaj zmiennej.



tomasz95
Odpowiedz
Sorry już wiem o co chodziło z tym skryptem ale jest błąd analizy składni listy zmiennych.
to napisz jak wymyślisz co z tym zrobić.




tomasz95
Odpowiedz
Najpierw rzecz najważniejsza, czyli:

Lionel,

Na swoim komputerze rób co chcesz ze skryptami, twórz własne filozofie pisania skryptów, ogłaszaj się skryptowym bóstwem, ale proszę, nie wprowadzaj w błąd użytkowników internetu, to błędne koło, niech zostanie w twoich czterech ścianach. Co jakiś czas się taki ktoś jak ty pojawia, mąci w głowie, a potem każdy mówi, że pisanie skryptów jest trudne. Jest to bardzo logiczne, a twoje pomysły są wręcz absurdalne.

Do rzeczy jednak, do zaakceptowania jest inny sposób pisania skryptów, ale co nowicjusz ma powiedzieć na coś takiego?

if(!(GetLocalInt(oPC, "XXXX") == 1))


albo:

Cytat

W tzw. skrypcie startowym umieszczasz wartość zmiennej, której nadajesz unikalną nazwę coś ci mówiącą, np. gregor, bo odnosi się do postaci o takim imieniu. I właśnie w tym skrypcie zazwyczaj podaje się jej wartość 0.


opcjonalnie:

Cytat

Należy pliki z nwm przekopiować do modules i zmienić im rozszerzenie na .mod, dzięki temu w Aurorze będziemy mogli wczytać moduły oficjalnej kampanii. A już tam sobie sprawdzicie jak co działa, może to pomoże.


1.
if(GetLocalInt(oPC, "XXXX") != 1)


2. Muszę cię zaskoczyć, że nie ma różnicy, czy zmienna ma wartość 0, czy nie istnieje, poniważ taka funkcja jak "GetIsVariableValid" nie powstała i nigdy nie powstanie. Jeszcze jedna uwaga - jeśli zamierzasz nadać zmienną modułowi już na początku, nie musisz pisać żadnego skryptu, bo we właściwościach modułu (i obszaru a także stworzenia) jest zakładka "zmienne".

3. Nie wiem po co tak sztucznie to robić, kiedy chciałbyś zrobić moduł opierający się na kampanii, wtedy w porządku, ale jeśli chcesz tylko przeglądać zawartość, wystarczy przejść kampanie lub otworzyć ją bezpośrednio Aurorą, ewentualnie od razu wpisać w nwnplayer.ini

CODEWORD=hacktastic
CODEWORD XP1=ffrodriguez
CODEWORD XP2=barkeater


Jeszcze jedna sprawa:
object oHench = GetObjectByTag("TAG_NAJEMNIKA");
object oPC = GetPCSpeaker();
 
AddHenchman(oPC, oHench);

Po co pisać skrypt, który już istnieje? To samo jest w oryginale, a nazwę, jeśli nie poprzez szukanie, możesz znaleźć w dialogach najemników.

Ciekawe, że dałeś pewnie uwagi co do skryptu z dźwignią, a tutaj ani słowa, a jest to wiele bardziej znaczące. Ponieważ jeśli nie załadujesz zestawu skryptów najemnika, postać jedynie dołączy do twojej drużyny, ale nie będzie za tobą podążała, nie będzie otwierała zamków, pewnie nawet nie będzie cię broniła. A co to za najemnik? Więc napiszę za ciebie: Wchodzimy w zakładkę "Skrypty" najemnika, klikamy "Wczytaj ustawienia skryptu" i wybieramy zestaw najemnika. Chociaż z tego co pamiętam jest tam tylko zestaw najemnika z dodatku, który mimo, że później stworzony, jest wiele gorszy, więc proponuję pierw stworzyć własny zestaw, bazujący na najemniku z podstawki.

Neś,

Masz rację, rozwiązuje się to zmiennymi, ale żadne tam OnClientEnter.

W edytorze konwersacji masz dwie zakładki "Podjęte działania" oraz "Tekst pojawia się gdy"; skrypt z pierwszej zakładki odpala się po wybraniu danej linii dialogowej, a skrypt z drugiej zakładki daje informację, że warunek w nim zamieszczony musi się spełnić, by dana kwestia się wyświetliła.

Co może być mało wygodne, zwykle ostatnie kwestie umieszcza się na początku, czyli dla przykładu:

Katalog główny
1. Jeszcze raz dziękuję za pomoc.
2. Widzę, że masz mojego kotka, bardzo dziękuję!
3. Nadal nie zdjąłeś mojego kotka, zły człowieku!
4. Pomocy, mój kotek utknął na drzewie!

I co z tym fantem zrobić? Ostatnia, czwarta linia dialogowa nie ma skryptu warunkowego (tekst pojawia się gdy), natomiast ma skrypt działania (podjęte działania), wygląda on ni więcej, ni mniej jak:

void main()
{
    SetLocalInt(obiekt, "Kotek", 1);
}


obiekt - zależy gdzie ten skrypt ma działać, jeśli jest to moduł jednoosobowy, wstaw zamiast tego OBJECT_SELF (dana postać) lub GetModule() (moduł), a jeśli jako moduł wieloosobowy GetPCSpeaker() (gracz rozmawiający)

"Kotek" to tylko nazwa zmiennej, możesz tu wstawić cokolwiek, jednak jeśli zamiast obiektu wstawisz OBJECT_SELF lub GetModule(), ta nazwa nie może się pokrywać z żadną inną nazwą zmiennej.

Trzecia linia dialogowa, czyli pokazująca się jako druga będzie zawierała tylko skrypt warunkowy, który wygląda ni mniej, ni więcej jak:

int StartingConditional()
{
    if(GetLocalInt(obiekt, "Kotek")) return TRUE;
    return FALSE;
}


obiekt i "Kotek" mają być takie same jak w skrypcie pierwszym - chyba nie ma wątpliwości.

Pozwoliłem sobie użyć skrótu, więc może żeby przedstawić ci to bardziej logicznie napiszę bez nich:

int StartingConditional()
{
    if(GetLocalInt(obiekt, "Kotek") > 0)
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}


Tak to mniej więcej by wyglądało, może teraz troszkę bardziej jasne.

Druga linia dialogowa "Widzę, że masz mojego kotka, bardzo dziękuję!", ta kwestia ma oba skrypty, ponieważ trzeba sprawdzić, czy zabraliśmy kota, oraz oznaczyć, że już przyszliśmy po nagrodę.

warunek:

int StartingConditional()
{
    if(GetLocalInt(obiekt, "Kotek") == 2) return TRUE;
    return FALSE;
}


działanie:

void main()
{
    SetLocalInt(obiekt, "Kotek", 3);
    nagroda, jakieś złoto, magiczne artefakty, awans na czterdziesty poziom
}


Mam nadzieję, że wszystko jest jasne.

Pierwsza kwestia, która się pojawia już na końcu, kiedy po odebraniu nagrody przychodzimy do zleceniodawcy. Tam tylko warunek, chyba się już domyślasz jaki:

int StartingConditional()
{
    if(GetLocalInt(obiekt, "Kotek") == 3) return TRUE;
    return FALSE;
}


To by było na tyle, chociaż nie umieściłem tu jednego skryptu, który również jest ważny. Mianowicie po zdjęciu tego kotka z drzewa trzeba ustawić wartość zmiennej "Kotek" na 2, wydaje mi się, że po przeczytaniu dokładnym tego, co napisałem sam już będziesz wiedział jak tego dokonać.

Zapomniałem o ważnej informacji - nie myśl, że ta odwrotna kolejność kwestii to jakiś mój chory wymysł, przypuśćmy, że pozamieniamy kolejność na tą logiczną, co wyjdzie? Poważny zleceniodawca będzie do końca świata powtarzał linijkę "Pomocy, mój kotek utknął na drzewie!", ponieważ gra/komputer uzna, że skoro nie ma w tej kwestii warunków, to ją trzeba wyświetlić.

Pozdrawiam.

Tomasz_95,

Obawiam się, że nie mam czasu na odpowiadanie na twoje pytania, polecam jednak zapoznać się najpierw z samym edytorem, bo pytanie:

Cytat

1.Mam jeszcze prośbę o skrypt dzięki któremu będę mógł wkładać przedmioty do np. lustra, drzwi itd.


Jest zabawne. Wszystkie skrypty, o których mówileś są w kampanii, wszystkie Podziemiach Stwórców, czy jak nazwali ten obszar. Skrypty na pewno nie są rzeczą, którą opanować trzeba w pierwszej kolejności, najpierw się zabierz za te rzeczy podstawowe, jak właściwości obiektów. A co jeszcze ważne - poznaj samą grę, to bardzo ułatwia sprawę, będziesz wiedział gdzie szukać.

Pozdrawiam.

P.S. Odsyłam do poradnika podstaw skryptowych autorstwa Rigafilma: http://neverwinter.ph...ghlight=#37059
Odpowiedz
To nie koncert życzeń (-o⌒).

1. Poradnika pisania skryptów nie napiszę, bo z tym mnóstwo roboty, a mam inne zobowiązania też. Ponadto większość wymaganej wiedzy opisana jest w samem Aurorze lub w internecie. Niestety, wymagana jest znajomość języka angielskiego bądź niemieckiego.
2. Rzucanie zaklęcia
3. Jeżeli chodzi o obiekt, który ustawia się na mapie, to lustro ma opcje posiadania wyposażenia, co do drzwi, to one same w sobie nie mają, ale można stworzyć przedmiot, który będzie miał ekwipunek i będzie wyglądał jak drzwi [można poszukać w internecie], lecz nie będzie pełnił ich funkcji - otwierania/zamykania.
4. W OnDisturbed pojemnika.
SPOILER

void main()
{
object oPC = GetLastDisturbed ();
object oItem = GetObjectByTag ("ETYKIETA PRZEDMIOTU");
if
(GetIsObjectValid (oPC) &&
(GetInventoryDisturbType () == INVENTORY_DISTURB_TYPE_ADDED) &&
(GetInventoryDisturbItem () == oItem))
{
TO CO MA SIĘ ZDARZYĆ PO WŁOŻENIU PRZEDMIOTU
}
}


5. Musisz pokazać, co wpisałeś w tym skrypcie. Wklej go całego.

[Dodano po 10 minutach]

Ja? Skryptowy guru? Boskie (´ε` )♡.
Ten temat powstał, by pomagać i ja się tym zajmuję. Nigdy nie pisałem, że znam się całkowicie na skryptowaniu, bo tak nie jest. Moja wiedza, może znikoma, pochodzi z samouctwa, analizowania cudzych skryptów, metody prób i błędów itd. Dzielę się swoją wiedzą z osobami, które mają ambicje tworzenia modułów, ale skryptowanie wydaje im się mroczne, bo i dal mnie kiedyś takie było i czasami wciąż jest.
Cieszę się, że ktoś taki jak ty również próbuje wyjaśniać takie procesy i z pewnością nie omieszkam wykorzystać twoje rady w przyszłości

PS. Mój pokój ma sześć ścian (*^3^).
Odpowiedz
Sorry Lionel za te wszystkie prośby, teraz już od 3 godzin nie mam tych problemów ta sprawa z tymi zmiennymi została już rozwiązana a analiza składni też, a ta sprawa z zaklęciami to już wiem co z nią zrobić po prostu albo wstawię dwóch gości albo poszukam w innych modułach, a to co ma się zdarzyć po włożeniu przedmiotu to nie dawno wpadłem na pomysł, niech po włożeniu przedmiotu pojawi się postać (przy pojawieniu postaci efekt wizualny) z którą będę musiał porozmawiać a kiedy rozmowa się skończy postać znikała (z takim samym efektem wizualnym z jakim się pojawiła).
Sorry przez następny tydzień nic tutaj nie napiszę.




tomasz95
Odpowiedz
Przepraszam najmocniej, jak teraz czytam moją wypowiedź wprowadziłem was w błąd:
if(GetLocalInt(obiekt, "Kotek"))

nie znaczy:
if(GetLocalInt(obiekt, "Kotek") > 0)

tylko:
if(GetLocalInt(obiekt, "Kotek") != 0)


Opisowo ta pierwsza linijka znaczy: Jeśli zmienna lokalna "Kotek" zapisana na 'obiekcie' ISTNIEJE. Mając wartość ujemną ona istnieje, ponieważ jest różna od zera.

A teraz do rzeczy

Lionel,

Nie myśl, że szukam tu zwady, ale bardzo mnie irytuje, kiedy chętnych graczy zniechęca się do skryptów w ten sposób.

Umieszczanie rzeczy w drzwiach można rozwiązać znów na kilka sposobów, i to niekoniecznie przy wykorzystaniu haków, a nawet powiem, że niekoniecznie one muszą tracić swoje właściwości.

1. Idąc twoim tokiem myślenia można użyć modeli drzwi z podstawki i dodatków (drewniane i metalowe - z animacjami) lub tych z 1.69, co prawda balkonowe, ale nadal drzwi, tylko nie jestem pewien czy mają jakąkolwiek animację.

2. Można to rozwiązać i na typowych drzwiach umieszczonych w zawiasach, z punktu widzenia edytora będzie to oszukańcze, ale gracz może się w ogóle nie zorientować, że umieszcza zawartość swojego ekwipunku w niewidzialnym obiekcie położonym obok drzwi, wystarczy zmienić portret i wszystko powinno grać.

Sprawa kolejna - twój skrypt. Powiedziałeś, że jesteś samoukiem, tylko proszę mi wierzyć, że lepiej czerpać inspiracje z kodów kampanii, zamiast generatora skryptów - bardzo łatwo jest tamtejsze bazgroły poznać.

Spójrz jakie to może być logiczne i proste:

void main()
{
    if(GetInventoryDisturbType() == INVENTORY_DISTURB_TYPE_ADDED &&
       GetTag(GetInventoryDisturbItem()) == "ETYKIETA_PRZEDMIOTU")
    {
        TO CO MA SIĘ ZDARZYĆ PO WŁOŻENIU PRZEDMIOTU
    }
}


Po pierwsze zaoszczędziłem 4 linijki, ale co ważniejsze zaoszczędziłem troszkę 'energii', interesujesz się ciężkością skryptów, więc chyba sam stwierdzisz, że definiowanie niepotrzebnych zmiennych i porównynwanie ich jest marnotractwem. Na pewno zauważysz też, że wiele lżej jest porównywać ciąg znaków niż całe obiekty, które są wiele większe.

Odbiegając trochę od tematu, mógłbyś mi powiedzieć, co znaczą te wszystkie twoje tekstowe miny? Pierwszy raz je widzę, i nie wiem co przez nie chcesz mi przekazać. Może np. jedna z nich oznacza martwą rybę, czyli grozisz mi śmiercią po sycylijsku.

I ostatnia, mała uwaga. Może to zabrzmi brutalnie, ale jeśli nie znasz skryptów na tyle, by je sensownie przedstawić, to nie wiem dlaczego wyszedłeś z inicjatywą stworzenia tego tematu. Może tylko dlatego, by w przyszłości dopisać do swojej sygnaturki: "Lionel skryptuje..."? Powiem tak, jeśli naprawdę byłbyś w tym dobry, i myślalbyś matematycznie, od razu nasunąłby ci się wniosek, że lepiej jest napisać poradnik, niż tworzyć temat o gotowcach, niby na pierwszy rzut oka cholernie dużo czasu by zajęło (Ja mówię - dwa miesiące, a jeśli jesteś pracowity to i w jeden), ale teraz policz ile czasu straciłeś na odpowiadanie na te wszystkie... nierozsądne pytania, a w niektórych przypadkach wręcz żądania.

Jeszcze raz napiszę to, co na początku, bez tego, obawiam się że rozpęta się tu wojna.

"Nie myśl, że szukam tu zwady, ale bardzo mnie irytuje, kiedy chętnych graczy zniechęca się do skryptów w ten sposób."

Szanuję cię za to, że przyznałeś się do błędu, ale może to czas na podszkolenie się w skryptowaniu, by aktywnie uczestniczyć w tej dyskusji bez wątków dodatkowych w postaci Niemiłego Aleksandra? Jeśli cię jeszcze nie przekonałem, to wspomnę o jednym. Ktoś chyba nawet w tym temacie nazwał cię "Żywą/chodzącą encyklopedią skryptów", a ty się nawet do tego nie odniosłeś, czyli zaakceptowałeś? Powiem szczerze, że chcąc przyjąć ten chwalebny tytuł na twoim miejscu szybciutko wziąłbym się do roboty, by na niego rzeczywiście zasługiwać.

Pozdrawiam.
Odpowiedz
Mam pytanie mógł byś podać skrypt tak że co jakiś czas powstają np Zombie i odrazu po zrespieniu idą w wybrane miejsce np do ogniska ?
Odpowiedz
Mam pytanie. Czy wiesz jak zrobić Intro do własnego Modułu np w Diable z Kamieniu ? Prosiłbym o szybką odpowiedź.'
Odpowiedz
To komentarza powyżej. Chodzi żeby zrobić Intro jak w DIABLE W KAMIENIU albo w KAMPANI .'
Odpowiedz
Witam, mam pytanie. Da radę zrobić skrypt , lub czy już taki jest? Mianowicie chodzi o pojawianie się potworów, po zabiciu innych po jakimś czasie? I czy dało by radę zwiększyć siłe pojawiających się stworów w miarę ze wzrostem poziomu postaci? Z góry dzięki
Odpowiedz
Sry, za offtop, ale może ktoś odpowie. Wie ktoś jak zrobić, aby postać znikała?
Odpowiedz
← Artykuły

[Neverwinter Nights] Skryptorium - Odpowiedź

 
Męczą Cię captche? , a problem zniknie. Zajmie to mniej niż rozwiązanie captchy!
Wczytywanie...