Construction Set Der Scriptthread

Geht, ist aber nicht ganz so leicht. Das Teleportieren darf dann nicht aus dem Dialog heraus stattfinden. Nehmen wir an, du hast einen NPC, der diesen Teleport durchführt. Du legst nun auf diesen NPC ein Script (wenn er nicht ohnehin schon eines hat). Nun machst du folgendes:

Du deklarierst in diesem Script eine lokale Variable und fügst einen Codeblock ein:

Code:
short TeleportPC

IF ( TeleportPC = 1 )
  IF ( MenuMode )
    return
  EndIF
  set TeleportPC to -1
  player->PositionCell ; // hier kommt der Teleport-Befehl aus dem Dialog rein
  return
EndIF

Wo und wie dieser Codeblock in das NPC Script kommt, hängt davon ab, ob es schon eines gibt, und falls ja, wie es aussieht.

In den Dialog kommt dann anstelle des Teleportbefehls folgendes hinein:

set [EDITORID DES NPC].TeleportPC to 1
GoodBye

Sofern dieser NPC nur einmal im Spiel vorkommt, sollte das funktionieren. Gibt es mehrere NPCs, die diese Teleportfunktion haben, muss man das ganze mit einer globalen Variablen lösen, aber das Prinzip bliebe gleich.
 
ey, da bekomm ich immer nen CTD..., den NPC gibts nur einmal im game...

hab in der resultbox nochn journal, ka, die reihnfolge ändern bringt auch nix...
 
Zuletzt bearbeitet:
Stimmt, hab ich - kommt davon, wenn man früh morgens ohne Koffeinzugabe codet. Sollte das den CTD nicht beheben, poste den Inhalt deiner Resultbox ins Forum. Die meckert nämlich nicht bei Formatfehlern sondern schmiert erst ingame ab.
 
geht leider auch nicht so... :(

die resultbox sieht wie folgt aus...

Code:
set _vdm_xiover_fassinos.TeleportPC to 1
GoodBye

danke
 
Zuletzt bearbeitet:
Der CTD kommt kommentarlos? Dann ist es ein Frame Lag. Der Compiler landet anscheinend aus irgendeinem Grund in einer Endlosschleife, obwohl das eigentlich nicht sein kann. Muss ich mir genauer ansehen, wenn ich Zugriff auf ein CS habe. Normalerweise sollte das so funktionieren.

der set-Befehl kann es eigentlich nicht sein. Er akzeptiert sogar lokale Variablen der NPC, wenn diese eindeutig sind, also würde:

set TeleportPC to 1

ebenfalls funktionieren. Das es grundsätzlich so geht, weiß ich, da ich das schon sehr oft selbst benutzt habe. Ich habe allerdings noch nie einen Teleport damit ausgelöst bzw. direkt danach Goodbye gesetzt. Es kann also ein Zwischenschritt erforderlich sein, da sonst der Dialog vielleicht in einer Endlosschleife landet, was einen Absturz auslöst.

Ohne CS kann ich das leider nicht selbst testen. Ich bin unterwegs und auf meinem Notebook ist kein MW installiert.
 
  • Like
Reaktionen: VDMap
Das mit dem Teleport-Start im Dialog kannst Du aber in den Tribunal-Scripts für den Teleport nach Gramfeste & zurück ansehen,
glaub NPCs "Asciene Rane" & "Effe-Tei" sind da zuständig.
 
  • Like
Reaktionen: VDMap
danke rene, klappt perfekt :D...

hab da noch ne frage:
der player wird da nich teleportiert sondern ein npc..., wenn ich dann aus menü raus geh teleportiert er..., so weit so chick.., kann man da vllt noch nen cast von den npc einbauen? is halt nur fürs visuelle...., vllt son mark oder recall? hab es schon probiert, aber die noobness kam wieder durch..pff :lol:


hab da noch 2 andere fragen...,
ich hab mir ein paar nifs von animated morrowind gekrallt ;).., aber wenn ich jetze eine cell betrete wo nen NPC der ne neue animation hat drin is, bekomm ich immer ne fehlermeldung "no animation group"..., der npc hat aber die animationen und läuft auch alles..., wie bekomm ich nun diese meldung weg?

hab auchn paar von cait's fischen in der map..., da hab ich das prob das die fische immer aus den wasser rausschwimmen wollen (is nurn kleiner teich), obwohl aiwander auf 0 steht, sieht halt bissel komisch aus..., wenn die sich immer am ufer hoch schlängeln und dann gehts halt weiter auf dem terrain....hehe
was kann ich da machen?


mille grazie
 
keine idee?

und es geht weiter...:roll:

ich hab mir sowas wie ne selbstschussanlage aussn editor marker gebastelt.., funktioniert!
wie kann ich es machen das er nicht ganz am anfang da ist? er soll durch ein tagebuch eintrag aktiviert werden...

