Jump to content

Verschillende acties tijdens 1 missie.


Recommended Posts

Geplaatst:

Graag had ik willen weten hoe je het volgende best codeert:

Actor ENEMY achtervolgt actor FRIEND van dichtbij.

Actor ENEMY volgt een voor-gedéfinieerde weg.

Actor FRIEND volgt een voor-gedéfinieerde weg.

Actor Speler moet in de buurt blijven van actor FRIEND anders sterft actor FRIEND.(=mission failed)

Actor Speler moet ondertussen door checkpoints heen en moet de laatste checkpoint rijken voor actor ENEMY.

Anders sterft actor FRIEND. (=mission failed)

Als actor Speler de finish rijkt voor actor ENEMY dan sterft actor ENEMY en blijft actor FRIEND leven en is het missie geslaagd.

Iemand zin in deze uitdaging ^_^ ? Ik zou de juiste structuur van de threads nodig hebben. Ik heb er een paar geprobeerd maar hier en daar blijf ik crash-problemen ondervinden en bugs.

Het feit dat actor Speler in de buurt van actor FRIEND moet blijven is omdat er bugs ontstaan als actor Speler en actor ENEMY of FRIEND te ver weg uiteen zijn.

Ik had ook liever gewoon 1 voor-gedétermineerde weg gecreëerd voor actor FRIEND en actor ENEMY gewoon actor FRIEND laten volgen, ik heb nu twee voor-gedétermineerde wegen gecreëerd en denk dat er daar problemen zijn. De enige werkende code's met follow zijn:

05F1: set_car 37@ follow_car 35@ keep_9o_clock

en

05F2: set_car 36@ follow_car 35@ keep_3o_clock

ik had liever een 6o_clock gevonden maar die bestaat niet en

07F8: car 74@ follow_car 72@ radius 27.0

werkt totaal niet.

Alvast bedankt voor de hulp!

Groeten

Leumas

Geplaatst:

Dit is een behoorlijke complexe missie (scm technisch gezien), waar ik niet aan zou beginnen, tenzij je behoorlijk wat ervaring hebt met het maken van missies, en je zelf en goed gevoel hebt hoe zoiets in elkaar moet zitten.

Het probleem is, dat het al snel zo complex wordt dat het voor anderen ondoenlijk wordt om je even snel te helpen. Omdat het onzettend veel werk is, om alleen al de structuur van de missie te begrijpen.

In dit geval zou ik het als volgt aanpakken:

1 thread:

Een voorgedefineerd pad maken voor FRIEND, en de ENEMY met behulp van 07F8 de FRIEND laten volgen

Daarna ga je een lus is die voordurend checked of de speler te ver bij de friend weg is, in dat geval mission failed.

kijkt of de player bij de volgende checkpoint is aangekomen, en dan een nieuwe checkpoint selecteren.

en tenslotte een check of ENEMY of player bij het eindpunt is aangekomen.

DIt is heel eenvoudig opgeschreven, maar er zullen ongetwijfeld nog andere dingen gechecked moeten worden, b.v. of FRIEND of ENEMY komen vast te zitten in het verkeer. enz.

07FB werkt volgens mij wel, want Rockstar gebruikt het ook in de main.SCM.

Je moet waarschijnlijk alleen wat andere dingen erbij doen, zoals maximum snelheid zetten, en een snelheid geven met Car.SetSpeedInstantly().

In dit soort gevallen moet je altijd kijken hoe rockstar de opcode in hun code gebruikt, en welke andere opcodes ze daarvoor/erna gebruiken, die van invloed kunnen zijn.

Succes.

Geplaatst:

Ok thanx, ik zal verder uitproberen.

Dan heb ik nog 1 vraag:

Stel je maakt een loop:

:FRIEND_DEAD
wait 100
if
0118: actor $FRIEND dead
jf @FRIEND_DEAD

create_thread @MISSION_FAIL
end_thread

Als de missie MISSION_PASS is, hoe zorg je er dan voor dat deze loop stopt?

Geplaatst:

OM te beginnen staat die Create_THREAD daar heel erg raar, een nieuwe thread aanamken, omdat de missie failed is geen gebruikelijke structuur.

