You are not logged in.
Любая игра изпользующая скрипты использует подобнуб команду (wait, sleep). Пример из игры HOMMV.
sleep
sleep — приостановить на время текущий поток исполнения
Синтаксисsleep(number-of-segments);
Описание
Останавливает работу текущего потока исполнения на указанное время. Время задается в игровых сегментах.
Значение параметра number-of-segments должно быть ≥ 1.
Команда sleep необходима для создания скриптов, которые должны выполнять периодические действия в течение долгого времени (например, скрипты, реализующие сценарии карт):
while 1 do sleep(100) print("another 100 game segments has passed") endВажный эффект команды sleep в том, что в результате ее выполнения управление передается от текущего скриптового потока обратно планировщику потоков скриптовой машины, которая таким образом получает возможность дать поработать другим потокам исполнения и, в конце концов, возвратить управление обратно игре.
Например, если приведенный выше скрипт запустить на исполнение, убрав из него вызов sleep(100), то игра "зависнет" – поток, в котором будет исполняться скрипт, никогда не вернет управление скриптовой машине, а та – не вернет управление игре.
Важный эффект команды в том, что в результате ее выполнения управление передается от текущего скриптового потока обратно планировщику потоков скриптовой машины, которая таким образом получает возможность дать поработать другим потокам исполнения и, в конце концов, возвратить управление обратно игре.
И можно ли сделать машину управляемой после этого(без входа-выхода из авто)
Тупо, не учитывая флаги:
03C0: 0@ = actor $PLAYER_ACTOR car 0A97: 1@ = car 0@ struct 0085: 2@ = 1@ // (int) 0085: 3@ = 1@ // (int) 2@ += 0x36 3@ += 0x428 0A8C: write_memory 2@ size 1 value 2 virtual_protect 0 0A8C: write_memory 3@ size 1 value 16 virtual_protect 0
А опкод 0665?
Делает тоже самое:
.text:00494844 ; __linkproc__ opcode_0665 .text:00494844 @@opcode_0665: ; CODE XREF: _opcode_handler_16+37j .text:00494844 ; DATA XREF: .text:__linkproc__ opcode_tableo .text:00494844 0F8 push 1 ; get_actor %1d% model_to %2d% .text:00494846 0FC mov ecx, esi .text:00494848 0FC call CScriptThread__getNumberParams .text:0049484D 0F8 mov ecx, _opcodeParameters .text:00494853 0F8 push ecx ; int .text:00494854 0FC mov ecx, _PedPool .text:0049485A .text:0049485A loc_49485A: ; CPed * CPool<CPed>::atHandle (u32 h); .text:0049485A 0FC call CPool_CPed__atHandle .text:0049485F 0F8 movsx edx, word ptr [eax+22h] .text:00494863 0F8 jmp loc_495DCE
или как сказал listener прочитать из поля modelId:
0A96: 5@ = actor 1@ struct 5@ += 0x22 0A8D: 5@ = read_memory 5@ size 2 virtual_protect 0
@ILdar -
{$CLEO} 0000: while true wait 0 if Player.Defined($PLAYER_CHAR) then 0AB5: store_actor $PLAYER_ACTOR closest_vehicle_to 0@ closest_ped_to 1@ if 1@ <> -1 then if and Actor.Dead(1@) 00F3: actor $PLAYER_ACTOR near_actor 1@ radius 2.0 2.0 0 on_foot 0AB0: key_pressed 0x75 then 04ED: load_animation "MEDIC" while 84EE: not animation "MEDIC" loaded wait 0 end Player.CanMove($PLAYER_CHAR) = false 01F7: set_player $PLAYER_CHAR ignored_by_cops 1 03BF: set_player $PLAYER_CHAR ignored_by_everyone 1 0639: AS_actor $PLAYER_ACTOR rotate_to_actor 1@ 0605: actor $PLAYER_ACTOR perform_animation_sequence "CPR" IFP_file "MEDIC" 4.0 loop 0 0 0 0 time -1 // versionA wait 7000 04A5: store_dead_actor 1@ position_to 2@ 3@ 4@ 0665: get_actor 1@ model_to 5@ Actor.DestroyInstantly(1@) Actor.RemoveReferences(1@) Model.Load(5@) while not Model.Available(5@) wait 0 end 1@ = Actor.Create(CivMale, 5@, 2@, 3@, 4@) Actor.RemoveReferences(1@) Model.Destroy(5@) 04EF: release_animation "MEDIC" 03BF: set_player $PLAYER_CHAR ignored_by_everyone 0 01F7: set_player $PLAYER_CHAR ignored_by_cops 0 Player.CanMove($PLAYER_CHAR) = true end end end end
@Noob - замени на:
038B: load_requested_models
А я думал что опкод 02E3 возращает скорость в м/с.
@xxxsxxx -
{$CLEO} 0000: while true wait 0 if Player.Defined($PLAYER_CHAR) then if 0AB0: key_pressed 0x74 then Actor.PutAt($PLAYER_ACTOR, 2488.91, -1666.91, 13.14) wait 3000 end if 0AB0: key_pressed 0x75 then Actor.PutAt($PLAYER_ACTOR, 2488.91, -1666.91, 23.24) wait 3000 end if 0AB0: key_pressed 0x76 then Actor.PutAt($PLAYER_ACTOR, 2488.91, -1666.91, 33.34) wait 3000 end end end
@Yarik
1) откуда ты взял такой комментарий?
2)
Actor.PutAt(0@, 1@, 2@, -100.0)
Список адресов для каждой машины.
@grand - в начале мейна оставь, остальные удали или закомментируй.
Скажите хотябы как открыть весь штат
0629: change_integer_stat 181 to 4
@ILdar - все прекрасно работает:
{$CLEO} 0@ = 0 while true wait 0 if Player.Defined($PLAYER_CHAR) then if and 0AB0: key_pressed 0x73 // F4 0@ == 0 then 0@ = 1 #ARMY.Load() while not #ARMY.Available() wait 0 end 09C7: change_player $PLAYER_CHAR model_to #ARMY #ARMY.Destroy() wait 150 end if and 0AB0: key_pressed 0x73 // F4 0@ == 1 then 0@ = 0 09C7: change_player $PLAYER_CHAR model_to #NULL wait 150 end end end
@Noob -
{$CLEO} 0@ = 0 1@ = 0 33@ = 0 while true wait 0 if Player.Defined($PLAYR_CHAR) then if and 1@ == 1 33@ > 1000 then 2@ = Actor.Health($PLAYER_ACTOR) 2@ += 2 Actor.Health($PLAYER_ACTOR) = 2@ 33@ = 0 end if and 0AB0: key_pressed 0x73 0@ == 0 then 018C: play_sound 1058 at 0.0 0.0 0.0 0@ = 1 1@ = 1 wait 150 end if and 0AB0: key_pressed 0x73 0@ == 1 then 018C: play_sound 1058 at 0.0 0.0 0.0 0@ = 0 1@ = 0 wait 150 end end end
{$CLEO} 0000: while true wait 0 if Player.Defined($PLAYER_CHAR) then 09E8: 0@ = actor $PLAYER_ACTOR active_interior if 0@ <> 0 then 0952: load_soundtrack 5 0954: start_playing_loaded_soundtrack while true wait 0 09E8: 0@ = actor $PLAYER_ACTOR active_interior if 0@ == 0 then Break end end 0955: end_playing_loaded_soundtrack end end end
@Взъерошенный -
Model.Load(1216) while not Model.Available(1216) wait 0 end 0@ = Object.Create(1216, 0, 0, 0) Model.Destroy(1216)
Вот еще несколько моделек:
1216 phonebooth1
1346 CJ_PHONE_KIOSK2
1363 CJ_PHONE_KIOSK
Да, с программой опкод работает нормально.
@Seemann - спасибо, это действительно работает как с опкодом так и без, значит там как-то активирована эта фича.
Решил поэкспериментировать с джойстиком, установил Microsoft DirectX SDK нашел пример, как раз с демонстрацией вибрации. Начал переделывать под Delphi, но застрял вот здесь:
// This application needs only one effect: Applying raw forces. DWORD rgdwAxes[2] = { DIJOFS_X, DIJOFS_Y }; LONG rglDirection[2] = { 0, 0 }; DICONSTANTFORCE cf = { 0 }; DIEFFECT eff; ZeroMemory( &eff, sizeof(eff) ); eff.dwSize = sizeof(DIEFFECT); eff.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS; eff.dwDuration = INFINITE; eff.dwSamplePeriod = 0; eff.dwGain = DI_FFNOMINALMAX; eff.dwTriggerButton = DIEB_NOTRIGGER; eff.dwTriggerRepeatInterval = 0; eff.cAxes = g_dwNumForceFeedbackAxis; eff.rgdwAxes = rgdwAxes; eff.rglDirection = rglDirection; eff.lpEnvelope = 0; eff.cbTypeSpecificParams = sizeof(DICONSTANTFORCE); eff.lpvTypeSpecificParams = &cf; eff.dwStartDelay = 0; // Create the prepared effect if( FAILED( hr = g_pDevice->CreateEffect( GUID_ConstantForce, &eff, &g_pEffect, NULL ) ) ) { return hr; // !!!!!!!!!!!!! }
вроде простой кусок но функция g_pDevice->CreateEffect всегда возвращает ошибку. Скомпилировал бы сам на си, но в наличие сейчас только Visual C++ 2005 Express Edition. Может прокинете какие-нибудь примеры на Delphi если есть.
@Seemann - тестирование ничего не дало. Перепробовал множество вариантов только все безрезультатно.
Можно ли как-нибудь заставить вибрировать джойстик, например при падении или при прыжках.
1)
while true wait 0 0470: 0@ = actor $PLAYER_ACTOR current_weapon if 0@ <> 0 then 0555: remove_weapon 0@ from_actor $PLAYER_ACTOR end end
2) Camera.SetPosition - точка, где камера находится; Camera.PointAt - точка, куда смотрит камера.