Moninpelitehtäväeditointijuttuja - Triggerit, scriptit, ym.

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

Moderators: Kegetys, Broileri, Raunhofer

Post Reply
Keijo

Post by Keijo » Mon, 4.11.2002, 10.23

Joo, saan päähäni kirjotella tänne vähän juttuja tuosta OFP:n tehtäväeditoinnista moninpelikäyttöön...


Triggerit

Triggereiden toiminta moninpelissä on vähän erilaista kun mitä yleensä luullaan, mistä johtuu että moni mappi "desynkkaa" eli eri pelaajilla tapahtuu eri juttuja. Tämä johtuu siitä, että kuten kaikki muukin OFP:ssä, myös triggerit ajetaan joka pelaajalla "lokaalisti" eli jokaisella pelaajalla erikseen. Esimerkiksi seuraavanlainen skenaario:

Triggeri "east present"
Pelaaja X = west ukko
Pelaaja Y = east ukko

Kun pelaaja Y kävelee tuon triggerin päälle, ei hänen koneensa lähetä mitään sen erikoisempaa tietoa triggerin laukeamisesta pelaajalle X. Mutta normaalissa tilanteessa triggeri laukeaa myös pelaajalla X, koska pelaaja Y:n peliukko kuitenkin myös hänen koneellaan seisoo triggerin sisällä, jolloin se laukeaa myös hänella.

Mutta, jos juuri tuohon triggerin ylikävelemiseen sattuu tulemaan lagipiikki, pelaaja Y/X muuten vain lagaa, tai nuo pelaajat on hirveän kaukana toisistaan niin saattaa käydä niin että pelaaja X:n silmissä pelaaja Y warppaa tuon triggerin yli eikä se X:llä koskaan laukea, vaikka Y:llä se niin tekeekin. Eli näin sitten noilla kahdella ukolla on täysin eri pelitilanne.

Tämän korjaamiseksi kaikkia kriittisiä triggereitä varten täytyykin tehdä kaksi triggeriä esim. seuraavanlaisesti:

Triggeri "east present", johon "statement" kohtaan (jossa siis normaalisti olisi joku tapahtuma, vaikkapa hint "wii") laitetaankin esimerkiksi: Triggeri1Lauennut = true;publicvariable "Triggeri1Lauennut";

Tämä siis asettaa muuttujan "Triggeri1Lauennut" arvoksi "true". Mutta tämä ei yksin vielä auta mitään, vaan "publicvariable" on taikasana, joka lähettää tämän "Triggeri1Lauennut" muuttujan "true" arvon joka ikiselle pelissä mukana olevalle pelaajalle. Eli siis vaikka tuo triggeri olisi lauennut vain yhdellä pelaajalla, muiden silmissä hänen warpanneen sen yli, lähettää hänen koneensa kaikille muille tuon Triggeri1Lauennut muuttujan tilan muille, jonka jälkeen voidaankin tehdä toinen triggeri, jonka "condition" kenttään laitetaan "Triggeri1Lauennut" ja sen statement kenttään tuo hint "wii". Tämä triggeri sitten laukeaa taas joka koneella takuuvarmasti, koska heillä kaikilla on tuo Triggeri1Lauennut on sama.


Scriptit

Scriptitkin (exec, addaction) ajetaan kaikki lokaalisti, joka ei yleensä vaikuta paljoa mutta niissäkin, varsinkin addActionia käyttäessä on muistettava joitakin juttuja.

Eli lagista, koneiden eri nopeuksista, ym. sekoista johtuen scriptit harvoin alkavat/päättyvät täysin samaan aikaan moninpelissä. Tästä siis johtuu, että esimerkiksi joskus moninpelimappien introjen aikana jotkut ukot saattavat jo lähteä kävelemään ympäriinsä kun itse vielä katselee introa. Tälle ei mitään sen erityisemppä fiksiä ole mahdollista tehdä.

addActionin kanssa täytyy erityisesti huomioida lokaalisti ajettavuus, sillä sitä käyttäessä scripti ajetaan _vain_ sillä pelaajalla joka tuon kyseisen actionin "laukaisi". Eli jos addActionin scriptissä tekee jotain, minkä haluaa tapahtuvan kaikilla muillakin (esim. tekstin näyttäminen) täytyy taas käyttää samanlaista publicvariable kikkailua kun triggereidenkin kanssa.


player

OFP:ssä on vakiona muuttuja "player" joka osoittaa aina paikalliseen pelaajaan. Tämän avulla voi tehdä kaikenlaista hauskaa, ja se voi myös helpottaa montaa asiaa. Eli esimerkiksi jos halutaan lisätä jokaiselle pelaajalle M16 ase, olisi "normaali" lähestymistapa about seuraavanlainen:

