You are not logged in.
Offline
http://i8.fastpic.ru/thumb/2010/0810/2e … 6b82e.jpeg
Не запускаются миссии Мэдд Догга в LV и 2 миссии копов на досье и убийство Пуласки. Причём игра проходима, т.е. эти миссии уже как будто выполнены были. Если к примеру загрузить сейв с http://gtasavegames.com/ и взять эти миссии, они работают.
Как-нибудь можно выяснить почему так происходит и как пофиксить?
1. Узнать точное название миссии.
2. Открыть main.scm и посмотреть, какие условия проверяются перед ее запуском.
3. Найти, какое из условий не выполняется.
Возможно, что миссии были пройдены, но остались маркеры.
Offline
Я видел что опкодов на вертолёты очень мало)
Я хотел спросить как сделать проверку что вертолёт в тей точке куда надо было лететь и сделать так чтобы вертолёт летел к второй точки и т.д.
Проверка как:
01AF: car 74@ sphere 0 in_sphere 143@ 150@ 157@ radius 0.2 0.2 1.0
Не действует. Он стоит в этой точке и лететь на след. не хочет
Offline
1. Узнать точное название миссии.
DEFINE MISSION 93 AT @VCRASH1 // Misappropriation
DEFINE MISSION 94 AT @VCR2 // High Noon
DEFINE MISSION 95 AT @DOC2 // Madd Dogg
2. Открыть main.scm и посмотреть, какие условия проверяются перед ее запуском.
А в каком именно месте они записаны?
>Возможно, что миссии были пройдены, но остались маркеры.
Миссии считаются пройденными, т.е. по прилёту из либерти сити звонит тенпенни и говорит куда отнести досье. Но миссию, где досье надо достать, я не выполнял.
UPD. Условия вроде нашёл.
:DOC thread 'DOC' :DOC_11 wait $DEFAULT_WAIT_TIME if $599 == 1 else_jump @DOC_36 end_thread :DOC_36 if Player.Defined($PLAYER_CHAR) else_jump @DOC_180 if $ONMISSION == 0 else_jump @DOC_180 if 00FF: actor $PLAYER_ACTOR sphere 0 in_sphere $X_ROYAL_CASINO $Y_ROYAL_CASINO $Z_ROYAL_CASINO radius 1.2 1.2 2.0 on_foot else_jump @DOC_180 if Player.Controllable($PLAYER_CHAR) else_jump @DOC_180 if $599 == 0 else_jump @DOC_180 $ONMISSION = 1 00BA: show_text_styled GXT 'DOC_2' time 1000 style 2 // Madd Dogg gosub @SUB_FADE_500MS start_mission 95 // Madd Dogg :DOC_180 jump @DOC_11
Поменял на 0, миссия запустилась. Теперь надо написать клео где менять значения этих глобальных переменных или как?
Last edited by Sergey81 (10-08-2010 17:49)
Offline
{$CLEO} $599 = 0 0A93: end_custom_thread
Offline
if 00FF: actor $PLAYER_ACTOR sphere 0 in_sphere 2159.899 1443.042 9.8203 radius 1.2 1.2 2.0 on_foot $599 = 0 if 00FF: actor $PLAYER_ACTOR sphere 0 in_sphere 1598.557 2667.83 9.8203 radius 1.2 1.2 2.0 on_foot $598 = 0 0A93: end_custom_thread
Прописал вот так, вроде работает. Сейв правда остался уже после того как тенпенни позвонил, так что перед этим миссию не проверить, однако если зайти на то место где её маркер должен быть, она начинается.
Спасибо за помощь.
Last edited by Sergey81 (10-08-2010 21:30)
Offline
Снова вопрос
Есть какой-нибудь простой способ вывести имя машины на экран?
{$CLEO} { Mod Name: Windshield GUI Author: Wesser Credits: Demarest } const PL_VEHICLE = 31@ ///------------------------- STRING = 5@ STRING2 = 30@ ///------------------------- VEHICLE_TEXT = 0@s ///------------------------- end 0000: Starting code... while true wait 0 if 00DF: actor $PLAYER_ACTOR driving then 03F0: enable_text_draw 1 gosub @VehicleTextDisplay end end :VehicleTextDisplay if 00DF: actor $PLAYER_ACTOR driving then 03C0: PL_VEHICLE = actor $PLAYER_ACTOR car 0441: 3@ = car PL_VEHICLE model 000E: 3@ -= 400 0012: 3@ *= 0x308 000A: 3@ += 0xB1F650 000A: 3@ += 0x36 0A8D: STRING = read_memory 3@ size 4 virtual_protect 0 // I found this :) 000A: 3@ += 0x4 0A8D: STRING2 = read_memory 3@ size 3 virtual_protect 0 0AB1: call_scm_func @SubString 2 STRING STRING2 end return :SubString gosub @DrawVehicleText 0AB2: ret 0 :DrawVehicleText 03E0: unknown_text_draw_flag 1 033F: set_text_draw_letter_size 0.3 1.2 081C: draw_text_outline 2 RGBA 0 0 0 255 033E: set_draw_text_position 142.0 376.0 GXT VEHICLE_TEXT return
Этот код с Windshield gui у меня работает на чистой игре, но не работает с другими модами, где много всяких asi и прочего. Причём zonetext работает нормально, только вот с названиями машин проблема.
Offline
{$CLEO} wait 0 while true wait 0 if Player.Defined($PLAYER_CHAR) then if and Actor.Driving($PLAYER_ACTOR) 0AB0: key_pressed 35 // или другое поставить условие then 03C0: 1@ = actor $PLAYER_ACTOR car 0441: 1@ = car 1@ model 0ADB: 0@v = car_model 1@ name 0ADE: 0@ = text_by_GXT_entry 0@v 0ACB: show_styled_text 0@ time 1000 style 2 end end end
Offline
00BAA458 pCurrentCarName
тут хранится указатель на строку с именем текущей машины.
Этот указатель можно использовать в опкоде 0ADF. Но я с новыми опкодами не работал, поэтому детальнее помочь не смогу.
Offline
Выяснил что Windshield не работал из за Limit adjuster'a, a именно из за строки Vehicle Models.
Но всё равно ещё раз благодарю за советы.
Offline
Нашёл пост Seemannа об уровне хаоса, и решил сделать миссию как в вайсе, когда нужно повысить уровень хаоса до максимума. Вот код
04F7: status_text $1 type 0 line 1 GXT 'FES_CRI' // global_variable // ŒPECYŒ‡E…• :M21_2815 wait 0 if Player.Defined($PLAYER_CHAR) jf @M21_2963 if not Actor.Dead($PLAYER_ACTOR) jf @M21_2963 0@ = 314639 008B: 0@ = &0(0@,1i) // (int) 0@ -= 10787168 0@ /= 4 008B: 0@ = &0(0@,1i) // (int) 008A: $1 = 0@ // (int) if not $1 > 2399 jf @M21_2936 jump @M21_2815
Странно, но почему-то уровень достигает 200 и не поднимается дальше. Не может ли сам код на это влиять?
Offline
Нельзя ли с помощью cleo к чекпоинтам, которые создаются в гонках или например в одной из миссий Woozie, приаттачить партиклы? Чтоб было как в MCLA.
Offline
В качестве условия для оператора repeat использовал условие "Player.Money($PLAYER_CHAR) >= 1000".
Теперь при компиляции вылезает ошибка о несовместимости типов переменных.. Как я понимаю integer там и там, так в чем тогда проблема?
Offline
Лучше сделать по-другому.
Сначала узнавай сколько денег у игрока (010B), а затем полученное значение проверяй больше или равно тысячи. Я не совсем уверен что можно применять >= в таких случаях.
Offline
Просто в документации в статье по созданию миссии было такое же условие. Ну да фиг с ним твой совет помог, спасибо, но теперь вылезает ошибка перехода на нулевой оффсет.. Ставил опкод 0000: как написано в документации, но не помогло.
Вот код мэйна:
DEFINE OBJECTS 0 DEFINE MISSIONS 1 DEFINE MISSION 0 at @FIRST DEFINE EXTERNAL_SCRIPTS -1 // Use -1 to not write AAA script DEFINE UNKNOWN_EMPTY_SEGMENT 0 DEFINE UNKNOWN_THREADS_MEMORY 0 // -------------------- // THE STRIPPED MAIN THREAD // contains initial info // -------------------- 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) 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 unknown 0 016D: restart_if_busted at 1550.68 -1675.49 14.51 angle 90.0 unknown 0 // put your create_thread commands here create_thread @mission_first_trigger end_thread :MAIN_LOOP 0001: wait $DEFAULT_WAIT_TIME ms 00BF: $TIME_HOURS = current_time_hours, $TIME_MINS = current_time_minutes 0002: jump @MAIN_LOOP // put your mods (threads) here //-------------Mission 0--------------- // put your missions here :mission_first_trigger thread "m_0_trig" $TrigMarker = marker.CreateIconAndSphere(15, 2498.3433, -1646.731, 13.5448) while $First_M_Trig == 0 wait 250 if player.Defined($PLAYER_CHAR) then if $ONMISSION == 0 then if 00FF: actor $PLAYER_ACTOR sphere 0 in_sphere 2498.3433 -1646.731 13.5448 radius 1.0 1.0 2.0 on_foot then $ONMISSION = 1 00BA: show_text_styled GXT 'INTRO_1' time 1000 style 2 Marker.Disable($TrigMarker) start_mission @FIRST end end end end end_thread :FIRST thread "m_o" repeat 010B: 4@ = player $PLAYER_CHAR money if 0112: wasted_or_busted // mission only then jump @MissionFailed end until 4@ >= 1000 :MissionPassed 01E3: text_1number_styled 'M_PASSD' 0 5000 ms 1 // MISSION PASSED! $First_M_Trig = 1 jump @Cleanup :MissionFailed 00BA: text_styled 'M_FAIL' 5000 ms 1 // ~r~MISSION FAILED! :Cleanup $ONMISSION = 0 mission_cleanup end_thread
Offline
start_mission @FIRST
Ты замениш етот линию на:
start_mission 0
и всё будет хорошо
Но толко зто, что миссий должны иметь такой формат:
http://www.gtamodding.com/index.php?tit … _a_mission
мой первый пост в русском языке!
Offline
Спасибо за помощь
Offline
Возможно ли сделать лимиты для патронов как в GTA IV?
:ammolim 0000: NOP :ammolim_2 wait 0 0470: 0@ = actor $PLAYER_ACTOR current_weapon 041A: 1@ = actor $PLAYER_ACTOR weapon 0@ ammo :projectiles_1 if or 0@ == 16 0@ == 17 0@ == 18 jf @handguns_1 if 1@ > 25 jf @ammolim 017B: set_actor $PLAYER_ACTOR weapon 0@ ammo_to 25 jump @ammolim :handguns_1 if or 0@ == 22 0@ == 23 0@ == 24 jf @shotguns if 1@ > 325 jf @ammolim 017B: set_actor $PLAYER_ACTOR weapon 0@ ammo_to 325 jump @ammolim :shotguns if or 0@ == 25 0@ == 26 0@ == 27 jf @submachineguns if 1@ > 100 jf @ammolim 017B: set_actor $PLAYER_ACTOR weapon 0@ ammo_to 100 jump @ammolim :submachineguns if or 0@ == 28 0@ == 29 0@ == 32 jf @machineguns if 1@ > 1200 jf @ammolim 017B: set_actor $PLAYER_ACTOR weapon 0@ ammo_to 1200 jump @ammolim :machineguns if or 0@ == 30 0@ == 31 jf @rifles if 1@ > 600 jf @ammolim 017B: set_actor $PLAYER_ACTOR weapon 0@ ammo_to 600 jump @ammolim :rifles if or 0@ == 33 0@ == 34 jf @ammolim if 1@ > 100 jf @ammolim 017B: set_actor $PLAYER_ACTOR weapon 0@ ammo_to 100 jump @ammolim
Набросал код, так подойдёт или что-то нужно исправить/дополнить/убрать?
И как реализовать, когда покупаешь оружие в амуниции, чтоб выводилось на экран сообщение, что достигнут максимум патронов и не снимались деньги при дальнейшей покупке?
Last edited by Sergey81 (22-08-2010 20:46)
Offline
Попробой етот скрипт, потому уто твой скрипт может дать 'Jump to 0 offset' ошибку:
Скрипт сделаный в высокопоставленней конструкций ('high-level construct', может быть плохо писаный )
0000: NOP while true wait 0 0470: 0@ = actor $PLAYER_ACTOR current_weapon 041A: 1@ = actor $PLAYER_ACTOR weapon 0@ ammo if or 0@ == 16 0@ == 17 0@ == 18 then if 1@ > 25 then 017B: set_actor $PLAYER_ACTOR weapon 0@ ammo_to 25 end end if or 0@ == 22 0@ == 23 0@ == 24 then if 1@ > 325 then 017B: set_actor $PLAYER_ACTOR weapon 0@ ammo_to 325 end end if or 0@ == 25 0@ == 26 0@ == 27 then if 1@ > 100 then 017B: set_actor $PLAYER_ACTOR weapon 0@ ammo_to 100 end end if or 0@ == 28 0@ == 29 0@ == 32 then if 1@ > 1200 then 017B: set_actor $PLAYER_ACTOR weapon 0@ ammo_to 1200 end end if or 0@ == 30 0@ == 31 then if 1@ > 600 then 017B: set_actor $PLAYER_ACTOR weapon 0@ ammo_to 600 end end if or 0@ == 33 0@ == 34 then if 1@ > 100 then 017B: set_actor $PLAYER_ACTOR weapon 0@ ammo_to 100 end end end
И как реализовать, когда покупаешь оружие в амуниции, чтоб выводилось на экран сообщение, что достигнут максимум патронов и не снимались деньги при дальнейшей покупке?
Все ammunation скрипт должны быть изменение.
Извините за мой плохой язык!
Offline
Offline
Вот как это происходит в коде игры:
.text:00583EB0 000 mov edx, [esp+arg_0] // хендл .text:00583EB4 000 cmp edx, -1 // сравниваем с -1 .text:00583EB7 000 jz short _ret .text:00583EB9 000 mov eax, edx // записываем хендл в eax .text:00583EBB 000 and eax, 0FFFFh .text:00583EC0 000 lea ecx, [eax+eax*4] .text:00583EC3 000 shl ecx, 3 .text:00583EC6 000 shr edx, 16 .text:00583EC9 000 cmp dx, ds:CMarkers._Index[ecx] .text:00583ED0 000 jnz short _ret если дошли сюда значит CMarkers._Index[ecx] - это искомый маркер
Попробуй сам перевести это в удобоваримую форму))
начало CMarkers в 00BA86F0.
Offline
Прошу прощения если повторяюсь
Вопрос по Vice city
как проверить, что игрок в зоне видимости актера, т.е. в определенном радиусе и актер повернут в сторону игрока, если оба находятся в помещении и требуется, чтобы актер не видел игрока сквозь стены
(как бывает при использовании kill actor)
Поправьте меня если я ошибаюсь
только вежливо :)
Offline
Вот как это происходит в коде игры:
.text:00583EB0 000 mov edx, [esp+arg_0] // хендл .text:00583EB4 000 cmp edx, -1 // сравниваем с -1 .text:00583EB7 000 jz short _ret .text:00583EB9 000 mov eax, edx // записываем хендл в eax .text:00583EBB 000 and eax, 0FFFFh .text:00583EC0 000 lea ecx, [eax+eax*4] .text:00583EC3 000 shl ecx, 3 .text:00583EC6 000 shr edx, 16 .text:00583EC9 000 cmp dx, ds:CMarkers._Index[ecx] .text:00583ED0 000 jnz short _ret если дошли сюда значит CMarkers._Index[ecx] - это искомый маркерПопробуй сам перевести это в удобоваримую форму))
начало CMarkers в 00BA86F0.
Viger написал мне это как плагин к QO, код получился не длинный, но перевести в хекс и засунуть в сам скрипт почему-то не смог...сказал что-то про невозможность имитировать оператор "and eax, 0FFFFh"
GIMS developer
Offline