Beiträge von Lucian
-
-
Poste mal die SoundCfg, wo die Sounds Lokal in der Mission definiert werden.
-
Würde niemals ein ganzes Bild nehmen. Würde mehrere Elemente als einzelne Bilder nehmen. Grund dafür, sind verschiedene Auflösungen.
-
say3D muss über remoteExec ausgeführt werden.
-
Probiere es aus.
Habe das auch einfach gemacht und es geht.
-
Versuche mal den Befehl. Da wird auch ragdoll geforced
-
mal als anhang das mann weniger testen muss, eine kleine Tabelle der Farben mit den Werten für RGBA
Das wird nicht gehen. Da Arma zwar RGBA hat aber nur von 0-1.
Benutzt dann lieber KK's blog – HEX 2 ArmA GUI Colour Converter -
Alo an jedes der gewünschten meldungen call life_fnc_notification_system; anfügen?
NEIN, mein Gott.
Wenn ihr die Basics nicht versteht lasst es.
Jede Funktion/Befehl in Arma hat Parameter.
Und bei meiner Funktion sind es die Folgenden:Code0: Text <STRING> 1: Type <BOOLEAN> false = noError true = Error 2: Speed <STRING> fast = fadeout nach 5 sek, slow = fadeout nach 15 sek
Wenn ihr die nicht versteht kann ich euch nur Empfehlen evt. nicht gleich mit einem Framework wie Altis Life anzufangen.
Ich erkläre jetzt einmal was, wo und wie die Parameter genau sind.
Was ist ein Parameter?
Ein Parameter ist ein Wert, der die Funktionsweise einer Funktion verändert, ähnlich wie in der Mathematik.
Bei meiner Funktion haben wir drei Parameter.Wo ist ein Parameter?
Einen Parameter schreibt man meistens bei Funktionen in einen Array (WAS IST EIN VERDAMMTER ARRAY ????!!??) an den angegebenen Index, außer es handelt sich um eine Funktion, die nur einen Parameter hat dann kann es vorkommen das man den Parameter direkt schreibt. Danach wird ein Call oder Spawn kommen je nachdem, wie man die Funktion ausführen will. Und zu guter letzt kommt die Funktion.
Bei meiner Funktion haben wir drei Parameter. D.h. einen Array mit drei Feldern, die die Indexe 0,1,2 haben. Wie man anhand meines ersten Postes sieht, ist auf dem Index 0 der Text, welcher als Datentyp ein String sein muss (UND WAS BITTE IST JETZT EIN STRING !?). Darauf folgt der Type als Boolean(...???) mit dem Index 1, bei mir ist true eine Error MSG und false eine normale MSG. Und auf dem Index 3 kommt der Speed ebenfalls als String, "fast" für schnelles Fadeout "slow" für langsames.
Danach kommt ein call, warum? weil das so ist und ich jetzt kb. habe euch zu erklären was der Unterschied zwischen Call und Spawn ist.
Und dann kommt schon life_fnc_notification_system.
Bsp:
Wir haben eine Fehler/Error Meldung die wir LANGE anzeigen wollen mit dem Text "Ey, du hast da was falsch gemacht".
Also sollte die Funktion so aussehen ["Ey, du hast da was falsch gemacht",true,"slow"] call life_fnc_notification_systemWIE PARAMETER TEXT, ICH HABE DA SO PAAR BEFEHLE?
Yay, du bist auf String-Befehle gestoßen, die Werte an einer bestimmten Stelle einfügen wie format oder die Strings aus der Stringtabel raussuchen wie localize.
Es gibt noch viele weitere String-Befehle, wichtig ist nur das diese Befehle einen String als Rückgabewert haben.Soooooooooooooooooooooooooooooooooo
Wer es immer noch nicht verstanden hat, sollte erstmal ein "Hello, World" oder so machen oder sich einfach mal das BI Wiki anschauen und bei den DatenTypen, Strukturelementen etc. anfangen. Oder hier schauen
Smart Tactics
DevTeam Paxton
Feuerex -
Code
Alles anzeigenBSP. 1 private _headerColor = if (_error) then { [0.538433,0,0,0.8];//<--- ERROR FARBE HIER ROT } else { [(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843]),(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019]),(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862]),(profilenamespace getvariable ['GUI_BCG_RGB_A',0.7])]; //<-- DEF. FARBE, HIER DIE FARBE DES CLIENTS }; BSP. 2 private _headerColor = if (_error) then { [0.538433,0,0,0.8];//<--- ERROR FARBE HIER ROT } else { [1,1,0,1]; //<-- DEF. FARBE, HIER GELB };
-
Code
private _headerColor = if (_error) then { [0.538433,0,0,0.8]; } else { [(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843]),(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019]),(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862]),(profilenamespace getvariable ['GUI_BCG_RGB_A',0.7])]; };
_headerColor gibt an welche Farbe der Header hat.
Einmal als error Farbe Rot und einmal als standard Farbe die User-Color.
Wenn du jetzt eine andere standard Farbe willst, änderst du den Array. -
Finde ich sinnlos und auch etwas fragwürdig, da man entweder die Profil-Datei schreibgeschützt machen kann und somit kann Arma das nicht ändern oder man ändert es nach dem man auf dem Server ist wieder um.
Zu dem, kann man man auch einfach die Farbe in den entsprechenden Dialogen einstellen. -
Wirklich ne schöne Sache
Funktioniert mit @blackfisch seiner Änerung hervorragend in der Version 4.0!
Besten Dank für das System.
Kleine Frage hätte ich. Ich bin mit den Dialogen absolut nicht fitt. Und würde gerne die Nachrichten nicht links auf dem Monitor haben sondern rechts. Was muß ich denn da ändern, so dass die Nachrichten rechts erscheinen?
Du musst die X Kord raus finden und in ctrlSetPosition ändern.
Aber kp was die X Kord für rechts ist, habe das System eh neu geschrieben, da kann man das Teil verschieben und der Client kann sich die Position aussuchen wo er die MSGs haben will. -
Weil das im GIF mehrere Nachrichten auf einmal sind.
-
Allerdings ist das von Gestern
-
Bin auf eurem LYL Ts
-
Code: basic.cfg
Alles anzeigenlanguage = "German"; MaxMsgSend = 1024; MaxSizeGuaranteed = 1224; MaxSizeNonguaranteed = 512; MinBandwidth = 768000; MaxBandwidth = 12582912; MinErrorToSend = 0.005; MinErrorToSendNear = 0.05; MaxCustomFileSize = 0; class sockets{maxPacketSize = 1400;}; adapter=-1; 3D_Performance=1; Resolution_W=0; Resolution_H=0; Resolution_Bpp=32; terrainGrid=50.0; viewDistance=2000; Windowed=0;
MissionObjekte:
count allMissionObjects "All"; = 5122
ASM Screenshot werde ich versuchen heute Abend zu machen. -
Da ich faul bin
Hardware:
Dedicated Server MC-64-OC | Reihe GAME - OVH
Anbindung:
1 Gbit/s -
Hallo NN,
wir haben seit einigen Tagen das Problem, dass BE bei ca. 120+ Spielern anfängt alle Spieler mit "Client not Responding" zu kicken.
Meine Vermutung ist, dass die Netzwerkauslastung für den ArmaServer zu groß ist und Arma an einem bestimmten Punkt die Verbindung zu allen Spielern verliert, was dazu führt, dass BE alle mit "Client not Responding" kickt.
In den RPT Logs des Servers sind vermehrt diese Einträge zu finden, wenn BE anfängt die Spieler zu kicken:Code
Alles anzeigen18:15:47 Server: Network message 2855ff8 is pending 18:15:47 Server: Network message 2855ff9 is pending 18:15:47 Server: Network message 2855ff9 is pending 18:15:47 Server: Network message 2855ff9 is pending 18:15:47 Server: Network message 2856420 is pending 18:15:49 Server: Network message 2856a70 is pending 18:15:49 Server: Network message 2856a70 is pending 18:15:49 Server: Network message 2856a71 is pending 18:15:49 Server: Network message 2856a72 is pending 18:15:58 Server: Network message 28586fb is pending 18:15:58 Server: Network message 2858955 is pending 18:15:58 Server: Network message 2858955 is pending 18:15:58 Server: Network message 2858955 is pending 18:15:58 Server: Network message 2858956 is pending 18:15:58 Server: Network message 2858956 is pending 18:15:58 Server: Network message 2858956 is pending 18:15:58 Server: Network message 285895d is pending 18:15:58 Server: Network message 285895d is pending 18:15:58 Server: Network message 285895d is pending
und diese etwas später:Code
Alles anzeigen18:15:59 NetServer::SendMsg: cannot find channel #1960263011, users.card=50 18:15:59 NetServer: users.get failed when sending to 1960263011 18:15:59 Message not sent - error 0, message ID = ffffffff, to 1960263011 (Tracy Miller) 18:15:59 NetServer::SendMsg: cannot find channel #1960263011, users.card=50 18:15:59 NetServer: users.get failed when sending to 1960263011 18:15:59 Message not sent - error 0, message ID = ffffffff, to 1960263011 (Tracy Miller) 18:16:01 Client [CBH] Sir BenSon - client's ticket has become invalid. Code: 6 18:16:01 Client [TLS]Costa - client's ticket has become invalid. Code: 6 18:16:03 NetServer::SendMsg: cannot find channel #900801400, users.card=49 18:16:03 NetServer: users.get failed when sending to 900801400 18:16:03 Message not sent - error 0, message ID = ffffffff, to 900801400 ([TLS]Costa) 18:16:03 NetServer::SendMsg: cannot find channel #900801400, users.card=49 18:16:03 NetServer: users.get failed when sending to 900801400 18:16:03 Message not sent - error 0, message ID = ffffffff, to 900801400 ([TLS]Costa) 18:16:03 NetServer::SendMsg: cannot find channel #900801400, users.card=49 18:16:03 NetServer: users.get failed when sending to 900801400 18:16:03 Message not sent - error 0, message ID = ffffffff, to 900801400 ([TLS]Costa) 18:16:03 NetServer::SendMsg: cannot find channel #60244854, users.card=49 18:16:03 NetServer: users.get failed when sending to 60244854 18:16:03 Message not sent - error 0, message ID = ffffffff, to 60244854 ([CBH] Sir BenSon) 18:16:03 NetServer::SendMsg: cannot find channel #60244854, users.card=49 18:16:03 NetServer: users.get failed when sending to 60244854 18:16:03 Message not sent - error 0, message ID = ffffffff, to 60244854 ([CBH] Sir BenSon) 18:16:03 NetServer::SendMsg: cannot find channel #60244854, users.card=49 18:16:03 NetServer: users.get failed when sending to 60244854
Die Arma3Server.exe stürzt dabei jedoch nie ab.
Vielleicht hat einer von euch eine Idee woran das liegt/wie man das fixen kann oder ob es schon reicht einfach die Logs des Servers mal abzuschalten.ASM gibt leider auch keine klaren Daten von sich.
-
Hallo NN,
heute zeige ich euch meine neue Deathscreen GUI.
Das Thema hier soll kein Tutorial werden, sondern euch nur zeigen, wie man eine GUI effektiv animieren kann und wie das dann aussehen kann.
Aus diesem Zweck habe ich euch mal meinen Dialog und die dazugehörige Funktion mit in das Thema gepostet.
Die fertige GUI sieht ungefähr so aus: ShadowOfKlon - DE100 NEW DEATH SCREEN IN ACTION V2 - Plays.tv
Wichtig ist, dass es einige CTRLs gibt die man nicht animieren kann, bzw. die man nicht faden kann, wie z.B. die Map Ctrl.Mfg.
LucianPS:
Das Thema habe ich in Alits Life/Tutorials erstellt, da die im Beitrag gepostete GUI sowie die Funktion für Altis Life entwickelt wurden. Sollte ein Moderator/Admin das Thema verschieben wollen, soll er das gerne machen.C: Dialog.hpp
Alles anzeigenclass Respawn_Screen { idd = 7000; movingEnabled = false; enableSimulation = true; onLoad = "(_this + [0,0]) spawn life_fnc_deathScreen;"; onKeyDown = "if((_this select 1) == 1) then {true;};"; class controlsBackground { class logo: RscPicture { idc = 1; text = "images\ui\ui_logo_full.paa"; x = 0.412344 * safezoneW + safezoneX; y = 0.181 * safezoneH + safezoneY; w = 0.175313 * safezoneW; h = 0.297 * safezoneH; }; class BG: Life_RscText { idc = 2; colorBackground[] = {0.9,0.9,0.9,0.85}; x = 0.386562 * safezoneW + safezoneX; y = 0.412 * safezoneH + safezoneY; w = 0.226875 * safezoneW; h = 0.363 * safezoneH; }; }; class Controls { class THR_COUNT: Life_RscText { idc = 3; colorText[] = {0, 0, 0, 1}; colorShadow[] = {1, 1, 1, 0.2}; shadow = 1; text = "THR-Mitglieder im Spiel: 1 Spieler"; //--- ToDo: Localize; x = 0.391719 * safezoneW + safezoneX; y = 0.434 * safezoneH + safezoneY; w = 0.216563 * safezoneW; h = 0.026 * safezoneH; sizeEx = 0.026 * safeZoneH; }; class THR_REQ: THR_COUNT { idc = 4; text = "THR-Mitglied ist auf dem Weg: Nein"; //--- ToDo: Localize; x = 0.391719 * safezoneW + safezoneX; y = 0.458 * safezoneH + safezoneY; w = 0.216563 * safezoneW; h = 0.026 * safezoneH; }; class RESPAWN_INFO: THR_COUNT { idc = 5; style = 0x02; text = "Respawn verfügbar in: 05:30"; //--- ToDo: Localize; x = 0.391719 * safezoneW + safezoneX; y = 0.5 * safezoneH + safezoneY; w = 0.216563 * safezoneW; h = 0.054 * safezoneH; sizeEx = 0.033 * safeZoneH; }; class RESPAWN_BTN: Life_RscButtonMenu { onButtonClick = "[findDisplay 7000,1,0] spawn life_fnc_deathScreen;"; idc = 6; text = "Neues Leben"; //--- ToDo: Localize; colorText[] = {0, 0, 0, 1}; x = 0.391719 * safezoneW + safezoneX; y = 0.566 * safezoneH + safezoneY; w = 0.216563 * safezoneW; h = 0.055 * safezoneH; size = 0.042 * safeZoneH; colorBackground[] = {0,0,0,0}; colorBackgroundActive[] = {0,0,0,0}; colorDisabled[] = {0.5,0.5,0.5,1}; color[] = {0,0,0,1}; color2[] = {0,0,0,1}; colorFocused[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])",1}; animTextureOver = "#(argb,8,8,3)color(0,0,0,0)"; animTextureFocused = "#(argb,8,8,3)color(0,0,0,0)"; animTexturePressed = "#(argb,8,8,3)color(0,0,0,0)"; animTextureDisabled = "#(argb,8,8,3)color(0.5,0.5,0.5,1)"; class Attributes : Attributes { align = "center"; }; }; class THR_REQ_BTN: RESPAWN_BTN { idc = 7; onButtonClick = "[0] call life_fnc_thrRequest;"; text = "THR rufen"; //--- ToDo: Localize; x = 0.391719 * safezoneW + safezoneX; y = 0.632 * safezoneH + safezoneY; w = 0.216563 * safezoneW; h = 0.055 * safezoneH; }; class DISCONNECT: RESPAWN_BTN { idc = 8; onButtonClick = "[findDisplay 7000,1,1] spawn life_fnc_deathScreen;"; text = "Verlassen"; //--- ToDo: Localize; x = 0.391719 * safezoneW + safezoneX; y = 0.698 * safezoneH + safezoneY; w = 0.216563 * safezoneW; h = 0.055 * safezoneH; }; }; };
JavaScript: Funktion.sqf
Alles anzeigen#include "..\..\script_macros.hpp" /* File: fn_deathScreen.sqf Date: 2016-07-15 13:50:45 Author: Patrick "Lucian" Schmidt Description: Take a look for yourself. */ #define FADEIN 0 #define FADEOUT 1 #define RESPAWN 0 #define DISCONNECT 1 #define REVIVED 2 disableSerialization; params[ ["_display", displayNull, [displayNull]], ["_mode", 0, [0]], ["_exit", 0, [0]], "_ctrls", "_handle", "_confirm" ]; if (_display getVariable ["exit",false]) exitwith {}; _ctrls = allControls _display; switch (_mode) do { case FADEIN : { life_deathScreen = true; _handle = ppEffectCreate ["DynamicBlur", 401]; _handle ppEffectForceInNVG true; _handle ppEffectEnable true; _handle ppEffectAdjust [4]; _handle ppEffectCommit 1.5; _display setVariable ["Blur",_handle]; { _x ctrlSetFade 1; _x ctrlCommit 0; } forEach _ctrls; [] spawn { disableSerialization; private _display = findDisplay 7000; private _time = time + (2 * 60); private _called = false; private _finished = false; life_thr_request = false; (_display displayCtrl 6) ctrlEnable false; (_display displayCtrl 8) ctrlEnable false; while {!isNull _display} do { if (life_thr_request && !_called) then { if (_time <= 0) then { _time = time + (5*60); } else { _time = _time + (3*60); }; _called = true; _finished = false; }; private _txt = if (!isNull (player getVariable ["thrClerk",objNull])) then { "Ja"; } else { "Nein"; }; (_display displayCtrl 3) ctrlSetText format["THR-Mitglieder im Spiel: %1 Spieler",{side _x isEqualTo independent && _x getVariable["isAlive",true]} count allPlayers]; (_display displayCtrl 4) ctrlSetText format["THR-Mitglied auf dem Weg: %1",_txt]; if (round(_time - time) > 0) then { (_display displayCtrl 5) ctrlSetText format["Respawn verfügbar in: %1",[round(_time - time),"MM:SS"] call BIS_fnc_secondsToString]; } else { if (!_finished) then { (_display displayCtrl 5) ctrlSetText "Du kannst nun respawnen"; (_display displayCtrl 6) ctrlEnable true; (_display displayCtrl 8) ctrlEnable true; _finished = true; }; }; if (!isNull ((missionNamespace getVariable["life_corpse",player]) getVariable ["reviver",objNull])) then { (_display displayCtrl 5) ctrlSetText "Du wirst wiederbelebt..."; (_display displayCtrl 6) ctrlEnable false; (_display displayCtrl 8) ctrlEnable false; _finished = false; }; uiSleep 1; }; }; uiSleep 2; { _x ctrlSetFade 0; _x ctrlCommit 1; uiSleep 0.25; } forEach _ctrls; }; case FADEOUT : { if (_display getVariable ["exit",false]) exitwith {};//DoubleCheck to be SURE that it cant be executed 2 times _display setVariable ["exit",true]; reverse _ctrls; { _x ctrlSetFade 1; _x ctrlCommit 1; uiSleep 0.35; } forEach _ctrls; waitUntil {ctrlCommitted (_ctrls select (count _ctrls -1))}; uiSleep 0.3; _handle = _display getVariable ["Blur",0]; _display closeDisplay 2; switch (_exit) do { case RESPAWN : { life_respawned = true; [] call life_fnc_spawnMenu; }; case DISCONNECT : { if (!isNil "_handle") then { _handle ppEffectAdjust [0]; _handle ppEffectCommit 3; }; life_firstSpawn = true; bank_obj setVariable [(format["DE100_UID_%2_%1",(getPlayerUID player),playerSide]),nil,true]; if (!isNull (missionNamespace getVariable ["life_corpse",objNull])) then { hideBody life_corpse; }; []spawn life_fnc_logout; (findDisplay 49)closeDisplay 2; }; case REVIVED : { if (!isNil "_handle") then { _handle ppEffectAdjust [0]; _handle ppEffectCommit 3; }; }; }; life_deathScreen = false; if (!isNil "_handle") then { waitUntil {ppEffectCommitted _handle}; _handle ppEffectEnable false; ppEffectDestroy _handle; }; }; };
-
Hallo NN,
da ich zur Zeit viel mit PHP arbeite und mich sehr in die PHP-Arrays verliebt habe und seit geraumer Zeit mal meine queryRequest Funktion neu schreiben wollte, habe ich gestern mir ein "Array-Pattern" System geschrieben, wo man auf die einzelnen Felder durch KeyWords zugreifen kann.
Der Vorteil des Systems ist, ich kann auf die Daten zugreifen ohne ihren Index wissen zu müssen und ich kann neue Felder dynamisch hinzufügen und muss nicht darauf achten, dass z.B. die Lizenzen immer den Index 6 haben.fn_applyPattern.sqf (life_fnc_applyPattern)
Parameter:
0: Pattern <ARRAY>
1: Data <ARRAY>Beschreibung:
Das Pattern wird auf die Daten angelegt.
Pattern und Data müssen gleich lang sein, da das KeyWord über den aktuellen Index ausgelesen wird.Bsp.:
Code_pattern = ["cash",""bankacc","copLevel"]; _data = [0,1000,4]; _patternArray = [_patern,_data ] call life_fnc_applyPattern;
_patternArray sollte dann so aussehen [["cash",0],["bankacc",1000],["copLevel",4]]
fn_dataFromKey.sqf (life_fnc_dataFromKey)
Parameter:
0: Key <STRING>
1: Stack <ARRAY>Beschreibung:
Gibt den Wert eines KeyWords aus einem Stack(Array) aus.
Sollte der Key nicht im Stack(Array) zu finden sein, wird false ausgegeben.Bsp.:
Wir nehmen mal den Stack von oben _patternArray.
["bankacc",_patternArray] call life_fnc_dataFromKey sollte 1000 ausgeben.fn_setDataAtKey.sqf (life_fnc_setDataAtKey)
Parameter:
0: Key <STRING>
1: Stack <ARRAY>
2: Neuer Wert <ANY>Beschreibung:
Ersetzt die Daten eines KeyWords.
Sollte das KeyWord nicht im Array sein, wird das KeyWord und der neue Wert einfach in den Stack(Array) übernommen.Bsp. ersetzen:
Wir nehmen wieder den Stack von oben _patternArray.
["cash",_patternArray,100000] call life_fnc_setDataAtKey; sollte den alten Wert der KeyWords "cash", also 0 durch 100000 ersetzen.Bsp. neuen Wert einfügen:
Wir nehmen wieder den Stack von oben _patternArray.
["adminlevel",_patternArray,5] call life_fnc_setDataAtKey; fügt dem Stack(Array) den neuen Datensatz hinzu.
Der _patternArray sollte dann so aussehen: [["bankacc",1000],["copLevel",4],["cash",100000],["adminlevel",5]]fn_applyCodeAtKey.sqf (life_fnc_applyCodeAtKey)
Parameter:
0: Key <STRING>
1: Stack <ARRAY>
2: Code <CODE>Beschreibung:
Man kann Code injecten wodurch der Wert des KeyWords verändert wird.Bsp.:
Wir nehmen wieder den Stack von oben _patternArray.
["cash",_patternArray,{_this - 1000;}] call life_fnc_applyCodeAtKey;
Dadurch sollte der wert des KeyWords "cash" nur noch 99000 sein. Der Stack(Array) _patternArray sollte dann so aussehen: [["bankacc",1000],["copLevel",4],["adminlevel",5],["cash",99000]]Ich hoffe einige können damit was anfangen