Construction Set Der Scriptthread

Hallo alle zusammen,

ich brauche ein Script, welches einen NPC bei einem bestimmten Questeintrag aus der Spielwelt entfernt. Jetzt ist es so, dass dieses Script nicht Funktioniert:

Code:
Begin script

short state


if ( state == 0 )
  Enable
  set state to 1
endif


if ( state == 1 )
  if ( GetJournalIndex "QuestID" == 24 )
    Disable
    set state to 2
  endif
endif


End

Der NPC will einfach nicht verschwinden. Ich habe bestimmt 5 verschiedene Scripts ausprobiert, unter anderem dieses:

Code:
Begin script

if ( GetJournalIndex "QuestID" == 24 )
    disable
elseif
    return
endif


End

oder dieses:

Code:
Begin script

short controlvar


if ( controlvar == 0 )
    return
endif


if ( GetJournalIndex "QuestID" == 24 )
    if ( controlvar == 0 )
        set controlvar to 1
        disable
    endif
endif


End
Aber dieses Script, welches auf einem anderen NPC liegt, funktioniert:

Code:
Begin script

short controlvar




if ( GetJournalIndex "QuestID" < 20 )
    disable
endif


if ( GetJournalIndex "QuestID" == 20 )
    enable
endif


if ( GetJournalIndex "QuestID" >= 22 )
    disable
endif


End

Ich finde einfach keine Lösung für dieses Problem, und ich kann nicht verstehen, wieso das andere Script funktioniert.

Ausserdem habe ich noch ein zweites Script-Problem. Eine Leiche soll bei einem bestimmten Questeintrag erscheinen (deshalb muss der erste NPC verschwinden...) und dann, wenn der Spieler nah genug an der Leiche ist, soll ein Questeintrag im Journal erscheinen. Dies funktioniert auch alles super, bis auf die Sache mit der Distanz. Ich bekomme den Questeintrag selbst wenn ich noch gefühlte 500 Meter von der Leiche entfernt bin. Das Script sieht so aus:

Code:
Begin script

short controlvar




if ( controlvar == 0 )
    disable
endif


if ( controlvar == 2 )
    return
endif


if (GetJournalIndex "QuestID" == 24 )
    enable
    set controlvar to 1
endif




if ( GetDistance "NPCLeicheID" >= 16 )
    if ( controlvar == 1 )
        return
    endif
endif


if ( GetDistance "NPCLeicheID" <= 15 )
    if ( controlvar == 1 )
        Journal "QuestID" 26
        set controlvar to 2
    endif
endif


End

Vielen Dank schon im Voraus, es wäre wirklich toll, wenn jemand einen Tipp für mich hätte.

Gruss


P.S.: Das erste (nicht funktionierende) Script stammt von Killfetzer aus diesem Beitrag. Es soltle eigentlich funktionieren, warum es dies nicht tut, ist mir ein Rätsel.
 
Zuletzt bearbeitet:
Naja, mein Script macht das Gegenteil, aber sonst ;)

Ein Problem dürfte sein, dass du deinen Scripten alle den gleichen Namen gegeben hast. Auch ist script ein denkbar ungünstiger Name für ein Script. Ich halte mich an folgendes Benennungsschema: Abkürzung für Namen_Abkürzung für Projekt_Objekt oder Funktion_script (also z.B. kf_skm_beispiel_script für Killfetzer und Skill Mastery). Das macht Scriptnamen zwar lang, aber man kann sich sicher sein, einzigartige Namen zu haben ;)

Also für dein erstes Problem würde ich es mir viel einfacher machen:

Code:
begin my_verschwinde_script

short doonce

if ( doonce == 0 )
  if ( GetJournalIndex, "my_journal_topic" >= 100 )
    Disable
    set doonce to 1
  endif
endif

end

Dein zweites Problem würde ich auch etwas anders angehen. Das Problem liegt bei deinem Script aber darin, dass du nicht den Abstand zum Spieler ermittelst, sondern zur Leiche selbst. Da deine Leiche einen Abstand von 0 zu sich selbst hat, ist das immer wahr. Statt NPCLeicheID musst du hier Player hinschreiben. Übrigens sind 15 Editoreinheiten sehr, sehr wenig (1 EE = 1,433 cm). Hier willst du also sicherlich etwas mehr eintragen.
 
  • Like
