Construction Set Der Scriptthread

HILFE bei eine(r) Script

Hi, ich brauche Hilfe bei einer Script, und zwar möchte ich für Morrowind eine Globalscript machen, die während einer quest läuft und die Quest "Leitet"
Das Problem: Die Quest, und somit der/die/das Script soll in mehreren Zellen laufen. Bei einer Zelle habe ich mit das Angeguckt, wie das bei dem Endkampf mit Dagoth Ur gemacht istg. Da steht irgendein Metalleimer, der alles regelt
:)lol:einer der vorzüge Oblivions sind Quest Scripts...)
Aber wenn das alles Regelnde Item nicht in der Zelle ist???, wie geht das dann??

@ Darkshade

Begin Scn

short press


if on Activate == 1
messagebox, "Kauft Süßes für 20 Draken?", "Ja", "Nein"
set press to getbuttonpressed
endif

if press == 0
if Player ->getitemcount Gold(bitte ID Nachgucken) >19
player -> additem Süßes
player -> removeitem Gold(bitte ID nachgucken) 20
endif
if player ->getitemcount Gold(bitte ID nachgucken) <20
messagebox, "Kein Geld"
endif
else
activate
endif
end

Müsste gehen, wenn nicht muss du mal jemand anderen Fragen...
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Darkshade
Ein GobalScript muss man bei Morrowind erst aktivieren. Einmal aktiviert läuft es solange, bis es wieder von einem Script oder so beendet wird.

Ein Beispiel:
Der Spieler erhält bei Questbeginn ein Buch, aus dem er Infos sammeln soll -->Ergebnis: Spieler liest das Buch --->Bekommt einen Tagebucheintrag und es wird das GlobalScript gestartet. Am Ende der Quest kann das Ding ja dann beendet werden ;)

Hier noch die Script-Befehle:
StartScript, "name des GlobalScript" ; BEginn

StopScript, "name des GlobalScript" ;Ende

Um das Script erfolgreich beim Lesen eines Buches zu starten, musst du mal in Killfetzers Scriptbefehls-Liste im Tutorialbereich von morrowind hier auf Scharesoft nachschauen ;) ((steht mit ganz unten ))


EDIT: Ok, sorry; Lexa hats richtig :D

MfG
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Unbekannter
Nabend!

Als absoluter Scriptanfänger brauch ich 2 Scripts:

-1. Eins, das den Spieler bei anlegen eines Gegenstandes dahin teleportiert, wo ich will (in die Spielerbude)

-2. Und eins, das dem Spieler sagt, er braucht einen bestimmten Gegenstand um weiterzukommen (das kommt dann auf eine Tür).
 
Danke dPüm. Kennt evtl. jemand noch ein Script, mit dem der Spieler bei jedem aktivieren einen bestimmten Gegenstand (Schlüssel) braucht um durch eine Tür zu kommen. Wenn der Spieler den Schlüssel nicht im Inventar hat, soll eine Nachricht erscheinen, dass man einen Schlüssel braucht, um durchzukommen (man soll es auch nicht aufcheaten können).


MfG Amrazul
 
Sorry, aber ich glaube kaum, dass es einen BEfehl gibt, der alles abfragt, was der Spieler berührt :?
Außerdem lässt sich alles cheaten, ich weiß es nicht genau, aber ich versuche mal, es uncheatbar zu machen :D
Code:
Begin script

If ( OnActivate == 1 )
      If ( player -> GetItemCount, "KEy-ID" > 0 )
           Activate
else
            lock 0
            return
       endif
endif

End
 
Zuletzt bearbeitet:
Das meinte ich nich, da hast du mich falsch verstanden. Ich wollte ein script auf eine Tür legen, das sie nur zu öffnen ist, wenn man bei jedem aktivieren dieser Tür einen Schlüssel benötigt. Wenn man diesen Schlüssel nicht hat, soll eine Nachricht erscheinen in der Steht, das man einen Schlüssel benötigt.


MfG Amrazul
 
