GTAForum.nl - Het Nederlandse Grand Theft Auto Forum!: [SA|SCM] Mission Coding for Dummies! - GTAForum.nl - Het Nederlandse Grand Theft Auto Forum!

Ga naar de inhoud

GTAGames.nl advertentie
  • (2 pagina's)
  • +
  • 1
  • 2
  • Je kunt geen onderwerp beginnen
  • Dit topic is gesloten

[SA|SCM] Mission Coding for Dummies! - Voor SannyBuilder

Geplaatst op 9 augustus 2007 - 23:29     #1 Dit lid is offline   Dutchy3010 

  • Female SCM coder!
  • PipPipPipPipPipPipPipPipPip
  • Blog weergeven
  • Galerij weergeven
  • Groep: Administrators
  • Registratie: 19-januari 06
Wij schrijven deze tutorials om zo te proberen om meer animo te krijgen voor SCM scripten. Momenteel zijn er veel te weinig scripters, zeker in verhouding tot het aantal Modellers. Aangezien er weinig tutorials op dit forum zijn, en al helemaal weinig die over SannyBuilder gaan, maken wij (PatrickW en ik) een aantal tutorials om jullie wat op weg te helpen.

Waarom SannyBuilder? Omdat dat een hele handige en overzichtelijke tool is voor het schrijven van de code. Zeker voor beginnende scripters, die we met deze tutorials willen bereiken, is dit natuurlijk erg handig.

Voor deze tutorials heb je nodig:
  • SannyBuilder (Download)
  • Een "stripped" code (die kan je vinden in de SannyBuilder Map > Data >> SA >> Stripped)
  • Grand Theft Auto: San Andreas
  • Ped Editor (Download)
  • San Andreas Place Manager (Download)
In dit topic worden alleen tutorials geplaatst. Reacties en vragen kan je plaatsen in het reactietopic. Ook kan je hier nieuwe tutorials aanvragen als je ergens vastloopt.

Wij hopen dat jullie hier wat aan hebben!

Inhoudsopgave

Tutorial 1: Beginnen met scripten
Tutorial 2: De absolute beginselen
Tutorial 3: Basis SCM-scripten
Tutorial 4: Actors
Tutorial 5: Wapens (en eigenschappen) aan een Actor
Tutorial 6: Cars spawnen
Tutorial 7: Spheres, icons en markers
Tutorial 8: Een eenvoudige missie
Tutorial 9: Een echte missie (Rockstar style)
Tutorial 10: Status Balken
Tutorial 11: Actor Animations en Animation Paths
Tutorial 12: Pickups
Tutorial 13: Teksten
Tutorial 14: Custom Save Point
Tutorial 15: Cutscenes
Tutorial 16: Menu's

Andere handige tutorial:
MPACK's
SCM VS CLEO

Ook deze tutorials zijn zeker het proberen waard, want leren je de handigste manieren om te scripten. :)


GTAGames.nl advertentie

Geplaatst op 9 augustus 2007 - 23:30     #2 Dit lid is offline   Dutchy3010 

  • Female SCM coder!
  • PipPipPipPipPipPipPipPipPip
  • Blog weergeven
  • Galerij weergeven
  • Groep: Administrators
  • Registratie: 19-januari 06
Beginnen met scripten (San Andreas)


Inhoud
  • Inleiding
  • Wat heb ik nodig?
  • Het programma
  • SCM Scripten
    • Structuren belangrijkst!
    • Het scripten zelf

  • CLEO
    • Introductie tot CLEO
    • CLEO Scripten

  • Tot slot


Inleiding
Deze "tutorial" (bij gebrek aan een beter woord) is alleen voor mensen die willen leren scripten, dus niet de mensen die al kunnen scripten. Voor jullie is dit gesneden koek, maar voor mensen die net beginnen niet. ;) Stel, je wil leren scripten, maar waar moet je beginnen? Je kunt door de bomen het bos niet meer zien. In deze tutorial, loods ik je door het beginnen heen. Een stap die voor velen als te moeilijk wordt beschouwd en daarom stoppen ze gelijk. Laat ik jullie wat zeggen: iedereen die inzet heeft, kan leren scripten! Maar denk niet: ik wil nu leren scripten, en morgen maak ik mijn eerste missie. Zo werkt het uiteraard niet. Zoiets heeft tijd nodig, net als wanneer je wil leren Photoshoppen of 3d modellen. Deze "tutorial" zal voornamelijk links en tips bevatten, die je het opstarten vergemakkelijkt.

Wat heb ik nodig?
Wat heb je allemaal nodig om te scripten? Sommige mensen vragen zich dit af, ik zal een lijstje maken:
  • Een programma waarmee je kunt editten (SannyBuilder of MissionBuilder)
  • Een GXT editor (sagxtedit)
  • San Andreas Place Manager (niet voor de coords, maar om te kunnen springen)
  • Map Editor
  • Ped Editor
  • Tijd en inzet


Het programma
Allereerst moet je het programma een beetje kennen. Ik raad je aan om SannyBuilder te gebruiken, aangezien die veel gebruikersvriendelijker is dan Missionbuilder. De laatste wordt ook niet meer geupdate. Het allereerste wat je moet weten, is hoe zo'n programma een beetje werkt. Als je niet weet hoe je de code tevoorschijn haalt, loop je natuurlijk gelijk al vast. Voor dat probleem is deze tutorial een goede oplossing.


SCM Scripten
Structuren belangrijkst!
Natuurlijk wil je gelijk scripten. Missies maken, of andere dingen die in je hoofd zitten. Dit raad ik je ten zeerste af, want als je eerst wat tijd in het leren van de structuren steekt, gaat het later vele malen beter. Dit kan je vergelijken met school: je moet nu leren (iets wat minder leuk is), maar later krijg je daardoor wel een veel betere baan dan wanneer je niet naar school zou gaan. Om dit te leren raadt ik je deze tutorial aan.

Het scripten zelf
Nu ken je, als het goed is, de structuren al. Ook nu moet je niet gelijk willen beginnen met het maken van een totale missie. Het eerste wat je moet doen, is bijvoorbeeld pickups spawnen. Helaas is voor pickups spawnen geen Sannybuilder tutorial, maar ik denk dat je (met een beetje aanpassen) deze of deze tutorials wel kunt gebruiken (Let dus op: deze zijn voor Missionbuilder!). Vervolgens kan je beetje proberen om een car te spawnen, m.b.v. deze tutorial. Als je dat een beetje geprobeerd hebt, en het lukt, dan kan je proberen een kleine missie te maken. Ik raad je dan ook aan om dit topic helemaal door te lezen, en alle tutorials te doen die je nog niet gedaan hebt. Wanneer je eigenwijs bent, en toch MissionBuilder wil gebruiken, kan je deze tutorial doorlezen. Maar zoals ik al zei, dat raad ik je af. Ook omdat je dan geen CLEO kunt gebruiken, iets waar ik hierna op terugkom.


CLEO
Introductie tot CLEO
Allereerst raad ik je aan om eerst SCM te leren. Als je kunt SCM-scripten, kan je ook CLEO maken. Andersom is dat echter niet altijd het geval, door bepaalde structuren binnen het SCM die je niet hebt binnen CLEO. Maar wat is CLEO nou? CLEO zorgt ervoor dat je geen nieuwe savegame hoeft te beginnen. Er zijn enkele verschillen met SCM, en als je kunt SCM'en zou ik gewoon een keer in de help-files van SannyBuilder kijken. Daar staan alle verschillen in: Help > Contents > CLEO 3 Code Library. De meeste kleine mods komen tegenwoordig uit in CLEO, zodat die gewoon naast je savegames kan draaien. De bekendste CLEO mod op dit forum is de BC7 mod. Een andere bekende mod, Design Your Own Mission, is juist niet een CLEO-mod, omdat die daar te groot voor is. Daarvoor is een MPACK gebruikt, iets wat erg handig is, en waar je hier een tutorial over kunt vinden. Heel handig om gebruik van te maken. Je moet dus goed bedenken wat je gebruikt: CLEO (voor de mods die naast de savegames moeten lopen) of SCM (voor de mods die los van savegames etc staan).

CLEO scripten
Misschien wil je eerst een CLEO-script downloaden en gebruiken, voordat je zelf gaat scripten. Wanneer je dat doet, kan je daarvoor deze tutorial gebruiken. Je moet natuurlijk eerst CLEO installeren, maar wanneer je SannyBuilder download krijg je daarvoor de optie (rechts onderin in het programma). Wanneer je eenmaal CLEO geïnstalleerd hebt, kun je ook gaan CLEO-scripten. Dit is, zoals ik al zei, vrijwel hetzelfde als het scripten van SCM, met enkele (cruciale) verschillen. Gewoon even in de help-files kijken, dus. Wat je ook kunt doen, om het verschil tussen die twee echt te kunnen zien, is de eerder genoemde tutorial over het spawnen van een auto vergelijken met deze tutorial.

Wanneer je eenmaal een beetje geleerd hebt te scripten, kan je ook nog andere CLEO-tutorials bekijken, zoals deze of deze. Dit raad ik je echter ten zeerste af als je nog maar net bent begonnen, want deze heb je een tijd lang niet nodig en zijn in het begin veel te moeilijk! ;)

Tot slot
Als je vragen hebt, kan je die natuurlijk altijd in het hulp forum van het scripten zetten, en je wordt zo snel en zo goed mogelijk geholpen! Heel veel succes!


Geplaatst op 9 augustus 2007 - 23:32     #3 Dit lid is offline   PatrickW 

  • GTA Juggernaut
  • PipPipPipPipPipPipPipPip
  • Blog weergeven
  • Galerij weergeven
  • Groep: Administrators
  • Registratie: 03-augustus 04
De Absolute beginselen van SCM scripten

Inhoud:
  • Programma's
    • Welke programma's
    • Vergelijking
    • Hulpprogramma's

  • Decompileren
    • Wat is decompileren?
    • Hoe moet je decompileren?

  • Compileren
    • Wat is compileren
    • Verschil tussen compile en compile+copy


Programma's
Welke programma's zijn er?
Er zijn verschillende programma's die je als belangrijkste editor voor het SCM scripten kunt gebruiken. Allereerst MissionBuilder, daarnaast SannyBuilder en tot slot kan het ook gedeeltelijk! in kladblok.

Vergelijking
FunctieMissionBuilderSannyBuilderKladblok
Edittenjajaja (wanneer al gedecompileerd)
Compilerenjajanee
Decompilerenjajanee
Updatesneejanee
Extra'sweinigjanee
MakerBarton WaterduckSeemannMicrosoft
DownloadlinkKlikKlikn.v.t.


Onder extra's in SannyBuilder worden dingen verstaan als: CLEO3, een ingebouwde coordinaten-tool, een opcode-search-tool, veel sneltoetsen, gekleurde teksten, waardoor duidelijk wordt wat wat is, etcetera.
Ik raad dan ook aan dat iedereen, zeker de mensen die net begonnen zijn met SCM-scripten, SannyBuilder te gebruiken.

Hulpprogramma's
Bij het SCM scripten is vaak alleen een editor niet genoeg. Er zijn genoeg hulpprogramma's te vinden, die je kunnen helpen bij het scripten. Een paar voorbeelden:
San Andreas Place Manager: vooral handig om te springen naar de plek waar je moet zijn bij het testen. Kan ook voor Coördinaten worden gebruikt (let wel op het verschil komma-punt!).
PED-editor: hiermee kan je handig de "code"/"naam" van een PED opzoeken, zodat je hem kunt gebruiken.


Decompileren
Wat is decompileren?
Voordat je de file kunt editten, moet je eerst compileren. Dat wilt zeggen dat je hem leesbaar maakt, je veranderd de extensie van .scm naar .txt. Dit kan je dus doen in MissionBuilder en SannyBuilder, maar niet in kladblok. Wanneer het een txt file is, kan je hem ook openen in kladblok en daar editten. Dit is echter niet handig, omdat er geen extra's zitten in kladblok (wat het dus alleen maar moeilijker maakt). Je kunt hem dan dus editten in elke text editor die je je maar kunt bedenken.

Hoe moet je decompileren?
Aangezien dit een tutorial is voor SannyBuilder, zal ik het ook uitleggen voor SannyBuilder. Eigenlijk is het heel simpel: druk op F5 óf het toetsje "decompile" óf bij "run" > "Decompile".
Bijgevoegd bestand  decompile1.jpg (21,38 KB)
Aantal downloads: 6

Ga vervolgens naar de map: Program Files > GTA San Andreas > Data > Script, en kies voor "main" (een .scm file). Druk vervolgens op openen.
Bijgevoegd bestand  decompile2.jpg (34,58 KB)
Aantal downloads: 4

Als je dit voor de eerste keer doet, krijg je misschien een scherm als hieronder staat. Geef daar de map "GTA san Andreas" aan. Doe vervolgens het bovenstaande opnieuw.

Bijgevoegd bestand  decompile4.jpg (49,99 KB)
Aantal downloads: 4

Nu krijg je een tekst voor je, die je kunt editten. Als je hem zo opslaat, krijg je een txt bestandje.


Compileren
Wat is compileren?
Wanneer je wilt testen of het klopt, dan moet je het weer "omschrijven" naar de taal die GTA San Andreas leest. Dan moet je dus weer terug brengen naar de originele staat. Dit tegenovergestelde aan decompileren heet compileren. Dit kan je doen via "Run" > "Compile", door op F6 te drukken of door in de toolbar op het tekentje van compile te klikken.

Wat is het verschil tussen compile en compile + copy?
Het kan zijn dat je iets maakt in een andere map dan de originele Data map, bijvoorbeeld m.b.v. MPACK of gewoon als je het ergens anders op wilt slaan. Compile betekent dat de SCM file in de map terecht komt waar ook de txt file staat. Compile + Copy betekent dat de scm file én in de map van de txt file komt, én in de map Data. De vorige main.scm wordt in dat laatste geval dus overschreven. Er is geen verschil wanneer je de main.txt file aan het editten bent in de map "Data".

Tot zover de absolute beginselen van het scripten. Op aanvraag van Unmountable Tijmen, hopelijk heb ik hierbij een tutorial gemaakt zoals jij het bedoelde. Zo niet, dan moet je maar even via PM uitleggen wat je wel bedoelde, en schrijf ik die tutorial ook. ;)


Geplaatst op 10 augustus 2007 - 14:25     #4 Dit lid is offline   Dutchy3010 

  • Female SCM coder!
  • PipPipPipPipPipPipPipPipPip
  • Blog weergeven
  • Galerij weergeven
  • Groep: Administrators
  • Registratie: 19-januari 06
Basis SCM-scripten


Sannybuilder

Allereerst zal ik jullie wat basis leren over het programma wat we gebruiken: SannyBuilder. Er zijn een aantal handige dingen om te weten, waardoor het scripten een stuk leuker en eenvoudiger wordt. Maar we zullen beginnen bij het begin: het decompileren.

Ga naar Run > Decompile. Dit kan ook door op het tekentje in de balk te klikken, of op F5 te drukken.
Klik vervolgens op Program Files > Rockstar Games > GTA San Andreas > data > script.

En je ziet de code, waarin je kan editten.
Bijgevoegd bestand  decompileren3.png (103,6 KB)
Aantal downloads: 9

Nu kun je gaan editten. Handig aan Sannybuilder is dat de tekst kleurtjes heeft:
  • Zwart: dit is bij bepaalde vaakgebruikte (waar je vaak ook geen code voor hoeft te zetten), zoals jump, wait, create_thread, fade, repeat, jf, etcetera.
  • Groen: dit is de naam van een label, bijvoorbeeld “:label” of “@label” (achter een jump ofzo).
  • Blauw: de variabelen hebben een blauwe kleur
  • Rood: namen van bijvoorbeeld objecten, teksten en threads zijn rood.
  • Geel en blauw: deze zijn achter elkaar te vinden in een file. De gele is het “object” wat bedoeld wordt, de blauwe is wat iets over het eerste zegt. Misschien moeilijk uit te leggen, maar als je even bekijkt snap je het wel. ;)
  • Bruin: namen van models
  • Blauw/grijs (lichter): dit staat achter //, wat als kladblaadje kan functioneren. Dit wordt niet gelezen door het spel, en dient alleen als kladblaadje voor de modder(s).


Er zijn een aantal functies in SannyBuilder die erg handig zijn om te gebruiken:
  • Coords manager, te vinden in: Tools > Ide Tools > Coords Manager (sneltoets: CTRL+ALT+1). Hiermee vind je gelijk de X, Y en Z coordinaat én de hoek waarmee je op dat moment in SA staat. Dit kan je niet aanklikken als je SA niet aanstaat.
  • Opcode search, te vinden in: Tools > Ide Tools > Coords Manager (sneltoets: CTRL+ALT+2). Hiermee kan je makkelijk zoeken naar opcodes.
  • De F1 toets is erg handig. Als je iets typt, bijvoorbeeld de begincode van een opcode, dan krijg je gelijk het volledige te zien. Ook andere dingen kan je intypen Een soort zoekfunctie dus.
  • Contents, te vinden onder “HELP”, met als sneltoets F12. Hierbij vind je een hele grote documentatiebank, als je op SCM Documentation klikt. Heel handig als je bijvoorbeeld een bepaald icon-nummer zoekt, of één van de vele andere dingen.
  • Je kunt vanuit Sanny gelijk SA opstarten, door op het icoontje “Run San Andreas” of F8 te drukken.
  • Er is een code converter van Mission Builder naar SannyBuilder, maar die werkt niet vlekkeloos. Als je het toch wilt doen, wat ik je niet aanraad, ga dan naar Tools > Code Converter > MB -> SB.


Als je klaar bent met editten, moet je het weer compileren. Dit doe je door op Run > Compile te klikken, of op het icoontje, of op F6. Je hebt ook nog een andere functie om te compileren, namelijk Compile + Copy, F7. Dit betekent dat het altijd in de map GTA San Andreas > Data > Script wordt opgeslagen, dus niet op de plaats waar jij het bestand op dat moment hebt staan.

Natuurlijk heeft SannyBuilder nog meer mogelijkheden, maar dit zijn de belangrijkste.


Het scripten


Threads
Je kunt het script zien alsof er een mannetje doorheen loopt. Soms komt dat mannetje bij een punt aan, waar hij zich verdubbeld: “create_thread”. Ze leven dan beide door, maar het originele mannetje gaat door vanaf “create_thread”, terwijl het gekloonde mannetje doorgaat op de plaats waar je een nieuwe thread wilt laten starten. Dus bijvoorbeeld: create_thread @boe, dan gaat het mannetje verder bij :boe. Als een mannetje bij het commando “end_thread” komt, gaat hij dood. Dan loopt die dus niet verder door de code. Er kunnen dus heel veel mannetje tegelijk lopen (er komt immers bij iedere “create_thread” een nieuw mannetje), die ieder hun eigen werkzaamheden op hetzelfde moment aan het doen zijn. De mannetjes werken onafhankelijk van elkaar.

De missies zijn een apart soort thread, en worden dan ook niet aangegeven met “create_thread”, maar met “start_mission”. Het zorgt er bijvoorbeeld voor dat je maar één missie tegelijk kunt beginnen. Het aparte is dat er door heel het script wordt gecontroleerd of je “wasted” of “busted” bent, en niet alleen wanneer dat commando er staat. Als de player wasted of busted is doet het mannetje van de missie thread alsof hij een "return" tegenkomt. Daarom moeten missies ook altijd beginnen met een bepaalde structuur..

Labels/jump/gosub
Labels worden aangegeven met “:” ervoor. Het zijn namen die worden toegekend aan bepaalde plekken/locaties/punten in het script. Dit is handig om ernaar toe te kunnen springen. Dit kan met “gosub” en “jump”.

:MAIN_4059
01B7: release_weather 
jump @MAIN_4075

Hierboven zie je een label, namelijk “MAIN_4059”. Vervolgens zie je een commando, met een code ervoor. Die code heet een opcode. Daaronder zie je een ander commando, namelijk jump. Met die @... geef je aan dat je naar een label springt. Je springt dus naar het label: :MAIN_4075.

Gosub is een ander verhaal. Daarmee springt hij naar een ander label, en gaat hij weer terug nadat het script “return” gelezen heeft. Voorbeeld:

 :MS_GAME_BEEFYBARON
$ONMISSION = 1 // integer values 
00BA: text_styled 'BEEFY' 1000 ms 2  // Beefy Baron
gosub @SUB_FADE_500MS 
start_mission 10  // Beefy Baron
jump @END_CASE_VIDEO_GAME


 :SUB_FADE_500MS
0169: set_fade_color 0 0 0 
fade 0 500 

:LITCAS_282
if 
fading 
else_jump @LITCAS_306 
wait 0 
jump @LITCAS_282 

:LITCAS_306
Return


Hierboven springt hij dus eerst met “gosub” naar :SUB_FADE_500MS. Daar gaat het script erdoorheen en gaat pas terug na het commando “return” (LITCAS_306).
Na “return” gaat hij dus weer terug naar de gosub, in MS_GAME_BEEFYBARON
dus.

De reden waarom “gosub” gebruikt wordt in plaats van 2x jump, is omdat het dan altijd standaard terug gaat naar de plaats waar hij vandaan komt. Meerdere mannetjes kunnen dan afzonderlijk van elkaar springen naar het label waar gosub naar verwijst, en terugkomen naar het stukje waar ze vandaan komen. Bij “jump” gaat hij echter altijd naar hetzelfde label terug. Gosub komt van subroutine.

Conditionele jump
Er is ook nog zoiets als de “conditionele jump”. Dan checkt het mannetje het script, en kijkt of er iets gebeurd is. Is dat niet gebeurd, dan jump je ergens anders naar toe. Is dat wel gebeurd, dan gaat het script gewoon door. Hiervoor kan je drie dingen gebruiken:
“else_jump @boe”
“jf @boe”
“004D: jump_if_false @boe”

In SannyBuilder wordt meestal één van de twee bovenste gebruikt, omdat bij de derde ook de opcode (004D) gebruikt moet worden.

:SWEET4_103
if
   Model.Available(#GREENWOO)
else_jump @SWEET4_152


In dit voorbeeld wordt gekeken of een Model beschikbaar is (het model van de Greenwood, in dit geval). Als dat niet het geval is, dan springt hij naar het label “:SWEET4_152”. Is dit wel het geval, dan gaat hij gewoon door.

Je kunt hier ook een lus van maken, dan wacht het mannetje net zo lang tot aan de voorwaarde gedaan wordt. Let wel op, dat je dan een wait moet plaatsen! In alle lussen, moet een wait. Als je dat vergeet, slaat het spel vast. Vaak kan je hierdoor niets meer, ook niet terug naar je bureaublad, waardoor je genoodzaakt bent om je pc opnieuw op te starten. Een voorbeeld van zo’n lus is:
:SWEET4_103
Wait 0 ms
if
   Model.Available(#GREENWOO)
else_jump @SWEET4_103

Zoals je ziet, blijft hij, zolang het model niet beschikbaar is, terugspringen naar het begin van dit label. Is dat wel het geval, dan gaat hij door.

Conditionele gosub
Naast een conditionele jump, is er ook een conditionele gosub (bestaat alleen bij CLEO3!!!):
0AA0: gosub_if_false @CREATE_NEW_ACTOR

Dit werkt precies hetzelfde als een conditionele jump (alleen dan met een gosub). Dit wordt echter niet zo vaak gebruikt…

If-then-end structuur
Er zijn nog andere structuren, buiten de jump_if_false, waarmee je kunt checken of iets gebeurd. Een voorbeeld hiervan is de if-then-end structuur (deze heb ik zelf geschreven, dus is niet terug te vinden in de main van sa):
if $choice == 0
then
$money = 10
End

Wanneer de variabele $choice gelijk is aan 0, dan wordt de waarde van de variabele “$money” gelijk aan 10. Is $choice niet gelijk aan 0? Dan gebeurt er gewoon niets. De end is nodig om aan te geven vanaf waar de voorwaarde niet meer geld, dus wat het mannetje altijd moet lezen, ook als $choise niet gelijk is aan 0. Je kunt dus bij $money nog veel meer dingen zetten die moeten gebeuren als $choice gelijk is aan 0.

Repeat-wait-until structuur
 repeat
  wait 0 ms
until 03D0: wav 3 loaded

Dit is een voorbeeld van een repeat-wait-until structuur. Aangezien dit weer een lus is, moet er weer een wait bijstaan. Hier staat: blijf alles doen wat tussen repeat en until staat, tot de voorwaarde bereikt is. Tussen repeat en until kunnen ook andere dingen staan, bijvoorbeeld dat je in een auto moet blijven zitten. In plaats van dit kan je het ook in de vorm van een conditionele jump schrijven:
:label
wait 0 ms
if
03D0: wav 3 loaded
else_jump @label



Getallen
Er zijn 2 mogelijke getallen:
Integer Values: hele, natuurlijke getallen (1; 2; 3)
Floating-point values: kommagetallen (1,5345; 3,4)

Floating-point values worden meestal gebruikt bij coördinaten, of andere coördinaten gerelateerde zaken, als bijvoorbeeld snelheid.

Voor de overige dingen worden vaak Integer Values gebruikt. Het voordeel aan Integer Values gebruiken, is dat de computer er makkelijk mee kan rekenen. Deze worden bijvoorbeeld gebruikt om wachttijden in te stellen. Maar ook als identificatie getallen voor bepaalde objecten, en om sprongen binnen het script te berekenen.

De IV en FPV mogen niet door elkaar gebruikt worden, het script werkt dan niet. Bij coördinaten is het dan ook handig om gewoon altijd Floating-point values te gebruiken. Om een voorbeeld te geven, als je bij een coördinaat 100.0 in wilt vullen, en je tikt 100, dan slaat hij de waarde 100 als integer op. Later als het script in het spel draait, wordt dat door een commando als floating-point value gezien, en komt er iets heel anders uit (geen 100.0, wat de bedoeling was).

0004: $3412 = 5000 ;; integer values
0084: $3413 = $3412 ;; integer values and handles

Het verschil is dat de eerste een waarde toekent aan een globale variable, in dit geval de waarde 5000, aan de globale variabele $3412. Dus hier staat in feiten: $3413 = $3412 = 5000, al mag je dit zo nooit in main.scm schrijven, daarin moet je hem opsplitsen.


Variabelen
Er zijn twee soorten variabelen: globale en lokale variabelen. Globale worden aangegeven met een $ ervoor (bijvoorbeeld $boe), lokale met een @ erachter (2@). Let op: een lokale variabele bestaat uit alleen maar cijfers, een globale mag nooit uit alleen maar cijfers staan. Daar wordt de code heel instabiel van, en soms werkt het gewoon niet (ook al doet Rockstar het zelf ook wel eens). Het verschil tussen globale en lokale variabelen is eigenljk vrij simpel: een globale variabele gebruik je in heel het script. Dus als je $boe gelijk stelt aan 5, dan is $boe overal 5 (tenzij je het weer veranderd). Lokale variabele daarentegen, gelden allee binnen één thread. Als je 1@ in een bepaalde thread aanmaakt, en vervolgens hetzelfde getal in een andere thread wilt gebruiken, dan moet je aan 1@ opnieuw een waarde toekennen. De waarde uit de andere thread geldt niet meer.

Rekenen met variabelen
In het SCM scripten moet je ook wel rekenen met variabelen. Hier zijn een aantal opcodes voor. Let op, hier kán je verschillen hebben in integer-values en floating-point-values, of verschil in globale en lokale variabelen. Je kunt optellen, aftrekken, vermenigvuldigen en delen. Daarnaast kan je iets gelijk stellen aan iets anders. Hieronder staan een aantal voorbeelden:
0008: $variabele += 1

Hierbij wordt de globale variabele vermeerderd met 1.

000A: 3@ += 3000

Deze opcode doet in feiten hetzelfde als hierboven, maar dan een lokale variabele. Zoals je ziet is er toch een verschil in opcode, de een is 0008, de andere is 000A.

000B: 6@ += 0.1

Misschien zie je zelf al wel wat het verschil is met hierboven. Dit is een floating-point-value, die hierboven is een integer value.

0009: $variabele += 1.741

Vrijwel dezelfde als de bovenste, maar ook dit keer is het een floating-point-value en geen integer.

Dit zijn alleen de opcodes voor het vermeerderen van een variabele. Zo heb je ze ook met delen, vermenigvuldigen en aftrekken. Ook kan je variabelen bij andere variabelen tellen, bijvoorbeeld:
 0058: $1924 += $1929 // (int)

Stel dat $1924 de waarde 5 heeft, en $1929 de waarde 3. Dan heeft $1924 vanaf deze opcode de waarde 8 (5 + 3).

 0038:   $672 == 1

Dit is een code waarmee je checkt of de variabele gelijk is aan 1. Dit is dus niet de variabele gelijkstellen.

 0004: $var = 0

Dit is wél de variabele gelijkstellen aan 0.

Dit was de basistutorial van SCM-scripten. Mochten jullie nog vragen hebben, dan weten jullie wel waar je die kunt plaatsen!


Geplaatst op 10 augustus 2007 - 16:51     #5 Dit lid is offline   Dutchy3010 

  • Female SCM coder!
  • PipPipPipPipPipPipPipPipPip
  • Blog weergeven
  • Galerij weergeven
  • Groep: Administrators
  • Registratie: 19-januari 06
Actors


Er zijn 2 soorten actors: de 'gewone' actors, en de 'special' actors. De gewone actors zijn vrij eenvoudig te maken, ze worden ongeveer hetzelfde geladen als een gewoon model (wapens bijvoorbeeld). Bij de zogenaamde special actors is het wat lastiger, maar hier komen we later op terug. Eerst gaan we de gewone actors_modellen laden (en controleren of hij geladen is), spawnen, en vervolgens natuurlijk ook weer unloaden.

We beginnen in de "stripped" code, dat is een code die helemaal clean is. Je kunt dus niets doen, alleen wat rondlopen en autorijden. Dit is natuurlijk ideaal voor een nieuwe mod. Een actor is niets anders als een karakter in het spel, op welke manier dan ook (dus bijvoorbeeld Sweet, maar ook de pedestrians).

Allereerst moet je het principe kennen. Je moet een model van de actor (actor_model) laden, vervolgens kijken of hij geladen is (zo niet, wachten tot hij wél geladen is), daarna de actor spawnen en tot slot het model weer unloaden.

Eerst gaan we dus de actor loaden:

{
  use macro (Ctrl+J) "headsa"
  to insert a file header      
}
{$VERSION 3.0.0000}                                                               

thread 'MAIN'
 var
  $PLAYER_CHAR: Player 
 end // var
01F0: set_max_wanted_level_to 6 
set_wb_check_to 0 
00C0: set_current_time 8 0 
04E4: unknown_refresh_game_renderer_at 2488.5601 -1666.84 
Camera.SetAtPos(2488.5601, -1666.84, 13.38)
$PLAYER_CHAR = Player.Create(#NULL, 2488.5601, -1666.84, 13.38)
$PLAYER_ACTOR = Actor.EmulateFromPlayer($PLAYER_CHAR)
07AF: $PLAYER_GROUP = player $PLAYER_CHAR group
Camera.SetBehindPlayer
set_weather 0          
wait 0 ms
$PLAYER_CHAR.SetClothes("PLAYER_FACE", "HEAD", Head)
$PLAYER_CHAR.SetClothes("JEANSDENIM", "JEANS", Legs)                          
$PLAYER_CHAR.SetClothes("SNEAKERBINCBLK", "SNEAKER", Shoes)
$PLAYER_CHAR.SetClothes("VEST", "VEST", Torso)
$PLAYER_CHAR.Build
$PLAYER_CHAR.CanMove = True
fade 1 (out) 0 ms                     
select_interior 0
0629: change_stat 181 (islands unlocked) to 4
016C: restart_if_wasted at 2027.77 -1420.52 15.99 angle 137.0 for_town_number 0
016D: restart_if_busted at 1550.68 -1675.49 14.51 angle 90.0 for_town_number 0
0180: set_on_mission_flag_to $ONMISSION // Note: your missions have to use the variable defined here ($ONMISSION)
03E6: remove_text_box
// put your create_thread commands here

create_thread @MODEL

// IDLE LOOP
:leeg
wait 500
jump @leeg

end_thread 

:MODEL
thread "MODEL"  

// Load models
0247: load_model #BFYST
038B: load_requested_models

:MODEL_LOAD
00D6: if
8248:   not model #BFYST available
004D: jump_if_false @MODEL_SPAWN
0001: wait 0 ms
0002: jump @MODEL_LOAD

:MODEL_SPAWN
10@ = Actor.Create(CIVFEMALE, #BFYST, 2488.5601, -1680.84, 13.3438 )

//Hier komt wat je met je actor wilt doen

0249: release_model #BFYST

end_thread


Je kunt de actor vele dingen laten doen, zoals bijvoorbeeld in de auto laten stappen of naar jou laten schieten. Maar eerst moeten ze gespawnt zijn, voordat je die dingen kunt gaan toevoegen. Daarom is het essentieel om dit eerst te weten. Ik hoop dat jullie wat geleerd hebben van deze tutorial, en als er vragen zijn schroom dan niet om ze te stellen. ;)


Geplaatst op 11 augustus 2007 - 00:01     #6 Dit lid is offline   Dutchy3010 

  • Female SCM coder!
  • PipPipPipPipPipPipPipPipPip
  • Blog weergeven
  • Galerij weergeven
  • Groep: Administrators
  • Registratie: 19-januari 06
Wapens aan Actors geven
Deze tutorial is geschreven door PatrickW


Inleiding
In dit tweede deel van de tutorial gaan we de code waarmee me in deel 1 gestopt zijn iets verder uitbreiden.
We geven hem een wapen en stellen wat eigenschappen in. De speler krijgt ook een wapen.

Om het enigzins leuk te maken moeten de speler en de actor elkaar vermoorden. Als je de actor vermoord krijg je
een muziekje, een mission passed tekst en 25000 dollar.

We beginnen met het verstrekken van de wapens.

Om een wapen aan een actor te geven, moet je eerst het wapen-model laden. Net zoals je in deel 1 het actor-model van een actor moest laden voordat je het kunt spawnen. Gelukkig is het laden van een wapen model identiek aan het laden van een actor-model.
voor het laden van het actor model hadden we de volgende code
{
use macro (Ctrl+J) "headsa"
to insert a file header
}
{$VERSION 3.0.0000}

thread 'MAIN'
var
$PLAYER_CHAR: Player
end // var
01F0: set_max_wanted_level_to 6
set_wb_check_to 0
00C0: set_current_time 8 0
04E4: unknown_refresh_game_renderer_at 2488.5601 -1666.84
Camera.SetAtPos(2488.5601, -1666.84, 13.38)
$PLAYER_CHAR = Player.Create(#NULL, 2488.5601, -1666.84, 13.38)
$PLAYER_ACTOR = Actor.EmulateFromPlayer($PLAYER_CHAR)
07AF: $PLAYER_GROUP = player $PLAYER_CHAR group
Camera.SetBehindPlayer
set_weather 0
wait 0 ms
$PLAYER_CHAR.SetClothes("PLAYER_FACE", "HEAD", Head)
$PLAYER_CHAR.SetClothes("JEANSDENIM", "JEANS", Legs)
$PLAYER_CHAR.SetClothes("SNEAKERBINCBLK", "SNEAKER", Shoes)
$PLAYER_CHAR.SetClothes("VEST", "VEST", Torso)
$PLAYER_CHAR.Build
$PLAYER_CHAR.CanMove = True
fade 1 (out) 0 ms
select_interior 0
0629: change_stat 181 (islands unlocked) to 4
016C: restart_if_wasted at 2027.77 -1420.52 15.99 angle 137.0 for_town_number 0
016D: restart_if_busted at 1550.68 -1675.49 14.51 angle 90.0 for_town_number 0
0180: set_on_mission_flag_to $ONMISSION // Note: your missions have to use the variable defined here ($ONMISSION)
03E6: remove_text_box
// put your create_thread commands here

create_thread @MODEL

// IDLE LOOP
:leeg
wait 500
jump @leeg

end_thread

:MODEL
thread "MODEL"

// Load models
0247: load_model #BFYST
0247: load_model #rocketla
0247: load_model #desert_eagle 
0247: load_model #m4 
038B: load_requested_models

:MODEL_LOAD
00D6: if or
8248:   not model #BFYST available
8248:   not model #rocketla available 
8248:   not model #desert_eagle available 
8248:   not model #m4 available 
004D: jump_if_false @MODEL_SPAWN
0001: wait 0 ms
0002: jump @MODEL_LOAD

:MODEL_SPAWN
10@ = Actor.Create(CIVFEMALE, #BFYST, 2488.5601, -1680.84, 13.3438 )
actor.WeaponAccuracy(10@)= 90
actor.Health(10@) = 2000
0350: toggle_actor 10@ maintain_position_when_attacked 1 
05E2: AS_actor 10@ kill_actor $PLAYER_ACTOR 

// geef de actor een M4
01B2: give_actor 10@ weapon 31 ammo 30000 // Load the weapon model before using this
01B9: set_actor 10@ armed_weapon_to 31


//  Geef de speler een desert eagle en een rocket-launcher, en maak de desert-eagle het actieve wapen
01B2: give_actor $PLAYER_ACTOR weapon 35 ammo 10 // Load the weapon model before using this
01B2: give_actor $PLAYER_ACTOR weapon 24 ammo 30000 // Load the weapon model before using this
01B9: set_actor $PLAYER_ACTOR armed_weapon_to 24


repeat
 wait 0 ms 
until actor.Dead(10@)

0394: play_music 1 
01E3: show_text_1number_styled GXT 'M_PASS' number 10000 time 5000 style 1  // MISSION PASSED!~n~~w~$~1~
Player.Money($PLAYER_CHAR) += 25000


0249: release_model #BFYST
0249: release_model #rocketla
0249: release_model #desert_eagle
0249: release_model #m4

end_thread




Geplaatst op 3 november 2007 - 21:45     #7 Dit lid is offline   PatrickW 

  • GTA Juggernaut
  • PipPipPipPipPipPipPipPip
  • Blog weergeven
  • Galerij weergeven
  • Groep: Administrators
  • Registratie: 03-augustus 04
Cars spawnen
Deze tutorial is geschreven door Dutchy3010


Inleiding

Deze tutorial gaat over een wezenlijk deel van het spel: auto’s. Je hebt auto’s op verschillende manieren: een auto die eenmalig spawnt of auto’s die blijven spawnen. Beiden zal ik in deze tutorial gaan behandelen.


Auto’s die blijven spawnen

Je zou het misschien niet zeggen, maar de auto’s die blijven spawnen zijn makkelijker te maken als de auto’s die eenmalig gespawnt worden. Dit komt omdat het een zogenaamde ‘cargenerator’ is. Je hoeft ze dan niet van tevoren te laden en na afloop te unloaden, omdat dat allemaal achter de schermen voorkomt en hardcoded is. Op deze manier worden dus de auto’s gespawnt die een vaste vindplaats hebben.

De regel voor de cargenerator is:
 {
use macro (Ctrl+J) "headsa"
to insert a file header
}
{$VERSION 3.0.0000}

thread 'MAIN'
var
$PLAYER_CHAR: Player
end // var
01F0: set_max_wanted_level_to 6
set_wb_check_to 0
00C0: set_current_time 8 0
04E4: unknown_refresh_game_renderer_at 2488.5601 -1666.84
Camera.SetAtPos(2488.5601, -1666.84, 13.38)
$PLAYER_CHAR = Player.Create(#NULL, 2488.5601, -1666.84, 13.38)
$PLAYER_ACTOR = Actor.EmulateFromPlayer($PLAYER_CHAR)
07AF: $PLAYER_GROUP = player $PLAYER_CHAR group
Camera.SetBehindPlayer
set_weather 0
wait 0 ms
$PLAYER_CHAR.SetClothes("PLAYER_FACE", "HEAD", Head)
$PLAYER_CHAR.SetClothes("JEANSDENIM", "JEANS", Legs)
$PLAYER_CHAR.SetClothes("SNEAKERBINCBLK", "SNEAKER", Shoes)
$PLAYER_CHAR.SetClothes("VEST", "VEST", Torso)
$PLAYER_CHAR.Build
$PLAYER_CHAR.CanMove = True
fade 1 (out) 0 ms
select_interior 0
0629: change_stat 181 (islands unlocked) to 4
016C: restart_if_wasted at 2027.77 -1420.52 15.99 angle 137.0 for_town_number 0
016D: restart_if_busted at 1550.68 -1675.49 14.51 angle 90.0 for_town_number 0
0180: set_on_mission_flag_to $ONMISSION // Note: your missions have to use the variable defined here ($ONMISSION)
03E6: remove_text_box
// put your create_thread commands here

create_thread @MODEL

// IDLE LOOP
:leeg
wait 500
jump @leeg

end_thread

:MODEL
thread 'MODEL'
014B: $PARKED_RHINO = init_parked_car_generator #RHINO -1 -1 1 alarm 0 door_lock 0 0 10000 at 2459.9041 -1659.4592 13.3047 angle 90.0 
014C: set_parked_car_generator $PARKED_RHINO cars_to_generate_to 101

end_thread


Er is ook nog een variant, waarmee je het nummerbord kunt wijzigen:

09E2: $2765 = parked_car_generator_w_numberplate #GREENWOO 59 34 0 alarm 0 door_lock 0 0 10000 plate "GROVE4L_" at $138 $139 $140 angle $141 
014C: set_parked_car_generator $2765 cars_to_generate_to 101

Je maakt er "parked_car_generator_w_numberplate" van (with numberplate), en je voegt "Plate "..." " toe. Dan heb je dus een auto die spawnt mét nummerbord.

Auto’s die eenmalig spawnen

Dit gaat weer ongeveer op dezelfde manier als het spawnen van actors.

//Load models
0247: load_model #GREENWOO 
038B: load_requested_models 

:MODEL_LOAD
00D6: if  
8248:   not model #GREENWOO available 
004D: jump_if_false @MODEL_SPAWN
0001: wait 0 ms 
0002: jump @MODEL_LOAD

Als je de andere tuts hebt gelezen, lijkt me hier geen bij uitleg nodig. ;)

:MODEL_SPAWN
$greenwood = Car.Create(#GREENWOO, 2458.2483, -1659.0264, 13.3047)
Car.Angle($greenwood)= 270.0

Hier spawn je dus de greenwood. De naam van de Greenwood is GREENWOO. En daarachter ook de coordinaten. De tweede regel is weer voor de Angle (hoek).

 0249: release_model #GREENWOO

En hier weer om te releasen.

Natuurlijk zijn er allerlei leuke codes voor een eenmalig spawnende auto. Hier volgen een paar voorbeelden:

0674: set_car_model #GREENWOO numberplate "ABCDEFG"

Zo kan je dus een speciaal nummerbord instellen van een auto.

  0119:   car $greenwood wrecked

Hiermee kun je dus vragen of je auto kapot is of niet (vaak met een if-structuur erbij). Bij de $ moet je de naam van de gespawnde auto geven.

 0224: set_car $greenwood health_to 10000

Hoe hoger je het getal maakt (10000), hoe meer schade de auto kan incasseren. Hier kan je natuurlijk leuk mee variëren. De Greenwood met 500 is hij bijvoorbeeld hevig aan het roken (nog wel wit), met 250 is hij ook aan het roken, zelfs zwart, en is 1 botsing genoeg om te ontploffen. Lager als 249 hoef je niets te doen, dan ontploft hij al uit zichzelf. 1000 is een reëel getal voor een auto. De $greenwood is natuurlijk weer de naam van de auto, gedefinieerd bij het spawnen.

 01E8: create_forbidden_for_cars_cube_cornerA 2500.0 -1677.0 20.0 cornerB 2430.0 -1653.0 0.0

 01E7: remove_forbidden_for_cars_cube_cornerA 2272.922 -1649.556 14.3311 cornerB 2266.101 -1633.219 14.3505

Dit zijn de codes voor aanmaken en verwijderen van gebieden die je autoloos wilt hebben. Er rijden daar dus geen auto’s rond. Is handig als je bijvoorbeeld mensen moet vermoorden die een goed wapen hebben. Anders heb je immers een probleem dat de speler gewoon een auto kan pakken en daardoor vrijwel geen last heeft van het wapen van de actor.
Je hebt een corner A en een corner B. De coordinaten invullen is wat lastiger. Je moet dus de x en y coordinaat van de ene hoek nemen en de x en y coordinaat van de andere hoek. Dus:
A  
			
		 B

Vervolgens moet je de Y coordinaat bepalen. De ene moet hoog zijn, de andere laag: zo krijg je een kubus. Maakt dus niet uit welke van de twee hoog is en welke laag. Advies is om gewoon heel hoog en heel laag te doen, zodat het niet uit maakt waar je gaat staan in die kubus. Bijvoorbeeld 0.0 en 20, of misschien zelfs hoger.

Natuurlijk zijn er nog veel en veel meer commando’s die met cars te maken hebben, omdat het natuurlijk een heel wezenlijk onderdeel is in het spel. Mocht je dus nog requests hebben omdat je niet weet hoe je het moet doen, dan kan je het altijd vragen in het reactietopic!

Bijgevoegde bestanden




Geplaatst op 11 november 2007 - 12:08     #8 Dit lid is offline   Dutchy3010 

  • Female SCM coder!
  • PipPipPipPipPipPipPipPipPip
  • Blog weergeven
  • Galerij weergeven
  • Groep: Administrators
  • Registratie: 19-januari 06
Spheres, icons en markers


Allereerst: wat zijn Spheres en markers? Met icons worden de tekentjes bedoeld op de radar linksonder in beeld en markers zijn pijltjes boven hoofden van actors en/of boven auto’s. Met spheres worden de rode rondjes bedoeld, die je bijvoorbeeld krijgt als je een missie voor een persoon moet doen of als je bijna klaar bent met je missie en dingen moet doen.

Hoe creëer je een sphere/icon?
Je kunt met 1 commando zowel een icon als een sphere creëren, je kunt ook alleen een sphere of alleen een icon creëren. Je hebt ook icons die je altijd ziet, en icons die je alleen ziet wanneer je in de buurt bent. Ik zal ze allemaal uitleggen.

Sphere
 {
  use macro (Ctrl+J) "headsa"
  to insert a file header      
}
{$VERSION 3.0.0000}                                                               

thread 'MAIN'
 var
  $PLAYER_CHAR: Player 
 end // var
01F0: set_max_wanted_level_to 6 
set_wb_check_to 0 
00C0: set_current_time 8 0 
04E4: unknown_refresh_game_renderer_at 2488.5601 -1666.84 
Camera.SetAtPos(2488.5601, -1666.84, 13.38)
$PLAYER_CHAR = Player.Create(#NULL, 2488.5601, -1666.84, 13.38)
$PLAYER_ACTOR = Actor.EmulateFromPlayer($PLAYER_CHAR)
07AF: $PLAYER_GROUP = player $PLAYER_CHAR group
Camera.SetBehindPlayer
set_weather 0          
wait 0 ms
$PLAYER_CHAR.SetClothes("PLAYER_FACE", "HEAD", Head)
$PLAYER_CHAR.SetClothes("JEANSDENIM", "JEANS", Legs)                          
$PLAYER_CHAR.SetClothes("SNEAKERBINCBLK", "SNEAKER", Shoes)
$PLAYER_CHAR.SetClothes("VEST", "VEST", Torso)
$PLAYER_CHAR.Build
$PLAYER_CHAR.CanMove = True
fade 1 (out) 0 ms                     
select_interior 0
0629: change_stat 181 (islands unlocked) to 4
016C: restart_if_wasted at 2027.77 -1420.52 15.99 angle 137.0 for_town_number 0
016D: restart_if_busted at 1550.68 -1675.49 14.51 angle 90.0 for_town_number 0
0180: set_on_mission_flag_to $ONMISSION // Note: your missions have to use the variable defined here ($ONMISSION)
03E6: remove_text_box
create_thread @SPHERE 

// IDLE LOOP
:leeg
wait 500
jump @leeg

end_thread 

:SPHERE
thread 'SPHERE'

//Load models
0247: load_model #GREENWOO 
038B: load_requested_models 

:MODEL_LOAD
00D6: if  
8248:   not model #GREENWOO available 
004D: jump_if_false @MODEL_SPAWN                                              
0001: wait 0 ms 
0002: jump @MODEL_LOAD

:MODEL_SPAWN
00A5: $greenwood = create_car #GREENWOO at 2458.2483 -1659.0264 13.3047 
Car.Angle($greenwood)= 270.0
0186: $m1 = create_marker_above_car $greenwood
wait 5000 ms
Marker.Disable($m1)

0249: release_model #GREENWOO


end_thread


Nou hebben we een sphere, maar houdt er rekening mee dat dat alleen nog maar de sphere is. Er gebeurt dus niets als je in de sphere gaat staan, ook niet als je daarachter code hebt geschreven. Dan moet je de volgende code toevoegen:
00EC:   actor $PLAYER_ACTOR 0 near_point $c1 $c2 radius 1.0 1.0

Hier zegt hij dus dat de PLAYER_ACTOR (in dit geval de variablee voor de speler zelf) in de buurt is van de coordinaten $c1 (x) en $c2 (y), met een radius van 1.0.

Voor als je in een auto erin moet gaan staan:
00EE:   actor $PLAYER_ACTOR 0 near_point 2067.4 -1831.2 radius 15.0 15.0 in_car

Werkt hetzelfde, let wel op dat het een andere opcode is en dus niet alleen in_car erachter schrijven!

Je kunt ook een specifieke auto erin laten staan, en dat doe je zo:
01AE:   car $greenwood sphere 0 near_point -2614.6282 1398.4735 radius 5.0 5.0 stopped

Het spreekt allemaal voor zich, maar de code is altijd net even anders.

Met deze tutorials zou je al een missie kunnen maken, en dat zullen we dan ook maar gaan doen in de volgende tutorial!

Geplaatste afbeelding
Inschrijven t/m 14 januari!

Geplaatst op 31 januari 2008 - 21:25     #9 Dit lid is offline   Dutchy3010 

  • Female SCM coder!
  • PipPipPipPipPipPipPipPipPip
  • Blog weergeven
  • Galerij weergeven
  • Groep: Administrators
  • Registratie: 19-januari 06
Een eenvoudige missie


Zoals beloofd gaan we nu beginnen met een echte missie te maken. Allereerst moet je een goed plan hebben voor de missie. In ons voorbeeld gaan we een auto laten spawnen met pijl erboven, als je instapt gaat de pijl weg en komt er een sphere waar je heen moet rijden. Op dit moment heeft de speler een baseball bat. De auto is al ver kapot, en bij de lichtste aanraking (zelfs met een lantaarnpaal) ontploft hij. Als men in de marker is, moet er een actor spawnen met een baseball bat. Deze moet je aanvallen zodra hij je ziet. Als de actor gekilled is, is de missie passed, krijg je een bericht dat de missie gehaald is en krijg je $10000 bij. Ook verdwijnt de marker dan.

Natuurlijk is dit niet een hele moeilijke missie, en zou je hem later nog wat kunnen opleuken. Bijvoorbeeld door een tijd toe te voegen als je rijdt: zo moet je snel rijden en kan je niet gewoon rustig rijden en zo schade voorkomen. Of bijvoorbeeld als je uitstapt, dat je dan weer een marker krijgt op de auto. Of dat mission failed is als je dood bent, want nu moet je gewoon van het Los Santos ziekenhuis gaan naar de plek waar je gebleven bent (met de gevolgen daarvan). Hoe dan ook, je moet klein beginnen, en dat gaan we dus ook doen met deze missie.

Nu we het idee hebben, gaan we scripten. We beginnen zoals gebruikelijk met de stripped file:
 {
  use macro (Ctrl+J) "headsa"
  to insert a file header      
}
{$VERSION 3.0.0000}                                                               

thread 'MAIN'
 var
  $PLAYER_CHAR: Player 
 end // var
01F0: set_max_wanted_level_to 6 
set_wb_check_to 0 
00C0: set_current_time 8 0 
04E4: unknown_refresh_game_renderer_at 2488.5601 -1666.84 
Camera.SetAtPos(2488.5601, -1666.84, 13.38)
$PLAYER_CHAR = Player.Create(#NULL, 2488.5601, -1666.84, 13.38)
$PLAYER_ACTOR = Actor.EmulateFromPlayer($PLAYER_CHAR)
07AF: $PLAYER_GROUP = player $PLAYER_CHAR group
Camera.SetBehindPlayer
set_weather 0          
wait 0 ms
$PLAYER_CHAR.SetClothes("PLAYER_FACE", "HEAD", Head)
$PLAYER_CHAR.SetClothes("JEANSDENIM", "JEANS", Legs)                          
$PLAYER_CHAR.SetClothes("SNEAKERBINCBLK", "SNEAKER", Shoes)
$PLAYER_CHAR.SetClothes("VEST", "VEST", Torso)
$PLAYER_CHAR.Build
$PLAYER_CHAR.CanMove = True
fade 1 (out) 0 ms                     
select_interior 0
0629: change_stat 181 (islands unlocked) to 4
016C: restart_if_wasted at 2027.77 -1420.52 15.99 angle 137.0 for_town_number 0
016D: restart_if_busted at 1550.68 -1675.49 14.51 angle 90.0 for_town_number 0
0180: set_on_mission_flag_to $ONMISSION // Note: your missions have to use the variable defined here ($ONMISSION)
03E6: remove_text_box
// put your create_thread commands here


end_thread

// put your mods (threads) here




//----------------------Mission 0-------------------------
// put your missions here



//----------------------Mission 0-------------------------
// put your external scripts here


Vervolgens gaan we eerst maar alles laden en kijken of het geladen is. De actor moet nog niet gespawnt worden, de auto wel. De bat moeten we zometeen geven aan de speler, later pas aan de actor. Hier het loaden van de models en het spawnen van de auto (en de instellingen van de auto) .
{
use macro (Ctrl+J) "headsa"
to insert a file header
}
{$VERSION 3.0.0000}

thread 'MAIN'
var
$PLAYER_CHAR: Player
end // var
01F0: set_max_wanted_level_to 6
set_wb_check_to 0
00C0: set_current_time 8 0
04E4: unknown_refresh_game_renderer_at 2488.5601 -1666.84
Camera.SetAtPos(2488.5601, -1666.84, 13.38)
$PLAYER_CHAR = Player.Create(#NULL, 2488.5601, -1666.84, 13.38)
$PLAYER_ACTOR = Actor.EmulateFromPlayer($PLAYER_CHAR)
07AF: $PLAYER_GROUP = player $PLAYER_CHAR group
Camera.SetBehindPlayer
set_weather 0
wait 0 ms
$PLAYER_CHAR.SetClothes("PLAYER_FACE", "HEAD", Head)
$PLAYER_CHAR.SetClothes("JEANSDENIM", "JEANS", Legs)
$PLAYER_CHAR.SetClothes("SNEAKERBINCBLK", "SNEAKER", Shoes)
$PLAYER_CHAR.SetClothes("VEST", "VEST", Torso)
$PLAYER_CHAR.Build
$PLAYER_CHAR.CanMove = True
fade 1 (out) 0 ms
select_interior 0
0629: change_stat 181 (islands unlocked) to 4
016C: restart_if_wasted at 2027.77 -1420.52 15.99 angle 137.0 for_town_number 0
016D: restart_if_busted at 1550.68 -1675.49 14.51 angle 90.0 for_town_number 0
0180: set_on_mission_flag_to $ONMISSION // Note: your missions have to use the variable defined here ($ONMISSION)
03E6: remove_text_box
create_thread @MODEL

// IDLE LOOP
:leeg
wait 500
jump @leeg

end_thread

:MODEL
thread 'MODEL'
//Load models
0247: load_model #GREENWOO
0247: load_model #bat
0247: load_model #BFYST
038B: load_requested_models 

:MODEL_LOAD
00D6: if or 
8248:   not model #GREENWOO available
8248:   not model #bat available
8248:   not model #BFYST available
004D: jump_if_false @MODEL_SPAWN                                              
0001: wait 0 ms 
0002: jump @MODEL_LOAD

:MODEL_SPAWN
0674: set_car_model #GREENWOO numberplate "ABCDEFG" 
00A5: $greenwood = create_car #GREENWOO at 2458.2483 -1659.0264 13.3047 
Car.Angle($greenwood)= 270.0
0224: set_car $greenwood health_to 250
0186: $m1 = create_marker_above_car $greenwood
01B2: give_actor $PLAYER_ACTOR weapon 5 ammo 10 // Load the weapon model before using this
01B9: set_actor $PLAYER_ACTOR armed_weapon_to 5

repeat
wait 0
until Actor.InCar($PLAYER_ACTOR, $greenwood)
Marker.Disable($m1) 

                                                                                 
0004: $coordinaat_x = 2100.9604
0004: $coordinaat_y = -1366.8369
0004: $coordinaat_z = 23.9844 

$coordinaat = Marker.CreateIconAndSphere(0, $coordinaat_x, $coordinaat_y, $coordinaat_z)

:MODEL_WRECKED
wait 0 ms                                        
if     
  0119:   car $greenwood wrecked               
  004D: jump_if_false @MODEL_END                                 
wait 0 ms                                              
jump @MODEL

:MODEL_END
if
 01AE:   car $greenwood sphere 0 near_point $coordinaat_x $coordinaat_y radius 5.0 5.0 stopped 
 004D: jump_if_false @MODEL_WRECKED
wait 0 ms

10@ = Actor.Create(CIVFEMALE, #BFYST, 2094.3499, -1342.9515, 23.9844)
Marker.Disable($coordinaat)
Actor.Angle(10@) = 88.44
0187: $m2 = create_marker_above_actor 10@ 
actor.WeaponAccuracy(10@)= 100
actor.Health(10@) = 250
01B2: give_actor 10@ weapon 5 ammo 1000 // Load the weapon model before using this
01B9: set_actor 10@ armed_weapon_to 5
05E2: AS_actor 10@ kill_actor $PLAYER_ACTOR

repeat
wait 0 ms
until actor.Dead(10@)

0394: play_music 1
01E3: show_text_1number_styled GXT 'M_PASS' number 10000 time 5000 style 1 // MISSION PASSED!~n~~w~$~1~
Player.Money($PLAYER_CHAR) += 10000
0249: release_model #GREENWOO
0249: release_model #BAT
0249: release_model #BFYST
Marker.Disable($m2)

end_thread


Zo zien jullie, met eenvoudige codes kan je toch al een aardige missie maken. Maar het probleem is bij veel modders ook niet de kunst van het modden, maar de creativiteit…

Geplaatste afbeelding
Inschrijven t/m 14 januari!

Geplaatst op 17 juli 2009 - 01:48     #10 Dit lid is offline   Dutchy3010 

  • Female SCM coder!
  • PipPipPipPipPipPipPipPipPip
  • Blog weergeven
  • Galerij weergeven
  • Groep: Administrators
  • Registratie: 19-januari 06
>tussenpost<

Komt snel

Geplaatste afbeelding
Inschrijven t/m 14 januari!

Geplaatst op 17 juli 2009 - 12:43     #11 Dit lid is offline   Dutchy3010 

  • Female SCM coder!
  • PipPipPipPipPipPipPipPipPip
  • Blog weergeven
  • Galerij weergeven
  • Groep: Administrators
  • Registratie: 19-januari 06
Een complete missie
( Rockstar Style )

Deze tutorial is geschreven door PatrickW


In deze nogal lange tutorial gaan we uitleggen hoe je een echte missie maakt, zoals Rockstar ze ook bouwt, dus niet als een simpele thread, zoals in de voorgaande tutorials.

Om te beginnen zullen we de structuur en de bijzonderheden op een rijtje zetten, daarna zullen we templates geven voor de verschillende delen, en deze uitleggen, en tenslotte zullen we een missie laten zien die op basis van deze templates zijn gemaakt.

Structuur
Missies zoals ze door rockstar zijn gemaakt, en zoals we ze nu ook gaan maken, wijken qua gedrag af van normale threads die je normaal gebruikt. Ten eerste wordt de code voor een missie pas vanaf de schijf in het geheugen geladen, wanneer de missie gestart wordt. Dit heeft tot gevolg dat er slechts 1 missie tegelijk actief kan zijn. Een ander heel groot verschil is de manier hoe de code zich gedraagt waneer de speler BUSTED of WASTED is.
In een normale thread moet je hier steeds op checken (is_payer_defined), maar tijdens een missie hoeft dat niet. Als de speler tijdens een missie WASTED of BUSTED wordt, voert de SCM-engine, namelijk op dat moment automatisch een "return"-opcode uit. Je hoeft dus tijdens de missie zelf niet steeds te controleren of de speler nog leeft, maar je moet wel het standaard framework van een Rockstar missie gebruiken, om die automatische "return"-opcode op te vangen. Dit framework zal verderop uitgelegd wordt bij de missie-template.

Om een missie te maken heb je twee delen nodig:
  • De missie zelf
  • Een zogenaamde "sniffer"-thread, die de startvoorwaarden van een missie checked en controleert of de speler de start van een missie triggert ( door b.v. op een bepaalde plek in een marker te lopen).

Voor beide delen zullen we een template geven, die je voor je eigen project moet invullen en evt. uitbreiden.

Sniffer-thread template

De sniffer-thread wordt gestart, zodra de missies gedaan kunnen worden. Dit kan direct vanaf de start van het spel zijn, of op het moment dat je een andere missie gehaalt hebt. Deze template bevat de code voor een sniffer-thread voor twee missies, maar dit kun je vrij eenvoudig uitbreiden tot veel meer missies die na elkaar gedaan kunnen worden.
// $TUT_MISSIONS_PASSED wordt vooraf op 0 gezet.
// bij het "PASS"-en van een missie , moet je $TUT_MISSIONS_PASSED ophogen.
:TUT_MISSIONS_SNIFFER
thread "TUT_SNIFF"
$MARKER_SWEET_HOUSE = Marker.CreateIconAndSphere(42, <<xcoord>>, <<ycoord>>, <<zcoord>>)
repeat
  wait $DEFAULT_WAIT_TIME 
  if and
    player.Defined($PLAYER_CHAR)
    $ONMISSION == 0 
  then
    if and
      00FF:   actor $PLAYER_ACTOR sphere 0 in_sphere <<xcoord>>, <<ycoord>>, <<zcoord>> radius 1.0 1.0 2.0 on_foot 
      Player.Controllable($PLAYER_CHAR)
      $TUT_MISSIONS_PASSED == 0
    then
      $ONMISSION = 1
      00BA: show_text_styled GXT 'INTRO_1' time 1000 style 2  
     start_mission 1  
    end
    
    if and
      00FF:   actor $PLAYER_ACTOR sphere 0 in_sphere <<xcoord>>, <<ycoord>>, <<zcoord>> radius 1.0 1.0 2.0 on_foot 
      Player.Controllable($PLAYER_CHAR)
      $TUT_MISSIONS_PASSED == 1
    then
      $ONMISSION = 1
      00BA: show_text_styled GXT 'INTRO_2' time 1000 style 2  
     start_mission 2  
    end
  end 
until $TUT_MISSIONS_PASSED == 2
marker.Disable($MARKER_SWEET_HOUSE)
end_thread 



Globaal gesproken, zet deze thread een marker op de goede plek waar de missions gestart kunnen worden en wacht dan in een lus tot de speler in de marker loopt, of dat beide missies gepassed zijn.
Zolang $TUT_MISSIONS_PASSED op 0 staat, is er nog geen van de twee tutorial missies gepassed, en zal de eerste missie gestart worden, als de speler in de marker loopt (de eerste tak van de lus).
Nadat de speler de eerste missie gehaald heeft, (waarbij de $TUT_MISSIONS_PASSED is opgehoogd naar 1), zal de snifferthread opnieuw wachten tot de speler in de marker loopt (de tweede tak van de lus).
Na het succesvol afronden van de tweede missie, zal de $TUT_MISSIONS_PASSED op 2 staan, waarna de lus wordt verlaten, de marker wordt opgeruimd, en de thread wordt beëindigd.

Mission template

//-------------Mission 1---------------
// Mission wrapper
:TUT_MISSION_1
thread 'TUT 1' 
gosub @TUT_MISSION_1_MAIN 
if wasted_or_busted 
then 
  gosub @TUT_MISSION_1_FAIL 
end
gosub @TUT_MISSION_1_CLEANUP 
end_thread 

//-------------------------------------
:TUT_MISSION_1_MAIN


//-------------------------------------
:TUT_MISSION_1_PASSED
Player.Money($PLAYER_CHAR) += 10000
01E3: show_text_1number_styled GXT 'M_PASS' number 10000 time 5000 style 1 // MISSION PASSED!~n~~w~$~1~
// This subroutine is executed when the mission is passed. 
// Give the rewards, and make new missions available if needed.

return

//-------------------------------------
:TUT_MISSION_1_FAIL
00BA: show_text_styled GXT 'M_FAIL' time 5000 style 1  // ~r~MISSION FAILED!
// This subroutine is executed when the mission fails. 
return 

//-------------------------------------
:TUT_MISSION_1_CLEANUP
$ONMISSION = 0 
// This subroutine is always executed at the end of the mission, regardless the outcome.
// This is the place to unload models etc. 
mission_cleanup 
return 



Het eerste stukje, van deze code is de missie-wrapper, die de verschillende delen van de missie aanroept met behulp van "gosub", om zo de automatische "return" bij het WASTED of BUSTED van de speler ook opvangt.
Als eerste roept hij het hoofdgedeelte van de missie aan. Als die terug komt, kunnen er twee dingen zijn gebeurt:
  • Een automatische "return, omdat de speler WASTED of BUSTED is. In dat geval wordt de mission failed nog aangeroepen. en daarna de "cleanup" routine, die alles opruimt.
  • De missie is PASSED of FAILED om een andere reden. In dat geval in de mission_passed of mission_failed routine al aangeroepen, en hoeft alleen de "cleanup" nog gedaan te worden.


In het complete voorbeeld hieronder zul je zien, hoe je vanuit het hoofddeel, de mission_passed en mission_failed routines aanroept bij bepaalde gebeurtenissen.


Voorbeeld missie

Op basis van bovenstaande templates hebben we hieronder een simpele missie gemaakt. Naast de templates uit deze tutorials, worden ook verschillende dingen uit voorgaande tutorials gebruikt.

De bedoeling van deze missie, die je kunt starten, voor het huis van Sweet, is om een andere actor dood te schieten. Er staan echter twee actors, een mannetje en een vrouwtje. Het is de bedoeling om het vrouwtjes dood te schieten, dan is de missie passed. Als je echter het mannetje doodschiet, dan is de missie failed.
Als de speler WASTED of BUSTED is, voor dat het vrouwtje is doodgeschoten, is de missie ook failed.
DEFINE MISSIONS 2
DEFINE MISSION 0 AT @INITIAL
DEFINE MISSION 1 AT @TUT_MISSION_1
DEFINE EXTERNAL_SCRIPTS 0 // Use -1 in order not to compile AAA script
//DEFINE SCRIPT {NAME}  AT {LABEL} @
DEFINE UNKNOWN_EMPTY_SEGMENT 0
DEFINE UNKNOWN_THREADS_MEMORY 0

{$VERSION 3.0.0000}
var
 $PLAYER_CHAR: Player
end // var 
03A4: name_thread 'MAIN' 
01F0: set_max_wanted_level_to 6 
0111: toggle_wasted_busted_check 0 
00C0: set_current_time_hours_to 8 minutes_to 0 
04E4: unknown_refresh_game_renderer_at 2488.56 -1666.84 
03CB: set_rendering_origin_at 2488.56 -1666.84 13.38 
0053: $PLAYER_CHAR = create_player #NULL at 2488.56 -1666.84 13.38 
01F5: $PLAYER_ACTOR = create_player_actor $PLAYER_CHAR 
07AF: $PLAYER_GROUP = player $PLAYER_CHAR group 
0373: set_camera_directly_behind_player 
01B6: set_weather 0 
0001: wait 0 ms 
087B: set_player $PLAYER_CHAR clothes_texture "PLAYER_FACE" model "HEAD" body_part 1 
087B: set_player $PLAYER_CHAR clothes_texture "JEANSDENIM" model "JEANS" body_part 2 
087B: set_player $PLAYER_CHAR clothes_texture "SNEAKERBINCBLK" model "SNEAKER" body_part 3 
087B: set_player $PLAYER_CHAR clothes_texture "VEST" model "VEST" body_part 0 
070D: rebuild_player $PLAYER_CHAR 
01B4: toggle_player $PLAYER_CHAR can_move 1 
016A: fade 1 time 0 
04BB: select_interior 0 
0629: change_integer_stat 181 to 4 
016C: restart_if_wasted_at 2027.77 -1420.52 15.99 angle 137.0 town_number 0 
016D: restart_if_busted_at 1550.68 -1675.49 14.51 angle 90.0 town_number 0 
0180: set_on_mission_flag_to $ONMISSION // Note: your missions have to use the variable defined here 
0004: $DEFAULT_WAIT_TIME = 250
03E6: remove_text_box 
0417: start_mission 0  // Initial 
wait 0
// put your create_thread commands here
00D7: create_thread @TUT_MISSIONS_SNIFFER 

:MAIN_LOOP
0001: wait $DEFAULT_WAIT_TIME ms
0002: jump @MAIN_LOOP 



// put your mods (threads) here
:TUT_MISSIONS_SNIFFER
thread "TUT_SNIFF"
$MARKER_SWEET_HOUSE = Marker.CreateIconAndSphere(42, $X_SWEET_HOUSE, $Y_SWEET_HOUSE, $Z_SWEET_HOUSE)
repeat
  wait $DEFAULT_WAIT_TIME 
  if and
    player.Defined($PLAYER_CHAR)
    $ONMISSION == 0 
  then
    if and
      00FF:   actor $PLAYER_ACTOR sphere 0 in_sphere $X_SWEET_HOUSE $Y_SWEET_HOUSE $Z_SWEET_HOUSE radius 1.0 1.0 2.0 on_foot 
      Player.Controllable($PLAYER_CHAR)
      $TUT_MISSIONS_PASSED == 0
    then
      $ONMISSION = 1
      00BA: show_text_styled GXT 'INTRO_1' time 1000 style 2  // Big Smoke
     start_mission 1  
    end
    

  end 
until $TUT_MISSIONS_PASSED == 1
marker.Disable($MARKER_SWEET_HOUSE)
end_thread 

//-------------Mission 0---------------
:INITIAL
$TUT_MISSIONS_PASSED = 0
$ONMISSION = 0

$X_SWEET_HOUSE = 2515.07 
$Y_SWEET_HOUSE = -1673.98 
$Z_SWEET_HOUSE = 12.71 
0629: change_integer_stat 225 to 999 

end_thread

//-------------Mission 1---------------
// Mission wrapper
:TUT_MISSION_1
thread 'TUT 1' 
  gosub @TUT_MISSION_1_MAIN 
  if wasted_or_busted 
  then 
    gosub @TUT_MISSION_1_FAIL 
  end
  gosub @TUT_MISSION_1_CLEANUP 
end_thread 

//-------------------------------------
:TUT_MISSION_1_MAIN
//Load models
model.Load(#m4)
model.Load(#BFYST)
model.Load(#BMYST)
model.Load(#TAMPA)

038B: load_requested_models 

:TUT_MISSION_1_LOAD
wait 0 ms 
if and 
  model.Available(#m4)
  model.Available(#BMYST)
  model.Available(#BFYST)
  model.Available(#TAMPA)
004D: jump_if_false @TUT_MISSION_1_LOAD 

01B2: give_actor $PLAYER_ACTOR weapon 31 ammo 10000 // Load the weapon model before using this
01B9: set_actor $PLAYER_ACTOR armed_weapon_to 31

0674: set_car_model #TAMPA numberplate "PATRICK_" 
$car_num = car.Create(#TAMPA,2488.56, -1666.84, 13.38)


$victim = Actor.Create(CIVFEMALE, #BFYST, 2488.56, -1656.84, 13.38)
$innocent = Actor.Create(CIVMALE, #BMYST, 2490.56, -1656.84, 13.38)
0187: $victim_marker = create_marker_above_actor $victim 

repeat
  wait 0 ms
  if actor.Dead($innocent)
  then
    jump @TUT_MISSION_1_FAIL
  end
until actor.Dead($victim)

:TUT_MISSION_1_PASSED
0394: play_music 1
$TUT_MISSIONS_PASSED += 1
Player.Money($PLAYER_CHAR) += 10000
01E3: show_text_1number_styled GXT 'M_PASS' number 10000 time 5000 style 1 // MISSION PASSED!~n~~w~$~1~
return

//-------------------------------------
:TUT_MISSION_1_FAIL
00BA: show_text_styled GXT 'M_FAIL' time 5000 style 1  // ~r~MISSION FAILED!
// Hier kun je alles kwijt wat moet gebeuren als de missie gefaald is. Bv. bepaalde dingen weer terugdraaien
0555: remove_weapon 31 from_actor $PLAYER_ACTOR 
return 

//-------------------------------------
:TUT_MISSION_1_CLEANUP
$ONMISSION = 0 
// Hier komt alle code om  dingen op te ruimen die voor de missie zijn geladen
// En om speciale settings voor deze missie terug te zetten naar normaal 
Marker.Disable($victim_marker)
010D: set_player $PLAYER_CHAR wanted_level_to 0 
model.Destroy(#BFYST)
model.Destroy(#BMYST)
model.Destroy(#M4)
mission_cleanup 
return 



//-------------External script 0---------------
// put your external scripts here




Het eerste deel van de code, is een standaard stuk dat iedereen wel zal kennen van de stripped SCM file.
Het enige dat daaraan is toegevoegd, is het starten van de snifferthread:
00D7: create_thread @TUT_MISSIONS_SNIFFER


En ten slotte laten we de main-thread rondjes draaien in :MAIN_LOOP

Daarna volgt de sniffer-thread. Gebasseerd op de template, maar beperkt tot maar 1 missie.

Je ziet dat we twee missies hebben gedefineerd, de eerste (Missie 0) gebruiken we net als rockstar voor het initialiseren van allerlei dingen. Hier zou je ook car_generators, en b.v. wapen pickups kunnen plaatsen. Wij zetten hier de $TUT_MISSIONS_PASSED op 0, en plaatsen de locatie van de mission trigger in 3 variabelen, zodat we ze makkelijk kunnen gebruiken op verschillende plekken.

De tweede missie (Missie1) is volgens de template opgezet. In het main deel worden eerst de modellen geladen, actors gespawned, wapens toegekend en een auto gespawned, zoals we in voorgaande tutorials al gezien hebben. Daarna wacht de code in een lus, totdat de $VICTIM wordt doodgeschoten, in dat geval loopt de code door in de mission_passed routine en is de missie dus afgelopen. Tijdens de lus wordt ook gechecked of het onschuldige mannetje nog leeft. Is dat niet meer het geval, dan springen we naar de mission_failed routine, en is de missie ook afgelopen.

In de mission passed routine, zetten we een boodschap op het scherm, geven we de speler het beloning-bedrag en hogen de $TUT_MISSIONS_PASSED op.

In de mission failed routine zetten we de boodschap op het scherm, en pakken de speler het wapen af dat hij gekregen heeft.

In de cleanup routine, ruimen we alle gebruikte modellen op en zetten het wanted-level terug op 0.

We hebben de templates en de voorbeeld missie ook als bijlage toegevoegd, zodat je ze makkelijk kunt downloaden.

Geplaatste afbeelding
Inschrijven t/m 14 januari!

Geplaatst op 17 juli 2009 - 12:44     #12 Dit lid is offline   Dutchy3010 

  • Female SCM coder!
  • PipPipPipPipPipPipPipPipPip
  • Blog weergeven
  • Galerij weergeven
  • Groep: Administrators
  • Registratie: 19-januari 06
Status Balken


Deze tutorial gaat over Status Texten, ofwel de balkjes die je bijvoorbeeld tegenkomt bij de missie "Drive-by" en de missie "Supply Lines". Op aanvraag van Tjerk, onze dank daarvoor.

{
  use macro (Ctrl+J) "headsa"
  to insert a file header      
}
{$VERSION 3.0.0000}
var
 $PLAYER_CHAR: Player
end // var 
03A4: name_thread 'MAIN' 
01F0: set_max_wanted_level_to 6 
0111: toggle_wasted_busted_check 0 
00C0: set_current_time_hours_to 8 minutes_to 0 
04E4: unknown_refresh_game_renderer_at 2488.56 -1666.84 
03CB: set_rendering_origin_at 2488.56 -1666.84 13.38 
0053: $PLAYER_CHAR = create_player #NULL at 2488.56 -1666.84 13.38 
01F5: $PLAYER_ACTOR = create_player_actor $PLAYER_CHAR 
07AF: $PLAYER_GROUP = player $PLAYER_CHAR group 
0373: set_camera_directly_behind_player 
01B6: set_weather 0 
0001: wait 0 ms 
087B: set_player $PLAYER_CHAR clothes_texture "PLAYER_FACE" model "HEAD" body_part 1 
087B: set_player $PLAYER_CHAR clothes_texture "JEANSDENIM" model "JEANS" body_part 2 
087B: set_player $PLAYER_CHAR clothes_texture "SNEAKERBINCBLK" model "SNEAKER" body_part 3 
087B: set_player $PLAYER_CHAR clothes_texture "VEST" model "VEST" body_part 0 
070D: rebuild_player $PLAYER_CHAR 
01B4: toggle_player $PLAYER_CHAR can_move 1 
016A: fade 1 time 0 
04BB: select_interior 0 
0629: change_integer_stat 181 to 4 
016C: restart_if_wasted_at 2027.77 -1420.52 15.99 angle 137.0 town_number 0 
016D: restart_if_busted_at 1550.68 -1675.49 14.51 angle 90.0 town_number 0 
0180: set_on_mission_flag_to $ONMISSION // Note: your missions have to use the variable defined here 
0004: $DEFAULT_WAIT_TIME = 250
03E6: remove_text_box

004F: create_thread @BALKJE
// put your create_thread commands here



:MAIN_LOOP
0001: wait $DEFAULT_WAIT_TIME ms
00BF: $TIME_HOURS = current_time_hours, $TIME_MINS = current_time_minutes
0002: jump @MAIN_LOOP 

:BALKJE
thread "BALKJE"

:SWEET4_47
Model.Load(#GREENWOO)
038B: load_requested_models 

:SWEET4_103
if
   not Model.Available(#GREENWOO)
else_jump @SWEET4_152 
wait 0 
jump @SWEET4_103 

:SWEET4_152
1@ = 2508.16 // floating-point values 
2@ = -1666.47 // floating-point values 
3@ = 13.0 // floating-point values 
4@ = 16.0 // floating-point values 
0395: clear_area 1 at 1@ 2@ 3@ range 6.0 
5@ = Car.Create(#GREENWOO, 1@, 2@, 3@)
0229: set_car 5@ color_to 59 34 
Car.Angle(5@) = 4@
Car.Health(5@) = 1450
$6674 = Car.Health(5@)

if 
  $6674 > 250 // integer values 
else_jump @SWEET4_11471 
$6674 -= 250 // integer values 

:SWEET4_11471
0084: $6673 = $6674 // integer values and handles 
$6673 /= 12 // integer values

0151: remove_status_text $6673 
03C4: set_status_text_to $6673 0 'SWE4_08'  // CAR HEALTH

repeat
wait 0 ms
$6674 = Car.Health(5@)

0084: $6673 = $6674 // integer values and handles 
if 
  $6673 > 250 // integer values 
else_jump @SWEET4_11472 
$6673 -= 250 // integer values 

:SWEET4_11472
$6673 /= 12 // integer values

until  $6674 < 250

0151: remove_status_text $6673

end_thread 


Hopelijk is het een beetje duidelijk, reactie en/of vragen kan je altijd in het reactietopic kwijt.

Geplaatste afbeelding
Inschrijven t/m 14 januari!

Geplaatst op 17 juli 2009 - 12:44     #13 Dit lid is offline   Dutchy3010 

  • Female SCM coder!
  • PipPipPipPipPipPipPipPipPip
  • Blog weergeven
  • Galerij weergeven
  • Groep: Administrators
  • Registratie: 19-januari 06
Actor Animations en Animation Paths


Inleiding
Je kunt allerlei soorten animaties aan actors meegeven, gewoon om je missie wat leuker te maken. Je moet twee dingen weten over animaties: de naam van de animatie en de naam van de IFP-file waarin de animatie zich bevindt. Je kunt hier een lijst daarvan vinden. De grote vetgedrukte woorden zijn de namen van de IFP-files, daarna zullen de animatie namen binnen die IFP-file volgen. Bijvoorbeeld, wanneer je wilt dat een actor danst, moet je kijken in de lijst naar de IFP-file "DANCING". Die file bevat allerlei soorten animaties, in deze tutorial zullen we "dnce_M_a" gebruiken. Natuurlijk kan je een actor ook andere animaties geven, maar ik beloof niet dat ze allemaal zullen werken.

Allereerst moeten we een actor creëren, die de animatie moet doen. Wanneer je de andere tutorials in dit topic gelezen heb, heb je geen uitleg hierbij nodig. Als je het niet snapt, ga dan terug naar de tutorial over actors.
{
  use macro (Ctrl+J) "headsa"
  to insert a file header      
}
{$VERSION 3.0.0000}                                                               

thread 'MAIN'
 var
  $PLAYER_CHAR: Player 
 end // var
01F0: set_max_wanted_level_to 6 
set_wb_check_to 0 
00C0: set_current_time 8 0 
04E4: unknown_refresh_game_renderer_at 2488.5601 -1666.84 
Camera.SetAtPos(2488.5601, -1666.84, 13.38)
$PLAYER_CHAR = Player.Create(#NULL, 2488.5601, -1666.84, 13.38)
$PLAYER_ACTOR = Actor.EmulateFromPlayer($PLAYER_CHAR)
07AF: $PLAYER_GROUP = player $PLAYER_CHAR group
Camera.SetBehindPlayer
set_weather 0          
wait 0 ms
$PLAYER_CHAR.SetClothes("PLAYER_FACE", "HEAD", Head)
$PLAYER_CHAR.SetClothes("JEANSDENIM", "JEANS", Legs)                          
$PLAYER_CHAR.SetClothes("SNEAKERBINCBLK", "SNEAKER", Shoes)
$PLAYER_CHAR.SetClothes("VEST", "VEST", Torso)
$PLAYER_CHAR.Build
$PLAYER_CHAR.CanMove = True
fade 1 (out) 0 ms                     
select_interior 0
0629: change_stat 181 (islands unlocked) to 4
016C: restart_if_wasted at 2027.77 -1420.52 15.99 angle 137.0 for_town_number 0
016D: restart_if_busted at 1550.68 -1675.49 14.51 angle 90.0 for_town_number 0
0180: set_on_mission_flag_to $ONMISSION // Note: your missions have to use the variable defined here ($ONMISSION)
03E6: remove_text_box
// put your create_thread commands here

create_thread @MODEL

// IDLE LOOP
:leeg
wait 500
jump @leeg

end_thread 

:MODEL
thread "MODEL"  

// Load models
0247: load_model #BFYST
038B: load_requested_models

:MODEL_LOAD
if
8248:   not model #BFYST available
else_jump @MODEL_SPAWN
wait 0 ms
jump @MODEL_LOAD

// Spawn actor
:MODEL_SPAWN
10@ = Actor.Create(CIVFEMALE, #BFYST, 2491.3635, -1661.4694, 13.3359)
Actor.Angle(10@) =  182.9651

0249: release_model #BFYST

//Load and give animation
04ED: load_animation "DANCING"

repeat
 wait 0
until 04EE:   animation "DANCING" loaded 
 
0605: actor 10@ perform_animation_sequence "DNCE_M_A" IFP_file "DANCING" 10.0 loop 1 0 0 0 time -1 // versionA

04EF: release_animation "DANCING"

end_thread

Tot zover deze tutorial, ik hoop dat je het begreep. Voor vragen en opmerkingen; zie reactietopic.

Geplaatste afbeelding
Inschrijven t/m 14 januari!

Geplaatst op 17 juli 2009 - 18:10     #14 Dit lid is offline   Dutchy3010 

  • Female SCM coder!
  • PipPipPipPipPipPipPipPipPip
  • Blog weergeven
  • Galerij weergeven
  • Groep: Administrators
  • Registratie: 19-januari 06
Pickups


Wat mist er nu echt in deze tutorial? Inderdaad, een tutorial over pickups. Daar gaat deze tutorial dus over.

Algemene Pickups
 {
use macro (Ctrl+J) "headsa"
to insert a file header
}
{$VERSION 3.0.0000}

thread 'MAIN'
var
$PLAYER_CHAR: Player
end // var
01F0: set_max_wanted_level_to 6
set_wb_check_to 0
00C0: set_current_time 8 0
04E4: unknown_refresh_game_renderer_at 2488.5601 -1666.84
Camera.SetAtPos(2488.5601, -1666.84, 13.38)
$PLAYER_CHAR = Player.Create(#NULL, 2488.5601, -1666.84, 13.38)
$PLAYER_ACTOR = Actor.EmulateFromPlayer($PLAYER_CHAR)
07AF: $PLAYER_GROUP = player $PLAYER_CHAR group
Camera.SetBehindPlayer
set_weather 0
wait 0 ms
$PLAYER_CHAR.SetClothes("PLAYER_FACE", "HEAD", Head)
$PLAYER_CHAR.SetClothes("JEANSDENIM", "JEANS", Legs)
$PLAYER_CHAR.SetClothes("SNEAKERBINCBLK", "SNEAKER", Shoes)
$PLAYER_CHAR.SetClothes("VEST", "VEST", Torso)
$PLAYER_CHAR.Build
$PLAYER_CHAR.CanMove = True
fade 1 (out) 0 ms
select_interior 0
0629: change_stat 181 (islands unlocked) to 4
016C: restart_if_wasted at 2027.77 -1420.52 15.99 angle 137.0 for_town_number 0
016D: restart_if_busted at 1550.68 -1675.49 14.51 angle 90.0 for_town_number 0
0180: set_on_mission_flag_to $ONMISSION // Note: your missions have to use the variable defined here ($ONMISSION)
03E6: remove_text_box
// put your create_thread commands here

create_thread @MODEL

// IDLE LOOP
:leeg
wait 500
jump @leeg

end_thread

:MODEL
thread 'MODEL'
0518: $ASSET = create_available_asset_pickup 'PROP_3' at 2487.5598 -1658.3495 13.3528  price 100
0213: $HEALTH = create_pickup #HEALTH type 3 at 2484.5598 -1658.3495 13.3528
032B: $MINIGUN = create_weapon_pickup #MINIGUN group 15 ammo 5000 at 2490.5598 -1658.3495 13.3528 
03DC: 1@ = create_marker_above_pickup $MINIGUN

repeat
wait 0
until 0214:   pickup $MINIGUN picked_up

0164: disable_marker 1@

0247: load_model #BFYST
0247: load_model #MINIGUN
038B: load_requested_models

:MODEL_LOAD
if and
8248:   not model #BFYST available
8248:   not model #MINIGUN available
else_jump @MODEL_SPAWN
wait 0 ms
jump @MODEL_LOAD

:MODEL_SPAWN
10@ = Actor.Create(CIVFEMALE, #BFYST, 2488.5601, -1680.84, 13.3438 )
01B2: give_actor 10@ weapon 38 ammo 500 // Load the weapon model before using this 
02E2: set_actor 10@ weapon_accuracy_to 90 
0223: set_actor 10@ health_to 1000 

05E2: AS_actor 10@ kill_actor $PLAYER_ACTOR

repeat
wait 100
until 0118:   actor 10@ dead 

0109: player $PLAYER_CHAR money += 100

repeat
wait 100
until 0214:   pickup $ASSET picked_up

00BC: show_text_highpriority GXT 'MCAT07E' time 3000 flag 1  


end_thread


Geplaatste afbeelding
Inschrijven t/m 14 januari!

Geplaatst op 17 juli 2009 - 21:46     #15 Dit lid is offline   Dutchy3010 

  • Female SCM coder!
  • PipPipPipPipPipPipPipPipPip
  • Blog weergeven
  • Galerij weergeven
  • Groep: Administrators
  • Registratie: 19-januari 06
Teksten


Deze tutorial gaat over teksten ingame. Er zijn allerlei soorten teksten: groot, klein, vetgedrukt, gekleurd...

Display Teksten

00BA: show_text_styled GXT 'BEEFY' time 3000 style 1

Je moet de naam van de GXT entry tussen de ' ' plaatsen. Achter tijd moet je aangeven hoe lang de tekst in beeld moet zijn. Er zijn 7 stijlen die je achter style in kunt vullen:
  • 1: In het midden, zoals wanneer je een missie gehaald hebt of wanneer je een race gewonnen hebt.
  • 2: Rechts onderin, zoals wanneer je een missie start.
  • 3: Witte tekst in het midden, net zoals wasted of busted.
  • 4: Stijl 1, maar dan kleiner.
  • 5: Zelfde als stijl 4, maar dan hoger in beeld.
  • 6: Kleine witte tekst in het midden van het scherm.
  • 7: Lichtblauwe tekst bovenin het scherm.
Pas op: 0 is geen stijl, en daardoor zal de game crashen!

Je kunt een witte tekst aan de onderkant van het scherm in beeld laten komen door de andere opcodes te gebruiken. Er is een verschil tussen highpriority en lowpriority opcodes. De highpriority zal de lowpriority vervangen. Bijvoorbeeld:

00BB: show_text_lowpriority GXT 'IE23' time 3000 flag 1 
wait 1000
00BC: show_text_highpriority GXT 'MTIME3' time 3000 flag 1

Met deze code zal eerst 'IE23' in beeld komen, maar na 1 seconden (ondanks dat de originele eigenlijk 3 seconden moet duren) zal hij vervangen worden door 'MTIME3'.

Je kunt de teksten verwijderen met behulp van de volgende opcodes:

00BE: text_clear_all 
03D5: remove_text 'MTIME3'


Display teksten met een nummer

01E3: show_text_1number_styled GXT 'BB_15' number 500 time 5000 style 1

Met deze opcode kan je een nummer in de text plaatsen. In dit geval: your new high score will be 500. De stijlen zijn precies hetzelfde als de eerder genoemde. Maar let op: je moet een gxt entry gebruiken die aangeeft dat hij een nummer wil hebben. Dat doe je door middel van ~1~ in de tekst. Bij de bovenstaande opcode moet dus de volgende tekst entry zijn: Your new high score will be ~1~.

Er zijn meer opcodes die hiermee te maken hebben. Ik denk dat ze voor zich spreken.

01E4: show_text_1number_lowpriority GXT 'HJ_IS' number $var time 2000 flag 1  
036D: show_text_2numbers_styled GXT 'TX_SEQ' numbers $var $var2 time 5000 style 5 
02FD: show_text_2numbers_lowpriority GXT 'BB_05' numbers $var $var2 time 5000 flag 1  
02FF: show_text_3numbers GXT 'WHEEL02' numbers $var $var2 $var3  time 3000 flag 1  
0302: show_text_4numbers GXT 'WHEEL01' numbers $var $var2 $var3 $var4  time 3000 flag 1 
0303: show_text_4numbers_highpriority GXT 'QUAR_P6' numbers $var $var2 $var3 $var4  time 10000 flag 1  
0308: show_text_6numbers GXT 'HJSTAT' numbers $var $var2 $var3 $var4 $var5 time 5000 flag 5

Wanneer je meer dan 1 nummer erin wil hebben, moet je dus één van deze opcodes gebruiken. Bijvoorbeeld: "You have won ~1~ dollar, your current amount is now ~1~.". Je moet de variabelen in de opcode in dezelfde volgorde houden, dus als eerst moet komen hoeveel je gewonnen hebt, dan hoeveel je in totaal hebt.

Display text boxes

03E5: show_text_box 'HELP101'

Dit is een "normale" textbox. Het zal na een bepaalde tijd verdwijnen. Een textbox is de zwarte rechthoek in de linker bovenhoek met witte letters.

0512: show_permanent_text_box 'HOSP_1'

Deze text box is, zoals de opcode al wel doet vermoeden, permanent. Het blijft in beeld tot er een opcode komt die het verwijderd. Dat is de volgende:

03E6: remove_text_box


Bijvoorbeeld:

0512: show_permanent_text_box 'HOSP_1' 
wait 1000
03E6: remove_text_box

Met deze code zal er een textbox in beeld komen, 1 seconde in beeld blijven, en daarna verdwijnen.

0513: show_text_box_1number 'SLOT_02' number 2

Dit is een opcode voor een textbox met een nummer in de tekst, dat in dit geval 2 is (je kunt ook een variabele gebruiken in plaats van die twee!). Dit moet in de entry weer aangegeven worden met ~1~.

Er zijn drie opcodes die checken of er een textbox op het scherm staat:
0A2A:   text_box 'SGPUNT' displayed
08FE:   text_box_displayed 
88FE:   not text_box_displayed


0989: set_text_boxes_width 500

Met deze opcode kan je de breedte van de textbox aangeven. Om het verschil te zien, kan je de code hieronder testen:

0512: show_permanent_text_box 'HOSP_1' 
wait 1000
0989: set_text_boxes_width 500


Draw Teksten

033E: set_draw_text_position 300.0 200.0 GXT 'BJ_PUSH'

Dit is een voorbeeld van een draw text. Je kunt de positie bepalen door de 300.0 en 200.0 te veranderen. De 300.0 is horizontaal, de 200.0 is verticaal.
Een draw text is normaal gesproken een kleine witte tekst. Dit kan je echter veranderen met opcodes 133F en 1340. Je kunt het alleen verwijderen met behulp van de volgende opcode:
03F0: enable_text_draw 0


Je kunt ook een draw text maken met nummers:

045A: draw_text_1number 320.0 155.333 GXT 'WINNER' number 1000
045B: draw_text_2numbers 320.0 390.0 GXT 'TIME' numbers 20 30

Ik denk dat deze opcodes voor zichzelf spreken.

Andere tekst opcodes

0A19: display_zone_text 'MARKS'

Met deze opcode kan je een tekst in beeld laten komen zodra je een zone binnenkomt. Bijvoorbeeld Saint Mark's.

09C1: add_next_text_to_brief_history 1

Deze opcode kan je gebruiken voor het toevoegen van de tekst bij "brief" in het main menu, zodat de player het terug op kan zoeken. Een 1 betekent dat het in "brief" opgeslagen moet worden, 0 betekent dat dat niet hoeft. Je moet deze opcode gebruiken VOOR je de tekst in beeld laat komen. Bijvoorbeeld:

09C1: add_next_text_to_brief_history 1 
00BB: show_text_lowpriority GXT 'IE23' time 3000 flag 1


Wanneer je een voorbeeld van een tekst wil zien in een korte missie, kan je terugkijken naar de vorige tutorials, die een voorbeeld van teksten bevatten.

Geplaatste afbeelding
Inschrijven t/m 14 januari!

GTAGames.nl advertentie
  • (2 pagina's)
  • +
  • 1
  • 2
  • Je kunt geen onderwerp beginnen
  • Dit topic is gesloten

1 gebruikers lezen dit onderwerp
0 leden, 1 gasten en 0 anonieme leden