[Script] mobile Ambulanz Zelte (Fahrzeug)

4 Beiträge / 0 neu
Letzter Beitrag
Bild des Benutzers EinStein
Offline
Last seen: vor 3 Stunden 21 Minuten
UnteroffizierMedien: GoldTrupp: GruenVeteran: Kampagne Justitia Q4 2018
Beigetreten: 17/03/2018 - 15:09
[Script] mobile Ambulanz Zelte (Fahrzeug)

Mahlzeit,

da ich in einer CUP Mission gerne den RHS-Truck mit dem med. Zelt gehabt hätte, habe ich dies jetzt für beliebige Fahrzeuge implementiert und etwas verbessert.
Das grundgerüst ist dem "Joko-Zelt" nachempfunden, welches aber nicht mehr funktioniert hat, auch nur für feste Fahrzeuge griff und nicht nach Classnames ging.

Das Skript fügt ausgewählten Fahrzeugen eine ACE-AddAction zum Zeltaufbau hinzu. Das Zelt ist dann eine medical Facility und kann auch wieder abgebaut werden.

Mit den Neuerungen gibt es etwas (Auf-)Schwung in der Rettungskette / VSS. Das heißt:

  1. können beliebige Fahrzeugtypen med. Zelte mit sich führen
  2. nach dem Aufbau auch wieder wegfahren
  3. auch das Zelt welches durch ein anderes Fahrzeug aufgebaut wurde wieder einpacken
  4. nachgespawnte Fahrzeuge haben standardmäßig auch die Fähigkeit, solange deren Classname in der Liste ist
  5. bereits aufgebaute Zelte können auch eingeladen werden, solange es das richtige Zelt ist (welches auch aufgebaut werden würde)

Wenn jemand dies verwenden möchte:

  1. unter scripts\stein_medicTent_vehicle.sqf einfügen
  2.  in der initPlayerLocal.sqf: [] call compile preprocessFileLineNumbers "scripts\stein_medicTent_vehicle.sqf"; eintragen
  3. ggf. die Liste der Fahrzeuge anpassen (hier sind es alle Land Rover - Ambulanz)
  4. ggf. ein anderes Zelt auswählen
  5. ! nur wenn das Fahrzeug zu Beginn kein Zelt haben soll, muss das Fahrzeug bearbeitet werden. Die Fahigkeit bleibt immer erhalten.

/*
	author: [TTT] EinStein (e.g. by joko // Jonas, Spec (joko_tent))
	first usage: OP Silent Search - Teil 1
	description: adds an ACE-AddAction to specific vehicles to build a tent as a medical facitlity behind the vehicle
	
	Usage (initPlayerLocal.sqf):
	[] call compile preprocessFileLineNumbers "scripts\stein_medicTent_vehicle.sqf";
	
	last Updated: 24.03.2019 by [TTT] EinStein
*/

stein_useAnimation = true;
stein_BuildAnimation = "Acts_carFixingWheel";
stein_BuildTime = 20;
stein_medicTent = "Land_tent_east";
stein_SupportedVehicleClasses = [	"CUP_B_LR_Ambulance_CZ_D",
									"CUP_B_LR_Ambulance_CZ_W",
									"CUP_B_LR_Ambulance_GB_D",
									"CUP_B_LR_Ambulance_GB_W",
									"CFP_B_MLARMY_Land_Rover_Ambulance_01",
									"CFP_B_NAARMY_Land_Rover_Ambulance_01",
									"CFP_B_SDARMY_Land_Rover_Ambulance_01"];

stein_fnc_vehicleHasTent = {
	params ["_target","_caller","_arguments"];
	private _loaded = _target getVariable "hasTent";
	_bool = true;
	if (!_loaded) then {_bool = false;};
	_bool;
}; //return bool

stein_fnc_canDeconstruct = {
	params ["_target","_caller","_arguments"];
	private _arrayVehicles = nearestObjects [(getPos _target), stein_SupportedVehicleClasses, 15];
	_bool = false;
	{
		_loaded = _x getVariable "hasTent";
		if (!_loaded) then {_bool = true;};
	} forEach _arrayVehicles;
	if (_target getVariable "inUse") then {_bool = false;};
	_bool;
}; //return bool