Oh, da habe ich die Nachricht vergessen...
Dieses Script muss auf die Tür. ;)
Code:
Begin script

short doonce

If ( OnActivate == 1 )
      If ( player -> GetItemCount, "KEy-ID" > 0 )
           Activate
else
             lock 0
            set doonce to 1
       endif
endif

If ( doonce == 1 )
      MessageBox "Nachricht"
      return
endif

End
 
  • Like
Reaktionen: Amrazul
Ich suche noch ein Script, dass, auf einen Ring gelegt, beim Anziehen dieses Rings ein Fenster einblendet, in dem man zwischen den Zaubern "Markieren", "Rückkehr", "göttl. Eingriff" & "Almwiese Intervention" sowie einer Schaltfläche zum Abbruch wählen kann. Nach der Wahl wird der entsprechende Zauber dann gesprochen/gewirkt. Die Zauber gibt's zwar auch so, aber ich bin in Mystik und Manamenge dermaßen schlecht...^^
 
Code:
Begin Script

short doonce

If ( OnActivate == 1 )
      If ( player -> GetItemCount, "KEy-ID" > 0 )
           Activate
      Else
             lock 0
            set doonce to 1
      endif
endif

If ( doonce == 1 )
      MessageBox "Nachricht"
      return
endif

End
Ähm... dann kommt die Meldung aber endlos nach dem Anklicken der Tür, wenn man einmal den Schlüssel nicht dabei hatte - lieber so:

Code:
Begin NeedKeyScript_SC

If ( OnActivate == 0 )
 return
EndIF

If ( ( player->GetItemCount "KEY-ID" ) == 0 )
  MessageBox "Ohne passenden Schlüssel läßt sich diese Tür nicht öffnen."
  return
EndIF

Activate

End
Das sollte funktionieren :)
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Amrazul
Variabelen

