Czy wiesz, że... rejestracja trwa tylko 20 sekund?
Strona główna forum Szukaj Rejestracja
Witaj, nieznajomy!
Poprzedni 1 Następny
Postów: 13 Dołączył: 2011-12-07
#
Witam.
Tak więc zrobiłem skrypt CLEO dodający Nemesisa do Area 69. Wszystko działa dobrze, ale czuję pewien niedosyt. Dlatego wpadłem na pomysł dodania odpowiedniej muzyki, podczas gdy Nemesis zaatakuje. Muzykę mam, próbowałem ją dodać do skryptu wzorując się na modzie Werewolf Attack, ale jest zupełnie nie tak, jak chciałem. Muzyka przez chwilę gra, a jak się skończy, to dopiero Nemesis się spawnuje. A ja chcę, żeby muzyka grała podczas walki z tym potworem; w tle. A jeśli Nemesis zostałby już zabity, to dobrze by było, żeby muzyka się automatycznie przerwała. W razie potrzeby mogę napisać skrypt w komentarzu, jeśli ktoś by chciał. Proszę o pomoc.
Postów: 628 Dołączył: 2009-01-22
#
No, bez skryptu zbytnio nie możemy Ci pomóc.

___________________
Moderator
http://i.imgur.com/Abvv63y
Śledź mój kanał Twitter by być na bieżąco ze wszystkimi aktualizacjami moich modów!
Postów: 13 Dołączył: 2011-12-07
#
W porządku. Oto skrypt (w wersji, w której jeszcze nie próbowałem dodać muzyki):

Kod:
// This file was decompiled using sascm.ini published by Seemann (http://sannybuilder.com/files/SASCM.rar) on 13.10.2007

{$VERSION 3.1.0027}
{$CLEO .cs}

//-------------MAIN---------------
thread 'NEMESIS_THREAD' 

:NEMESIS_THREAD_19
wait 0 
if 
   Player.Defined($PLAYER_CHAR)
else_jump @NEMESIS_THREAD_19 
if 
  $ONMISSION == 0 
