HX3 Foren

HX3 Foren (https://hx3.de/)
-   Editing & Scripting (https://hx3.de/editing-scripting-167/)
-   -   Scripting - viele Fragen (https://hx3.de/editing-scripting-167/scripting-viele-fragen-22051/)

Drunken Officer 24.11.2012 19:06

Scripting - viele Fragen
 
An die Mods, weil ich sicherlich noch viele viele Fragen haben werde, habe ich den Titel allg. gehalten.

So wieder paar Fragen.
1. Wie lese ich den Damagewert vom Objekt A durch Objekt B aus?
Schreibe ich es in die Init von einem Objekt, klappt es
Code:

this setDammage 0.3;cd = getDammage car, hint format["%1",cd];
Versuche ich den Wert "cd (cardamage)" des Autos (car) in der Werkstatt auszulesen, bekomme ich "0".
Code car
Code:

this setDamage 0.4
Code Werstatt
Code:

cd = getDammage car; hint format["%1",cd]
Eigentlich frage ich das Auto ab.

2. Wie erreiche ich, dass der Damage-Wert nur als hint angezeigt wird, wenn er sich ändert? Ich habe leider nur die endlosschleife. Und wenn ich sage waitUntil cd != cd .... schaut mich Arma2 mit großemn fragenden Augen an.
Mein scriptansatz:
Code:

while {alive car} do {cd = getDammage car; if (cd != 0) then {hint format ["%1",cd]; waitUntil cd != cd; };
Hier weiß ich nicht, wie ich den Wertevergleich anstellen soll.

3. Wenn ich eibn kleines script bei meinen Modelen schreibe, kann ich denn sleep befehl nutzen. Bei er Init im Editor wird der einfach übergangen. Muß ich im Editor im Gegensatz zur *.sqf etwas besonderes beim sleep-Befehl beachten?

4. kann ich beim "nearestObjects-Befehl" die Klasse "LandVehicle" auslesen? Damit würde ich jedes Fahrzeug erfassen, nicht nur Pkw o.ä.

Gruß

Buliwyf 24.11.2012 20:27

Hi..

...eigentlich versteh' ich nur Bahnhof, aber ich versuch's trotzdem mal.. :D

zu 1)
Abgesehen davon, dass Dir die Werte nicht richtig angezeigt werden, warum schreibst Du nicht:
Code:

hint format["%1",getDammage car];
Und ob "car" eine gültige zu verwendende Variable ist, damit wäre ich vorsichtig, weil "car" auch gleichzeitig ein ArmA-Klassenname ist. Da würde ich was anderes nehmen. Wovon ich aber eher ausgehe ist, dass bei Deiner Variante die Werkstatt das Fahrzeug noch unbeschädigt kennt und Dir deshalb keinen Schaden auswirft. Du solltest da was mit zB nearestObjekt einbauen, damit der Schaden erst ausgelesen wird, wenn das Fahrzeug in der Nähe des Gebäudes ist.

zu 2)
Du musst mit einer zweiten Variable arbeiten, in der der Anfangsschaden steckt und mit einer Variablen, in der der aktuelle Schaden steckt und die beiden laufend vergleichen.

zu 3)
In einer init-Zeile funktioniert das so dirket nicht. Du musst dann mit spawn ein neues Script starten, wenn es unbedingt aus der init-Zeile sein muss.

zu 4)
Ja, warum nicht... allerdings auch die ganzen statischen Waffen.

Vienna 24.11.2012 23:22

Bei einem Code musst du schon nach und logisch denken. Da muss jedes Zeichen passen!

Ob alle geöffneten Klammern auch geschlossen sind.
Ob Befehle korrket aufgerufen werden wie z.B. waitUntil {...}.
Ob eine Abfrage Sinn ergibt. Wie cd != cd. Wie soll eine Variable nicht gleich sich selbst sein?

Zu 2. Kopiere das in die Initialisierungszeile eines Fahrzeuges:
Code:

temp = this spawn
 {
  _dam = -1;
  while {alive _this} do
  {
    waitUntil {getDammage _this != _dam};
    _dam = getDammage _this;
    hint format ["Schaden: %1%2", floor(_dam * 100),"%"];
  };
  hint "Schaden: 100%"
 };

Beachte, dass this außerhalb des Skripts ohne und im Skript mit Unterstrich geschrieben wird!

TeRp 25.11.2012 13:03

Zitat:

Zitat von Vienna (Beitrag 435825)
Ob eine Abfrage Sinn ergibt. Wie cd != cd. Wie soll eine Variable nicht gleich sich selbst sein?

Wenn sie null / nil ist.

Vienna 25.11.2012 16:09

Du trägst nur zur Verwirrung bei, es geht hier um eine brauchbare logische Abfrage!

Ist die Variable nicht initialisiert, auf NIL oder NULL gesetzt, dann erhält man bei dieser Abfrage:

if (cd != cd) then {hint "THEN"} else {hint "ELSE"};

weder THEN noch ELSE angezeigt.

Ist ein Wert in der Variablen, dann zeigt die Anzeige immer ELSE. Das ist ja nicht der Sinn einer solchen Abfrage.

Eine Zeile im Skript: waitUntil {cd != cd}; blockiert das Skript auf dieser Zeile. Egal ob die Variable NULL, NIL, eine Zahl oder einen Text enthält. Bei einem logischer Wert stürzt das Skript ab.

Xeno 25.11.2012 18:20

*deleted*

Xeno

Drunken Officer 27.11.2012 02:14

Zitat:

Zitat von Vienna (Beitrag 435825)
Zu 2. Kopiere das in die Initialisierungszeile eines Fahrzeuges:
Code:

temp = this spawn
 {
  _dam = -1;
  while {alive _this} do
  {
    waitUntil {getDammage _this != _dam};
    _dam = getDammage _this;
    hint format ["Schaden: %1%2", floor(_dam * 100),"%"];
  };
  hint "Schaden: 100%"
 };


Okay das funktioniert. Das script habe ich fast geschnackelt. Was genau macht diese Zeile temp = this spawn

Sorry fürs viele Fragen. In meinen Modelen habe ich diese Zeile noch nie benutzen müssen. Aber ohne diese Zeile funktioniert es ja nicht.

Zur (exteren) Abfrage Damage-Wert.
Es wird ständig 0 ausgeworfen, wenn ich z.B. den Schaden am Fahrzeug durch die Werkstatt ausgelesen haben möchte.

Buliwyf 27.11.2012 05:40

Scripting Commands ArmA2

;)

Vienna 27.11.2012 08:13

Skripte in externen Dateien ruft man mit <Parameter> execVM "SkriptName.sqf"; auf.

Mit <Parameter> spawn {...Code...}; ist es möglich Code direkt aufzurufen. z.B. in einem Auslöser oder in einem externen Skript als "Unterprogramm".

temp = benötigt man nur beim Aufruf im Editor (frag mich nicht warum).

Die eigentliche Routine beginnt erst mit this spawn {....};

In spawn kannst du fast alles wie in ein Skript reinschreiben und das läuft als eigenständiges Skript.

this enthält in diesem Fall den "Namen" des Objekts (Fahrzeug, Soldat, usw.) und wird dem Spawn-Skript als Parameter übergeben.

Als Parameter kann man eine eine einzelne Variable übergeben (in diesem Fall this spawn {...};). Diese ruft man dann im Skript mit _this allein ab!

Übergibt man einem Skript ein Array [1,2,3,...] spawn {...}; dann werden die einzelnen Inhalte des Arrays im Skript mit _this select 0; _this select 1; _this select 2; usw. abgerufen.


Wenn eine Damage-Abfrage auch bei einem beschädigten Objekt immer nur 0 ausgibt, dann machst du was falsch. Teste das mit einem Funk-Auslöser: player groupChat format["%1", getDammage Objektname];

Drunken Officer 27.11.2012 15:52

Zitat:

Zitat von Buliwyf (Beitrag 436002)

Die Seite ist mir wohl bekannt und ich bin da auch schwer am Lesen. Aber wenns so einfach wäre...

@Vienna
Es stellt doch eigentlich keinen Unterschied dar, ob ich den Wer via Hint oder Chat wiedergeben lasse.
Oder kann es sein, dass ich erstmal das Objekt als nearestObject auslesen muss um den Wert zu bekommen?
Wie bereits geschrieben, in der INIT des betreffenden Objektes klappt es. Dein Script läuft ja wunderbar. Ich werde mal mit nearestObject basteln.
Aber so wie ich Experte mich kenne, werde ich eh wieder Hilfe brauchen. :zahn:

Vienna 27.11.2012 16:38

Hint-Ausgaben überschreiben den vorherigen Text. Bei groupChat wird der Text eine Zeile nach oben geschoben. Das ist vorteilhaft, wenn kurz nacheinander unterschiedliche Texte angezeigt werden.

Um dir den Wert anzeigen zu lassen benötigst du den Namen des Objekts. Bei unbekanntem Namen ist nearestObject eine der Möglichkeiten den festzustellen.

schworzi 30.11.2012 05:38

Hallo Leute,

mich würde sehr gern Intressieren was brauche ich Unbedingt für Skripte, so das ich unter dem Mod ACE und ACRE eine Multiplayer Mission basteln kann. Bei den Skripten benötige ich die Mindest angabe "was da drin stehn muss um ein Briefing zu sehen!" z.b. MAP : CHERNARUS sie sind in Balota und müssen nach Chernagorsk..... Wenn du dann in Chernagorsk am Auslöser bist soll es als Abgehackt markiert werden.

Leider bekomm ich das Alles nicht hin.

für hilfe wäre ich extrem Dankbar!

Vienna 30.11.2012 13:09

Schau einmal hier rein: http://hx3.de/editing-scripting-167/...-tricks-22044/

Drunken Officer 01.12.2012 06:28

Okay, ich habe wieder eine Frage.
Das script wird in der Config zu meiner Werkstatt aufgerufen
Irgendwo ist der Fehler
Code:

_blub = _this select 0; // damit wird das Objekt angesprochen mit
 desen Config die *.sqf aufgerufen wird (hier die Werstatt)
_dam = 0;
_dam2 = 0;
while {alive _blub} do
{
_no = nearestObjects [_blub,"car",15];
_dam = getDammage _blub; // Schaden Werkstatt >> nur Test
_dam2 = getDammage _no; // Schaden Fahrzeug
player sideChat format ["%1",_dam]; // funtioniert
player commandChat format ["%1",_no]; // funktioniert
player globalChat format ["%1",_dam2]; // :(
sleep 2.5;
};

Der Schaden von _dam wird angezeigt.
Der Name von _no wird angezeigt bzw. [] wenn leer
ABER, bei _dam2 hängt sich das script auf!

Muss ich da irgendwie mit isNil arbeiten?

Vienna 01.12.2012 07:20

Der Fehler liegt in dieser Zeile:

_dam2 = getDammage _no; // Schaden Fahrzeug

Die Variable _no enthält ein Array, getDammage erfordert aber ein Objekt.

Versuche es so:
Code:

_blub = _this select 0; // damit wird das Objekt angesprochen mit  desen Config die *.sqf aufgerufen wird (hier die Werstatt)
_dam  = 0;
_dam2 = 0;
while {alive _blub} do
{
  _no  = nearestObjects [_blub,"car",15];
  _dam  = getDammage _blub;              // Schaden Werkstatt >> nur Test
  player  sideChat format    ["%1",_dam]; // funtioniert
  player  commandChat format ["%1",_no];  // funktioniert
  {
  _dam2 = getDammage _x;                // Schaden Fahrzeug
  player  globalChat format ["_x: %1  Schaden: %2", _x, _dam2];
  sleep 1
  } forEach _no;
  sleep  2.5
};


Drunken Officer 13.12.2012 08:59

Code:

_blub = _this select 0;
_dam1  = -1;
while {alive _blub} do
{
  _no  = nearestObjects [_blub,"car",15];
  _dam  = getDammage _blub;             
    player  commandChat format ["%1",_no];
  {
waitUntil {getDammage _x != _dam1}; _dam1 = getDammage _x;
    player  globalChat format ["_x: %1  Schaden: %2", _x, _dam1];
    } forEach _no;
  sleep  2.5
};


player commandChat format ["%1",_no];
Wenn sich kein Fahrzeug im Bereich befindet kommt; .... [];

Das "Problem" ist, dass sich der letzte Schaden innerhalb der Werkstatt gemerkt wird. Erst wenn das Fahrzeug aus dem Bereich ist UND außerhalb neuen Schaden nimmt, erst dann kann bei einem anderen neuem Fahrzeug der Wert bestimmt werden.
Nach meiner Logik müßte also ausgelesen werden, dass wenn der Bereich null ist, der _dam1 = -1 ist.
Ich habe des mit
if (!isNull _no) then {...} probiert. Da stürzt das Script ab.
if (_no == "") oder auch if(_no == []) führten nicht zum Erfolg.

Wie kann ich auslesen ob der Wert im Array == 0 ist?

Vienna 13.12.2012 09:39

http://community.bistudio.com/wiki/count

Drunken Officer 17.12.2012 17:39

Erstmal danke Vienna, es hat viel geholfen.
es funktioniert sowiet

Nächstes Projekt ist ein Geschwindigkeitsmessanlage

NearestObject erfasst alle Objekte im 306° Winkel. Bekomme ich hin.
Ich benötige aber die relative Position vom Objekt zur Kamera.
ich habe mit getDir gearbeitet.

Die Posi der Kamera bekomme ich ausgelesen. Auch die des Objektes. Allerdings würde sich jede getDir Abfrage auf die absolute Ausrichtung des Objektes beziehen. Wie bekomme ich es hin, dass nur Fahrzeug erfasst werden, die sich in der relativen Richtung 0 (+/- 20) zur Kamera befinden?

Quasi:
Kamera schaut 90°. Fahrzeuge erfassen die sich im winkel 80 - 110 befinden.

Vienna 17.12.2012 20:46

Diese Funktion gibt die Grade zurück, wie wenn du ein Objekt mit dem Kompass anvisierst.

Code:

F_dir2pos =
 {
  private["_p1","_p2","_d"];
  _p1=_this select 1;
  _p2=_this select 0;
  _d=((_p1 select 0) - (_p2 select 0))atan2((_p1 select 1) - (_p2 select 1));
  if (_d<0)then{_d=_d+360};
  _d
 };

Aufruf:

player groupChat format["Kompass zeigt: %1 Grad",floor([getPos player, getPos Objekt] call F_dir2pos)];

In Kombination mit getDir player wirst du dir eine passende Routine erstellen können.

Drunken Officer 26.12.2012 08:42

Ich habe eine Frage zu "cutText".

Den Text bekomme ich angezeigt. Ich kann leider zu Hause nicht testen, ob er local oder global ist.
Ziel: nur der Fahrer (_driverx) des Fahrzeuges soll den Text angezeigt bekommen. Ich habe zum Anfang auf
Code:

private = ["_driverx"];
bla bla bla

_no = nearestObjects[(_this select 0),["car"], 100];
_driverx = name driver _x;
{
while {alive _no} do
  { cutText [format ["%1" >>hier benötige ich nen Zeilenumbruch<< WARNING, you are to close",_ driverx],0.3];
...
...
};
} forEach _no;

gesetzt. Ist es jetzt local?
Desweiteren benötzige ich nen Zeilenumbruch. Aus meiner HTML Zeit kenne ich noch <br> und </br>. hat aber in sämtlichen Varianten nicht funktioniert. Gibt's da ne Möglichkeit nen Zeilenumbruch zu gestalten?
Wenn ich 2x cutText mache, werden sie überblendet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:25 Uhr.

Angetrieben durch vBulletin, Entwicklung von Philipp Dörner & Tobias


SEO by vBSEO 3.2.0 ©2008, Crawlability, Inc.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119