Ist es eigentlich egal, wie man die nennt. Ich nenn sie immer a,b,c,d etc.
(Oft funktionieren die Scripts nicht) kann das daran liegen. Gibt es sowas wie eine Richtlinie (nicht Scripttechnisch, sondern, damit andere es verstehen, weil hier nennen alle die Varieabelen Once, DOOnce, Button, Time etc.
 
Ist es eigentlich egal, wie man die nennt. Ich nenn sie immer a,b,c,d etc.
(Oft funktionieren die Scripts nicht) kann das daran liegen. Gibt es sowas wie eine Richtlinie (nicht Scripttechnisch, sondern, damit andere es verstehen, weil hier nennen alle die Varieabelen Once, DOOnce, Button, Time etc.
Nein, es ist nicht egal... jedenfalls nicht völlig. Es gibt drei Arten von "Variablen" in Morrowind:

Local, Global und Hardcoded

Local Variables
Hierunter versteht man solche, die direkt innerhalb des Script (i.e. am Anfang) explizit deklariert werden, zum Beispiel so:

short doonce
float timer

Diese Variablen werden nur innerhalb des Scripts verwandt und sind auch nur innerhalb desselben verfügbar... außer wenn das Script an ein persistentes Objekt gebunden wird, dann kann man sie über dieses addressieren, und zwar zum Beispiel so:

Code:
IF ( ACTIVATORID.doonce == 1)
 do something here
ENDIF
Gleiches gilt für Scripts, die auf NPCs mit eindeutiger ID liegen. Auch hier kann man sie über die ID der NPC abfragen. Es ist also kein Problem, wenn zwei Scripts gleichnamige lokale Variablen verwenden, da diese sich nicht beeinflussen...

Global Variables
Diese werden NICHT innerhalb von Scripts deklariert, sondern über ein spezielles Menu, wo man ihren Typ (short, float, etc.) einstellen kann und auch den Wert, mit dem sie vorbelegt werden. Globale Variablen sind in der Tat global, dass heißt man kann sie nach der Erstellung in jedem Script und auch in Dialogen verwenden und abfragen, ohne sie indirekt ansprechen zu müssen. Hier liegt ein riesiges Potential für Inkompatibilitäten... warum?

Nun, wenn es eine Globale Variable gibt und irgendein Script würde eine lokale Variable gleichen Namens verwenden, kann das nicht funktionieren, da der Code Interpreter nicht mehr wissen kann, welche Variable bei einer Abfrage gemeint ist... -> Bug/Crash

Noch ätzender wird es, wenn zwei Plugins die gleiche Globale Variable nutzen, will sagen eine Global deklarieren, die den gleichen Namen hat. Da kommt es dann zu üblen Überschneidungen und Scripts/Dialoge die eben diese Variable brauchen, laufen ggf. Amok und machen Sachen, die sie nicht sollen.

Daher sollte man beim Verwenden globaler Variablen genau wissen, was man macht und ihnen einen unverwechselbaren, eindeutigen Namen mit auf den Weg geben, um das Risiko von Bugs zu minimieren. Eindeutige Namen sind sowieso immer anzuraten, auch für lokale Variablen... a, b und c sind zwar toll und schön kurz... aber es ist dann auch verdammt schwer, etwas längere Scripts mit solchen Dingern noch zu lesen.

Hardcoded
Das sind im Grunde genommen Rückgabe-Werte von Funktionen... zum Beispiel OnActivate oder OnPCEquip... wenn man nun eigene Variablen mit solchen Namen benutzen will, wird man schnell sehen, was man davon hat :-D


Was nun das Funktionieren von Scripts angeht... jedes Script ist nur so gut, wie der Programmierer, der es geschrieben hat - ergo, wenn das Script nicht funktioniert, hast du einen Fehler gemacht. Das ist aber ganz normal, da ich keinen Scripter kenne, der beim Coden nie Fehler macht und dessen Scripts immer sofort genau das machen, was sie sollen :D

Was die Variablen angeht, beherzige meinen Rat da oben... eindeutige Namen für die Variablen anlegen! Das hilft einerseits Bugs zu vermeiden, verbessert die Übersichtlichkeit und erleichtert es anderen Moddern, deinen Code zu verstehen, wenn sie ihn analysieren sollen/wollen, um festzustellen, wo es genau hakt...
 
Zuletzt bearbeitet:
Problem mit ForceGreeting in verschiedenen Zellen

Die Überschrift sagt es eigentlich schon; ich möchte eine Kreatur durch aussprechen eines Zaubers zwingen mich anzusprechen, auch wenn der Player sich in einer anderen Zelle auf hält.

Es geht um eine Möglichkeit, eine Art "Truhe" analog der "Überalltruhe" für Oblivion zuschaffen, wo man jederzeit Items abladen kann; das ganze habe ich mir so gedacht

Code:
begin Traeger_creature

short companion
short TragStatus

set companion to 1



if ( TragStatus >= 10 )  
   if ( player->getspelleffects traegerruf == 0 )
      if ( TragStatus == 10 )
         set TragStatus to 1
      else
         set TragStatus to 0
      endif
   endif
   return
elseif ( TragStatus == 0 )
   if ( player->getspelleffects traegerruf == 1 )
    Traeger->forceGreeting "player" 
     set TragStatus to 10
   endif
elseif ( TragStatus == 1 )
   if ( player->getspelleffects traegerruf == 1 )
      set TragStatus to 11
   endif
endif


end

Dieses Skript hängt an einer Kreatur mit der ID Traeger, die in einer Intorior-Zelle untergebracht ist. Es funktioniert auch solange, wie ich mich in der selben Zelle aufhalte, aber sobald ich die Zelle verlasse, passiert nichts mehr, gibt es eine Möglichkeit, von Überall auf die Kreatur zuzugreifen?
 
Dieses Skript hängt an einer Kreatur mit der ID Traeger, die in einer Intorior-Zelle untergebracht ist. Es funktioniert auch solange, wie ich mich in der selben Zelle aufhalte, aber sobald ich die Zelle verlasse, passiert nichts mehr, gibt es eine Möglichkeit, von Überall auf die Kreatur zuzugreifen?
Nein. Greeting funktioniert nur in AI-Reichweite, also wenn die NPC geladen (=> in der selben Zelle) und aktiv ist.

Folgenden Workaround könnte ich mir denken:

Du machst die Kreatur (also ihre Mesh) winzig klein, unsichtbar, collision-free, superschnell und verpaßt ihr einen Sanctuary 10000 Effect. Dadurch sollte sie in Kämpfen keinen Einfluß haben - fliegen muß sie dann natürlich können ;)

Dann platzierst du sie per Script beim Spieler und setzt sie auf AIFollow... nun sollte sie dem Spieler folgen, wohin auch immer er geht, damit umgehst einige Probleme - aber leider nicht alle. Wenn der Spieler sich teleportiert oder per Script irgendwo anders hinbeamt (z.B. durch das Mazed Band), wird die Kreatur natürlich "abgehängt". Das kann man ggf. dadurch umgehen, dass man an diversen strategischen Punkten in der Welt "Sensoren" installiert... damit sind spezielle unsichtbare Aktivatoren gemeint, welche die "verlorene" Kreatur zu sich teleportieren (und damit in die aktive Zelle holen), wodurch sie wieder verfügbar wird. Bei allen Tempel/Schrein/Prison-Markern würd ich das schon mal machen, und dann halt noch an diversen anderen Punkten, die man im Spiel wohl öfters passiert.

Ansonsten... wohl nur mit 'nem Script Extender.
 
  • Like
Reaktionen: dark_ossi
so etwas hatte ich schon befürchtet, allerdings habe auch 2 Mods gesehen, wo ähnliches Probiert wird:
Großer Sack von Reneminer und
Magischer Zirkel von Killfetzter

in beiden Fällen wird allerdings ein Item eingefügt, welches das Greeting bei der Kreatur auslößt. Beim Magischen Zirkel hat dies auch eine Zeitlang funktioniert, dann aber auf einmal nichtmehr, wodurch ich überhaupt auf die Idee gekommen bin, mich selbst an dem Problem zu Versuchen.
 
Nein. Greeting funktioniert nur in AI-Reichweite, also wenn die NPC geladen (=> in der selben Zelle) und aktiv ist.

Äh, nein. Es reicht, wenn der Greeting Befehl zum erstenmal in der selben Zelle ausgeführt wurde, dann müsste es eigentlich gehen. Jedenfalls hat es bei mir geklappt ;)


