TnZ Scripting Tricks FAQ (update:18-09-2008, aktualnie skryptów: 23)

+
TnZ Scripting Tricks FAQ (update:18-09-2008, aktualnie skryptów: 23)

Tutaj znajdziecie takie małe FAQ o skryptowaniu. Jeśli chcecie dowiedzieć się jak "coś" zrobić a sami nie możecie do tego dojść - poproście - postaram się tutaj wkleić rozwiązanie :)0. Jak w prosty sposób odpalić dowolną animację postaci ze skryptu (np. pozdrowienie ręką?) ?
To całkiem proste. Wystarczy otworzyć postać i wybrać sobie odpowiednią animację (http://images.wikia.com/djinni/images//5/54/AnimEssay1.JPG), którą chcemy wykorzystać.Duplikujemy ją jako animację wirutalną o nazwie special1 (mamy jeszcze do wykorzystanie special2, special3, special4 oraz special5). Nastepnie mozemy ta animacje odtworzyc napostaci ze skryptu uzywajac funkcje : AssignCommand(object Target, ActionPlayAnimation(ANIMATION_FIREFORGET_SPECIAL1))
1. Jak zmienić skryptem apearance postaci?
void main(){ object oTarget = GetObjectByTag("my_tag"); int iApearance = 1; SetCreatureAppearance(oTarger, iApearance);}
Note: kreatura zmieni tylko wyglad, ale nie np. sety animacji!!2. Jak skryptem wymusić aby Wiedźmin wyciągnął miecz?
void main(){ object oPC = GetFirstPC(); object oItem = GetItemInSlot(INVENTORY_SLOT_STEELSWORD, oPC); AssignCommand(oPC, ActionEquipItem(oItem, INVENTORY_SLOT_RIGHTHAND));}
Note: Oczywiscie mozecie uzyc INVENTORY_SLOT_SILVERSWORD zamiast *STEELSWORD.3. Jak skryptem odpalic efekt tzw. camera shake?
#include "inc_cameffects"void main(){ CameraShake(0.1, 0.07, 0.3);}
4. Czy można za pomocą skryptu zmusić Wiedźmina bądź jakiegoś NePCa by przeszedł z punktu A do punktu B?
Lepiej to zrobic wykorzystujac actionpointy ale oczywiscie mozna tez skryptem :void main(){ object oTarget = GetObjectByTag("moj_tag_postaci"); object oGoTo = GetObjectByTag("tag_obiektu_docelowego"); AssignCommand(oTarger, ActionMoveToObject(oGoTo));}
5. Czy istnieja jakaś funkcja, która usypia skrypt na podaną ilość milisekund? Coś jak sleep() w C++.Nie do konca, ale mozna do tego uzyc funkcji DelayCommand. Np:
void Moja_odpalana_za_jakis_czas_funkcja(){ // cos tam sie tutaj dzieje}void main(){ float fCzas = 10.0; DelayCommand(fCzas, Moja_odpalana_za_jakis_czas_funkcja());}
6. Jak wymusić rozpoczęcie dialogu?
Użyj funkcji TeleportAndTalk(oTarget, "nazwa_dialogu"); - NPC podejdzie i zagada.Ewentualnie TeleportPCAndTalk(oTarger, "nazwa_dialogu"); - Geralt zagada.
7. Jak stowrzyć obiekty zapalane/gaszone za pomocą igni/aard
#include "inc_ai"// skrypt podpinamy pod "on spell cast at" placeabla// Zapalanie/gaszenie ognia czarami Aard oraz Igni.// (by M "TnZ" K)// ======================================================================================================== // Dystans swiatel jakie gasimy wokolo obiektu-przy kazdym ognisku mozemy wstawic obiekt dodatkowego swiatla (tag ob_light) float xDist = 10.0f; // Tag obiektow ze swiatlami string xTag = "ob_light";// ========================================================================================================void PlaceCampfireMappinOnMap(object oCampfire){ // Wrzucamy mappin ogniska na mape - a niech gracze wiedza gdzie to ognisko bylo ;) if (GetLocalInt(oCampfire, "HasMarker")!=1 && GetDistanceBetween(GetFirstPC(), oCampfire)= 0 && nSpellId = 30 && nSpellId = 30 && nSpellId 0 && oItem!=OBJECT_INVALID) { if (CompareTags(GetTag(oItem),sTag)) { nStack = GetItemStackSize(oItem); if (nCount>=nStack) { nCount-=nStack; DestroyObject(oItem); nRemoved+=nStack; } else { SetItemStackSize(oItem,nStack-nCount); nRemoved+=nCount; break; } } oItem = GetNextItemInInventory(oOwner); } return nRemoved;}// Returns the number of stackable items matching tag sTag in oOwner's inventory.int GetItemCount (object oOwner, string sTag) { object oItem = GetFirstItemInInventory(oOwner); int nCount; while (oItem!=OBJECT_INVALID) { if (CompareTags(GetTag(oItem),sTag)) { nCount+=GetItemStackSize(oItem); } oItem = GetNextItemInInventory(oOwner); } return nCount;}// Create multiple items in oTarget basing on sItemTemplate, REGARDLESS of allowed stack size. Multiple stacks will be created as needed.int CreateManyItemsOnObject (string sItemTemplate,object oTarget=OBJECT_SELF,int nStackSize=1) { int i; for (i=0;i
 
Pytanie: Czy można za pomocą skryptu zmusić Wiedźmina bądź jakiegoś NePCa by przeszedł z punktu A do punktu B?Drugie pytanie: Czy istnieja jakaś funkcja, która usypia skrypt na podaną ilość milisekund? Coś jak sleep() w C++.
 
A ja mam inne pytanie. Czy moge te tricki skopiowac do polskiej Wiki Djinniego? Stworzyl bym tam male dodatkowe Scripting FAQ i sukcesywnie kopiowal to, co tu sie bedzei pojawiac.
 
Ajgor64 said:
A ja mam inne pytanie. Czy moge te tricki skopiowac do polskiej Wiki Djinniego? Stworzyl bym tam male dodatkowe Scripting FAQ i sukcesywnie kopiowal to, co tu sie bedzei pojawiac.
Jasne, masz moje błogosławieństwo ;)
 
[size=10pt]1.Jaka funkcja zmienia fazę StoryNPC?2.Jak zmienić nastawienie jakiejś osoby do Geralta?[/size]Ad.1Robię to skryptem:
void main(){ SetStoryNPCStoryPhase("m_wojownik", "straz");}
Niestety funkcja, pomimo, że się kompiluje nie działa prawidłowo. Co robię źle?Ad.2 Czy do tego służy funkcja SetPersonalAttitude?Jeśli tak, to mój skrypt wygląda następująco:
void main(){ object oTarget = GetFirstPC(); object oSource = GetObjectByTag("m_wojownik"); ClearPersonalAttitude(oTarget, oSource); SetPersonalAttitude(CN_ATTITUDE_HOSTILE, oTarget, oSource);}
Ale wyskakuję błąd przy kompilowaniu
NWNScript Compiler: wrog.nss(5): ERROR: UNDEFINED IDENTIFIER (SetPersonalAttitude)NWNScript Compiler: wrog.nss(5): ERROR: UNDEFINED IDENTIFIER (ClearPersonalAttitude)
Ad.1 Pewnie błąd popełniam przy wpisywaniu. U mnie plik m_wojownik to tag postaci. A straz to nazwa fazy w StoryNPC, na którą powinno się zmienić.Edit: Zmieniłem pierwszy wpis na nazwę StoryNPC i się udało ;D Działa!Ad.2 Wielkie dzięki. Wystarczyło dodać tą linijkę i "_" przy nazwie funkcji. Oren za pomoc ;)
 