Ik raad je aan om de tutorials te volgen, die uitleggen hoe je een missie het beste kunt opzetten, in dezelfde globale structuur als rockstar dat doet.

Maar om je vraag te beantwoorden, zou het zoiets zijn, gebaseerd op jou voorbeeld:

:FRIEND_DEAD
wait 100

if
 // hier de conditie wanneer missie passed is
then
  jump @ MISSION_PASSED_CODE
end

if
0118: actor $FRIEND dead
jf @FRIEND_DEAD

create_thread @MISSION_FAIL
end_thread

:MISSION_PASSED_CODE
// hier doe je de dingen die je wilt doen als de missie passed is

Geplaatst:

Kan ik ook een thread benoemen:

03A4: name_thread 'TRUCK'

en dan indien de missie passed is de thread gewoon door:

0459: end_thread_named 'TRUCK'

beëindigen? Of riskant voor crashes?

Groeten

Geplaatst:
Kan ik ook een thread benoemen:

03A4: name_thread 'TRUCK'

en dan indien de missie passed is de thread gewoon door:

0459: end_thread_named 'TRUCK'

beëindigen? Of riskant voor crashes?

Groeten

Dat kan wel, maar het is mijn ervaring dat je voor en missie bijna nooit meerdere threads nodig hebt. Maar mocht het nodig zijn, dan kun je dit zeker gebruiken :)

Geplaatst: (bewerkt)

Wel, dan stel ik mij toch de vraag hoe je bovenvermelde missie kunt maken met maar 1 thread?

Ik heb de missie uiteindelijk af gekregen maar ik krijg fouten bij het destroyen van vehicles en actors.

De fout moet ergens in MISSION_FAIL zitten of MISSION_CLEANUP. Ik snap het gewoon niet. Kan het zijn dat wanneer een auto explodeert met een inzittende actor indien men de actor en het voertuig destroyed er zaken zijn die crashes veroorzaken?

De missie begint zo:

:MISSION_07
:M_BEGIN
0050: gosub @M_CODE
00D6: if 0
0112: wasted_or_busted
004D: jump_if_false @M_KLAAR
0050: gosub @M_FAIL

:M_KLAAR
0050: gosub @M_OPSCHONEN
004E: end_thread

:M_CODE

:LOADING_CARS
...
:SPAWNING_ACTORS
...
enz...

hier maak ik een paar threads aan:

create_thread @PLAYER_BIKE
create_thread @JOHN_BIKE
create_thread @ENEMY_TRUCK
create_thread @TE_VER
create_thread @JOHN_DEAD
end_thread

:PLAYER_BIKE
...
enz...

:M_PASS
wait 1000
01E3: show_text_1number_styled GXT 'M_PASSD' number 0 time 5000 style 1 // MISSION TERMINATED
0394: play_music 1
create_thread @MISSION_08
jump @M_KLAAR
end_thread

:ENEMY_TRUCK
:ENEMY_TRUCK_1
wait 100
if
00EE: actor $ENEMY 0 near_point 1418.75 -1718.65 radius 2.0 2.0 in_car
jf @ENEMY_TRUCK_1
05D1: AS_actor $ENEMY drive_car $PETRO to 1387.58 -1715.33 8.65 speed 30.0 2 model #NULL 2

Hier volgenen meerdere threads nl. ENEMY_TRUCK_2, ENEMY_TRUCK_3 enz... om de weg aan te geven.

...

Ik heb een thread aangemaakt dat zegt:

:TE_VER
03A4: name_thread 'TE_VER'
wait 100
if 
80F2: not actor $PLAYER_ACTOR near_actor $JOHN radius 275.0 275.0 0 
jf @TE_VER
wait 1000
0687: clear_actor $JOHN task 
0687: clear_actor $ENEMY task
0687: clear_actor $PLAYER_ACTOR task
wait 1000
0459: end_thread_named 'BIKE' 
0459: end_thread_named 'JOHN_BIKE' 
0459: end_thread_named 'ENEMY_TRUCK'
wait 1000
0321: kill_actor $JOHN
end_thread

:JOHN_DEAD
03A4: name_thread 'JOHN_DEAD'
wait 100
if
0118: actor $JOHN dead 
jf @JOHN_DEAD
jump @M_FAIL
end_thread