Code:
begin _vdm_xxx

short state
float timer


if ( GetJournalIndex "_vdm_xxx" < 27 )
if ( GetDisabled == 0 )
disable
endif
elseif ( GetJournalIndex "_vdm_xxx" >= 27 )
if ( GetDisabled == 1 )
enable
endif
endif




if ( state == 0 )
if ( GetDistance, Player <= 512 )
Cast "_vdm_fireball" Player
set state to 1
endif
endif


if ( state == 1 )
set timer to timer + GetSecondsPassed
if ( timer >= 2 )
set timer to 0
set state to 0
endif
endif


end

ich hab es so probiert, geht leider nicht...was is da nich in ordnung?
mir ist auch aufgefallen das ich die activators nich disablen kann.., ich meine jetze die von der selbstschussanlage, in dem fall hab ich
Code:
if ( OnDeath == 1 )
benutzt.., da werden auch noch ein paar andere sachen disabled..., forcefield, lights usw...die funktionieren alle,..was is da nu schon wieder nich richtig?

danke erstma :)
 
  • Like
Reaktionen: 1 Person
im ersten block deines scripts musst Du ihn rauswerfen solange nichts passieren soll, füge "return" ein, etwa so:
Code:
begin _vdm_xxxS

float timer

if ( menuMode )
  RETURN
endif

if ( GetJournalIndex "_vdm_xxxJ" < 27 )
  if ( GetDisabled == 0 ) 
    disable 
  endif 
   
  RETURN 

endif

if ( GetDisabled ) 
  enable 
endif

if ( timer > 0 )
  Set timer to ( timer - GetSecondsPassed )
else
  if ( GetDistance, Player <= 512 )
    cast "_vdm_fireball" Player
; fire again in 1.5 sec
    set timer to 1.5
  else
; check again in 0.5 sec
    set timer to 0.5
  endif
endif

end

ausserdem return während menus offen sind ( meuMode ) sonst wird der Spieler totgeballert während er ins Inventar geht denn der timer liefe weiter.
Return heisst nichts anderes als das script an dieser Stelle zu verlassen.

Mir ist aufgefallen das journal und scriptname bei Dir identisch sind... sowas sollte man nicht machen. Damit man sowas voneinander unterscheiden kann und sofort weiss was gemeint ist sollte man sich angewöhnen z.b. immer sowas wie
_j für journal und _s für script anzuhängen, (_act, _cr, _npc...) - manche Leute nehmen auch nur 'nen angehängten Grossbuchstaben.
 
Zuletzt bearbeitet:
scriptname und journal hab ich nur für den post angepasst...:-D
und warum lassen die activatoren sich nich disablen? sind persist und auch nur einmal im game..
muss man da noch auf was bestimmtes achten? wie gesagt/geschrieben die anderen activatoren lassen sich disablen...