DragomirI said:
Mam takie pytanie:Jak wymusić rozpoczęcie dialogu?Pozdrawiam
to wymusi chyba na wrogiej ale nie dam glowyvoid main(){object oPC = GetEnteringObject();if (!GetIsPC(oPC)) return;object oTarget;oTarget = GetObjectByTag("tag postaci");AssignCommand(oTarget, ActionStartConversation(oPC, "")); }jak zostawisz "" to masz domyslny dialog a jak wpiszesz to masz wybrany a ten rozpocznie z przyjazna na bankvoid main(){object oPC = GetEnteringObject();if (!GetIsPC(oPC)) return;object oTarget;oTarget = GetObjectByTag("tag postaci");AssignCommand(oTarget, ActionStartConversation(oPC, ""));}to dajesz do triggera na on entera po konwersacji jak chcesz zniszczyc trigger (zeby rozmow byla tylko raz) to dajesz na on exitvoid main(){object oPC = GetExitingObject();if (!GetIsPC(oPC)) return;object oTarget;oTarget = GetObjectByTag("tag triggera");DestroyObject(oTarget, 0.0);}
 
Death13IFRIT said:
[size=10pt]1.Jaka funkcja zmienia fazę StoryNPC?[/size]Niestety funkcja, pomimo, że się kompiluje nie działa prawidłowo. Co robię źle?
Wg mnie składnia funkcji wygląda tak:SetStoryNPCStoryPhase("nazwa_pliku_NPC", "nazwa_fazy_z_pliku_NPC") i powinna działać (u mnie zadziałała). Próbowałeś debugować? Np. napisz skrypt
void main(){ string NazwaFazy; NazwaFazy = GetStoryPhaseByNPC("m_wojownik"); PrintString(NazwaFazy);}
i uruchom go podczas testowania gry, po momencie gdy powinna nastąpić zmiana fazy. Sprawdź w okienku Aurora Log, czy pojawia się nazwa ustawionej fazy. Może masz coś nie tak z samą fazą w pliku .NPC, ponieważ funkcja SetStoryNPCStoryPhase niewątpliwie służy do ustawienia fazy fabularnej.
[size=10pt]2.Jak zmienić nastawienie jakiejś osoby do Geralta?[/size]Czy do tego służy funkcja SetPersonalAttitude?... Ale wyskakuję błąd przy kompilowaniu ....
Wyskakuje błąd, ponieważ nie ma takiej funkcji jak SetPersonalAttitude. Jest _SetPersonalAttitude. Spróbuj tak:
// zwroc uwage na ponizsza linijke ;)#include "inc_ai"void main(){ object oTarget = GetFirstPC(); object oSource = GetObjectByTag("m_wojownik"); _ClearPersonalAttitude(oTarget, oSource); _SetPersonalAttitude(CN_ATTITUDE_HOSTILE, oTarget, oSource);}
 
