Armed-Assault.de Twitter
 
 
Themen-Optionen Ansicht
Alt 15.02.2011, 22:33   #1 (permalink)
50 Beiträge
 
Registriert seit: 22.11.2010
Beiträge: 74
Standard 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
spaccy ist offline  
Alt 15.02.2011, 23:07   #2 (permalink)
500 Beiträge1000 Beiträge
 
Benutzerbild von Pfandgiraffe
 
Registriert seit: 16.09.2008
Ort: Berlin
Alter: 38
Beiträge: 1.737
Pfandgiraffe eine Nachricht über ICQ schicken Pfandgiraffe eine Nachricht über Skype™ schicken
Standard

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>>>___
Pfandgiraffe ist offline  
Alt 15.02.2011, 23:34   #3 (permalink)
50 Beiträge
 
Registriert seit: 22.11.2010
Beiträge: 74
Standard

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?
spaccy ist offline  
Alt 15.02.2011, 23:39   #4 (permalink)
10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von Buliwyf
 
Registriert seit: 11.03.2005
Ort: HH
Alter: 52
Beiträge: 1.930
Standard

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;
};
__________________
Buliwyf ist offline  
Alt 16.02.2011, 00:33   #5 (permalink)
50 Beiträge
 
Registriert seit: 22.11.2010
Beiträge: 74
Standard

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?
spaccy ist offline  
Alt 16.02.2011, 16:09   #6 (permalink)
SQF Zauberer 10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von Vienna
 
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
Standard

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
Angehängte Dateien
Dateityp: zip Reparatur_automatisch-utes.zip (1,9 KB, 44x aufgerufen)
Vienna ist offline  
Alt 17.02.2011, 18:33   #7 (permalink)
50 Beiträge
 
Registriert seit: 22.11.2010
Beiträge: 74
Standard

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.
Angehängte Dateien
Dateityp: zip repair.zip (496 Bytes, 35x aufgerufen)
spaccy ist offline  
Alt 17.02.2011, 21:48   #8 (permalink)
SQF Zauberer 10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von Vienna
 
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
Standard

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
  }
Vienna ist offline  
Alt 18.02.2011, 00:20   #9 (permalink)
50 Beiträge
 
Registriert seit: 22.11.2010
Beiträge: 74
Standard

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.
spaccy ist offline  
Alt 18.02.2011, 19:02   #10 (permalink)
SQF Zauberer 10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von Vienna
 
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
Standard

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!

Geändert von Vienna (18.02.2011 um 19:32 Uhr).
Vienna ist offline  
Alt 18.02.2011, 19:24   #11 (permalink)
50 Beiträge
 
Registriert seit: 22.11.2010
Beiträge: 74
Standard

Oha, das ist mir mit dem Vehicle Player vorher gar nicht aufgefallen. Danke dir nochmal für deine Arbeit. Genau das was ich suchte.
spaccy ist offline  
Alt 18.02.2011, 19:32   #12 (permalink)
SQF Zauberer 10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von Vienna
 
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
Standard

Ich sehe gerade einen Fehler. In der Zeile

_d = damage vehicle Player * 1,05;

muss das Komma ein Punkt sein!
Vienna ist offline  
Alt 18.02.2011, 20:42   #13 (permalink)
50 Beiträge
 
Registriert seit: 22.11.2010
Beiträge: 74
Standard

Noch eine Frage, welche Funktion hat "Private" eigentlich?
(in deinem Script -> Private "_d")
spaccy ist offline  
Alt 19.02.2011, 00:42   #14 (permalink)
SQF Zauberer 10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von Vienna
 
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
Standard

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.
Vienna ist offline  
Alt 19.02.2011, 01:36   #15 (permalink)
50 Beiträge
 
Registriert seit: 22.11.2010
Beiträge: 74
Standard

Cool
spaccy ist offline  
 


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ä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


Kontakt - HX3.de - Archiv - Nach oben

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