PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Realistisches Verhalten unter Beschuss


Guipas
15.06.2006, 22:49
Ich habe zwei M2-Maschinengewehre an eine Einfahrt postiert und bin mit dem Verhalten der Schützen nicht zufrieden: Wenn der Player sich auf dem Bauch kriechend nähert und ein M2 erledigt, reagiert der Schütze des anderen M2s nicht. Erst wenn der Player aufsteht, "sieht" das andere M2 ihn. Ich habe in die INIT-Zeilen der M2s ein "this setBehaviour "Aware"; this setCombatMode "Yellow" eingegeben: keine Veränderung. Ich möchte, dass sich die M2s unter Beschuss drehen (den Horizont absuchen). Geht das?

SWAT
15.06.2006, 22:55
wie ist denn das Verhalten, wenn du die INIT leer lässt?

Ansonsten probier es mal mit "this DoWatch name". Ich bin mir nicht ganz sicher, aber ich glaube, für name kann man auch south, west, usw. eingeben. Ist aber nur reine Vermutung meinerseits jetzt.

Guipas
15.06.2006, 23:14
wie ist denn das Verhalten, wenn du die INIT leer lässt?

Ich hab mich falsch ausgedrückt: Ich habe sowohl INIT leer gelassen, als auch Verschiedenes ausprobiert: Ergebnis: INIT leer unterscheidet sich nicht von z.B. setBaviour "Combat" + setCombatMode "Red" (bei "Careless" passiert natürlich überhaupt nix, klar...).

Ansonsten probier es mal mit "this DoWatch name". Ich bin mir nicht ganz sicher, aber ich glaube, für name kann man auch south, west, usw. eingeben. Ist aber nur reine Vermutung meinerseits jetzt.

Gerade gemacht, klappt aber leider nicht. Die Richtungsangaben werden als Variable von DoWatch nicht akzepiert. Dem Player einen Variablen-Namen zu geben und die M2s so auf ihn auszurichten, verträgt sich leider nicht mit der Mission: ALLE Einheiten der Player-Seite sollen die M2s entsprechend beeinflussen.

Guipas
15.06.2006, 23:31
Ich habe jetzt mal folgendes gemacht: dem Player einen Namen zugewiesen und die M2s mit doWatch drauf ausgerichtet. Das funktioniert zwar, aber ich kriege den Realismus nicht hin, den ich möchte: Player kriecht auf dem Bauch hin, erledigt ein M2, doch das andere M2 zielt nur auf Player und feuert erst dann, wenn Player noch weiter vorrückt. Das Unrealistische: 1.) Wenn Player den Schützen des übriggebliebenen M2s sehen kann, dann auch vice versa. 2.) Wenn mir als M2-Schütze der Kumpel weggeschossen wird, ballere ich ersteinmal grob in die Richtung, aus der die Schüsse kamen.

Serclaes
15.06.2006, 23:42
Ich kann nichts garantieren aber mit dem Script müsste es gehen.

mgschütze1 heisst der schütze des ersten mgs (nicht dem mg den namen geben)
mgschütze2 heisst der schütze des zweiten mgs
player heist der spieler

#start
? not(alive mgschütze1): goto bla1
~0.1
? not(alive mgschütze2): goto bla2
~1
goto start
#bla1
mgschütze2 dowatch player
~0.1
goto exit
#bla2
mgschütze1 dowatch player
~0.1
goto exit
#exit
exit

Guipas
16.06.2006, 00:05
Ich bin noch Anfänger im MissionEditing und muss da nachfragen: Das ist ein Script, ist das richtig? Muss ich mit "exec" dann irgendwo (Einheit, Auslöser, Wegpunkt) starten, richtig?

DoWatch Player-Name scheint im Ansatz doch das Richtige zu sein, denn dass alle anderen Einheiten der Player-Seite die M2s in derselben Weise beeinflussen, ist wohl übertriebener Realismus: Als Player krieg ich das im Gefecht ja gar nicht mit, denke ich mir.

Was mir noch fehlt: Ist es möglich, dass der übriggebliebene M2-Schütze dem Player ein paar Schüsse vor den Bug setzt, sobald der erste M2er hin ist? (Mit setPos getPos und versetztes unsichtbares Ziel vorm Player? Aber wie?)