p1 addweapon "M16";
p2 addweapon "M16";
p3 addweapon "M16";
p4 addweapon "M16";
p5 addweapon "M16";
...

Ja näitähän ei kukaan jaksa kirjoitella, joten kun tehdäänkin sen sijaan näin:

player addweapon "M16"

jonka siis jokaisen pelaajan kone ajaa itse omalla koneellaan, ja koska heilla kaikilla "player" on oma itsensä, jokainen antaa itse itselleen M16 aseen, eli lopputulos on sama kun ylläolevassa scriptissä, mutta paljon helpommin. Tässä tosin kannattaa muistaa että AI ryhmänjäsenille tuollainen ei lisäisi mitään.

Myös addActionin kanssa playerin käyttö on hyödyllistä. Eli jos mukana taas olisi pelaajat "p1", "p2", "p3" jne. ja heille kailille haluttaisiin addActionia käyttäen lisätä vaikkapa "Suicide" action, olisi yleinen lähestymistapa laittaa jokaisen heidän initiin 'this addaction["suicide","suicide.sqs]' joka sinällään toimii, muttei aivan halutunlaisesti. Eli koska taas jokainen pelaaja ajaa kaikki nämä scriptit omalla koneellaan, käy niin, että esimerkiksi "p1" pelaajan silmissä myös "p2" pelaajaan on lisätty tuo actioni. Nyt kun pelaaja P1 kävelee P2:n luo, tulee hänen valikkoonsa kaksi "suicide" actionia, hänessä itsessään oleva ja P2:ssa oleva.

Tämä on taas yksinkertaista korjata tekemällä

player addAction["suicide","suicide.sqs]

joka siis taas lisää jokaisella pelaajalla lokaalisti itseensä tuon actionin. Mutta tämä täytyy tehdä _vain kerran_, eli ei laittamalla sitä jokaisen p1,p2,p3 ukon initiin (jolloin siis jokainen lisäisi sen itseensä monta kertaa) vaan vaikkapa init.sqs tiedostoon, tai triggeriin joka laukeaa heti alussa.


"liidujen" siirtyminen, missionin lopetus

Kuten varmaan monet ovat huomanneet, ryhmänjohtajan kuollessa moninpelissä johtajan hommat eivät siirry automaattisesti seuraavalle, johon täytyykin tehdä simppeli "workaround" seuraavanlaisella triggerillä:

condition: not alive (leader group player)
statement: [(leader group player)] join grpNull

ja tyypiksi "repeatedly". Tämä triggeri laukeaa aina, kun pelaajan ryhmän leader kuolee, ja heittää hänet siitä ryhmästä ulos (siirtää grpNull:iin). "Countdown" aikaa kannattaa ehkä laittaa sekunti tai pari.


"Klassinen" ongelma varsinkin coop tehtävissä on, miten saada tehtävä loppumaan kun kaikki pelaajat on kuolleet. Simppeli ratkaisu on tehdä erittäin iso "not present" triggeri, joka taas ei toimi mikäli mapissa on AI:n ohjastamia ukkoja jotka on samalla puolella kun pelaaja... Itsekään en tähän ongelmaan hirveän toimivaa ratkaisua teidä, mutta yksi tapa ainakin on seuraava:

1) init.sqs:ään tms. laitetaan 'kruuppi = group player'
2) Triggeri, jonka "condition" kenttään '(count units kruuppi) < 1'
3) Yllä mainittu liidujensiirtymistriggeri

Itse en tätä ole vielä testannut, mutta periaatteessa sen pitäisi toimia, koska liidujensiirymisscripti heittelee pelaajia ulos "kruuppi" ryhmästä, eikä heitä ole siellä enää yhtään jäljellä kun kaikki on kuolleet. Tämä ratkaisu ei taas toimi mikäli mukana on useampi grouppi...



Semmosta, toivottavasti jollekin jotain apua :P


-Kegetys :PP
McDeth
Posts: 230
Joined: Fri, 13.9.2002, 9.01
Location: My head

Post by McDeth » Mon, 4.11.2002, 13.05

Tuostahan tuli useita hyviä vinkkejä. Kiittää ja kumartaa OFP:n ylijumala Kegetystä :)

Tuo kruuppi homma varmaan toimii myös A/D tyyppisissä missioissa, eikö?

Laittaa esim seuraavan east vs. resistance mission init.sqs:ään:

(allaoleva skriptipätkä jäi pois)

? side player = east : goto "east"
resgroup = group player
exit
#east
eastgroup = group player
exit

Sitten vain laittaa tuon count härpättimen molemmille groupeille. Kelepaakos?

