Armed-Assault.de Twitter
 
 
Themen-Optionen Ansicht
Alt 06.03.2013, 17:12   #1 (permalink)
500 Beiträge1000 Beiträge
 
Registriert seit: 05.01.2008
Alter: 32
Beiträge: 1.703
Standard Bereiche einnehmen - Wie geht das?

Hallo zusammen,

mit dem Start von Arma 3 wollte ich mich auch mal ein bisschen mit dem Editor spielen.
Da kam mir eine ganz tolle Idee, die aber jetzt an der Umsetzung scheitert. Ich möchte eine Mission bauen in der 2 Teams um bestimmte Punkte auf der Karte kämpfen (Ich weiß ist wie AAS). Ich bin im Moment schon so weit, dass die Bereiche eingenommen werden können. Jetzt fehlt mir aber einfach das Wissen um ein Script zu schreiben was von Anfang an den Status meiner Zonen überwacht. Die Logik ist mir klar, aber ich habe keine Ahnung wie ich das anstellen soll.
Um es mal ganz präzise auszudrücken:
Ich brauche ein oder mehrere Scripte die meine Zonen verwalten, also ist die Zone eingenommen (von wem?), wird angegriffen (von wem?) oder neutral.

So weit bin ich bis jetzt:
Code:
_trigger = _this select 0;
_timeToCapture = _this select 1;
_zoneMarker = _this select 2;
_zoneName = _this select 3;
_showNumber = _this select 4;

_captureSpeed = 1;
_timer = 0;
_modifiedTime = _timeToCapture;
_capturedBy = "";

while {( true )} do {
	sleep 1;
	
	_bluforUnits = west countSide (list _trigger);
	_opforUnits = east countSide (list _trigger);
	_modifiedTime = _timeToCapture;
	//Debug
		if(_showNumber) then { player sidechat format["Blufor units: %1, Opfor units: %2", _bluforUnits, _opforUnits] };
	
	if((_bluforUnits > 0) or ( _opforUnits > 0)) then {

		if((_bluforUnits > _opforUnits) && (_capturedBy != "BLUFOR")) then {
			_captureSpeed = _bluforUnits - _opforUnits;
			if( _captureSpeed != 0) then { _modifiedTime = _modifiedTime / _captureSpeed };
			if(_timer < _modifiedTime) then {
				_zoneMarker setmarkerColor "ColorYellow";
				_zoneMarker setMarkerText format["%1 is under attack", _zoneName];
				if(_timer == 0) then { player sidechat format["%1 is under attack", _zoneName]; };
				_timer = _timer +1;
			}
			else {
				_zoneMarker setMarkerColor "ColorBlue";
				_zoneMarker setMarkerText format["%1 is held by BLUFOR", _zoneName];
				player sidechat format["%1 was captured by BLUFOR", _zoneName];
				_timer = 0;
				_capturedBy = "BLUFOR";
			};
		}
		else {
			if((_opforUnits > _bluforUnits) && (_capturedBy != "OPFOR")) then {
				_captureSpeed = _opforUnits - _bluforUnits;
				if( _captureSpeed != 0) then { _modifiedTime = _modifiedTime / _captureSpeed };
				if(_timer < _modifiedTime) then {
					_zoneMarker setmarkerColor "ColorYellow";
					_zoneMarker setMarkerText format["%1 is under attack", _zoneName];
					if(_timer == 0) then { player sidechat format["%1 is under attack", _zoneName]; };
					_timer = _timer +1;
				}
				else {
					_zoneMarker setMarkerColor "ColorRed";
					_zoneMarker setMarkerText format["%1 is held by OPFOR", _zoneName];
					player sidechat format["%1 was captured by OPFOR", _zoneName];
					_timer = 0;
					_capturedBy = "OPFOR";
				};
			};
		};
	};
};
Am Ende des Scriptes müsste dann ein Aufruf an mein Hauptscript kommen um die Zone auf "eingenommen" zu setzen.


Und als zweites gibt es ein else if? Ich hab in den Scripting Commands nur if oder else gefunden.

Geändert von JoeJoe87577 (06.03.2013 um 18:18 Uhr).
JoeJoe87577 ist offline  
Alt 06.03.2013, 20:58   #2 (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

Wie man sieht bist du beim Programmieren kein Anfänger. So wie du dir das vorstellst müsste es funktionieren: Vergleichen wer in der Trigger-Liste ist, entsprechend die Marker umfärben und das Ergebnis bewerten.

Dein Skript ist ja für mehrere Zonen verwendbar. Für ein Gesamtergebnis baust du noch globale Variable (ohne Unterstrich beginnend) ein. Diese sind in allen Skripten sicht- und änderbar.

Es ist möglich unterschiedliche globale Variable mit einem Skript anzusprechen, wenn du den Namen der jeweiligen Variablen als String übergibst. Wie das geht siehe hier Post # 9 und 10: Lokale Variable für client erstellen?

Die Skripte sollen nur beim Server/Host laufen. Die Ergebnisse und Textausgaben musst du mit publicVariable oder MP-EventHandler zu den Clients übertragen.

Der hier reingestellte Code sollte gut lesbar sein.
Die Tabs durch Leerzeichen ersetzen.
Überflüssige Klammern und Strichpunkte vermeiden.
Nach der letzten Codezeile in einem Block kein Strichpunkt, wenn keine "Befehls-Zeile" mehr nachfolgt. Auch nach einem Block nicht.
Siehe unten deinen Code.

Kommentare verbessern die Lesbarkeit.

Die lokalen Variablen mit private anmelden.

else if gibt es nicht. Hier eine Übersicht: http://community.bistudio.com/wiki/Control_Structures

Code:
private ["_trigger","_timeToCapture","_zoneMarker","_zoneName","_showNumber","_captureSpeed","_timer","_modifiedTime","_capturedBy"];

_trigger       = _this select 0;
_timeToCapture = _this select 1;
_zoneMarker    = _this select 2;
_zoneName      = _this select 3;
_showNumber    = _this select 4;

_captureSpeed  = 1;
_timer         = 0;
_modifiedTime  = _timeToCapture;
_capturedBy    = "";

while {true} do
 {
  sleep 1;
  
  _bluforUnits  = west countSide (list _trigger);
  _opforUnits   = east countSide (list _trigger);
  _modifiedTime = _timeToCapture;

  //Debug
  if (_showNumber) then {player sidechat format["Blufor units: %1, Opfor units: %2", _bluforUnits, _opforUnits]};
  
  if (_bluforUnits > 0 or _opforUnits > 0) then
   {
    if (_bluforUnits > _opforUnits && _capturedBy != "BLUFOR") then
     {
      _captureSpeed = _bluforUnits - _opforUnits;
      if (_captureSpeed != 0) then {_modifiedTime = _modifiedTime / _captureSpeed};
      if (_timer < _modifiedTime) then
       {
        _zoneMarker setmarkerColor "ColorYellow";
        _zoneMarker setMarkerText format["%1 is under attack", _zoneName];
        if (_timer == 0) then {player sidechat format["%1 is under attack", _zoneName]};
        _timer = _timer +1
       }
      else
       {
        _zoneMarker setMarkerColor "ColorBlue";
        _zoneMarker setMarkerText format["%1 is held by BLUFOR", _zoneName];
        player sidechat format["%1 was captured by BLUFOR", _zoneName];
        _timer = 0;
        _capturedBy = "BLUFOR"
       }
     }
    else
     {
      if (_opforUnits > _bluforUnits && _capturedBy != "OPFOR") then
       {
        _captureSpeed = _opforUnits - _bluforUnits;
        if (_captureSpeed != 0) then { _modifiedTime = _modifiedTime / _captureSpeed };
        if (_timer < _modifiedTime) then
         {
          _zoneMarker setmarkerColor "ColorYellow";
          _zoneMarker setMarkerText format["%1 is under attack", _zoneName];
          if (_timer == 0) then { player sidechat format["%1 is under attack", _zoneName]; };
          _timer = _timer +1
         }
        else
         {
          _zoneMarker setMarkerColor "ColorRed";
          _zoneMarker setMarkerText format["%1 is held by OPFOR", _zoneName];
          player sidechat format["%1 was captured by OPFOR", _zoneName];
          _timer = 0;
          _capturedBy = "OPFOR"
         }
       }
     }
   }
 }
Vienna ist offline  
Alt 06.03.2013, 22:10   #3 (permalink)
500 Beiträge1000 Beiträge
 
Registriert seit: 05.01.2008
Alter: 32
Beiträge: 1.703
Standard

Ah, vielen Dank dafür. Die Ausbildung zum Fachinformatiker hinterlässt halt doch Spuren. Deshalb hat mich auch diese Verschachtelung von if else Abfragen gestört. Ich werde mir morgen mal Zeit nehmen und ein bisschen mit Public Variablen spielen.

Eine weitere Frage habsch noch .
Kann ich einem Dialog den ich mit createDialog aufrufe eine Variable mitgeben= Ich möchte einen Dialog haben in dem dem Spieler ein paar Klassen zur Auswahl stehen aus denen er wählen kann. Wenn diese dann gewählt sind soll er mit dem entsprechenden Zeug bewaffnet werden (Bewaffnung ist kein Problem, nur die Classname Listen sind noch unvollständig).
Per addAction an eine Munikiste ist das ganze kein Problem, da kann ich ja raussuchen wer da angefragt hat. Aber einen Dialog kann ich ja (nach dem BI WIki) nicht mit Parametern aufrufen, oder irre ich da?
JoeJoe87577 ist offline  
Alt 07.03.2013, 00:47   #4 (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

Du kannst im Dialog eine Auswahl zur Verfügung stellen. Über Skripte ist ein Zugriff auf den Dialog möglich.

Die Mission Warfare verwendet so einen Dialog wie du ihn erstellen willst. Da kannst du dir sicher was abschauen. Wie man .pbo Dateien entpackt wirst du ja schon wissen?

http://community.bistudio.com/wiki/Dialog_Control
http://community.bistudio.com/wiki/U...Editor_(Arma_2)

Dialog tutorial by Iceman77 - Editing and Scripts - Armaholic
Über Google findest sicher noch was.
Vienna 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


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