You are not logged in.
Offline
Возникла одна идея, требующая записи большого числа значений в файл, чтобы потом скрипт читал этот файл и использовал эти значения.
Кол-во значений столь велико, что хочу написать скрипт, который будет генерироватьть этот файл.
Собственно, вопрос: каким способом можно это сделать, используя опкоды CLEO 2 Вайса(что являются копией CLEO 4 SA)?
Возможно ли как-то в опкоде
0AF3: write_float 0.0 to_ini_file "cleo\config.ini" section "SectionName" key "floatKey"
вместо "floatKey" использовать переменную, увеличивая которую, можно было бы последовательно производить запись/чтение большого числа значений в файле?
Но вообще, вот этот способ с ключами в ini меня не радует, т.к. файл будет увеличиваться ненужными символами. Хорошо бы создать подобие бинарника...
Last edited by Shag (23-05-2017 01:21)
Offline
Ну создай бинарник - что мешает?
Если бы я знал, как - я бы тут не писал
Допустим, помимо опкодов со строчным чтением/записью есть еще такие:
0A9A: $hFILE = openfile "settings.ini" mode 0x72 // IF and SET 0A9C: 0@ = file $hFILE size 0A9D: readfile $hFILE size 2 to $150 0A9E: writefile $hFILE size 128 from 0@
Чтение: В справке CLEO 4 говорится, что $150 - "переменная в которую будет записан результат чтения. Если размер чтения превышает 4 байта, остаток будет записан в следующую переменную (в данном случае в $151)". А если у меня файл пару килобайт, а локальных переменных только 16? Как произвести копирование байтов из файла в выделенную область памяти?
Т.е. например, у меня такая вот конструкция(забудем килобайты, возьмем всего лишь 8 байт):
05F7: 0@ = label @BUFFER offset // 000A: 0@ += 4 //и потом где-то внизу буфер на 8 байт: hex FF FF FF FF 00 00 00 00 // handle FF FF FF FF 00 00 00 00 //+0x04 FF FF FF FF 00 00 00 00 //+0x08 FF FF FF FF 00 00 00 00 //+0x0C FF FF FF FF 00 00 00 00 //+0x10 FF FF FF FF 00 00 00 00 //+0x14 FF FF FF FF 00 00 00 00 //+0x18 FF FF FF FF 00 00 00 00 //+0x1C FF FF FF FF 00 00 00 00 //+0x20 end
Если я потом из файла опкодом 0A9D "прочитаю" 8 байт в 0@, правильно ли это запишется в буфер? Аналогичный вопрос с записью:
корректно ли этот код
0A9E: writefile $hFILE size 8 from 0@
прочтет 8 байт из буфера и запишет в файл?
Еще я не понимаю, является ли опкод
0AC8: 0@ = allocate_memory_size 8
упрощенным вариантом вышенаписанного выделения буфера памяти, или есть в чем-то отличия?
И последнее: допустим, мои вышеописанные догадки верны, тогда есть 1 момент, который я не понимаю вообще: как из бинарника прочитать какие-то определенные байты, а не весь файл целиком? Или это невозможно? Тот же вопрос и про запись.
Offline
кодПолучится такой файл
http://i.imgur.com/RJ1CRF1m.png
Не понимаю, в чем причина, но у меня вылетает. Даже при упрощении кода до
0AA7: call_function 0x48DF90 num_params 2 pop 2 "wb" "test.bin" 0@ // FILE *file = CFileMgr::Open("test.bin", "wb"); 0AC7: 2@ = var 3@ offset // float *var_offset = &vars[3]; 0AA5: call 0x48DF30 num_params 3 pop 3 4 2@ 0@ // CFileMgr::Write(file, var_offset, 4); 3@ += 1.0 0AA5: call 0x48DF30 num_params 3 pop 3 4 2@ 0@ // CFileMgr::Write(file, var_offset, 4); 3@ += 1.0 0AA5: call 0x48DF30 num_params 3 pop 3 4 2@ 0@ // CFileMgr::Write(file, var_offset, 4); 3@ += 1.0 0AA5: call 0x48DF30 num_params 3 pop 3 4 2@ 0@ // CFileMgr::Write(file, var_offset, 4); 3@ += 1.0 // vars[3] += 1.0f; 0AA5: call 0x48DF30 num_params 3 pop 3 4 2@ 0@ // CFileMgr::Write(file, var_offset, 4); 0AA5: call 0x48DEA0 num_params 1 pop 1 0@ // CFileMgr::Close(file);
, даже если несмотря на "wb" предварительно создавать файл в корневой директории игры либо в папке CLEO(что глупо, но всё же), даже если ставить "wb+" - всё равно игру крашит. Версия Вайса US 1.0. Может всё же как-то можно обойтись опкодами, о которых я выше написал?
Last edited by Shag (23-05-2017 16:08)
Offline
Ого
Спасибо, работает!
2 финальных вопроса:
1) Что означает 360 здесь:
CFileMgr::Seek(file, 360, SEEK_SET);
С остальным я вроде разобрался, а это случайно не кол-во байтов? Что делать, если я не знаю заранее кол-во байтов в файле, стоит ли юзать опкод
0A9C: 0@ = file $hFILE size
, или есть какой-то другой способ? Не загружать же файл 2 раза двумя способами(твоим и средствами CLEO)?
2) Есть ли способ преобразовать число в string, либо добавить к string число, чтобы(это уже немного к другому относится), например, создавать бесконечное число бинарников, заменяя лишь 1 цифру в их названии("test1.bin", "test2.bin" и т.д.). Этот вопрос мне важен не только для бинарников, так что нужен универсальный метод, типа как если бы существовал такой опкод:
8888: 8@ = string "test%d.bin" offset 9@ // 9@ - число, которое будет меняться в названии бинарника
, который потом можно было бы применить тут:
0AA7: call_function 0x48DF90 num_params 2 pop 2 "wb" 8@ 0@
или тут:
0AF5: write_string 8@ to_ini_file "cleo\config.ini" section "SectionName" key "stringKey"
Last edited by Shag (23-05-2017 18:31)
Offline
сагренные на игрока опкодом 05E2: педы начинают бежать к ближайшему маршруту пешеходов, если отойти от них подальше. как исправить?
Last edited by trashmas (26-05-2017 08:54)
Offline
Никто не может подсказать, какой функцией CLEO можно обнаружить ВСЕ транспортные средства, которые находятся в момент проверки на карте SA?
0AE2: 2@ = random_vehicle_near_point 4@ 5@ 6@ in_radius 1000.0 find_next 0 pass_wrecked 1 //IF and SET // Ищем авто в радиусе 1000м(первое попавшееся авто) jf @NO_VEHICLE_FOUND // Это на случай, если ни одного транспорта не нашлось :CYCLE // здесь будут действия с найденными авто(например - запись их хэндлов в какие-нибудь переменные, или какие-нибудь проверки, если нужно) 0AE2: 2@ = random_vehicle_near_point 4@ 5@ 6@ in_radius 1000.0 find_next 1 pass_wrecked 1 //IF and SET // Ищем авто в радиусе 1000м(остальные авто) jf @CYCLE_END // Сюда будет переход, когда скрипт закончит искать все авто в радиусе 1000м jump @CYCLE
Это не 2 разных кода, если что - опкод 0AE2 дублируется намеренно. Обе копии должны содержать одинаковые координаты (4@ 5@ 6@) и одинаковые радиусы.
Last edited by Shag (27-05-2017 22:23)
Offline
сагренные на игрока опкодом 05E2: педы начинают бежать к ближайшему маршруту пешеходов, если отойти от них подальше. как исправить?
Пиши пжс игру, по которой задаешь вопрос.
В Вайсе заставить актера игнорировать пути пешеходов можно было опкодом
0411: set_actor $Lance_Vance use_pednode_seek 0
В SA такого опкода нет, так что хз...
Offline
сорри, для САньки
может как то через "decision_maker"? не может такого быть что бы нельзя было исправить это..
trashmas wrote:сагренные на игрока опкодом 05E2: педы начинают бежать к ближайшему маршруту пешеходов, если отойти от них подальше. как исправить?
Пиши пжс игру, по которой задаешь вопрос.
В Вайсе заставить актера игнорировать пути пешеходов можно было опкодом0411: set_actor $Lance_Vance use_pednode_seek 0В SA такого опкода нет, так что хз...
Last edited by trashmas (31-05-2017 19:07)
Offline
сорри, для САньки
может как то через "decision_maker"? не может такого быть что бы нельзя было исправить это..
Обычно Рокстары вырубали в СА какие-то ранее работающие опкоды только в случае, если создали что-то по-лучше. Так что нужно искать среди опкодов после 05A8, где начинаются чисто САновские, по ключевому слову "actor". Либо напрягать память и пытаться вспомнить, было ли в стандартных миссиях подобное, и если да - ковырять их... К сожалению, на этом мои теоретические теории по СА заканчиваются.
Last edited by Shag (01-06-2017 17:56)
Offline
trashmas wrote:сорри, для САньки
может как то через "decision_maker"? не может такого быть что бы нельзя было исправить это..
Обычно Рокстары вырубали в СА какие-то ранее работающие опкоды только в случае, если создали что-то по-лучше. Так что нужно искать среди опкодов после 05A8, где начинаются чисто САновские, по ключевому слову "actor". Либо напрягать память и пытаться вспомнить, было ли в стандартных миссиях подобное, и если да - ковырять их... К сожалению, на этом мои теоретические теории по СА заканчиваются.
Искал, вспоминал - ничего
либо это как то по особенному делается через DM либо вообще не делается никак.
пришлось вручную направлять бота к игроку (причем на координаты, просто идти к игроку бот не может, так же бежит к путям) и на расстоянии уже приказывать стрелять...
Offline
Можно ли проверить, что игрок стоит на земле, а не на крыше машины, к примеру? Я находил номер события, что актёр стоит на крыше машины, но почему-то такая проверка не срабатывает.
И ещё - как заставить автомобиль ехать по неопределённому пути, но чтоб он не выезжал за пределы города?
Offline
Можно ли проверить, что игрок стоит на земле, а не на крыше машины, к примеру? Я находил номер события, что актёр стоит на крыше машины, но почему-то такая проверка не срабатывает.
И ещё - как заставить автомобиль ехать по неопределённому пути, но чтоб он не выезжал за пределы города?
Насчет проверки нахождения на земле, то есть опкоды отвечающие за это с приставкой "on_foot", если говорить о сравнении расстоянии между ГГ и землей, то я использовал опкод возвращающий расстоянии по Z до земли в указанных координатах и проводил несколько арифметических операций.
Offline
Всем привет, ребят, у меня тут возник один вопрос, вот есть же в клео эти опкоды:
0724: heli 114@ follow_and_attack_player $PLAYER_CHAR radius 50.0
08A2: set_hydra 146@(48@,3i) attack_with_rockets_car_of_player $PLAYER_CHAR radius 30.0
Так вот, по сути они заставляют вертолёт хантер и самолёт гидру, управляемых компьютером вести огонь по игроку, но если в переменной указать вертолёт или самолёт, который обычно никаких ракет не имеет, всё-равно летательный аппарат будет стрелять ракетами по игроку.
Так вот и вопрос, а если эти опкоды будут добавлять ракеты любым самолётам и вертолётам, управляемым компьютером, то можно как-то переписать их функцию на самолёт или вертолёт игрока, чтобы тот тоже мог стрелять ракетами например из Dodo или Maverick?
Offline
Педы в GTA VC иногда отпрыгивают в сторону если стрелять в их сторону. Как это отключить ?
Offline
Педы в GTA VC иногда отпрыгивают в сторону если стрелять в их сторону. Как это отключить ?
Либо в ped.dat убрать у нужных pedtype threat "GUN", либо:
1) Ищешь номер интересующего тебя pedtype:
2) Очищаешь ему threat "GUN" с помощью опкода 03F2(номера threat-ов представлены в описании опкода 03F1), т.е., например, для civmale снятие "боязни" пуль будет выглядеть так:
03F2: pedtype 4 remove_threat 1048576
3)...PROFIT!
UPD:
Пардон, это не исправит проблему - педы лишь перестанут "бояться" стрельбы, а от самих пуль по-прежнему отпрыгивают...
Last edited by Shag (11-06-2017 04:58)
Offline
trashmas wrote:Педы в GTA VC иногда отпрыгивают в сторону если стрелять в их сторону. Как это отключить ?
Либо в ped.dat убрать у нужных pedtype threat "GUN", либо:
1) Ищешь номер интересующего тебя pedtype:
2) Очищаешь ему threat "GUN" с помощью опкода 03F2(номера threat-ов представлены в описании опкода 03F1), т.е., например, для civmale снятие "боязни" пуль будет выглядеть так:
03F2: pedtype 4 remove_threat 1048576
3)...PROFIT!UPD:
Пардон, это не исправит проблему - педы лишь перестанут "бояться" стрельбы, а от самих пуль по-прежнему отпрыгивают...
спасибо за разъяснения, пригодится
это мешает когда цепляешь педа к вертолету (на полозья), то бывает он "отпрыгивает", оставаясь при этом на месте, и так и остается лежать, пока вертолет не сядет на поверхность...
В оригинальных миссиях я этого как то не замечал, глянул код - ничего особенного. Может из-за какого то из этих параметров, которых я присваиваю педам? :
:ARMY_SoldierParameters 0350: set_actor $ARMY_CharParam maintain_position_when_attacked 1 01B2: give_actor $ARMY_CharParam weapon 26 ammo 9999 // Load the weapon model before using this 01ED: clear_actor $ARMY_CharParam threat_search 011A: set_actor $ARMY_CharParam search_threat 1 0243: set_actor $ARMY_CharParam ped_stats_to 16 0291: set_actor $ARMY_CharParam attack_when_provoked 1 0411: set_actor $ARMY_CharParam use_pednode_seek 0 02A9: set_actor $ARMY_CharParam immune_to_nonplayer 1 0223: set_actor $ARMY_CharParam health_to 200 01C5: remove_actor_from_mission_cleanup_list $ARMY_CharParam return
Offline
Доброго Времени суток, появился такой вопрос, точнее несколько.
1) Мы создали актёра. Как заставить его идти и атаковать врагов? И как заставить его определять, кто друг, а кого надо убить?
2) Как показать полоску здоровья персонажа?
3) Подскажите опкод для проверки игрока в радиусе.
Offline