[NWN1] Wielka składnica skryptów

Było tu kilka postów że na oficjalnej stronie NWN jest skarbnica wiedzy o skryptach czy jakoś tak. Tylko że ja wpisuje adres strony to mi się pojawia "Serwer nwn.cdprojekt.com zbyt długo nie odpowiada" i jest tak zawsze. odkąd pierwszy raz o długiego czasu ( czyli 2 marca) wlazłem na tą stronę . Dlatego proponuję żeby tu zamieszczać gotowe skrypty.

Pojawianie sie gostka i rozpoczęcie rozmowy po użyciu dźwigni lub innego przedmiotu

robimy punkt nawigacyjny i nazywamy go np: oTraget i wpisujemy to w miejscu inuse :
object oPC = GetPCSpeaker();

object oTarget;
object oSpawn;
oTarget = oPC;

oSpawn = CreateObject(OBJECT_TYPE_CREATURE, "tu wpisz etykiete potwora", GetLocation(oTarget));

oTarget = oSpawn;

AssignCommand(oTarget, ActionStartConversation(oPC, "")); //rozpoczęcie konwersacji

oTarget = oSpawn;

ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SUNBEAM), GetLocation(oTarget)); //efekt wizualy
Leczenie object oPC = GetPCSpeaker();
object oHenchman = GetAssociate(ASSOCIATE_TYPE_HENCHMAN,oPC);
object oAnimal = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION,oPC);
object oFamiliar = GetAssociate(ASSOCIATE_TYPE_FAMILIAR,oPC);
object oDominated = GetAssociate(ASSOCIATE_TYPE_DOMINATED,oPC);
object oSummoned = GetAssociate(ASSOCIATE_TYPE_SUMMONED,oPC);
ActionPauseConversation();
ActionCastFakeSpellAtObject(SPELL_GREATER_RESTORATION, OBJECT_SELF);
ActionDoCommand(FakeRestore(oPC));
if(GetIsObjectValid(oHenchman))
{
ActionDoCommand(FakeRestore(oHenchman));
// checks to see if they have any cure crital wound potions; if not, creates it on them.
if (!GetIsObjectValid(GetItemPossessedBy(oHenchman,"NW_IT_MPOTION003")))
{
CreateItemOnObject("NW_IT_MPOTION003",oHenchman,3);
}
}
if(GetIsObjectValid(oAnimal))
{
ActionDoCommand(FakeRestore(oAnimal));
}
if(GetIsObjectValid(oFamiliar))
{
ActionDoCommand(FakeRestore(oFamiliar));
}
if(GetIsObjectValid(oDominated))
{
ActionDoCommand(FakeRestore(oDominated));
}
if(GetIsObjectValid(oSummoned))
{
ActionDoCommand(FakeRestore(oSummoned));
}
ActionResumeConversation();
}

void FakeRestore(object oTarget)
{
effect eVisual = EffectVisualEffect(VFX_IMP_RESTORATION_GREATER);

effect eBad = GetFirstEffect(oTarget);
//Search for negative effects
while(GetIsEffectValid(eBad))
{
if (GetEffectType(eBad) == EFFECT_TYPE_ABILITY_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_AC_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_ATTACK_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_IMMUNITY_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_SAVING_THROW_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_SPELL_RESISTANCE_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_SKILL_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_BLINDNESS ||
GetEffectType(eBad) == EFFECT_TYPE_DEAF ||
GetEffectType(eBad) == EFFECT_TYPE_CURSE ||
GetEffectType(eBad) == EFFECT_TYPE_DISEASE ||
GetEffectType(eBad) == EFFECT_TYPE_POISON ||
GetEffectType(eBad) == EFFECT_TYPE_PARALYZE ||
GetEffectType(eBad) == EFFECT_TYPE_NEGATIVELEVEL)
{
//Remove effect if it is negative.
RemoveEffect(oTarget, eBad);
}
eBad = GetNextEffect(oTarget);
}
if(GetRacialType(oTarget) != RACIAL_TYPE_UNDEAD)
{
//Apply the VFX impact and effects
int nHeal = GetMaxHitPoints(oTarget) - GetCurrentHitPoints(oTarget);
effect eHeal = EffectHeal(nHeal);
if (nHeal > 0)
ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, oTarget);
}
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisual, oTarget);

tylko nie wiem gdzie się zmienia wygląd
Teleport gościa podczas rozmowy:

DelayCommand(1.0,ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_UNSUMMON), OBJECT_SELF));
DestroyObject(OBJECT_SELF,1.5);

Koniec modułu
ExportAllCharacters();
DelayCommand(2.0, EndGame(""));


poproszę o inne skrypty z objaśnieniem
Odpowiedz
Ach niedawno zacząłem robić moduł więc znam ich kilka:


AUTOSAVE
zapisuje grę w wybranym momencie
należy stowrzyć na podłożu wyzwalacz a następnie wstawić w nim skrypt:

void main()<br />
                  {<br />
                  object oPC = GetEnteringObject();<br />
<br />
                  if (GetIsPC(oPC))<br />
                  {<br />
                  if (GetLocalInt(OBJECT_SELF, "DO_ONCE") == 1)<br />
                  {<br />
                  return;<br />
                  }<br />
                  else<br />
                  {<br />
                  DoSinglePlayerAutoSave();<br />
                  SetLocalInt(OBJECT_SELF, "DO_ONCE", 1);<br />
                  }<br />
                  }<br />
                  }



Plotkujący NPC
Dzięki temu miasta ożyją Ustawić NPC twarzami do siebie i do OnHeartbeat wpisać:
void main()<br />
{<br />
    int nAnimation;<br />
    int nRandom = Random(11);<br />
    switch(nRandom)<br />
    {<br />
        case 0: nAnimation = ANIMATION_FIREFORGET_DRINK; break;<br />
        case 1: nAnimation = ANIMATION_FIREFORGET_GREETING; break;<br />
        case 2: nAnimation = ANIMATION_FIREFORGET_HEAD_TURN_LEFT; break;<br />
        case 3: nAnimation = ANIMATION_FIREFORGET_HEAD_TURN_RIGHT; break;<br />
        case 4: nAnimation = ANIMATION_FIREFORGET_PAUSE_BORED; break;<br />
        case 5: nAnimation = ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD; break;<br />
        case 6: nAnimation = ANIMATION_LOOPING_PAUSE_DRUNK; break;<br />
        case 7: nAnimation = ANIMATION_LOOPING_PAUSE_TIRED; break;<br />
        case 8: nAnimation = ANIMATION_LOOPING_TALK_LAUGHING; break;<br />
        case 9: nAnimation = ANIMATION_LOOPING_TALK_FORCEFUL; break;<br />
        case 10: nAnimation = ANIMATION_LOOPING_TALK_PLEADING; break;<br />
    }<br />
    ActionPlayAnimation(ANIMATION_LOOPING_TALK_NORMAL);<br />
    ActionPlayAnimation(nAnimation);<br />
    ActionPlayAnimation(ANIMATION_LOOPING_TALK_NORMAL);<br />
    ActionDoCommand(SetFacingPoint(GetPosition(GetNearestObjectByTag("WP_Rozmowa2"))));<br />
}



Uzdrowiciel
Dzięki temu skryptowi nasza postać uleczy NPC. Należy stworzyć rozmowę i w tekście który ma powiedzieć postać w czasie leczenia wstawić skrypt (Do zakładki Wykonane zadania)
void main()<br />
{<br />
object xPlayer = GetPCSpeaker();<br />
int xPlayerHP;<br />
effect xPlayerHeal;<br />
effect xHealVis = EffectVisualEffect(VFX_IMP_RESTORATION_GREATER);<br />
xPlayerHP = GetMaxHitPoints(xPlayer);//ustala ile pktów ma wyleczyć<br />
xPlayerHeal = EffectHeal(xPlayerHP);<br />
ApplyEffectToObject(DURATION_TYPE_INSTANT,xHealVis,xPlayer);<br />
ApplyEffectToObject(DURATION_TYPE_INSTANT,xPlayerHeal,xPlayer);<br />
}