Vinkki El Pasoon: Voisikos sinne tehdä vastaavat groupit, ja laittaa vielä kolmannen jossa on kaikki pelaajat. Kun kaikki ovat kuolleet, tulisi tasapeli ja erä uusitaan. Voihan tuon tehdä tosin muullakin tavalla.




Edited By McDeth on 1036414454
korpr McDeth Sniper, 1st Platoon, Local Defence Detachment "Kyllikki" - "Ehä mie osu mihinkää..." -
Rodrigo
Posts: 975
Joined: Tue, 3.9.2002, 20.11
Location: Tampere

Post by Rodrigo » Mon, 4.11.2002, 14.30

McDeth wrote:Vinkki El Pasoon: Voisikos sinne tehdä vastaavat groupit, ja laittaa vielä kolmannen jossa on kaikki pelaajat. Kun kaikki ovat kuolleet, tulisi tasapeli ja erä uusitaan. Voihan tuon tehdä tosin muullakin tavalla.
hyvät, pahat ja rumat. :PP
75-1035672257

Post by 75-1035672257 » Mon, 2.12.2002, 15.31

Voisikos joku pistää suomenkieleiset ohjeet kuinka voi laittaa omaa musaa omiin tehtäviin.

Sen tiedän, että musa pitää olla .ogg muotoinen, mutta entä siitä eteenpäin?

ps. himo iski :banana:
McDeth
Posts: 230
Joined: Fri, 13.9.2002, 9.01
Location: My head

Post by McDeth » Mon, 2.12.2002, 19.41

Jaahas... kuinkas paljon maksat jollekin kuka viitsis sellasen ohjeen tehdä... Helpompaa ja halvempaa lienee opetella Lontoon murretta... voipi olla elämä muutenki helpompaa...

:banana:
korpr McDeth Sniper, 1st Platoon, Local Defence Detachment "Kyllikki" - "Ehä mie osu mihinkää..." -
75-1035672257

Post by 75-1035672257 » Thu, 12.12.2002, 21.10

No niin olen saanut tälläistä aikaiseksi:

Eli tein tehtävä kansiooni Music nimisen kansion ja sen silläni on sentencend.ogg niminen tiedosto (eli musa filuni)

Sitten tein desciption.ext tiedoston jonne tein tälläisen koodi pätkän:

onLoadMissions="Ryhmä Karhula osa 1 - Pysäytys"


class CfgMusic
{
tracks[]={Sentencend};

class helimusic
{
name = "Sentencend";
sound[] = {\Music\Sentencend.ogg, db+10, 1.0};
};

};


class CfgSFX
{
sounds[] = {};
};
class CfgEnvSounds
{
sounds[] = {};
};



Mutta kun menin katsomaan kenttäni niin effect kohtaa ja sieltä track niin en löytänyt musaani.

Olen tehnyt waypointit sekä testannut triggereillä, mutta tuloksetta.

Eli olisiko teillä mitään apua :down: ?
LawnDrill
Posts: 189
Joined: Mon, 2.9.2002, 23.34
Location: Finland
Contact:

Post by LawnDrill » Thu, 12.12.2002, 23.57

soundDescription.ext

puuttuisko ?




Edited By LawnDrill on 1039730317
User avatar
Goeth
Posts: 258
Joined: Wed, 4.9.2002, 20.45

Post by Goeth » Fri, 13.12.2002, 9.13

Musiikille tarvit description.ext filuun seuraavan.

class CfgMusic
{
tracks[]={reijotaipale};


class reijotaipale
{
name = "reijorock";
sound[] = {\music\reijotaipale.ogg, db+10, 1.0};
};
};

Ja tässä vielä vähän jotain miten sen musan pitäs olla.
Music : Up to 44100 Khz, 16-bit, Stereo
Ja ne musa filut pitäs olla ogg muodossa. Ja jos tämä ei toimi niin ammu minut tai osta kunnon stereot ettei tarvi ofpilla kuunnella musiikkia.




Edited By Goeth on 1039763889
Goeth, Reserves, Local Defence Detachment "Kyllikki"
Dulce et decorum est pro patria mori
75-1035672257

Post by 75-1035672257 » Tue, 31.12.2002, 17.00

Elikkä sain tehtyä camera exec (this exec"camera.sqs" )

Kysyisin vain, että mihin tuo tallentuu ja mitä pitää painaa, että tuo tallentuu?
:O

:PP
maza
Posts: 706
Joined: Mon, 2.9.2002, 22.27
Location: loviisa

Post by maza » Wed, 1.1.2003, 0.58

