Skočit na obsah


Script Editor Kviz II.


  • Please log in to reply
15 odpovědí na toto téma

#1 Host_gGeorg_*

Host_gGeorg_*
  • Host

Odesláno 21.09.2007 12:12

NPC Mocny Kouzelnik da lowbeekovi quest, prines 20vlcich zubu.

mejme kus dialogu ktery vypada takto:
[OWNER] Uz mas nazbirano?
-1. Tady mam tich 20 zubu
- - - [OWNER] Dobra, tady je tva odmena. Mega mec +10 a jeste 100 xp navrch.
-2. Pracuju na tom [End Dialog]


Na 1. je do Action Taken pripojen script

gg_quest_zub_4
--------------------

fnDisapear (object oCreature)
{
/// zde je par radek ktere kolem kouzelnika udelaji effekt mlhy a nasleduje effekt banshee.

}
void main ()
{
object oPC=GetPCSpeaker();
object oMec = CreateItemOnObject("gg_i_megamec", oPC);

GiveXPToCreature(oPC, 100);
fnDisapear (OBJECT_SELF);
DestroyObject(OBJECT_SELF, 0.1);
DestroyObject(oMec , 20.0);
DelayCommand(20.0, SendMessageToPC(oPC, "* smich kouzelnika * uzasny mec ktery ti daroval zmizel ");
}

-----------------------------------
1. Co vsechno se vypise hraci za text?
2. Jakych chyb jsem se dopustil?

(predmet "gg_i_megamec" je v palete a je to dlouhy mec +10)
  • 0

#2 petrikus

petrikus

    Mladší učeň

  • WB
  • PipPip
  • 104 Příspěvků:
  • Gender:Male
  • Location:Přerov

Odesláno 21.09.2007 21:42

tak ja si zkusim tipnout...

1. pokud skript opravdu probehne bez chyby tak by se melo postave vypsat ze dostala megamec, dostala expy, ztratila megamec, hlaska kouzelnika

2. SendMessageToPC není "action"...? nemelo by tam byt spis neco jako ActionSpeakString....?
Dale mi tam chyby neco co odstrani ty zuby ktere da postava carodejovy
  • 0

#3 Host_gGeorg_*

Host_gGeorg_*
  • Host

Odesláno 22.09.2007 23:01

tak ja si zkusim tipnout...

1. pokud skript opravdu probehne bez chyby tak by se melo postave vypsat ze dostala megamec, dostala expy, ztratila megamec, hlaska kouzelnika

2. SendMessageToPC  není "action"...? nemelo by tam byt spis neco jako ActionSpeakString....?
  Dale mi tam chyby neco co odstrani ty zuby ktere da postava carodejovy

Zobrazit příspěvek

1. Tak jak rikas to je napsane, a ani syntax error tam neni. Ale nestane se to, proto je to kviz zejo. :)
2. Neni. Nemelo. Send Message posle text do praveho okna, (jak se tam vypisuji utoky).
3. Ano chybi, gratuluji :) .
  • 0

#4 Host_gGeorg_*

Host_gGeorg_*
  • Host

Odesláno 24.09.2007 12:23

Zadny lustitel?

Tip: Predchozi Kviz o Create/Destroy funkcich.
  • 0

#5 Ter Leeloo II

Ter Leeloo II

    Cechmistr

  • Admin
  • PipPipPipPipPipPipPipPipPip
  • 2528 Příspěvků:
  • Gender:Male

Odesláno 03.10.2007 07:37

... a ani syntax error tam neni.

Zobrazit příspěvek

Tak pro zacatek jsou tam syntakticke chyby dve - spatna deklarace funkce fnDisapear - chybi navratovy typ (a disappear je se dvema p) a chybejici zavorka u posledniho DelayCommand.

void fnDisappear(object oCreature) {
    /// zde je par radek ktere kolem kouzelnika udelaji effekt mlhy a nasleduje effekt banshee.
}