Skrypt dzięki któremu NPC będzie tańczyć:
Wstawić do: OnHeartbeat
#include "NW_I0_GENERIC"<br />
<br />
<br />
int iRollTen = d10(1);<br />
<br />
void main()<br />
{<br />
//ActionRandomWalk();<br />
if(d100(1) > 10)           <br />
    {                     <br />
    if(iRollTen != 0)       <br />
        {                   <br />
        switch(iRollTen)   <br />
            {<br />
            case 1:<br />
             ActionPlayAnimation(ANIMATION_FIREFORGET_TAUNT,1.0);<br />
ActionPlayAnimation(ANIMATION_FIREFORGET_BOW,1.0);<br />
ActionPlayAnimation(ANIMATION_FIREFORGET_VICTORY2,1.0);<br />
ActionPlayAnimation(ANIMATION_FIREFORGET_BOW,1.0);<br />
ActionPlayAnimation(ANIMATION_LOOPING_WORSHIP,1.0);<br />
            break;<br />
            case 2:<br />
             ActionPlayAnimation(ANIMATION_FIREFORGET_TAUNT,1.0);<br />
ActionPlayAnimation(ANIMATION_FIREFORGET_BOW,1.0);<br />
ActionPlayAnimation(ANIMATION_FIREFORGET_VICTORY2,1.0);<br />
ActionPlayAnimation(ANIMATION_FIREFORGET_BOW,1.0);<br />
ActionPlayAnimation(ANIMATION_LOOPING_WORSHIP,1.0);<br />
            break;<br />
            case 3:<br />
             ActionPlayAnimation(ANIMATION_FIREFORGET_TAUNT,1.0);<br />
ActionPlayAnimation(ANIMATION_FIREFORGET_BOW,1.0);<br />
ActionPlayAnimation(ANIMATION_FIREFORGET_VICTORY2,1.0);<br />
ActionPlayAnimation(ANIMATION_FIREFORGET_BOW,1.0);<br />
ActionPlayAnimation(ANIMATION_LOOPING_WORSHIP,1.0);<br />
            break;<br />
            case 4:<br />
            ActionPlayAnimation(ANIMATION_FIREFORGET_TAUNT,1.0);<br />
ActionPlayAnimation(ANIMATION_FIREFORGET_BOW,1.0);<br />
ActionPlayAnimation(ANIMATION_FIREFORGET_VICTORY2,1.0);<br />
ActionPlayAnimation(ANIMATION_FIREFORGET_BOW,1.0);<br />
ActionPlayAnimation(ANIMATION_FIREFORGET_SALUTE,1.0);<br />
            break;<br />
            case 5:<br />
<br />
            ActionPlayAnimation(ANIMATION_FIREFORGET_TAUNT,1.0);<br />
ActionPlayAnimation(ANIMATION_FIREFORGET_BOW,1.0);<br />
ActionPlayAnimation(ANIMATION_FIREFORGET_VICTORY2,1.0);<br />
ActionPlayAnimation(ANIMATION_FIREFORGET_BOW,1.0);<br />
ActionPlayAnimation(ANIMATION_FIREFORGET_VICTORY1,1.0);<br />
            break;<br />
            case 6:<br />
<br />
            ActionPlayAnimation(ANIMATION_FIREFORGET_TAUNT,1.0);<br />
ActionPlayAnimation(ANIMATION_FIREFORGET_BOW,1.0);<br />
ActionPlayAnimation(ANIMATION_FIREFORGET_VICTORY2,1.0);<br />
ActionPlayAnimation(ANIMATION_FIREFORGET_BOW,1.0);<br />
ActionPlayAnimation(ANIMATION_LOOPING_WORSHIP,1.0);<br />
            break;<br />
            case 7:<br />
           ActionPlayAnimation(ANIMATION_FIREFORGET_BOW,1.0);<br />
ActionPlayAnimation(ANIMATION_LOOPING_WORSHIP,1.0);<br />
ActionPlayAnimation(ANIMATION_LOOPING_TALK_PLEADING,1.0);<br />
            break;<br />
            case 8:<br />
<br />
          ActionPlayAnimation(ANIMATION_FIREFORGET_BOW,1.0);<br />
ActionPlayAnimation(ANIMATION_FIREFORGET_VICTORY3,1.0);<br />
ActionPlayAnimation(ANIMATION_LOOPING_TALK_PLEADING,1.0);<br />
            break;<br />
            case 9:<br />
<br />
          ActionPlayAnimation(ANIMATION_FIREFORGET_BOW,1.0);<br />
ActionPlayAnimation(ANIMATION_LOOPING_WORSHIP,1.0);<br />
ActionPlayAnimation(ANIMATION_LOOPING_TALK_PLEADING,1.0);<br />
            break;<br />
            case 10:<br />
<br />
          ActionPlayAnimation(ANIMATION_FIREFORGET_BOW,1.0);<br />
ActionPlayAnimation(ANIMATION_FIREFORGET_VICTORY2,1.0);<br />
ActionPlayAnimation(ANIMATION_LOOPING_TALK_PLEADING,1.0);<br />
            break;<br />
            }<br />
           <br />
        } <br />
    } <br />
 <br />
}





