Czy wiesz, że... możesz podsyłać newsy, artykuły, pliki i zdjęcia?
Strona główna forum Szukaj Rejestracja
Witaj, nieznajomy!
Poprzedni 1 Następny
Postów: 294 Dołączył: 2011-07-27
#
Mam pytanie czy w jednym skrypcie cleo może jednocześnie być aktywne kilka wątków thread? Załóżmy np. że mam trzy wątki zdefiniowane opcodami 03A4 i w pierwszym wątku za pomocą opcodu 004F stworzyłbym dwa nowe wątki, które startowałyby jednocześnie. Czy jest możliwe coś takiego?
Postów: 628 Dołączył: 2009-01-22
#
Nie przez START_NEW_SCRIPT, ale przez START_NEW_CUSTOM_SCRIPT już tak.

___________________
Moderator
http://i.imgur.com/Abvv63y
Śledź mój kanał Twitter by być na bieżąco ze wszystkimi aktualizacjami moich modów!
Postów: 294 Dołączył: 2011-07-27
#
Jak rozumiem w START_NEW_CUSTOM_SCRIPT należy podać nazwę pliku zawierającego nowy wątek. W takim razie jaką mam podać nazwę, skoro wszystkie wątki zawarte są w jednym pliku?
Postów: 628 Dołączył: 2009-01-22
#
Podaj nazwę obecnego pliku. Poza tym, musisz lekko zmodyfikować sam początek skryptu tak, by było wiadomo do którego z wątków skoczyć:

1. Przy wywołaniu START_NEW_CUSTOM_SCRIPT w kolejnych argumentach po ścieżce do pliku można podać kolejne, ustawiające zmienne lokalne (od 0@ w górę) na określone wartości. Musisz zadecydować, jakie indeksy mają dostać określone wątki (0 dla głównego wątku, gdyż gdy skrypt jest uruchamiany przez CLEO, a nie użytkownika, wszystkie zmienne mają wartość 0).

2. Na samej górze skryptu dajesz coś w tym stylu:
Kod:
IF 0@ == 1
THEN
    
GOTO @WATEK_ID_1
END
IF 0@ == 2
THEN
    
GOTO @WATEK_ID_2
END
[...]

:WATEK_GLOWNY


Ewentualnie można zrobić to tak, jeśli chcesz zmniejszyć rozmiar skryptu kosztem czytelności:
Kod:
NOT 0@ == 1
ELSE_GOTO @WATEK_ID_1
NOT 
0@ == 2
ELSE_GOTO @WATEK_ID_2
[...]

:WATEK_GLOWNY


3. Skrypty o określonych indeksach odpalasz wtedy po prostu poprzez wywołanie START_NEW_CUSTOM_SCRIPT z ustawieniem 0@ na konkretną wartość, np. dla skryptu ID 1
Kod:
START_NEW_CUSTOM_SCRIPT "twój_skrypt" 1



Jest też inne wyjście, pomocne jeśli chcesz uniezależnić poprawne działanie skryptu od nazwy pliku CLEO - jedyna różnica polega na tym, że skrypt stworzony za pomocą tego triku zakańcza się poprzez TERMINATE_THIS_SCRIPT, a nie TERMINATE_THIS_CUSTOM_SCRIPT:

http://gtag.gtagaming.com/forums/index.php?s=&showtopic=140&view=findpost&p=1738

Sprawdzone, sam używam tego sposobu i nie powoduje problemów :)

___________________
Moderator
http://i.imgur.com/Abvv63y
Śledź mój kanał Twitter by być na bieżąco ze wszystkimi aktualizacjami moich modów!
Postów: 294 Dołączył: 2011-07-27
#
To do którego z wątków skoczyć zależałoby od wartości ustawionych w pliku .ini
Póki co początek skryptu wygląda tak:
Kod:

03A4: name_thread 'MC'  
0AF0: 0@ = get_int_from_ini_file "CLEO/MC.INI" section "MC" key "SWEET" 
IF 
0@ == 1
ELSE_GOTO @MC_2 
004F: create_thread @SWEET_21

