PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Objekte mit einem Script löschen.


Duke_87
02.04.2016, 15:21
Hallo,
ich habe ein Script gemacht mit dem ich ein paar Wracks, Müll etc in den Städten spawnen lasse.

_spawnpos = [player, 30, (random 360)] call BIS_fnc_relPos;
veh = createVehicle ["Land_Wreck_Car2_F", _spawnpos,[], 0, "NONE"];
veh setdir 80;

Das Script starte ich mit einem Trigger in dem ich bei Aktivierung folgendes eingetragen habe:
if (({isPlayer _x} count thisList) <= 1) then {execVM "wrecks.sqf"};

Jetzt wird ein Wrack mit dem Namen veh auf der Karte erstellt, um es zu löschen lasse ich bei Deaktiviert ein Script ausführen mit:
deleteVehicle veh;

Das funktioniert auch aber wenn jetzt jemand einen anderen Trigger in einer anderen Stadt auslöst spawnt dort auch ein Wrack aber mit anderem Namen.

Ich lasse manche gespawnte Einheiten mit folgenden Befehl löschen:
{ if (count units _x>0 and side _x==civilian) then {_civiliangroups=_civiliangroups+[_x]; deleteVehicle _x}} forEach nearestObjects [player,[],1500]

Ich bekomme es aber nicht hin es so abzuändern dass auch Wracks oder z.B. Tiere gelöscht werden.

Könnt ihr mir einen Tipp geben wie ich es anstellen kann die Teile wieder zu löschen?

Viele Grüße Duke

Drunken Officer
02.04.2016, 15:42
probiere es mal mit call compile formt

zb. Veh_namedestriggers

Duke_87
02.04.2016, 17:24
Ich hab mir mal einige Beispiele mit call compile formt angesehen und es danach versucht umzusetzen. Aber es funktuioniert nicht, ich denke aber das liegt eher an meiner Umsetzung. Könntest du es mir etwas genauer erklären?

Nokman
02.04.2016, 19:49
Poste mal gerne ein Beispiel was du versucht hast.

Was Drunken vorgeschlagen hat war schon gut das müsste ungefähr so aussehen geht aber leider nicht so einfach da Trigger mit leerzeichen sind und Arma das nicht verkraftet.

if (({isPlayer _x} count thisList) <= 1) then {

[thisTrigger] call {
_spawnpos = [player, 30, (random 360)] call BIS_fnc_relPos;
_veh = createVehicle ["Land_Wreck_Car2_F", _spawnpos,[], 0, "NONE"]; _veh setdir 80;
call compile (format["veh_%1=%2",_this,_veh]);
}
};

Was du machen kanst ist an den Trigger mit setvariable die veh anzuhängen und dann kanste die wieder auslesen.

Sag gerne noch mal was du genau vor hast damit.

Duke_87
02.04.2016, 23:25
Sag gerne noch mal was du genau vor hast damit.

Ich lasse mit einem Script einige Objekte willkürlich in einer Stadt spawnen, z.B.: Wracks, Mülltonnen usw. Das Script wird über einen Trigger aktiviert, wenn der Spieler den Trigger verlässt sollten aber alle gespawnten Objekte auch wieder verschwinden damit die Map nicht zugemüllt wird.

Poste mal gerne ein Beispiel was du versucht hast.
Ich hab die Schnipsel nicht gespeichert weil sie nicht funktioniert haben aber meine Lösung war von deiner Meilen weit entfernt :(
Bin leider noch keine große Leuchte was das Scripten angeht, bei mir steckt das alles noch in den Kinderschuhen.

Nokman
03.04.2016, 06:49
Bin leider noch keine große Leuchte was das Scripten angeht, bei mir steckt das alles noch in den Kinderschuhen.
macht ja schon mal nix alle müssen mal irgendwo anfangen. Ein weg der nicht funktioniert ist auch ein erfolg

Trigger
http://prntscr.com/anhh0s
params [["_bool",false,[true]],"_trigger","_thislist"];
if (_bool) then { //erstellen und Speichern
_var = _trigger getvariable ["muell",""];
if !(typename _var isequalto typename "") exitwith {};
private _save = [];
for "_i" from 1 to 1 do { // Eins wird jetzt erstellt erhöhen für mehr objekte
_muell = ["Land_Wreck_Car2_F","Land_Wreck_Car_F","Land_Wreck_Car3_F"];
_veh = createVehicle [selectrandom _muell, getpos player,[], 50, "NONE"];
_veh setdir random 360;
_save pushback _veh;
};
_trigger setvariable ["muell",_save]; //in MP mission _trigger setvariable ["muell",_save,true];
} else { //löschen und speicherung löschen
if (({isPlayer _x} count _thisList) > 0) exitwith {};
_var = _trigger getvariable ["muell",""];
if (typename _var isequalto typename "") exitwith {};
{deletevehicle _x}foreach _var;
_trigger setvariable ["muell",nil]; //in MP mission _trigger setvariable ["muell",nil,true];
};
//mpmission nur wenn nicht jeder spieler selber sein müll nutzen soll So wird der müll nur einmal erstellt und gelöscht wenn alle weg sind

Im anhang die Testmission. Nur ein spieler löst aus keine KI.

Duke_87
03.04.2016, 11:53
Danke für die Mühe die du dir gemacht hast, ich habe echt viel herum probiert aber die Lösung wäre mir etwas zu hoch gewesen, das hätte ich sie nicht hinbekommen :daumen:

Ich musste das Script noch um folgende Zeile ergänzen:
_veh setPos [getPos _veh select 0, getPos _veh select 1, -0.1];

In der VR hat es wunderbar funktioniert, auf Altis standen aber die Objekte einen Meter weit in der Luft.

Ich habe aber was den Trigger betrifft noch eine Frage.
Ich kann bei der Bedingung einstellen wie der Trigger ausgelöst werden soll.
Mit: this && (vehicle player) in thislist
Löst er mit dem Spieler aus und auch wenn der Spieler in einem Fahrzeug sitzt.
Gibt es die Möglichkeit z.B. das der Trigger nur von Bodeneinheiten ausgelöst wird und Spieler in Helis und Flugzeugen ignoriert werden?

Nokman
03.04.2016, 13:39
Ob ein Spieler in einen Fahrzeug sitzt kann mit (vehicle player) == player getestet werden beide werte sind gleich wenn er zu fuss ist

this && (vehicle player) in thislist && (vehicle player) == player

Duke_87
03.04.2016, 17:54
Das ist gut zu wissen :-) Ich dachte man muss es noch genauer definieren.
Ich weiss das es mittlerweile etwas off Topic ist aber eine vorerst letzte Frage habe ich noch.