Teleportacja w trakcie rozmowy: Stworzyć dowolny "punkt" na podłodze. Następnie nadać mu unikalną etykietę. (np:oko) Teraz w rozmowie do wykonane zadania dajemy skrypt:
void main()<br />
{<br />
<br />
object oPC = GetPCSpeaker();<br />
<br />
AssignCommand(oPC, ClearAllActions());<br />
<br />
object oTarget;<br />
oTarget = GetWaypointByTag("oko");//nazwa waypointa<br />
<br />
DelayCommand(3.0, AssignCommand(oPC, ActionJumpToObject(oTarget)));//opóźnienie 3sek aby można było zobaczyć efekt specjalny<br />
<br />
oTarget = oPC;<br />
<br />
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_UNSUMMON), GetLocation(oTarget));//VFX_* można wstawić dowolny efekt<br />
<br />
}





NPC umiera w trakcie rozmowy: do wykonanych zadań dajemy:
void main()<br />
{<br />
object oNPC=GetObjectByTag("tag NPC");//nie trzeba zabijać tego NPC z którym się dyskutuje, można innego...trzeba tylko odpowiedni tag wpisać<br />
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), oNPC);<br />
}




I to by było na tyle. Jutro może jeszcze coś dodam.
Odpowiedz
Z tego co wiem na to nie trzeba skryptu. Wystarczy pobawić się w ustawieniach postaci. A przy okazji skrypty:

Witaj ponownie.
Jest to chyba najważniejszy skrypt w NWN. Dzięki temu gdy przyjdziemy drugi raz to tekst będzie inny niż przy pierwszej rozmowie. Więc po kolei. Najpierw tworzymy 2 teksty. Ten który napiszemy pierwszy usłyszymy przy pierwszej rozmowie. Teraz w tekście "pierwszym" który ma zniknąć podczas "drugiej" rozmowy w zakładce "tekst pojawia się gdy" dajemy skrypt:

int StartingConditional()<br />
{<br />
	int bCondition = GetIsPC(GetPCSpeaker()) &&<br />
                     GetLocalInt(GetModule(),"NW_G_M1Q6F08Demon_Free") == FALSE &&<br />
                     GetLocalInt(OBJECT_SELF,"L_TALKTIMES") < 1;<br />
	return bCondition;<br />
}


Teraz otwieramy zakładkę "wykonane zadania" i wpisujemy skrypt:
void main()<br />
{<br />
    SetLocalInt(OBJECT_SELF,"L_TALKTIMES",GetLocalInt(OBJECT_SELF,"L_TALKTIMES") + 1);<br />
    SetLocalObject(OBJECT_SELF,"NW_L_FirstSpeaker",GetPCSpeaker());<br />
}


Teraz klikamy na tekst który ma się pojawić podczas drugiej rozmowy i w zakładce "tekst pojawia się gdy" dajemy:
int StartingConditional()<br />
{<br />
	int bCondition = GetIsPC(GetPCSpeaker()) &&<br />
                     GetLocalInt(GetModule(),"NW_G_M1Q6F08Demon_Free") == FALSE &&<br />
                     GetLocalInt(OBJECT_SELF,"L_TALKTIMES") >= 1;<br />
	return bCondition;<br />
}


No dobra jeszcze kilka skryptów:

Wołający NPC.
Dzięki temu skryptowi NPC będzie coś wołał gdy tylko zobaczy naszego PG
Do OnHetbeat NPC wpisać:

void main()<br />
{<br />
<br />
object oPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, OBJECT_SELF, 1, CREATURE_TYPE_PERCEPTION, PERCEPTION_SEEN);<br />
<br />
if (IsInConversation(OBJECT_SELF) || GetIsInCombat()) return;<br />
<br />
if (!(GetLocalInt(oPC, "intZmiennaT")<= 1))<br />
   return;<br />
<br />
ActionSpeakString("Tekst który NPC ma wypowiedzieć.");<br />
<br />
}


Tekst pojawi się gdy mamy przedmiot w "plecaku".
Do "tekst pojawia się gdy" (mósi to być tekst który wymawia PG!) dajemy:

int StartingConditional()<br />
{<br />
    int bCondition = GetIsObjectValid(GetItemPossessedBy(GetPCSpeaker(),"Nazwa przedmiotu"));<br />
    return bCondition;<br />
}
Odpowiedz
← Neverwinter Nights

Wielka składnica skryptów - Odpowiedź

Wczytywanie...