Hier möchte ich euch Unsere Neue Progress bar Geben die Funktionsweise ähnelt der von ACE3
Warum Schwierigkeitsgrad 4 ?
Naja das Ganze funktioniert fast wie bei der ACE3 Progress bar und hat daher auch ein Par Tücken
Außerdem setzt ich hier Ein gewissen Grund Verständnis voraus
aber um das ganze ersichtlich zu machen zeig ich euch erstmal wie ihr die Einbaut
Das Tutorial Orientiert sich an der Version 4.4.R4 aber sollte in Jeder Version gehn
Fangen wir an Öffnen eure
Function.hpp
und tragt ganz am Ende Folgendes ein
class RL_System
{
tag = "RL";
class functions
{
file = "core\functions";
class progressBar {};
};
};
Dan erstellt ihr im Ordner core\functions ein Datei mit dem Namen
fn_progressBar.sqf und Folgendem Inhalt
/*
* Author: br1zey/Ryu
* Special Thanks to ACE3 and Exile Team
* Draw progress bar and execute given function if succesful.
* Finish/Failure/Conditional are all passed [_args]
*
* Arguments:
* 0: NUMBER - Total Time (in game "time" seconds)
* 1: ARRAY - Arguments, passed to condition, fail and finish
* 2: CODE or STRING - On Finish: Code called or STRING raised as event.
* 3: CODE or STRING - On Failure: Code called or STRING raised as event.
* 4: STRING - (Optional) Localized Title
* 5: CODE - (Optional) Code to check each frame
* 6: ARRAY - (Optional) Animation to play , Animation playtime
*
*
* Return Value:
* Nothing
*
* Example:
*
* [5,[] {Hint "Finished!"}, {hint "Failure!"},"My Title", {true}, ["default",0]] spawn rl_fnc_progressBar
*
*/
private["_progress","_startTime","_sleepTime","_display","_label","_progressBarBackground","_progressBarMaxSize","_progressBar","_totalTime","_onFinish", "_onFail","_localizedTitle","_return","_condition","_lastAnimStart"];
disableSerialization;
params [
"_totalTime",
["_args",[]],
"_onFinish",
"_onFail",
["_localizedTitle", ""],
["_condition", {true}],
["_animArr",[],[["default",0]]]
];
_progress = 0;
_startTime = diag_tickTime;
_sleepTime = _totalTime / 100;
_defaultVehicle = (vehicle player);
//close all Dialogs
closeDialog 0;
("RLActionProgressLayer" call BIS_fnc_rscLayer) cutRsc ["RscRLActionProgress", "PLAIN", 1, false];
createDialog "ProgressBar_Dialog";
private _anim = (_animArr select 0);
private _animTime = (_animArr select 1);
if(_anim isEqualTo "default")then{
_anim = "AinvPknlMstpSnonWnonDnon_medic_1";
_animTime = 5.882;
};
if(! (_anim isEqualTo ""))then{
[player,_anim,true] remoteExecCall ["life_fnc_animSync",-2];
player switchMove _anim;
player playMoveNow _anim;
};
private _lastAnimStart = time;
_display = uiNamespace getVariable "RscRLActionProgress";
_label = _display displayCtrl 4002;
_label ctrlSetText format ["0% - %1",_localizedTitle];
_progressBarBackground = _display displayCtrl 4001;
_progressBarBackground ctrlSetBackgroundColor [0, 0, 0, 0.5];
_progressBarMaxSize = ctrlPosition _progressBarBackground;
_progressBar = _display displayCtrl 4000;
_progressBar ctrlSetPosition [_progressBarMaxSize select 0, _progressBarMaxSize select 1, 0, _progressBarMaxSize select 3-0.01];
_progressBar ctrlSetBackgroundColor [0, 0.5, 1, 1];
_progressBar ctrlCommit 0;
_progressBar ctrlSetPosition _progressBarMaxSize;
_progressBar ctrlCommit _totalTime;
try
{
while {_progress < 1} do{
if !(alive player) then{
throw false;
};
if !(dialog) then{
throw false;
};
if (!([_args,(time - _startTime),_totalTime] call _condition)) then {
throw false;
};
if(! (_anim isEqualTo "") && time >= (_lastAnimStart + _animTime))then{
[player,_anim,true] remoteExecCall ["life_fnc_animSync",-2];
player switchMove _anim;
player playMoveNow _anim;
};
uiSleep _sleepTime;
_progress = ((diag_tickTime - _startTime) / _totalTime) min 1;
_label ctrlSetText format["%1%2 - %3", round (_progress * 100), "%",_localizedTitle];
};
throw true;
}
catch
{
_progressBarColor = [];
if(_exception) then {
_args call _onFinish;
_return = true;
_progressBarColor = [0.7, 0.93, 0, 1];
}else{
_args call _onFail;
_return = false;
_progressBarColor = [0.91, 0, 0, 1];
};
_progressBar ctrlSetBackgroundColor _progressBarColor;
_progressBar ctrlSetPosition _progressBarMaxSize;
_progressBar ctrlCommit 0;
};
("RLActionProgressLayer" call BIS_fnc_rscLayer) cutFadeOut 2;
closeDialog 24025;
Alles anzeigen
jetzt nur noch im Ordner dialog ein Datei erstellen mit dem Namen
RL_progress.hpp
class ProgressBar_Dialog {
idd = -1;
movingEnable = false;
objects[] = {};
class controlsBackground {
class Background {
idc = 24025;
moving = 0;
font = "TahomaB";
text = "";
sizeEx = 0;
lineSpacing = 0;
access = 0;
type = 0;
style = 0;
size = 1;
colorBackground[] = {0, 0, 0, 0.0};
colorText[] = {0, 0, 0, 0};
x = "safezoneX";
y = "safezoneY";
w = "safezoneW";
h = "safezoneH";
};
};
};
class RscRLActionProgress
{
idd=24026;
onLoad="uiNamespace setVariable ['RscRLActionProgress', _this select 0];";
onUnload="uiNamespace setVariable ['RscRLActionProgress', displayNull]";
movingEnable = false;
duration=999999;
class controls {
class Background: Life_RscText {
idc = -1;
moving = 0;
font = "TahomaB";
text = "";
sizeEx = 0;
lineSpacing = 0;
access = 0;
type = 0;
style = 0;
size = 1;
x = 0;
y = -0.03;
w = 1;
h = 0.03;
colorBackground[] = {0, 0, 0, 0.7};
};
class ProgressBackground: Life_RscText {
idc = 4001;
x = 0.01;
y = -0.02;
w = 0.98;
h = 0.01;
colorBackground[] = {0, 0, 0, 0.5};
};
class Progress: Life_RscText {
idc = 4000;
x = 0.01;
y = -0.02;
w = 0.98;
h = 0.01;
colorBackground[] = {0, 0.5, 1, 1};
};
class Label: Life_RscText {
idc = 4002;
x = 0;
y = -0.08;
w = 1;
h = 0.04;
colorBackground[]={0,0,0,0};
style = 1;
sizeEx = 0.04;
colorText[]={1,1,1,1};
text = "";
};
};
};
Alles anzeigen
und in der decription.ext bei RscTitles unter #include "dialog\hud_stats.hpp"
#include "dialog\RL_progress.hpp"
und in der dialog\masterhandler.hpp noch
#include "RL_progress.hpp"
eintragen
das war es auch Schon.
Jetzt zu klein Erklärung
Man kann damit z.b. Scripte aufrufen die beim Finish oder beim Abbrechen aufgerufen werden dabei kann man aber die Parameter nicht 1:1 mit geben
mach ich mal ein Beispiel
[5,[_vehicle,player], {[_this select 0] call life_fnc_Repair}, {hint format["",(name _this select 1)]}, "My Title",{!(alive player)},["default",0]] spawn rl_fnc_progressBar;
1: Gibt die Zeit in Sekunden an die die Progressbar zum Durchlaufen braucht
2: Sind Parameter die die z.b. Beim Finisch oder Failn fürs Aufrufen von Datein z.b. dort trage ich ein [_vehicle,player] dan wäre das im code [_this select 0,_this select 1]
3: Dort kan man ein code eintragen der Ausgeführt wird wenn die Progressbar Durchgelaufen ist.
4: Selbe wie 3 Nur das der Code Beim Abbreruch ausgefürt wird.
5: Text der in der Progressbar Angezeigt wird.
6: Code der bei jedem % Gechekt wird z.b. {!(alive player)}
7: Array für die Animation ["AnimationName",Zeit der Animation] z.b. ["AinvPknlMstpSnonWnonDnon_medic_1",5.882]
Man kann auch ["default",0] eintragen dan kommt die Animation wie Beim Auto Reparieren von Altis als Standart oder man macht ["",0] dan ist keine Animation vorhanden .
Alles anzeigen
Wenn ihr Verbesserungen habt gerne her damit Ich habe es nur aus den grund erstellt da mit Tonic sein Progressbar System nicht sonderlich Gefallen hat
Hier Noch ein Beispiel wie der Aufbau im Script sein müsste Anhand der fn_truckRepair.sqf von AL v5.0
#include "..\..\script_macros.hpp"
/*
File: fn_repairTruck.sqf
Author: Bryan "Tonic" Boardwine
Description:
Main functionality for toolkits, to be revised in later version.
*/
private ["_veh","_upp","_ui","_progress","_pgText","_cP","_displayName","_test","_sideRepairArray"];
_veh = cursorObject;
life_interrupted = false;
if (isNull _veh) exitWith {};
if ((_veh isKindOf "Car") || (_veh isKindOf "Ship") || (_veh isKindOf "Air")) then {
if (life_inv_toolkit > 0) then {
life_action_inUse = true;
_displayName = FETCH_CONFIG2(getText,"CfgVehicles",(typeOf _veh),"displayName");
_upp = format [localize "STR_NOTF_Repairing",_displayName];
inner_fnc_repair = {
params [
["_veh",objNull,[objNull]]
];
life_action_inUse = false;
_sideRepairArray = LIFE_SETTINGS(getArray,"vehicle_infiniteRepair");
//Check if playerSide has infinite repair enabled
if (playerSide isEqualTo civilian && (_sideRepairArray select 0) isEqualTo 0) then {
[false,"toolkit",1] call life_fnc_handleInv;
};
if (playerSide isEqualTo west && (_sideRepairArray select 1) isEqualTo 0) then {
[false,"toolkit",1] call life_fnc_handleInv;
};
if (playerSide isEqualTo independent && (_sideRepairArray select 2) isEqualTo 0) then {
[false,"toolkit",1] call life_fnc_handleInv;
};
if (playerSide isEqualTo east && (_sideRepairArray select 3) isEqualTo 0) then {
[false,"toolkit",1] call life_fnc_handleInv;
};
_veh setDamage 0;
titleText[localize "STR_NOTF_RepairedVehicle","PLAIN"];
};
[5,[_veh], {_this call inner_fnc_repair},{hint "Abbgebrochen"},"Repariere",{true},["default",0]] spawn rl_fnc_progressBar
}else{
hint "Du hast keinen Werkzeugkasten"
};
};
Alles anzeigen