Jump to content

Recommended Posts

Geplaatst: (bewerkt)

Hi,

Ik ben behoorlijk nieuw in de scripting-wereld en al helemaal als 't op SCM aankomt.

Nu heb ik lang geleden de models gemaakt voor een kabelbaan naar de top van de Mt. Chilliad. Sinds ik een paar dagen geleden de basis van CLEO heb geleerd voor m'n X-mas mod, wil ik het script voor de kabelbaan zelf maken (met hulp natuurlijk, anders kom ik er niet uit :D).

Voordat ik het script uit ga leggen (wat ik ermee wil), wil ik eerst even het volgende duidelijk maken.

Het script is een CLEO script. De gondels gaan van punt A naar punt B naar punt C etcetera totdat ze op het laatste coördinaat, boven (of onder, als de gondel boven begint (er zijn twee gondels, als de ene omhoog gaat gaat de andere omlaag)), aankomen. Deze beweging is geen rechte lijn maar een hoekige boog. Vandaar dat de gondel dan ook van punt A naar B naar C naar D naar E etc. gaan, in plaats van A meteen naar E.

Het script:

{$CLEO .cs}

0107: $cablecar1 = create_object 19008 at -1478.782 -1405.371 104.944
0107: $cablecar2 = create_object 19008 at -2284.451 -1615.051 487.076
03BC: 11@ = create_sphere_at -2283.6284 -1618.5209 491.7784 radius 2.0
03BC: 12@ = create_sphere_at -2290.5369 -1616.4720 488.3425 radius 2.0
03BC: 13@ = create_sphere_at -1479.4771 -1401.9028 109.5287 radius 2.0
03BC: 14@ = create_sphere_at -1472.5647 -1403.8137 106.0885 radius 2.0

:PART1
wait 0
if or
00FF: actor $PLAYER_ACTOR sphere 0 in_sphere -2283.6284 -1618.5209 491.7784 radius 2.0 2.0 2.0 on_foot
00FF: actor $PLAYER_ACTOR sphere 0 in_sphere -1479.4771 -1401.9028 109.5287 radius 2.0 2.0 2.0 on_foot
then
jump @START1
end
if actor.driving($PLAYER_ACTOR)
then
03C0: $2197 = actor $PLAYER_ACTOR car
if or 	
01AF: car $2197 sphere 0 in_sphere -2290.5369 -1616.4720 488.3425 radius 2.0 2.0 2.0
01AF: car $2197 sphere 0 in_sphere -1472.5647 -1403.8137 106.0885 radius 2.0 2.0 2.0
then
jump @START1
end
end
jump @PART1

