23.05.2012, 22:38 | #1 (permalink) |
Registriert seit: 31.03.2003
Beiträge: 2.533
|
Kalter Atem Script
Also ich hab heute mal versucht ein 3rd party script zum laufen zu bringen.
Quelle: Simple Breath Fog Script - Page 3 Ich hab das non ACRE ding genommen und in der init.sqf gestartet. Es läuft auch los (kontrolliert mit hint am ende des scripts) aber Atem ist nicht zu sehen bei meinen Zivilisten auf der Karte. Wo könnte der Fehler liegen? Gibt es einen Debugger wo man durch den Code steppen kann? Das wäre sehr hilfreich um solchen Problemen auf die Schliche zu kommen. Im Moment kann ich nur raten aber es ist nicht leicht, da die Erfahrung mit Arma2 gering ist. |
24.05.2012, 12:55 | #7 (permalink) |
Code:
_units = if (!isMultiplayer) then {switchableUnits} else {playableUnits}; {[_x, 0.03] execVM "foggy_breath.sqf"} foreach _units; foggy_breath.sqf: Code:
// Foggy breath 20110122 // modified by Xeno private ["_unit", "_int"]; _unit = _this select 0; _int = _this select 1; //intensity of fog (0 to 1) while {alive _unit} do { sleep (2 + random 2); // random time between breaths _source = "logic" createVehicleLocal (getpos _unit); _fog = "#particlesource" createVehicleLocal getpos _source; _fog setParticleParams [["\Ca\Data\ParticleEffects\Universal\Universal", 16, 12, 13,0], "", "Billboard", 0.5, 0.5, [0,0,0], [0, 0.2, -0.2], 1, 1.275, 1, 0.2, [0, 0.2,0], [[1,1,1, _int], [1,1,1, 0.01], [1,1,1, 0]], [1000], 1, 0.04, "", "", _source]; _fog setParticleRandom [2, [0, 0, 0], [0.25, 0.25, 0.25], 0, 0.5, [0, 0, 0, 0.1], 0, 0, 10]; _fog setDropInterval 0.001; _source attachto [_unit,[0,0.15,0], "neck"]; // get fog to come out of player mouth sleep 0.5; // 1/2 second exhalation deletevehicle _source; deleteVehicle _fog; };
__________________
Niemand hat die Absicht eine Tüte zu bauen! ___<<<A3 Wounding System>>>___ |
|
24.05.2012, 14:34 | #9 (permalink) |
Registriert seit: 31.03.2003
Beiträge: 2.533
|
ich werd das mal mit
Code:
{[_x, 0.03] execVM "foggy_breath.sqf"} forEach allUnits; Und gibt es eigentlich noch nen equivalent zum C++ continue für arma schleifen? Ein distance check wäre da noch ganz nett denke ich für die performance... Code:
while {alive _unit} do { sleep (2 + random 2); // random time between breaths if(_unit distance player > 500) { continue; } ... } Geändert von xezon (24.05.2012 um 14:52 Uhr). |
24.05.2012, 14:53 | #11 (permalink) |
Registriert seit: 31.03.2003
Beiträge: 2.533
|
Ja, hab mir die wurst dadrunter gespart. Habs nochmal editiert mit ein paar pünktchen dann ist es klarer. Schade, continue is ne feine Sache. Aber geht ja auch ohne. |
24.05.2012, 16:42 | #13 (permalink) |
Das sollte natürlich lokal auf jedem Client laufen. Und die particleSource wird nur soweit gerendert wie deine Sichtweite ist. sch***egal die Distanca Abfrage... x-fach bewährtes Konzept auch mit vielen Spielern.
__________________
Niemand hat die Absicht eine Tüte zu bauen! ___<<<A3 Wounding System>>>___ |
|
24.05.2012, 16:59 | #14 (permalink) |
Registriert seit: 31.03.2003
Beiträge: 2.533
|
Im Singleplayer gibt es nur einen Client plus AI. Wahrscheinlich ist es so, dass die particles nicht gerendert werden, aber Rendering ist nicht das einzige was Rechenleistung benötigt. Wenn ein Script unnötigerweise objekte erstellt und löscht dann benötigt das auch Rechenleistung. Gerade bei Videospielen sollte man sparen wo man nur kann. |
24.05.2012, 17:02 | #15 (permalink) |
du bist der boss. dann erfinde das rad neu.
__________________
Niemand hat die Absicht eine Tüte zu bauen! ___<<<A3 Wounding System>>>___ |
|
24.05.2012, 17:57 | #17 (permalink) |
Klar ist das okay. Aber wenn du da schon was ändern möchtest dann musst da viel weiter ausholen indem du fragst wer in deiner Reichweite ist, diesen dann das Script starten lassen und wenn er wieder raus ist auch das komplette Script (loop) verlassen.
Einfach in die Schleife noch eine Abfrage mehr reinpacken und nur den Effekt an sich wegkürzen bewirkt wohl eher das Gegenteil.
__________________
Niemand hat die Absicht eine Tüte zu bauen! ___<<<A3 Wounding System>>>___ |
|
24.05.2012, 20:04 | #18 (permalink) |
Registriert seit: 31.03.2003
Beiträge: 2.533
|
Stimmt. Mal gucken ob ich das hinkriege. Hab das skript jetzt erstmal mit der Abfrage oben erweitert und unten noch ne head model recognition reingeflastert damit der Atem auch da rauskommt wo die AI hinguckt. Die gucken nämlich gerne in die Gegend... Code:
private ["_unit", "_int"]; _unit = _this select 0; _int = _this select 1; // intensity of fog (0 to 1) while {alive _unit} do { sleep (2 + random 2); // random time between breaths if(_unit distance player < 500 || screenToWorld[0.5, 0.5] distance player > 5) then { _source = "logic" createVehicleLocal (getpos _unit); _fog = "#particlesource" createVehicleLocal getpos _source; _fog setParticleParams [["\Ca\Data\ParticleEffects\Universal\Universal", 16, 12, 13,0], "", "Billboard", 0.5, 0.5, [0,0,0], [0, 0.2, -0.2], 1, 1.275, 1, 0.2, [0, 0.2,0], [[1,1,1, _int], [1,1,1, 0.01], [1,1,1, 0]], [1000], 1, 0.04, "", "", _source]; _fog setParticleRandom [2, [0, 0, 0], [0.25, 0.25, 0.25], 0, 0.5, [0, 0, 0, 0.1], 0, 0, 10]; _fog setDropInterval 0.001; _headDir = _unit call CBA_fnc_modelHeadDir; _radius = 0.1; _headX = sin(_headDir select 1)*_radius; _headY = 0.15-sin(abs(_headDir select 1))*_radius; _headZ = (_headDir select 2)/360-0.03; _source attachto [_unit, [_headX, _headY, _headZ], "neck"]; // get fog to come out of player mouth sleep 0.5; // 1/2 second exhalation deletevehicle _source; deleteVehicle _fog; }; }; |
24.05.2012, 23:11 | #19 (permalink) |
Registriert seit: 31.03.2003
Beiträge: 2.533
|
So hab jetzt mal versucht nen manager zwischenzulegen aber die particles sind nun weg. Habs erstmal nur aufm player laufen. Ne idee wo es stockt? Execution kommt bei breathlogic.sqf an und läuft auch durch.
breathmanager.sqf Code:
func_breathCond = compile preprocessFile "scripts\breathcond.sqf"; _func_breathLogic = compile preprocessFile "scripts\breathlogic.sqf"; while {true} do { _near = [player];//nearestObjects[player, ["Man"], 500]; { _hasBreath = _x getVariable["hasBreath", 0]==1; _canBreath = _x call func_breathCond; if(!_hasBreath && _canBreath) then { [_x, 0.03] spawn _func_breathLogic; } } forEach _near; sleep 10; } Code:
_isAlive = alive _this; _isOnFoot = vehicle _this == _this; _isCloseToPlayer = _this distance player<500; _isCinematic = screenToWorld[0.5, 0.5] distance player>5; /*return*/ _isAlive && _isOnFoot && (_isCloseToPlayer || _isCinematic) Code:
private ["_unit", "_int"]; _unit = _this select 0; _int = _this select 1; // intensity of fog (0 to 1) _unit setVariable ["hasBreath", 1]; while {_unit call func_breathCond} do { sleep (2 + random 2); _source = "logic" createVehicle (getpos _unit); _fog = "#particlesource" createVehicle getpos _source; _fog setParticleParams [["\Ca\Data\ParticleEffects\Universal\Universal", 16, 12, 13,0], "", "Billboard", 0.5, 0.5, [0,0,0], [0, 0.2, -0.2], 1, 1.275, 1, 0.2, [0, 0.2,0], [[1,1,1, _int], [1,1,1, 0.01], [1,1,1, 0]], [1000], 1, 0.04, "", "", _source]; _fog setParticleRandom [2, [0, 0, 0], [0.25, 0.25, 0.25], 0, 0.5, [0, 0, 0, 0.1], 0, 0, 10]; _fog setDropInterval 0.001; _headDir = _unit call CBA_fnc_modelHeadDir; _radius = 0.1; _headX = sin(_headDir select 1)*_radius; _headY = 0.15-sin(abs(_headDir select 1))*_radius; _headZ = (_headDir select 2)/360-0.03; _source attachto [_unit, [_headX, _headY, _headZ], "neck"]; sleep 0.5; deleteVehicle _source; deleteVehicle _fog; }; _unit setVariable ["hasBreath", nil]; |
25.05.2012, 06:51 | #20 (permalink) |
...usw. Ich hab mal alles in ein Script gepackt und das preCompile der Funktion welche keine ist weggelassen. Da sind eine ganze Menge Tippfehler und andere ungereimtheiten drinnen gewesen. Ob das jetzt funzt kann ich nicht sagen da ungetestet... Code:
private ["_breath"]; breath_cond = { private ["_bool"]; _bool = if (alive _this && (vehicle _this == _this) && ((_this distance player <= 500) || (screenToWorld [0.5, 0.5] distance player >= 5))) then {true} else {false}; _bool }; _breath = { private ["_unit", "_int"]; _unit = _this select 0; _int = _this select 1; // intensity of fog (0 to 1) _unit setVariable ["hasBreath", 1]; while {_unit call breath_cond} do { sleep (2 + random 2); // random time between breaths _source = "logic" createVehicleLocal (getpos _unit); _fog = "#particlesource" createVehicleLocal getpos _source; _fog setParticleParams [["\Ca\Data\ParticleEffects\Universal\Universal", 16, 12, 13,0], "", "Billboard", 0.5, 0.5, [0,0,0], [0, 0.2, -0.2], 1, 1.275, 1, 0.2, [0, 0.2,0], [[1,1,1, _int], [1,1,1, 0.01], [1,1,1, 0]], [1000], 1, 0.04, "", "", _source]; _fog setParticleRandom [2, [0, 0, 0], [0.25, 0.25, 0.25], 0, 0.5, [0, 0, 0, 0.1], 0, 0, 10]; _fog setDropInterval 0.001; _source attachto [_unit,[0,0.15,0], "neck"]; // get fog to come out of player mouth sleep 0.5; // 1/2 second exhalation deletevehicle _source; deleteVehicle _fog; }; _unit setVariable ["hasBreath", nil]; }; while {true} do { _near = [player];//nearestObjects[player, ["Man"], 500]; { if (_x call breath_cond && (format ["%1", (_x getVariable "hasBreath")] == "<null>")) then { [_x, 0.03] spawn _breath; }; } forEach _near; sleep 10; }; btw: Wesentlich besser ist es jetzt trotzdem nicht. Ich behaupte es macht keinen Unterschied (wenn da nicht grad 1000 KI's sind) ob du da jetzt noch einen loop vorlegst oder alles direkt ausführst. Ich dachte eher an eine .fsm die das checkt und ein array füllt oder eben auch leert. Dieses array enthält dann die Units die Atmen sollen.
__________________
Niemand hat die Absicht eine Tüte zu bauen! ___<<<A3 Wounding System>>>___ Geändert von Pfandgiraffe (25.05.2012 um 08:15 Uhr). |
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
Themen-Optionen | |
Ansicht | |
|
|
Ähnliche Themen | ||||
Thema | Autor | Forum | Antworten | Letzter Beitrag |
Beta-Patch für OpA erschienen | det99 | Community | 1429 | 18.07.2014 16:51 |
Day & Weather Script | Moerderhoschi | Editing & Scripting | 13 | 02.12.2012 10:29 |
Ammobox Script problem | G36Firestorm | Editing & Scripting | 11 | 18.07.2011 15:04 |
marker über script erzeugen | hypercop | Editing & Scripting | 2 | 28.08.2010 22:40 |
Improved Bullet Cam Script | miromanu | Editing & Scripting | 3 | 21.08.2010 01:01 |