:MC_2
0AF0: 0@ = get_int_from_ini_file "CLEO/MC.INI" section "MC" key "KENDL" 
IF 
0@ == 1
ELSE_GOTO @MC_4 
004F: create_thread @KENDL_21

:MC_4
... 


W zależności od tego czy dana wartość "key" w pliku .ini ustawiona byłaby na 1, czy nie, startowałyby określone wątki. Póki co jeżeli wartości ustawione są na 0 to gra się włącza i nie ma żadnych problemów. Ale jeżeli chociażby jedna wartość zostanie ustawiona na 1 to już gra się nie włącza. Kiedy zamieniłem 004F na 0A92 nic się nie zmieniło :(
Postów: 628 Dołączył: 2009-01-22
#
Ale przecież rozpisałem się dość długo na temat tego że START_NEW_SCRIPT nie używa się w CLEO...

___________________
Moderator
http://i.imgur.com/Abvv63y
Śledź mój kanał Twitter by być na bieżąco ze wszystkimi aktualizacjami moich modów!
Postów: 294 Dołączył: 2011-07-27
#
Jak dobrze zrozumiałem skrypt powinien wyglądać tak?

Kod:
 
03A4: name_thread 'MC'
IF 
0@ == 1 
ELSE_GOTO @MC_40 
GOTO 
@SWEETMC_13 

:MC_40
IF 
0@ == 2 
ELSE_GOTO @MC_65 
GOTO 
@NKENDLMC_21 

:MC_65
IF 
0@ == 3 
ELSE_GOTO @MC_1190 
GOTO 
@RYDERMC_13 

:MC_1190
0AF0: 31@ = get_int_from_ini_file "CLEOMC.INI" section "MC" key "SWEET" 
IF 
31@ == 1 
ELSE_GOTO  @MC_1253 
0A92: create_custom_thread "MC.CS" 1  

:MC_1253 
0AF0: 31@ = get_int_from_ini_file "CLEOMC.INI" section "MC" key "KENDL" 
IF 
31@ == 1 
ELSE_GOTO @MC_1317 
0A92: create_custom_thread "MC.CS" 2  

:MC_1317
0AF0: 31@ = get_int_from_ini_file "CLEOMC.INI" section "MC" key "RYDER" 
IF 
31@ == 1 
ELSE_GOTO @???????????????????????????? 
0A92: create_custom_thread "MC.CS" 3  
???????????????????????????????????????

03A4: name_thread 'SWEETMC' 

:SWEETMC_13
...


Tylko mam pytanie co powinienem wstawić w miejscu pytajników?
Postów: 628 Dołączył: 2009-01-22
#
Jeśli Twój 'główny' skrypt ma coś robić później, wstaw tam ten kod. Jeśli miał on jedynie startować inne wątki i nie ma już nic więcej do roboty, zakończ go.

I, cholera, czemu ciągle rekompilujesz własny skrypt?

___________________
Moderator
http://i.imgur.com/Abvv63y
Śledź mój kanał Twitter by być na bieżąco ze wszystkimi aktualizacjami moich modów!
Postów: 294 Dołączył: 2011-07-27
#
Silent napisał(a):
Jeśli miał on jedynie startować inne wątki i nie ma już nic więcej do roboty, zakończ go.

Tak, główny wątek ma za zadanie jedynie rozpoczynać kolejne wątki i tyle. Tylko pytanie czy mam go zakończyć przez TERMINATE_THIS_SCRIPT, czy przez TERMINATE_THIS_CUSTOM_SCRIPT ?

Silent napisał(a):
I, cholera, czemu ciągle rekompilujesz własny skrypt?

Jak już kiedyś pisałem, sam uczyłem się CLEO poprzez dekompilację różnych modów. I szczerze mówiąc nie do końca wiem jak się to pisze "normalnie". Tak się nauczyłem i tak teraz tworzę własne skrypty. A z resztą co to za różnica, skoro po kompilacji wychodzi na to samo.
Postów: 628 Dołączył: 2009-01-22
#
artginPL napisał(a):
Tak, główny wątek ma za zadanie jedynie rozpoczynać kolejne wątki i tyle. Tylko pytanie czy mam go zakończyć przez TERMINATE_THIS_SCRIPT, czy przez TERMINATE_THIS_CUSTOM_SCRIPT ?

To drugie.


artginPL napisał(a):
Jak już kiedyś pisałem, sam uczyłem się CLEO poprzez dekompilację różnych modów. I szczerze mówiąc nie do końca wiem jak się to pisze "normalnie". Tak się nauczyłem i tak teraz tworzę własne skrypty. A z resztą co to za różnica, skoro po kompilacji wychodzi na to samo.

Tracisz konstrukcje wysokiego poziomu, komentarze, własne stałe, a czasem zdekompilowanego skryptu nie skompilujesz ponownie w ogóle.

___________________
Moderator
http://i.imgur.com/Abvv63y
Śledź mój kanał Twitter by być na bieżąco ze wszystkimi aktualizacjami moich modów!
Postów: 294 Dołączył: 2011-07-27
#
Wychodzi na to, że wszystko działa jak powinno, choć jeszcze dokładnie tego nie sprawdziłem. Ale teraz mam jeszcze kilka pytań takich czysto teoretycznych :)