Ich lasse momentan die KI um dem Spieler herum spawnen und patrollieren:
_spawnpos = [player, 300+(random 100), (random 360)] call BIS_fnc_relPos;
GroupOne_Inf1 = [_spawnpos , EAST, ["O_soldierU_AAR_F","O_soldierU_AR_F","O_soldierU_F","O_soldierU_AT_F","O_soldierU_medic_F"]] call BIS_fnc_spawnGroup;
[GroupOne_Inf1, getPos player, 150] call bis_fnc_taskPatrol;

Ich weis das ich auch einen Marker setzen könnte und sie um den Marker spawnen lassen könnte. Wäre es aber auch machbar die KI innerhalb des ausgelösten Triggers zu spawnen ohne dem Trigger einen bestimmten namen zu geben?

Nokman
03.04.2016, 19:47
kenne mich jetzt so genau damit nicht aus. Du willst aber das die KI nur innerhalb des Triggers bleibt? Auch wenn der Trigger sich bewegt? Oder Löst du es mit einen Trigger aus und du benötigst den mittelpunkt des Triggers damit die da Rumlaufen?

Duke_87
03.04.2016, 20:00
Ich habe auf Altis über jeder Stadt einen Trigger sitzen der bei Aktivierung dann Einheiten um den Spieler Spawnen lässt. Im Singleplayer funktioniert das Super, im Multiplayer werden aber bei allen Spielern dann die Einheiten gespawnt und das ist... naja problematisch ;-)

Wenn ein Spieler z.B. bei Kavala den Trigger auslöst soll die KI nur in dem Trigger spawnen und nicht auch bei dem Spieler der am anderen Ende der Insel ist.

Ich weis das diese Zeile die Ursache ist:
_spawnpos = [player, 300+(random 100), (random 360)] call BIS_fnc_relPos;

Ich könnte einen Marker setzen und umschreiben:
_spawnpos = [getMarkerPos "mark1", 50+(random 50), (random 360)] call BIS_fnc_relPos;

aber dann müsste ich für jeden Trigger ein eigenes Script machen.. glaube ich zumindest.

Nokman
04.04.2016, 15:17
Das problem ist das jeder einen trigger bekommt. Also der wird von jeden ausgelöst.

Du hast 2 möglichkeiten du erstellst per Script den Trigger Local bei jeden Spieler. https://community.bistudio.com/wiki/createTrigger
dazu bei makeglobal false. Oder im Trigger abfragen ob die Person welche es auslöst auch drine ist.

if (player in thislist) then {_spawnpos = [player, 300+(random 100), (random 360)] call BIS_fnc_relPos;
GroupOne_Inf1 = [_spawnpos , EAST, ["O_soldierU_AAR_F","O_soldierU_AR_F","O_soldierU_F","O_soldierU_AT_F","O_soldierU_medic_F"]] call BIS_fnc_spawnGroup;
[GroupOne_Inf1, getPos player, 150] call bis_fnc_taskPatrol;}

Duke_87
04.04.2016, 15:47
Die erste Methode muss ich mir noch einmal genauer durchlesen, da steige ich noch nicht ganz durch wie ich es umsetzen kann das ein Script den Trigger an verschiedenen Orten erstellen kann.
Dazu müsste ich doch einen Trigger platzieren der das Trigger Script ausführt das dann einen Trigger spawnen lässt welcher dann das Spawnscript ausführt. Aber kommt es dann am Ende nicht aufs selbe heraus wie es momentan schon ist oder denke ich da grade quer?

