Thalie
http://thalie.pilsfree.cz/forum/

Užitečné scripty
http://thalie.pilsfree.cz/forum/viewtopic.php?f=1&t=5362
Page 1 of 3

Author:  -RoF- [ 11:05 15. Aug 2011 ]
Post subject:  Užitečné scripty

Moc se ve scriptech nevyznám, ale pokud už jsou v modulu a je k nim návod, tak je rád použivám.

Jde mi o to, aby se sem dávaly scripty, které už v modulu jsou a aby se psalo k čemu jsou a jak je využít. :wink:

A taky aby sem někdo dával nově vytvořené scripty a tak dále. :)

Takže script 1

Mám dveře na které jsem použil script ja_door_onopen, zamkl jsem je a použil na předmět (například dalekohled) vedle script ku_opendoor. Vše samozřejmě funguje jak má.
Ted bych ale třeba rád ten dalekohled (který ovládá dveře) zamkl a použít by šel jen po odemčení klíčem.
Jak to udělat? Páč script ku_opendoor se vykoná, ikdyž je ovládací předmět zamčený.

script 2

Mám další dveře :) a opět jsem je zamkl a tak dále. Chci ty dveře otevřít pomocí dvou pák, za které se musí zatáhnout současně (dvě postavy). Jak to udělat?
Existuje ten script v modulu a nebo se musí vytvořit nový?

script 3

A aby toho nebylo málo, mám další dveře, opět zamčené, jak jinak :roll: :D . Chci aby se ty dveře otevřely poté, když postava šlápne na nějaké tlačítko, takže prakticky vahou postavy.
Existuje takový spouštěč, script ve hře? Na Dragon hammeru byl spouštěč pojmenovaný pressure, ale script se odkazoval na nějaký další, který rozlišoval hmotnost.
Popřípadě existuje jednodušší řešení? ;)

To asi zatím vše, díkas za odpovědi ;)

Popřípadě sem pište jiné užitečné scripty a prosím i návody k nim a k nastavení proměných. Díkas :)

Author:  kucik [ 12:26 15. Aug 2011 ]
Post subject:  Re: Užitečné scripty

1. Zamčená páka Viděl bych to asi nějak takhle:
ku_lever_lock.nss
Code:
void main() {

  object oLever = OBJECT_SELF;
  string script;
  if(GetLocked(oLever)) {
    PlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE);
    SpeakString(oLever, "* Paka je zamcena a neni mozne s ni hnout *");
    string script = GetLocalString(oLever,"LOCKED");
    if(GetStringLength(script) > 0) {
      ExecuteScript(script, oLever);
    }
  }
  else {
    string script = GetLocalString(oLever,"UNLOCKED");
    PlayAnimation(ANIMATION_PLACEABLE_ACTIVATE);
    DelayCommand(2.0,PlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE));
    if(GetStringLength(script) > 0) {
      ExecuteScript(script, oLever);
    }
  }
}

Do proměnný UNLOCKED na páce dáš script, kterej se má vykonat pouze když je páka odemčená.

Author:  kucik [ 12:33 15. Aug 2011 ]
Post subject:  Re: Užitečné scripty

2. Otevírání dveří pomocí více pák (nutnost spustit najednou více pák.)

ku_door_lever.nss:
Code:
void LeverReturn(object oDoors, object oLever) {

  AssignCommand(oLever,PlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE));
  int iPushed = GetLocalInt(oDoors,"KU_LEVER_PUSHED") - 1;
  if(iPushed < 0)
    iPushed = 0;
  SetLocalInt(oDoors,"KU_LEVER_PUSHED",iPushed);

}

