NewRaven.net - Forum

Zum einen gibt es die Seite von ElBundee (M. Kath) nicht mehr - und somit auch nicht seine kommentierten Scriptbeispiele.
Zum anderen beantworten wir (die Leute dieses Forums-und da besonders Rene) auch in anderen Foren viele Fragen und geben Hinweise, die eigentlich zusammengestellt gehören und da zur Anschauung und Hilfe vielleicht eine Menge Fragen vermeiden helfen.
Deshalb soll hier eine kleine Übersicht entstehen, die über unten stehende Liste schnell zu bedienen sein soll.

Ich bitte potentielle Poster eine kleine Überschrift über ihren Beitrag zu setzen, die man als Stichwort/Suchwort verwenden kann.

Ich werde mich auch bemühen, diese Liste aktuell zu halten ;)
In diesem Thema keine Diskussion bitte.

Zur Beachtung: Sachen, die anders funktionieren

Beiträge:

Geschlecht des PC bestimmen
Interiorabfrage für PC
Zeitsteuerung (tageszeitabhängig)
Abfrage, Erlaubnis einen Raum zu betreten
Abfrage, ob Zellenwechsel stattgefunden hat oder nicht

GetAngle/SetAngle short: Raumwinkel ermitteln/setzen

Trigger Positions-/Geraden-/Raumbereich: Aktions-Punkt/-Linie/-Bereich
AddTopic Topiceintrag: Topic einem PC zuweisen - besser mit Greeting
Abl(g)eben - Entfernen von Gegenständen im Todesfall
Teleportscript z.B. für Ring/Amulett
OnPCEquip + Alchemy/Ingredients
enable/disable
Das Geschlecht des Spielers bestimmen und später darauf verschiedene Entscheidungen treffen:

1. Globale Variable deklarieren, z.B. what_is_pc
2. Ein Greeting erstellen, welches erzwungen wird (Forcegreeting), z.B.
2a. "Hallo meine Liebe!" - bei Speaker Condition:
     Funktion/Variable
     Function PCSex = 1
     Result
     set what_is_pc to 1
2b. "Hallo meine Lieber!" - bei Speaker Condition:
     Funktion/Variable
     Function PCSex = 0
     Result
     set what_is_pc to 2

Somit kannst man in jedem Script (im Dialog hast man ja die Funktion) die Variable what_is_pc abfragen und entsprechend entscheiden. In dem Fall bei 1 für die Damen, bei what_is_pc = 2 für die Herren. Bei 0 hat das Greeting halt irgendwie nicht geklappt.
Ich habe eine universelle Globale Short eingesetzt. für Dialoge nützlich

global short PCInterior -
sie zeigt an ob der Spieler(!) im Interior ist.

Damit sie immer stimmt kann sie bei Bedarf per
set PCInterior to Player-> GetInterior
gesetzt werden.
Dazu gibt es mehrere Möglichkeiten:
1. Dialog,
der Spieler spricht ein Topic an, der angesprochene NPC gibt Rückfrage "Soll ich A oder B machen?"
Im Result steht dann:

Choice "Mach mal A" 1 "Mach lieber B" 2
set PCInterior to Player-> GetInterior

in den Choices (darüber) kann nun darauf zurückgegriffen werden ob der Spieler drin (1) oder draussen (0) ist.

Diese Methode habe ich selbst nicht verwendet.

2. Falls der anzusprechende NPC - für den es wichtig wäre zu wissen ob er drin oder draussen ist - ein Script trägt welches möglicherweise sowieso auf OnActivate reagiert ( z.B. mit ForceGreeting um Taschendiebstahl "abzufangen" ) kann man vor dem Activate/ForceGreeting noch die benötigten Werte auffrischen.

Im Mietbegleiter-PlugIn ist diese Methode angewandt


global short PCInterior wird mit HlaBitter und dem SklavenUndPacktierPlugIn nach jedem Zellwechsel und nachdem ein Menu schliesst automatisch gesetzt.
Und zwar immer mit

set PCInterior to Player-> GetInterior

damit die Aussage auch stimmt ;)
Zeitsteuerung (tageszeitabhängig)

Eines der kürzesten (und funktionierenden) Skripte für die tageszeitabhängige Steuerung stammt von Rene (für Lichter bei Nacht).
Ich finde es sehr raffiniert ;)

PHP-Code:
Begin mm_lightscript 

