HX3 Foren

HX3 Foren (https://hx3.de/)
-   Editing & Scripting (https://hx3.de/editing-scripting-167/)
-   -   Bedingung muss 10s gegeben sein...? (https://hx3.de/editing-scripting-167/bedingung-muss-10s-gegeben-20404/)

spaccy 15.02.2011 22:33

Bedingung muss 10s gegeben sein...?
 
Hallo,

brauche mal bitte eure Hilfe.
Wie kann man in einem Skript (genauer gesagt in einer while do Schleife) neben der erfüllten Bedingung sagen das diese eine gewisse Zeit erfüllt sein muss um zu schalten?

so ungefähr:

while {true} do
{
if ((getDamage player >= 0.5) + 10 sek lang true) then {hint "test1"};
};


Gruß
spaccy

Pfandgiraffe 15.02.2011 23:07

while {true} do {
waitUntil {Damage player >= 0.5};
sleep 10;
if (damage player >= 0.5) then {...deine bedingung};
};


...oder den schaden speichern...

while {true} do {
waitUntil {Damage player >= 0.5};
_actdam = damage player;
sleep 10;
if (damage player <= _actdam) then {...deine bedingung};
};



getDamage is nich.

spaccy 15.02.2011 23:34

Danke für die schnelle Antwort.
Also das getdamage ist egal, sollte nur als Beispiel herhalten. Ich glaube das wird in meinem Skript nicht funktionieren.

Das Skript soll das Fahrzeug des Spielers nach gewisser Zeit automatisch nach und nach reparieren und sieht ungefähr so aus:

while {true} do
{
if ((Dammage vehicle player >= 0.1) and (Dammage vehicle player < 0.2)) then
{
sleep 5;
vehicle player setdamage 0;
};

if ((Dammage vehicle player >= 0.2) and (Dammage vehicle player < 0.3)) then
{
sleep 5;
vehicle player setdamage 0.1;
};

...

Da mehrere Abfragen in der While do Schleife vorliegen, wird "waituntil" wohl nicht funktionieren. Gibt es da vlt noch eine andere Möglichkeit?

Buliwyf 15.02.2011 23:39

Ob das jetzt 10 Sek sind wage ich zu bezweifeln, aber da kannste ja mit den Werten spielen... habe mir das mal zu ArmA1-Zeiten gebastelt:

Code:

_vcl = _this select 0;
_dmg = getDammage _vcl;
_fuel = fuel _vcl;

for [{_i=_dmg}, {_i > 0}, {_i=_i-0.01}] do {
 _vcl setDamage _i;
 sleep 0.25;
};

for [{_i=_fuel}, {_i < 1}, {_i=_i+0.01}] do {
 _vcl setFuel _i;
 sleep 0.25;
};

:rolleyes:

spaccy 16.02.2011 00:33

Das Skript sollte schon in automatisch in einer Schleife laufen. Es ist eine Multiplayer Mission in der die Fahrzeuge der Teilnehmer nach Schaden sich langsam regenerieren. Ähnlich wie in Call of Duty.

@ Buliwyf
Kann man dein Skript irgendwie auch in einer While do Schleife realisieren?

Vienna 16.02.2011 16:09

Liste der Anhänge anzeigen (Anzahl: 1)
Beim Skriptaufrauf werden drei Parameter eingegeben:

1. Name des Objekts
2. Schaden in Prozent ab dem repariert wird.
3. Zeit der Schadensreparatur in Sekunden.

Ist ein Objekt zu 100% zerstört, dann ist keine Reparatur möglich.

Reparatur.sqf
Code:

// Rapariert ein Objket, welches nicht total zerstört ist. [Vienna 16.02.2011]
//
//Parameter: [Objektname, Reparaturbeginn ab % Schaden, Reparaturzeit in Sekunden]
//
// Aufrufbeispiel für die Initzeile in einem Objekt, ab 50% Schaden und 10 Sekunden Reparaturzeit:
//  temp = [this,50,10] execVM "Reparatur.sqf"

if (!isServer) exitWith {};

private ["_o","_s","_z","_t"];

_o = _this select 0;      // Objekt
_s = (_this select 1)/100; // Schaden >=
_z = _this select 2;      // Reparaturzeit in Sekunden

while {damage _o < 1} do
  {
    //Warten auf erforderliche Schadenshöhe
    waitUntil{damage _o >= _s};
    _t = damage _o * (0.1/_z); // Wert der Schadenreduzierung
    //Reparaturschleife
    while {damage _o < 1 and damage _o > 0} do
      {
        _o setDamage ((damage _o) - _t);
        //hintSilent format["Schaden: %1",damage _o]; // nur zum Test
        sleep 0.1 //Pausezeit nicht verändern!
      } 
  }

Im Anhang ein Anwendungsbeispiel

spaccy 17.02.2011 18:33

Liste der Anhänge anzeigen (Anzahl: 1)
Hey Vienna danke für deine Mühen. Bitte nicht böse sein aber das ist nicht ganz was ich suche. Ich hab mir jetzt mal eine Version gebastelt die der von Psychobastard ähnelt und ungefähr das macht was ich wollte. Leider sieht es nicht sehr elegant aus.

Vienna 17.02.2011 21:48

Wenn ich dich jetzt richtig verstanden habe möchtest du, dass ein vom Spieler benütztes und beschädigtes Fahrzeug, oder ein Spieler außerhalb eines Fahrzeuges, nach jeweils 4 Sekunden um 10% repariert wird?

Das würde dann so gehen:
Code:

while {true} do
  {
    while {damage vehicle Player > 0} do
      {
        sleep 4;
        vehicle Player setDamage (damage vehicle Player - 0.1)
      };
    sleep 1
  }


spaccy 18.02.2011 00:20

Ich mein das Fahrzeug in das der jeweilige Spieler sitzt, dein Skript ist sehr geil und einfach, danke.

Die Idee war meinen Panzerlevel ein wenig dynamischer zu gestalten.

Die ideale Lösung wär wenn das Repair-Skript erst startet wenn der gegnerische Beschuss, sagen wir mal 10 sek her ist. Die Reparatur sollte dann auch bei einem neuen Treffer unterbrochen werden und erst nach 10 sek wieder neu anfangen zu reparieren.

Vienna 18.02.2011 19:02

Mit dieser Abfrage wirkt die Reparatur nur auf das Fahrzeug des Spielers, und nicht mehr auf den Spieler, wenn er ohne Fahrzeuges ist.

Auch startet die Reparaturschleife immer erst nach 10 Sekunden. Weiters wird sie unterbrochen, wenn sich der Schaden während der Reparatur um mehr als 5% erhöht. Es dauert dann wieder die 10 Sekunden, bis die Reparaturschleife neu startet.

Code:

Private "_d";
while {true} do
  {
    waitUntil {damage vehicle Player > 0 and Player != vehicle Player};
    sleep 10;
    while {damage vehicle Player > 0 and Player != vehicle Player} do
      {
        _d = damage vehicle Player * 1.05;
        sleep 4;
        if (damage vehicle Player > _d ) exitWith {};
        vehicle Player setDamage (damage vehicle Player - 0.1)
      }
  }

Es ist in Zukunft angebracht, wenn du deine Vorstellungen gleich ordentlich beschreibst!

spaccy 18.02.2011 19:24

Oha, das ist mir mit dem Vehicle Player vorher gar nicht aufgefallen. Danke dir nochmal für deine Arbeit. Genau das was ich suchte. :daumen: *prost*

Vienna 18.02.2011 19:32

Ich sehe gerade einen Fehler. In der Zeile

_d = damage vehicle Player * 1,05;

muss das Komma ein Punkt sein!

spaccy 18.02.2011 20:42

Noch eine Frage, welche Funktion hat "Private" eigentlich?
(in deinem Script -> Private "_d")

Vienna 19.02.2011 00:42

Unter bestimmten Voraussetzungen können lokale Variable, mit mit gleichem Namen in vermeintlich getrennten Routinen, zu falschen Ergebnissen führen. Um das zu vermeiden ist es sinnvoll, die lokalen Variablen von allen eigenständigen Routinen mit "Private" zu deklarieren.
private - Bohemia Interactive Community

Die Variablen werden üblicherweise gleich am Beginn der Programmroutinen deklariert, wodurch auch leichter ersichtlich ist, welch Variablen im Programm verwendet werden.

spaccy 19.02.2011 01:36

Cool :naughty:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:05 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