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
end2) Camera.SetPosition - точка, где камера находится; Camera.PointAt - точка, куда смотрит камера.