Viele Objekte mit einem Skript

  • Mapping

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

  • Viele Objekte mit einem Skript

    Servus liebe Welt,

    ich bin fast am verzweifeln.

    Ich bin gerade dabei eine neue Karte für den Publicserver zubasteln. Auf dieser Karte sollten Schilder aufgestellt werden mit selbst gemachten Bildern.
    nur ist meine frage wo ich gerade festhänge, wie kann ich es machen das die Schilder alle gleich angesrpochen werden?

    Es handelt sich immer um das gleiche Objekt.

    meine Idee wäre diese, aber leider ist da ein fehler. Wer kann bitte helfen.


    Quellcode

    1. _schild: GameObject;
    2. _schild = _this select 0;
    3. If (isServer) then {
    4. _rndAct = floor(random 9);
    5. switch(_rndAct) do {
    6. case 0: {
    7. _schild setObjectTextureGlobal [0,"\bild_1.paa"]
    8. };
    9. case 1: {
    10. _schild setObjectTextureGlobal [0,"\bild_2.paa"]
    11. };
    12. case 2: {
    13. _schild setObjectTextureGlobal [0,"\bild_3.paa"]
    14. };
    15. case 3: {
    16. _schild setObjectTextureGlobal [0,"\bild_4.paa"]
    17. };
    18. };
    19. };
    Alles anzeigen



    da es sich um der Zeit 120 Schilder handel, will ich nicht in jede Init einzeln rein gehen

    wer kann helfen bitte ? :)
  • Also erstens: Wenn du Code postest, dann formatiere ihn doch bitte etwas und füge ihn in einer entsprechenden Code-Umgebung ein. Ich hab das jetzt mal für dich gemacht, aber in Zukunft wäre es nett, wenn du das gleich beim Erstellen der Frage machen könntest :)

    Was willst du mit _schild : GameObject (erste Zeile) bezwecken?

    Ist dein eigentliches Ziel eine Möglichkeit zu finden, über alle in der Mission platzierten Schilder zu iterieren und die dann als Argument für den geposteten Code zu verwenden?
    Entwickler von SQDev
  • Raven schrieb:

    Also erstens: Wenn du Code postest, dann formatiere ihn doch bitte etwas und füge ihn in einer entsprechenden Code-Umgebung ein. Ich hab das jetzt mal für dich gemacht, aber in Zukunft wäre es nett, wenn du das gleich beim Erstellen der Frage machen könntest :)

    Was willst du mit _schild : GameObject (erste Zeile) bezwecken?

    Ist dein eigentliches Ziel eine Möglichkeit zu finden, über alle in der Mission platzierten Schilder zu iterieren und die dann als Argument für den geposteten Code zu verwenden?
    Danke


    Mein Ziel ist quasi diese schon aufgestellten Schilder mit Bilder zu befühlen. da ich aber nicht in jede Init extra was eintragen möchte dachte ich mir ich kann über den _schild ( eigener Hinweis) : GameObject ( Classname des Schildes) ansprechen und die Random bilder anzeigen lassen, das mit den Random Bilder funktionier. nur will ich alle Schilder mit einmal ansprechen. Da es sich auch um die gleichen Objekte handelt.
  • Ah okay

    Hausser schrieb:

    Da es sich auch um die gleichen Objekte handelt.
    Das ist nicht korrekt. Jedes Schild ist ein einzelnes Objekt für sich selbst. Es sind alles Objekte des selben Typs, aber dennoch eigenständige Objekte.


    Um dein Ziel zu erreichen (eine Liste mit allen Schildern, über die du dann iterieren kannst), kannst du dir mal den entities Befehl genauer anschauen: community.bistudio.com/wiki/entities
    Auf den ersten Blick sollte der genau die Funktionalität bieten, die du brauchst.
    Entwickler von SQDev


  • 1. Ich denke mal du hast eine Mission gebaut und keine Karte.
    2. Ich bezweifle, dass "GameObject" ein tatsächlicher Classname ist. Aber wenn du das so schreibst, dann lass ich das mal so stehen.
    3. Es steht soweit ich sehe nirgends geschrieben, wie dieses Skript überhaupt ausgeführt wird. Ist das pro Objekt? Ist das einmal am Missionstart? Läuft es nur auf dem Server oder allen Klienten? Mein Skript wird über die init.sqf aufgerufen.
    4. Ich habe einen isServer-Check eingebaut. Logischerweise soll nur eine Maschine die Texturen auswürfeln, sodass sie überall gleich sind, und mit setObjectTextureGlobal wird die gewählte Textur bereits übers Internet geschickt. Sollte das Skript, wie ich bei deinem annehmen muss, überall ausgeführt, dann würde ein Klient der per JIP nachverbindet selbst erneut die Texturen auswürfeln und mit jedem synchroniseren, wodurch sie mitten in der Mission auf einmal die Schilder ändern...
    5. Da ich nicht weiß, ob es sich um ein Objekt einer Static Simulation (wie Häuser) handelt, habe ich allMissionObjects statt wie vorgeschlagen entities verwendet, damit der Befehl auch sicher die Objekte wiedergibt.
  • commy2 schrieb:



    1. Ich denke mal du hast eine Mission gebaut und keine Karte.
    2. Ich bezweifle, dass "GameObject" ein tatsächlicher Classname ist. Aber wenn du das so schreibst, dann lass ich das mal so stehen.
    3. Es steht soweit ich sehe nirgends geschrieben, wie dieses Skript überhaupt ausgeführt wird. Ist das pro Objekt? Ist das einmal am Missionstart? Läuft es nur auf dem Server oder allen Klienten? Mein Skript wird über die init.sqf aufgerufen.
    4. Ich habe einen isServer-Check eingebaut. Logischerweise soll nur eine Maschine die Texturen auswürfeln, sodass sie überall gleich sind, und mit setObjectTextureGlobal wird die gewählte Textur bereits übers Internet geschickt. Sollte das Skript, wie ich bei deinem annehmen muss, überall ausgeführt, dann würde ein Klient der per JIP nachverbindet selbst erneut die Texturen auswürfeln und mit jedem synchroniseren, wodurch sie mitten in der Mission auf einmal die Schilder ändern...
    5. Da ich nicht weiß, ob es sich um ein Objekt einer Static Simulation (wie Häuser) handelt, habe ich allMissionObjects statt wie vorgeschlagen entities verwendet, damit der Befehl auch sicher die Objekte wiedergibt.
    Entschuldige meine Formuierungs fehler.
    1. ja eine Mission mit dem Editor
    2. GameObject ist ein Platzhalter für das Object
    3.Das Skript sollte über Serverlaufen, von den 120 Objekten sollte es immer zum Serverrestart geladen werden.
    4. verstehe ich nicht , die Bilder sollen halt eine Serverperiode auf den z.B. "Werbetafel leer" auftauchen, gerne mit jedem Server neustart an einem anderen Ort
    5. es handelt sich um reine Static Objekte
  • >es handelt sich um reine Static Objekte
    Solange sie über den Editor platziert wurden und nicht Teil der Karte sind wird der allMissionObjects-Befehl sie finden. entities sollte sie nicht finden.

    >GameObject ist ein Platzhalter für das Object
    Es muss der Classname der Schilder sein, nichts anderes.

    >Das Skript sollte über Serverlaufen, von den 120 Objekten sollte es immer zum Serverrestart geladen werden.
    So wie ich es geschrieben habe, wird es zu jedem Missionsstart ausgeführt, unabhängig ob der Server neugestartet wird. Ein Missionsneustart wird die Schilder neu auswürfeln. Man kann es auch anders schreiben, dass es tatsächlich erst nach einem Serverneustart statt nur einem Missionsneustart neu ausgewürfelt wird, aber ich bin mir nicht sicher, ob das wirklich nötig ist.

    >verstehe ich nicht , die Bilder sollen halt eine Serverperiode auf den z.B. "Werbetafel leer" auftauchen, gerne mit jedem Server neustart an einem anderen Ort
    Ich bin mir nicht sicher, ob du Server oder Missionsneustart meinst. Werden die Schilder über ein anderes Skript bewegt oder gar erst erstellt? Man kann sie erst nach dem Erstellen umtexturieren.
  • Tut mir ja Leid, aber das ist mir immer noch nicht klar was "bis zur neuen Mission" meint. Wenn die Schilder im Editor platziert wurden und es kein Skript o.Ä. gibt, das die Schilder bewegt, dann sind sie immer am selben Platz nach jedem Missionsstart.

    Auch bin ich mir nicht sicher, dass du wirklich Serverrestart meinst. Man muss den Server nicht abschalten, um die Mission zu wechseln oder neu zu starten.
  • ich denke auch wieder reden aneinander vorbei ^^

    Ich bin dabei ein Public Server zuerstellen / neuaufzusetzten mit anderen.... die dort gespielte Mission ist immer eine Karte, die der der Mission kann Wochen sein durchschnitlich 6 Wochen.
    Den wird eine neue Karte Editiert.

    Idee war Werbung für den Hauptclan zu machen. deswegen die Schilder. der Server wird aber wegen Performancegründen alle 6 Sunden neugestartet.
  • Dann sollte der Code den Commy gepostet hat für dich super funktionieren.

    Du musst halt nur den Classname der Schilder haben.

    Sind alle schilder vom selben Typ, Also sieht das Objekt immer gleich aus? Was für Schilder meinst du, sind es Straßenschilder oder Werbetafeln?

    Falls du mehrere verschiedene arten von Schildern hast, muss man das Script leicht abändern.

    Aber am wichtigsten ist erstmal das du den/die Classname(s) von deinen Schildern rausfindest.
  • die Classnames habe ich ja , sind die Werbtafeln leer .... den danke ich erst einmal.

    andere frage kann man auch das skript schreiben das alle werbetafeln leer mit ausnahme einer bestimmt angesprochen werden?

    sprich alle habe ein variablen namen von schild_1 bis schild_ 20 als Beispiel das das " schild_ " soll aber immer das gleiche bild behalten
  • verzeiht :S

    Also die Classnames des Objekts habe ich, es sind die "Werbtafeln leer".

    Danke erst einmal für die bisherige Hilfe.

    Jedoch hätte ich noch eine andere frage, kann man auch das skript so umschreiben das alle nicht "Werbetafeln leer" welche im Editor platziert wurden mit dem Skript angesprochen werden ?

    Beispiel:

    Ich habe 21 Werbetafeln platziert. von den 21 hat jede Tafel ein inviduellen Variablennamen ( schild_1 bis schild_21). Wie kann ich das so schreiben das alle ausser "schild_1" diese Randon Bilder änderung bekommen.
    Geht es auch über die Variablennamen oder , einfachshalber eine andere Werbetafel ( mit anderen Classname) platzieren?
  • C-Quellcode

    1. AlleSchilder = [];
    2. {if ((toLower str _x) find "schild_oder_was_auch_immer" == 0) then {
    3. AlleSchilder pushBack _x;
    4. };} forEach (allMissionObjects "");
    mit dem erstellten Array kannste dann weiter arbeiten.

    Die beste Lösung hat commy2 oben aber schon geboten. Vielleicht lohnt es sich dort mal genauer zu schauen und nachzuvollziehen was er da geschrieben hat.
    :D
  • Hausser schrieb:

    das ist mir schon bewusst , nur kenne nicht alle classname auswendig, und bin nur hin und wieder hier um zuschauen ob wer geschrieben hat.
    Aber danke an alle

    Arma bringt einen config Browser mit, da könnte man nachschauen wie die Classnames sind. Alternativ einen Blick in die mission.sqm werfen.

    Edit:
    Nur Für den Fall, so findet man Classnames in Arma

    Bei meinem Arma wird der Classname bei jedem "hovern" angezeigt:
    :D

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

  • Hi Ebola,

    wie gesagt ich habe den Classname schon und wie ich schrieb ich kenn diese nicht auswendig , wenn ich spontan mal hier im Forum onlinebin um zuschauen ob Antworten gekommen sind, bin ich nicht Automatisch am PC bzw. neben bei am "Bauen".

    Trotzdem Danke

    TeX-Quellcode

    1. // init.sqf
    2. if (isServer) then {
    3. {
    4. private _texture = selectRandom [
    5. "bild_1.paa",
    6. "bild_2.paa",
    7. "bild_3.paa",
    8. "bild_4.paa"
    9. ];
    10. _x setObjectTextureGlobal [0, _texture];
    11. } forEach (allMissionObjects "Land_Billboard_F" - [schild_0]);
    12. };
    Alles anzeigen

    dürfte doch jetzt so funktionieren wie gewünscht oder?

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