void main()
{
  int iType = 0; //Doors
  string sTag = "";
  int i;
  //ovladacmu prvku nastavit tyto promenne:
  //DOORS_COUNT, int, pocet dveri
  //PLC_DOORS, int, 1 pokud jsou dvere placeable
  //DOORS_TAG, string, tag dvari
  int iCount = GetLocalInt(OBJECT_SELF,"DOORS_COUNT");
  float LeverTimeout = GetLocalFloat(OBJECT_SELF,"TIMEOUT");
  object oLever = OBJECT_SELF;

  if(GetLocalInt(OBJECT_SELF,"PLC_DOORS")) {
    iType = 1;
    sTag = GetLocalString(OBJECT_SELF,"DOORS_TAG");
  }
  if(iCount < 1) {
    iCount = 1;
  }

  PlayAnimation(ANIMATION_PLACEABLE_ACTIVATE);

  if(GetStringLength(sTag) > 0) {
    for(i=1;i<=iCount;i++) {
      object oDoors = GetNearestObjectByTag(sTag,OBJECT_SELF,i);
//SpeakString("mam dvere:"+GetName(oDoors));
      int iNeeded = GetLocalInt(oDoors,"LEVER_COUNT");
      int iPushed = GetLocalInt(oDoors,"KU_LEVER_PUSHED") + 1;
      SetLocalInt(oDoors,"KU_LEVER_PUSHED",iPushed);
      if(iPushed == iNeeded) {
        AssignCommand(oDoors,ActionOpenDoor(oDoors));
      }
      DelayCommand(LeverTimeout,LeverReturn(oDoors,oLever));
    }
  }

  SpeakString("Neni urceny tag dveri: 'DOORS_TAG'");
}

Ovládá se to zhruba stejně jako ku_opendoor. Tzn. do DOORS_TAG nastavit tag dveří, který to má otevírat, DOORS_COUNT = počet dveří, který to otevírá.
Navíc:
int LEVER_COUNT = počet pák, které se musí stlačit zároveň pro otevření.
float TIMEOUT = interval ve vteřinách, v kterym musí být páky spuštěny, protože by se těžko podařilo stlačit páky přesně najednou.

PS: Obojí jsem psal z hlavy a nemám to jak testnout. Můžou tam být chyby.

Author:  kucik [ 12:34 15. Aug 2011 ]
Post subject:  Re: Užitečné scripty

3. Takže chceš trigger na zemi, nebo jak je to myšleno?

Author:  -RoF- [ 12:47 15. Aug 2011 ]
Post subject:  Re: Užitečné scripty

kucik wrote:
3. Takže chceš trigger na zemi, nebo jak je to myšleno?


Ano trigger na zemi.

Jinak děkuju za 1 a 2. Super ;)

Author:  kucik [ 13:18 15. Aug 2011 ]
Post subject:  Re: Užitečné scripty

Pokud to má být jen trigger na zemi, který otevře dveře, tak tam úplně stejně můžeš dát ku_opendoor.
Pokud to má dělat ještě něco jiinýho, tak to chce popsat co.

Author:  -RoF- [ 13:32 15. Aug 2011 ]
Post subject:  Re: Užitečné scripty

kucik wrote:
Pokud to má být jen trigger na zemi, který otevře dveře, tak tam úplně stejně můžeš dát ku_opendoor.
Pokud to má dělat ještě něco jiinýho, tak to chce popsat co.


To máš pravdu, stačí pak v proměné nastavit na dveřích DOORCLOSE_DELAY int třeba na 2, takže to ta postava nestihne proběhnout těma dveřma. Je to asi jednodušší než vytvářet nový script :).

Mě hlavně jde o to, abych z některých dungů vyhnal solisty a bylo tam potřeba aspon minimálně 2-3 postavy.

No další dotazy dodám. ;)

Díkas

Author:  -RoF- [ 14:58 18. Sep 2011 ]
Post subject:  Re: Užitečné scripty

Další dotaz :)

V jednom dungu na Thalii (v jednom chrámu v bažinách) je logická hádanka, kterou když postava správě vypočítá a řekne číslo, tak se objeví portál.

Šlo by to udělat i na slovo?
Třeba postava řekne něco a objeví se portál?
Pokud ano, jaký by byl script :)

Díkas. :wink:

Author:  kucik [ 15:07 18. Sep 2011 ]
Post subject:  Re: Užitečné scripty

Slo. Jen se slovama je trosicku potiz: Rozlisuji se velka a mala pismena, je podstatna diakritika.

