Leumas Geplaatst: 29 augustus 2008 Rapport Geplaatst: 29 augustus 2008 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 Reageren
PatrickW Geplaatst: 29 augustus 2008 Rapport Geplaatst: 29 augustus 2008 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. Reageren
Leumas Geplaatst: 29 augustus 2008 Auteur Rapport Geplaatst: 29 augustus 2008 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? Reageren
PatrickW Geplaatst: 29 augustus 2008 Rapport Geplaatst: 29 augustus 2008 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 Reageren
Leumas Geplaatst: 3 september 2008 Auteur Rapport Geplaatst: 3 september 2008 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 Reageren
PatrickW Geplaatst: 3 september 2008 Rapport Geplaatst: 3 september 2008 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 Reageren
Leumas Geplaatst: 3 september 2008 Auteur Rapport Geplaatst: 3 september 2008 (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: 3 september 2008 door Leumas Reageren
PatrickW Geplaatst: 4 september 2008 Rapport Geplaatst: 4 september 2008 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 Reageren
Leumas Geplaatst: 4 september 2008 Auteur Rapport Geplaatst: 4 september 2008 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 Reageren
PatrickW Geplaatst: 4 september 2008 Rapport Geplaatst: 4 september 2008 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.. Reageren
Leumas Geplaatst: 4 september 2008 Auteur Rapport Geplaatst: 4 september 2008 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 Reageren
PatrickW Geplaatst: 4 september 2008 Rapport Geplaatst: 4 september 2008 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. Reageren
Leumas Geplaatst: 4 september 2008 Auteur Rapport Geplaatst: 4 september 2008 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. Met vriendelijke groeten Leumas Reageren
PatrickW Geplaatst: 5 september 2008 Rapport Geplaatst: 5 september 2008 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. 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. Reageren
Leumas Geplaatst: 7 september 2008 Auteur Rapport Geplaatst: 7 september 2008 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 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 Reageren
Recommended Posts
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.