PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bullet Cam Addon


Cyborg11
15.09.2008, 13:45
Jo, bin gerade im Addonerstellen Fieber und versuche gerade wieder aus einem Skript ein Addon zu basteln :naughty:

Als Skript habe ich die Bullet Cam 1.01 (http://hx3.de/editing-139/patrone-cam-bullet-mode-verfolgen-14979/2/#post189677) von Vienna.

Also meine config.cpp schaut folgendermaßen aus:
class CfgPatches
{
class GeschossCamera
{
units[]={};
requiredVersion = 1.08;
requiredAddons[] = {"Extended_Init_EventHandlers"};
};
};

class Extended_Init_EventHandlers
{

class Man
{
Init_Car ="_this execVM ""GeschossCamera\Init.sqf"";";
};
class Car
{
Init_Car ="_this execVM ""GeschossCamera\Init.sqf"";";
};
class Tank
{
HULK_Init_Car ="_this execVM ""GeschossCamera\Init.sqf"";";
};
class Plane
{
Init_Car ="_this execVM ""GeschossCamera\Init.sqf"";";
};
class Helicopter
{
Init_Car ="_this execVM ""GeschossCamera\Init.sqf"";";
};
class Ship
{
Init_Car ="_this execVM ""GeschossCamera\Init.sqf"";";
};
class StaticWeapon
{
Init_Car ="_this execVM ""GeschossCamera\Init.sqf"";";
};
};

Und da man für die Skripte zwei Auslöser braucht, wollte ich die über die init.sqf erstellen:
_caminf = createtrigger ["NONE", getpos player];
_caminf setTriggerArea [0,0,0,false];
_caminf setTriggerStatements ["player == vehicle player","infanterieGeschossAktion = player addAction ["Infanterie-Geschosssicht ein/aus","GeschossCamera\infanterieGeschossCam_on_off.sqf,[],-1,false,true,""]","player removeAction infanterieGeschossAktion; if(ViennasInfanterieFiredAktion) then {temp= execVM "GeschossCamera\infanterieGeschossCam_on_off.sqf"}"];

_camveh = createtrigger ["NONE", getpos player];
_camveh setTriggerArea [0,0,0,false];
_camveh setTriggerStatements ["player != vehicle player","PlayersGeschossKameraVehicle=vehicle Player; vehicleGeschossAktion = PlayersGeschossKameraVehicle addAction ["Fahrzeug-Geschosssicht ein/aus","GeschossCamera\vehicleGeschossCam_on_off.sqf",[],1,false,true,""]","PlayersGeschossKameraVehicle removeAction vehicleGeschossAktion; if(ViennasVehicleFiredAktion) then {temp= execVM "GeschossCamera\vehicleGeschossCam_on_off.sqf"}"];

Das Problem ist in der init.sqf. Diese Fehlermeldung kommt dann jedesmal beim Start von ArmA:
http://hx3.de/attachment.php?attachmentid=1632&stc=1&d=1221482646

Was habe ich da falsch gemacht? :) Wollte die Bulletcam auch in die Kampagnen usw. nutzen ohne die erst jedesmal in die Missionen einzubauen.

i0n0s
15.09.2008, 16:14
" beendet einen String, um den String nicht zu beenden sondern ein " in den String zu bekommen musst du "" schreiben.

