PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ausrüstung im Multiplayer zuweisen geht nicht


Wolkenbeisser
06.05.2014, 12:55
Hallo zusammen

Aaaaah, ich dreh jetzt bald durch... :confused:

In A2 konnte man die spielbaren Figuren für eine gehostete Coop noch per Initzeile ausrüsten. Mit Arma3 funktioniert das nicht mehr richtig.

Ein paar Dinge (Items z.B.) kann man gar nicht global adden (der Editor verweigert das). Andere muss man! Alles was in den Rucksack muss, muss z.B. global added werden, sonst hat es der Spieler bei Missionsbeginn nicht drin. Und so weiter und so fort - extrem mühsam und eine Regel ist nicht zu erkennen!

Ausserdem merkt man das ganze erst, wenn man ein MP-Spiel hostet mit mindestens einem Client. Testet man es als MP-Spiel, indem nur der Host teilnimmt, ist das Verhalten anders (was soll das denn bitte schön? Wie soll man da als Missionsbauer vernünftig testen können?)
:motz:

Beispiele gefällig (mir völlig unerklärliche)?

Wenn ich den Spielbaren Figuren per simplem Init-Befehl ein Magazin gebe mit this addMagazine "Classname", dann funktioniert das nur sofern es in der Uniform Platz hat. Sobald es von der Engine in die Weste verschoben wird, ist es weg... jedenfalls beim Host und bei der KI. Die KI rennt dann sogar zur nächsten Waffenkiste, weil sie keine Munition mehr hat (ein Camp mit KI-Soldaten zu schmücken, die Wache stehen, kannst Du vergessen).

Gut, sag ich mir: Dann machste halt this addMagazineGLOBAL "Classname". --> Jetzt bleibt die KI im Lager stehen und ich habe die Magazine.... aber mein Client nicht mehr... :ugly:

Ich sag' euch: Ich bin nah dran, den ganzen Sch..., ich meine das Missionen bauen aufzugeben. Wenn ich das nicht hinkriege, spiele ich wieder Guildwars2!

Es kann doch nicht sein, das es einem die Entwickler so schwer machen, oder? Es gibt schliesslich nicht nur IT-Fachleute auf dieser Welt, die Missionen bauen wollen.



Gut, gut, gut... wie sagt man? "Und bist Du nicht willig, so brauch' ich Gewalt". Mein neuster Ansatz wird so aussehen:

Ich schreibe erstmal NICHTS in die Initzeile, von NIEMANDEM. Dann, wenn alle Spieler bereit sind und die Mission läuft, starte ich eine Reihe von Scripts z.B. mit Funkcode Alpha. Mit diesen Scripts werden dann sämtliche Einheiten (wo nötig) ab- und wieder ausgerüstet.

Und damit diese SICHER DURCHGÄNGIG AUF ALLEN TEILNEHMERN (Client, Host und Hamster) ausgeführt werden, habe ich vor die Scripts so zu starten, dass sie auf jeder Maschine durchgeführt werden. Wenn's sein muss mehrfach, bis die blöde Ausrüstung auf Mann ist. Ich nehme dabei in Kauf, dass es...

- Unter Umständen auf einer Maschine mehrfach ausgeführt wird
- Unter Umständen eine Weile dauert, bis alles durch ist
- die Spieler auf magische Weise nach Missionsbeginn Ausrüstung bekommen