Dus als JOHN dood is moeten de threads stoppen en gaat hij naar mission fail. Na mission fail is er mission cleanup en daar destroy ik de Truck en de Enemy maar steeds opnieuw crasht het spel op dat juiste moment. Omdat ik met de verschillende threads zit voor de wegen aan te geven kan ik het volgende niet doen:

Dus de 0118: actor $JOHN dead hier plaatsen:

:MISSION_07
:M_BEGIN
0050: gosub @M_CODE
00D6: if 0
0118: actor $JOHN dead
004D: jump_if_false @M_KLAAR
0050: gosub @M_FAIL

en ben ik genoodzaakt om een aparte thread te maken voor :JOHN_DEAD ookal is dit niet de normale gang van zaken.

De mission fail en mission clean up ziet er zo uit:

:M_FAIL
wait 1000
00BA: show_text_styled GXT 'RACEFA' time 5000 style 1  // ~r~JOHN IS DEAD
// Hier kun je alles kwijt wat moet gebeuren als de missie gefaald is. Bv. bepaalde dingen weer terugdraaien
:SANCHEZ_JC_04_3
wait 100
if
00EC: actor $PLAYER_ACTOR 0 near_point 2751.50 -1438.25 radius 100.0 100.0
jf @SANCHEZ_JC_04_3

00A5: $SANCHEZ = create_car #SANCHEZ at 0.0 4004.0 0.0
0175: set car $SANCHEZ angle_to 90.0
0249: release_model #SANCHEZ
00A5: $SANCHEZ = create_car #SANCHEZ at 0.0 4006.0 0.0
0175: set car $SANCHEZ angle_to 90.0
0249: release_model #SANCHEZ
00A5: $SANCHEZ = create_car #SANCHEZ at 0.0 4008.0 0.0
0175: set car $SANCHEZ angle_to 90.0
0249: release_model #SANCHEZ

(dit hier is omdat ik de juiste kleur wil van de Sanchez en omdat het anders niet lukt om voertuigen op nog geen 1.0 radius van elkaar te spawnen.)

00A5: $SANCHEZ = create_car #SANCHEZ at 2749.50 -1446.00 30.45
0175: set car $SANCHEZ angle_to 85.0
0249: release_model #SANCHEZ
wait 3000
jump @MISSION_05
02A8: $Icon5 = create_marker 21 at 2751.50 -1438.25 30.45

:M_OPSCHONEN
wait 1000
0164: disable_marker $MARKER_PETRO
0164: disable_marker $MARKER_SANCHEZ
wait 1000
009B: destroy_actor $ENEMY 
wait 1000
00A6: destroy_car $PETRO
wait 1000
00A6: destroy_car $SANCHEZ
wait 1000
0051: return

:MISSION_08
end_thread

De script stopt bij MISSION_08 verder heb ik nog niets.

Bewerkt: door Leumas
Geplaatst:

Je gebruikt wel een hele vreemde structuur voor je missies, is zou je echt aanraden om de structuur te gebruiken die Rockstar ook gebruikt, en die in de eerder genoemde tutorial wordt uitgelegd.

Start je deze missie met "start_mission" of gewoon met een "create_thread" ?

- Dat eerste zou zeker heel erg instabiel gaan werken met deze structuur.

- Bij die tweede optie, moet je wel regelmatig in je code een zogenaamde "player_defined"check opnemen, namelijk na elke "wait" en voor dat je weer $PLAYER_ACTOR of $PLAYER_CHAR gebruikt.

Waar het nu waarschijnlijk op crashed, is het feit, dat je na het creëren van de threads, de main-thread (degene die bij :MISSION_07 is beginnen, afsluit met een "end_thread", terwijl je volgens mij met een "return" terug moet naar de gosub, zodat ie daar in een lus terecht komt.

Nu zal het zo zijn dat de main_thread niet meer loopt, maar alleen de threads die je net gestart hebt, maar als je missie fails, schioet je al die threads af, en blijft er geen enkele lopende thread meer over-> CRASH.

Ik denk dat het erg lastig wordt om in deze structuur een missie stabiel te krijgen, maar ik wens je toch veel succes :)

Geplaatst:

Wel, deze onderstaande structuur heb ik gevonden op deze site bij tutorials, "Een Missie (Rockstarstyle)". Ik heb altijd met deze structuur gewerkt:

:MISSION_06 
 gosub @MISSION_06_MAIN 
 if wasted_or_busted 
 then 
gosub @MISSION_06_FAIL 
 end
 gosub @MISSION_06_CLEANUP 
end_thread

:MISSION_06_MAIN

:MISSION_06_LOAD

:MISSION_06_PASSED
create_thread @MISSION_07
return

:MISSION_06_FAIL
jump @MISSION_05
return

:MISSION_06_CLEANUP
return

En ik heb nu al 6 missies geschreven zonder enige probleem.

Nu missie 7 is wat anders omdat het niet om CJ zelf gaat (if wasted_or_busted) maar om een andere personnage (if 0118: actor $JOHN dead). CJ moet vanalles doen om hem in leven te houden.

Maar ik heb het probleem in missie 7 gevonden, hij zit hier, in deze opcode:

05D1: AS_actor $ENEMY drive_car $PETRO to 2590.90 -1690.23 2.78 speed 30.0 2 model #NULL 2

Als ik een voertuig wil destroyen die deze comando gekregen heeft crasht het spel. Bestaat er een opcode om alleen deze code te neutraliseren?

Groeten

Leumas

Geplaatst:
Nu missie 7 is wat anders omdat het niet om CJ zelf gaat (if wasted_or_busted) maar om een andere personnage (if 0118: actor $JOHN dead). CJ moet vanalles doen om hem in leven te houden.

Dan nog moet je de structuur bovenin de missie hetzelfde houden. Want ook als CJ dood is, is de missie uiteraard afgelopen.

Je moet alleen in het MAIN gedeelte een check maken, die steeds kijkt of $JOHN nog leeft. Zo niet, dan spring je naar FAIL.

Je moet het zo maken, dat de code achter MAIN, altijd resulteerd in een sprong naar PASSED, of naar FAIL. uiteindelijk dan.

het creeren van extra threads kun je doen, direct na MAIN, maar daarna moet je die MAIN thread dus wel door laten lopen om te kijken of $JOHN nog leeft.

Het stoppen van de extra threads kun je het beste dan doen onder CLEANUP, dan weet je dat het altijd gebeurd, of de missie nu failed of passed..

Geplaatst:

Dit zou dan de de structuur zijn voor :MISSION_07 volgens de andere zelfde structuren:

:MISSION_07 
 gosub @MISSION_07_MAIN 
 if wasted_or_busted 
 then 
gosub @MISSION_07_FAIL 
 end
 gosub @MISSION_07_CLEANUP 
end_thread

:MISSION_07_MAIN // De actors en voertuigen worden hier gemaakt:
$ENEMY
$JOHN
$CJ
$BIKE_CJ
$BIKE_JOHN
$TRUCK_ENEMY

:MISSION_07_LOAD // Hier moeten 5 threads tezamen spelen dus ga ik er van uit dat ik create_thread moet gebruiken:
create_thread @CJ_BIKE
create_thread @JOHN
create_thread @ENEMY
create_thread @TE_VER
create_thread @JOHN_DEAD
end_thread // Om ervoor te zorgen dat de volgende thread niet gaat spelen terwijl hij al speelt.

:JOHN // De weg die $JOHN aflegt.
03A4: name_thread 'JOHN'
end_thread // Deze end_thread staat hier om ervoor te zorgen dat de volgende thread niet gaat spelen terwijl hij al speelt.

:ENEMY // De weg die $ENEMY aflegt en indien hij de finish haalt sterft $JOHN. --> JOHN_DEAD --> MISSION_07_FAIL
03A4: name_thread 'ENEMY'
end_thread

:TE_VER // Indien ik te ver weg ben van actor $JOHN sterft hij. --> JOHN_DEAD --> MISSION_07_FAIL
03A4: name_thread 'TE_VER'
end_thread

:JOHN_DEAD // Hier een loop die checkt of $JOHN nog leeft of niet, indien niet --> jump @MISSION_07_FAIL
03A4: name_thread 'JOHN_DEAD'
end_thread

:CJ_BIKE // Hier komt de check_point die ik moet berijken om $JOHN te redden en op deze manier $ENEMY te doden.
03A4: name_thread 'CJ_BIKE'
// Hier geen end_thread omdat als dit gepassed is dan mag hij naar :MISSION_07_PASSED.

