Texturen auf Billboards & Screens

  • Hallo Leute,


    ich benötige Hilfe, bevor ich einen Herzkasper kriege.


    Was ich machen will: Benutzerdefinierte Texturen auf BILLBOARDS auf einem Ded. Server zum Laufen bringen.


    Eigene Texturen einzufügen, ist zunächst total einfacher Popelkram: Ich erstelle .paa oder auch .jpg-Dateien im passenden Seitenverhältnis und in einer Auflösung 1024 x 512, lade sie über die Objekteigenschaften (da gibt es ganz unten eine Zeile für den Pfad). Im Editor erscheinen die JPGs sogar sofort in ihrer ganzen Pracht, PAAs funktionieren auch. Wenn ich selber hoste, ist alles da, sieht gut aus - auch im Singleplayer, aber da funktioniert ja eh immer alles. Es liegt also eher nicht am Objekt-Typ. Einschließlich des Pfades im Missionsordner stimmt alles. Und der Pfad kann auf dem Dedicated Server ja wohl kaum anders sein (jedenfalls nicht relativ zur mission.sqm). In einer Dedicated-Umgebung werden sie jedenfalls um's Verrecken nicht geladen.


    Also, so meine Vermutung zunächst: mal wieder ein Lokalitätsproblem.


    Daher habe ich es statt über die speziellen Objekt-Eigenschaften über die Init-Boxen der Billboards probiert und habe ungefähr 30 verschiedene Varianten der Befehle "setObjectTexture" (lokaler Effekt) und "setObjectTextureGlobal" (globaler Effekt) ausprobiert. Hat in einer gehosteten Umgebung fast alles geklappt. Der Befehl ist also grundsätzlich geeignet. Auf dem Ded. hat aber gar nichts funktioniert, nicht eine einzige Bilddatei wird geladen.


    Ich bin bei meiner Recherche unter anderem über diese kurze Diskussion gestolpert, aber nicht wirklich schlau daraus geworden, was aus KillzoneKid's Argument nun konkret folgt.
    https://community.bistudio.com/wiki/Talk:setObjectTextureGlobal


    Aber ich habe versucht, seine Kritik an dem anderen Fiffi umzusetzen. Es ist vielleicht nicht die eleganteste Lösung, alles über die init-Boxen zu regeln, aber warum funktioniert es nicht, wenn ich dort eingebe:


    Code
    1. this setObjectTexture [0, "texturen\bild.paa];

    (...oder auch .jpg)?




    Der Befehl...

    Code
    1. this setObjectTextureGlobal [0, "texturen\bild.paa];

    ...in der Init-Box kommt mir jedenfalls absurd vor, wo doch die Init-Boxen eh auf jedem Client ausgeführt werden. Wie oft soll man den Befehl denn noch global ausführen? In meiner Verzweiflung trotzdem ausprobiert - funktioniert aber nicht. Die Texturen/Bilder werden offenbar gar nicht initiiert.


    Ach ja: Auch die Vergabe von Var. Namen und das Aufrufen der Befehle über ein externes Script in der init.sqf funktioniert nicht. Falsche Datei?


    Irgendwer hat doch sicherlich Erfahrung damit. Wo bau ich Mist? Und wo läge vermutlich die Lösung? Ich würde mich nämlich gerne mal wieder schöneren Dingen zuwenden als blöden Schildern ;(


    Schonmal danke!

  • Sollte der Tipp mit den Anführungszeichen nicht funktionieren, dann könnte man versuchen, Race Conditions mit dem init-Skript zu vermeiden:

    Code
    1. this spawn {
    2. _this setObjectTexture [0, "texturen\bild.paa"];
    3. };


    Es erscheint mir jedoch seltsam, dass die Editor Objektattribute nicht funktionieren sollen. Obwohl das nicht das erste mal wäre, dass BI etwas verkackt. Oder ist das Attribut von einer Mod wie 3DEN Enhanced? Was ist denn der Klassenname des Billboards?

  • Zitat von Ares

    Dir fehlt ein " am Ende des Dateipfades.

    Ja, das stimmt. Danke für den Hinweis. Ist beim Copy/Paste hier in's Forum passiert, da ist mir ein Anführungszeichen entflutscht, sorry. Im Editor sind die Strings alle astrein.



    @commy:


    Ich nutze 3den Enhanced, ja. Bin mir gerade unsicher, ob er der normale Editor die Option auch bietet. Wäre aber eine Gegenprobe wert.


    Ich habe verschiedene Schilder und Billboards (kein Mod-Content) ausprobiert, u.a.:


    SignAd_Sponsor_F


    Land_Billboard_F



    Interessant ist, dass es auch mit dem


    Land_TripodScreen_01_large_F


    nicht geht. Dort habe ich ein addAction eingerichtet, mit dem man verschiedene Briefing-/Trainingsfolien auf den Screen rufen kann:


    Code
    1. this addAction ["Medikamente", "medical\med2.sqf", nil, 5.9, false, true, "", "", 2];

    Das addAction greift auf eine .sqf zu:


    Code
    1. //med2.sqf
    2. medicscreen setObjectTextureGlobal [0, "texturen\medfolie1.jpg"];

    Funktioniert alles, wenn ich selber hoste, auf dem DedServer aber nicht. Die Screens bleiben schwarz, wenn man die UserAction ausführt. Hier macht ja der Befehl mit dem globalen Effekt Sinn.


    ABER, und da flipp ich aus: Auf einem einzigen Screen scheint es nun doch irgendwie zu gehen. Allerdings gibt es überhaupt keinen Unterschied zu den anderen Screens, außer dass die JPG-Textur, die hier geladen wird, noch leer (=weiß) ist. Die Folien sind von mir/uns noch nicht beschriftet worden, liegen aber in der gleichen Auflösung wie alle anderen Texturen schon im Texturen-Ordner bereit, damit unser Sani-Trainer sie demnächst füllen kann.

  • Bisher hat bei mir ein eintragen des Bildes im Editor, aber auch ein setzen per setObjectTextureGlobal ohne Probleme funktioniert.
    Tippe daher auf ein Pfad-Problem.


    Wie sieht bei dir die Mission aus (Verzeichnissstruktur)? Packst du die Mission als PBO? Sind die Bilder ebenfalls in der PBO?


    So funktioniert es bei uns:
    Struktur:

    Code
    1. Mission.Altis.pbo
    2. - \images
    3. --- \example.paa
    4. - \mission.sqm

    Per <OBJECT> setObjectTextureGlobal [0, "images\example.paa"] wird die Texture gesetzt.
    Die andere Variante ist den Pfad, im Editor dem Object, als Argument für die Texture anzugeben.

  • Die mission.sqm ist nicht binarisiert, da die Map noch nicht fertig ist. Wäre vielleicht einen Test wert, aber daran (an der Entbinarisierung) ist bisher noch nie etwas gescheitert.


    Ordnerstruktur:
    Arma3/mpmissions/TrainingGround --> enthält mission.sqm & init.sqf
    Arma3/mpmissions/TrainingGround/texturen --> bild.paa bzw. bild.jpg


    Wie ich bereits geschrieben habe: Wenn ich selber hoste, funktioniert ja alles. Der Pfad der Texturen ändert sich ja nicht (relativ zur mission.sqm), wenn unser Admin das ganze Paket auf den DedServer schmeißt.


    Zitat von Henne

    Per <OBJECT> setObjectTextureGlobal [0, "images\example.paa"] wird die Texture gesetzt


    Die Syntax des Befehls ist mir klar. Wo und wie genau ruft ihr den Befehl ab, sprich: Wo und wie "setzt" ihr ihn? In der init.sqf? In der init-Box der Objekte? Über eine andere .sqf über execVM?



    Zitat von Henne

    Die andere Variante ist den Pfad, im Editor dem Object, als Argument für die Texture anzugeben.

    Du meinst ganz unten in den Objekt-Eigenschaften, wo man einen Pfad bei bestimmten Objekten (Schildern, Billboards etc) angeben kann? Oder wo? Es könnte mir eventuell helfen, wenn ich ganz genau wüsste, was ihr tut, damit ich das mit meinen bisherigen Versuchen abgleichen kann. Das Allgemeine hilft mir leider nicht weiter...

  • Mir geht es nicht darum ob die Mission binarisiert ist, denn wie dir ja auch bekannt ist, ändert dies nichts an der Funktion.


    Mir geht es darum, ob die Mission und die Texturen zu einer PBO gepackt werden.
    Soweit ich das rauslesen konnte, tust du dies nicht.


    Arma liest normal Missionen und Addons nicht aus Verzeichnissen. Um dies möglich zumachen, muss Arma der Parameter -filePatching übergeben werden. Danach werden die Bilder auch erkannt und gesetzt.


    Trotzdem empfehle ich die Mission zu einer PBO zupacken.

  • Ich werde auch das selbstverständlich ausprobieren, obwohl ich deine Erklärung nicht verstehe. So weit reicht mein Wissen nicht. Betrifft das nur Bilder/Texturen?


    Denn andere Unterordner (mit z.B. Sounddateien oder eigenen Loadscreens) werden auch ohne PBO-Packung in Missionen stets problemlos gelesen, auch in einer dedicated Umgebung :huh:

  • Der Loadscreen und die Sounds werden allerdings auch in der description.ext angegeben.


    Da ich schon immer zu PBO packe, habe ich noch nicht getestet welche Dateien nun geladen werden und welche nicht.


    Kenne aber auch im Bereich Scripting, Probleme die durch ein packen zur PBO behoben werden können.

  • Hi, ich hab relativ wenig Ahnung, aber ich hatte so ein ähnliches Problem.
    Erst nachdem ich die Textur aus einem Addon (pbo) abegfragt hatte ging es.
    Hatte das glaub so:
    this setObjectTextureGlobal [0, "Images\natobase1.paa"];


    Du könntest das leicht probieren wenn du eine Textur direkt aus Arma testest.
    this setObjectTextureGlobal [0,'A3\armor_f_beta\apc_tracked_01\data\apc_tracked_01_aa_body_opfor_co.paa']; <---vom Bobcat


    Gruß
    Muecke

  • ok, nur damit ich richtig verstehe:


    Wenn ich das Szenario nach MP exportiere, wird automatisch eine pbo im Hauptverzeichnis des Spiels (steam/steamapps/common/Arma3/mpmissions) erstellt. Das muss ich ja eh tun, um die Mission selber hosten zu können. Diese .pbo enthält all den Kram, den ich in der Ordnerstruktur relativ zur mission.sqm habe? Und die ist nun also STATTDESSEN auf den DedServer zu laden, ja?

  • Bevor sich Euphorie über die Gewissheit bezüglich der Ursache und Lösung breit macht:


    Ich hab' dem Frieden nicht getraut und noch mal die Gegenprobe gemacht. Plötzlich funktioniert auch der Init-Box-Befehl "this setObjectTexture" überall tadellos, ohne das sonst etwas verändert worden wäre. Oh my dear... vielleicht lag's am Wetter? :/