Jump to content

Recommended Posts

Geplaatst:
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!!!!!! :klap::klap:_O__O_

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.

  • 3 weken later...
  • Reacties 53
  • Created
  • Laatste reactie

Top Posters In This Topic

  • PatrickW

    9

  • Flotje

    5

  • jerryk

    3

  • McDude

    2

Geplaatst:

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...

Geplaatst:

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..

  • 2 weken later...
Geplaatst:

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...

Geplaatst:
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.0

Maakt 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..

Geplaatst: (bewerkt)

Ok, het is me min of meer gelukt, maar het script komt er bij mij dan zo uit t ezien:

:Rijdt

0001: 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: door Flotje
Geplaatst:

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

  • 1 maand later...
Geplaatst:

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!!!

  • 2 years later...

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...