:MISSION_07_PASSED
create_thread @MISSION_08
return

:MISSION_07_FAIL // Destroy:
$JOHN
jump @MISSION_05
return

:MISSION_07_CLEANUP // Destroy:
$ENEMY
$CJ
$BIKE_CJ
$BIKE_JOHN
$TRUCK_ENEMY
//en
end_thread_named 'CJ_BIKE'
end_thread_named 'JOHN'
end_thread_named 'ENEMY'
end_thread_named 'TE_VER'
end_thread_named 'JOHN_DEAD'
return

Het probleem is dat het zal crashen overal waar hij een return tegenkomt na de:

create_thread @CJ_BIKE
create_thread @JOHN
create_thread @ENEMY
create_thread @TE_VER
create_thread @JOHN_DEAD

Hoe kan ik ervoor zorgen dat threads geen twee keer gaan lezen en crashen maar dat ik toch de eerste gosub @MISSION_07_FAIL kan blijven gebruiken voor al deze threads?

Groeten

Leumas

Geplaatst:

Ik heb nog eens over threads in een Missie nagedacht en ik heb geen idee of het werkt om in een rockstar-style missie meerdere threads te hebben. Het probleem is, dat de mission thread normaal gesproken een "return" uitvoert, als CJ busted of wasted is, maar of dat ook werkt als er meerdere threads zijn betwijfel ik.

Rockstar gebruikt voor zover ik weet ook nooit meerdere threads in hun missies.

Ik zou het echt proberen gewoon in 1 thread te doen:

In plaats van al die losse threads kun je ook gewoon 1 grote loop maken, waarin alle dingen worden afgehandeld.

Het path dat de voertuigen moeten volgen, kun je vooraf programmeren met AS_packs, of met paths, voorbeelden zijn er genoeg in de Main.scm te vinden.

De mainloop bestaat dan uit een lus om de verschillende condities waaronder de missie failed of slaagt af te checken.

Geplaatst:

Ok, alvast echt bedankt voor de hulp die je me hebt verleend tot nu toe! Ik kan soms aandringerig klinken maar dit is omwille van het project dat ik gestart heb en tot een goed einde wil brengen. :Y

Met vriendelijke groeten

Leumas

Geplaatst:
Ok, alvast echt bedankt voor de hulp die je me hebt verleend tot nu toe! Ik kan soms aandringerig klinken maar dit is omwille van het project dat ik gestart heb en tot een goed einde wil brengen. :Y

Met vriendelijke groeten

Leumas

Geen probleem, je stelt duidelijke vragen en laat zien dat je zelf al verschillende dingen uitgezocht en uitgeprobeerd hebt. Dat is de juiste instelling om een SCM mod te maken, en daar wil ik dan graag bij helpen.

Ik geef ook liever geen kant en klare oplossingen, zoals je gemerkt hebt, maar probeer je met tips en advies in de goede richting te duwen, zodat je zelf ontdekt hoe het werkt. Want daarvan leer jij het meeste, en heb je achteraf ook het meeste eer van je werk.

Geplaatst:
zodat je zelf ontdekt hoe het werkt. Want daarvan leer jij het meeste, en heb je achteraf ook het meeste eer van je werk.

Daar heb je totaal gelijk in :Y Als student Film/Regie kan ik mij daar helemaal in terug vinden.

Check mijn kortfilms hier ^_^ :

www.youtube.com/fapsamup

Groeten

Leumas aka Samuel Faict

Een reactie plaatsen

Je kan nu een reactie plaatsen en pas achteraf registreren. Als je al lid bent, log eerst in om met je eigen account een reactie te plaatsen.

Gast
Op dit onderwerp reageren...

×   Je hebt text geplaatst met opmaak.   Opmaak verwijderen

  Only 75 emoji are allowed.

×   Je link is automatisch ingevoegd.   In plaats daarvan weergeven als link

×   Je vorige bewerkingen zijn hersteld.   Alles verwijderen

×   You cannot paste images directly. Upload or insert images from URL.

  • Recent actief   0 leden

    • Er zijn hier geen geregistreerde gebruikers aanwezig.
×
×
  • Create New...