Blastov Geplaatst: 25 mei 2006 Rapport Geplaatst: 25 mei 2006 is wel simpel! kijk eens naar spaceeinstein's all in one mod. die heeft egt alles. daar kun je helicopter met magneten laten vliegen! en nog veel en veel meer!!!!!! Wat maakt dat uit ? Dat simpel klopt trouwens ook niet, deze thread is van dezelfde kwaliteit alleen is dit er maar 1 en heeft die andere er meer. Deze mod is gewoon bedoeld om er plezier mee te hebben, desnoods kun je deze thread gewoon aan die scm van spaceeinstein toevoegen. Reageren
Flotje Geplaatst: 14 juni 2006 Rapport Geplaatst: 14 juni 2006 Kun je misschien als je een keer tijd hebt of zo, een uitleg geven bij bepaalde dingen, want sommige delen hiervan snap ik echt niet, en zouden mij als .scm modder flink vooruit helpen... Zo heb je het over een "random car" en als die auto -1 is dan gaan zijn banden lek, dat maakt echt geen sense als je het mij vraagt... Ik zie nergens een check of die auto over jouw stinger heen rijd... En verder al dat gekloot met die variabelen, voor mij is het allemaal onzin, maar als jij het zo typt moet het natuurlijk wel kloppen... Reageren
PatrickW Geplaatst: 14 juni 2006 Auteur Rapport Geplaatst: 14 juni 2006 Het is al meer dan een jaar gelden dat ik het gemaakt heb, maar ik wil het wel een beetje uitleggen, want het is inderdaad nogal lastige code om te begrijpen, als je niet weet wat er gebeurd.. Ten eerste.. De code bestaat uit twee afzonderlijke threads: Stinger_thread en stinger_sniff_thread. Ik begin bij de tweede (stinger_sniff_thread) omdat dat degene is die bij het optarten van het spel wordt gestart door de Create_thread bovenaan, en deze thread blijft dus ook continue doorlopen. :stinger_sniff_thread 03A4: name thread "ST_SNIF" :stinger_sniff_loop 0001: wait 100 ms if 0 0256: player $PLAYER_CHAR defined jf ££stinger_sniff_loop if 1 00E1: key pressed 0 17 00DF: actor $PLAYER_ACTOR driving jf ££stinger_sniff_loop 03C0: 10@ = actor $PLAYER_ACTOR car 0407: create coordinate 0@ 1@ 2@ from car 10@ offset 0.0 -2.5 1.0 0174: 3@ = car 10@ z_angle 3@ += 90.0 02CE: 2@ = ground z 0@ 1@ 2@ 2@ += 0.1 004F: create thread ££Stinger_thread 0@ 1@ 2@ 3@ 0001: wait 500 ms 0002: jump ££stinger_sniff_loop Deze code zou op zich redelijk goed te volgen moeten zijn. Het eerste deel +- 12 regels, is een lus, die net zolang wacht, totdat de speler op de schietknop drukt terwijl hij in een auto zit. In dat geval wordt dit stukje code dus uitgevoerd: 03C0: 10@ = actor $PLAYER_ACTOR car 0407: create coordinate 0@ 1@ 2@ from car 10@ offset 0.0 -2.5 1.0 0174: 3@ = car 10@ z_angle 3@ += 90.0 02CE: 2@ = ground z 0@ 1@ 2@ 2@ += 0.1 004F: create thread ££Stinger_thread 0@ 1@ 2@ 3@ 0001: wait 500 ms Hierin wordt dus de positie van de STINGER bepaald: De auto van de speler wordt opgevraagt, en er wordt een coordinaat bepaald, die 2.5 meter achter het midden van de auto op de grond ligt. Deze coordinaten ( X,Y,Z,Rz) = (0@,1@,2@,3@) worden meegegeven aan een aparte thread die voor elke gedropte STINGER wordt gestart. Daarna wordt nog een halve seconde gewacht, voordat opnieuw wordt gekeken of de knop ingedrukt is voor eventueel een nieuwe STINGER. Voor iedere STINGER die gedropt wordt, wordt dus een aparte thread (Stinger_thread) opgestart. Dit is dus de code die voor elke STINGER als aparte thread wordt gestart: :Stinger_thread 03A4: name thread "STING" 16@ = 0 029B: 7@ = init_object -204 (PLC_STINGER) at 0@ 1@ 2@ 0177: set object 7@ z angle to 3@ 01C7: remove_object_from_mission_cleanup_list 7@ float 4@ = 0@ 4@ -= 2.0 0@ += 2.0 float 5@ = 1@ 5@ -= 2.0 1@ += 2.0 :Stinger_loop 0001: wait 250 ms 6@ = -1 053E: 6@ = get_random_car_with_actors -1 in_area 4@ 5@ 0@ 1@ if 0 NOT 6@ == -1 jf ££Stinger_timer 04FE: deflate_tire_on_car 6@ tire 0 04FE: deflate_tire_on_car 6@ tire 1 04FE: deflate_tire_on_car 6@ tire 2 04FE: deflate_tire_on_car 6@ tire 3 :Stinger_timer if 0 16@ > 10000 jf ££Stinger_loop 0108: destroy object 7@ 004E: end_thread Hierin wordt dus eerst het STINGER object geplaatst op de coordinaten (0@ 1@ 2@ 3@) die zijn meegegeven bij de aanroepen van deze thread. Daarna worden de hoekpunten berekend van een vierkant van 4 bij 4 meter rond de stinger. Deze code: 6@ = -1 053E: 6@ = get_random_car_with_actors -1 in_area 4@ 5@ 0@ 1@ Kijkt of er in het berekende gebied een willekeurige auto rijdt ( deze rijdt dan dus dicht genoeg bij om een lekke band te krijgen). Als er een auto gevonden wordt in het gebied, wordt de handle van die auto in 6@ gezet, zoniet dan houdt 6@ zijn oude waarde (-1). Als er een auto gevonden is ( 6@ != -1 ) dan wordt met behulp van 04FE: deflate_tire_on_car 6@ tire 0 04FE: deflate_tire_on_car 6@ tire 1 04FE: deflate_tire_on_car 6@ tire 2 04FE: deflate_tire_on_car 6@ tire 3 de banden lek gemaakt.. Verder maakt deze thread nog gebruik van 16@, dit is een van de twee Timer-variabelen, die automatisch elke milli-seconde wordt opgehoogt. Aan het begin van deze thread wordt hij op 0 gezet, en wanneer deze timer de waarde 10.000 ( 10 seconden) bereikt, dan wordt de STINGER verwijderd, en stopt deze thread. Als er nog dingen onduidelijk zijn, moet je maar even vragen.. Reageren
Flotje Geplaatst: 26 juni 2006 Rapport Geplaatst: 26 juni 2006 Okay, dat verhelderd een hoop, maar dat van die random auto vind ik nog steeds een beetje vaag, want er staat geen if commando bij... En als ik het goed heb maakt het niet uit of de auto nou met alle 4 de banden of maar met 1tje op die stinger staat, ze worden allemaal lek, of ligt dat maar aan mij?? Oh, als je toch hierop reageerd heb ik nog een heel belangrijke vraag!!! Hoe creeer je een coordinaat voor de player?? Want als je zo'n create coordinate ofset 0.0 2.0 0.0 Maakt dan komt het coordinaat noordelijk van de speler in plaats van voor hem... Reageren
PatrickW Geplaatst: 27 juni 2006 Auteur Rapport Geplaatst: 27 juni 2006 Okay, dat verhelderd een hoop, maar dat van die random auto vind ik nog steeds een beetje vaag, want er staat geen if commando bij... Dat if commando staat erna. opcode "053E" verandert 6@ alleen als er zich een auto binnen het aangegeven gebied bevindt. Als er geen auto rijdt, blijft de oude waarde ( in dit geval -1 ) gewoon staan. Daar wordt dus achteraf met een if-commando op gechecked. En als ik het goed heb maakt het niet uit of de auto nou met alle 4 de banden of maar met 1tje op die stinger staat, ze worden allemaal lek, of ligt dat maar aan mij?? Je hebt helemaal gelijk. Het is namelijk erg lastig om te kijken of een bepaald wiel van een auto de spijkerstrip raakt ( onder anderen omdat de positie van de wielen verschilt met model), daarom heb ik ervoor gekozen om zodra een auto in de buurt van de spijkerstrip komt, alle wielen leeg te laten lopen. Hoe creeer je een coordinaat voor de player?? Want als je zo'n create coordinate ofset 0.0 2.0 0.0Maakt dan komt het coordinaat noordelijk van de speler in plaats van voor hem... Voorzover ik weet houdt het "create cordinate offset" rekening met de richting waarin de speler kijkt.. ( of in deze mod, de richting waarin de auto rijdt). Daar zijn deze commando' nou juist voor bedoelt. Anders had je de offset ook net zo goed met het normale "add"-commando's bij de coordinaten op kunnen tellen. Als dat echt niet werkt, moet je maar eens een stukje code laten zien, want dan is er iet anders mis.. Reageren
Flotje Geplaatst: 27 juni 2006 Rapport Geplaatst: 27 juni 2006 (bewerkt) Ok, het is me min of meer gelukt, maar het script komt er bij mij dan zo uit t ezien: :Rijdt0001: wait 0 ms 00D6: if 0 00E1: key_pressed 0 17 004D: jump_if_false ££rijdt 00D6: if 0 00E0: player $PLAYER_CHAR driving 004D: jump_if_false ££driving 03C1: 4@ = player $PLAYER_CHAR car 02E3: 5@ = car 4@ speed 0174: 6@ = car 4@ z_angle 0407: create_coordinate 1@ 2@ 3@ from_car 4@ offset 0.0 4.0 0.0 00AB: put_car 4@ at 1@ 2@ 3@ 0175: set_car 4@ z_angle_to 6@ 04BA: set_car 4@ speed_instantly 5@ 0002: jump ££Label009C7F Dit is allemaal nodig, om de snelheid, en hoek te bewaren, en hij gaat bovendien ook de goede richting in... Bewerkt: 27 juni 2006 door Flotje Reageren
PatrickW Geplaatst: 27 juni 2006 Auteur Rapport Geplaatst: 27 juni 2006 Dat ziet er inderdaad goed uit... Behalve dan, dat je de "wait" bovenaan beter iets langer kunt maken, bv "150 ms". Dan neemt deze thread minder procesor tijd in beslag. Verder zou je voor de robuustheid, een "if player defined" check moeten doen, voordat je checked of de player in een voertuig rijdt. Als je dat niet doet, kan GTA namelijk crashen, als je op een ongelukkig moment "busted" of "wasted" wordt. Zoiets als :Rijdt 0001: wait 150 ms 00D6: if 0 00E1: key_pressed 0 17 004D: jump_if_false ££rijdt 00D6: if 0 0256: player $PLAYER_CHAR defined 004D: jump_if_false ££rijdt 00D6: if 0 00E0: player $PLAYER_CHAR driving 004D: jump_if_false ££rijdt 03C1: 4@ = player $PLAYER_CHAR car 02E3: 5@ = car 4@ speed 0174: 6@ = car 4@ z_angle 0407: create_coordinate 1@ 2@ 3@ from_car 4@ offset 0.0 4.0 0.0 00AB: put_car 4@ at 1@ 2@ 3@ 0175: set_car 4@ z_angle_to 6@ 04BA: set_car 4@ speed_instantly 5@ 0002: jump ££Label009C7F Reageren
Flotje Geplaatst: 29 juli 2006 Rapport Geplaatst: 29 juli 2006 Ik kan dus in feite dit: 053E: 6@ = get_random_car_with_actors -1 in_area 4@ 5@ 0@ 1@ Opcode kunnen gebruiken, of de Actor variant erop, om te controleren of er een poppetje/auto voor je neus staat, en die kun je dan met een druk op de knop opblazen... Dit is echt geniaal!!! Bedankt voor alle uitleg!!! Reageren
Gta-rodney Geplaatst: 6 april 2009 Rapport Geplaatst: 6 april 2009 Wie kan het script voor mij compleet posten? 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.