Sekran ARMA2 editointivinkkinurkka - Sekalainen seurakunta erilaisia vinkkejä

Keskustelu Arma I-, II- ja III- sekä OFP-tehtävistä

Moderators: Kegetys, Broileri, Raunhofer

Post Reply
Sekra
Posts: 10
Joined: Wed, 8.7.2009, 3.02
Location: Kuopio

Post by Sekra » Tue, 14.7.2009, 19.28

Päivitetty 29.7.2009
(Vinkki 2 lisätty)


Tähän threadiin aion lisäillä omien testailujen seurauksena erilaisia vinkkejä tehtäväeditointiin ja niiden skriptaamiseen. Virheitä sattuu kaikille ja päivitysten myötä hommat muuttuu, joten jos huomaat jotain mitä et saa joko toimimaan tai jokin lakkaa päivitysten myötä toimimasta, ilmoittele täällä tai irkissä minulle niin tutkitaan ja hutkitaan hommat kuntoon. Näissä vinkeissä oletetaan edes jonkinlainen perustietämys ARMA2:n editorin ja skriptauksen saloista, joten niihin on turha puuttua tässä. Lukekaa Rauenhoferin erinomainen peruspaketti jos perusteet ovat hukassa.

Vinkki 1:
Eri ryhmille eri markerit (toimii myös mp!)

Elikkä ensimmäisenä vinkkinä tehtäväntekijöillä tapa, jolla saat vaikkapa ryhmä A:lle näkymään vain ryhmä A:n kohteen ja ryhmä B:lle vain ryhmä B:n kohteen. Tässäkin on jälleen vain mielikuvitus rajana siitä, mihin tätä voi soveltaa. Mutta itse asiaan:

Luo kaksi ryhmää (riittää että molemmissa on 1 mies), laita jokaisen ensimmäisen ryhmän jäsenen init-fieldiin:

Code: Select all

ryhma_a = group this; 
ja toisen ryhmän jäsenille:

Code: Select all

ryhma_b = group this; 
alla vielä varmuudeksi kuvaesimerkki:

Image

Syy miksi tuo "group this" lisätään jokaiselle ryhmän jäsenelle on, että jos MP-missionissa onkin AI disabloituna ja kukaan pelaaja ei ole ryhmänjohtaja niin markerit jäävät näkymättä.

Sitten paukutellaan markerit kartalle. Itse teen tämän tässä vinkissä niinpäin, että laitan ekana "Empty" markerit jotka sitten myöhemmin erikseen muutetaan toiseksi tyypiksi, mutta tietenkin voit omassa tehtävässäsi tehdä homman täysin toisinpäin, eli pistät kaikki oikeina tyyppeinä näkyviin ja sitten skriptanpätkässä teetkin homman toisinpäin. Lue tämä vinkki loppuun asti ennenkuin kyselet asiasta!

Eli lisätään ryhmälle A kohdemarkeri, annetaan sille nimeksi "obj_a" ja tekstiksi laitetaan "Ryhmä A kohde". Valitse markerin tyypiksi "Empty". Seuraavassa vielä kuva teille lukutaidottomille:

Image

tee toinen markeri ryhmälle B, nimeä "obj_b", tekstiksi "Ryhmä B kohde" ja tyyppi on edelleen "Empty".

Seuraavaksi tallenna tehtävä user missionina ja nokka kohti hakemistoa jossa sijaitsee ko. tehtävä. Lisää tehtävähakemistoon init.sqf ja lisää seuraavanlainen koodi:

Code: Select all

if (group player == ryhma_a) then {"obj_a" setMarkerTypeLocal "Destroy"};
if (group player == ryhma_b) then {"obj_b" setMarkerTypeLocal "Destroy"};


Ensimmäinen if-lause tarkistaa onko pelaaja ryhmän A jäsen ja jos on niin muutetaan obj_a markerin tyyppi. Sama toistetaan toisen ryhmän kohdalla.

MP Missionin tekijät HUOM! muistakaa ehdottomasti käyttää setMarkerTypeLocal eikä pelkkä setMarkerType. Jos käytät tuota ei-local versiota, näkyvät markerit kaikille sitä mukaa kun tietyssä ryhmässä on pelaajia.

Siitä sitten väsäämään tällaisella pienellä mausteella varustettuja tehtäviä.

Edit 15.7.2009: Sieltähän se Kuokkanen jo osasi huomauttaa muutamasta epäkohdasta. Eli entäpä jos kukaan ei ole groupin leaderina? Toisena oli testata toi .sqs muuttaminen .sqf ja toimihan se niinkin, sqs kun on jo vanhentunutta ja sitä pitänee välttää. Vähän ollaan ruosteessa tässä mutta eiköhän se siitä taas kohta lähde.[/color]
Sekra
Posts: 10
Joined: Wed, 8.7.2009, 3.02
Location: Kuopio

Post by Sekra » Wed, 29.7.2009, 0.24

Taitaa olla jo pitkä aika laittaa seuraava vinkki! Seuraavaa purkkaviritelmää käytin oman tehtävän (co 16 regroup and retaliate) tekemisessä, jotta JIP pelaajat saavat nykyisen tehtävien tilanteen näkyviin oikein, sekä respauksen jälkeen sama. Eli pitemmittä puheitta...

Vinkki 2:
Taskit näkymään oikein JIP:n / respawnin kanssa + briefing template

Ensinnäkin, käytän itse seuraavaa briefing templatea, jossa on suoraan koodattuna vaihtoehdot tehdä eri osapuolille erilliset briiffit (kiitokset Shukolle tästä linkistä!):