SWAT
16.06.2006, 02:22
Jap, das ist ein Script...

Ich erkläre dir kurz, was du machen musst, um es zu starten. Du gehst in den Editor und bastelst dir deine Mission soweit erstmal zurecht und speicherst das Game.

Mit z.B. Alt + Tab verlässt du das Spiel und gehst in deinem OFP-Ordner in User/Dein Name/Missions/Missionsname... dort findest du eine Datei namens Mission.sqm...
In diesem Ordner öffnest du eine Textdatei, kopierst oder schreibst dein Script dort rein und speicherst es z.B. MG.sqs ab (Name ist egal). Vorher natürlich von Txt.Datei auf alle Dateien umstellen, damit es nicht als MG.sqs.txt gespeichert wird.

Das Script selbst kannst du über Init-Zeile, Auslöser oder sogar ein anderes Script auslösen und zwar schreibst du this exec "MG.sqs". Mehr zu Scripten findest du, wenn du mal die Suchfunktion befragst.

Was mir noch fehlt: Ist es möglich, dass der übriggebliebene M2-Schütze dem Player ein paar Schüsse vor den Bug setzt, sobald der erste M2er hin ist? (Mit setPos getPos und versetztes unsichtbares Ziel vorm Player? Aber wie?)

Möglich ist das mit Sicherheit, hab es aber selbst noch nie ausprobiert... Als unsichtbares Ziel könnte man das Heli-Pad oder die invisible Targets nutzen. Letzteres findet sich wahrscheinlich auf www.mapfact.net

Mir würde da sicher auch ein Script zu einfallen, ist im Moment aber zu spät für mich, da noch groß nachzudenken

Guipas
16.06.2006, 12:36
Vielen Dank, SWAT, für die Script-Erklärung, hab´s so gemacht. Vielen Dank auch an Serclaes für das Script, obschon...: Irgendwas stimmt da nicht (und ich spreche jetzt nicht von den Umlauten im Variablenname, die ich ersetzt habe im Name-Feld der Einheit und im Script). mgschuetze2 richtet sich immer sofort auf player aus, obwohl mgschuetze1 quicklebendig ist, während letzterer sich um keinen Millimeter bewegt, wenn mgschuetze2 erledigt wurde. Um auszuschließen, dass ich mit der internen Feind-Logik von OFP in Konflikt komme, habe ich player probehalber auf dieselbe Seite wie die MG-Schützen gesetzt und ein bisschen friendly fire gespuckt: das Ergebniss ist dasselbe. Sonderbar. Einen logischen Fehler kann ich in Serclaes´ Scipt nicht entdecken.

SWAT
16.06.2006, 13:52
Aber ich hab den logischen Fehler entdeckt... die Variablen nach goto müssen in "" stehen...

Es muss also heißen:

#start
? not(alive mgschütze1): goto "bla1"
~0.1
? not(alive mgschütze2): goto "bla2"
~1
goto "start"
#bla1
mgschütze2 dowatch player
~0.1
goto "exit"
#bla2
mgschütze1 dowatch player
~0.1
goto "exit"
#exit
exit


Das Script selbst kann man natürlich noch optimieren, z.B. ist das letzte goto "exit" gar nicht mehr nötig... aber an sich müsste das soweit passen

Sudden Death
16.06.2006, 15:19
Wenn Du schon mit "unsichbaren" also InvTargets arbeitest, kannst Du Du dieses auch stehts 1m vorm Player positionieren und auf setcaptive true setzen. Mit Auslösern veränderst Du dann den Status des Targets von setcaptive true auf false wenn einer der beiden MG-Schützen stirbt. Ergo der andere ballert auf das InvTarget los. Wenns weit genug vom Player weg ist (halt ca. 1m) schauts aus als ob der MG-Schütze ihm "vor den Bug" schiesst.

Gruß

S.D.

Guipas
16.06.2006, 15:59
Danke! Es klappt so!