if ( Cellchanged == 
    return 
endif 

if ( 
GameHour >= 
    if ( 
GameHour <= 18 
        
Disable 
        
Return 
    endif 
endif 

Enable 

End

Hier wird das Licht tagsüber ausgeschaltet. Durch die Abfrage des Cellwechsels werden unnötige Durchläufe des gesamten Scripts vermieden.

Hallo,

eines der Scripte, die ich am häufigsten benutz, Sehr gut, um Quests zu erstellen und um zu steuern, wann der PC einen Raum betreten darf.

Achtung, nur verwenden, wenn kein Zellwechsel dabei passiert

PHP-Code:
begin OD3_door_K_Rittercave

If ( MenuMode == )
    return
endif

If ( 
OnActivate == )
    if ( 
player->GetItemCount"OD3_key_K_Raubritter" == ); wenn der PC diesen Schlüssel nicht hatwird er die Tür nicht übverwinden können
        PlaySound 
"LockedDoor";Geräusch einer abgeschlossenen Tür
        messagebox 
"Hier wohnen Leute, die nicht wollen, dass jeder Dahergelaufene in den privaten Räumen umherläuft."
    
else
        
activate
        
endif
    endif
endif

end



Anmerkung von ReneMiner:
Dabei geht das Zellwechsel-Ereignis "verloren" und lässt sich nicht mehr registrieren. Genaueres dazu schreib ich mal unter einer anderen Rubrik, diesem Link folgen

Hi Runde!

Ohne überschaubare Referenz = permanente Neuerfindung der Vierkanträder. Und doch gibt es keine Rettungskopie von M. Kath's Zusammentragungen? Und die Genialidee hier will auch nicht so recht? Man kann es aufziehen analog zu den bekannten Class-Referenzen. Im CS stellen die Variablen die Schwerpunkte. Jede benötigt eine kurze Begriffsdefinition, die Gültigkeitsbeschreibung, die Syntax, ein Referenzbeispiel und als Kür das Verbundbeispiel. Was ich poste, kann/soll also hemmungslos ergänzt/korrigiert (sowieso werden.



Cellchanged bool: Zellenwechsel
Aufgabe: Abfrage, ob Zellenwechsel stattgefunden hat oder nicht.
Auslösung durch:
Wird abgefangen durch: Türen, die ein Script tragen, das auf OnActivate reagiert, Details.
Syntax:

Beispiel:
Code:
;unnötige Scriptdurchläufe vermeiden
if ( Cellchanged == 0 )
return
endif

GetAngle/SetAngle short: Raumwinkel ermitteln/setzen.
Aufgabe: Ermittelt/setzt einen der 3 Raumwinkel eines Objektes.
Nutzung: Objekte können via Script in den Raumwinkeln gedreht werden. Rampenschaltungen, Breite Felsen zwecks Durchlass drehen (Quests).

Ein beliebiges Mesh kann in der Rubrik Activator genutzt werden und durch einen Bewegungsscript z.B. die Funktionalität einer Tür erhalten. Die Aktionen können auf separate Schalter gelegt werden oder reagieren auf das OnActivate-Ereignis.

Objekte sollen eine eigene ID erhalten und gezielt über diese angesprochen werden.

Die benötigten Winkel können im Editor ermittelt und dann im Script eingetragen werden.

Syntax: <"ID" -> >[GetAngle][SetAngle] [X][Y][Z] [0-360]

Beispiel:
Code:
;Ofentür reagiert auf das OnActivate-Ereignis
if ( OnActivate )
if ( my_rangedoor -> GetAngle Z == 270 )
my_rangedoor -> SetAngle Z 0
return
elseif ( my_rangedoor -> GetAngle Z == 0 )
my_rangedoor -> SetAngle Z 270
endif
endif

Trigger Positions-/Geraden-/Raumbereich: Aktions-Punkt/-Linie/-Bereich
Aufgabe: Befindet sich ein PC (Objekt) innerhalb/außerhalb eines Bereiches, kann darauf scriptseitig reagiert werden.
Syntax: [if][while] ( ID -> GetPos [X][Y][Z] [Vergleichsoperator] [Positionswert] )

Beispiel:
Code:
;Bei Objekt innerhalb des Bereiches eine Aktion oder (Beispiel) MessageBox auslösen.
short OneMessage ;MessageBox nur einmal erscheinen lassen

if ( Player -> GetPos X > 2434 )
if ( Player -> GetPos X < 2662 )
if ( Player -> GetPos Y > 3256 )
if ( Player -> GetPos Y < 3417 )
if ( OneMessage == 0 )
MessageBox "Ihr befindet Euch im Zielgebiet!"
set OneMessage to 1
endif
endif
endif
endif
endif

AddTopic Topiceintrag: Topic einem PC zuweisen
Nutzung: Dialog-Topic dem PC bekannt machen, die Anzeige der Topic-Zeile ermöglichen.
Gültigkeit: Gilt nur für den PC und muss in dessen Script eingetragen werden.
Andere Möglichkeit: Topic-Stichworte ins Greeting einbauen.
Vorteil: PC-Skript entfällt. Stichwort kann via Zuweisungen unter Speaker Condition PC-Gruppen (Faction) bekannt gemacht werden.
Sorgfalt: Dialog erscheint nur, wenn das Stichwort/die Stichworte im Greeting des aktuellen Gespräches stehen. Es sind genauere Überlegungen zur Planung der Gespräche notwendig --> aber kann bessere Dialoge bringen.
Syntax: AddTopic "my Topic"

Beispiel:

PHP-Code:
begin Dlg_PCName

       short NoLoRe 
;CS-Variable im Script declarierenKeine allgemeinen Dialoge anzeigen

;Es können mehrere Topics bekannt gemacht werden.
AddTopic "Schlechtes Gewissen"

AddTopic "Miese Ernte"

AddTopic "Lange Dürre"

end Dlg_PCName



Sorry für edit, aber bessere Methode - die Topics in ein Greeting einbauen, Bsp.:

"Hallo Fremder, was sagt ihr zu dieser Dürre? Eine verd... lange Dürre, das gibt eine miese Ernte, ich habe ein ganz schlechtes Gewissen deshalb."

Spart zumindest ein Script und du stellst sicher, das die Wahrscheinlichkeit des Ansprechens des richtigen NPC ein wenig größer wird. Oder besser gesagt ist das für den Spieler etwas übersichtlicher. siehe Diskussion


Btw. AddTopic gilt eh nur für den PC, eine ID ist nicht nötig. Beispiel korrigiert ;)
Anmerkung von Rene
Sorry auch für mein Edit aber hier ist was Falsches!

Das Journal ist ein eigenes Objekt und keine Eigenschaft des Players oder eines anderen Not Player Charakters!

Player-> Journal "XYZ" 123 oder
Player-> Addtopic "XYZ" sind falsch!


einfach

Journal "XYZ" 123
AddTopic "XYZ"

Beschreibung ergänzt. Die Wiki-Methode find ich stark.
Die konzentrierte Darstellung würde die Archivierung und die Orientierung erheblich erleichtern. Falls euch eine solche Form zusagt... schnelles Lernen kann die üble :) Folge sein.

< name > Tag in BB-Code oder entsprechendes Auto-PHP könnten Vorteile bringen. Die Themen könnten getrennt und via Verlinkung zusammengebracht werden. Alles wissenswerte zu einem Thema wäre an einer Stelle auffindbar.
Abl(g)eben - von ElBundee
Entfernen von Objekten im Todesfall

Folgendes Winz-Script soll aktiv werden, wenn der NPC dem es zugewiesen ist stirbt. Im Beispiel wird ein Objekt aus dessen Inventar entfernt (siehe Anwendungsbeispiel).

PHP-Code:
begin FinalBreath

if ( OnDeath )
  
RemoveItem"ghost_amulet"1
endif

end FinalBreath



Bemerkungen
OnDeath

Gibt "True" zurück, wenn der NPC gestorben ist.

RemoveItem

Entfernt items mit der angegebenen ID aus dem Inventory des NPCs - entsprechend des letzten Parameters hier ein einzelnes. Hier kann aber beliebiger Code stehen. Journaleinträge, etc. ...

Anwendungsbeispiel
Ein Amulet, welches dem NPC zu Lebzeiten bestimmte Eigenschaften verpasst. Zum Beispiel: Chamäleon constant effect als Geist. Das wäre aber zu heftig, wenn jeder Geist des Plugins so ein Amulet abwirft. Also wird es beim Tod des NPCs vernichtet.


Anmerkung von Rene zu OnDeath:
Dieses Ereignis lässt sich nur einmal auswerten/abfragen!

Wäre beispielsweise im lokalen Script von "BeispielNPC" eine Abfrage

if ( OnDeath [==1])

oder

short isDead
set isDead to OnDeath

und eine zusätzliche Abfrage in einem globalen Script

if ( "BeispielNPC"-> OnDeath [==1])
würde OnDeath nur im globalen Script ausgewertet, lokal würde er seinen eigenen Tod nicht merken!!
Scripte wiedergefunden, weitere folgen nach Überarbeitung, für die Zeitsteuerung allerdings besser Renes Script (im Einsatz: Lichter bei Nacht), siehe oben.
Seiten: 1 2
Referenz-URLs