Postów:
13
Dołączył:
2011-12-07
Napisano dnia: 2011-12-07 17:33:34
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
Napisano dnia: 2011-12-07 17:59:26
No, bez skryptu zbytnio nie możemy Ci pomóc.
___________________
Moderator
Postów:
13
Dołączył:
2011-12-07
Napisano dnia: 2011-12-07 18:49:44
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
Napisano dnia: 2011-12-07 22:20:00
Kod:
if
00F2: actor
$PLAYER_ACTOR near_actor
1@ radius 200.0 200.0 0
Hmm...
___________________
Moderator
Postów:
13
Dołączył:
2011-12-07
Napisano dnia: 2011-12-08 12:55:36
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
Napisano dnia: 2011-12-08 19:18:16
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
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"
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
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
Postów:
13
Dołączył:
2011-12-07
Napisano dnia: 2011-12-08 20:13:30
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
Napisano dnia: 2011-12-08 20:35:15
Oj, rzeczywiście, zapomniałem o tym. Na samym dole skryptu dodaj po prostu:
Kod:
___________________
Moderator
Postów:
13
Dołączył:
2011-12-07
Napisano dnia: 2011-12-08 20:58:58
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
Napisano dnia: 2011-12-08 22:44:23
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"
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
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
Postów:
13
Dołączył:
2011-12-07
Napisano dnia: 2011-12-09 13:41:13
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
Napisano dnia: 2011-12-09 16:48:46
Jasne, możesz.
___________________
Moderator