Bei der zweiten Methode ist es doch so das ich das spawnen nicht mehr über ein Script durchführe sondern den Code direkt in den Trigger packe oder?

Nokman
04.04.2016, 16:35
Also du brauchst kein Trigger ZB die datei init.sqf wird von allen geladen Server und Client beim Start der map bzw connecten.
Da kanste dinge erstellen lassen die zum mapstart da sein sollen wie zb trigger.

ja entweder du führst es direkt aus oder du übergibst thislist in den script.

Wie Rufste jetzt den Script auf?

alternativ kanst du auch überprüfen in bedingung ob der player welches es auslöst local ist damit löst nur der aus welcher da drine ist.

Duke_87
04.04.2016, 17:05
Ich rufe das Script über Trigger auf.

Auslöser Aktivierung:
Typ: Keine
Aktivierung: Bluefor
Aktivierungstyp: Vorhanden

Wiederholbar: ja

Bedingung:
({isPlayer _x && alive _x}count thisList) >= 1;

Bei Aktivierung:
if (({isPlayer _x} count thisList) <= 1) then {execVM "inf_med.sqf"};

Bei Deaktivierung:
{ if (count units _x>0 and side _x==East) then {_Eastgroups=_Eastgroups+[_x]; deleteVehicle _x}} forEach nearestObjects [player,[],2000];

Nokman
04.04.2016, 17:09
({local _x && isPlayer _x && alive _x}count thisList) >= 1;

Duke_87
04.04.2016, 22:56
Wenn ich den Spawn direkt über den Trigger ausführe funktioniert es traumhaft. Jetzt habe ich aber ein weiteres kleines Problem.

Ein Spieler zu Fuß löst den Spawn aus, fährt man mit einem Fahrzeug hinein passiert leider nichts.

Ich vermute es liegt daran das hier:
if (player in thislist) then {......};
noch geprüft werden muss ob der Spieler in einem Fahrzeug unterwegs ist.

Ich habe es wie folgt geändert aber der Erfolg blieb aus:
if (vehicle player == player) then {......};

Ich habe auch die Bedingung probehalber geändert:
this && (vehicle player) in thislist && (vehicle player) == player

Das hat aber auch nicht funktioniert.

War das falsch was ich versucht habe oder liegt der Fehler wo anders?

Drunken Officer
05.04.2016, 16:41
Du mußt schon lesen, was Nokman dir schrieb...
this && (vehicle player) in this list

Nokman
05.04.2016, 18:02
this && (vehicle player) in thislist && (vehicle player) == player
this - sagt nur die bedingung erfüllt zb nur Ost löst aus
(vehicle player) in thislist - Also das Fahrzeug wo der Spieler drine ist ggf der Spieler ist das Fahrzeug ist in der liste.
(vehicle player) == player -- Überprüft ob der Spieler in eien Fahrzeug sitzt wenn nicht sind beide gleich.
alle 3 müssen wahr sein um es auszuführen


Wie du jetzt schon sagtest du sitzt in einen Fahrzeug also wird das 3 nicht wahr sein und somit nicht auslösen.

this && (vehicle player) in thislist wenn es auslösen soll wenn ein spieler zu fuss oder in einen auto drine sein soll.

this && (vehicle player) in thislist && (vehicle player) == player
wenn der Spieler nur zu Fuss drine sein darf. wenn er in ein auto einsteht zählt es als verlassen des gebietes.

Duke_87
05.04.2016, 18:03
Du mußt schon lesen, was Nokman dir schrieb...
this && (vehicle player) in this list

Es ist nicht so als würde ich das was geschrieben wurde überlesen aber so habe ich es auch versucht und es funktioniert nicht so wie ich es mache.

Aktuell startet der Trigger wie folgt:
Bedingung:
({local _x && isPlayer _x && alive _x}count thisList) >= 1;

Bei Aktivierung:
if (player in thislist) then {...}

Bei Deaktivierung:
{ if (count units _x>0 and side _x==Civilian) then {_Civiliangroups=_Civiliangroups+[_x]; deleteVehicle _x}} forEach nearestObjects [Triggername,[],2000];


Es soll ja verhindert werden das mehrere Personen den selben Trigger auslösen und bezwecken das der Trigger aktiv bleibt solange ein Spieler in ihm ist.

Wenn ich es mit this && (vehicle player) in thislist versuche klappt der spawn überhaupt nicht mehr. Ich hab schon versucht auf diverse Arten das einzubauen werde aber dann mit Fehlermeldungen zugepflastert oder der Spawn funktioniert weder zu Fuß noch mit einem Fahrzeug.

Nokman
05.04.2016, 18:05
Schreib mal die Fehlermeldungen.

Duke_87
09.04.2016, 23:22
Sorry für die späte Antwort, ich durfte kurzfristig auf Montage bis heute. Den genauen Fehler kann ich dir morgen geben, es war irgendwas mit ".... erwartet Wert".