HX3 Foren

HX3 Foren (https://hx3.de/)
-   Editing & Scripting (https://hx3.de/editing-scripting-167/)
-   -   Missionsparameter Auswahl - paramsarray (https://hx3.de/editing-scripting-167/missionsparameter-auswahl-paramsarray-20260/)

Spiderman 11.01.2011 23:42

Missionsparameter Auswahl - paramsarray
 
Ich möchte einen Parameter definieren, der mir es ermöglicht bei Start der Mission auszuwählen ob der Introfilm abläuft oder nicht.
Trotz Suche
http://hx3.de/editing-scripting-167/...iplayer-19682/
http://hx3.de/editing-scripting-167/...g-nacht-19685/

bin ich noch nicht auf das gestoßen was ich brauche:

Meine description.ext
Code:

class Params
{
        class DayTime
        {
                //paramsArray[0]
                title = "Time:";
                values[] = {6, 14, 17};
                texts[] = {"Sunrise","Day","Sunset"};
                default = 6;
        };
    class Intro
        {
                //paramsArray[1]
                title = "Intro:";
                values[] = {0,1};
                texts[] = {"Yes please!","No thanks!"};
                default = 0;
        };   

    class Revive
        {
                //paramsArray[2]
                title = "Revive:";
                values[] = {0,1,2,5};
                texts[] = {"No Revive","1","2","5"};
                default = 1;
        };     
};

meine Init.sqf
Code:

//non-JIP player, someone who's went through role selection and briefing
if (!(isNull player)) then
{
    //Missionparameters
        skiptime (((paramsarray select 0) - daytime + 24) % 24);

    //Mission parameters - IntroMovie
    if ((paramsArray select 1) == 0) then
          {
              // Play Intro
                [] exec "intro\film.sqs"
          };
              else {if ((paramsArray select 1) == 1) then
                              {[] exec "scripts\faststart.sqs";
                                introdone = true;                 
                                publicVariable "introdone"
                              }
                      };

};
//JIP player, role selection then right into mission
if (!isServer && isNull player) then
{
    waitUntil {!isNull player};
...
};

//server
if (isServer) then
{
...
};

Problem: Es scheint als ob der paramsArray Status 0 oder 1 nicht in der Init übernommen und geändert wird. Warum?
Vielen Dank für eure Hilfe!
__________________________________________________ ________________________________
So, nach weiterer Suche bin ich darauf gestossen:
http://hx3.de/editing-scripting-167/...onieren-18816/

Psychobastard´s Hinweis verhalf zum Durchbruch:
Code:

playtime = paramsArray select 0;
if (isNil "playtime") then {playtime = 5400;};

Meine init.sqf sieht nun so aus:
Code:

//Mission parameters
                skiptime (((paramsarray select 0) - daytime + 24) % 24);

        //Mission parameters - Intro Movie
        film = paramsArray select 0;
        if (isNil "film") then {[] exec "intro\film.sqs";};

Ergebnis: Es funkt. Warum verstehe ich zwar immer noch nicht.
In die globale Variable film wird der Inhalt des paramsArray 0 übergeben. Was genau fragt denn
"isNil" ab? Laut BI Wiki:
Zitat:

Tests whether the variable defined by the String argument is undefined, or whether an expression result passed as Code is undefined. The function returns true if the variable is undefined or the expression result undefined (i.e. the expression result is Void), and false in all other cases.
Hä?

Spiderman 12.01.2011 03:15

Das Intro Skript wird zwar abgespielt doch der 2. Parameter wird nicht übergeben. Wenn in der description.ext der Wert auf 1 gesetzt wird so passiert nix.
Auch das funkt nicht:

Code:

if (isNil "film") then {[] exec "intro\film.sqs";} else {[] exec "scripts\faststart.sqs";};
Hier wird das Intro wiedergegeben und zugleich (wie im faststart Skript definiert) die Einheiten gelöscht?

Alles s****e!

Wenn irgendjemand ne Lösung hat: BITTTÖÖÖ!
Lasst mich nicht dumm sterben
:sauf:

SmartGun 12.01.2011 12:50

Hi Spider!

beim drüberschauen hab ich jetzt keinen Fehler gefunden.
Sollte eigentlich funktionieren.

ein Versuch währe die if-then-else Abfrage zu umgehen, ich check nie wie das genau zunzt...

Code:

//Mission parameters - IntroMovie
if ((paramsArray select 1) == 0) then {
    // Play Intro
    [] exec "intro\film.sqs";
};
     
if ((paramsArray select 1) == 1) then {
    [] exec "scripts\faststart.sqs";
    introdone = true;                 
    publicVariable "introdone";
};

€:

Ich glaube auch, du hast .SQF mit SQS vermischt.

Du hast eine Init.sqf also musst du alle code-Zeilen mit einem ; abschliessen

Code:

//Mission parameters - IntroMovie
    if ((paramsArray select 1) == 0) then
          {
              // Play Intro
                [] exec "intro\film.sqs";
          };
              else {if ((paramsArray select 1) == 1) then
                              {[] exec "scripts\faststart.sqs";
                                introdone = true;                 
                                publicVariable "introdone";
                              }
                      };

ob die if-then-else so funzt kann ich dir leider net sagen :(

isNil wird verwendet und zu überprüfen ob eine Variable bereits gesetzt wurde, und einen gültigen Wert hat.

z.B.

schreib in ein script:
Code:

if (isNil "film") then {hintc "film ist nil";};
wenn film vor der Abfrage nicht gesetzt wurde, dann kommt der hint

schreibst du:

Code:

film = true;
sleep 1;
if (isNil "film") then {hint "film ist nil";};

if (film) then {hint "film lauft";};

Der hint sollte dann "film lauft" lauten weil film ja schon vor der isNil Abfrage einen Wert hat

so hab ich das zumindest verstanden...

mann kann auch nicht mehr benöltigte Variablen zustören:

Code:

variableToDestroy = nil;
dann hat "variableToDestroy" keinen gültigen Wert mehr.


Bitte korrigiert mich wenn ich falsch liege! :)

Xeno 13.01.2011 18:58

*deleted*

Xeno

Rettich 13.01.2011 21:45

@Xeno
Wenn du nur einen Bruchteil deines Wissens so an den Mann bringen könntest, daß es der durchschnittliche Missionsersteller verstehen kann…
Ich wäre darüber jedenfalls überglücklich, da ich das leidige „global – Thema“ noch nie komplett verstanden habe, um es universell einzusetzen.

Xeno 13.01.2011 23:55

*deleted*

Xeno

svenson 14.01.2011 09:17

Dazu noch eine Frage:

Zitat:

Zitat von Xeno (Beitrag 352162)
*deleted*

Man soll ja laut BI-Wiki private Variablen zusätzlich per private["_myvar"] "super-lokal" machen (geiles Konzept: "Convention AND Code" statt "Convention over Code").

Zitat:

In functions you should additionally mark variables as local using the command private. Otherwise you may modify local variables of the calling script that are visible in the function.
Bedeutet das, dass es so eine Art Scope des Callstacks gibt? In der Konsequenz müßte dann noch jede Funktion alle privaten Variablen ihres Aufrufers sehen können!?

SmartGun 14.01.2011 11:08

@ Xeno

Danke für die guten Erklärungen!

jetzt hab ich beim Versuch Spiderman zu helfen selbst ne Menge gelernt :)

Der letzte Codeschnipsel ist ja mal genial, da muss ich meine Missionen nicht ganz so oft als MPmission exportieren um zu testen.

Xeno 14.01.2011 18:46

Zitat:

Zitat von svenson (Beitrag 352178)
Man soll ja laut BI-Wiki private Variablen zusätzlich per private["_myvar"] "super-lokal" machen (geiles Konzept: "Convention AND Code" statt "Convention over Code").

*deleted*

Xeno

svenson 16.01.2011 12:20

Zitat:

Zitat von Xeno (Beitrag 352256)
Habe ich oben schon beschrieben.

Zitat:

*deleted*
Xeno

Ah, sorry, das hatte ich überlesen, dann ist das klar.

Saint 16.01.2011 12:56

Zitat:

Zitat von Xeno (Beitrag 352256)

Wenn es mal 10.000.000 OA User gibt schreib ich mal ein Buch über ArmA Scripting und ArmA MP :D

Xeno

:D , mal ernsthaft, ein "Scripting Guide" würde nach meiner Meinung der sinnvollste DLC für ArmA 2 und OA sein :daumen:

Da wäre ich gerne bereit Geld für auszugeben.

Rettich 17.01.2011 17:33

Liste der Anhänge anzeigen (Anzahl: 1)
Den "Scripting Guide" auf Deutsch würde ich mir auch einiges kosten lassen….

Ich würde gern einen zusätzlichen Parameter in ein fertiges Parametersystem (von Bon_Inf) einbauen, diese klappt aber leider nicht, egal was ich auch versuche.

Dieser Parameter soll darüber entscheiden, ob ein Respawn an einem bestimmten Ort sofort ausgeführt werden soll oder ob man warten muß bis andere Teammitglieder gestorben sind, um dann mit diesen zusammen wieder zur Hauptgruppe zu stoßen, welches wiederum das Teamplay fördern könnte.

Die Description:

class Params {
//paramsArray[0]
class tfor_daytime {
title="Tageszeit";
values[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,1 9,20,21,22,23};
default=10;
texts[]={"0000","0100","0200","0300","0400","0500","0600" ,"0700","0800","0900","1000","1100","1200","1300", "1400","1500","1600","1700","1800","1900","2000"," 2100","2200","2300"};
};
//paramsArray[1]
class tfor_max_death_per_mission {
title="max. Tode / Mission";
values[]={999999,20,10,3};
default=10;
texts[]={"unbegrenzt","20 - Einfach","10 - Normal","3 - Schwer"};
};
//paramsArray[2]
class tfor_injury_system {
title="Verletzungen nach Wiederbeleben";
values[]={0,2,3,5,7};
default=3;
texts[]={"keine","geringe","Normal","schwere","sehr schwere"};
};
//paramsArray[3]
class tfor_injury_system_agony {
title="Chance zum Wiederbeleben";
values[]={1,5,10,100};
default=5;
texts[]={"keine","Normal","hohe","garantiert"};
};
/////////////////////////////////////////////////////////////////////////////////////////////
// um diesen Parameter geht es
//paramsArray[4]
class tfor_warteplatz {
title="Wieviel Spieler werden fuer Respawn benoetigt";
values[]={0,1,2};
default=1;
texts[]={"einer","zwei","gesamte Gruppe"};
};
/////////////////////////////////////////////////////////////////////////////////////////////////


Die Init:

if(isNil "tfor_deathcount") then {tfor_deathcount = 0};

// Wieviel Spieler tot sein müssen, damit diese wieder gerespawnt werden können
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// um diesen Parameter geht es
tfor_warteplatz = paramsArray select 0;

if (tfor_warteplatz == 0) then {hint "so ein Scheiss, wieso wird hier nichts ausgefuehrt?"};
if (tfor_warteplatz == 1) then {execVM "sqf\Param2Spieler.sqf"};
if (tfor_warteplatz == 2) then {nul = [] execVM "sqf\ParamalleSpieler.sqf"};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

if(isNil "paramsArray") then{
paramsArray = [
11, // Time of Day
16, // max death per mission
3, // Injury System
5 // Injury System Agony

];

};
tfor_daytime = paramsArray select 0; //Server setVariable ["tfor_daytime",tfor_daytime,false];
tfor_max_death_per_mission = paramsArray select 1; //Server setVariable ["tfor_max_death_per_mission",tfor_max_death_per_mi ssion,false];
tfor_injurysystem = paramsArray select 2; //Server setVariable ["tfor_injurysystem",tfor_injurysystem,false];
tfor_injurysystem_agony = paramsArray select 3; //Server setVariable ["tfor_injurysystem_agony",tfor_injurysystem_agony, false];



Könnte sich bitte jemand dieses Beispiel angucken?

Schon mal Danke im Voraus!


Gruß Rettich

Moerderhoschi 17.01.2011 18:08

tfor_warteplatz ist in deiner description.ext paramsarray select 4 aber in der Init.sqf tust du es als Paramysarray select 0 deklarieren. belass es doch bei 4 und es geht.

tfor_warteplatz = paramsArray select 4;

if (paramsarray select 4 == 0) then {hint "jetzt gehdor!"};
if (paramsarray select 4 == 1) then {execVM "sqf\Param2Spieler.sqf"};
if (paramsarray select 4 == 2) then {nul = [] execVM "sqf\ParamalleSpieler.sqf"};

Rettich 17.01.2011 19:29

Danke Moerderhoschi! :daumen:


Jetzt hab ich das endlich mal kapiert. :juhu:


Da die Nummerierung in der Description immer durch die // unwirksam gemacht wird, dachte ich bisher, dass diese nur der Übersicht dient.

Spiderman 19.01.2011 13:10

Vielen Dank für die Hilfe Xeno und SmartGun!

Thema paramsarray! Ihr kennt das?! Die Spielzeit wurde im paramsarray auf morgens gesetzt, mit Nachsichtgerät seit ihr durch die Wälder gestapft. Nun, nach einer Stunde Spielzeit ist die Sonne hoch am Himmel und ihr strakt bereits mit den ersten paar Bier im Bauch vor einer Kneipe in Chernogorsk.

Da kommt ein JIP Spieler um die Ecke und behauptet steif und fest: Nein, bei ihm sei es nacht und dunkel wie im A**** von der Merkel, deswegen habe er immer noch das Nachtsichtgerät auf.

Da hat doch der Server wieder mal nicht die Zeit mit den Clients synchronisiert, verdammt!

Lösung:

1. description.ext

Code:

class Params
{
        class DayTime
        {
                //paramsArray[0]
                title = "Time:";
                values[] = {6, 14, 17};
                texts[] = {"Sunrise","Day","Sunset"};
                default = 14;
        };
};

2. init.sqf
Code:

//non-JIP player, someone who's went through role selection and briefing
if (!(isNull player)) then
{
    //set initial time
    setdate [(date select 0), (date select 1), (date select 2), (paramsArray select 0), (date select 4)];
};

//JIP player, role selection then right into mission
if (!isServer && isNull player) then
{
    waitUntil {!isNull player};
        //set initial time
        setdate [(date select 0), (date select 1), (date select 2), (paramsArray select 0), (date select 4)];

        //launch script to sync time with server

        server_date = [];
        sync_time_script = execVM "scripts\jip_sync_time.sqf";       
};


//server
if (isServer) then   
{
      // set initial time
      setdate [(date select 0), (date select 1), (date select 2), (paramsArray select 0), (date select 4)];

      //launch server side script to broadcast server side time every 10 seconds
    broadcast_server_time_script = execVM "scripts\server_time_boardcast.sqf";
};

3. Zwei Scripte in den Ordner "scripts" des Missionsfolder kopieren:
a) server_time_boardcast.sqf
Code:

while {isserver} do
    {
    server_date = date;
    publicvariable "server_date";
    sleep 10;
    };

b) jip_sync_time.sqf
Code:

waituntil {player == player};

waituntil {count server_date > 0};


// set initial time

setdate = [server_date select 0, server_date select 1, server_date select 2, server_date select 3, server_date select 4];

Wichtig ist natürlich das auch das richtige paramsarray (hier ist es das paramsarray 0) in den Scripten aufgeführt wird. So lassen sich verschiedene Startzeiten der Mission definieren und die Mission ist JIP freundlich. Die Uhr des später hinzugekommenen Spielers sollte nur 10 sec nachgehen. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:05 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