PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Marker in einem zufälligen Feld setzen


TimmK
02.07.2016, 21:23
Moin,
ich möchte auf der neuen Map(Tanoa) ein Marker in einem Reisfeld setzten. Allerdings haben Pflanzen ja kein Classname, oder?? Somit kann ich ja nicht einfach eine zufällige Position suchen und dann mit nearestObject eine Reispflanze finden. Geht das irgendwie anders oder ist das überhaupt nicht möglich?

MfG Tim

Nokman
03.07.2016, 11:58
also es geht schon. Ich weis nur gerade nicht wo Reisfelder auf der map sind aber stelle dich mal in ein Reisfeld rein und mach
nearestTerrainObjects [player, [], 5, false]
dann sollteste wissen wie reis bezeichnet wird und so kann man es auf der Map finden.

TimmK
03.07.2016, 14:35
Ja dann bekomm ich als Rückgabe ja die ID und das Modell was genutzt wird.
[297170: b_sugarcane_sapling_row_f.p3d,297165: b_sugarcane_sapling_row_f.p3d,...]
Wenn du jetzt meinst das einzusetzen kommt xyz = [] raus. xyz = nearestTerrainObjects [player, ["b_sugarcane_sapling_row_f"], 5, false] Mit nearestObject und nearestObjects funktioniert es auch nicht.

MfG Tim

Pfandgiraffe
04.07.2016, 10:34
Falls das Reisfeld einen eigenen definierten Untergrund hat kannst du es evtl. damit finden.

https://community.bistudio.com/wiki/surfaceType


Dann müsstest du um es automatisch zu finden jedoch immer noch die Karte mit einem Dummy-Objekt was in einem bestimmten Raster über die Map wandert und den Untergrund abfragt. Ist also relativ aufwändig.

Wäre also einfacher die Positionen aller Reisfelder in ein Array aufzunehmen und aus diesem dann eine zufällige Position zu wählen.

_alleFelderPos = [[1,2,3],[3,2,1],[4,5,6]];
_randomFeldPos = selectRandom _alleFelder;
_reisMarker = createMarker ["reis",_randomFeldPos];

Grüße

TimmK
05.07.2016, 18:56
Erstmal Vorweg ich habe am Anfang ausversehen Resifelder geschrieben, allerdings ist das Zuckerrohr was da auf Tanoa wächst:rolleyes:.
Das Problem an einem Array mit allen Positionen ist das es relativ viele Zuckerrohrfelder gibt.
Es gibt ja den Befehl nearestTerrainObjects, mit dem man unter anderem jeglichen Art von Busch finden kann der in einem bestimmten Umkreis ist.
https://community.bistudio.com/wiki/nearestTerrainObjects
nearestTerrainObjects [player,["BUSH"],20] ;
Unter anderem fndet man damit auf Zuckerrohr.
Wäre es nicht irgendwie möglich eine neue type name zu erstellen und dort dann nur das Zuckerrohr reinzumachen???
nearestTerrainObjects [player,["SugarCane"],20] ;

Pfandgiraffe
05.07.2016, 19:11
Nicht ohne Mods oder sogar einer komplett neuen Insel. Hast du surfaceType getestet?

Sarogahtyp
06.07.2016, 07:50
Wenn du mit nearestTerrainObjects deine zuckerpflanzen als objekt bekommst, dann kannst du doch mit typeOf nachschauen ob die nen classname haben...

Wenn es einen classname gibt:
Um die arbeit der feldersuche nicht während der missi machen zu müssen, würede ich ein script schre9ben welches die komplette map scannt und alle felderpositionen in ein array packt, welches du dann mit diag_log oder copyToClipboard ausgibst. Danach kopierst du das array in ein script und kannst damit selectRandom machen.

TimmK
09.07.2016, 01:14
Hatte die letzten Tage viel zu tun, deswegen eine etwas verspätete Antwort.

@Pfandgiraffe
Der Boden ist ganz normales Grass wie es auch neben den Feldern überall ist.

@Sarog
Das Problem ist ja das es meines Wissens nach keine Classnames für Pflanzen gibt. Die Felsen haben ja auch erst mit der Einführung in den Editor ein Classname erhalten.
Auch mit typeOf wird kein Classname angezeigt, was ja bestätigt das sie keine Classnames haben.

MfG Tim

Sarogahtyp
09.07.2016, 08:22
dann mach aus den zurückgegebenen objekten einen string und suche mit find nach dem modellnamen. Damit kannst du die felder 8dentifizieren.


objekt_str = str objekt;
If ( objekt_str find "b_sugarcane_sapling_row_f.p3d" != -1) then
{ hint "zuckerfeld";}
else
{hint "kein zuckerfeld";};

So sollte es gehen, hab ich aber nicht getestet.

Edit:

_worldhalf = worldSize / 2;
_farthest_point = sqrt (_worldhalf * _worldhalf + _worldhalf * _worldhalf);
_worldcenter = [_worldhalf, _worldhalf];

_sugar = (nearestTerrainObjects [_worldcenter, "BUSH", _farthest_point, false]) select
{
_its_sugar = false;
_obj_str = str _x;
if ( obj_str find "b_sugarcane_sapling_row_f.p3d" != -1) then {_its_sugar = true;};
_its_sugar
};

_sugar_posis = _sugar apply {getPos _x};
copyToClipboard str _sugar_posis;


Das sollte die map nach allen zuckerpflanzen durchsuchen und die positionen als array in die zwischenablage kopieren...

TimmK
09.07.2016, 23:36
Diese Script sucht jetzt eine zufällige Position und sucht dann nach Zuckerrohr und setzt einen Marker:

_centerPos = []call BIS_fnc_randomPos;
_sugarPos = [];
_bushes = nearestTerrainObjects [_centerPos, ["Bush"], 200,true];
for [{_x= 0},{_x <= count _bushes},{_x = _x + 1}] do
{
_testBush = _bushes select _x;
if (str (_testBush) find "b_sugarcane_sapling_row_f"!=-1) then
{
_sugarPos = getPos (_bushes select _x),
};
if (count _sugarPos == 1)exitWith{};
_sugarPos;
};
_marker = createMarker ["Marker_1", _sugarPos];
_marker setMarkerShape "ICON";
_marker setMarkerType "hd_dot";

Übrigens sortiert nearestTerrainObjects die Objekte von weit zu nah und nicht wie es im Wiki steht von nah zu weit(wenn sort auf true ist). Wenn sort auf false steht wird von der nordöstlichsten Ecke zur südwestlichsten Ecke sortiert.

Nochmal danke für eure Hilfe :daumen:
Tim

Sarogahtyp
10.07.2016, 08:57
_sugarPos = nil;

while {isNil "_sugarPos"} do
{

_centerPos = [] call BIS_fnc_randomPos;
_bushes = nearestTerrainObjects [_centerPos, ["Bush"], 200,false];

{

if ((str _x) find "b_sugarcane_sapling_row_f"!=-1) exitWith {_sugarPos = getPos _x;};

} count _bushes;
};

_marker = createMarker ["Marker_1", _sugarPos];
_marker setMarkerShape "ICON";
_marker setMarkerType "hd_dot";


Dies deckt auch gleich den Fall ab wenn kein zuckerrohr in _bushes ist, dann wird gleich eine neue zufallsposition ermittelt und dort gesucht. Das läuft solange bis was gefunden wird.

For do ist meines wissens etwas langsamer als count und ich würd nearestTerrainObjects nicht sortieren lassen weil es dann auch schneller läuft. Du möchtest ja eh ne zufällige position haben, da ist das nicht notwendig.