Cyborg11
15.09.2008, 21:36
Ok, danke. Jetzt ist der Fehler weg :)
Nur funktioniert mein Addon irgendwie nicht so wie es soll. Also soll heißen, dsas ich einfach keine Actioneinträge in der Mission bekomme. Ich weiß auch nicht warum :(

__________________________________________________ _________________


Ok, ich hab jetzt mal meine init.sqf umgeschrieben. Es funktioniert die Infanterie Bullet Cam. Aber es funktioniert nicht die Fahrzeug Cam. Und für jede Einheit (egal ob leeres Fahrzeug, Feind, Freund) bekomme ich jedesmal die Aktion "Infanterie-Geschossansicht" <.< Also wenn 10 Soldaten auf der Karte sind, dann hab ich 11x die Aktion (da ich ja als Spieler auch dazuzähle).

Meine neue init.sqf schaut nun so aus:
If (player == vehicle player) then {infanterieGeschossAktion = player addAction ["Infanterie-Geschosssicht ein/aus","GeschossCamera\infanterieGeschossCam_on_off.sqf",[],-1,false,true,""]};
If (vehicle player != player) then {vehicleGeschossAktion = player addAction ["Fahrzeug-Geschosssicht ein/aus","GeschossCamera\vehicleGeschossCam_on_off.sqf",[],1,false,true,""]};


Weiß jemand, was nun daran falsch ist? Komme hier nicht mehr weiter =(
Danke shconmal im Voraus.

i0n0s
15.09.2008, 21:53
Du musst dafür sorgen, dass die Init nur einmal läuft.
Ansonsten musst du bei Fahrzeugen auch dem Fahrzeug den Eintrag ins Actionmenü geben. Und am Ende auch wieder entfernen!

Cyborg11
16.09.2008, 12:50
Du musst dafür sorgen, dass die Init nur einmal läuft.
Ansonsten musst du bei Fahrzeugen auch dem Fahrzeug den Eintrag ins Actionmenü geben. Und am Ende auch wieder entfernen!
Und wie kann ich das machen, dass die init nur einmal bei nem Missionsstart läuft?

Weil das ist blöd, wenn ich für jeden Soldaten/Fahrzeug die Aktion bekomme <------ Das bezieht sich aber nur auf verbündete Einheiten und auf leere Fahrzeuge.

i0n0s
16.09.2008, 13:29
Wie machen es denn die anderen Addons? Bzw. wie macht man im Allgemeinen das ein bestimmter Code nur unter einer Bedingung ausgeführt wird?

Sorry für die Gegenfragen, aber ohne sowas kommen immer wieder solche Fragen weil die Leute nicht anfangen zu lernen.

Cyborg11
16.09.2008, 13:35
Wie machen es denn die anderen Addons? Bzw. wie macht man im Allgemeinen das ein bestimmter Code nur unter einer Bedingung ausgeführt wird?
Ka oO


Sorry für die Gegenfragen, aber ohne sowas kommen immer wieder solche Fragen weil die Leute nicht anfangen zu lernen.
Ja schon, aber das demotiviert auch ^^ Außerdem kann man nicht einfach alles selber lernen, manchmal braucht man eben die Hilfe von anderen <.<

i0n0s
16.09.2008, 13:54
Hey, du benötigst hier eine IF-Abfrage. Und wenn du die nicht kennst... :schlagen:
Das einzige Problem ist, dass du vorher noch keine Variable initialisieren konntest auf die du zurückgreifen kannst. Aber dafür gibt es isNil.

Cyborg11
16.09.2008, 14:21
Hey, du benötigst hier eine IF-Abfrage. Und wenn du die nicht kennst... :schlagen:
Das einzige Problem ist, dass du vorher noch keine Variable initialisieren konntest auf die du zurückgreifen kannst. Aber dafür gibt es isNil.
Also ne IF Abfrage kann ich. Aber ich steh grad aufm Schlauch :D Wie muss die IF-Abfrage dann für die Inf und Veh Cam ausschauen?

player vehicle = isnil pveh

If (player == pveh) then {...}
So in etwa? :komisch:

i0n0s
16.09.2008, 14:27
Hm, wo fangen wir an?
Zu erst liest man sich die Parameter von isNil durch, dann schaut man was isNil zurückgibt :motz:

Dann ist "player vehicle" kein gültiger Ausdruck, und selbst wenn es einer wäre ("vehicle player"), dann kann man ihn keinem Wert zuweisen.

Ich hätte jetzt auf den Editing Guide verwiesen, ihn dem taucht aber isNil und nil nicht auf, von daher schau es dir im Biki mal durch was die Funktion macht. Vorallem das Beispiel im Biki kannst du dir mal anschauen. Wenn du das Beispiel 10 mal aufrufst, wie oft wird dann _pokus einen Wert zugewiesen?

Cyborg11
16.09.2008, 16:11
_pokus hätte den Wert 10, oder? Aber ich verstehe isnil so: Wenn die Variable nicht definiert ist, dann soll ArmA zum then Teil kommen, stimmt doch irgendwie so oder? =D

Aber trotzdem kein Plan wie ich das einbinden soll oO Hab noch nirgends irgendwie mit isnil gearbeitet und ein Addon mit isNil ist mir auch noch nicht untergekommen ... außerdem verstehe ich irgendwie den Sinn von isNill nicht oO

i0n0s
16.09.2008, 16:27
_pokus hätte den Wert 10, oder?
_pokus hat den Wert 0, du meintest vermutlich: _pokus wird 10 mal ein Wert zugewiesen. Das ist aber falsch.

Aber ich verstehe isnil so: Wenn die Variable nicht definiert ist, dann soll ArmA zum then Teil kommen, stimmt doch irgendwie so oder? =D
Ja, das stimmt, nur wendest du es irgendwie nicht an.

Versuchen wir es mal so:

private ["_pokus"];
if (isNil "_pokus") then {_pokus = 0};
if (isNil "_pokus") then {_pokus = 1};
Player sideChat format ["%1", _pokus];
Geh den Code bitte mal erst auf Papier durch und poste hier, was der Spieler sagt (also den Wert von _pokus). Danach kannst du den Schnipsel mal in ArmA ausführen lassen.

Cyborg11
16.09.2008, 16:33
ALso mal ohne es in ArmA zu testen, denke ich, dass _pokus den Wert 1 hat. Denn es wird ja von oben nach unten ausgeführt. Zuerst hat _pokus den Wert 0 und dann bekommt er den Wert 1.

Nein Stop! Das ist falsch. Denn wenn _pokus den Wert 0 bekommt, dann ist _pokus ja definiert und dadurch wird dann die nächste Zeile nicht ausgeführt bzw. da passiert nichts und somit sagt dann der Spieler: "0".

Ist es so richtig?



Kurze Frage nebenbei: Wofür braucht man das private? Wird das in ArmA auch ausgeführt? Oder schreibt man da alle Variablen rein um nen beseren Überblick zu bekommen? :D

i0n0s
16.09.2008, 16:49
:D Jetzt hast du deinen Fehler erkannt.

Und was macht der Code jetzt (im Bezug auf die thens) und wie hilft er dir bei der Originalfragestellung?

Bzgl dem private:
Jeder Codeblock ({ beginnt einen Codeblock, ein Script ist ein Codeblock) kann eigene Variablen haben.
Wenn das private fehlt würde _pokus undefiniert sein, da es nur im Block der then existiert. Im generellen sollten alle privaten Variablen in privates aufgeführt werden. Wenn man später Funktionen verwendet, hilft es sehr viele komische Fehler zu vermeiden.

modEmMaik
16.09.2008, 16:52
Jo, korrekt... denk' ich jedenfalls ;)

Im aktuellen Ike-T90 (http://armed-assault.de/news/t-90--t-72bm-update.html) findet Ihr z.B. den Smokelauncher, welcher eine bestimmte Anzahl von "Schüssen" beinhaltet. Das kommt doch eurem Problem relativ nahe, weil auch Addon.

BR,
mike

Cyborg11
16.09.2008, 17:19
:D Jetzt hast du deinen Fehler erkannt.

Und was macht der Code jetzt (im Bezug auf die thens) und wie hilft er dir bei der Originalfragestellung?
Der Thenteil gibt der Variable einen Wert und somit wird dann isNil nicht mehr ausgeführt. Also wird die Skriptzeile nur einmal ausgeführt und das hilft mir ungemein weiter, damit es bei mir auch nur einmal ausgeführt wird :jaaa:

Nach dem Prinzip hab ich das jetzt mal versucht in meine Skriptzeile miteinzubauen:
If (isNil "_cam" AND vehicle player == player) then {_cam = 1; infanterieGeschossAktion = player addAction ["Infanterie-Geschosssicht ein/aus","GeschossCamera\infanterieGeschossCam_on_off.sqf",[],-1,false,true,""]};
Das Problem: Ich krieg die Aktion immer noch mehrmals. Was hab ich jetzt schon wieder falsch gemacht? _cam wurde noch nie zuvor im Skript erwähnt. Soll ich das Addon mal hochladen? Wenn du willst kannst du ja mal nen Blick drüberwerfen :)




Bzgl dem private:
Jeder Codeblock ({ beginnt einen Codeblock, ein Script ist ein Codeblock) kann eigene Variablen haben.
Wenn das private fehlt würde _pokus undefiniert sein, da es nur im Block der then existiert. Im generellen sollten alle privaten Variablen in privates aufgeführt werden. Wenn man später Funktionen verwendet, hilft es sehr viele komische Fehler zu vermeiden.
Aber wird durch das private die Variable nicht definiert? Dadurch dürfte doch dann isNil nicht mehr funktioinieren oder nicht? Oder muss die Variable dafür mit =, >, usw. definiert werden, damit isNil nicht mehr funktioniert?

i0n0s
16.09.2008, 18:52
Du verwendest eine lokale Variable. Jeder Eventhandler ist aber ein eigenes Script und somit ist die Variable nie belegt. Du musst eine globale Variable nehmen.

Bzgl. private:
Es gibt die Codeblöcke, Scopes. In dem folgenden Beispiel hast du 3 Scopes: Der globale, dann das erste then und dann das zweite then.

if (player == vehicle player) then {
_vehicle = true;
} else {
_vehicle = false;
};
Player sideChat format ["%1", _vehicle];

_vehicle wird hier im Scope eines der thens erstellt, somit ist die Variable für den ersten Scope nicht bekannt. Daher muss man sie ihm erst bekannt machen. Dies geht entweder über "_vehicle = false;" oder eben durch "private "_vehicle"".

Was noch schöner ist: Wenn im einen übergeordneten Scope die Variable existiert, kann man sich mit private unter denselben Namen für den Scope eine neue Variable holen:

_bla = "Hallo";
if (true) then {
private "_bla";
_bla = "Tach";
};
Player sideChat _bla;

Der Spieler sagt also "Hallo", auch wenn _bla "Tach" zugewiesen wurde. Einfach aus dem Grund, dass wegen dem private das _bla im then-scope eine neue Variable ist.

Cyborg11
16.09.2008, 19:23
Danke, jetzt klappt das mit der Inf Bullet Cam :) Wusste gar nicht, dass man da nur globale Variabeln nehmen darf.

Aber jetzt hänge ich bei der Vehicle Cam :rolleyes:
Auslöser für die Vehicle Cam schaut so aus:
Bedingung: player != vehicle player
Aktivierung: PlayersGeschossKameraVehicle=vehicle Player; vehicleGeschossAktion = PlayersGeschossKameraVehicle addAction [format["*** %1-Geschoßsicht ein/aus ***",typeOF PlayersGeschossKameraVehicle],"Vienna\GeschossCamera\vehicleGeschossCam_on_off.sq f",[],1,false,true,""]
Deaktivierung: PlayersGeschossKameraVehicle removeAction vehicleGeschossAktion; if(ViennasVehicleFiredAktion) then {temp= execVM "Vienna\GeschossCamera\vehicleGeschossCam_on_off.sq f"}

Meine Skriptzeile schaut so aus:
If (isNil "camveh" AND vehicle player != player) then {camveh = 1; PlayersGeschossKameraVehicle=vehicle Player; vehicleGeschossAktion = PlayersGeschossKameraVehicle addAction ["Fahrzeug-Geschosssicht ein/aus","GeschossCamera\vehicleGeschossCam_on_off.sqf",[],1,false,true,""]};

Ich glaube, ich weiß an was das liegt. Ich habe nämlich die Zeilen von der Deaktivierung aus dem Auslöser nicht in meiner Skriptzeile. Aber wie soll ich das einbinden? Als else? Das wäre aber falsch, da sich eine Auslöserdeaktivierung ja ganz anders verhält als ein else-Teil.

Könntest du mir da bitte nocheinmal behilflich sein, mein Meister i0n0s?? :naughty:



Zu private:
Aha ok. Danke für die Information :) Und wenn man das Skript so erweitern würde (das 2.):
_bla = "Hallo";
if (true) then {
private "_bla";
_bla = "Tach";
player sidechat _bla
};
~2
Player sideChat _bla;
Dann müsste man doch zuerst "Tach" angezeigt werden und dann nach 2 Sekunden müsste doch eigetnlich dann "Hallo" erscheinen oder?

i0n0s
16.09.2008, 19:29
Zum ersten:
Init wird nur bei der Init ausgeführt. Somit müsstest du schon in einem Fahrzeug sein, damit das aktiv wird.

Zum private:
Ja, genau.

Dann zu deiner globalen Variable: Les dir mal das bzgl. Tags durch: OFPEC Tag System (http://www.ofpec.com/tags/index.php?action=about)

Cyborg11
16.09.2008, 19:40
Danke für den Link :)

Ja ich meine, dass wenn ich in einem Fahrzeug sitze, dass bei mir dann keine Action "Fahrzeug-Geschossansicht an/aus" kommt. Weiß aber nicht warum :(
Oder funktioniert das dann nicht mehr, wenn ich am Anfang ein Infanterist bin und mich dann in ein Fahrzeug setze? Wie muss ich das Skript dann umbauen, sodass es immer in irgendeinem Fahrzeug (egal wie weit die Mission schon fortgeschritten ist) funktioniert?

i0n0s
16.09.2008, 19:56
Das "oder" ist der Fall.
Du musst einfach darauf achten ob "vehicle player != player" ist.
Dann sitzt der Spieler in einem Fahrzeug und erst jetzt musst du den Eintrag hinzufügen.
Am besten eignet sich dafür ein Trigger den du erstellst.

Cyborg11
16.09.2008, 20:29
Das "oder" ist der Fall.
Du musst einfach darauf achten ob "vehicle player != player" ist.
Dann sitzt der Spieler in einem Fahrzeug und erst jetzt musst du den Eintrag hinzufügen.
Am besten eignet sich dafür ein Trigger den du erstellst.
Also mein Skript für den Trigger schaut so aus (alles in der init):
_camveh = createtrigger ["NONE", getpos player];
_camveh setTriggerArea [0,0,0,false];
_camveh setTriggerActivation ["", "", true];
_camveh setTriggerStatements ["player != vehicle player","PlayersGeschossKameraVehicle=vehicle Player; vehicleGeschossAktion = PlayersGeschossKameraVehicle addAction [""Fahrzeug-Geschosssicht ein/aus"",""GeschossCamera\vehicleGeschossCam_on_off.sqf"",[],1,false,true,""]","PlayersGeschossKameraVehicle removeAction vehicleGeschossAktion; if(ViennasVehicleFiredAktion) then {temp= execVM ""GeschossCamera\vehicleGeschossCam_on_off.sqf""}"];

Da sind eigentlich alle Bedingungen drinnen, nur es funzt wieder nicht. Ich bekomme einfach keine Fahrzeug Bullet Cam =(

i0n0s
16.09.2008, 20:55
true,""]"
muss heissen:
true,""""]"

Cyborg11
16.09.2008, 21:37
Danke, das hat aber mein Problem nicht behoben =( Es wird die Aktion immer noch nicht angezeigt.

Ich hab es mal folgendermaßen probiert:
In die init.sqf hab ich die Zeile reingeschrieben:
If (isNil "vehcam" AND vehicle player != player) then {vehcam = 1; player execVM "GeschossCamera\vehcam.sqf"};


Und vehcam.sqf schaut so aus:
PlayersGeschossKameraVehicle=vehicle Player; vehicleGeschossAktion = PlayersGeschossKameraVehicle addAction ["Fahrzeug-Geschosssicht ein/aus","GeschossCamera\vehicleGeschossCam_on_off.sqf",[],1,false,true,""]

Also das funzt schonmal, aber nur, wenn ich auch gleich am Anfang in einem Fahrzeug spawne. Wenn ich dann wieder aus dem Vehicle aussteigen will, dann hab ich keine Bulletcam mehr für meinen Infanteristen. Anders rum genauso: Wenn ich als Infanterist spawne und in ein Fahrzeug gehe, bekomme ich keine Fahrzeug Bullet Cam =(



Andere Frage nebenbei: Wüsstest du, was ich an dem Skript ändern muss, damit die Bulletcam auch im MP (als Client) funzt? =D Ein Cheat wäre es ja nicht, denn während das Geschoss fliegt, bleib ich regungslos in meiner Position stehen und kann abgeknallt werden. Also wenn das Geschoss 5 Sekunden braucht bis es im Ziel eingeschlagen ist, dann hat der Gegner 5 Sekunden Zeit mich zu erschießen und ich kann in der Zeit nichts machen.

i0n0s
16.09.2008, 21:56
Die Init muss immer ausgeführt werden, nicht nur wenn man gerade im Fahrzeug sitzt (oder nicht sitzt).

Cyborg11
16.09.2008, 21:59
Ah ok. Also muss ich den isNil Teil aus den Fahrzeugen wieder löschen?


Andere Frage nebenbei: Wüsstest du, was ich an dem Skript ändern muss, damit die Bulletcam auch im MP (als Client) funzt? =D Ein Cheat wäre es ja nicht, denn während das Geschoss fliegt, bleib ich regungslos in meiner Position stehen und kann abgeknallt werden. Also wenn das Geschoss 5 Sekunden braucht bis es im Ziel eingeschlagen ist, dann hat der Gegner 5 Sekunden Zeit mich zu erschießen und ich kann in der Zeit nichts machen.
:D

Cyborg11
17.09.2008, 13:09
Wieso kann ich meinen Beitrag nicht mehr editieren? :motz:


Wenn ich das isNil wegmache, dann hab ich die Bulletcam mal wieder mehrmals für jeden Soldaten/Fahrzeug in der Mission <.< Wie löse ich nun das Problem?