x

You have decided to merge your account with the GOG.com.

You can now start participating in the community discussions.

x

You chose to opt out from the merge process.
Please note that you will not be able to access your account until you opt in.

We strongly encourage you to merge your RED account with the GOG.com one.
If you want to do it later please try logging in again.

  • Register

Announcement

Collapse
No announcement yet.

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

Collapse
This is a sticky topic.
X
X
  • Filter
  • Time
  • Show
Clear All
new posts
This discussion is older than 365 days. Information contained in it may no longer be current. Please do not post new messages without substantial need.

  • 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[QUOTE]#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

  • #2
    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++.

    Comment


    • #3
      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.

      Comment


      • #4
        Originally posted by Ajgor64
        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

        Comment


        • #5
          Dzięki wielkie Wiki powoli się rozrasta :-)Faq juz na wiki :-)

          Comment


          • #6
            Mam takie pytanie:Jak wymusić rozpoczęcie dialogu?Pozdrawiam

            Comment


            • #7
              Odpowiedziałem Lepiej późno niż wcale

              Comment


              • #8
                1.Jaka funkcja zmienia fazę StoryNPC?2.Jak zmienić nastawienie jakiejś osoby do Geralta?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

                Comment


                • #9
                  Originally posted by DragomirI
                  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);}

                  Comment


                  • #10
                    Originally posted by Death13IFRIT
                    1.Jaka funkcja zmienia fazę StoryNPC?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.
                    2.Jak zmienić nastawienie jakiejś osoby do Geralta?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);}

                    Comment


                    • #11
                      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?

                      Comment


                      • #12
                        a jak ustawic Plot na false lub true? (skryptem)

                        Comment


                        • #13
                          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?

                          Comment


                          • #14
                            to bys musial chyba wylaczyc tryb dnia i nocy w area proporties (day/night cycle)

                            Comment


                            • #15
                              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...".

                              Comment

                              Working...
                              X