Städte per Script bevölkern

  • Ich versuche aktuell Orte/Bereiche mit Zivilisten zu versehen. Dazu habe ich mir überlegt die entsprechenden Bereiche mit Markern zu whitelisten und die Anzahl der Zivilisten anhand der Markergröße zu bestimmen.
    Mein aktuelles Script sieht folgendermaßen aus und wird in der "InitServer.sqf" aufgerufen.
    Ich bekomme aktuell eine Fehlermeldung auf Zeile 16, dass 3 Elemente erwartet werden aber keine übergeben würden.

  • Also laut wiki gibt findEmptyPosition einen leeren Array und nicht [0,0,0] zurück, weswegen du vllt deine if-Abfrage ändern musst.
    Dann die Standardfrage: Hast du schon geguckt, dass deine Position auch wirklich so ist, wie du denkst? Also hast du sie dir mal ausgeben lassen?


    Und zu guter letzt gibt createUnit nichts zurück, sodass du das keiner Varablen zuweisen kannst (Keine Ahnung ob der Fehler daher kommt, aber n Versuch wärs wert ;) )


    MFG Raven

  • Hab das Script gerade ausprobiert und ebenfalls den beschriebenen Error bekommen. Hab es dann nochmal probiert und nun geht es!????? Habe ArmA neu gestartet und im Editor schnell alles nötige zusammen geklickt. (Player Unit, Marker(civTown), Debug Konsole aktiviert). Funktioniert auch, ohne Fehler im Log.

  • Hab es dann nochmal probiert und nun geht es!?????

    Ach ja... ArmA ist einfach eine b*tch xD



    Versuch mal das Ganze so zu machen:

    Ich hab mir mal erlaubt, den while{true} raus zu nehmen, da mir das immer schmerzt, sowas im Code zu sehen :whistling:
    Müsste so eig genauso funktionieren (Angaben ohne Gewähr...) und ist meiner Meinung nach deutlich deskriptiver ;)

  • So habe es etwas umgebaut :)
    Die while{true} wird bleiben :P Da alle Variablen sinnvoll benannt sind sollte es sich trotzdem debuggen lassen und an der Performance dürfte es kaum einen Unterschied machen.
    Da Arma scheinbar ein Gruppenlimit hat wird jetzt pro Marker nur eine Gruppe erstellt und die AI gestoppt damit diese nicht in Formation rennen :)
    Das geänderte Script

  • So wieder mal ein paar Änderungen.
    -Count statt while{true}
    -Fehlerbehebung Markergröße. Arma gibt nur "halbe" Kanten zurück.
    -angebbare Bevölkerungsdichte
    -Anpassung des Random. Marker Mitte mehr aufkommen als Rand.


    Geplant
    -leer stehende Fahrzeuge
    -Bewegung der Zivilisten

  • Kann da mal wer drüber schauen? Bekomme "allgemeiner Fehler in Ausdruck" auf Zeile 15.


    Wenn ich mir _marker und _units ausgeben lasse enthält _marker das übergebene Array und _units 0.
    Wenn ich jetzt Zeile 8 durch folgendes ersetze


    Code
    1. (_this select 0) params ["_marker","_units"];

    enthält _marker den Marker und _untis die Einheiten. So wie es sein sollte.
    Allerdings knallt mir dann der doMove in Zeile 11 mit dem Fehler "0 Elemente angegeben 3 erwartet"; Wenn ich die fn_createRandomPosition in Zeile 28 aufrufen gibt sie mir eine Position zurück. Wenn sie in Zeile 11 vom PerFrameHandler aufgerufen wird bekomme ich ein leeres Array.

  • Wenn ich mir _marker und _units ausgeben lasse enthält _marker das übergebene Array und _units 0.
    Wenn ich jetzt Zeile 8 durch folgendes ersetze (...) So wie es sein sollte

    Das hängt mit der Funktionasweise von dem CBA-PFH zusammen. Wenn du mal hier in Zeile 25-34 schaust, siehst du, dass die Parameter nochmals in ein "Über-Array" gesteckt werden und als zweiten Parameter noch der entsprechende Handle übergeben wird...


    Bekomme "allgemeiner Fehler in Ausdruck" auf Zeile 15.

    Da du durch die "falsche" Verwendung des params (falsch weil er was anderes gemacht hat, als du es wolltest (siehe ersten Teil)) in _units eine Zahl und keinen Array gespeichert hast, wirft dir der count einen Fehler, da er auf einfache Zahlen nicht angewendet werden kann.


    Allerdings knallt mir dann der doMove in Zeile 11 mit dem Fehler "0 Elemente angegeben 3 erwartet";

    Das bedeutet, dass deine Funktion fn_createRandomPosition ein leeres Array zurück gibt, was zu 99%-iger Sicherheit wieder mit findEmptyPosition zusammen hängt. Dh. da musst du irgendeinen SafeCheck einbauen, dass dir das Ding auf jeden Fall eine vernünftige Position zurück gibt.



    Wenn ich die fn_createRandomPosition in Zeile 28 aufrufen gibt sie mir eine Position zurück. Wenn sie in Zeile 11 vom PerFrameHandler aufgerufen wird bekomme ich ein leeres Array.

    Da würde ich einfach mal mit-loggen, um zu sehen, dass du auch wirklich den entsprechenden Marker übergeben bekommst. Ansonsten versuchs mal ohne das findEmptyPosition, um zu schauen, obs daran liegt oder an was anderem...

  • Code: pfh_args.sqf
    1. params ["_args", "_handle"];
    2. _args params ["_args", "_handle"];

    Ich würde empfehlen, nur einen PFH hinzuzufügen, der dann über alle Marker in einem Array läuft.


    Außerdem würde ich empfehlen, dass aus diesem Marker-Array gelöschte Marker herausgenommen werden und das neue Marker hinzugefügt werden können.
    Sollte das Hinzufügen von Markern nicht gewünscht sein, aber das Löschen, dann empfehle ich, dass sich der PFH selbst entfernt, wenn keine Marker mehr vorhanden sind.


    Im Moment sieht der PFH nur wie ein Schleifenersatz aus.

  • Sehe ich ähnlich wie Raven.
    Der große Unterschied liegt doch darin, das ich den "Thread" nicht schlafen schicke sondern den Aufruf tatsächlich nur alle x Frames ausführe. Zumindest verstehe ich den PFH mit Zeitangabe so.


    Habe den Fehler in der Funktion gefunden. Ich habe auf _markerSizeX und _markerSizeY zugegriffen die in der Funktion nicht definiert wurden. Beim spawnen sind die Variablen außerhalb definiert gewesen, um den aicount zu errechnen.