stein_fnc_cancel = {
	(_this select 0) params ["_target","_caller","_arguments"];
	_arguments params ["_variable", "_value"];
	hint "Vorgang abgebrochen";
	_caller switchMove "";
	if (typeOf _target == stein_medicTent) then {
		_target setVariable ["inUse", false, true];
		_arrayVehicles = nearestObjects [(getPos _target), stein_SupportedVehicleClasses, 15];
		private "_vehicle";
		private _ArrayVehicle = [];
		{
			_loaded = _x getVariable "hasTent";
			if (!_loaded) then {_ArrayVehicle pushBack _x};
		} forEach _arrayVehicles;
		_vehicle = _ArrayVehicle select 0;
		[_vehicle, (_vehicle getVariable "fuel")] remoteExec ["setFuel", (owner _vehicle), false];
	}
	else {
		_target setVariable ["hasTent", true, true];
		[_target, (_target getVariable "fuel")] remoteExec ["setFuel", (owner _target), false];
	};
}; //return Code

stein_fnc_deconstructTent = {
	(_this select 0) params ["_target","_caller","_arguments"];
	_arguments params [];
	_arrayVehicles = nearestObjects [(getPos _target), stein_SupportedVehicleClasses, 15];
	private "_vehicle";
	private _ArrayVehicle = [];
	{
		_loaded = _x getVariable "hasTent";
		if (!_loaded) then {_ArrayVehicle pushBack _x};
	} forEach _arrayVehicles;
	_vehicle = _ArrayVehicle select 0;
	hint Format ["Das Zelt wurde in das Fahrzeug;\nRichtung: %1 Grad\nEntfernung: %2 Meter\ngeladen.",
	(round ((getPos _target) getDir (getPos _vehicle))), (round ((getPos _target) distance  (getPos _vehicle)))];
	_vehicle setVariable ["hasTent", true, true];
	deleteVehicle _target;
	_caller switchMove "";
	[_vehicle, (_vehicle getVariable "fuel")] remoteExec ["setFuel", (owner _vehicle), false];
}; //return Code

stein_fnc_deconstruct_progressBar = {
	params ["_target","_caller","_arguments"];
	_arguments params [];
	_target setVariable ["inUse", true, true];
	_arrayVehicles = nearestObjects [(getPos _target), stein_SupportedVehicleClasses, 15];
	private "_vehicle";
	private _ArrayVehicle = [];
	{
		_loaded = _x getVariable "hasTent";
		if (!_loaded) then {_ArrayVehicle pushBack _x};
	} forEach _arrayVehicles;
	_vehicle = _ArrayVehicle select 0;
	_vehicle setVariable ["fuel", (fuel _vehicle), true];
	[_vehicle, 0] remoteExec ["setFuel", (owner _vehicle), false];
	[_vehicle, [0, 0, 0]] remoteExec ["setVelocity", (owner _vehicle), false];
	if (stein_useAnimation) then {_caller playMove stein_BuildAnimation;};
	[stein_BuildTime, _this, stein_fnc_deconstructTent, stein_fnc_cancel, "Baue medizinisches Zelt ab"] call ace_common_fnc_progressBar;
}; //return Code

stein_fnc_buildTent = {
	(_this select 0) params ["_target","_caller","_arguments"];
	_arguments params [];
	private _position = (_target getPos [-10, getDir _target]) findEmptyPosition [2, 10, "Tank"];
	_medicTent = stein_medicTent createVehicle _position;
	_medicTent setVariable ["ace_medical_isMedicalFacility", true, true];
	_medicTent setVariable ["inUse", false, true];
	_caller switchMove "";
	[_target, (_target getVariable "fuel")] remoteExec ["setFuel", (owner _target), false];
}; //return Code

stein_fnc_build_progressBar = {
	params ["_target","_caller","_arguments"];
	_arguments params [];
	private _position = (_target getPos [-10, getDir _target]) findEmptyPosition [2, 10, "Tank"];
	_target setVariable ["hasTent", false, true];
	if (_position isEqualTo []) exitWith {
		hint "Nicht genug Platz zum Aufbau des Zeltes vorhanden.";
		_target setVariable ["hasTent", true, true];
	};
	_target setVariable ["fuel", (fuel _target), true];
	[_target, 0] remoteExec ["setFuel", (owner _target), false];
	[_target, [0, 0, 0]] remoteExec ["setVelocity", (owner _target), false];
	if (stein_useAnimation) then {_caller playMove stein_BuildAnimation;};
	[stein_BuildTime, _this, stein_fnc_buildTent, stein_fnc_cancel, "Baue medizinisches Zelt auf"] call ace_common_fnc_progressBar;
}; //return Code