:START1 
03BD: destroy_sphere 11@ 
03BD: destroy_sphere 12@ 
03BD: destroy_sphere 13@ 
03BD: destroy_sphere 14@ 
00BC: show_text_highpriority GXT 'm10' time 1000 flag 1
wait 1000
00BC: show_text_highpriority GXT 'm9' time 1000 flag 1 
wait 1000
00BC: show_text_highpriority GXT 'm8' time 1000 flag 1 
wait 1000
00BC: show_text_highpriority GXT 'm7' time 1000 flag 1 
wait 1000
00BC: show_text_highpriority GXT 'm6' time 1000 flag 1 
wait 1000
00BC: show_text_highpriority GXT 'm5' time 1000 flag 1 
wait 1000
00BC: show_text_highpriority GXT 'm4' time 1000 flag 1 
wait 1000
00BC: show_text_highpriority GXT 'm3' time 1000 flag 1 
wait 1000
00BC: show_text_highpriority GXT 'm2' time 1000 flag 1 
wait 1000
00BC: show_text_highpriority GXT 'm1' time 1000 flag 1 
wait 1000
00BC: show_text_highpriority GXT 'm0' time 1000 flag 1 
wait 1000
034E: move_object $cablecar2 to -1484.649 -1406.827 104.944 speed 8.0 8.0 8.0 flag 1 
034E: move_object $cablecar1 to -2278.254 -1613.654 487.076 speed 8.0 8.0 8.0 flag 1
wait 3000
034E: move_object $cablecar2 to -1517.072 -1414.901 113.355 speed 8.0 8.0 8.0 flag 1 
034E: move_object $cablecar1 to -2220.117 -1599.177 449.508 speed 8.0 8.0 8.0 flag 1 
wait 3000 	
034E: move_object $cablecar2 to -1582.133 -1431.101 132.918 speed 8.0 8.0 8.0 flag 1 
034E: move_object $cablecar1 to -2050.782 -1556.358 353.566 speed 8.0 8.0 8.0 flag 1
wait 3000 	
034E: move_object $cablecar2 to -1621.959 -1441.018 146.732 speed 8.0 8.0 8.0 flag 1 
034E: move_object $cablecar1 to -1920.886 -1524.665 284.902 speed 8.0 8.0 8.0 flag 1 
wait 3000 
034E: move_object $cablecar2 to -1700.709 -1460.628 176.872 speed 8.0 8.0 8.0 flag 1 
034E: move_object $cablecar1 to -1849.303 -1506.648 246.809 speed 8.0 8.0 8.0 flag 1
wait 3000
034E: move_object $cablecar2 to -1725.703 -1466.852 187.356 speed 8.0 8.0 8.0 flag 1 
034E: move_object $cablecar1 to -1723.589 -1475.343 187.356 speed 8.0 8.0 8.0 flag 1 
wait 3000 
034E: move_object $cablecar2 to -1851.417 -1498.157 246.809 speed 8.0 8.0 8.0 flag 1
034E: move_object $cablecar1 to -1698.595 -1469.119 176.872 speed 8.0 8.0 8.0 flag 1 
wait 3000 
034E: move_object $cablecar2 to -1923.001 -1516.061 284.902 speed 8.0 8.0 8.0 flag 1
034E: move_object $cablecar1 to -1619.844 -1449.509 146.732 speed 8.0 8.0 8.0 flag 1 
wait 3000 
034E: move_object $cablecar2 to -2052.601 -1548.446 353.566 speed 8.0 8.0 8.0 flag 1
034E: move_object $cablecar1 to -1580.019 -1439.592 132.918 speed 8.0 8.0 8.0 flag 1 
wait 3000 
034E: move_object $cablecar2 to -2222.231 -1590.687 449.508 speed 8.0 8.0 8.0 flag 1
034E: move_object $cablecar1 to -1514.958 -1423.391 113.355 speed 8.0 8.0 8.0 flag 1 
wait 3000
034E: move_object $cablecar2 to -2280.368 -1605.163 487.076 speed 8.0 8.0 8.0 flag 1
034E: move_object $cablecar1 to -1482.536 -1415.317 104.944 speed 8.0 8.0 8.0 flag 1
wait 3000
034E: move_object $cablecar2 to -2286.474 -1606.467 487.076 speed 8.0 8.0 8.0 flag 1
034E: move_object $cablecar1 to -1476.669 -1413.861 104.944 speed 8.0 8.0 8.0 flag 1
00BC: show_text_highpriority GXT 'mfin' time 4000 flag 1

0A93: end_custom_thread

Even op een rijtje wat er allemaal gebeurt:

  • Twee objecten worden aangemaakt;
  • Vier spheres worden aangemaakt;
  • Er wordt gechecked of de speler te voet in sphere 1 of 3 staat, zo ja, ga verder bij START1;
  • Er wordt gechecked of de speler in een voertuig zit en vervolgens of de speler in een voertuig in sphere 2 of 4 staat, zo ja, ga verder bij START1;
  • De sphere's worden verwijderd;
  • Een countdown wordt afgespeeld;
  • De objecten worden van punt A naar punt B bewogen en er wordt elke keer 3 seconden gewacht totdat het object naar het volgende punt wordt bewogen;
  • Aan het eind volgt nog een klein tekstberichtje.

Goed, wat is nu het probleem?

Het script verloopt goed tot en met de countdown en het verwijderen van de spheres, tot de gondels moeten bewegen. Wat werkt er niet?

  • De gondels bewegen niet van A naar B, maar verdwijnen op punt A en verschijnen vervolgens op punt B, alsof ze geteleport worden, in plaats van verplaatst;
  • De gondels verschijnen niet eens op de goede plaats en er niet eens in de buurt: op totaal andere coördinaten dus. De enige verklaring hiervoor die ik kan bedenken, is dat de coördinaten die je opgeeft in de move_object opcode een soort van offset zijn. Echter, dit zou raar zijn, want dan zouden de gondels anderhalfduizend punten worden opgeschoven over de X-as en ingame is dat maar een klein tiental in plaats van over de duizend.

Voordat er wordt gespeculeerd dat de coördinaten fout zijn: ik heb ze gecontroleerd en de coördinaten kloppen voor 100%.

Toch verschijnt het tekstje aan het eind. Het stuk met het bewegen van de objecten wordt dus wel doorlopen.

Wat is voor mij nog onduidelijk?

  • De snelheid: is dit gewoon in seconden, in hele coördinaten per seconde, in meters per seconden...?
  • Wat houdt de flag op het eind in?

Wat ik al heb geprobeerd om het te fixen:

  • Alle snelheden in de move_object opcodes 1.0 of 0.1 maken. Wanneer ik dit doe, gebeurt er helemáál niks. De objecten verdwijnen en verschijnen niet eens op het volgende punt, maar blijven gewoon staan. Op het eind verschijnt het berichtje wel, dus het stuk waar de objecten worden bewogen wordt wel doorlopen;
  • De snelheid heel groot maken (denk aan 8000.0), maar dit had geen effect (de objecten verdwenen en verschenen nog steeds zoals bij snelheid 8.0);
  • De flag 0 maken in plaats van 1. Dit heb ik bij beide bovenstaande dingen (snelheid heel klein of heel groot maken) geprobeerd, maar had nergens enig effect.

Misschien is het probleem, dat de move_object opcode van zichzelf de objecten 'teleporteert' naar het punt dat je in de opcode opgeeft, in plaats van ze ernaartoe te bewegen. Maar, als dit zo is, staat het stukje "speed" er voor Jan Lul en zou 't geen betekenis hebben. De move_object opcode moet dus wel de intentie hebben om een object van positie A naar B te bewegen. Lijkt me logisch, toch?

Jammer genoeg blijkt bovenstaand verhaaltje niet te kloppen, ook al klinkt het zo logisch. Heeft iemand enig idee hoe ik dit kan fixen? Een alternatieve opcode heb ik tot nog toe nog niet gevonden. Het is ook mogelijk om het bewegen van de gondel stapsgewijs te maken, door de gondel elke keer over een hele kleine tijd een stukje verder te verplaatsen naar het volgende punt en dit vaak te herhalen, zodat je uiteindelijk een vloeiende beweging krijgt; vergelijk het met de frames in een filmpje. Liever zou ik echter het huidige script gefixed hebben...

Heeft iemand enig idee hoe ik dit zou kunnen fixen?

Bewerkt: door Puma
Geplaatst: (bewerkt)

En als je nu eens probeert alle opcodes met move_object te verwijderen, behalve de 1ste 2. Als het dan nog niet goed gaat, zet je de snelheid op 1.0 1.0 1.0. Werkt het nog niet, dan verander je de flag 0, enzovoort. Misschien dat het ligt aan dat hij ook naar de andere coördinaten moet bewegen voordat hij aangekomen is. Anders zou je dus moeten controleren of hij op de bepaalde coördinaten is aangekomen en dan pas verder bewegen.

@Hieronder: LOL! Daar was ik nooit op gekomen.

Bewerkt: door Beagle
Geplaatst:

Opcode "034E: move_object" is behoorlijk tricky. Ik heb er in het verleden uitgebreid mee getest, bij het maken van de "marina carpark mod voor VC, waar ik twee hekken op deze manier bewoog.

Ten eerste is het een opcode die je als conditie in een "if..then" of een "if..jf" kunt gebruiken, maar dat is niet verplicht.

Je moet hem echter wel altijd in een lus gebruiken, dus je moet hem herhaald aanroepen, omdat hij bij elke aanroep maar over een afstand "Speed" wordt verplaatst (in jouw geval dus 8.0 m in alle richtingen).

Dit levert ook meteen het tweede probleem op, namelijk: om hem over een rechte lijn tussen twee punten te bewegen, moet je de verhoudingen tussen de "speed" settings in de 3 richtingen precies goed hebben.

De laatste flag van de opcode geeft voor zover ik me kan herinneren aan of je bij het bewegen wel of niet rekening houdt met botsingen met andere objecten.

Ik heb volgens mij een redelijk beeld van wat je wilt bereiken met je mod, maar om dat te realiseren is een behoorlijk complex stukje SCM code nodig. Daar zal heel veel werk en testen bij komen kijken voor je dat voor elkaar hebt.

Geplaatst: (bewerkt)

Ok, bedankt voor je reply! Daar heb ik zeker wat aan.

Als ik het goed begrijp, kan ik dus het beste na de laatste "wait 1000" een jump maken naar een aparte label (label "stuk1" in onderstaand voorbeeld). Vervolgens dit:

:stuk1
034E: move_object $cablecar2 to -1484.649 -1406.827 104.944 speed 8.0 8.0 8.0 flag 1
if
kijken of $cablecar2 al op coördinaten x y z is aangekomen
jf part1
jump @part2

:part2
zelfde verhaaltje

Even wat wiskunde toepassen (stelling van Pythagoras :zz:) om x, y en z te vinden en dan moet het lukken. Nog twee vragen:

  • Ik neem aan dat de eenheid van "speed" dezelfde is als de eenheid waarin het coördinaat van een object wordt beschreven?
  • Als ik er een voertuig in rijd of er op sta, dan attach ik het voertuig of de speler aan de cablecar. Moet ik vervolgens ook de auto of de speler gaan verplaatsen d.m.v. bovenstaand verhaaltje, of gaat deze dan automatisch mee als de cablecar wordt verplaatst?

Bewerkt: door Puma
Geplaatst:

Ik heb geen idee hoe of wanneer auto´s en personen meegaan als je hem zo beweegt, en hoe je die moet vastzetten, dat zul je moeten testen en experimenteren.

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