Reaktionen: nemo2639
Ich habe dein Script einfach umgedreht, ich dachte, das wäre eine gute Idee. Aber an den Namen liegt es nicht, die haben alle verschiedene, ich habe es nur hier schnell so reingeschrieben. Normalerweise benenne ich meine Scripts genau so wie du es beschrieben hast. Und trotzdem funktioniert es nicht :( Aber ich habe jetzt dein Script ausprobiert, und es geht einwandfrei :D

Die Distanz im zweiten Script hatte ich absichtlich so niedrig gewählt, um auszuschliessen, dass es daran liegt, aber ich bin nicht darauf gekommen, dass dort Player stehen muss... :headwall:


Jetzt funktioniert alles super!
Vielen, vielen Dank. :hail:
 
skripte?

hallo ihr scripter :D

ich bräuchte da maln script, und zwar ein timer script, der am anfang paar sekunden wartet und dann alle 5-6 sekunden ne messagebox ausspuckt und das ungfähr 4-5 x..

ich hab schon bissel geschaut ich raff es nicht... :huh:

danke VDM
 
hallo ihr scripter :D

ich bräuchte da maln script, und zwar ein timer script, der am anfang paar sekunden wartet und dann alle 5-6 sekunden ne messagebox ausspuckt und das ungfähr 4-5 x..

ich hab schon bissel geschaut ich raff es nicht... :huh:

danke VDM

Hallo VDMap, willkommen im Forum :)

Also ein bisschen genauer musst du schon werden...
Der prinzipielle Ablauf sollte dann aber irgendwie so aussehen:

Code:
begin my_beispiel_script

short i
float timer

if ( MenuMode == 1 )
  return
endif

while ( i <= 5 )
  set timer to timer + GetSecondsPassed

  if ( timer >= 5 )
    set timer to 0
    set i to i + 1
    MessageBox, "Tada!"
  endif
endwhile

end
 
hi Killfetzer, s
ry ich versteh das nich so ganz...., es ist auch nur für eine Messagebox ausgabe...,
kann ich die dann einfach mehrmals verwenden mit anderer short in dem selben script?
 
Hallo VDMap, willkommen im Forum :)

Also ein bisschen genauer musst du schon werden...
Der prinzipielle Ablauf sollte dann aber irgendwie so aussehen:

Code:
begin my_beispiel_script

short i
float timer

if ( MenuMode == 1 )
  return
endif

while ( i <= 5 )
  set timer to timer + GetSecondsPassed

  if ( timer >= 5 )
    set timer to 0
    set i to i + 1
    MessageBox, "Tada!"
  endif
endwhile

end
Äh, Killfetzer? Bist du sicher, daß du eine WHILE-Schleife um ein GetSecondsPassed-Timer-Event setzen willst?
 
hi, hab es einigermaßen hinbekommen..!

jetz hab ich aber ein anders prob.

if ( state == 4 )
Set timer to ( timer + GetSecondsPassed )
if ( timer >= 14 )
playSound "skillraise"
"_vdm_arch_mage"->Cast, "mark", _vdm_idroaes_relas
"_vdm_idroaes_relas"->Cast, "mark", _vdm_arch_mage
MessageBox "Archmage: Ahh, it seems to be working..."
set state to 5
endif


funktioniert alles ganz gut auch das was davor und danach kommt.., das einzige was nich funktioniert sind die cast's von den 2 npc's...

hab das script in meiner test installation gemacht da funktioniert es, im der normalen installation läuft es leider nich. an was kann das liegen?

ty VDm

btw der spell is nur für den visuellen effekt...
 
Hallo..., ich bins ma wieder!

Ich bräuchte ein Script für ne Tür die sich Nachts automatisch schließt, und dann ne messagebox ausgibt.. Sowas wie "Der Laden ist Nachts geschlossen", oder so.
Hab mir schon paar sachen angeschaut komm aber nich drauf..

ty
 
Hallo, das sollte eigentlich ganz einfach gehen:

Code:
begin my_tuer_script

if ( OnActivate == 1)
  if ( GameHour > 6 )
    if ( GameHour < 18 )
      Activate
    else
      MessageBox, "Der Laden ist nachts geschlossen."
    endif
  else
    MessageBox, "Der Laden ist nachts geschlossen."
  endif