Author:  -RoF- [ 11:18 19. Sep 2011 ]
Post subject:  Re: Užitečné scripty

kucik wrote:
Slo. Jen se slovama je trosicku potiz: Rozlisuji se velka a mala pismena, je podstatna diakritika.


Jasně no, ale tak to bych zvolil slovo, které by snad nedělalo problém.

A jaký je prosímtě ten script? Myslím ten v chrámu na ty čísla. Popřípadě i na to slovo.

Díky :wink:

Author:  kucik [ 11:44 19. Sep 2011 ]
Post subject:  Re: Užitečné scripty

V tom chrámu je specifickej pro účely chrámu. Můžu ti ho poslat, lae stejně by se musel předělat na konkrétní účel.

Author:  -RoF- [ 13:28 19. Sep 2011 ]
Post subject:  Re: Užitečné scripty

kucik wrote:
V tom chrámu je specifickej pro účely chrámu. Můžu ti ho poslat, lae stejně by se musel předělat na konkrétní účel.


Tak pošli prosím, já mrknu aspon co to obsahuje a třeba z toho něco použiju někdy ;)

Author:  -RoF- [ 15:53 19. Sep 2011 ]
Post subject:  Re: Užitečné scripty

Ted mě napadla další věc (já vím jsem otravný :roll: ).

Rád bych dal do dungu vězení a v něm nějaké živé a nebo položivé NPC.
A jelikož na Thalii jsou postavy, které rády zachranují nějaké vězně z dungu.

Tak bych chtěl, že pokud PC najde klíč od vězení a odemkne, tak po kliknutí na NPC mu vyskočí rozhovor s tím že bud může vězně nechat trpět v base a nebo ho pustí.

Jde mi o to jaký script je na odvolání NPC?

Díkas :wink:

Author:  kucik [ 16:13 19. Sep 2011 ]
Post subject:  Re: Užitečné scripty

Tady je script pro sochu cca tak, jak se používá v chrámu. Viz http://www.nwnlexicon.com/compiled/func ... tring.html
Chová se to case insensitivně. V podstatě si nastavíš pattern podle toho, co čekáš že PC řekne a pak porovnáváš, jestli to pasuje.

Code:
void main()
{
    if(GetLocalInt( OBJECT_SELF, "JA_CHRAM2_ACTIV"))
        return;

    if(!GetLocalInt( OBJECT_SELF, "JA_CHRAM2_AGE")){
        int iAge = Random(1000);

        SetListenPattern( OBJECT_SELF, "*n", 1);
        SetListenPattern( OBJECT_SELF, "** *n **", 2);
        SetListenPattern( OBJECT_SELF, "** *n", 3);
        SetListenPattern( OBJECT_SELF, "*n **", 4);

        SetListening( OBJECT_SELF, TRUE );
    }

    int iAge = GetLocalInt( OBJECT_SELF, "JA_CHRAM2_AGE");
    int iMatch = GetListenPatternNumber();
    int iSaid = 0;

    if( iMatch == 1 || iMatch == 4 ){
        iSaid = StringToInt(GetMatchedSubstring(0));
    }
    else if( iMatch == 2  || iMatch == 3){
        iSaid = StringToInt(GetMatchedSubstring(2));
    }

    if( iSaid == iAge ){
        effect eStart = EffectVisualEffect( VFX_IMP_GOOD_HELP );

        ApplyEffectAtLocation( DURATION_TYPE_INSTANT, eStart, GetLocation(OBJECT_SELF) );
        PlayAnimation( ANIMATION_PLACEABLE_ACTIVATE );

        SetLocalInt( OBJECT_SELF, "JA_CHRAM2_ACTIV", 1 );
    }
}


Na zmizení NPC je návod tady:
http://www.nwnlexicon.com/compiled/func ... ppear.html

Author:  -RoF- [ 09:27 20. Sep 2011 ]
Post subject:  Re: Užitečné scripty

kucik wrote:
....


Děkuju, omrknu a zkusím jak se mi to povede, snad :)

Page 1 of 3 All times are UTC + 1 hour [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/