@Dark ossi: ich weiß es net genau, aber verscuhs mal mit Traeger->ForceGreeting und nicht Traeger->forceGreeting "player"
davon abgesehen bin ich mir noch weniger sucher, aber wenn das script auf der kreatur liegt, reicht eigentlich ein ForceGreeting... :?
 
@Dark ossi: ich weiß es net genau, aber verscuhs mal mit Traeger->ForceGreeting und nicht Traeger->forceGreeting "player"
davon abgesehen bin ich mir noch weniger sucher, aber wenn das script auf der kreatur liegt, reicht eigentlich ein ForceGreeting... :?
Objektbezogene Scripts werden aber nur ausgeführt, wenn das Objekt in der aktiven Zelle ist. Permanent laufen werden nur Global Scripts und spätestens wenn die Cell aus dem Load Cache fliegt, dürfte das Thema Greeting eigentlich auch erledigt sein. Ich laß mich aber auch gern vom Gegenteil überzeugen - selbst testen kann ich es leider momentan nicht.
 
Hallo Leute!
Hat einer eine Idee für ein Script, das dafür sorgt, dass ein Händler nur Gegenstände, die teurer als z.B. 10000 Draken sind, kauft?
 
Moin Moin!

Ich möchte einen Activator erstellen, der bei Aktivierung eine bestimmte Menge Gegenstände ins Inventar fügt. Kennt jemand das passende Script dafür?



Greets, Amrazul