Construction Set Der Scriptthread

Dieses Thema im Forum "[MW] Plugins und Mods" wurde erstellt von The Nici, 25. April 2006.

  1. IvanDaVile

    IvanDaVile Abenteurer

    Code:
    if (OnActivate == 1)
    if (GetLevel < 5 )
    MessageBox "Ihr seid nicht würdig, diese Ausrüstung zu tragen."
    endif
    endif
    einfach am Anfang des zweiten einfügen ( nach begin drachenbogen_A_AirForge_sheathe)
    sollte das nicht Player->GetLevel heißen?
     
  2. Houdini

    Houdini Reisender

    Also der Script mit denn Level funktioniert einwandfrei, des wegen kann ich dir es leider nicht sagen ob es doch so sein muss.

    Also ich soll es so machen?

    Code:
    begin drachenbogen_A_AirForge_sheathe
    
    if (OnActivate == 1)
      if (GetLevel < 5 )
        MessageBox "Ihr seid nicht würdig, diese Ausrüstung zu tragen."
      endif
    endif
    
    Short DoOnce
    
    If ( player->getitemcount "drachenbogen" ==0 )
        if ( player->getitemcount "1Elipsen" >=1 )
            player->removeitem "1Elipsen",1
    endif
                if ( player->getitemcount "2elipsen" >=1 )
                Player->removeitem "2elipsen", 1
    endif
    return
    endif
    
    
    If ( Player -> HasItemEquipped "drachenbogen" )
        If ( Player -> GetWeaponDrawn )
            If ( DoOnce == 0 )
                    player->removeitem "1Elipsen",1
                    player->additem "2elipsen", 1
                    player-> equip "2elipsen", 1
                    set DoOnce to 1
    endif
                elseif ( DoOnce == 1 )
                    player-> removeitem "2elipsen", 1
                    player->additem "1Elipsen", 1
                    player->equip "1Elipsen",1
                    set DoOnce to 0
            endif
        endif
    endif
    
    Float timer
    Short OnPCEquip
    Short arrowCount
    
    If ( MenuMode == 1 )
        Return
    Endif
    
    If ( OnPCEquip == 0 )
        return
    endif
    
    If (timer < .5)
        Set timer to (timer + GetSecondsPassed)
        return
    else
        Set timer to 0
    Endif
    
    Set arrowCount to ( player -> GetItemCount, "drachenpfeil" )
    
    If ( OnPCEquip == 1 )
    
        If ( arrowCount <= 0 )
            if ( player->getmagicka >= 8 )
                player->additem "drachenpfeil" 15
                player->Equip, "drachenpfeil" 15
                player->modcurrentmagicka -8
            endif
        else
            if ( player -> HasItemEquipped "drachenpfeil" )
                return
            endif
            player->Equip, "drachenpfeil" 15
        endif
    
    endif
    
    End  
     
  3. IvanDaVile

    IvanDaVile Abenteurer

    ja so ist es richtig. Es MUSS übrigens Player->GetLevel heißen, so wie es dasteht wird der Level des Bogens abgefragt und der ist 0, man könnte ihn also nie anlegen (ich habs ausprobiert).
    Es ist übrigens schöner (=übersichtlich) wenn man die Variable alle oben hinschreib. Natürlich ist das vollkommen egal für die Funktion, aber früher oder später erkennt man selbst, dass es sinn macht seine Programme in einem deutlih lesbaren Format zu schreiben.
     
    Houdini gefällt das.
  4. Houdini

    Houdini Reisender

    achso ich hab es bis jetzt so getestet ob es wirklich blocken tut wen man es versucht zu nehmen

    Also ich habe denn Script dann so stehen aber da fehlt etwas bzw da muss was verbessert werden:
    Begin 5ruestung_block_L5

    if (OnActivate == 1)
    if (Player->GetLevel < 5 )
    MessageBox "Ihr seid nicht würdig, diese Ausrüstung zu tragen."
    endif
    endif

    end

    Bei mir kommen dann 3 Fehlermeldungen:

    "Line 4 function refernce object "if" not found."
    "Line 4 function reference object "OnActivate" not found"
    und der hier "Syntax Error Line4. Miss mached parenthesis."

    Man das kann noch was werden, wen ich versuche das Script System zu verstehen... Kannst du mir Bitte denn Script neu schreiben?
     
    Zuletzt bearbeitet: 13. Juni 2010
  5. IvanDaVile

    IvanDaVile Abenteurer

    Code:
    if ( OnActivate )
    	if ( ( Player->GetLevel ) < 5 )
    		MessageBox "Ihr seid nicht würdig, diese Ausrüstung zu tragen."
    	else
    		Activate
    	endif
    endif
    OnActivate = Benutzen (mit Leertaste oder ins geöffnete Inventar ziehen wollen) 1, falls das passiert, 0 sonst
    GetLevel < 5 ist für das CS auch ein gültiger ausdruck, also wundert es sich über das davor
    Missmatched parenthesis = falsch gesetzte Klammer, weil Ausdruck nicht verstanden
    OnActivate stellt den Versuch aber nur fest und blockt den Zugriff, deswegen muss man nochmal mit Activate nachlegen (wenn die Bedingung zu aufheben erfüllt ist)
     
    Zuletzt bearbeitet: 14. Juni 2010
    Houdini gefällt das.
  6. Houdini

    Houdini Reisender

    Achso ich glaub ich hab es ein wenig kapiert
     
  7. Luke

    Luke Ehrbarer Bürger

    Ich komme zu euch, als bescheidener Bittsteller, mit einem Script, der einfach nicht funktionieren will :p

    Der Script sollte auf eine Tür und folgendes bewirken:
    Versucht der Spieler die Tür zu aktivieren ploppt eine MessageBox auf, deren Text ein Item anbietet. Es bleibt nichts anderes übrig als "Item nehmen" zu klicken, daraufhin bekommt man es auch.
    Bei erneutem Aktivieren soll nichts passieren und eine weitere MessageBox à la "Nun verschwinde endlich" kommen (An der zweiten Box hab ich mich noch nicht versucht. Es klappt ja nichtmal die abgespeckte Version).

    Dank meines grenzenlosen Optimismus hab ichs natürlich erstmal selbst versucht:
    Code:
    begin meinsuperscript
    
    short state
    
    	if (  OnActivate  == 1  )
    		if ( state == 0  )
    
    			MessageBox, "Willst das Item?", "Item nehmen"
    			player-> additem, "Item" 1
    			set state to 1
    
    		endif
    	endif
    
    end
    Klappt leider nicht. Also, wo ist der Fehler versteckt?
    Danke im Vorraus
     
    Zuletzt bearbeitet: 14. Juni 2010
  8. £exa

    £exa Freund des Hauses

    Versuch's mal damit:
    Code:
    begin meinsuperscript
    short state
    
    IF ( OnActivate == 0 )
     IF ( state < 1 )
      return
     EndIF
    EndIF
    
    IF ( state == -1 )
     MessageBox, "Verzieh Dich endlich!"
     return
    EndIF
    
    IF ( state == 0 )
     MessageBox "Eh Du... willst'n U haben?", "Das U nehmen."
     set state to 1
     return
    EndIF
    
    IF ( GetButtonPressed < 0 )
     return
    EndIF
    
    player->additem "UID" 1
    set state to -1
    
    end
     
    Luke gefällt das.
  9. IvanDaVile

    IvanDaVile Abenteurer

    Mist, ich war zu langsam, da ich aber auch grad eines gebaut habe:
    Code:
    begin meinsuperscript
    
    short state
    
    	if (  OnActivate  == 1  )
    		if ( state == 0  )
    			set state to 1
    			MessageBox, "Willst das Item?", "Item nehmen"
    		elseif ( state == 2 )
    			MessageBox, "Schlange??"
    		endif
    	endif
    
    	if ( state == 1 )
    		if ( GetButtonPressed == 0 )
    			player-> additem, "item" 1
    			set state to 2
    		endif
    	endif
    
    end
     
    Luke gefällt das.
  10. Luke

    Luke Ehrbarer Bürger

    Danke an beide
    £exas Script funktioniert ausgezeichnet, da hab ich Ivans garnicht mehr ausprobiert, tut mir Leid.
    Dennoch werd ich bei Bedarf seins modifizieren. Ist mir vom Denkansatz her klarer :p
     
  11. Luke

    Luke Ehrbarer Bürger

    Sooo, ich bins mal wieder mit einem Scriptproblem
    Nachdem mein eigener Versuch in einer mehr oder minder merkwürdigen Katastrophe geendet hat (Interior war weg, hallo?) trage ich meine Fragen wieder hierher.

    Diesmal sinds drei Scripte die im Zusammenhang zueinander stehn.

    1. Beim Aktivieren eines Activators soll das Tagebuch aktualisiert und der Wasserstand auf 15015 gesetzt werden.
    2. Beim in Script 1 erwähnten Tagebucheintrag soll ein Activator enabled werden.
    3. Beim in Script 1 erwähnten Tagebucheintrag soll ein Activator disabled werden.

    Über meine erbärmlichen Versuche, die Sache selbst zu lösen breiten wir lieber den Mantel des Schweigens.
    Danke im Voraus :)
     
  12. ercvomnil

    ercvomnil Vertrauter

    Aaalso, versuchs mal so:
    Code:
    begin MyScript
    
    float waterlevel
    float waterlift
    short direction
    
    in (menumode == 1 )
      return
    endif
    
    if ( onactivate == 1)
    
    set direction to 1
    
    set waterlift to 200 * GetSecondsPassed
    set waterlift to waterlift * direction
    ModWaterLevel waterlift
    
    
    set newwaterlevel to GetWaterLevel
    if  (  direction == 1 )
    	if  (  newwaterlevel >= 15015  )
    		SetWaterLevel 15015
    		set direction to 0
    	endif
    endif
    
    myActivator1 -> disable
    myActivator2 -> enable
    Journal "MyJournalID" X
    endif
    end
    So oder so ähnlich :)
    Das X mußt du natürlich durch die entsprechende zahl deines Eintrags ersetzen :)
    mfg erc

    Edit: Bevor ihr euch wundert: ich hab die Wasserteile aus dem Script aus Tribunal geklaut :) die sollten alos eigntlich klappen :D
     
    Luke gefällt das.
  13. Luke

    Luke Ehrbarer Bürger

    Danke für die Hilfe. Ich werds auch so schnell wie möglich testen, nur etwas bereitet mir Kopfschmerzen.
    Ist bei diesen Zeilen auch gewährleistet, dass die Activators, die enabled werden vorher disabled waren?
    Brauch ich da Sonderscripte für die betreffenden Activators?
    Macht es einen unterschied, ob ich nur einen Activator hab oder ganz viele mit der selben ID?
     
  14. Killfetzer

    Killfetzer Super-Moderator Mitarbeiter

    Einem Objekt ist es egal, wenn es mehrmals enabled oder disabled wird. In so fern egal.

    Das funktioniert nur für Objekte, die "Reference Persistent" sind. Diese Objekte dürfen also nur einmal vorkommen (und sie müssen einmal vorkommen!). Damit erübrigt sich wohl die Frage ;)

    Wenn du viele Gegenstände zu einem bestimmten Tagebucheintrag verändern willst, schreibst du einfach ein Script und legst es auf jeden betroffenen Gegenstand:

    Code:
    begin my_journal_disable_script
    
    short state
    
    if ( state == 0 )
      Disable
      set state to 1
    endif
    
    if ( state == 1 )
      if ( GetJournalIndex "testquest" == 100 )
        Enable
        set state to 2
      endif
    endif
    
    end
    
     
    Luke gefällt das.
  15. Luke

    Luke Ehrbarer Bürger

    okeydokey

    Hab die scripte ausprobiert, der von Erc hat leider nicht funktioniert.
    Ich hab mich stattdessen selbst nochmal drangewagt:
    Code:
    begin wasserscript
    
    short state
    
    if (  state == 0  )
    	if (  OnActivate == 1  )
    		Journal "tagebuch" X
    		setwaterlevel 15015
    		set state to 1
    	endif
    endif
    
    if (  state == 1  )
    	if (  OnActivate == 1  )
    		return		
    	endif
    endif
    
    end
    in Kombination mit Killfetzers Script hat alles so geklappt, wie es sollte. :)
    Danke!
     
  16. Luke

    Luke Ehrbarer Bürger

    Code:
    begin meinScript
    
    short state
    short seem
    
    if (  state == 0  )
    	if (  OnActivate == 1  )
    		if (  GetItemCount, "meinRing" <= 1  )
    			player-> removeItem, "meinRing" 1
    			playSound, "conjuration area"
    			Journal "meinEintrag" 80		
    			MessageBox, "Ring zum Aktivieren verwendet"
    			set state to 1
    		endif
    	endif
    endif
    
    if (  state == 0  )
    	if (  OnActivate == 1  )
    		if (  GetItemCount, "meinRing" == 0  )
    			if (  seem == 0  ) 
    				Journal "meinEintrag" 70	
    			        MessageBox, "Es klappt nicht."
    				set seem to 1
    			endif
    			playsound, "Gate Large Locked"			
    		endif
    	endif
    endif
    
    if (  state == 1  )
    	if (  OnActivate == 1  )
    		return		
    	endif
    endif
    
    end
    Okay, diesmal hab ich wirklich alles versucht :roll:
    Den Script da oben hatte ich schon in Zich anderen Versionen (auch einmal alles brav ineinandergeschachtelt mit "elseifs" und wasweißichnochalles)

    Der Script liegt auf einem Activator und soll bei Aktivierung folgendes tun:
    Besitzt der Spieler "meinRing" soll der Tagebucheintrag "meinEintrag" 80 kommen. Zudem soll "meinRing" aus dem Inventar entfernt werden, eine MessageBox kommen und ein Sound abgespielt werden.
    Sollte der Spieler "meinRing" nicht besitzen kommt ein anderer Tagebucheintrag ("meinEintrag" 70) und eine andere MessageBox .
    Der Tagebucheintrag 70 soll aber nur einmal kommen, weil ich es unschön find, wenn jedes Mal die Meldung kommt, das Tagebuch sei aktualisiert worden, obwohls nicht stimmt. :?

    Bei meinen Versuchen, die Sache selbst zu machen ist bisher immer nur eine der beiden Opionen gekommen, unabhängig davon, ob man "meinRing" hat oder nicht.
    Wo ist der Fehler?
    Danke schonmal.
     
  17. Killfetzer

    Killfetzer Super-Moderator Mitarbeiter

    Ich gehe mal nicht von deinem Script aus. Dieses hier liefert dir die gewünschten Effekte:

    Code:
    begin my_toractivate_script
    
    if ( OnActivate == 1 )
      if (Player->GetItemCount "mein Ring" >= 1 )
        Player-> removeItem, "meinRing" 1
        PlaySound "conjuration area"
        Journal "meinEintrag" 80		
        MessageBox, "Ring zum Aktivieren verwendet"
      else
        if ( GetJournalIndex "meinEintrag" < 70 )
          Journal "meinEintrag" 70
        endif
        MessageBox, "Es klappt nicht."
        PlaySound "Gate Large Locked"
      endif
    endif
    
    end
    
    PS: Nenn deine Objekte etwas spezieller, sonst hast du Kompatiblitätsprobleme mit vielen anderen Mods.
    Mein Tipp hierzu: Füge vor jedes Item dein Kürzel davor und danach ein Kürzel für die Mod (zB meine Mod Geisterlaterne hat vor allen Objekten kf_gl_ stehen).
     
    Luke gefällt das.
  18. Luke

    Luke Ehrbarer Bürger

    Sicher, meine IDs sind nicht SO allgemein^^
    Die eigentliche ID des Ringes ist "Luke_mdx_gatering"
    Ich mach nur solche Dummy-IDs in diesem Thread, weil es a) kürzer und b) "anonymer" ist.
    Auch die Inhalte von MessageBoces sind für den Scriptthread meist drastisch gekürzt. ;)

    Script getestet und als funktionstüchtig befunden. Herzlichen Dank
     
  19. Dax`ta

    Dax`ta Reisender

    Hallo ihr lieben ;)

    So auch ich habe eine Scriptanfrage an euch

    Folgende Situation:
    Der Spieler soll dreimal gewarnt werden, eher er angegriffen wird, wenn er mit einer gezogenen Waffe erwischt wird. Das ganze soll nur von einer gewissen Fraktion ausgeführt werden.

    Was ist zu beachten und was muss ich dabei einhalten ;)

    Danke an euch im Voraus.
     
  20. £exa

    £exa Freund des Hauses

    Das kann recht simpel sein - oder sehr komplex weren. Es hängt davon ab, was du dir vorstellst. Wie genau soll das mit der Warnung ablaufen? Mach mal ein paar detailliertere Angaben zu deinen Vorstellungen:

    Soll es ein erzwungenes Ansprechen des Spielers geben oder n ur eine verbale Reaktion des NPCs bzw. eine MessageBox?

    Soll es passieren, sobald man die Waffe in der Sichtweite eines Angehörigen der Fraktion zieht oder sich mit gezogener Waffe irgendeiner NPC nähert?

    Muß man Unsichtbarkeit, Schleichen oder Chamäleonzauber berücksichtigen?

    Soll es immer so sein oder abhängig von der Entfernung, ob gewarnt wird.

    Können theoretisch mehrere Angehörige der Fraktion am gleichen Ort sein?

    Soll es eine Rolle spielen, ob der Spieler vorher angegriffen wurde?

    Zählen Zauber auch als gezogene Waffe?

    Was soll passieren, wenn man mehr als drei Mal erwischt wurde...


    Solche Fragen sollten geklärt sein, bevor man überhaupt anfängt, dazu etwas zu programmieren. Einiges davon ist recht trivial, anderes erfordert ordentlich Aufwand.
     
    Dax`ta gefällt das.
  21. Werbung (Nur für Gäste)
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden