PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bereiche einnehmen - Wie geht das?


JoeJoe87577
06.03.2013, 17:12
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:
_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.

Vienna
06.03.2013, 20:58
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: http://hx3.de/editing-scripting-167/lokale-variable-fuer-client-erstellen-22266/#post443144

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


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"
}
}
}
}
}

JoeJoe87577
06.03.2013, 22:10
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 :D.
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?

Vienna
07.03.2013, 00:47
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/User_Interface_Editor_(Arma_2)

Dialog tutorial by Iceman77 - Editing and Scripts - Armaholic (http://www.armaholic.com/page.php?id=18362)
Über Google findest sicher noch was.