HX3 Foren

HX3 Foren (https://hx3.de/)
-   Editing & Scripting (https://hx3.de/editing-scripting-167/)
-   -   addAction und hint im Multiplayer (https://hx3.de/editing-scripting-167/addaction-hint-multiplayer-21655/)

spaccy 10.07.2012 19:19

addAction und hint im Multiplayer
 
Grüße,

es geht mal wieder um ein Problem im Multiplayer. Guckt euch doch mal bitte diesen Code an:

Initzeile im Auto:
Code:

this addAction ["Auto untersuchen", "script\timer.sqf", nil, 5, true, true, "", "_this distance _target < 5"];
timer.sqf:
Code:

private ["_carOne", "_spieler", "_id", "_zeit1", "_i"];

_carOne = _this select 0;
_spieler = _this select 1;
_id = _this select 2;

_zeit1 = 90 + round (random 90);

hint "Fahrzeug ist verschlossen!\n Schloss wird geknackt, bitte warten.";

_carOne removeAction id;
_carOne setfuel 0.05;
clearWeaponCargoGlobal _carOne;
clearMagazineCargoGlobal _carOne;

sleep 3;

// Countdown
for [{_i = _zeit1}, {_i >= 0}, {_i = _i - 1}] do
    {
    // wenn der Spieler dicht genug dran ist
    if (_carOne distance player <= 20) then
        {       
        sleep 0.95;   
        hintsilent format ["Noch %1 Sekunden!", _i];
        };
   
    // wenn der Spieler zu weit entfernt ist
    if (_carOne distance player > 20) then
        {
        hint "Entfernung vom Fahrzeug zu groß";
        waitUntil {_carOne distance player < 20};       
        };
   
    // wenn der Timer auf 0 steht   
    if (_i == 0) then
        {
        _carOne lock false; _carOne engineOn true;
        if (_carOne distance player < 200) then
            {
            hint "Schnell einsteigen!";
            };
        };
    };

Das Problem mit dem Code ist das alle "hint"-Meldungen nur der Ausführende sieht und wenn der Ausführende ein Clientrechner ist, das Auto zum Schluss kurz anspringt dann aber wieder ausgeht und wieder abgeschlossen wird. Kann da jemand von euch helfen?

Buliwyf 10.07.2012 19:56

Schau Dir das hier mal an: Multiplayer framework

Dazu Funktionsmodul auf die Map setzen.
In die init.sqf:
Code:

waitUntil{!(isNil "BIS_MPF_InitDone")};
Und dann Deine hint-Zeilen so ersetzen:
Code:

[nil,nil,rHINT,"Fahrzeug ist verschlossen!\n Schloss wird geknackt, bitte warten."] call RE;
etc... ;)

spaccy 10.07.2012 20:21

Interessant, gibts das auch für hintSilent? Für den Countdown ist eine stille Wiedergabe deutlich angenehmer. Die Frage ob man damit auch das "unlock"-Problem lösen kann steht da dann ja auch noch im Raum. Ich test das mal.

Gruß
spaccy

Buliwyf 10.07.2012 20:39

Hm.. hintSilent taucht in der Liste nicht auf... :( ...somit schätze ich, das es damit nicht geht.

Die Geschichte mit "lock" und dem Motor könntest Du so lösen hoffe ich:
Code:

_carOne setVehicleInit "this lock false; this engineOn true;"; processInitCommands;

spaccy 10.07.2012 21:12

Funzt! Das mit "setVehicleInit" haut hin, danke dafür, den kannte ich noch nicht (obwohl die Bohemia Wiki meine chronische Abendlektüre darstellt).

Ich frage mich ob man vlt. anstatt hint - globalchat oder sidechat nehmen könnte, obwohl ein Ausgeben des Runterzählens der Variablen dann eher blöd aussieht.

spaccy 11.07.2012 08:13

So, ich habs mal mit allen kritischen Punkte mit "setVehicleInit" versucht und es scheint zu gehen.

Siehe hier:
Code:

private ["_carOne", "_spieler", "_id", "_zeit1", "_i"];

_carOne = _this select 0;
_spieler = _this select 1;
_id = _this select 2;

_zeit1 = 90 + round (random 90);

[nil,nil,rHINT,"Fahrzeug ist verschlossen!\n Schloss wird geknackt, bitte warten."] call RE;

_carOne setVehicleInit "this removeAction _id; this setfuel 0.05;"; processInitCommands;
clearWeaponCargoGlobal _carOne; clearMagazineCargoGlobal _carOne;

sleep 3;

// Countdown
for [{_i = _zeit1}, {_i >= 0}, {_i = _i - 1}] do
    {
    // wenn der Spieler dicht genug dran ist
    if (_carOne distance player <= 20) then
        {       
        sleep 0.95;
        _spieler setVehicleInit "hintsilent format ['Noch %1 Sekunden!', _i];"; processInitCommands;
        };
   
    // wenn der Spieler zu weit entfernt ist
    if (_carOne distance player > 20) then
        {
        hint "Entfernung vom Fahrzeug zu groß";
        waitUntil {_carOne distance player < 20};       
        };
   
    // wenn der Timer auf 0 steht   
    if (_i == 0) exitWith
        {
        _carOne setVehicleInit "this lock false; this engineOn true;"; processInitCommands;

        if (_carOne distance player < 200) then
            {
            [nil,nil,rHINT,"Schnell einsteigen!"] call RE;
            };
        };
    };

Im Editor und mit Dedi funktionierts, am Freitag kann ichs mal zu zweit testen.

Gruß
spaccy

spaccy 14.07.2012 18:55

Das Script funktionierte im Test zu zweit soweit ganz gut, leider wird der Actionmenü-Eintrag immer noch nur für den Ausführenden gelöscht. Alle anderen können den Eintrag weiterhin auslösen. Vlt. findet sich da noch ein Lösung.

spaccy 18.07.2012 21:10

So, hab das Problem mit der Entfernung der Actionmenü-Einträge gelöst:
Siehe hier:

Code:

private ["_carOne", "_spieler", "_id", "_wave", "_i"];

_carOne = _this select 0;
_spieler = _this select 1;
_id = _this select 2;


// die globale Zeit-Variable
zeit1 = 0;

// löscht für alle Mitspieler den Actionmenü-Eintrag
[nil, _carOne, "per", rREMOVEACTION, _id] call RE;

// prüfen ob Fahrzeug noch heile ist
if (!(alive carOne)) exitWith { [nil, nil, rHINT, "Fahrzeug ist zerstoert!"] call RE; };

[nil, nil, rHINT, "Fahrzeug ist verschlossen!\n Schloss wird geknackt, bitte warten."] call RE;

_carOne setVehicleInit "this setfuel 0.05;"; processInitCommands;

sleep 3;


// Countdown
for [{_i = 20 + round (random 20)}, {_i >= 0}, {_i = _i - 1}] do
    {
    // wenn der Spieler dicht genug dran ist
    if (_carOne distance player <= 20) then
        {
        zeit1 = _i;
        publicVariable "zeit1";       
        sleep 0.95;       
        _spieler setVehicleInit "hintsilent format ['Noch %1 Sekunden!', zeit1]"; processInitCommands;
        };
   
    // wenn der Spieler zu weit entfernt ist
    if (_carOne distance player > 20) then
        {
        [nil, nil, rHINT, "Entfernung vom Fahrzeug ist zu gross!"] call RE;
        waitUntil {_carOne distance player < 20};       
        };
   
    // wenn der Timer auf 0 steht   
    if (_i == 0) exitWith
        {
        _carOne setVehicleInit "this lock false; this engineOn true;";
        processInitCommands;


        _carOne setVehicleInit 'this addAction ["Benzin einfuellen", "script\refuel.sqf", nil, 5, true, true, "", "_this distance _target<5 and _this getVariable ''schleppen''== 1"];'; processInitCommands;

        if (_carOne distance player < 200) then { [nil, nil, rHINT, "Schnell einsteigen!"] call RE;};       
        };
    };

Danke nochmal an Buliwyf für deine Hilfe.

Gruß
spaccy


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:04 Uhr.

Angetrieben durch vBulletin, Entwicklung von Philipp Dörner & Tobias


SEO by vBSEO 3.2.0 ©2008, Crawlability, Inc.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119