http://forums.bistudio.com/showpost.php ... stcount=11

tuon avulla saa myös tuota lopussa olevaa koodinpätkää apuna käyttäen näkymään taskit respauksen jälkeen (saattaa vaatia, että käyttäjä klikkaa kerran esim. notesin päällä respauksen jälkeen, että taskit ilmestyvät).

Ja sitten itse asiaan, eli taskit toimimaan oikein myös jip pelaajilla. Käyttämäni scriptaus on todennäköisesti aikamoinen paukkulankaviritelmä, mutta näyttää toimivan ainakin omassa missiossani. Alotetaanpa:

Taskien lisäksi käytän erillisiä variableja kuvaamaan objektiivien tilaa, esim. mainObj_hq tarkoittaa taskia ja obj_hq on muuttuja eli variable, joka on joko 1, 2 tai 0 riippuen tilasta, 0 == kesken, 1 == onnistunut 2 == epäonnistunut. Ongelmanahan on viestittää JIPpaaville pelaajille nykyisten taskien tila. Ratkaisin ongelman näin:

init.sqf

Code: Select all

//ekana alustetaan muuttujat
obj_1 = 0;
obj_2 = 0;
obj_3 = 0;

//tämän jälkeen kokoan näistä yhden arrayn, mahdollistajan olisi vaikka käyttää pelkästään tätä arrayta tehtävien tilan selvittämiseen, mutta selkeyden vuoksi käytän vielä erillisiä muuttujia

obj_status = [0, obj_1, obj_2, obj_3]; //huomaa alussa oleva "ylimääräinen" nolla! se on erittäin tärkeä.

//seuraava osio suoritetaan vain serverillä
if (isServer) then
{
    onPlayerConnected "execVM ""pelaajaJoinasi.sqf""";   // ja nuo " määrä on ihan oikein btw, eli aina kun pelaaja liittyy peliin, ajaa pelkästään serveri tämän käskyn, skriptin sisältö myöhempänä
};

//seuraavassa suoritetaan komennot vain clienteilla
if (!isServer) then
{
    waitUntil {obj_status select 0 != 0}; //odotetaan kunnes serveri on lähettänyt datan, selitetään pelaajaJoinasi.sqf:ssä tarkemmin

    obj_1 = obj_status select 1;
    obj_2 = obj_status select 2;
    obj_3 = obj_status select 3;

    execVM "tarkistaTaskit.sqf";  //skriptissa tarkistetaan taskien tila, sen olisi voinut tehdä myös suoraan tässä, mutta samaa skriptiä tarvitaan myös toisaalla
};
ja siinä init.sqf tämä osio, voit vapaasti liittää muita init.sqf liittyviä asioita ennen / jälkeen tuon osion. Seuraavaksi käydään pelaajaJoinasi.sqf kimppuun:

pelaajaJoinasi.sqf

Code: Select all

//tämä on hyvin pieni ja simppeli skripti
obj_status = [1, obj_1, obj_2, obj_3]; //huomaa että tässä ensimmäinen numero on nollan sijaan 1. Tämä kertoo clientille, että kun kyseinen numero on 1, on taskien tila vastaanotettu serveriltä. Jos ko. numero on 0, mennään vielä lokaalin datan voimin.
publicVariable "obj_status"; //tällä käskyllä lähetetään ko. muuttujan sisältö _kaikille_ clienteille, käskyn liiallista käyttöä tulisi välttää lagimahdollisuuden takia.
ja vielä lopuksi tuo tarkistaTaskit.sqf, joka on varsinainen if-helvetti:

tarkistaTaskit.sqf

Code: Select all

if (obj_1 == 1) then
{
    mainObj_1 setTaskState "SUCCEEDED";
};

if (obj_2 == 1) then
{
    mainObj_2 setTaskState "SUCCEEDED";
};

if (obj_3 == 1) then
{
    mainObj_3 setTaskState "SUCCEEDED";
};

if (obj_1 == 2) then
{
    mainObj_1 setTaskState "FAILED";
};

if (obj_2 == 2) then
{
    mainObj_1 setTaskState "FAILED";
};

if (obj_3 == 2) then
{
    mainObj_1 setTaskState "FAILED";
};
ELI tuossa viimeisessä obj_x on itse luomani muuttuja vain tiedonsiirtoa varten, kun taas mainObj_x on ko TASKIN nimi, jota käytän briefingissä createsimpletaskin nimenä.

Nyt pitäisi homman toimia muuten PAITSI, respaamisen jälkeen taskit kyllä näkyvät, mutta eivät ole päivittyneet oikeaan tilaan, joten aiemmin templatessa mainittuun lopussa olevaan respaosioon lisäsin tuon tarkistaTaskit.sqf myöskin eli se loppuosa näytti sitten lopulta tältä:

Code: Select all

// run this file again when respawning (only setup the killed EH once though)
if ( isNil{player getVariable "mk_killedEHadded"} ) then 
{
    player addEventHandler ["killed", 
    { 
         [] spawn {
         waitUntil { alive player }; // waitUntil player has respawned
         execVM "briefing.sqf";
         execVM "tarkistaTaskit.sqf"; 
         };	
    }];
    player setVariable ["mk_killedEHadded", true];
};
Kaiken tämän jälkeen pitäisi taskit päivittyä jippaajille ja respaajille oikein. Ja kiitokset kaiken tämän kanssa avustaneelle Shukolle jälleen kerran, on se vaan niin kivaa tehdä "simppeliä" tehtävää ;)[/color]
Post Reply