else_jump @NEMESIS_THREAD_19 
if 
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere 287.6322 1839.766 7.72656 radius 40.0 40.0 40.0 
else_jump @NEMESIS_THREAD_19 
Model.Load(#BRASSKNUCKLE)
Model.Load(#ROCKETLA)
023C: load_special_actor 'NEMESIS' as 1 // models 290-299 

:NEMESIS_THREAD_128
wait 0 
if 
   Model.Available(#BRASSKNUCKLE)
   Model.Available(#ROCKETLA)
   Model.Available(#SPECIAL01)
else_jump @NEMESIS_THREAD_128 
1@ = Actor.Create(Mission1, #SPECIAL01, 287.6322, 1839.766, 7.72656)
Actor.Angle(1@) = 347.2881
Actor.Health(1@) = 11000
0446: set_actor 1@ immune_to_headshots 0 
04D8: set_actor 1@ drowns_in_water 0 
0946: set_actor 1@ actions_uninterupted_by_weapon_fire 0 
01B2: give_actor 1@ weapon 1 ammo 0 // Load the weapon model before using this 
01B2: give_actor 1@ weapon 35 ammo 5 // Load the weapon model before using this 
0245: set_actor 1@ walk_style_to "SWAT" 
03FE: set_actor 1@ money 0 
05E2: AS_actor 1@ kill_actor $PLAYER_ACTOR 
$NEMESIS_ACTOR = Actor.Health(1@)
$NEMESIS_ACTOR /= 40 
03C4: set_status_text $NEMESIS_ACTOR type 1 GXT 'NA' // global_variable 
Model.Destroy(#SPECIAL01)

:NEMESIS_THREAD_302
wait 0 
if 
   Player.Defined($PLAYER_CHAR)
else_jump @NEMESIS_THREAD_391 
if 
   not Actor.Dead(1@)
else_jump @NEMESIS_THREAD_408 
if 
00F2:   actor $PLAYER_ACTOR near_actor 1@ radius 200.0 200.0 0 
$NEMESIS_ACTOR = Actor.Health(1@)
$NEMESIS_ACTOR /= 25 
else_jump @NEMESIS_THREAD_391 
jump @NEMESIS_THREAD_302 

:NEMESIS_THREAD_391
Actor.RemoveReferences(1@)
0151: remove_status_text $NEMESIS_ACTOR 
jump @NEMESIS_THREAD_19 

:NEMESIS_THREAD_408
Actor.RemoveReferences(1@)
0151: remove_status_text $NEMESIS_ACTOR 
end_thread 


Postów: 628 Dołączył: 2009-01-22
#
Kod:
if 
00F2:   actor $PLAYER_ACTOR near_actor 1@ radius 200.0 200.0 0 


Hmm...

___________________
Moderator
http://i.imgur.com/Abvv63y
Śledź mój kanał Twitter by być na bieżąco ze wszystkimi aktualizacjami moich modów!
Postów: 13 Dołączył: 2011-12-07
#
Ta linijka odpowiada za teren, obszar walki (200x200). Po przekroczeniu tego limitu Nemesis już nas przestaje ścigać. Czy w takim razie może ktoś napisać, jak wyglądałaby ta funkcja muzyki w skrypcie? To dla mnie ważne.
Postów: 628 Dołączył: 2009-01-22
#
Nie używaj end_thread w skrypcie CLEO. Nazwa wątku za długa, max to 7 znaków (w CLEO w ogóle tego nie potrzeba, go w nim nazwa wątku nadawana jest automatycznie). Zmienne globalne w CLEO to też zło, więc lepiej zmienić je na globalne. A jako że 03C4 obsługuje tylko zmienne globalne, najlepiej użyć TEGO TRIKU z sekcji "Dla zaawansowanych".

Spróbuj tego kodu, przepisałem go poprawniej:

Kod:
{$CLEO}
0000: NEMESIS 
const 
// Dodałem to dla czytelności skryptu

    STREAM_STOP     = 0
    STREAM_PLAY     = 1
    STREAM_PAUSE    = 2
    STREAM_RESUME   = 3
end

    

while true
    
0001: wait 250 ms
    if
        
0256:   player 0 defined
    then
        
if
            0038:   $ONMISSION == 0
        then
            
if
                00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere 287.6322 1839.766 7.72656 radius 40.0 40.0 40.0
            then
                
0247: load_model #BRASSKNUCKLE
                0247: load_model #ROCKETLA
                023C: load_special_actor 'NEMESIS' as 1
                038B: load_requested_models
                060A: create_decision_maker_type 0 store_to 3@
                0AAC: 0@ = load_audiostream "CLEO\playlist\1.mp3"   // Ścieżka do pliku mp3, który ma być odtwarzany

                
                009A: 1@ = create_actor_pedtype 24 model #SPECIAL01 at 287.6322 1839.766 7.72656
                0173: set_actor 1@ Z_angle_to 347.2881
                0223: set_actor 1@ health_to 11000
                0446: set_actor 1@ dismemberment_possible 0
                04D8: set_actor 1@ drowns_in_water 0
                060B: set_actor 1@ decision_maker_to 3@
                01B2: give_actor 1@ weapon 1 ammo 0
                01B2: give_actor 1@ weapon 35 ammo 5
                0245: set_actor 1@ walk_style_to "SWAT" 
                03FE: set_actor 1@ money 0 
                05E2: AS_actor 1@ kill_actor $PLAYER_ACTOR 
                
                0249: release_model #BRASSKNUCKLE
                0249: release_model #ROCKETLA
                0296: unload_special_actor 1
                
                0226: 2@ = actor 1@ health
                0016: 2@ /= 110     // status texty maja zasięg 0 - 100, więc taki mnożnik jest najlepszy

                0AB1: call_scm_func @SetTimer 3 var_number 2 type 1 GXT @NA

                0AAD: set_mp3 0@ perform_action STREAM_PLAY
                
                while 
true
                    if 
and
                        0256:   player 0 defined
                        8118:   not actor 1@ dead
                        00F2:   actor $PLAYER_ACTOR near_actor 1@ radius 200.0 200.0 sphere 0
                    jf 
break    
                    0001: wait 0 ms
                    0226: 2@ = actor 1@ health
                    0016: 2@ /= 110
                end
                
                
0AAD: set_mp3 0@ perform_action STREAM_STOP
                0AAE: release_mp3 0@
                065C: release_decision_maker 3@
                0AB1: call_scm_func @StopTimer 1 var_number 2
                
                if
                    
0118:   actor 1@ dead
                then
                    
01C2: remove_references_to_actor 1@
                    0A93: end_custom_thread
                end
                
01C2: remove_references_to_actor 1@
            end
        
end
    end
end


:SetTimer
0AB1: call_scm_func @__VarToOffset 1 0@ 0@
0AB1: call_scm_func @__LabelToOffset 1 2@ 2@
0AA6: call_method 0x44CD50 struct 0xBA1788 num_params 3 pop 0 1@ 2@ 0@
0AB2: ret 0

:StopTimer
0AB1: call_scm_func @__VarToOffset 1 0@ 0@
0AA6: call_method 0x44CE60 struct 0xBA1788 num_params 1 pop 0 0@
0AB2: ret 0


:__VarToOffset
0A9F: 1@ = current_thread_pointer
0A8E: 2@ = 1@ + 0xDC
0A8D: 2@ = read_memory 2@ size 1 virtual_protect 0
if
    
0039:   2@ == 1
then
    
0006: 1@ = 0xA48960
else
    
000A: 1@ += 0x3C
end
0012: 0@ *= 4
005A: 1@ += 0@
000E: 1@ -= 0xA49960
0AB2: ret 1 1@

:__LabelToOffset
if
    
0039:   0@ == 0
then
    
0AB2: ret 1 0
end
0A9F: 1@ = current_thread_pointer
000A: 1@ += 0x10 
0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
0062: 1@ -= 0@
000A: 1@ += 4
0AB2: ret 1 1@


Jak nie ogarniasz czegoś z tego skryptu, daj tu znać.

___________________
Moderator
http://i.imgur.com/Abvv63y
Śledź mój kanał Twitter by być na bieżąco ze wszystkimi aktualizacjami moich modów!
Postów: 13 Dołączył: 2011-12-07
#
Jak próbuję skompilować ten Twój skrypt, to wyskakuje mi "Zdanie NA nie zostało znalezione". Co w takim wypadku zrobić?
Postów: 628 Dołączył: 2009-01-22
#
Oj, rzeczywiście, zapomniałem o tym. Na samym dole skryptu dodaj po prostu:

Kod:
:NA
0662: "NA"
0000: NOP

___________________
Moderator
http://i.imgur.com/Abvv63y
Śledź mój kanał Twitter by być na bieżąco ze wszystkimi aktualizacjami moich modów!
Postów: 13 Dołączył: 2011-12-07
#
Teraz się skompilowało i działa bez zarzutu. Ale jest jeszcze coś - jak się pojawia Nemesis i zaczyna grać muzyka, to wyskakuje timer, który pokazuje 0:00 i tyka, jakby kończył się czas. Jeśli jest to możliwe, to prosiłbym o jego usunięcie.

PS: Tak na marginesie - chciałbym, żeby muzyka się powtarzała dopóki potwór nie zostałby zabity. Dałoby radę coś takiego zrobić? Jeśli nie to trudno, ale fajnie by było. ;)
Postów: 628 Dołączył: 2009-01-22
#
Poprawiłem obie rzeczy:

Kod:
{$CLEO}
0000: NEMESIS 
const
    
STREAM_STOP     = 0
    STREAM_PLAY     = 1
    STREAM_PAUSE    = 2
    STREAM_RESUME   = 3
end

    

while true
    
0001: wait 250 ms
    if
        
0256:   player 0 defined
    then
        
if
            0038:   $ONMISSION == 0
        then
            
if
                00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere 287.6322 1839.766 7.72656 radius 40.0 40.0 40.0
            then
                
0247: load_model #BRASSKNUCKLE
                0247: load_model #ROCKETLA
                023C: load_special_actor 'NEMESIS' as 1
                038B: load_requested_models
                060A: create_decision_maker_type 0 store_to 3@
                0AAC: 0@ = load_audiostream "CLEO\playlist\1.mp3"   // Ścieżka do pliku mp3, który ma być odtwarzany

                
                009A: 1@ = create_actor_pedtype 24 model #SPECIAL01 at 287.6322 1839.766 7.72656
                0173: set_actor 1@ Z_angle_to 347.2881
                0223: set_actor 1@ health_to 11000
                0446: set_actor 1@ dismemberment_possible 0
                04D8: set_actor 1@ drowns_in_water 0
                060B: set_actor 1@ decision_maker_to 3@
                01B2: give_actor 1@ weapon 1 ammo 0
                01B2: give_actor 1@ weapon 35 ammo 5
                0245: set_actor 1@ walk_style_to "SWAT" 
                03FE: set_actor 1@ money 0 
                05E2: AS_actor 1@ kill_actor $PLAYER_ACTOR 
                
                0249: release_model #BRASSKNUCKLE
                0249: release_model #ROCKETLA
                0296: unload_special_actor 1
                
                0226: 2@ = actor 1@ health
                0016: 2@ /= 110     // status texty maja zasięg 0 - 100, więc taki mnożnik jest najlepszy

                0AB1: call_scm_func @AddStatusText 4 var_number 2 type 1 GXT @NA line 1

                0AAD: set_mp3 0@ perform_action STREAM_PLAY
                
                while 
true
                    if 
and
                        0256:   player 0 defined
                        8118:   not actor 1@ dead
                        00F2:   actor $PLAYER_ACTOR near_actor 1@ radius 200.0 200.0 sphere 0
                    jf 
break    
                    0001: wait 0 ms
                    
                    0AB9: get_mp3 0@ state_to 4@
                    if
                        
0039:   4@ == -1
                    then
                        
0001: wait 125 ms
                        0AAD: set_mp3 0@ perform_action STREAM_PLAY
                    end
                    
                    
0226: 2@ = actor 1@ health
                    0016: 2@ /= 110
                end
                
                
0AAD: set_mp3 0@ perform_action STREAM_STOP
                0AAE: release_mp3 0@
                065C: release_decision_maker 3@
                0AB1: call_scm_func @RemoveStatusText 1 var_number 2
                
                if
                    
0118:   actor 1@ dead
                then
                    
01C2: remove_references_to_actor 1@
                    0A93: end_custom_thread
                end
                
01C2: remove_references_to_actor 1@
            end
        
end
    end
end


:AddStatusText                 
0AB1: call_scm_func @__VarToOffset 1 0@ 0@
0AB1: call_scm_func @__LabelToOffset 1 2@ 2@
0AA6: call_method 0x44CDA0 struct 0xBA1788 num_params 4 pop 0 3@ 2@ 1@ 0@
0AB2: ret 0

:RemoveStatusText
0AB1: call_scm_func @__VarToOffset 1 0@ 0@
0AA6: call_method 0x44CE80 struct 0xBA1788 num_params 1 pop 0 0@
0AB2: ret 0

:NA
0662: "NA"
0000: NOP


:__VarToOffset
0A9F: 1@ = current_thread_pointer
0A8E: 2@ = 1@ + 0xDC
0A8D: 2@ = read_memory 2@ size 1 virtual_protect 0
if
    
0039:   2@ == 1
then
    
0006: 1@ = 0xA48960
else
    
000A: 1@ += 0x3C
end
0012: 0@ *= 4
005A: 1@ += 0@
000E: 1@ -= 0xA49960
0AB2: ret 1 1@

:__LabelToOffset
if
    
0039:   0@ == 0
then
    
0AB2: ret 1 0
end
0A9F: 1@ = current_thread_pointer
000A: 1@ += 0x10 
0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
0062: 1@ -= 0@
000A: 1@ += 4
0AB2: ret 1 1@

___________________
Moderator
http://i.imgur.com/Abvv63y
Śledź mój kanał Twitter by być na bieżąco ze wszystkimi aktualizacjami moich modów!
Postów: 13 Dołączył: 2011-12-07
#
Wszystko działa znakomicie, nie wiem jak Ci dziękować. Temat można zamknąć. ;)

PS: Czy mógłbym opublikować ten gotowy mod na tej i jeszcze jednej stronie? Oczywiście napisałbym, że Ty jesteś autorem skryptu.
Postów: 628 Dołączył: 2009-01-22
#
Jasne, możesz.

___________________
Moderator
http://i.imgur.com/Abvv63y
Śledź mój kanał Twitter by być na bieżąco ze wszystkimi aktualizacjami moich modów!
Poprzedni 1 Następny
Zaloguj się lub zarejestruj się, żeby pisać na forum.
Created & Powered by MakG