15.02.2011, 22:33 | #1 (permalink) |
Registriert seit: 22.11.2010
Beiträge: 74
|
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 |
15.02.2011, 23:07 | #2 (permalink) |
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.
__________________
Niemand hat die Absicht eine Tüte zu bauen! ___<<<A3 Wounding System>>>___ |
|
15.02.2011, 23:34 | #3 (permalink) |
Registriert seit: 22.11.2010
Beiträge: 74
|
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? |
15.02.2011, 23:39 | #4 (permalink) |
Registriert seit: 11.03.2005
Ort: HH
Alter: 53
Beiträge: 1.930
|
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; }; |
16.02.2011, 00:33 | #5 (permalink) |
Registriert seit: 22.11.2010
Beiträge: 74
|
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? |
16.02.2011, 16:09 | #6 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
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! } } |
17.02.2011, 18:33 | #7 (permalink) |
Registriert seit: 22.11.2010
Beiträge: 74
|
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.
|
17.02.2011, 21:48 | #8 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
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 } |
18.02.2011, 00:20 | #9 (permalink) |
Registriert seit: 22.11.2010
Beiträge: 74
|
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. |
18.02.2011, 19:02 | #10 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
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) } } Geändert von Vienna (18.02.2011 um 19:32 Uhr). |
19.02.2011, 00:42 | #14 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
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. |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
Themen-Optionen | |
Ansicht | |
|
|
Ähnliche Themen | ||||
Thema | Autor | Forum | Antworten | Letzter Beitrag |
Sidechat ist nur local! | GER_CJ-187 | Editing & Scripting | 11 | 18.11.2010 08:08 |
Anwesenheit (Bedingung) | BIB-ODIN | Editing & Scripting | 15 | 18.10.2010 22:41 |
Problem bei der bedingung anwesenheit | Moerderhoschi | Editing & Scripting | 49 | 03.09.2010 12:52 |
Bedingung und Auslöser in *.sqf??? | GER_CJ-187 | Editing & Scripting | 4 | 23.08.2010 19:55 |
Name als Bedingung | GER_CJ-187 | Editing & Scripting | 0 | 05.06.2010 17:45 |