_buildTent = ["stein_medicTent_build", "Baue medizinisches Zelt auf", "",
	stein_fnc_build_progressBar, stein_fnc_vehicleHasTent
] call ace_interact_menu_fnc_createAction;

_deconstructTent = ["stein_medicTent_deconstruct", "Baue medizinisches Zelt ab", "",
	stein_fnc_deconstruct_progressBar, stein_fnc_canDeconstruct
] call ace_interact_menu_fnc_createAction;

{
	[_x, 0, ["ACE_MainActions"], _buildTent] call ace_interact_menu_fnc_AddActionToClass;
} forEach stein_SupportedVehicleClasses;

[stein_medicTent, 0, ["ACE_MainActions"], _deconstructTent] call ace_interact_menu_fnc_AddActionToClass;

//a3\@ace\addons\ace_medical.pbo\ui\icons\medical_cross.paa (das Icon)

Changelog:

17.01.2019:

  • Funktionsnamen vereinheitlicht
  • Zeit besser an Animationszeit angepasst
  • Zelt wird nun auf das nächstgelegene Fahrzeug aufgeladen (nicht mehr auf das entfernteste)

23.01.2019:

  • im Muliplayer kann man nicht mehr parallel die Actions ausführen

29.01.2019:

  • parallele Nicht-Ausführbarkeit der Actions vollständig implementiert und Synchronität hergestellt

24.03.2019

  • das Fahrzeug wird zum Start der Benutzung angehalten und kann bis zum Beenden oder Abbrechen nicht wegfahren

Bekannte Probleme:

  • das Zelt wird teilweise in Objekten aufgebaut
    • die Befehle können sowohl Map als auch Zeus Objekte erkennen, hierbei aber leider nicht alle (z.B. mache Kisten oder Zelte nicht) und es findet auch leider keine automatische sinnvolle Ausrichtung statt
      • BIS_fnc_findSafePos liefert mir (hingegen der Wiki) keinen defaultPos (Optional). Wenn jemand herausfindet welchen Syntaxfehler ich hatte, gerne Bescheid sagen. Daher ist weiterhin findEmptyPosition in Verwendung.


Bei Verwendungswunsch am besten einmal Fragen, ob ich noch was geändert habe und warum.
Wer etwas anpassen will, kann auch einen der bekannten Skripter fragen, gerne auch mich.

Viel Spaß damit.

Mit Besten Grüßen
EinStein

Bild des Benutzers Freddy Bacon
Offline
Last seen: vor 11 Stunden 3 Minuten
UnteroffizierTrupp: WeißVeteran: Kampagne Justitia Q4 2018
Beigetreten: 01/02/2018 - 11:47

Vielen lieben Dank Stein.

Das ist genau das richtige für einen BAT nach meinem Geschmack, bestehend aus mehreren Elementen mit der Flexibilität die im Einsatz benötigt wird.

Ich hoffe dass es die Missionsbauer nutzen werden. Das ist eine klasse Antwort auf die Schwierigkeiten in der Rettungskette und dann auch noch mit geringem Aufwand an alle Fraktionen anpassbar. Damit kann das medizinische Personal "bodenständig" bleiben und muss nicht immer bei jedem CAT Alpha gleich "in die Luft gehen" ^^

Super Arbeit! Ist für meine erste Mission gebucht ;)

Bild des Benutzers LittleBassman
Offline
Last seen: vor 21 Minuten 23 Sekunden
UnteroffizierVeteran: Kampagne Solomon Q4 2017Veteran: Kampagne Justitia Q4 2018
Beigetreten: 06/09/2016 - 23:59

Sehr coole Sache! Baue ich gerne ein.

Danke für die Arbeit! Bin gespannt, wie es funktioniert....

Disziplin ist die ganze Seele der Armee

Bild des Benutzers Wittmann
Offline
Last seen: vor 1 Tag 4 Stunden
VeteranTrupp PlatinVeteran: Kampagne Solomon Q4 2017Veteran: Kampagne Justitia Q4 2018
Beigetreten: 17/07/2017 - 09:26

Werde es auch benutzen. Danke!