1. Co się dzieje kiedy skrypt dojdzie do TERMINATE_THIS_CUSTOM_SCRIPT ? Czy dany skrypt przestaje być aktywny jeżeli wcześniej nie było odesłania do kolejnego wątku, czy automatycznie rozpoczyna się nowy wątek znajdujący się dalej w kolejności (jeżeli taki istnieje)?
2. Czy wartości przypisane do zmiennych lokalnych w jednym wątku odpowiadają tym samym zmiennym w innym wątku, jeżeli znajdują się w jednym skrypcie?
3. Pytanie najbardziej mnie zastanawiające, na podstawie schematu przedstawionego przez Ciebie kilka postów wyżej: Jak to się dzieje, że najpierw sprawdzane jest gdzie ma przeskoczyć skrypt w zależności od wartości zmiennej 0@, a dopiero później określana jest ta wartość, a sam skrypt nie powraca już do tych wcześniejszych warunków?

Na dwa pierwsze sam mniej więcej znam odpowiedzi, ale chciałbym się upewnić. A co chodzi o trzecie to jakoś nie mogę tego zrozumieć...
Postów: 628 Dołączył: 2009-01-22
#
1. Nie do końca rozumiem pytanie. TERMINATE_THIS_CUSTOM_SCRIPT dezaktywuje wątek który wywołał tę funkcję, to że jest kilka innych wątków które operują na tym samym pliku .cs nie ma żadnego znaczenia.
2. j/w - każdy wątek ma swoje zmienne.
3. Tak jak pisałem wcześniej, w START_NEW_CUSTOM_SCRIPT ustalasz wartości zmiennych lokalnych nowo utworzonego wątku - tak więc 0@ NIE JEST zerem w wątkach które tu tworzysz.

___________________
Moderator
http://i.imgur.com/Abvv63y
Śledź mój kanał Twitter by być na bieżąco ze wszystkimi aktualizacjami moich modów!
Postów: 294 Dołączył: 2011-07-27
#
Czyli tylko pierwszy wątek rozpoczyna się automatycznie, a każdy następny musi być rozpoczęty odpowiednim opcodem, i nie można sobie tak po prostu przeskoczyć do nowego wątku, bez takiego opcodu rozpoczynającego?
Postów: 628 Dołączył: 2009-01-22
#
Tak.

___________________
Moderator
http://i.imgur.com/Abvv63y
Śledź mój kanał Twitter by być na bieżąco ze wszystkimi aktualizacjami moich modów!
Postów: 294 Dołączył: 2011-07-27
#
OK, wielkie dzięki, bardzo mi pomogłeś. Myślę, że temat można zamknąć.
Temat zamknięty.
Poprzedni 1 Następny
Created & Powered by MakG