void main () {
    object oPC = GetPCSpeaker();
    object oMec = CreateItemOnObject("gg_i_megamec", oPC);

    GiveXPToCreature(oPC, 100);
    fnDisappear(OBJECT_SELF);
    DestroyObject(OBJECT_SELF, 0.1);
    DestroyObject(oMec , 20.0);
    DelayCommand(20.0, SendMessageToPC(oPC, "*smich kouzelnika* uzasny mec ktery ti daroval zmizel"));
}

Jinak pak:

1)
Ziskani mece
Ziskani XP
po 20s ztraceni mece

2) Chybou je to, ze SendMessageToPC je zpozdeno za DestroyObject NPC DelayCommandem, takze v dobe, kdy by to melo vypsat hlasku se smichem je NPC zruseno nebo v takovem stavu ruseni, ze nemuze vypsat hlasku. NWN Lexicon to komentuje slovy:

Invalid objects can't execute stuff inside DelayCommands, meaning that DelayCommand should not be used in OnDeath events, or after a call to DestroyObject(OBJECT_SELF);


Resenim by mohlo byt treba toto:
DestroyObject(OBJECT_SELF, 20.0);
DelayCommand(20.0, SendMessageToPC(oPC, "*smich kouzelnika* uzasny mec ktery ti daroval zmizel"));
DestroyObject(oMec , 20.0);
Sice NPC zmizi az v dobe, kdy mizi mec, ale aspon to vypise tu hlasku.

A pokud se chceme pozastavovat nad tim, ze chybi DestoyObject na zuby vlka, tak tam predevsim chybi kontrola, zda ty zuby vubec ma :yes:
  • 0

#6 Host_gGeorg_*

Host_gGeorg_*
  • Host

Odesláno 03.10.2007 21:20

Tak pro zacatek jsou tam syntakticke chyby dve - spatna deklarace funkce fnDisapear - chybi navratovy typ (a disappear je se dvema p) a chybejici zavorka u posledniho DelayCommand.

void fnDisappear(object oCreature) {
    /// zde je par radek ktere kolem kouzelnika udelaji effekt mlhy a nasleduje effekt banshee.
}

pravda navratovy typ void chybi aj zavorka, psal jsem to z hlavy. dve p neberu jako chybu.

Jinak pak:

1)
Ziskani mece
Ziskani XP
po 20s ztraceni mece

2) Chybou je to, ze SendMessageToPC je zpozdeno za DestroyObject NPC DelayCommandem, takze v dobe, kdy by to melo vypsat hlasku se smichem je NPC zruseno nebo v takovem stavu ruseni, ze nemuze vypsat hlasku. NWN Lexicon to komentuje slovy:
Resenim by mohlo byt treba toto:
[code=auto:0]DestroyObject(OBJECT_SELF, 20.0);
DelayCommand(20.0, SendMessageToPC(oPC, "*smich kouzelnika* uzasny mec ktery ti daroval zmizel"));
DestroyObject(oMec , 20.0);
Sice NPC zmizi az v dobe, kdy mizi mec, ale aspon to vypise tu hlasku.

A pokud se chceme pozastavovat nad tim, ze chybi DestoyObject na zuby vlka, tak tam predevsim chybi kontrola, zda ty zuby vubec ma :yes:

Zobrazit příspěvek

Hmmm, jsi na dobre stope. add 2
Tva rada ale meni to jak jsem si predstavoval ze to bude fungovat.Ja bysem rad aby kouzelnik napred zmizel a pak za 20s zmizel ten mec a hrac dostal Message.

Jeste poznamka k tomu tvemu napadu
Je dobre casovani delat postupne zvlast v kombinaci s Destroyem:
DestroyObject(oMec , 20.0);
DelayCommand(20.0, SendMessageToPC(oPC, "*smich kouzelnika* uzasny mec ktery ti daroval zmizel"));
DestroyObject(OBJECT_SELF, 20.1);