noch eine andre frage: kann ich das script auch für die anderen sachen zum enablen benutzen...?
Code:
[COLOR=#000000]if ( menuMode )[/COLOR]
  RETURN
endif
if ( GetJournalIndex "_vdm_xxxJ" < 27 )  
if ( GetDisabled == 0 )     
disable   
endif      
RETURN  
[COLOR=#000000]endif[/COLOR]

das müsste ja reichen, oder?

danke
 
Zuletzt bearbeitet:
Na das musst Du dann mit ins Script schreiben- die stellen sich ja jetzt automatisch an wenn ein bestimmter Tagebucheintrag überschritten ist.

Mach noch einen Tagebucheintrag wenn die Dinger wieder verschwinden sollen , ich geb dem mal die nummer "321" und ändere das erste Stück vom Script um:
Code:
begin _vdm_xxxS

float timer

if ( menuMode )
  return
endif

if ( GetJournalIndex "_vdm_xxxJ" < 27 )
  if ( GetDisabled == 0 ) 
    disable 
  endif 
  return

; [einfügen]  
elseif ( GetJounalIndex "_vdm_xxxJ" >= 321 )
  if ( GetDisabled == 0 )
    disable
  endif
  return
; [/einfügen]

endif

if ( GetDisabled ) 
  enable 
; zwischen journal 27 und 321 wird hier eingeschaltet
; und alles andere schaltet sich oben ab
endif

; end xxxx

if ( timer > 0 ...usw.

um die scripts zum enablen/disablen von anderen objekten zu nehmen lass nur das timer-bezogene Zeugs weg.
Also da wo "; end xxxx" steht wäre das "end" für das "kleine Script" und "float timer" kannst Du oben dann auch rauswerfen.

Nicht durcheinanderkommen ich hab jetzt mehrere Informationen ins selbe Script gepackt ;)
 
Zuletzt bearbeitet:
  • Like
Reaktionen: VDMap
hey, kann man es auch ohne tagebuch eintrag machen? disablen mein ich natürlich....

enablen funzt schon ma :D danke
 
theoretisch ja, aber dazu benötigst Du was globales anderes anstelle des Tagebuchs (welches ja schon global verfügbar ist).
Wenn du mehrere Objekte disablen willst brauchst Du entweder jedes einzelne Objekt mit ner eigenen ID und als persistent markiert. Dann kannst Du es von überallher mit
meinObjektID->Enable
einschalten oder
meinObjektID->Disable
wieder ausschalten.

Wenn mehrere Objekte des gleichen Typs mit gleicher ID vorhanden sind geht das aber nicht. Da kommst Du um ein Script nicht herum wenn es keine Kreatur/kein NPC ist den man ansprechen kann. Bei solchen kann man es im Dialog-Result veranlassen das z.B. ein Script gestartet wird welches den Sprecher disabled.
Theorethisch auch denkbar, aber die schlechteste Lösung, eine globale Variable zu nehmen an der sich alle Objekte orientieren - dann nimm lieber ein Tagebuch welches sowieso schon besteht - denn ein Script an jedem Objekt würde trotzdem benötigt.

Die Lösung mit einem persistenten Objekt welches ein Script trägt erlaubt einen weiteren Weg.
Angenommen ein NPC mit der ID "abcmann" trägt dieses Script:

Code:
Begin versteckenS

short versteckDich

if ( menumode )
  return
endif

if ( versteckDich )
  if ( GetDisabled == 0 )
    Disable
  endif
else
  if ( GetDisabled )
    enable
  endif
endif

End
Der abcmann muss als persistent markiert sein, dann kannst Du von neahezu überall her (Script/Dialog/Console etc) den Befehl geben
Code:
set "abcmann".VersteckDich to 1
dann wird abcmann sich verstecken.
Code:
set "abcmann".VersteckDich to 0
und er taucht wieder auf , etwas umständlich - hier würde ein simples:
Code:
"abcmann"->Disable

ausreichen für den selben Effekt, dennoch zeigt das Beispiel wie man eigene lokale variable in einem Script (short VersteckDich) von aussen benutzen kann.
Wäre der NPC nicht persistent markiert und würde dieses Script tragen dann könnte ein Result im Dialog
Code:
set VersteckDich to 1
direkt an den Sprecher gesandt werden und er würde sich disablen sobald der dialog schliesst. Mit wieder enablen wäre aber Essig in diesem Fall ;)
 
Zuletzt bearbeitet:
kannst du mir das kurz noch erklären mit der globale...?
ich weiß wie man eine globale erstellt, aber die scripte usw...sind das problem ;)

genau...die objekte haben alle ne eigene ID und sind persist. das problem is ja nur das die von anfang an im spiel sind...., durch das script von dir jetzt bei journal entry 27...., was auch passt, aber eigentlich wollte ich die ganzen sachen mit den
Code:
[COLOR=#000000]if ( OnDeath == 1 )
[/COLOR]PlaySound, "Heart"
"_vdm_forcefield_01"->Disable
"_vdm_tomb_light_01"->Disable
"_vdm_forcefield_02"->Disable  etc....
befehl disablen...., was auch passen würde, weil auch kein neuer journal entry vorgesehn war, und wenn wäre es journal entry 28.., würde dann < 27 und = 28 funktionieren?

oder kann man das script so modifizieren das es nur zum enablen benutzt wird.., ab journal entry 27 enable und davor disable..., und es bleibt enabled bis ich es via ( OnDeath == 1 ) von NPC xy wieder disable?

Code:
[COLOR=#000000]begin _vdm_xxxS[/COLOR]

float timer

if ( menuMode )  
RETURN
endif
if ( GetJournalIndex "_vdm_xxxJ" < 27 )  
if ( GetDisabled == 0 )     
disable   
endif      
RETURN 
endif
if ( GetDisabled )   
enable 
endif
if ( timer > 0 )  Set timer to ( timer - GetSecondsPassed )else  
if ( GetDistance, Player <= 512 )    
cast "_vdm_fireball" Player   
set timer to 1.5  
else
set timer to 0.5  
endif
endif 
[COLOR=#000000]end[/COLOR]
eigentlich müsste das doch mit den script gehn, oder kann ich nur mit journal entry disablen, wenn ich es zum enablen benutzt hab?

is es ein problem 8 lights und diverse aktivatoren zu enablen/disablen, oder is das to much für die engine?

ty :oops:
 
d.h. ich muss nur das wieder aus den script löschen was ich einfügen sollte?
und dann kann ich die activators mit den If ( OnDeath ) einfach so disablen?

edit..
LOL :-D, nee geht natürlich nich.., weil er ja noch über 27 is, er disabled nur kurz und enabled gleich wieder..., das is ja das prob ich will NUR mit den tagebuch enablen und via If ( OnDeath ) disablen..., warum funzt das nicht?

ty
 
Zuletzt bearbeitet: