Definierte Loadouts - Meine Schnitzeljagd

  • Multiplayer

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Definierte Loadouts - Meine Schnitzeljagd

    Moin.

    Ich habe jetzt insgesamt drei verschiedene Lösungsansetze zusammengeschnitzelt und, oh wunder, nichts funktioniert. Sachen aus dem Jahr 2013? Neeee. 2014? Neee. Kurzum: Ich bin jetzt schon seit fast 8 Stunden auf Schnitzeljagd und bisher bin ich zu keinem Ergebnis gekommen. Für Singleplayer habe ich durchaus Script-Verständnis aber für Multiplayer fand ich noch keine Zeit das zu lernen bzw mein Wissen zu erweitern.


    Was möchte ich als Ergebnis:

    Jeder Soldat den ich im Editor habe sol per Klasse (z.B. "O_Soldier_F" für den normalen Schützen) nicht die Ausrüstung bekommen die der Editor ihm zugewiesen hat (also die Standard-Ausrüstung beim platzieren der Einheit) sondern genau das was ich möchte, zusätzlich zu ACE-Inhalten.



    Ich bin ja jetzt nicht völlig blöd und kann auch zu einem großen Teil mit Schnipseln arbeiten wenn sie anständig erklärt werden. Entweder habe ich bisher nichts anständiges für mich passendes gefunden oder aber ich verstehe es völlig falsch. Mein Problem ist das bei 5 verschiedenen Tutorials und Leuten 5 verschiedene Sachen gesagt werden und keine bisher funktioniert hat.

    Ich schreibe es ab? Geht nicht
    Test im Eden-Multiplayer (Also auf dem PC), es wäre schlichtweg zu aufwändig bei jeder Änderung den Server runter zu fahren, die Dateien drauf zu packen, Server hochfahren, joinen, testen, runterfahren und so weiter. Versteht ihr was ich meine? Wenn es so im normalen Testlauf schon mal nicht funktioniert, warum sollte es dann auf dem Server funktionieren?

    Momentan läuft lediglich die Notlösung das jeder Spieler sich sein Loadout im Arsenal im Default abholt. Nun ist es aber so das ich Notlösungen eben nicht sonderlich mag.


    Und da mein Nachbar ständig Hupt mit seiner scheiß Karre weiß ich gar nicht ob der Beitrag hier ordentlich geschrieben ist... rasende Wut -.-


    Bleibt knusprig


    Narsiph
  • CLib hat die Funktionalität die du suchst bereits fertig verbaut und wird demnächst auch offiziell veröffentlicht.

    Da werden die Loadouts als Config definiert und dann automatisch zugewiesen. So machen wir das Ganze auch bei den Coopetitions.

    Für kannst es aber tdem schonmal auf GitHub anschauen, wie es dort gelöst wurde.
    Entwickler von SQDev
    Co-Entwickler von OurAltis
  • Raven schrieb:

    CLib hat die Funktionalität die du suchst bereits fertig verbaut und wird demnächst auch offiziell veröffentlicht.

    Da werden die Loadouts als Config definiert und dann automatisch zugewiesen. So machen wir das Ganze auch bei den Coopetitions.

    Für kannst es aber tdem schonmal auf GitHub anschauen, wie es dort gelöst wurde.

    Das klingt ja mal extremst interessant. Werde ich heute mal noch reingucken und vielleicht dann schon mal umsetzen.


    Dorbedo schrieb:

    Einfach im Editor die Ausrüstung der spielbaren Figuren ändern reicht nicht?

    Leider nein. Ich hatte es zwar schon soweit das es 50/50 mäßig immer das loadout hatte aber oftmals hatten manche leuts dann einfach mal gar kein equipment ^^ Da hatte ich mit playerspawn.sqf und so gewerkelt. War aber auch nur temporäre lösung.
  • Exportiere doch einfach die Loadouts, die du haben willst, aus dem Arsenal, pack' die in jeweils ein Script und dann rufe diese Scripts so in der initPlayerLocal.sqf auf:

    C-Quellcode

    1. waitUntil {time > 1};
    2. if (player isKindOf "O_Soldier_F") then {
    3. [player] execVM "loadout_soldier.sqf";
    4. };
    5. if (player isKindOf "O_medic_F") then {
    6. [player] execVM "loadout_medic.sqf";
    7. };
    8. if (player isKindOf "O_soldier_SL_F") then {
    9. [player] execVM "loadout_SL.sqf";
    10. };
    Alles anzeigen
    Das ist die mit Abstand einfachste Lösung. Du kannst da auch per (str player == "leader_1") die Namen der Spielereinheiten oder was auch immer du möchtest abfragen oder statt der if-Abfragen einen switch einbauen, aber das Grundprinzip bleibt immer gleich.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Belbo ()

  • Belbo schrieb:

    Exportiere doch einfach die Loadouts, die du haben willst, aus dem Arsenal, pack' die in jeweils ein Script und dann rufe diese Scripts so in der initPlayerLocal.sqf auf:

    C-Quellcode

    1. waitUntil {time > 1};
    2. if (player isKindOf "O_Soldier_F") then {
    3. [player] execVM "loadout_soldier.sqf";
    4. };
    5. if (player isKindOf "O_medic_F") then {
    6. [player] execVM "loadout_medic.sqf";
    7. };
    8. if (player isKindOf "O_soldier_SL_F") then {
    9. [player] execVM "loadout_SL.sqf";
    10. };
    Alles anzeigen
    Das ist die mit Abstand einfachste Lösung. Du kannst da auch per (str player == "leader_1") die Namen der Spielereinheiten oder was auch immer du möchtest abfragen oder statt der if-Abfragen einen switch einbauen, aber das Grundprinzip bleibt immer gleich.


    Tatsächlich war ich irgendwie schon soweit. Und wenn ich per Virtual Arsenal dann alles exportiere und in eine sqf packe hat das mit der alten variante die ich abgeschrieben hatte nicht funktioniert beim direkten Test mit "Test this in Multiplayer" über eden und 'LAN' als Auswahl. Ich probiere das aber jetzt gleich nochmal.

    Muss ich irgendetwas noch in die "meinloadout.sqf" reinpacken oder zu 100% nur das was mir das Virtual Arsenal gibt? Nichts weiter? Denn vorher hieß es "initPlayer.sqf" ^^ Aber jetzt erstmal das direkt probieren.


    Bleibt knusprig.
  • Aber wenn ich "this" drin stehen hab' sagt mir Arma das es eine unbekannte variable ist. _unit geht auch nicht weil schon im initPlayerLocal player drin steht. Nach meinem Verständnis muss ich da jetzt "this" durch "player" ersetzen?
  • Sodenne, ich hab zwar jetzt überall Player drin stehen und bekomme kein Script-Error mehr aber ich hab immer noch das Loadout nicht vorhanden *seufzt* Es ärgert mich ganz schön.
    Ich respawne (weil ja multiplayer) und hab praktisch noch das equipment das der soldat zugewiesen bekommen hat vom eden editor.

    Temporär/Primär gelöst:
    onPlayerRespawn.sqf und hab dort das selbe rein wie bei initPlayerLocal.sqf und damit (scheint es) zumindest jetzt bei mir als Spieler zu funktionieren. Jetzt muss es nur noch auf dem Server für alle funktionieren.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Narsiph ()

  • Ich habe bei meiner Mission einen Dialog, in welcher der Spieler sein Klasse auswählen muss. Im Prinzip das gleiche System.
    Du musst sicherstellen, dass es nur der CLient ausführt. Entweder via Addaction oder in der InitPlayerlocal.sqf.

    Nehmen wir als Beispiel die Initplyayerlocal.sqf

    in diese kommt

    Quellcode

    1. waituntil {sleep 1; !isNull (findDisplay 46)}; //--- wartet bis das Spiel gestartet und der Spieler die Kontrolle hat
    2. execVM "scripte\client\loadout.sqf"

    die Datei an sich

    C-Quellcode

    1. //-- komplett leeren und grundausrüstung, welche für alle gleich ist
    2. //-- in meinem Fall haben alle die gleiche Uniform und den gleichen Helm
    3. player setUnitLoadout [[],[],[],[],[],[],"","",[],["","","","","",""]];
    4. player forceAddUniform "U_B_CombatUniform_mcam";
    5. player addHeadgear "H_HelmetB_camo";
    6. //--- setzt eigenschaft auf null (nur wenn Rolleneigenschaft nicht im Editor festgeschrieben ist)
    7. player setUnitTrait ["Medic",false];
    8. player setUnitTrait ["engineer",false];
    9. player setUnitTrait ["explosiveSpecialist",false];
    10. switch (typeof player) do
    11. {
    12. case "O_Soldier_F": {
    13. comment "Add containers";
    14. player addVest "V_PlateCarrier1_rgr";
    15. for "_i" from 1 to 2 do {player addItemToVest "SmokeShellGreen"};
    16. for "_i" from 1 to 3 do {player addItemToVest "HandGrenade";};
    17. [player,"arifle_MX_Black_F",6,"30Rnd_65x39_caseless_mag"] call BIS_fnc_addWeapon;
    18. player addPrimaryWeaponItem "acc_pointer_IR";
    19. player addPrimaryWeaponItem "optic_Arco";
    20. [player,"hgun_P07_F",2,"16Rnd_9x21_Mag"] call BIS_fnc_addWeapon;
    21. };
    22. case "O_Soldier_GL_F": {
    23. player addVest "V_PlateCarrierGL_rgr";
    24. for "_i" from 1 to 3 do {player addItemToVest "HandGrenade";};
    25. for "_i" from 1 to 10 do {player addItemToVest "1Rnd_HE_Grenade_shell";};
    26. player addItemToVest "1Rnd_SmokeGreen_Grenade_shell";
    27. [player,"arifle_MX_GL_Black_F",6,"30Rnd_65x39_caseless_mag"] call BIS_fnc_addWeapon;
    28. player addPrimaryWeaponItem "acc_pointer_IR";
    29. player addPrimaryWeaponItem "optic_Arco";
    30. [player,"hgun_P07_F",2,"16Rnd_9x21_Mag"] call BIS_fnc_addWeapon;
    31. };
    32. case "O_medic_F": {
    33. player setUnitTrait ["Medic",true];
    34. player addVest "V_PlateCarrierSpec_rgr";
    35. player addBackpack "B_AssaultPack_rgr_Medic";
    36. player addItemToBackpack "Medikit";
    37. for "_i" from 1 to 10 do {player addItemToBackpack "FirstAidKit";};
    38. [player,"arifle_MX_Black_F",6,"30Rnd_65x39_caseless_mag"] call BIS_fnc_addWeapon;
    39. player addPrimaryWeaponItem "acc_pointer_IR";
    40. player addPrimaryWeaponItem "optic_Arco";
    41. [player,"hgun_P07_F",2,"16Rnd_9x21_Mag"] call BIS_fnc_addWeapon;
    42. };
    43. case "...": {... };
    44. case "...": {... };
    45. };
    Alles anzeigen
    Typeof wirft einen String aus, deswegen sind die Klassen in ein "" gepackt
    Gehirn ist keine Seife. Es wird nicht weniger, wenn man es benutzt!

    Beste Band der Welt

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von Drunken Officer () aus folgendem Grund: Aufruf geändert

  • Ah, mit dem Case habe ich das schon mal gesehen, das hatte ich nicht zum Laufen gebracht gehabt. Aber tatsächlich ist der Threat hier super weil alle informationen die man für dieses Loadout-Topic benötigt hier drin sind. Vllt noch irgendwo aber das hier funzt definitiv ^^

    Superriesen dank natürlich an alle :) Ohne euch würde ich auch jetzt noch verzweifeln ^^ Sobald ich mehr Zeit habe widme ich mich dem multiplayer-scripting damit ich ein domination-script für unsere Gruppe machen kann das genau unseren Bedürfnissen entspricht.

    Bleibt alle schön knusprig.
  • Nicht ganz.

    Eine wichtige Erkenntnis ist, dass Scripts die Parameter empfangen, die ihnen bei Ausführung mitgegeben wurden.
    Bspw.:

    Quellcode

    1. [player] execVM "XYZ.sqf";
    In XYZ.sqf taucht jetzt das [ ] vor dem execVM in Form des Arrays _this auf. Hier also ist _this == [player]
    Das bedeutet, dass man die Einträge im Array per select bspw. auswählen kann.
    _this == [player] bedeutet (_this select 0) == player.
    Das kann man durch params sehr viel einfacher abgreifen:
    Der erste Eintrag in XYZ.sqf sollte folgender sein:

    Quellcode

    1. params ["_units"];
    Damit wird in dem Script die lokale Variable _units als der erste Eintrag im Array _this, hier also player, definiert.
    Das sieht folgendermaßen im Endeffekt aus:
    In der initPlayerlocal.sqf steht folgendes:

    Quellcode

    1. [player] execVM "script.sqf";
    In der script.sqf steht folgendes:

    Quellcode: script.sqf

    1. params ["_unit"];
    2. _unit addItem "FirstAidKit";
    Jetzt startet man in die Mission und der Spieler hat ein FirstAidKit mehr. Das geht alles automatisch, durch die initPlayerlocal.sqf (die onPlayerRespawn.sqf wird nur beim Respawn ausgeführt, nicht bei Missionsstart; der Umweg über forceRespawn ist keine gute Idee, weil der viele Dinge wieder verhindert, die man ohne diesen nutzen könnte) und durch params kann man im Loadout-Script alle Referenzen auf das Ziel des Scripts, also wer auch immer etwas empfangen soll, durch _unit ersetzen.

    Überall einfach nur player reinzuschreiben, ist keine gute Idee. Früher oder später stößt man auf Scripts, die gezielt ein bestimmtes Ziel - ein target - ansprechen sollen - da hilft dann player in den Scripts nicht mehr. Deswegen solltest du dir schnellstmöglich eine korrekte Ansprache des targets deiner Scripte angewöhnen.
  • Er muss Player nicht mit _this definieren. Das Script rennt auf dem Client. Dieser kennt den Player und kann es zuordnen.

    Bei einer Variable braucht man keinen künstlichen Array aufbauen.
    VariablenName execVM "script.sqf", würde dann mehr Sinn machen.
    Dann wäre die Variable einfach nur _this.

    Mir fällt gerade auf, dass der Aufruf in der InitPlayerLocal.sqf einfach nur mit

    Quellcode

    1. execVM "Scripte/Client/loadout.sqf"[size=12]

    erfolgen kann.[/size]
    Gehirn ist keine Seife. Es wird nicht weniger, wenn man es benutzt!

    Beste Band der Welt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Drunken Officer ()

  • Dann verweise auf das Wiki. Da wird der Array und die Übergabe gut erklärt.

    In diesem Fall hier, macht ein ArraY zum Übergeben der Argumente einfach keinen Sinn und verwirrt.

    Wenn z.B. Uniformen oder Waffen übergeben werden sollen, sieht die Geschichte wieder anders aus.

    In diesem Sinne, euch allen ein schönes Pfingsten
    Gehirn ist keine Seife. Es wird nicht weniger, wenn man es benutzt!

    Beste Band der Welt
  • Moinsen.

    Ich hatte tatsächlich es schon am laufen, allerdings startet das Multiplayermatch mit einem Respawn durch die Auswahl eines Spawnpunktes und nicht als fester Soldat der erst beim sterben o.Ä. dann respawnt. Daher hatte ich ständig probleme mit initplayer - Das parameter weitergegeben weiß ich natürlich auch aber irgendwas wollte schlichtweg nicht funktionieren und der Grund war tatsächlich das man nicht auf der Map startet sondern schon mit einem Respawn.

    Verwirrend, nicht wahr? ^^
  • Aye, klingt gut! Dann funzt das auch wieder ohne das respawn-script was man aber trotzdem haben kann weil man dann immer gleich sein loadout wieder hat was man haben soll wenn man respawnt, aus welchen gründen auch immer :)

    Ihr seit alle super! :)
  • Einfach das Script was du in der initplayerlocal.sqf aufrufst, auch in die onPlayerRespawn.sqf packen. Dann hat die Puppe bei jedem Respawn die volle vordefinierte Ausrüstung.
    Lies dir dazu die Eventscripts durch
    community.bistudio.com/wiki/Event_Scripts

    Oder soll Respawn = Ausrüstung bei Tod sein?
    Gehirn ist keine Seife. Es wird nicht weniger, wenn man es benutzt!

    Beste Band der Welt