-
Da gibt es viele Varianten. Ich liste jetzt mal nach persönlicher Präferenz drei auf:
1. Du registrierst einen Chat-Befehl-Handler mit CBA und lässt dir die Infos in gewünschter Form ausspucken
2. Du loggst es alle X Sekunden in die Server-Console
3. Du erstellst Marker im Editor und benennst sie, ähnlich wie bei KP-Liberation und lässt alle 30 Sekunden beispielsweise mittels cba_fnc_waitAndExecute die Marker aktualisieren mit den gewünschten Informationen, also serverseitig ein Skript mit:
- deinMarker setMarkerText format ["%1 Blufor-Gruppen werden von %2 gesteuert", count blufor_groups, HC_1];
Das Skript rufst du dann z. Bsp alle 30 Sekunden auf. Alle drei erfordern Code und sind unterschiedlich informativ und sichtbar.
-
Also ich dachte, du willst ja wissen, welche Gruppe jeweils von einem HC gerechnet wird, oder? Dann bringt dir das Liberation-Teil nichts. Es war mehr als Überlegungs-Stütze gedacht, im Sinne von: Du musst auf den jeweiligen Clients etwas zählen lassen, weil der Command "local" sonst keinen Sinn macht.
Alternativ kannst du auch direkt abfragen, welcher Client ne Gruppe besitzt mit:
groupOwner - Bohemia Interactive Community
-
Die Funktion von der Liberation da gibt jeweils die lokalen Einheiten gezählt als Nummer aus. Das Skript wird jeweils auf dem Server und auf den jeweiligen Headless Clients ausgeführt vermutlich. Je nach Inputvariable zählt es dann die vom Server oder HC z. Bsp. Mein Post danach wäre die bessere Variante.
Also wenn dein HC beispielsweise HC_1 heisst, kannst du
- Fnc_Was_steuert_der_hc = {
- blufor_groups = allGroups select {(local _x) && (side _x == west)};
- publicVariableServer "blufor_groups";
- };
- [] remoteExecCall ["Fnc_Was_steuert_der_hc", HC_1];
ausführen. Danach findest du es raus. Bedenke, dass die Variable nur dem Server und dem HC_1 bekannt ist. Ist schonender, als wenn du die Info allen Clients sendest.
-
Also du könntest theoretisch den folgenden Code mit remoteExecCall auf dem Headless Client deiner Wahl ausführen:
- blufor_groups = allGroups select {(local _x) && (side _x == west)};
- publicVariableServer "blufor_groups";
Alle Blufor Gruppen auf dem jeweiligen Client würden dir dann als globale Variable auf dem Server zur Verfügung stehen.
-
Bei der Liberation von Wyqer gibt es eine Funktion dafür. Schau dir mal den Code hier an, eventuell kannst du daraus was machen:
KP-Liberation/show_fps.sqf at master · KillahPotatoes/KP-Liberation · GitHub
-
Abend
Ich bin auf Hilfe angewiesen, weswegen ich es hier mal versuche. Ist jemand des Terrainbuildings kundig?
Ich wollte einen zweiten Anlauf nehmen und mich in den Karten-Bau einfuchsen.
Ich halte mich dabei an dieses Tutorial:
arma3:terrain:ultimate-terrain-tutorial [PMC Editing Wiki]
Ich habe alle Schritte unternommen bis zum erstellen eines Mapframes. Ich komme aber schon beim Mapframe nicht weiter.
Die Problemlage ist folgende:
- Bei den mapframe properties müssen offenbar noch layers generiert werden (bild)? Das ist im Tutorial nicht so beschrieben.
- Die Heightmap (weder im .asc noch im .xyz Format) lässt sich nicht öffnen bzw. es wird dann einfach schlicht nichts im terrainbuilder angezeigt (ohne Fehlermeldung..)
Hat einer eine Idee? Wäre froh um Hilfe!
-
Ah ja ich hatte nicht gelesen, dass es ,mehrere Hooks sind. Gut beobachtet, Fabi.
-
Probiers mit:
ace_refuel_hooks[] = {-0.05,-3.66,-0.43};
-
Zwischenbilanz des Publicservers der Gruppe Keiler
- Der Einsatz in Reshmaan dauert bereits einen Monat
- Es wurden bisher drei kleine Ausbildungsevents abgehalten
- Wir kommen teilweise Abends zwischen 18 und 22 Uhr auf bis zu 20 Spieler, auch unter der Woche
- Der Server läuft seit 84 Restarts durch
- Über 4000 Feinde wurden bekämpft
- Über 200 eigene sind gefallen o7
- 75 Fahrzeuge wurden bisher in Dienst gestellt. Einige davon wurden zerstört
- Über 50 Zivilisten mussten ihr Leben im Krieg lassen
- Über 20 Unabhängige wurden Opfer von Angriffen
- Es wurden 49 zivile Gebäude beschädigt
- Es wurden 21 zivile Gebäude zerstört
-
-
//Racks
[_fhz, {}] call acre_api_fnc_initVehicleRacks;
Das hier ist obsolet, weil du das hier bereits tust:
[_fhz, ["ACRE_VRC64", "Upper Dash", "ComA", false, ["Crew"], [], "ACRE_PRC77", [], ["intercom_1"]], true, {}] call acre_api_fnc_addRackToVehicle;
private _racks = [_fhz] call acre_api_fnc_getVehicleRacks;
[_fhz, (_racks select 0)] call acre_api_fnc_removeRackFromVehicle;
Das wird nicht funktionieren. Versuche es mal mit dem CBA-Event.
-
Hatte nen Typo drin beim CBA-event in der Eile...
Das hier teste ich jetzt selber.
- {
- ["acre_sys_rack_removeVehicleRacks", [deincoolerfahrzeugname, _x], deincoolerfahrzeugname] call cba_fnc_targetEvent;
- } foreach ([deincoolerfahrzeugname] call acre_sys_rack_fnc_getVehicleRacks);
-
Ohne Gewähr, ist nicht getestet...
Aber das adden von Racks geht problemlos, das läuft auf unserem Server fehlerfrei.
-
Dieser Block hier in der API Funktion erklärt es:
- private _selectPlayer = {
- params ["_condition", "_vehicle"];
- // A player must do the action of adding a rack
- private _player = objNull;
- private _vehiclePresetName = [_vehicle] call FUNC(getVehicleRacksPreset);
- if (_condition isEqualTo {} && {!(_vehiclePresetName isEqualTo "")}) then {
- private _crewPlayers = [_vehicle] call EFUNC(sys_core,getPlayersInVehicle);
- if !(_crewPlayers isEqualTo []) then {
- _player = _crewPlayers select 0;
- } else {
- _player = ([] call CBA_fnc_players) select 0;
- };
- } else {
- // Pick the first player that matches side criteria
- {
- if ([_x] call _condition) exitWith {
- _player = _x;
- };
- } forEach ([] call CBA_fnc_players);
- if (isNull _player) then {
- WARNING_1("No unit found for condition %1, defaulting to first player",_condition);
- _player = ([] call CBA_fnc_players) select 0;
- };
- };
- _player
- };
- [{
- params ["_selectPlayer", "_condition", "_vehicle"];
- private _player = [_condition, _vehicle] call _selectPlayer;
- !isNil "_player"
- }, {
- params ["_selectPlayer", "_condition", "_vehicle", "_rackClassname", "_rackName", "_rackShortName", "_isRadioRemovable", "_allowed", "_disabled", "_mountedRadio", "_defaultComponents","_intercoms"];
- // A player must do the action of adding a rack
- private _player = [_condition, _vehicle] call _selectPlayer;
- if (_player != _vehicle getVariable [QEGVAR(sys_rack,initPlayer), objNull]) then {
- _vehicle setVariable [QEGVAR(sys_rack,initPlayer), _player, true];
- };
- [QEGVAR(sys_rack,addVehicleRacks), [_vehicle, _rackClassname, _rackName, _rackShortName, _isRadioRemovable, _allowed, _disabled, _mountedRadio, _defaultComponents, _intercoms], _player] call CBA_fnc_targetEvent;
- }, [_selectPlayer, _condition, _vehicle, _rackClassname, _rackName, _rackShortName, _isRadioRemovable, _allowed, _disabled, _mountedRadio, _defaultComponents, _intercoms]] call CBA_fnc_waitUntilAndExecute;
Alles anzeigen
Und mit dem CBA Event wird dann eben das hier gemacht:
- [QGVAR(addVehicleRacks), {
- params ["_vehicle", "_rackClassname", "_displayName", "_rackName", "_rackShortName", "_isRadioRemovable", "_allowed", "_disabled", "_mountedRadio", "_components", "_intercoms"];
- [_vehicle, _rackClassname, _displayName, _rackName, _rackShortName, _isRadioRemovable, _allowed, _disabled, _mountedRadio, _components, _intercoms] call FUNC(addRack);
- // Give some time for the racks to initialise properly
- [{
- [_this select 0] call FUNC(configureRackIntercom);
- }, [_vehicle], 0.5] call CBA_fnc_waitAndExecute;
- }] call CBA_fnc_addEventHandler;
-
Ich hatte jetzt noch ein wenig herumprobiert und es scheint als ob ACRE beim ersten Aufsitzen das Rack des Fahrzeuges initialisiert. Führe ich nämlich das Script nach dem ersten Aufsitzen aus, wird die 117 Funke entfernt und ich habe 2x 77er an Bord.
Meine aktuelle Lösung des Problems ist: Ich lasse die Crew einfach im Fahrzeug bei Missionsstart spawnen und führe das Script mit kurzer Verzögerung aus. Wenn jemand einen eleganteren Weg hat, dann gerne her damit!
Soweit ich das beurteilen kann, fügt Acre die Racks nach 0.5 Sekunden ungefähr dem Fahrzeug hinzu. Initialisiert werden sie, wie du richtig sagtest, nachdem mit cba_fnc_waitUntilandExecute der erste Spieler im Fahrzeug gefunden wurde bzw. er defaultet es auf den ersten Spieler aufm Server überhaupt.
-
Ohne Gewähr, ist nicht getestet...
-
Ich würde mit dem CBA-Event von acre_sys_racks hier arbeiten:
- [QGVAR(removeVehicleRacks), {
- params ["_vehicle", "_rackId"];
- if (!([_rackId] call EFUNC(sys_radio,radioExists))) exitWith {
- [QGVAR(logOnServer), format ["Non existant rack ID provided: %1", _rackId]] call CBA_fnc_serverEvent;
- false
- };
- private _mountedRadio = [_rackId, "getState", "mountedRadio"] call EFUNC(sys_data,dataEvent);
- if (_mountedRadio != "") then {
- [_rackId, "setState", ["mountedRadio", ""]] call EFUNC(sys_data,dataEvent);
- [_rackId, _mountedRadio] call EFUNC(sys_components,detachAllConnectorsFromComponent);
- // Trigger event
- [_rackId, "unmountRadio", _mountedRadio] call EFUNC(sys_data,dataEvent);
- };
- // Delete intercom configuration if any
- private _wiredIntercoms = [_rackId] call FUNC(getWiredIntercoms);
- if !(_wiredIntercoms isEqualTo []) then {
- {
- private _stationName = _x;
- private _rackIntercomConfig = +(_vehicle getVariable [format [QEGVAR(sys_intercom,%1_rack), _stationName], []]);
- {
- if ((_x select 0) isEqualTo _rackId) exitWith {
- _rackIntercomConfig deleteAt _forEachIndex;
- };
- } forEach _rackIntercomConfig;
- _vehicle setVariable [format [QEGVAR(sys_intercom,%1_rack), _stationName], _rackIntercomConfig, true];
- } forEach (_vehicle getVariable [QEGVAR(sys_intercom,intercomStations), []]);
- };
- private _racks = [_vehicle] call FUNC(getVehicleRacks);
- _racks deleteAt (_racks find _rackId);
- _vehicle setVariable [QGVAR(vehicleRacks), _racks, true];
- {
- private _type = toLower (typeOf _x);
- if (_type == (toLower _rackId)) exitWith {
- deleteVehicle _x;
- };
- } forEach (nearestObjects [[-1000,-1000], ["ACRE_baseRack"], 1, true]);
- }] call CBA_fnc_addEventHandler;
Alles anzeigen
Also einfach bevor du die Funken per Script addest:
- {
- ["acre_sys_rack_removeVehicleRacks", [deincoolerfahrzeugname, _x], deincoolerfahrzeugname] call cba_fnc_targetEvent;
- } foreach ([deincoolerfahrzeugname] call acre_sys_rack_fnc_getVehicleRacks);
-
Ja richtig, das this impliziert das fälschlicherweise. Ersetze this mit dem Variablennamen und führe das irgendwo aus. Kannst in der initServer ohne remoteExecCall ausführen zum Beispiel. Was ich vermute ist eben erstens, dass die Funktion nicht serverseitig ausgeführt wird und zweitens, dass, weil er den Parameter nach der intercom mit "false" rübergibt statt mit true, das Rack nicht initialisiert wird.
-
Du musst die Funktion erstens auf dem Server callen, zweitens musst du die Initialisierung forcieren.
EDIT
Also z. Bsp. in der InitServer-sqf:
- [meincoolesfahrzeug, ["ACRE_VRC64", "Upper Dash", "ComA", false, ["Crew"], [], "ACRE_PRC77", [], ["intercom_1"]], true, {}] call acre_api_fnc_addRackToVehicle;
- [meincoolesfahrzeug, ["ACRE_VRC64", "Lower Dash", "ComB", false, ["Crew"], [], "ACRE_PRC77", [], ["intercom_1"]], true, {}] call acre_api_fnc_addRackToVehicle;
-
- [tr]
- [td]DE[/td]
- [td][url='https://discord.gg/ArmCQUXYA5']FschJgZg Keiler[/url][/td]
- [td][url='ts3server://http://ts.blueberry-hood-clan.de/']Teamspeak[/url][/td]
- [td]Do-So 18-2 Uhr[/td]
- [td]~17 GB[/td]
- [td]ArmA - Launcher[/td]
- [td]ACRE[img]http://ludwig-software.de/uploads/armaworld/acrelogo.jpg[/img][/td]
- [td]Virolatie[/td]
- [td]meist ~10 Spieler[/td]
- [td]ACE, RHS, ACRE2, BW Mod, Tornado, GM[/td]
- [td]Enhanced Movement, Suppress[/td]
- [td]2.8.2021[/td]
- [/tr]
Alles anzeigen