Aano to je hlavni kamen urazu, takhle bysem tam mohl stat a jen zbirat xp :D
  • 0

#7 Ter Leeloo II

Ter Leeloo II

    Cechmistr

  • Admin
  • PipPipPipPipPipPipPipPipPip
  • 2528 Příspěvků:
  • Gender:Male

Odesláno 03.10.2007 21:35

Je dobre casovani delat postupne zvlast v kombinaci s Destroyem

Zobrazit příspěvek

Vychazel jsem z poznamky o poradi provadeni zpozdeni z Lexiconu:

As of HotU, DelayCommand()'s order, if used with the same delay, has been swapped for performance reasons.

Ozkousel jsem si to v praxi, ze skutecne jsou DelayCommand i zpozdeny DestroyObject spousteny v opacnem poradi, nez byly napsany.
  • 0

#8 Brudrafon

Brudrafon

    Starší mistr

  • Hráč
  • PipPipPipPipPipPipPipPip
  • 1979 Příspěvků:
  • Location:Doma

Odesláno 03.10.2007 21:45

Vychazel jsem z poznamky o poradi provadeni zpozdeni z Lexiconu:

Ozkousel jsem si to v praxi, ze skutecne jsou DelayCommand i zpozdeny DestroyObject spousteny v opacnem poradi, nez byly napsany.

Zobrazit příspěvek

To je podle me jeden z dukazu, ze ten script nebezi ani ve vice vlaknech ...
  • 0

#9 Host_gGeorg_*

Host_gGeorg_*
  • Host

Odesláno 03.10.2007 21:46

Ozkousel jsem si to v praxi, ze skutecne jsou DelayCommand i zpozdeny DestroyObject spousteny v opacnem poradi, nez byly napsany.

Zobrazit příspěvek

... abych pravdu rekl, te vete z lexiconu nerozumim zcela. A te tvoji take ne. :yes:
Jak ze se to chova?
  • 0

#10 Brudrafon

Brudrafon

    Starší mistr

  • Hráč
  • PipPipPipPipPipPipPipPip
  • 1979 Příspěvků:
  • Location:Doma

Odesláno 03.10.2007 21:51

... abych pravdu rekl, te vete z lexiconu nerozumim zcela. A te tvoji take ne.  :yes:
Jak ze se to chova?

Zobrazit příspěvek

Od HotU, poradi Delaycommand()'s, kdyz jsou pouzity se stejnym spozdenim, bylo prohozeno z vykonnostnich duvodu.

Tudiz se vse provadi LIFO ...
  • 0

#11 Host_gGeorg_*

Host_gGeorg_*
  • Host

Odesláno 03.10.2007 21:57

Aha. zajimavy... ale stejne bysem mel mrazeni v zadech.
  • 0

#12 Brudrafon

Brudrafon

    Starší mistr

  • Hráč
  • PipPipPipPipPipPipPipPip
  • 1979 Příspěvků:
  • Location:Doma

Odesláno 03.10.2007 21:59

Aha. zajimavy... ale stejne bysem mel mrazeni v zadech.

Zobrazit příspěvek

Proc ? Z ceho ?
Z toho ze to je prakticke LIFO ? Nebo ze to je provadeno opacne ?
  • 0

#13 Host_gGeorg_*

Host_gGeorg_*
  • Host

Odesláno 04.10.2007 15:41

z toho ze to bude provadene jinak nez pisi.... .
  • 0

#14 Ter Leeloo II

Ter Leeloo II

    Cechmistr

  • Admin
  • PipPipPipPipPipPipPipPipPip
  • 2528 Příspěvků:
  • Gender:Male

Odesláno 04.10.2007 15:57

Hmmm, jsi na dobre stope. add 2
Tva rada ale meni to jak jsem si predstavoval ze to bude fungovat.Ja bysem rad aby kouzelnik napred zmizel a pak za 20s zmizel ten mec a hrac dostal Message.