Jaka funkcja przeniesie Geralta w inne miejsce?Skrypt ma uruchomić się klikając w klapę na podłodze, żeby przeniosło go do piwnicy. Czyli daje go w On Open, tak?
 
Czy ma ktoś pomysł jak wymusić efekt "niekończącej się" pory dnia (na przykład nocy), ale żeby efekty czasowe (eliksiry, itp.) wciąż działały normalnie? Innymi słowy: żeby wewnętrznie gra liczyła upływ czasu, dla zdarzeń opóźnionych w czasie lub mających określony czas trwania, ale żeby nie posuwała do przodu zegara?
 
Musiała. :pJak na razie to ustawienie nic nie zmienia - lokacja tak samo się rozjaśnia i zaciemnia jak zawsze. Czy to ustawienie jest z czymś jeszcze powiązane? Choć i tak wolałabym, żeby nie spowodowało to jakiejś absurdalnej sytuacji "na zegarku południe, a ciemno jak w...".
 
Niesetety trudno bedzie cos takiego osiagnac. Moze sprobowac po prostu pozamieniac kolory dnia, tak zeby wygladal jak noc ;) Nie bedzie to to czego szukasz (bo zegarek dalej tyka) ale zawsze cos.
 
W zasadzie oczekiwany przeze mnie efekt da się osiągnąć poprzez usunięcie możliwości swobodnego nocowania (wywalenie ognisk w plenerze, choćby) i ustawienie w module "Minutes per hour" na sporo (20? 60?), by czas upływał w miarę realistycznie. Jednak w moim scenariuszu bardzo przydałoby się móc tę wartość zmienić z poziomu skryptu, by jeden akt rozgrywał się w czasie typowym dla gry (np. 4 minuty = godzina), a inny w realistycznym (1h=60min). Nie znalazłam w nwnscriptdefn.nss funkcji, które by na to pozwalały... Czy zatem nie jest to możliwe bez np. definiowania oddzielnego modułu dla różnych prędkości upływu czasu?
 
Ailinon said:
Czy ma ktoś pomysł jak wymusić efekt "niekończącej się" pory dnia (na przykład nocy), ale żeby efekty czasowe (eliksiry, itp.) wciąż działały normalnie? Innymi słowy: żeby wewnętrznie gra liczyła upływ czasu, dla zdarzeń opóźnionych w czasie lub mających określony czas trwania, ale żeby nie posuwała do przodu zegara?
Możesz:a) Zmodyfikować czasy działania mikstur. Czyli musiałbyś zmodyfikować opowiednie skrypty, które znajdziesz w bif'ach.lubb) Użyć funkcji SetTime(h,m,s) np. na heartbeat'cie lokacji - żeby non stop ustawiała tę samą godzinę. Ale to może nie zadziałać bo ta funkcja będzie czas "przewijała" o dobę do przodu jeśli się nie mylę (ale pewien nie jestem)Więc tak jak napisał Enderek - to będzie raczej trudne :)
 
mozesz dac skrypt z disable spawnset i ustawic gdzies kolo miejsca rozmowy spawnpoint z only disapear here
 

Similar threads

Top Bottom