Beim Experimentieren habe ich festgestellt, dass es wohl einen OFPinternen Feind-Entdeckungs-Schwellwert gibt, der überschritten sein muss, damit das Feuer eröffnet wird. So richtet sich zwar - dank Script - der überlebende M2-Schütze auf den player aus, feuert aber nicht, wenn player nicht "gut genug" sichtbar ist. Ich habe das Script probehalber mit doFire-Befehlen erweitert: bringt nichts. (Vorläufiges) Resumee: die OFP-KI ist so eingestellt, dass der Spieler einen Vorteil hat: Wenn er (liegend und nicht durch Büsche etc. versteckt) eine Schusslinie auf den KI-Gegner hat, so muss das auch vice versa gelten. Doch die KI hat dem Gegner wohl "schlechtere Augen" verpasst...

Guipas
16.06.2006, 16:01
Oh, neue Antwort. Meine vorherige bezieht sich auf die Script-Korrektur von SWAT.

Guipas
16.06.2006, 17:00
In verschiedenen Befehlsreferenzen finde ich keinen invTarget-Befehl. Wie geht der denn? Beim Googeln habe ich festgestellt, dass es ein MAP_Editorupgrade mit unsichtbaren Zielen gibt. Ist das eine Möglichkeit? Wie nimmt man dann die permanente Kopplung des unsichtbaren Ziels an den player vor?

Vielen Dank im voraus!

Sudden Death
16.06.2006, 17:55
Invisible Targets sind Editorobjekte entweder aus dem Mapfact-Editorupgrade oder dem InvTargets-Addon von Lester beides auf mapfact.net zu finden.

Das Koppeln erfolgt wiederum über ein Script:

#loop
_x = 1*sin(getdir player)
_y = 1*cos(getdir player)
_this setpos [(getpos player select 0)+_x,(getpos player select 1)+_y,0]
~1
goto "loop"

Du rufst es am besten über die init-Zeile des Editorobjektes auf:
this exec "positionierung.sqs"

Damit sollte das Ziel immer 1m vor dem Player sein, beachte bitte, dass es solange wie es nicht auf "setcaptive true" steht, permanent vom Gegner beschossen wird!

S.D.

Guipas
17.06.2006, 14:17
Vielen Dank, ich werd´s ausprobieren.

Gruss, Guipas

Guipas
19.06.2006, 00:50
Hallo S.D., ich habe dein Script noch nicht ausprobiert, denn ich wollte es erst mal verstehen; musste mir noch mal Sinus und Kosinus vergegenwärtigen, kritzelte ein wenig aufs Papier, bis mir dann das bekannte Licht aufging (wunderbar!). Meine Frage, bevor ich dein Script einsetze: mit "select" nimmst du ja Elemente aus einem Array (Positionskoordinaten). Nun lese ich im Unofficial OFP Command Ref. Manual von LustyPooh & Niosop, dass "Array indexes start at 1 not 0". Wenn es so ist, müsste es "select 1" und "select 2" heißen, um sich x- und y-Koordinate zu fischen. Was ist richtig?

Gruß, Guipas

Serclaes
19.06.2006, 09:07
Das was S D gemacht hat ist einwandfrei. In dieser Zeile :

this setpos [(getpos player select 0)+_x,(getpos player select 1)+_y,0]


wird erst die Position an der x achse des spielers genommen (getpos player select 0) und dann wird die variable _x addiert. Das mit der y Achse ist dann Analog.

select 0, select 1 usw. sind "variable" variablen. Ich probier das mal anhand eines Beispiels zu erklären. In deinem Fall ist das ja so das du eine Invisible Target Addon vor dem Player platzieren willst. Aber da der Player ständig seine Position ändert musst du also den Player als Positionsreferenz nutzen. Deshalb das (getpos player select 0), andernfalls wäre das eine Zahl.

Was du auch machen kannst ist ein ziviles unsichtbares Ziel zu platzieren dann kannst du dir nämlich per "dofire" aussuchen wer darauf schiesst.

Sudden Death
19.06.2006, 13:14
Nun lese ich im Unofficial OFP Command Ref. Manual von LustyPooh & Niosop, dass "Array indexes start at 1 not 0". Wenn es so ist, müsste es "select 1" und "select 2" heißen, um sich x- und y-Koordinate zu fischen. Was ist richtig?

Ich kenn zwar das Tutorial nicht, da es für mich nur die einzig wahre Bibel gibt und das ist die von Mr. Burns! Auch Lester´s Befehlsreferenz ist sehr gut!