tuo tallentuu jos oot triggerii laittanu ni siihen.
mut sulla ois hyvä olla olemasta se notepadillä tehty camera sripti jota tuo yrittää toteuttaa.
kaikkein paras ratkasu sun osalta on se jotta meet ofp editin centeriin ja käyt tutoriaalit läpi ???
siellä neuvotaan kädestä pitäen kaikki tarpeellinen kautta ei niin tarpeellinen.
börb
maza
Posts: 706
Joined: Mon, 2.9.2002, 22.27
Location: loviisa

Post by maza » Wed, 19.2.2003, 21.18

tämmösen helmen löysin :D
saa kenet tahansa ampumaan mitä tahansa.
esim tehää tankki nimeltä peelo
ja talo nimeltä peelonkoti

triggeri ja kuvitellaan että tankki on east
activation east present

on activation riville peelo dofire peelonkoti
kun tankki tulee triguun se ampuu taloa jolle annoit nimeksi peelon koti.
samaa voi käyttää esim dotarget dowatch jne.
jos tahtoo että peelo ampuu useampaa nimeät jokaisen esim peelo ampuu kotinsa sitte autonsa
teet lisäks auton nimeltä peelonauto

lisäät triggerin not(alive(peelonkoti))
sen activation peelo dofire peelonauto

tankki nimeltä peelo ampuu ensin kotinsa kun se tuhoutunut peelo ampuu autonsa.
näitä voisoveltaa mielikuvituksensa mukaan lähes rajattomasti.
börb
68-1051899499

Post by 68-1051899499 » Sat, 19.7.2003, 14.07

McDeth wrote:Jaahas... kuinkas paljon maksat jollekin kuka viitsis sellasen ohjeen tehdä... Helpompaa ja halvempaa lienee opetella Lontoon murretta... voipi olla elämä muutenki helpompaa...

:banana:
Justiinsa.. Ja lontoossa puhutaan monia murteita jos et sattunut tietämään, kai niillä joku "omakin" on.
McDeth
Posts: 230
Joined: Fri, 13.9.2002, 9.01
Location: My head

Post by McDeth » Wed, 23.7.2003, 2.10

Dynamite_cow wrote:
McDeth wrote:Jaahas... kuinkas paljon maksat jollekin kuka viitsis sellasen ohjeen tehdä... Helpompaa ja halvempaa lienee opetella Lontoon murretta... voipi olla elämä muutenki helpompaa...

:banana:

Justiinsa.. Ja lontoossa puhutaan monia murteita jos et sattunut tietämään, kai niillä joku "omakin" on.
Ja perkele jos ei ton parempaa tekemistä ole, niin menehän isukin viinakaapille ja kaada ryyppy isukin parhaasta konjakkipullosta... Saatpa ainakin kehittää mielikuvitusta kun keksit mitenkäs puhut itsesi siittä liemestä saamatta kovin pahasti turpiin. Ei tartte tänne tulla turhaa pilkkuja nussimaan.
korpr McDeth Sniper, 1st Platoon, Local Defence Detachment "Kyllikki" - "Ehä mie osu mihinkää..." -
68-1051899499

Post by 68-1051899499 » Thu, 24.7.2003, 11.36

McDeth wrote:Justiinsa.. Ja lontoossa puhutaan monia murteita jos et sattunut tietämään, kai niillä joku "omakin" on.

Ja perkele jos ei ton parempaa tekemistä ole, niin menehän isukin viinakaapille ja kaada ryyppy isukin parhaasta konjakkipullosta... Saatpa ainakin kehittää mielikuvitusta kun keksit mitenkäs puhut itsesi siittä liemestä saamatta kovin pahasti turpiin. Ei tartte tänne tulla turhaa pilkkuja nussimaan.
[/quote]
Noh, enpä taida mennä sieltä varastamahan. Asia selvä, oli pakko vittuilla.
68-1051899499

Post by 68-1051899499 » Thu, 24.7.2003, 11.38

maza wrote:tämmösen helmen löysin :D
saa kenet tahansa ampumaan mitä tahansa.
esim tehää tankki nimeltä peelo
ja talo nimeltä peelonkoti

triggeri ja kuvitellaan että tankki on east
activation east present

on activation riville peelo dofire peelonkoti
kun tankki tulee triguun se ampuu taloa jolle annoit nimeksi peelon koti.
samaa voi käyttää esim dotarget dowatch jne.
jos tahtoo että peelo ampuu useampaa nimeät jokaisen esim peelo ampuu kotinsa sitte autonsa
teet lisäks auton nimeltä peelonauto

lisäät triggerin not(alive(peelonkoti))
sen activation peelo dofire peelonauto

tankki nimeltä peelo ampuu ensin kotinsa kun se tuhoutunut peelo ampuu autonsa.
näitä voisoveltaa mielikuvituksensa mukaan lähes rajattomasti.
Hehh, tollahan voi pitää kivaa.
Post Reply