15.11.2013, 07:39 | #1 (permalink) |
Registriert seit: 03.07.2012
Beiträge: 118
|
Random Distance
Hey,
ich würde eine Gruppe gerne innerhalb eines zufälligen Radius zum SpawnMarker erstellen lassen. Gibt es da eine Möglichkeit, die mit dem Script hier kompatibel ist? In etwa wie das Rotmarkierte, nur in funktionierend sozusagen ^^ Code:
if (!isServer) exitWith {}; _grp1patr = [markerPos "Wald" + (Random 100), EAST, ["TK_Commander_EP1", "TK_Soldier_EP1", "TK_Soldier_MG_EP1", "TK_Soldier_GL_EP1", "TK_Soldier_Medic_EP1", "TK_Soldier_AR_EP1"]] call BIS_fnc_spawnGroup; [_grp1patr,"area2","Spawned","Combat","delete:",30] execVM "scripts\upsmon.sqf"; Danke und Gruß |
15.11.2013, 08:58 | #2 (permalink) |
Ja das ist doch so ok warum sollte das nicht gehen? Allerdings dachte ich, der Befehl heißt getMarkerPos "markerName"...naja, jedenfalls machst du darum einmal runde Klammern und kannst dann random 100 gerne benutzen, allerdings erzeugt dir das beliebige Kommazahlen, daher kannst du, musst du aber nicht, mit round ceil oder floor runden.
|
|
15.11.2013, 09:58 | #3 (permalink) |
Registriert seit: 03.07.2012
Beiträge: 118
|
Danke schonmal!
Ob MarkerPos oder GetMarkerPos scheint nicht relevant zu sein, funktioniert zumindest augenscheinlich beides gleichwertig. Ich hab jetzt nochmal ...[(markerPos "Wald" + random 100),... ...[(getMarkerPos "Wald" + random 100),... ...[(markerPos "Wald") + random 100,... ...[(getMarkerPos "Wald") + random 100,... probiert, aber das Script läuft bei allen Varianten nicht durch, sprich es werden keine Einheiten gespawnt, geschweige denn in zufälliger Distanz zum Marker |
15.11.2013, 17:11 | #4 (permalink) |
Zunächst: Wenn du mit Skripten arbeitest, IMMER mit -showScripterrors starten, nur dann werden dir Compilerfehler angezeigt, sonst suchst du zu Tode. Ich denke ,es liegt nur an den falschen Klammern. Markerpos erwartet 1 Parameter, du hast danach aber noch einen, daher probier mal (getMarkerPos "Wald") + random 100. Geht das nicht, probier ichs nachher selbst
Edit: Sorry sehe erst jetzt, dass du 4 Varianten probiert hast. Ich habe leider völlig geschlafen. Das skript möchte ja eine POSITION. Das ist aber vom Typ position, also ein 2D-Array mit [x,y]-Koordinate. Natürlich ist es daher nicht möglich, auf markerPos "wald" irgendwie + 100 zu rechnen, was du machen musst ist folgendes: (markerpos "Wald" select 0) + random 1oo // für x-Koord. (markerpos "Wald" select 1) + random 100 // für y-Koord. Das wären jetzt aber 2 Zahlenwerte, das Skript erwartet aber den Datentyp POSITION, also wieder das ganze in ein Array schreiben (daher am besten AUßERHALB deines Funktionsaufrufes als Hilfsvariable anlegen... [[(markerPos "Wald" select 0) + random 100, (markerPos "Wald" select 1) + random 100)], ...] Geändert von [GNC]JamesRyan (15.11.2013 um 17:15 Uhr). |
|
15.11.2013, 21:29 | #5 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Eine Funktion welche eine zufällige Position im Bereich einer Position zurückgibt:
Code:
//Funktion: Rückgabe einer Position mit Bereich des 2. Parameters um die Position im 1. Parameter //Aufrufbeispiel: ([Eine Position,Bereich um die Position] call Funktion_Bereich); Funktion_Bereich = { [ ((_this select 0)select 0) - (_this select 1)/2 + random(_this select 1), ((_this select 0)select 1) - (_this select 1)/2 + random(_this select 1) ] }; //Testaufruf welche den Spieler um seinen Standort herum im Bereich von 100m versetzt: player setPos ([position player,100] call Funktion_Bereich); |
16.11.2013, 04:31 | #6 (permalink) |
Registriert seit: 03.07.2012
Beiträge: 118
|
Danke nochmals für Eure Hilfe, auch wenn das wie staubtrockener Zement für mein Gehirn ist!
Zumindest Viennas Lösung konnte ich schonmal zum Laufen bringen. Code:
if (!isServer) then exitWith {}; _grp1patr = [getMarkerPos "Wald", EAST, ["TK_Commander_EP1", "TK_Soldier_EP1", "TK_Soldier_MG_EP1", "TK_Soldier_GL_EP1", "TK_Soldier_Medic_EP1"]] call BIS_fnc_spawnGroup; [_grp1patr,"area2","Spawned","Combat","delete:",30] execVM "scripts\upsmon.sqf"; //Viennas Random-Distance-Funktion Funktion_Bereich = { [ ((_this select 0)select 0) - (_this select 1)/2 + random(_this select 1), ((_this select 0)select 1) - (_this select 1)/2 + random(_this select 1) ] }; //(leader _grp1patr) setPos ([MarkerPos "Wald",100] call Funktion_Bereich); {_x setPos ([MarkerPos "Wald",100] call Funktion_Bereich)} foreach units _grp1patr; Das sind aber beides auf jeden Fall gute Lösungen, da die Gruppe sich relativ zügig zum Leader begibt oder aber es im zweiten Fall auch gut aussieht, wenn die Gruppe erstmal verstreut spawned. Gibt es da auch einen Weg, der gesamten Gruppe den selben Zufallspunkt zuweisen zu lassen? Was JamesRyan gesagt hat, leuchtet mir zwar irgendwie ein, aber ich habe leider keine Ahnung, wie ich das bewerkstellige. Das sah dann in etwa so aus Code:
if (!isServer) exitWith {}; _array = [[(markerPos "Wald" select 0) + random 100, (markerPos "Wald" select 1) + random 100]]; _grp1patr = [getPos _array, EAST, ["TK_Commander_EP1", "TK_Soldier_EP1", "TK_Soldier_MG_EP1", "TK_Soldier_GL_EP1", "TK_Soldier_Medic_EP1"]] call BIS_fnc_spawnGroup; [_grp1patr,"area2","Spawned","Combat","delete:",30] execVM "scripts\upsmon.sqf"; Code:
if (!isServer) exitWith {}; _array setVariable [[(markerPos "Wald" select 0) + random 100, (markerPos "Wald" select 1) + random 100]]; _grp1patr = [getPos _array, EAST, ["TK_Commander_EP1", "TK_Soldier_EP1", "TK_Soldier_MG_EP1", "TK_Soldier_GL_EP1", "TK_Soldier_Medic_EP1"]] call BIS_fnc_spawnGroup; [_grp1patr,"area2","Spawned","Combat","delete:",30] execVM "scripts\upsmon.sqf"; Gruß |
16.11.2013, 08:28 | #7 (permalink) |
Wenn Viennas Lösung funktioniert, ist doch gut Ist ja meine Lösung nur mit einem gemittelten Abstand.
Noch ein wort zu deinem letzten Code: So kann es nicht funktionieren. _array ist bei dir schon vom Typ Position, warum dann noch ein getpos davor? Geht sowieso nicht ,da getPos ein SPIELOBJEKT erwartet, _array aber eine lokale Variable ist. Einfach getpos weglassen und der Code. Allerdings hast du auch zu viele eckige Klammern. Eine Position ist vom Typ pos = [x,y], also bitte keine zwei Eckigen Klammern. Dann sollte auch das gehen. SetVariable macht da allerdings gar keinen Sinn, gleich streichen ^^ |
|
16.11.2013, 08:44 | #8 (permalink) |
Registriert seit: 03.07.2012
Beiträge: 118
|
War auch auf gar keinen Fall mit nem scharfen Unterton von mir gemeint
Ganz im Gegenteil, deine Lösung find ich sehr interessant und das ist auch eigentlich eher das, was ich gesucht hatte! Hab es dann jetzt auch nach deinem letzten Post gerade, zu meiner Überraschung, im ersten Versuch zum Laufen gebracht! Code:
if (!isServer) exitWith {}; _randomDistance = [(markerPos "group" select 0) + random 100, (markerPos "group" select 1) + random 100]; _grp1patr = [_randomDistance, EAST, ["TK_Commander_EP1", "TK_Soldier_EP1", "TK_Soldier_MG_EP1", "TK_Soldier_GL_EP1", "TK_Soldier_Medic_EP1", "TK_Soldier_AR_EP1"]] call BIS_fnc_spawnGroup; [_grp1patr,"area2","Spawned","Combat","delete:",30] execVM "scripts\upsmon.sqf"; Also großen Dank nochmal an euch beide! |
16.11.2013, 09:18 | #9 (permalink) |
Registriert seit: 03.07.2012
Beiträge: 118
|
Finale Version (sonst spawnen die Gruppen nur NordWest/SüdOst etc. vom Marker). Also doch eine Mischung aus beiden Antworten.
Code:
if (!isServer) exitWith {}; _randomDistance = [(markerPos "group" select 0) - 100/2 + random 100, (markerPos "group" select 1) - 100/2 + random 100]; _grp1patr = [_randomDistance, EAST, ["TK_Commander_EP1", "TK_Soldier_EP1", "TK_Soldier_MG_EP1", "TK_Soldier_GL_EP1", "TK_Soldier_Medic_EP1"]] call BIS_fnc_spawnGroup; [_grp1patr,"area2","Spawned","Combat","delete:",30] execVM "scripts\upsmon.sqf"; |
16.11.2013, 09:39 | #10 (permalink) |
Natürlich, wir hatten ja nur random (eine Zahl), was nix anderes als immer + rechnet. Möchtest du eine Variable Distanz in beide Richtung, ist meine Lösung hier immer einen cos davorzusetzen, denn der cos nimmt nur werte zwischen -1 und 1 an, also genau eine Vorzeichenmöglichkeit. So kann man gut mit cos(random 360) beliebige Werte erzeugen, die gleichzeitig auch einen Nachfaktor bbeliebig skalieren, also z.B: (cos(random 360)*random 100) sollte alle Werte zwischen -100 und + 100 annehmen
|
|
16.11.2013, 11:57 | #11 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Bei [GNC]JamesRyans Variante erfolgt die Plazierung um den Mittelpunkt eines Kreises, bei meiner Variante um den Mittelpunkt eines Quadrates.
Hier nochmals beide Varianten zur Übersicht. Kreisförmig Code:
//Funktion: Rückgabe einer Position mit Bereich des 2. Parameters um die Position im 1. Parameter //Aufrufbeispiel: [Eine Position,Bereich um die Position] call Funktion_Bereich Funktion_Bereich = { [ ((_this select 0)select 0) + cos(random 360)*(random (_this select 1)/2), ((_this select 0)select 1) + cos(random 360)*(random (_this select 1)/2) ] }; Code:
//Funktion: Rückgabe einer Position mit Bereich des 2. Parameters um die Position im 1. Parameter //Aufrufbeispiel: [Eine Position,Bereich um die Position] call Funktion_Bereich Funktion_Bereich = { [ ((_this select 0)select 0)-(_this select 1)/2+random(_this select 1), ((_this select 0)select 1)-(_this select 1)/2+random(_this select 1) ] }; Code:
temp = [player, getMarkerPos "MarkerName"] spawn { while{true}do { _this select 0 setPos ([_this select 1,100] call Funktion_Bereich); sleep 1 } }; |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
|
|
Ähnliche Themen | ||||
Thema | Autor | Forum | Antworten | Letzter Beitrag |
Distance Sounds | JSR | Editing & Scripting | 14 | 21.11.2013 18:55 |
Random Weaponscript laden @ Respawn | zerogott | Editing & Scripting | 2 | 24.10.2013 15:43 |
[Modsuche] Suicide Bombers and Random IED Mod | JSR | Mods & Addons | 1 | 07.12.2012 12:00 |
Arti eine gewisse Zeitlang in ein Gebiet schießen lassen | Bruklin | Editing & Scripting | 10 | 25.08.2010 16:44 |
Random Funktion in Evo | WickerMan | Editing & Scripting | 6 | 15.06.2010 16:40 |