Aber select 0 und 1 ist richtig! Sie auch die offizielle BIS Befehlsreferenz:
http://www.flashpoint1985.com/docs/comref_102002/data/comref.html

Die abgefragte Positionsangabe ergibt einen array [x-Koordinate, y-Koordinate, Höhe über Grund], daher select 0 für x-pos und select 1 für y-pos!

Du kannst das ganze ja erstmal mit dem Heli-H-Objekt oder einem "Fass" ausprobieren damit Du siehst wo das Objekt positioniert wird. Sollte es nicht vor Dir sondern 90 Grad seitwärts sein, muss Du sin und cos tauschen. Ich komme selbst manchmal mit den Positionsangaben in OFP durcheinander.

Die "1" bei "1*cos(getdir player)" steht für den Abstand 1m. Du kannst also auch "5" für 5m testen etc.

WICHTIG! Wenn Du "_this" nutzt muss das Script unbedingt von dem Objekt aufgerufen werden welches im Verhältnis zum Player positioniert werden soll! Ansonsten durch den Einheitennamen ersetzen!

Gruß

S.D.

Guipas
20.06.2006, 02:53
select 0, select 1 usw. sind "variable" variablen. Ich probier das mal anhand eines Beispiels zu erklären. In deinem Fall ist das ja so das du eine Invisible Target Addon vor dem Player platzieren willst. Aber da der Player ständig seine Position ändert musst du also den Player als Positionsreferenz nutzen. Deshalb das (getpos player select 0), andernfalls wäre das eine Zahl.

Ja, so hatte ich es mir ja bereits zusammengereimt. Ich war nur unsicher, ob das erste Element eines Arrays mit 0 oder 1 angesprochen wird (also in unserem Fall die x-Koordinate). S.D. sagt klar: 1. Also bon. Dein "andernfalls wäre das eine Zahl" verstehe ich nicht. Was meinst du?

Gruß Guipas

Guipas
20.06.2006, 03:00
Sorry, natürlich: S.D. sagt: 0. (Es ist zu spät, ich schalte ab, wie SWAT gestern). (Wenn ich´s richtig sehe, fehlt noch ein todmüder Smiley in der Sammlung...)

Serclaes
20.06.2006, 16:57
Mit Zahl meinte ich Koordinate ;)

Guipas
21.06.2006, 18:40
Ich kann in diesem Zusammenhang noch ein Mini-Script beisteuern, das ganz erfolgreich das Ärgernis der Schlafmützen-M2s abstellt. (Für Edit-Profis wird´s banal sein, für mich Anfänger nettes Erfolgserlebnis). Egal, wie man Combat-Mode und Verhalten eines M2-Schützen einstellt, egal auch, ob man die INIT-Zeile eines "besetzten" M2-Vehikels oder die INIT-Zeile eines Soldaten bemüht, den man in ein leeres M2 einsteigen lässt: Der Schütze bekommt nicht mit, wenn man sich ihm seitlich, oder sogar bis zu einem Winkel von schätzungsweise 35-40 Grad zur Schussrichtung des M2s nähert: Du kannst ihm mit dem Lauf deiner Knarre die Backe piercen: stört ihn nicht. Also habe ich mir ein Script "M2Aware.sqs" geschrieben:

#start
mgschuetze dowatch getPos Object 51203
~5
mgschuetze dowatch getPos Object 23353
~5
goto "start"

Object-IDs sucht man sich auf der Map: ein Busch links, ein Busch rechts (oder irgendwas). Ist nichts da (am Strand) kann man die unsichtbaren Hs nehmen und ihnen Namen geben (hier H1 und H2):

#start
mgschuetze doWatch H1
~5
mgschuetze doWatch H2
~5
goto "start"

Klappt bei mir ganz gut: Eine seitliche Annäherung wird erheblich beschwert und ist so realistischer, denn für gewöhnlich tragen Soldaten ja keine Scheuklappen. Das Script kommt nicht mit der internen Logik des Spiels in Konflikt: Entdeckt der M2-Schütze Gegner, kümmert er sich auch um sie; überlebt er, wird das Script wieder aufgenommen. Ist das eigentlich immer so, dass die KI ein permanent laufendes Script gegebenenfalls unterbricht und nach Ereigniss-Abhandlung weiter laufen lässt?

Gruß, Guipas