Zobrazit příspěvek

Nu, ale tva predstava nebyla nikde v zadani zminena, ani tam nebylo napsano, ze se mame starat o spravne reseni - pouze najit chyby. Sve reseni jsem hodil jen tak.

Pak tedy treba:
void main () {

    object oPC = GetPCSpeaker();
    object oZuby = GetItemPossessedBy(oPC, "tlii_zuby");
    int iPocet = GetItemStackSize(oZuby);

    if(iPocet >= 20) {

        if(iPocet > 20) {
            SetItemStackSize(oZuby, iPocet - 20);
        } else {
            DestroyObject(oZuby);
        }

        object oMec = CreateItemOnObject("tlii_mec", oPC);

        GiveXPToCreature(oPC, 100);

        ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_WAIL_O_BANSHEES), GetLocation(OBJECT_SELF));
        ActionJumpToLocation(GetLocation(GetObjectByTag("tlii_hidden"))); // kde tlii_hidden je waypoint v nepristupne lokaci

        DestroyObject(OBJECT_SELF, 20.0);
        DelayCommand(20.0, SendMessageToPC(oPC, "*smich kouzelnika* uzasny mec ktery ti daroval zmizel"));
        DestroyObject(oMec , 20.0);
    }
}

Je to sice podivne reseni, ale funguje :yes:
Nevim, jak to nejak jinak resit.
  • 0

#15 Host_gGeorg_*

Host_gGeorg_*
  • Host

Odesláno 04.10.2007 16:10

hh, zabavne reseni, fak jako dobry!

Pozn. 1. Zuby muzes nicit rovnou. Snizovat stack netreba.
Pozn. 2. Puvodne to mel byt priklad na jednu zajimavou techniku. Je vyhodna i na jine veci.
Tip: AssignCommand()


Edit: jo aha, ty pocitas stim ze to bude opakujici se quest! pak se omouvam ty zuby jsou ok.

Příspěvek upravil gGeorg: 04.10.2007 16:17

  • 0

#16 Ter Leeloo II

Ter Leeloo II

    Cechmistr

  • Admin
  • PipPipPipPipPipPipPipPipPip
  • 2528 Příspěvků:
  • Gender:Male

Odesláno 16.10.2007 15:45

Pozn. 1. Zuby muzes nicit rovnou. Snizovat stack netreba.
Edit: jo aha, ty pocitas stim ze to bude opakujici se quest! pak se omouvam ty zuby jsou ok.

Zobrazit příspěvek

Hlavne si vzpominam na to, jak lidi pokladali bylinky na zem pred Podivneho Ettina, aby jim nesezral cely stack :wink:

Pozn. 2. Puvodne to mel byt priklad na jednu zajimavou techniku. Je vyhodna i na jine veci.
Tip: AssignCommand()

Zobrazit příspěvek


Tak snad naposledy:
void main () {

    object oPC = GetPCSpeaker();
    object oZuby = GetItemPossessedBy(oPC, "tlii_zuby");
    int iPocet = GetItemStackSize(oZuby);

    if(iPocet >= 20) {

        if(iPocet > 20) {
            SetItemStackSize(oZuby, iPocet - 20);
        } else {
            DestroyObject(oZuby);
        }

        object oMec = CreateItemOnObject("tlii_mec", oPC);

        GiveXPToCreature(oPC, 100);

        ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_WAIL_O_BANSHEES), GetLocation(OBJECT_SELF));

        DestroyObject(OBJECT_SELF);
        DestroyObject(oMec , 20.0);
        AssignCommand(oPC, DelayCommand(20.0, SendMessageToPC(OBJECT_SELF, "*smich kouzelnika* uzasny mec ktery ti daroval zmizel")));
    }
}

  • 0




1 uživatelů si čte toto téma

0 členů, 1 návětěvníků, 0 anonymních