end
 
  • Like
Reaktionen: VDMap
hey killfetzer, scheint so nich hinzuhauen:
miss matched if/else/endif starting on line 3.

danke trotzdem..:D kannst ja noch ma schauen..

ps nachts zu und tags auf is nich das prob eher die box...
 
da fehlt einfach bloß ein "endif"

Code:
begin my_tuer_script

if ( OnActivate == 1)
  if ( GameHour > 6 )
    if ( GameHour < 18 )
      Activate
    else
      MessageBox, "Der Laden ist nachts geschlossen."
    endif
  else
    MessageBox, "Der Laden ist nachts geschlossen."
  endif
[COLOR="#0000CD"]endif[/COLOR]

end

Mit dem Skript wird die Tür übrigens nicht wirklich "abgeschlossen" ... sie ist in dieser Zeitspanne dann einfach nicht normal aktivierbar, sondern zeigt die MessegaBox an.
 
  • Like
Reaktionen: VDMap
hallo, icke ma wieder...

kann mirr jemand sagen was da falsch läuft..? funzt schon, aber halt nich einmal wie es vorgesehn ist,...

script..

short DoOnce


if ( GetDistance Player <= 1000)
Journal "xyz" 20
AddTopic "zxy"
set DoOnce to 1
endif


end

danke
 
kann mirr jemand sagen was da falsch läuft..? funzt schon, aber halt nich einmal wie es vorgesehn ist,...
Joah, wundert mich nicht. Laß mich raten, das Journal kommt immer wieder? :-D

Schreib es so:

Code:
begin scriptname_sc
short DoOnce

IF ( DoOnce == 0 )
	IF ( GetDistance Player <= 1000 )
		Journal "XYZ_ID" 20
		AddTopic "zxy"
		set DoOnce to 1
	EndIF
EndIF

end
Natürlich geht es auch eleganter, wenn man GetJournalIndex zur Prüfung benutzt - so:

Code:
begin scriptname_sc

IF ( GetJournalIndex "XYZ_ID" < 20 )
	IF ( GetDistance Player <= 1000 )
		Journal "XYZ_ID", 20
		AddTopic "zxy"
	EndIF
EndIF

end
 
  • Like
Reaktionen: VDMap
erstma danke an £exa... :D

hätte da noch ne frage:
hab hier son standart tele script..., ich hätte da gern noch einen journal eintrag, wenn ich den ring, amulet das erste mal aufnehme..., soll halt nur einmal kommen...:huh:

das tele script sieht so aus...

Code:
Begin blablabla_teleport

short button
short messageOn
short OnPCEquip
short doonce


if ( OnPCEquip == 0 )
 set doonce to 0
 return
elseif ( doonce == 1 )
 return
endif


if ( messageOn == 0 )
 MessageBox "Travel to blablabla?" "Nope!" "Yo!"
 set messageOn to 1
endif


if ( messageOn == 0)  ; drop out, if msgbox is not open
 return
elseif ( messageOn == 1)
 set button to GetButtonPressed
 if ( button == -1 )
  return
 endif
endif


if ( button == 1 )
 messagebox "You feel very strange, but not shocked..."
 PlaySound "Thunder2"
 Player->PositionCell, 4230 3826 452 180 "bla, blabla" 
endif


set messageON to 0
set doonce to 1


end

ich sag schon mal danke... :roll:
 
lol, wieso kommt mir der MessageBox Text in dem Script da eigentlich so bekannt vor ? Erinnert mich irgendwie an eine alte Version von dem Arkngchend Teleportring :-D

Wie auch immer, was du willst, ist recht simpel - du kannst den Codeblock aus dem vorherigen Script im Grunde übernehmen, nur muß die Bedingung natürlich ein wenig verändert werden:

Code:
IF ( OnActivate )
	IF ( GetJournalIndex "XYZ_ID" < [ID] )
		Journal "XYZ_ID", [ID]
	EndIF
	Activate
EndIF
Dies kommt vor allen anderen Code Blöcken, also direkt nach den Deklarationen, ins Script. Das wäre schon alles.
 
  • Like
Reaktionen: VDMap