Die alles entscheidende Frage ist: Wie muss ich ein Script starten, dass es ÜBERALL (am besten mehrfach, für eine Dauer von ca. 20 Sekunden, verd%*// ¢|°¬#@@@¦§¬!!!!) und GANZ SICHER ausgeführt wird?

@BIS: Warum macht euer Programm solch essentiellen Dinge nicht einfach grundsätzlich global?

Wolkenbeisser
06.05.2014, 16:41
Hier haben ein paar dasselbe Problem:

Added Uniform Disappears in Multiplayer - Page 3 (http://forums.bistudio.com/showthread.php?167860-Added-Uniform-Disappears-in-Multiplayer/page3)

Diese Posts hier melden genau mein Problem:

22
27
29 --> passiert bei mir aber auch, beim Start, wenn alle schon zu Beginn dabei sind.
34
35 --> Vermutlich eben, weil der KI Zeugs im Inventar fehlt!
54

Dann beginnen sie von functions zu reden, was ich nicht richtig verstehe...

dann gehts wieder weiter mit den Posts...
72
82
85

Post 131 tönt nicht schlecht. Aber auch hier wieder die Rede von functions. Noch grösseres Problem: Habe keine Ahnung, wie ich diese Lösung abändern müsste, dass ich jeder Einheit, die einen Namen hat eine eigene Ausrüstung verpassen kann.

151 zerlegt die Lösung aus Post 131 zum Teil wieder....

Dann, Post 162

Dann post 168 mit komplett neuer Lösung, die nocht besser tönt (ich verstehe sie jedenfalls besser als die aus 131).

Ich glaube ich probiere mal die Lösung aus Post 168. Es gibt da aber noch ein Problem. Die KI leidet auch, wenn man ihr custom loadout gibt. Offenbar fehlen die Magazine in deren Westen dann auch und sie verlanssen ihre Posten um sich aufzumunitionieren. Und 'attachTo' möchte ich für die KI in der freundlichen Basis nicht verwenden. Wie müsste ich die Lösung aus Post 168 umbauen, dass auch die KI ganz sicher für alle (Client und Host) alles hat, was ich ihr geben will?

...bin echt ein bisschen am Anschlag mit dieser Sache. Hach war das noch einfach in A2...

burns
06.05.2014, 19:18
Weiss ja nicht obs in A3 helfen würde, aber der Xeno hatte mir für A2 vor langer Zeit ein Konstrukt für die init.sqf gebaut, womit alles zumindest annähernd ordentlich funktionierte/initialisierte ... bisschen blöd zu erklären wenn man keine Ahnung davon hat :confused:


vllt. kann Xeno was dazu sagen?

Wolkenbeisser
06.05.2014, 21:32
Ok, ich habe mich wieder ein wenig beruhigt und versuche konkrete Lösungsansätze. Ich habe den im letzten Post erwähnten Ansatz getestet und leider hat der Client bei 9 von 10 Versuchen immer noch nicht die richtige Ausrüstung.

Das habe ich bisher:

1. Gehostete Coop für 8 Spieler

2. Acht Spielbare Einheiten (AL1 bis AL8) mit entweder dieser Init-Zeile:

null = [this] execVM "inventar\inventar_AL1.sqf"
oder dieser hier (hier wird vor dem Scriptaufruf ein Beam zu einem bestimmten Objekt durchgeführt, aber nur wenn die spielbare Figur wirklich von einem Spieler 'übernommen' wird - vielleicht kann ich diesen Mechanismus für meine Ausrüstung auch irgenwie verwenden... nur wie?):

temp = [this,Basisfahne] spawn {private "_time", _time = 60; while {_time > time} do {if (player == _this select 0) then {player setPos getPos (_this select 1); if (player distance Basisfahne < 10) then {_time = 0}}; sleep 1}}; null = [this] execVM "inventar\inventar_AL1.sqf";
Natürlich startet jede der acht Einheiten ihr eigenes Script (hier als Beispiel die inventar_AL1.sqf).

3. Acht verschiedene Scripts (inventar_AL1.sqf bis inventar_AL8.sqf), wobei z.B. die inventar_AL1.sqf so aussieht:

// Füge in die Init-Zeile der zu bewaffnenden Einheit den nachfolgenden Code ein ('scriptname' muss aber Name des Scripts sein!)
// null = [this] execVM "inventar\scriptname.sqf"
// Nachfolgend der Code des Scripts, welches MP-Probleme mit Ausrüstung und 'join in progress' verhindern sollte
// Nachtsichtbrille kann bei Bedarf mit _unit linkItem "NVGoggles" zugefügt werden (aber Rangefinder geht nicht)


waitUntil {!isNull player};

_unit = _this select 0;

if (local _unit) then {

Removeuniform _unit;
removeallcontainers _unit;
removeAllWeapons _unit;
removeGoggles _unit;
removeHeadgear _unit;
removeVest _unit;
removeAllAssignedItems _unit;
removebackpack _unit;

_unit addUniform "U_B_CombatUniform_mcam";
_unit addHeadgear "H_MilCap_mcamo";
_unit addVest "V_PlateCarrier1_rgr";
_unit addBackpack "B_Kitbag_mcamo";

_unit linkItem "ItemMap";
_unit linkItem "ItemCompass";
_unit linkItem "ItemWatch";
_unit linkItem "ItemRadio";
_unit linkItem "ItemGPS";

_unit addMagazine "16Rnd_9x21_Mag";
_unit addMagazine "30Rnd_65x39_caseless_mag";

_unit addWeapon "arifle_MX_F";
_unit addWeapon "hgun_P07_F";
_unit addPrimaryWeaponItem "optic_aco";

_unit addItem "FirstAidKit";
_unit addItem "FirstAidKit";
_unit addItem "FirstAidKit";
_unit addItem "FirstAidKit";
_unit addItem "FirstAidKit";

_unit addMagazine "16Rnd_9x21_Mag";
_unit addMagazine "16Rnd_9x21_Mag";
_unit addMagazine "16Rnd_9x21_Mag";
_unit addMagazine "16Rnd_9x21_Mag";
_unit addMagazine "16Rnd_9x21_Mag";

_unit addMagazine "30Rnd_65x39_caseless_mag";
_unit addMagazine "30Rnd_65x39_caseless_mag";
_unit addMagazine "30Rnd_65x39_caseless_mag";
_unit addMagazine "30Rnd_65x39_caseless_mag";
_unit addMagazine "30Rnd_65x39_caseless_mag";
_unit addMagazine "30Rnd_65x39_caseless_mag";
_unit addMagazine "30Rnd_65x39_caseless_mag";
_unit addMagazine "30Rnd_65x39_caseless_mag";
_unit addMagazine "30Rnd_65x39_caseless_mag";

_unit addMagazine "SmokeShellGreen";
_unit addMagazine "SmokeShellRed";
_unit addItem "Medikit";
_unit addItem "Rangefinder";

};

if(true) exitWith{};

Das Problem:
Bei 10 Versuchen gehen mindestens 9 schief. Und zwar insofern, als dass die Clients die im Script enthaltene Ausrüstung nicht haben. Bei mir als Host funktioniert es immer.

Die Frage:
Was muss ich ändern, damit die Clients die Ausrüstung immer erhalten?

Vielen Dank, jetzt schon für die geschätzte Hilfe.

Vienna
06.05.2014, 23:15
Edit: Ich habe dem Skript wieder die Bedingung "if (local _unit) then ..." eingefügt, da es sonst nicht in der Initzeile aufrufbar ist.


// Füge in die Init-Zeile der zu bewaffnenden Einheit den nachfolgenden Code ein ('scriptname' muss aber Name des Scripts sein!)
// null = [this] execVM "inventar\scriptname.sqf"
// Nachfolgend der Code des Scripts, welches MP-Probleme mit Ausrüstung und 'join in progress' verhindern sollte
// Nachtsichtbrille kann bei Bedarf mit _unit linkItem "NVGoggles" zugefügt werden (aber Rangefinder geht nicht)
// Das sleep zu Beginn blockt das Skript bis die Initialisierung abgeschlossen ist !?

sleep 0.1;
waitUntil {!isNull player};

private "_unit";

_unit = _this select 0;

if (local _unit) then
{
Removeuniform _unit;
removeallcontainers _unit;
removeAllWeapons _unit;
removeGoggles _unit;
removeHeadgear _unit;
removeVest _unit;
removeAllAssignedItems _unit;
removebackpack _unit;

_unit addUniform "U_B_CombatUniform_mcam";
_unit addHeadgear "H_MilCap_mcamo";
_unit addVest "V_PlateCarrier1_rgr";
_unit addBackpack "B_Kitbag_mcamo";

{_unit linkItem _x} forEach ["ItemMap","ItemCompass","ItemWatch","ItemRadio","ItemGPS"];
{_unit addItem _x} forEach {"Medikit","Rangefinder"};

for "_i" from 1 to 5 do {_unit addItem "FirstAidKit"};

_unit addMagazine ["16Rnd_9x21_Mag" , 6];
_unit addMagazine ["30Rnd_65x39_caseless_mag",10];

{_unit addMagazine _x} forEach ["SmokeShellGreen","SmokeShellRed"];

{_unit addWeapon _x} forEach ["arifle_MX_F","hgun_P07_F"];
_unit addPrimaryWeaponItem "optic_aco";
};

Wenn es so auch nicht klappt, dann ist das Skript vielleicht übersichtlicher?

Wolkenbeisser
07.05.2014, 22:48
Hallo Vienna. ja, der Sleep-Befehl hat's gebracht. Wir haben heute zu viert die Mission etwa 10 x gestartet. Und immer war die Ausrüstung erfolgreich auf Mann.

Vielen dank für den Tipp... :daumen:

Ich denke, damit hat sich die Sache erledigt. Hier zur Sicherheit nochmals das Script, wie es bei mir jetzt funktioniert:

// Füge in die Init-Zeile der zu bewaffnenden Einheit den nachfolgenden Code ein ('scriptname' muss aber Name des Scripts sein!)
// null = [this] execVM "inventar\scriptname.sqf"
// Nachfolgend der Code des Scripts, welches MP-Probleme mit Ausrüstung und 'join in progress' verhindern sollte
// Nachtsichtbrille kann bei Bedarf mit _unit linkItem "NVGoggles" zugefügt werden (aber Rangefinder geht nicht)

sleep 1;
waitUntil {!isNull player};
_unit = _this select 0;

if (local _unit) then {

removeuniform _unit;
removeallcontainers _unit;
removeAllWeapons _unit;
removeGoggles _unit;
removeHeadgear _unit;
removeVest _unit;
removeAllAssignedItems _unit;
removebackpack _unit;

_unit addUniform "U_B_CombatUniform_mcam";
_unit addHeadgear "H_MilCap_mcamo";
_unit addVest "V_PlateCarrier1_rgr";
_unit addBackpack "B_Kitbag_mcamo";

_unit linkItem "ItemMap";
_unit linkItem "ItemCompass";
_unit linkItem "ItemWatch";
_unit linkItem "ItemRadio";
_unit linkItem "ItemGPS";

_unit addMagazine "16Rnd_9x21_Mag";
_unit addMagazine "30Rnd_65x39_caseless_mag";

_unit addWeapon "arifle_MX_F";
_unit addWeapon "hgun_P07_F";
_unit addPrimaryWeaponItem "optic_aco";

_unit addItem "FirstAidKit";
_unit addItem "FirstAidKit";
_unit addItem "FirstAidKit";
_unit addItem "FirstAidKit";
_unit addItem "FirstAidKit";

_unit addMagazine "16Rnd_9x21_Mag";
_unit addMagazine "16Rnd_9x21_Mag";
_unit addMagazine "16Rnd_9x21_Mag";
_unit addMagazine "16Rnd_9x21_Mag";
_unit addMagazine "16Rnd_9x21_Mag";

_unit addMagazine "30Rnd_65x39_caseless_mag";
_unit addMagazine "30Rnd_65x39_caseless_mag";
_unit addMagazine "30Rnd_65x39_caseless_mag";
_unit addMagazine "30Rnd_65x39_caseless_mag";
_unit addMagazine "30Rnd_65x39_caseless_mag";
_unit addMagazine "30Rnd_65x39_caseless_mag";
_unit addMagazine "30Rnd_65x39_caseless_mag";
_unit addMagazine "30Rnd_65x39_caseless_mag";
_unit addMagazine "30Rnd_65x39_caseless_mag";

_unit addMagazine "SmokeShellGreen";
_unit addMagazine "SmokeShellRed";
_unit addItem "Medikit";
_unit addItem "Rangefinder";

};

if(true) exitWith{};

Vienna
08.05.2014, 09:02
Damit hat sich wieder bestätigt, dass bestimmte Befehle nicht während der Initialisierungszeit für den Missionseinstieg ausgeführt werden dürfen.

Der sleep-Befehl stoppt offensichtlich das Skript (unabhängig der Zeiteinstellung!?) bis die Initialisierung abgeschlossen ist.

Das kann man erforderlichen Falls auch bei unmittelbar beim Spielstart auslösenden Auslösern berücksichtigen, indem man deren Countdown auf 1 -1 -1 einstellt.

Wolkenbeisser
08.05.2014, 09:49
...und dann heisst es immer Sekundenschlaf sei nichts gutes. Dabei rettet es meine Missionen.

:D

Was mich bei meinem Script jetzt unsicher macht: Wenn ich z.B. die FirstAidKits in den Rucksack packen will, muss ich dann 'addItemCargoGlobal' verwenden, oder reicht 'addItemCargo'? Ich frage mich, weil das Script zwar offenbar lokal auf jedem Teilnehmer läuft, aber Rucksäcke ja Container sind, die auch von aussen (sprich von anderen Teilnehmern) bedient werden können.

Wie muss der Befehl im obigen Script also konkret heissen?

So? --> (unitBackpack _unit) additemCargo ["FirstAidKit",5];

oder so? --> (unitBackpack _unit) additemCargoGlobal ["FirstAidKit",5];

oder anders?

Vienna
08.05.2014, 18:07
Durch diese Bedingung if (local _unit) then ... wird das Skript nur auf dem PC des Players == _unit fertig ausgeführt.

Ich habe kein Arma3, aber sollte man bei dem nicht diesen Befehl verwenden: https://community.bistudio.com/wiki/addItemToBackpack

Wolkenbeisser
08.05.2014, 19:49
Du meinst also ohne "Global" und etwa in diesem Stil hier?

_unit addItemToBackpack "FirstAidKit";

Vienna
08.05.2014, 21:32
Ja, eben auf diese Art. Probier es einmal aus:

for "_i" from 1 to 5 do {_unit addItemToBackpack "FirstAidKit"};

Wolkenbeisser
08.05.2014, 21:39
Ja, das funktioniert tadellos. Hatte soeben Glück, dass ich einen meiner Clankumpels zu einem Kurztest aufbieten konnte.

Denke, damit ist die Sache vom Tisch. Alles funktioniert nun wie gewünscht. :daumen:

Dank allen, die geholfen haben.

[CCG]Cyborg
09.05.2014, 22:14
...ich hab mich auch schon übelst aufgeregt...:schlagen:

Ich hab mir Scripte gemacht mit denen es läuft:

while {pubcust == 1} do
{

{if ((( _x isKindOf "O_Soldier_F") OR ( _x isKindOf "O_Soldier_TL_F") OR ( _x isKindOf "O_Soldier_SL_F")) AND NOT (uniform _x == "U_CAF_AG_ME_ROBES_01")) then {
_uni = 0;
while {_uni == 0} do {if (!(uniform _x == "U_CAF_AG_ME_ROBES_01")) then {
removeUniform _x;
_x addUniform "U_CAF_AG_ME_ROBES_01";
if (uniform _x == "U_CAF_AG_ME_ROBES_01") then {_uni = 1};};};
};} forEach allunits;
_num = _num + 1;

if (_num > 66) exitWith {
//Hint "Umgezogen";
cust = 0;
};
sleep 1;
};

die 66 ist bei mir bei 12 Typen das Minimum...sonst geht Unterwäsche spazieren im Multiplayer. (Script bei bedarf und bei jedem Client und Server ausführen.

danach ebenfalls bei jedem Client etwas in der Art:

{if (_x isKindOf "O_Soldier_F") then {
removeallWeapons _x;
removeBackpack _x;
removeVest _x;
removeHeadgear _x;
removeallitemswithmagazines _x;
_x addVest "V_BandollierB_oli";
_x unassignItem "NVGoggles_OPFOR";
_x removeItem "NVGoggles_OPFOR";
_x unassignItem "ItemRadio";
_x removeItem "ItemRadio";
_x addweapon "Binocular";
_x assignitem "Binocular";
_x additemtoUniform "FirstAidKit";
_x additemtoUniform "SmokeShell";
_x additemtoVest "Chemlight_yellow";
_x additemtoVest "HandGrenade";
_x addheadgear "H_CAF_AG_PAKTOL";
_x additemtoVest "CAF_30RND_762x39_AK";
_x additemtoVest "CAF_30RND_762x39_AK";
_x additemtoVest "CAF_30RND_762x39_AK";
_x additemtoVest "CAF_30RND_762x39_AK";
_x additemtoVest "CAF_30RND_762x39_AK";
_x additemtoVest "CAF_30RND_762x39_AK";
_x addweapon "CAF_AK47";
//_x addPrimaryWeaponItem "acc_flashlight";
_x allowFleeing 0.4;
_x enableGunLights "forceOn";
};} forEach allunits;

das hilft zumindest bei der KI ist dann alles paletti.

Gruß Cyborg